001/*
002 *    Copyright 2024-2025, Warm-Flow (290631660@qq.com).
003 *
004 *    Licensed under the Apache License, Version 2.0 (the "License");
005 *    you may not use this file except in compliance with the License.
006 *    You may obtain a copy of the License at
007 *
008 *       https://www.apache.org/licenses/LICENSE-2.0
009 *
010 *    Unless required by applicable law or agreed to in writing, software
011 *    distributed under the License is distributed on an "AS IS" BASIS,
012 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 *    See the License for the specific language governing permissions and
014 *    limitations under the License.
015 */
016package org.dromara.warm.flow.core.config;
017
018import org.dromara.warm.flow.core.FlowFactory;
019import org.dromara.warm.flow.core.constant.FlowConfigCons;
020import org.dromara.warm.flow.core.expression.ExpressionStrategy;
021import org.dromara.warm.flow.core.invoker.FrameInvoker;
022import org.dromara.warm.flow.core.json.JsonConvert;
023import org.dromara.warm.flow.core.utils.*;
024import org.dromara.warm.flow.core.variable.VariableStrategy;
025
026import java.io.Serializable;
027
028/**
029 * WarmFlow属性配置文件
030 *
031 * @author warm
032 */
033public class WarmFlow implements Serializable {
034
035    /**
036     * 开关
037     */
038    private boolean enabled = true;
039
040    /**
041     * 启动banner
042     */
043    private boolean banner = true;
044
045    /**
046     * id生成器类型, 不填默认为orm扩展自带生成器或者warm-flow内置的19位雪花算法, SnowId14:14位,SnowId15:15位, SnowFlake19:19位
047     */
048    private String keyType;
049
050    /**
051     * 是否开启逻辑删除
052     */
053    private boolean logicDelete = false;
054
055    /**
056     * 逻辑删除字段值
057     */
058    private String logicDeleteValue = "2";
059
060    /**
061     * 逻辑未删除字段
062     */
063    private String logicNotDeleteValue = "0";
064
065    /**
066     * 数据填充处理类路径
067     */
068    private String dataFillHandlerPath;
069
070    /**
071     * 租户模式处理类路径
072     */
073    private String tenantHandlerPath;
074    /**
075     * 数据源类型, mybatis模块对orm进一步的封装, 由于各数据库分页语句存在差异,
076     * 当配置此参数时, 以此参数结果为基准, 未配置时, 取DataSource中数据源类型,
077     * 兜底为mysql数据库
078     */
079    private String dataSourceType;
080
081    /**
082     * ui开关
083     */
084    private boolean ui = true;
085
086    /**
087     * 如果需要工作流共享业务系统权限,默认Authorization,如果有多个token,用逗号分隔
088     */
089    private String tokenName = "Authorization";
090
091    public static WarmFlow init() {
092        WarmFlow flowConfig = new WarmFlow();
093        // 设置banner
094        String banner = FrameInvoker.getCfg(FlowConfigCons.BANNER);
095        if (StringUtils.isNotEmpty(banner)) {
096            flowConfig.setBanner(ObjectUtil.isStrTrue(banner));
097        }
098
099        // 设置ui开关
100        String ui = FrameInvoker.getCfg(FlowConfigCons.UI);
101        if (StringUtils.isNotEmpty(ui)) {
102            flowConfig.setUi(ObjectUtil.isStrTrue(ui));
103        }
104
105        // 设置TOKEN_NAME开关
106        String tokenName = FrameInvoker.getCfg(FlowConfigCons.TOKEN_NAME);
107        if (StringUtils.isNotEmpty(tokenName)) {
108            flowConfig.setTokenName(tokenName);
109        }
110
111        // 设置id生成器类型
112        String keyType = FrameInvoker.getCfg(FlowConfigCons.KEYTYPE);
113        if (StringUtils.isNotEmpty(keyType)) {
114            flowConfig.setKeyType(keyType);
115        }
116
117        // 设置逻辑删除
118        setLogicDelete(flowConfig);
119
120        // 设置租户模式
121        flowConfig.setTenantHandlerPath(FrameInvoker.getCfg(FlowConfigCons.TENANTHANDLERPATH));
122
123        // 设置数据填充处理类
124        flowConfig.setDataFillHandlerPath(FrameInvoker.getCfg(FlowConfigCons.DATAFILLHANDLEPATH));
125
126        // 设置数据源类型
127        flowConfig.setDataSourceType(FrameInvoker.getCfg(FlowConfigCons.DATA_SOURCE_TYPE));
128        printBanner(flowConfig);
129
130        // 通过SPI机制
131        spiLoad();
132        return flowConfig;
133    }
134    public static void spiLoad() {
135        // 通过SPI机制加载条件表达式策略实现类
136        ServiceLoaderUtil.loadList(ExpressionStrategy.class).forEach(ExpressionUtil::setExpression);
137
138        // 通过SPI机制加载办理人变量表达式策略实现类
139        ServiceLoaderUtil.loadList(VariableStrategy.class).forEach(VariableUtil::setExpression);
140
141        // 通过SPI机制加载json转换策略实现类
142        FlowFactory.jsonConvert(ServiceLoaderUtil.loadFirst(JsonConvert.class));
143    }
144
145    private static void setLogicDelete(WarmFlow flowConfig) {
146        String logicDelete = FrameInvoker.getCfg(FlowConfigCons.LOGICDELETE);
147        if (ObjectUtil.isStrTrue(logicDelete)) {
148            flowConfig.setLogicDelete(ObjectUtil.isStrTrue(logicDelete));
149            String logicDeleteValue = FrameInvoker.getCfg(FlowConfigCons.LOGICDELETEVALUE);
150            if (StringUtils.isNotEmpty(logicDeleteValue)) {
151                flowConfig.setLogicDeleteValue(logicDeleteValue);
152            }
153            String logicNotDeleteValue = FrameInvoker.getCfg(FlowConfigCons.LOGICNOTDELETEVALUE);
154            if (StringUtils.isNotEmpty(logicNotDeleteValue)) {
155                flowConfig.setLogicNotDeleteValue(logicNotDeleteValue);
156            }
157        }
158    }
159
160    private static void printBanner(WarmFlow flowConfig) {
161        if (flowConfig.isBanner()) {
162            System.out.println("\n" +
163                    "   ▄     ▄                      ▄▄▄▄▄▄   ▄                     \n" +
164                    "   █  █  █  ▄▄▄    ▄ ▄▄  ▄▄▄▄▄  █        █     ▄▄▄  ▄     ▄    \n" +
165                    "   ▀ █▀█ █ ▀   █   █▀  ▀ █ █ █  █▄▄▄▄▄   █    █▀ ▀█ ▀▄ ▄ ▄▀    \n" +
166                    "    ██ ██▀ ▄▀▀▀█   █     █ █ █  █        █    █   █  █▄█▄█     \n" +
167                    "    █   █  ▀▄▄▀█   █     █ █ █  █        ▀▄▄  ▀█▄█▀   █ █      \n" +
168                    "\n" +
169                    "\033[32m   :: Warm-Flow ::     (v" + WarmFlow.class.getPackage()
170                    .getImplementationVersion() + ")\033[0m\n");
171        }
172    }
173
174    public boolean isEnabled() {
175        return enabled;
176    }
177
178    public void setEnabled(boolean enabled) {
179        this.enabled = enabled;
180    }
181
182    public boolean isBanner() {
183        return banner;
184    }
185
186    public void setBanner(boolean banner) {
187        this.banner = banner;
188    }
189
190    public String getKeyType() {
191        return keyType;
192    }
193
194    public void setKeyType(String keyType) {
195        this.keyType = keyType;
196    }
197
198    public boolean isLogicDelete() {
199        return logicDelete;
200    }
201
202    public void setLogicDelete(boolean logicDelete) {
203        this.logicDelete = logicDelete;
204    }
205
206    public String getLogicDeleteValue() {
207        return logicDeleteValue;
208    }
209
210    public void setLogicDeleteValue(String logicDeleteValue) {
211        this.logicDeleteValue = logicDeleteValue;
212    }
213
214    public String getLogicNotDeleteValue() {
215        return logicNotDeleteValue;
216    }
217
218    public void setLogicNotDeleteValue(String logicNotDeleteValue) {
219        this.logicNotDeleteValue = logicNotDeleteValue;
220    }
221
222    public String getDataFillHandlerPath() {
223        return dataFillHandlerPath;
224    }
225
226    public void setDataFillHandlerPath(String dataFillHandlerPath) {
227        this.dataFillHandlerPath = dataFillHandlerPath;
228    }
229
230    public String getTenantHandlerPath() {
231        return tenantHandlerPath;
232    }
233
234    public void setTenantHandlerPath(String tenantHandlerPath) {
235        this.tenantHandlerPath = tenantHandlerPath;
236    }
237
238    public String getDataSourceType() {
239        return dataSourceType;
240    }
241
242    public void setDataSourceType(String dataSourceType) {
243        this.dataSourceType = dataSourceType;
244    }
245
246    public boolean isUi() {
247        return ui;
248    }
249
250    public void setUi(boolean ui) {
251        this.ui = ui;
252    }
253
254    public String getTokenName() {
255        return tokenName;
256    }
257
258    public void setTokenName(String tokenName) {
259        this.tokenName = tokenName;
260    }
261}