diff --git a/.gitignore b/.gitignore index bce210c..71cf645 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,5 @@ .idea/ target/ .DS_Store -.class_path +.classpath *.jar \ No newline at end of file diff --git a/docs/claim.md b/docs/claim.md index e69de29..020e125 100644 --- a/docs/claim.md +++ b/docs/claim.md @@ -0,0 +1,41 @@ +# 非FineKit中的Open类 + +com.fr.script.AbstractFunction + +com.fr.script.Calculator + +com.fr.general.FRFont + +com.fr.base.BaseFormula + +com.fr.base.Style + +com.fr.plugin.ExtraClassManager + +com.fr.stable.Primitive + +com.fr.stable.os.AbstractOperatingSystem + +com.fr.stable.os.Arch + +com.fr.stable.os.OperatingSystem + +com.fr.plugin.context.PluginContexts + +com.fr.config.Status + +com.fr.config.holder.Conf + +com.fr.stable.ColumnRow + +com.fr.web.struct.AssembleComponent + +com.fr.web.struct.BaseFilter + +com.fr.web.struct.Component + +com.fr.web.struct.Registry + +com.fr.web.struct.category.ScriptPath + +com.fr.web.struct.category.StylePath \ No newline at end of file diff --git a/readme.md b/readme.md index c947d61..7931b23 100644 --- a/readme.md +++ b/readme.md @@ -24,12 +24,14 @@ SessionKit#getSession(@NotNull String sessionID); ## 提交新API要求 -* 所有的API方法的返回值和参数,仅允许使用JDK自带的类、接口类型、插件抽象类、注解或者使用了@Open标记的对象类型。 +* 所有的API方法的返回值和参数,仅允许使用JDK自带的类、接口类型、枚举类型、插件抽象类、注解或者使用了@Open标记的对象类型。 * 所有的API方法均需要有单元测试覆盖。 * 所有的API方法均需要有javadoc文档说明。 +开放类列表见:[非FineKit开放类](docs/claim.md) + ## 使用方法 先使用maven打包,执行下面的命令(跳过单元测试) @@ -51,7 +53,7 @@ SessionKit#getSession(@NotNull String sessionID); ## 如何判断插件中调用的API需要增加到FineKit中 -最简单的原则:除了JDK自带的类、插件接口(包括抽象类)、以及使用了@Open注解标记的类之外,是否还使用了com.fanruan.api(com.fr.third除外)之外的类,如果有则需要修改。 +最简单的原则:除了JDK自带的类、插件接口(包括抽象类)、枚举、以及使用了@Open注解标记的类之外,是否还使用了com.fanruan.api(com.fr.third除外)之外的类,如果有则需要修改。 ## 如何提交新的API diff --git a/src/main/java/com/fanruan/api/cal/CalculatorKit.java b/src/main/java/com/fanruan/api/cal/CalculatorKit.java index 5cdfb6b..195141d 100644 --- a/src/main/java/com/fanruan/api/cal/CalculatorKit.java +++ b/src/main/java/com/fanruan/api/cal/CalculatorKit.java @@ -8,6 +8,7 @@ import com.fr.data.TableDataSource; import com.fr.report.core.namespace.SimpleCellValueNameSpace; import com.fr.report.report.Report; import com.fr.script.Calculator; +import com.fr.script.TreeLayerNameSpace; import com.fr.stable.StringUtils; import com.fr.stable.script.CalculatorProvider; import com.fr.stable.script.NameSpace; @@ -95,4 +96,13 @@ public class CalculatorKit { public static NameSpace createSimpleCellValueNameSpace() { return SimpleCellValueNameSpace.getInstance(); } + + /** + * 创建一个计算树状组件的命名空间 + * @param layIndexMap 树状组件中的值 + * @return 树状组件的命名空间 + */ + public static NameSpace createTreeLayerNameSpace(Map layIndexMap) { + return new TreeLayerNameSpace(layIndexMap); + } } \ No newline at end of file diff --git a/src/main/java/com/fanruan/api/cal/FormulaKit.java b/src/main/java/com/fanruan/api/cal/FormulaKit.java index 93cd52a..503a8ab 100644 --- a/src/main/java/com/fanruan/api/cal/FormulaKit.java +++ b/src/main/java/com/fanruan/api/cal/FormulaKit.java @@ -7,6 +7,7 @@ import com.fr.base.ScriptFormula; import com.fr.log.FineLoggerFactory; import com.fr.script.Calculator; import com.fr.stable.FormulaProvider; +import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; import com.fr.stable.UtilEvalError; import com.fr.stable.script.CalculatorProvider; @@ -104,4 +105,14 @@ public class FormulaKit { } return checkFormulaContent(formula.getPureContent()); } + + /** + * 判断一个对象是否可以转化为公式 + * @param object 要判断的字符串 + * @return 如果该字符串是以"="开头,说明可以转化成公式,否则不能转化成公式 + */ + public static boolean canBeFormula(Object object){ + return StableUtils.canBeFormula(object); + } + } diff --git a/src/main/java/com/fanruan/api/cal/ParameterKit.java b/src/main/java/com/fanruan/api/cal/ParameterKit.java index bc1cb30..388726f 100644 --- a/src/main/java/com/fanruan/api/cal/ParameterKit.java +++ b/src/main/java/com/fanruan/api/cal/ParameterKit.java @@ -1,8 +1,11 @@ package com.fanruan.api.cal; +import com.fanruan.api.util.ArrayKit; +import com.fanruan.api.util.AssistKit; import com.fr.base.Parameter; import com.fr.base.ParameterHelper; import com.fr.base.ParameterMapNameSpace; +import com.fr.stable.ArrayUtils; import com.fr.stable.ParameterProvider; import com.fr.stable.script.NameSpace; import org.jetbrains.annotations.NotNull; @@ -39,6 +42,7 @@ public class ParameterKit { /** * 根据参数名创建新的参数对象 + * * @param name 参数名 * @return 参数对象 */ @@ -98,14 +102,37 @@ public class ParameterKit { public static @NotNull NameSpace createParameterMapNameSpace(ParameterProvider[] ps) { return ParameterMapNameSpace.create(ps); } + /** - * 获得新的参数集合 + * 获得新的参数集数组,新的参数结合中参数的值是通过设定的同名参数传递进去的 * * @param paramTexts sql语句 - * @param ps 旧的参数集合 - * @return 新参数集合 + * @param ps 用于传值的参数数组 + * @return 新参数素组 */ - public static ParameterProvider[] analyzeAndUnionSameParameters(String[] paramTexts, Parameter[] ps){ - return ParameterHelper.analyzeAndUnionSameParameters(paramTexts, ps); + public static ParameterProvider[] analyzeAndUnionSameParameters(String[] paramTexts, ParameterProvider[] ps) { + + ParameterProvider[] parameters = ParameterKit.analyze4Parameters(paramTexts, false); + + if (ArrayUtils.isEmpty(parameters)) { + return parameters; + } + + if (ArrayKit.isNotEmpty(ps)) { + for (ParameterProvider newParameter : parameters) { + ParameterProvider existParameter = null; + for (ParameterProvider p : ps) { + if (AssistKit.equals(p.getName(), newParameter.getName())) { + existParameter = p; + break; + } + } + if (existParameter != null) { + newParameter.setValue(existParameter.getValue()); + } + } + } + + return parameters; } } diff --git a/src/main/java/com/fanruan/api/conf/ConfigurationKit.java b/src/main/java/com/fanruan/api/conf/ConfigurationKit.java deleted file mode 100644 index b433465..0000000 --- a/src/main/java/com/fanruan/api/conf/ConfigurationKit.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.fanruan.api.conf; - -import com.fr.config.Configuration; -import com.fr.config.holder.ConfigChangeListener; -import com.fr.transaction.Configurations; -import com.fr.transaction.ValidateProxy; -import com.fr.transaction.WorkerFacade; - -/** - * @author richie - * @version 10.0 - * Created by richie on 2019-08-30 - * 配置监听管理器 - */ -public class ConfigurationKit { - - /** - * 注册监听配置变化的监听器 - * - * @param listener 监听器 - */ - public static void registerListener(ConfigChangeListener listener) { - ValidateProxy.getInstance().getValidateManager().registerListener(listener); - } - - /** - * 保存配置 - * - * @param type 配置的类型 - * @param action 保存动作 - */ - public static void modify(Class type, Runner action) { - Configurations.modify(new WorkerFacade(type) { - @Override - public void run() { - action.run(); - } - }); - } - -} diff --git a/src/main/java/com/fanruan/api/conf/HolderKit.java b/src/main/java/com/fanruan/api/conf/HolderKit.java index 6268e47..323ceb3 100644 --- a/src/main/java/com/fanruan/api/conf/HolderKit.java +++ b/src/main/java/com/fanruan/api/conf/HolderKit.java @@ -1,5 +1,6 @@ package com.fanruan.api.conf; +import com.fanruan.api.conf.impl.ColConf; import com.fanruan.api.conf.impl.ObjConf; import com.fanruan.api.conf.impl.ObjectColConf; import com.fanruan.api.conf.impl.ObjectMapConf; @@ -16,11 +17,13 @@ import java.util.Map; * 配置对象操作类 * TODO:补充单元测试 */ +@SuppressWarnings("unchecked") public class HolderKit { /** * 初始化一个基本对象类型的配置 - * @param t 初始值 + * + * @param t 初始值 * @param 类型 * @return 配置对象 */ @@ -30,9 +33,10 @@ public class HolderKit { /** * 初始化一个对象类型的配置 - * @param t 初始值 + * + * @param t 初始值 * @param type 对象class类 - * @param 类型 + * @param 类型 * @return 配置对象 */ public static Conf obj(T t, Class type) { @@ -41,9 +45,10 @@ public class HolderKit { /** * 初始化一个集合类型的配置 + * * @param collection 初始值 - * @param type 对象class类型 - * @param 类型 + * @param type 对象class类型 + * @param 类型 * @return 配置对象 */ public static ObjectColConf> objCollection(Collection collection, Class type) { @@ -52,10 +57,11 @@ public class HolderKit { /** * 初始化一个集合类型的配置 + * * @param collection 初始值 - * @param type 对象class类型 - * @param order 是否是有序的配置 - * @param 类型 + * @param type 对象class类型 + * @param order 是否是有序的配置 + * @param 类型 * @return 配置对象 */ public static ObjectColConf> objCollection(Collection collection, Class type, boolean order) { @@ -64,11 +70,12 @@ public class HolderKit { /** * 初始化一个字典类型的配置 - * @param map 初始值 - * @param keyType 键class类型 + * + * @param map 初始值 + * @param keyType 键class类型 * @param valueType 值class类型 - * @param 键类型 - * @param 值类型 + * @param 键类型 + * @param 值类型 * @return 配置对象 */ public static ObjectMapConf> objMap(Map map, Class keyType, Class valueType) { @@ -77,15 +84,28 @@ public class HolderKit { /** * 初始化一个字典类型的配置 - * @param map 初始值 - * @param keyType 键class类型 + * + * @param map 初始值 + * @param keyType 键class类型 * @param valueType 值class类型 - * @param order 是否是有序配置 - * @param 键类型 - * @param 值类型 + * @param order 是否是有序配置 + * @param 键类型 + * @param 值类型 * @return 配置对象 */ public static ObjectMapConf> objMap(Map map, Class keyType, Class valueType, boolean order) { return new ObjectMapConf<>(map, keyType, valueType, order); } + + /** + * 初始化一个集合类型的配置 + * + * @param collection 集合 + * @param valueType 值类型 + * @param 类型 + * @return 配置对象 + */ + public static ColConf> collection(Collection collection, Class valueType) { + return new ColConf(collection, valueType); + } } diff --git a/src/main/java/com/fanruan/api/data/TableDataKit.java b/src/main/java/com/fanruan/api/data/TableDataKit.java index 333245f..63a7d91 100644 --- a/src/main/java/com/fanruan/api/data/TableDataKit.java +++ b/src/main/java/com/fanruan/api/data/TableDataKit.java @@ -74,4 +74,5 @@ public class TableDataKit { public static void renameTableData(@NotNull String oldName, @NotNull String newName) { TableDataConfig.getInstance().renameTableData(oldName, newName); } + } diff --git a/src/main/java/com/fanruan/api/data/open/BaseConnection.java b/src/main/java/com/fanruan/api/data/open/BaseConnection.java new file mode 100644 index 0000000..95d8c0c --- /dev/null +++ b/src/main/java/com/fanruan/api/data/open/BaseConnection.java @@ -0,0 +1,51 @@ +package com.fanruan.api.data.open; + +import com.fanruan.api.util.ArrayKit; +import com.fr.data.impl.AbstractDatabaseConnection; +import com.fr.data.impl.Connection; + +/** + * @author richie + * @version 10.0 + * Created by richie on 2019-09-06 + * 用于数据连接插件的抽象类 + */ +public abstract class BaseConnection extends AbstractDatabaseConnection { + + /** + * 测试连接 + * + * @throws Exception 异常 + */ + @Override + public abstract void testConnection() throws Exception; + + /** + * 创建连接 + * + * @return 返回连接 + * @throws Exception 异常 + */ + @Override + public java.sql.Connection createConnection() throws Exception { + return Connection.IGNORE; + } + + /** + * 连接成功或失败时给出的信息 + * + * @return 信息 + */ + @Override + public abstract String connectMessage(boolean status); + + + /** + * 获取数据连接的摘要信息 + * + * @return 摘要 + */ + public String[] summary(String... args) { + return ArrayKit.EMPTY_STRING_ARRAY; + } +} diff --git a/src/main/java/com/fanruan/api/data/open/BaseDataModel.java b/src/main/java/com/fanruan/api/data/open/BaseDataModel.java new file mode 100644 index 0000000..c51dc27 --- /dev/null +++ b/src/main/java/com/fanruan/api/data/open/BaseDataModel.java @@ -0,0 +1,60 @@ +package com.fanruan.api.data.open; + +import com.fanruan.api.err.TableDataException; +import com.fr.data.AbstractDataModel; + +/** + * @author richie + * @version 10.0 + * Created by richie on 2019-09-04 + * 二维表模型 + */ +public abstract class BaseDataModel extends AbstractDataModel { + + /** + * 获取数据集的列数 + * + * @return 列数 + * @throws TableDataException 如果获取数据集列数失败,则抛出此异常 + */ + @Override + public abstract int getColumnCount() throws TableDataException; + + /** + * 获取数据集指定列的列名 + * + * @param rowIndex 列序号 + * @return 类名 + * @throws TableDataException 如果获取列名失败,则抛出此异常 + */ + @Override + public abstract String getColumnName(int rowIndex) throws TableDataException; + + /** + * 湖区数据集的行数 + * + * @return 行数 + * @throws TableDataException 如果获取数据集行数失败,则抛出此异常 + */ + @Override + public abstract int getRowCount() throws TableDataException; + + /** + * 获取数据集中指定位置的值 + * + * @param rowIndex 行 + * @param columnIndex 列 + * @return 值 + * @throws TableDataException 如果获取值失败,则抛出此异常 + */ + @Override + public abstract Object getValueAt(int rowIndex, int columnIndex) throws TableDataException; + + /** + * 释放一些构建数据集过程中占用的资源 + * + * @throws Exception 释放资源时发生错误,则抛出此异常 + */ + @Override + public abstract void release() throws Exception; +} diff --git a/src/main/java/com/fanruan/api/data/open/BaseTableData.java b/src/main/java/com/fanruan/api/data/open/BaseTableData.java new file mode 100644 index 0000000..9a50356 --- /dev/null +++ b/src/main/java/com/fanruan/api/data/open/BaseTableData.java @@ -0,0 +1,63 @@ +package com.fanruan.api.data.open; + +import com.fr.data.AbstractParameterTableData; +import com.fr.general.data.DataModel; +import com.fr.script.Calculator; +import com.fr.stable.ParameterProvider; + +/** + * @author richie + * @version 10.0 + * Created by richie on 2019-09-04 + * 插件的数据集接口 + */ +public abstract class BaseTableData extends AbstractParameterTableData { + + /** + * 实现这个方法来返回一个数据集 + * + * @param calculator 算子 + * @return 数据集二维表对象 + */ + @Override + public abstract DataModel createDataModel(Calculator calculator); + + /** + * 返回获取数据的执行对象 + * 系统取数时,调用此方法来返回一个获取数据的执行对象 + * 注意! 当数据集需要根据不同参数来多次取数时,此方法在一个计算过程中会被多次调用。 + * + * @param calculator 算子 + * @param rowCount 要获取数据的行数 + * @return 数据集二维表对象 + */ + @Override + public DataModel createDataModel(Calculator calculator, int rowCount) { + return createDataModel(calculator); + } + + /** + * 返回获取数据的执行对象 + * 系统取数时,调用此方法来返回一个获取数据的执行对象 + * 注意! 当数据集需要根据不同参数来多次取数时,此方法在一个计算过程中会被多次调用。 + * + * @param calculator 算子 + * @param name 数据集的名字 + * @return 数据集二维表对象 + */ + @Override + public DataModel createDataModel(Calculator calculator, String name) { + return createDataModel(calculator); + } + + /** + * 获取数据集中定义的参数 + * + * @param calculator 算子 + * @return 参数数组 + */ + @Override + public ParameterProvider[] getParameters(Calculator calculator) { + return super.getParameters(calculator); + } +} diff --git a/src/main/java/com/fanruan/api/design/ui/component/UIList.java b/src/main/java/com/fanruan/api/design/ui/component/UIList.java new file mode 100644 index 0000000..a7e3a47 --- /dev/null +++ b/src/main/java/com/fanruan/api/design/ui/component/UIList.java @@ -0,0 +1,26 @@ +package com.fanruan.api.design.ui.component; + +import javax.swing.*; +import java.util.Vector; + +/** + * @author Kalven + * @version 10.0 + * Created by Kalven on 2019/9/4 + * 列表组件 + */ +public class UIList extends com.fr.design.gui.ilist.UIList { + + public UIList(ListModel dataModel) { + super(dataModel); + } + + public UIList(Object[] listData) { + super(listData); + } + + public UIList(Vector listData) { + super(listData); + } + +} diff --git a/src/main/java/com/fanruan/api/design/ui/component/present/DictionaryPane.java b/src/main/java/com/fanruan/api/design/ui/component/present/DictionaryPane.java new file mode 100644 index 0000000..c956bae --- /dev/null +++ b/src/main/java/com/fanruan/api/design/ui/component/present/DictionaryPane.java @@ -0,0 +1,87 @@ +package com.fanruan.api.design.ui.component.present; + + +import com.fanruan.api.design.DesignKit; +import com.fr.data.Dictionary; +import com.fr.data.impl.DynamicSQLDict; +import com.fr.design.beans.FurtherBasicBeanPane; +import com.fr.design.constants.LayoutConstants; +import com.fr.design.data.DataCreatorUI; +import com.fr.design.gui.frpane.UIComboBoxPane; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.present.dict.CustomDictPane; +import com.fr.design.present.dict.DatabaseDictPane; +import com.fr.design.present.dict.FormulaDictPane; +import com.fr.design.present.dict.TableDataDictPane; + +import javax.swing.*; +import java.awt.*; +import java.util.ArrayList; +import java.util.List; + +/** + * @author Kalven + * @version 10.0 + * Created by Kalven on 2019/9/4 + * 数据字典容器,获取数据字典 + */ +public class DictionaryPane extends UIComboBoxPane implements DataCreatorUI { + private TableDataDictPane tableDataDictPane; + + @Override + protected void initLayout() { + this.setLayout(new BorderLayout(0, 4)); + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double[] columnSize = {p, f}; + double[] rowSize = {p, p}; + int[][] rowCount = {{1, 1}, {1, 1}}; + + Component[][] components = new Component[][]{ + new Component[]{new UILabel(DesignKit.i18nText("Fine-Design_Basic_Type_Set"), UILabel.LEFT), jcb}, + new Component[]{null, null} + }; + JPanel northPane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, LayoutConstants.VGAP_HUGER, LayoutConstants.VGAP_MEDIUM); + this.add(northPane, BorderLayout.NORTH); + this.add(cardPane, BorderLayout.CENTER); + } + + @Override + protected String title4PopupWindow() { + return DesignKit.i18nText("Fine-Design_Form_DS_Dictionary"); + } + + @Override + public JComponent toSwingComponent() { + return this; + } + + @Override + public void populateBean(Dictionary ob) { + for (int i = 0; i < this.cards.size(); i++) { + FurtherBasicBeanPane pane = cards.get(i); + if (pane.accept(ob)) { + pane.populateBean(ob); + jcb.setSelectedIndex(i); + } else { + pane.reset(); + } + } + if (ob instanceof DynamicSQLDict) { + jcb.setSelectedIndex(1); + tableDataDictPane.populateBean((DynamicSQLDict) ob); + } + } + + @Override + protected List> initPaneList() { + List> paneList = new ArrayList>(); + paneList.add(new DatabaseDictPane()); + paneList.add(tableDataDictPane = new TableDataDictPane()); + paneList.add(new CustomDictPane()); + paneList.add(new FormulaDictPane()); + return paneList; + } +} \ No newline at end of file diff --git a/src/main/java/com/fanruan/api/design/ui/component/table/action/UITableEditAction.java b/src/main/java/com/fanruan/api/design/ui/component/table/action/UITableEditAction.java index 1c441cf..60da73c 100644 --- a/src/main/java/com/fanruan/api/design/ui/component/table/action/UITableEditAction.java +++ b/src/main/java/com/fanruan/api/design/ui/component/table/action/UITableEditAction.java @@ -5,8 +5,8 @@ import java.awt.event.ActionEvent; public class UITableEditAction extends com.fr.design.gui.itableeditorpane.UITableEditAction { @Override - public void checkEnabled() { - } + public void checkEnabled(){}; + @Override public void actionPerformed(ActionEvent e) { diff --git a/src/main/java/com/fanruan/api/design/ui/component/table/model/UITableModelAdapter.java b/src/main/java/com/fanruan/api/design/ui/component/table/model/UITableModelAdapter.java index be69b7a..a26bd78 100644 --- a/src/main/java/com/fanruan/api/design/ui/component/table/model/UITableModelAdapter.java +++ b/src/main/java/com/fanruan/api/design/ui/component/table/model/UITableModelAdapter.java @@ -20,6 +20,7 @@ public abstract class UITableModelAdapter extends com.fr.design.gui.itableedi super(strings); } + @Override public abstract UITableEditAction[] createAction(); diff --git a/src/main/java/com/fanruan/api/design/ui/container/BasicBeanPane.java b/src/main/java/com/fanruan/api/design/ui/container/BasicBeanPane.java deleted file mode 100644 index 2ffc211..0000000 --- a/src/main/java/com/fanruan/api/design/ui/container/BasicBeanPane.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.fanruan.api.design.ui.container; - -public abstract class BasicBeanPane extends com.fr.design.beans.BasicBeanPane { -} diff --git a/src/main/java/com/fanruan/api/design/work/DatabaseConnectionPane.java b/src/main/java/com/fanruan/api/design/work/DatabaseConnectionPane.java index 4d6d086..9d2854a 100644 --- a/src/main/java/com/fanruan/api/design/work/DatabaseConnectionPane.java +++ b/src/main/java/com/fanruan/api/design/work/DatabaseConnectionPane.java @@ -4,7 +4,6 @@ package com.fanruan.api.design.work; import com.fanruan.api.design.ui.component.UIButton; import com.fanruan.api.design.ui.component.UIComboBox; import com.fanruan.api.design.ui.component.UILabel; -import com.fanruan.api.design.ui.container.BasicBeanPane; import com.fanruan.api.log.LogKit; import com.fanruan.api.macro.EncodeConstants; import com.fanruan.api.util.ArrayKit; @@ -31,7 +30,7 @@ import java.awt.event.WindowEvent; * * @param 数据连接类型 */ -public abstract class DatabaseConnectionPane extends BasicBeanPane { +public abstract class DatabaseConnectionPane extends com.fr.design.beans.BasicBeanPane { private UILabel message; private UIButton okButton; diff --git a/src/main/java/com/fanruan/api/design/work/form/basic/AccessiblePropertyEditor.java b/src/main/java/com/fanruan/api/design/work/form/basic/AccessiblePropertyEditor.java new file mode 100644 index 0000000..94f56c7 --- /dev/null +++ b/src/main/java/com/fanruan/api/design/work/form/basic/AccessiblePropertyEditor.java @@ -0,0 +1,15 @@ +package com.fanruan.api.design.work.form.basic; + +import com.fr.design.mainframe.widget.accessibles.AccessibleEditor; + +/** + * @author Kalven + * @version 10.0 + * Created by Kalven on 2019/9/4 + * 可以通过按钮或其他方式进去编辑面板的编辑器 + */ +public class AccessiblePropertyEditor extends com.fr.design.mainframe.widget.accessibles.AccessiblePropertyEditor { + public AccessiblePropertyEditor(AccessibleEditor editor) { + super(editor); + } +} diff --git a/src/main/java/com/fanruan/api/design/work/form/basic/EncoderCellRenderer.java b/src/main/java/com/fanruan/api/design/work/form/basic/EncoderCellRenderer.java new file mode 100644 index 0000000..7655a22 --- /dev/null +++ b/src/main/java/com/fanruan/api/design/work/form/basic/EncoderCellRenderer.java @@ -0,0 +1,53 @@ +package com.fanruan.api.design.work.form.basic; + +import com.fr.design.designer.properties.Encoder; +import com.fr.design.mainframe.widget.renderer.GenericCellRenderer; + +import java.awt.*; + +/** + * @author Kalven + * @version 10.0 + * Created by Kalven on 2019/9/4 + * 根据控件属性渲染单元格 + */ +public class EncoderCellRenderer extends GenericCellRenderer { + + private static int LEFT = 1; + protected Encoder encoder; + protected Object value; + + public EncoderCellRenderer(Encoder encoder) { + this.encoder = encoder; + } + + @Override + public void paint(Graphics g) { + int width = getWidth(); + int height = getHeight(); + g.setColor(getBackground()); + g.fillRect(0, 0, width, height); + + int x = LEFT; + g.setColor(getForeground()); + + FontMetrics fm = g.getFontMetrics(); + int y = ((height - fm.getHeight()) / 2) + fm.getAscent(); + String txt = getValueText(); + if (txt != null) { + g.drawString(txt, x, y); + } + if (getBorder() != null) { + getBorder().paintBorder(this, g, 0, 0, width, height); + } + } + + @Override + public void setValue(Object value) { + this.value = value; + } + + private String getValueText() { + return encoder.encode(value); + } +} \ No newline at end of file diff --git a/src/main/java/com/fanruan/api/design/work/form/basic/Item.java b/src/main/java/com/fanruan/api/design/work/form/basic/Item.java new file mode 100644 index 0000000..cf06bed --- /dev/null +++ b/src/main/java/com/fanruan/api/design/work/form/basic/Item.java @@ -0,0 +1,12 @@ +package com.fanruan.api.design.work.form.basic; + +/** + * @author Kalven + * @version 10.0 + * Created by Kalven on 2019/9/4 + */ +public class Item extends com.fr.design.designer.properties.items.Item { + public Item(String name, Object value) { + super(name, value); + } +} diff --git a/src/main/java/com/fanruan/api/design/work/form/basic/ItemCellEditor.java b/src/main/java/com/fanruan/api/design/work/form/basic/ItemCellEditor.java new file mode 100644 index 0000000..ae11f90 --- /dev/null +++ b/src/main/java/com/fanruan/api/design/work/form/basic/ItemCellEditor.java @@ -0,0 +1,15 @@ +package com.fanruan.api.design.work.form.basic; + +import com.fr.design.designer.properties.items.Item; + +/** + * @author Kalven + * @version 10.0 + * Created by Kalven on 2019/9/4 + * 用作左中右对齐设置的下拉框Editor + */ +public class ItemCellEditor extends com.fr.design.mainframe.widget.editors.ItemCellEditor { + public ItemCellEditor(Item[] items) { + super(items); + } +} diff --git a/src/main/java/com/fanruan/api/design/work/form/basic/UneditableAccessibleEditor.java b/src/main/java/com/fanruan/api/design/work/form/basic/UneditableAccessibleEditor.java new file mode 100644 index 0000000..879e2ff --- /dev/null +++ b/src/main/java/com/fanruan/api/design/work/form/basic/UneditableAccessibleEditor.java @@ -0,0 +1,15 @@ +package com.fanruan.api.design.work.form.basic; + +import com.fr.design.designer.properties.Encoder; + +/** + * @author Kalven + * @version 10.0 + * Created by Kalven on 2019/9/4 + * 无法修改的编辑器 + */ +public abstract class UneditableAccessibleEditor extends com.fr.design.mainframe.widget.accessibles.UneditableAccessibleEditor { + public UneditableAccessibleEditor(Encoder enc) { + super(enc); + } +} diff --git a/src/main/java/com/fanruan/api/design/work/form/container/AbstractDataModify.java b/src/main/java/com/fanruan/api/design/work/form/container/AbstractDataModify.java new file mode 100644 index 0000000..2567a2b --- /dev/null +++ b/src/main/java/com/fanruan/api/design/work/form/container/AbstractDataModify.java @@ -0,0 +1,10 @@ +package com.fanruan.api.design.work.form.container; + +/** + * 抽象数据定义,实现数据可序列化 + * @author Kalven + * @version 10.0 + * Created by Kalven on 2019/9/3 + */ +public abstract class AbstractDataModify extends com.fr.design.widget.ui.AbstractDataModify { +} diff --git a/src/main/java/com/fanruan/api/design/work/form/container/XLayoutContainer.java b/src/main/java/com/fanruan/api/design/work/form/container/XLayoutContainer.java new file mode 100644 index 0000000..21cd772 --- /dev/null +++ b/src/main/java/com/fanruan/api/design/work/form/container/XLayoutContainer.java @@ -0,0 +1,20 @@ +package com.fanruan.api.design.work.form.container; + +import com.fr.form.ui.container.WLayout; + +import java.awt.*; + +/** + * + * 属性设置部分布局容器 + * @author Kalven + * @version 10.0 + * Created by Kalven on 2019/9/3 + */ +public abstract class XLayoutContainer extends com.fr.design.designer.creator.XLayoutContainer { + + public XLayoutContainer(WLayout widget, Dimension initSize) { + super(widget, initSize); + this.addContainerListener(this); + } +} diff --git a/src/main/java/com/fanruan/api/design/work/form/creator/XFieldEditor.java b/src/main/java/com/fanruan/api/design/work/form/creator/XFieldEditor.java new file mode 100644 index 0000000..53afb63 --- /dev/null +++ b/src/main/java/com/fanruan/api/design/work/form/creator/XFieldEditor.java @@ -0,0 +1,17 @@ +package com.fanruan.api.design.work.form.creator; + +import com.fr.form.ui.FieldEditor; + +import java.awt.*; + +/** + * 控件树 + * @author Kalven + * @version 10.0 + * Created by Kalven on 2019/9/3 + */ +public abstract class XFieldEditor extends com.fr.design.designer.creator.XFieldEditor { + public XFieldEditor(FieldEditor widget, Dimension initSize) { + super(widget, initSize); + } +} diff --git a/src/main/java/com/fanruan/api/design/work/form/editor/StringEditor.java b/src/main/java/com/fanruan/api/design/work/form/editor/StringEditor.java new file mode 100644 index 0000000..e301eb7 --- /dev/null +++ b/src/main/java/com/fanruan/api/design/work/form/editor/StringEditor.java @@ -0,0 +1,14 @@ +package com.fanruan.api.design.work.form.editor; + +/** + * @author richie + * @version 10.0 + * Created by richie on 2019-09-05 + * 字符串编辑器 + */ +public class StringEditor extends com.fr.design.mainframe.widget.editors.StringEditor { + + public StringEditor() { + super(); + } +} diff --git a/src/main/java/com/fanruan/api/design/work/form/editor/WidgetValueEditor.java b/src/main/java/com/fanruan/api/design/work/form/editor/WidgetValueEditor.java new file mode 100644 index 0000000..9204356 --- /dev/null +++ b/src/main/java/com/fanruan/api/design/work/form/editor/WidgetValueEditor.java @@ -0,0 +1,18 @@ +package com.fanruan.api.design.work.form.editor; + +/** + * @author Kalven + * @version 10.0 + * Created by Kalven on 2019/9/4 + * 控件值编辑器 + */ +public class WidgetValueEditor extends com.fr.design.mainframe.widget.editors.WidgetValueEditor { + + public WidgetValueEditor(Object o) { + super(o); + } + + public WidgetValueEditor(Object o, boolean onlyServer) { + super(o, onlyServer); + } +} diff --git a/src/main/java/com/fanruan/api/design/work/form/macro/XCreatorConstants.java b/src/main/java/com/fanruan/api/design/work/form/macro/XCreatorConstants.java new file mode 100644 index 0000000..8596304 --- /dev/null +++ b/src/main/java/com/fanruan/api/design/work/form/macro/XCreatorConstants.java @@ -0,0 +1,12 @@ +package com.fanruan.api.design.work.form.macro; + +/** + * 存放XCreator的常量 + * @author Kalven + * @version 10.0 + * Created by Kalven on 2019/9/3 + */ +public class XCreatorConstants { + + public static final String PROPERTY_CATEGORY = com.fr.design.form.util.XCreatorConstants.PROPERTY_CATEGORY; +} diff --git a/src/main/java/com/fanruan/api/err/TableDataException.java b/src/main/java/com/fanruan/api/err/TableDataException.java new file mode 100644 index 0000000..690c1b2 --- /dev/null +++ b/src/main/java/com/fanruan/api/err/TableDataException.java @@ -0,0 +1,18 @@ +package com.fanruan.api.err; + +/** + * @author richie + * @version 10.0 + * Created by richie on 2019-09-04 + * 数据集异常 + */ +public class TableDataException extends com.fr.general.data.TableDataException { + + public TableDataException(String s) { + super(s); + } + + public TableDataException(String s, Throwable throwable) { + super(s, throwable); + } +} diff --git a/src/main/java/com/fanruan/api/io/ResourceModuleKit.java b/src/main/java/com/fanruan/api/io/ResourceModuleKit.java new file mode 100644 index 0000000..295c8b5 --- /dev/null +++ b/src/main/java/com/fanruan/api/io/ResourceModuleKit.java @@ -0,0 +1,41 @@ +package com.fanruan.api.io; + +import com.fr.io.base.provider.RepositoryFactoryProvider; +import com.fr.io.context.ResourceModuleContext; +import org.jetbrains.annotations.NotNull; + +/** + * + * 资源仓库插件开发套件 + * + * @author rinoux + * @version 10.0 + * Created by rinoux on 2019/9/5 + */ +public class ResourceModuleKit { + + + /** + * 添加一个资源仓库工厂 + * + * @param factory 工厂 + * @param 工厂类型 + */ + public static void addFactory(@NotNull T factory) { + ResourceModuleContext.addFactory(factory); + } + + + /** + * 移除一个资源仓库工厂 + * + * @param factory 工厂 + * @param 工厂类型 + */ + public static void removeFactory(@NotNull T factory) { + ResourceModuleContext.removeFactory(factory.getIdentity()); + } + + + +} diff --git a/src/main/java/com/fanruan/api/report/BaseHTMLWriterKit.java b/src/main/java/com/fanruan/api/report/BaseHTMLWriterKit.java new file mode 100644 index 0000000..fd9a07f --- /dev/null +++ b/src/main/java/com/fanruan/api/report/BaseHTMLWriterKit.java @@ -0,0 +1,21 @@ +package com.fanruan.api.report; + +import com.fr.stable.html.Tag; +import com.fr.stable.web.Repository; +import com.fr.web.BaseHTMLWriterUtils; + +import java.awt.*; + +public class BaseHTMLWriterKit { + + /** + * 根据原始的图片和指定的尺寸以及报表上下文生成图片的HTML标签,该方法只生成一个简单的img标签 + * @param image 原始图片 + * @param dimension 指定尺寸 + * @param repo 报表上下文 + * @return img图片标签 + */ + public static Tag createImageTag4RepoWithCheckVml(Image image, Dimension dimension, Repository repo){ + return BaseHTMLWriterUtils.createImageTag4RepoWithCheckVml(image, dimension, repo); + } +} diff --git a/src/main/java/com/fanruan/api/report/PaintKit.java b/src/main/java/com/fanruan/api/report/PaintKit.java new file mode 100644 index 0000000..3b1787e --- /dev/null +++ b/src/main/java/com/fanruan/api/report/PaintKit.java @@ -0,0 +1,22 @@ +package com.fanruan.api.report; + +import com.fr.base.Style; +import com.fr.report.cell.cellattr.core.CellUtils; + +import java.awt.*; + +public class PaintKit { + + /** + * 如果value是ImageWithSuffix类的一个实例,则创建一个宽为width,高为height,类型为TYPE_4BYTE_ABGR的image,并将其按照比例和Style绘制。 + * @param value 传入的需要判断为是否是ImageWithSuffix实例的对象 + * @param resolution 缩放比例的分母,缩放比例为1/resolution + * @param style 绘制image的style + * @param width 绘制image的宽 + * @param height 绘制image的高 + * @return 返回宽为width,高为height,类型为TYPE_4BYTE_ABGR的image + */ + public static Image value2Image(Object value, int resolution, Style style, int width, int height){ + return CellUtils.value2Image(value, resolution, style, width, height); + } +} diff --git a/src/main/java/com/fanruan/api/report/form/CustomWriteAbleRepeatEditor.java b/src/main/java/com/fanruan/api/report/form/CustomWriteAbleRepeatEditor.java new file mode 100644 index 0000000..42de2d0 --- /dev/null +++ b/src/main/java/com/fanruan/api/report/form/CustomWriteAbleRepeatEditor.java @@ -0,0 +1,10 @@ +package com.fanruan.api.report.form; + +/** + * 允许自定义值的、允许直接编辑的、带重复的 --- 下拉框 下拉复选框 下拉树 + * @author Kalven + * @version 10.0 + * Created by Kalven on 2019/9/4 + */ +public abstract class CustomWriteAbleRepeatEditor extends com.fr.form.ui.CustomWriteAbleRepeatEditor { +} diff --git a/src/main/java/com/fanruan/api/security/JwtKit.java b/src/main/java/com/fanruan/api/security/JwtKit.java new file mode 100644 index 0000000..d90cf8c --- /dev/null +++ b/src/main/java/com/fanruan/api/security/JwtKit.java @@ -0,0 +1,213 @@ +package com.fanruan.api.security; + +import com.fanruan.api.log.LogKit; +import com.fr.cert.token.JwtBuilder; +import com.fr.cert.token.Jwts; +import com.fr.cert.token.SignatureAlgorithm; +import com.fr.cert.token.SignatureException; +import com.fr.cert.token.impl.DefaultClaims; +import com.fr.security.KeySecretSeedConfig; +import com.fr.security.SecurityToolbox; + +import java.io.IOException; +import java.security.Key; +import java.util.Date; +import java.util.Map; + +/** + * @author richie + * @version 10.0 + * Created by richie on 2019-09-03 + * 用于生成和解析基于JWT的token + */ +public class JwtKit { + + private static final String JWT_ID = "jwt"; + private static final String ISSUER = "fanruan"; + private static final SignatureAlgorithm DEFAULT_ALGORITHM = SignatureAlgorithm.HS256; + + /** + * 创建完整token + * + * @param issuer jwt签发者 + * @param subject jwt所面向的用户 + * @param audience 接收jwt的一方 + * @param expiration jwt的过期时间,这个过期时间必须要大于签发时间 + * @param notBeforeTime 定义在什么时间之前,该jwt都是不可用的. + * @param issuerAtTime jwt的签发时间 + * @param jwtId jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。 + * @param algorithm 加密算法 + * @param secretKey 秘钥 + * @return 签名后的token + */ + public static String createJWT(String issuer, String subject, String audience, Date expiration, Date notBeforeTime, + Date issuerAtTime, String jwtId, SignatureAlgorithm algorithm, Key secretKey) { + JwtBuilder builder = Jwts.builder() + .setIssuer(issuer) + .setSubject(subject) + .setAudience(audience) + .setExpiration(expiration) + .setNotBefore(notBeforeTime) + .setIssuedAt(issuerAtTime) + .setId(jwtId) + .signWith(algorithm, secretKey); + return builder.compact(); + } + + /** + * 创建默认的token,用不超时 + * + * @param subject 主题 + * @return token + */ + public static String createDefaultJWT(String subject) { + JwtBuilder builder = Jwts.builder() + .setIssuer(ISSUER) + .setIssuedAt(new Date()) + .setSubject(subject) + .setId(JWT_ID) + .signWith(DEFAULT_ALGORITHM, getKeyBytes()); + return builder.compact(); + } + + /** + * 创建默认的token + * + * @param subject 主题 + * @param description 描述 + * @return token + */ + public static String createDefaultJWT(String subject, String description) { + JwtBuilder builder = Jwts.builder() + .setIssuer(ISSUER) + .setIssuedAt(new Date()) + .setSubject(subject) + .setDescription(description) + .setId(JWT_ID) + .signWith(DEFAULT_ALGORITHM, getKeyBytes()); + return builder.compact(); + } + + /** + * 创建默认token + * + * @param subject 主题 + * @param description 描述 + * @param timeout 超时时长 + * @return token + */ + public static String createDefaultJWT(String subject, String description, long timeout) { + Date currentTime = new Date(); + Date timeoutTime = new Date(currentTime.getTime() + timeout); + JwtBuilder builder = Jwts.builder() + .setIssuer(ISSUER) + .setIssuedAt(currentTime) + .setExpiration(timeoutTime) + .setSubject(subject) + .setDescription(description) + .setId(JWT_ID) + .signWith(DEFAULT_ALGORITHM, getKeyBytes()); + return builder.compact(); + } + + /** + * 创建有超时时限的token + * + * @param subject 主题 + * @param timeout 超时时长 + * @return token + */ + public static String createDefaultJWT(String subject, long timeout) { + Date currentTime = new Date(); + Date timeoutTime = new Date(currentTime.getTime() + timeout); + JwtBuilder builder = Jwts.builder() + .setIssuer(ISSUER) + .setIssuedAt(currentTime) + .setExpiration(timeoutTime) + .setSubject(subject) + .setId(JWT_ID) + .signWith(DEFAULT_ALGORITHM, getKeyBytes()); + return builder.compact(); + } + + /** + * 解析token + * + * @param jwt token字符串 + * @return 签名通过之后的结果集 + * @throws SignatureException 签名错误异常 + */ + public static Map parseJWT(String jwt) { + try { + return Jwts.parser().setSigningKey(getKeyBytes()).parseClaimsJws(jwt).getBody(); + } catch (SignatureException e) { + LogKit.warn(e.getMessage()); + } + return new DefaultClaims(); + } + + + /** + * 根据自定义的key,创建token + * + * @param signatureKey 秘钥 + * @param claims token携带的信息 + * @return token + */ + public static String createVariedJWT(String signatureKey, Map claims) { + JwtBuilder builder = Jwts.builder() + .setIssuer(ISSUER) + .setIssuedAt(new Date()) + .setClaims(claims) + .setId(JWT_ID) + .signWith(DEFAULT_ALGORITHM, signatureKey); + return builder.compact(); + } + + /** + * 根据自定义的key,创建token + * + * @param signatureKey 秘钥 + * @param timeout 有效期 + * @param claims token携带的信息 + * @return token + */ + public static String createVariedJWT(String signatureKey, long timeout, Map claims) { + Date currentTime = new Date(); + Date timeoutTime = new Date(currentTime.getTime() + timeout); + JwtBuilder builder = Jwts.builder() + .setIssuer(ISSUER) + .setIssuedAt(new Date()) + .setExpiration(timeoutTime) + .setClaims(claims) + .setId(JWT_ID) + .signWith(DEFAULT_ALGORITHM, signatureKey); + return builder.compact(); + } + + /** + * 解析token, 先对key进行utf-8解码 + * + * @param jwt token字符串 + * @param signatureKey 秘钥 + * @return 签名通过之后的结果集 + * @throws SignatureException 签名错误异常 + */ + public static Map parseJWT(String jwt, String signatureKey) { + try { + return Jwts.parser().setSigningKey(signatureKey).parseClaimsJws(jwt).getBody(); + } catch (SignatureException e) { + LogKit.warn(e.getMessage()); + } + return new DefaultClaims(); + } + + private static byte[] getKeyBytes() { + try { + return SecurityToolbox.base642Byte(KeySecretSeedConfig.getInstance().getTrustSeed()); + } catch (IOException e) { + LogKit.error("key secret seed base64 decode error"); + } + return new byte[0]; + } +} diff --git a/src/main/java/com/fanruan/api/security/SecurityKit.java b/src/main/java/com/fanruan/api/security/SecurityKit.java index e6e903c..59c90d8 100644 --- a/src/main/java/com/fanruan/api/security/SecurityKit.java +++ b/src/main/java/com/fanruan/api/security/SecurityKit.java @@ -35,4 +35,13 @@ public class SecurityKit { public static String passwordDecode(String passwordText) { return CodeUtils.passwordDecode(passwordText); } + + /** + * 给字符串加密 + * @param passwordText 待加密的字符串 + * @return 解加密的字符串 + */ + public static String passwordEncode(String passwordText) { + return CodeUtils.passwordEncode(passwordText); + } } diff --git a/src/main/java/com/fanruan/api/util/ArrayKit.java b/src/main/java/com/fanruan/api/util/ArrayKit.java index 56322f1..5df74b7 100644 --- a/src/main/java/com/fanruan/api/util/ArrayKit.java +++ b/src/main/java/com/fanruan/api/util/ArrayKit.java @@ -2,6 +2,8 @@ package com.fanruan.api.util; import com.fr.stable.ArrayUtils; +import java.util.List; + /** * @author richie * @version 10.0 @@ -91,4 +93,22 @@ public class ArrayKit { public static boolean isNotEmpty(T[] array) { return ArrayUtils.isNotEmpty(array); } + + /** + * 返回一个ArrayList + * @param array 数组 + * @return 链表 + * */ + public static List toList(T[] array) { + return ArrayUtils.toList(array); + } + + /** + * 求数组长度 + * @param array 数组 + * @return 长度 + */ + public static int getLength(Object array) { + return ArrayUtils.getLength(array); + } } diff --git a/src/main/java/com/fanruan/api/util/CodeKit.java b/src/main/java/com/fanruan/api/util/CodeKit.java index b819eb4..5c89421 100644 --- a/src/main/java/com/fanruan/api/util/CodeKit.java +++ b/src/main/java/com/fanruan/api/util/CodeKit.java @@ -12,4 +12,14 @@ public class CodeKit { public static String passwordDecode(String passwordText) { return CodeUtils.passwordDecode(passwordText); } + + /** + * 将经过处理的中日韩文字符串解码成原先的中日韩文 + * @param text 经过处理的中日韩文字 + * @return 中日韩文字 + * @throws Exception + */ + public static String cjkDecode(String text) throws Exception { + return CodeUtils.cjkDecode(text); + } } diff --git a/src/main/java/com/fanruan/api/util/GeneralKit.java b/src/main/java/com/fanruan/api/util/GeneralKit.java index 9e13593..60d642b 100644 --- a/src/main/java/com/fanruan/api/util/GeneralKit.java +++ b/src/main/java/com/fanruan/api/util/GeneralKit.java @@ -3,7 +3,12 @@ package com.fanruan.api.util; import com.fr.base.FRContext; import com.fr.general.ComparatorUtils; import com.fr.general.GeneralUtils; +import com.fr.general.xml.GeneralXMLTools; import com.fr.stable.CommonUtils; +import com.fr.stable.StringUtils; +import com.fr.stable.xml.XMLPrintWriter; +import com.fr.stable.xml.XMLable; +import com.fr.stable.xml.XMLableReader; import com.fr.third.guava.base.Objects; import com.fr.stable.StableUtils; import org.jetbrains.annotations.NotNull; @@ -83,7 +88,7 @@ public class GeneralKit { public static String join(Object[] array, String se) { return StableUtils.join(array, se); } - /* + /** * 返回国际化区属 * @return 国际化后区域属性 */ @@ -91,4 +96,6 @@ public class GeneralKit { public static Locale getLocale() { return FRContext.getLocale(); } + + } diff --git a/src/main/java/com/fanruan/api/xml/XmlKit.java b/src/main/java/com/fanruan/api/xml/XmlKit.java index 89de42a..dc2cfc1 100644 --- a/src/main/java/com/fanruan/api/xml/XmlKit.java +++ b/src/main/java/com/fanruan/api/xml/XmlKit.java @@ -3,11 +3,13 @@ package com.fanruan.api.xml; import com.fr.data.core.DataCoreXmlUtils; import com.fr.data.impl.Connection; import com.fr.general.xml.GeneralXMLTools; -import com.fr.stable.xml.XMLPrintWriter; +import com.fr.stable.ParameterProvider; import com.fr.stable.xml.XMLReadable; import com.fr.stable.xml.XMLTools; import com.fr.stable.xml.XMLable; import com.fr.stable.xml.XMLableReader; +import com.fr.stable.xml.XMLPrintWriter; +import com.fr.stable.xml.StableXMLUtils; import java.io.InputStream; @@ -76,4 +78,13 @@ public class XmlKit { DataCoreXmlUtils.writeXMLConnection(writer, connection); } + /** + *读出xml参数 + * @param reader xml读出对象 + * @return 返回保存参数数组 + */ + public static ParameterProvider readParameter(XMLableReader reader) { + return StableXMLUtils.readParameter(reader); + } + } diff --git a/src/test/java/com/fanruan/api/cal/FormulaKitTest.java b/src/test/java/com/fanruan/api/cal/FormulaKitTest.java index abed6cb..f2faf24 100644 --- a/src/test/java/com/fanruan/api/cal/FormulaKitTest.java +++ b/src/test/java/com/fanruan/api/cal/FormulaKitTest.java @@ -72,4 +72,14 @@ public class FormulaKitTest extends Prepare { assertEquals(true, FormulaKit.checkFormulaContent(new Formula("="))); assertEquals(false, FormulaKit.checkFormulaContent("=")); } + + @Test + public void canBeFormula() { + String s1 = "=1"; + String s2 = "=a+b+"; + String s3 = "ppp"; + Assert.assertTrue(FormulaKit.canBeFormula(s1)); + Assert.assertTrue(FormulaKit.canBeFormula(s2)); + Assert.assertFalse(FormulaKit.canBeFormula(s3)); + } } \ No newline at end of file diff --git a/src/test/java/com/fanruan/api/cal/ParameterKitTest.java b/src/test/java/com/fanruan/api/cal/ParameterKitTest.java index 4093687..623650f 100644 --- a/src/test/java/com/fanruan/api/cal/ParameterKitTest.java +++ b/src/test/java/com/fanruan/api/cal/ParameterKitTest.java @@ -111,7 +111,22 @@ public class ParameterKitTest extends Prepare { @Test public void newParameter2() { ParameterProvider provider = ParameterKit.newParameter("p1"); - Assert.assertEquals(provider.getName(),"p1"); + Assert.assertEquals(provider.getName(), "p1"); Assert.assertEquals("", provider.getValue()); } + + @Test + public void analyzeAndUnionSameParameters() { + ParameterProvider p1 = ParameterKit.newParameter("p1", 100); + ParameterProvider p2 = ParameterKit.newParameter("p2", 200); + + ParameterProvider[] providers = ParameterKit.analyzeAndUnionSameParameters( + new String[]{"select * from td where name = ${p1} and age = ${p3}"}, + new ParameterProvider[]{p1, p2}); + for (ParameterProvider provider : providers) { + if ("p1".equals(provider.getName())) { + Assert.assertEquals(100, provider.getValue()); + } + } + } } \ No newline at end of file diff --git a/src/test/java/com/fanruan/api/data/open/BaseTableDataTest.java b/src/test/java/com/fanruan/api/data/open/BaseTableDataTest.java new file mode 100644 index 0000000..a979832 --- /dev/null +++ b/src/test/java/com/fanruan/api/data/open/BaseTableDataTest.java @@ -0,0 +1,67 @@ +package com.fanruan.api.data.open; + +import com.fr.general.data.DataModel; +import com.fr.script.Calculator; +import org.junit.Assert; +import org.junit.Test; + +/** + * @author richie + * @version 10.0 + * Created by richie on 2019-09-04 + */ +public class BaseTableDataTest { + + @Test + public void testCreate() throws Exception { + Calculator calculator = Calculator.createCalculator(); + DemoTableData tableData = new DemoTableData(); + DataModel model = tableData.createDataModel(calculator); + Object r = model.getValueAt(0, 0); + Assert.assertTrue(model.hasRow(0)); + Assert.assertFalse(model.hasRow(1)); + Assert.assertEquals(1, model.getColumnCount()); + Assert.assertEquals(1, model.getRowCount()); + Assert.assertEquals("abc", r); + } + + + private static class DemoTableData extends BaseTableData { + + @Override + public DataModel createDataModel(Calculator calculator) { + return new BaseDataModel() { + + @Override + public int getColumnCount() { + return 1; + } + + @Override + public String getColumnName(int i) { + return "test"; + } + + @Override + public boolean hasRow(int i) { + return i < 1; + } + + @Override + public int getRowCount() { + return 1; + } + + @Override + public Object getValueAt(int i, int i1) { + return "abc"; + } + + @Override + public void release() throws Exception { + + } + }; + } + } +} \ No newline at end of file diff --git a/src/test/java/com/fanruan/api/function/FunctionKitTest.java b/src/test/java/com/fanruan/api/function/FunctionKitTest.java index db3f0f9..b3dafbc 100644 --- a/src/test/java/com/fanruan/api/function/FunctionKitTest.java +++ b/src/test/java/com/fanruan/api/function/FunctionKitTest.java @@ -42,4 +42,8 @@ public class FunctionKitTest extends Prepare { assertNotEquals("OK", result); } + @Test + public void generateFunctionID() { + assertEquals(FunctionKit.generateFunctionID("com.fr.plugin.widget.ztree"),169608572); + } } \ No newline at end of file diff --git a/src/test/java/com/fanruan/api/io/ResourceModuleKitTest.java b/src/test/java/com/fanruan/api/io/ResourceModuleKitTest.java new file mode 100644 index 0000000..e5d3f50 --- /dev/null +++ b/src/test/java/com/fanruan/api/io/ResourceModuleKitTest.java @@ -0,0 +1,124 @@ +package com.fanruan.api.io; + +import com.fr.io.base.provider.FactoryLoaderProvider; +import com.fr.io.base.provider.RepositoryFactoryProvider; +import com.fr.io.base.provider.RepositoryInstallerProvider; +import com.fr.io.base.provider.RepositoryManagerProvider; +import com.fr.io.config.RepositoryConfig; +import com.fr.io.config.ResourceModuleConfigProvider; +import com.fr.io.context.RepositoryContextProvider; +import com.fr.io.context.ResourceModuleContext; +import com.fr.io.lock.LockFactory; +import org.easymock.EasyMock; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + +/** + * ResourceModuleKit Tester. + * + * @author + * @version 1.0 + * @since
9月 5, 2019
+ */ +public class ResourceModuleKitTest { + + @Before + public void before() throws Exception { + final FactoryLoaderProvider loaderProvider = new FactoryLoaderProvider() { + final Map map = new HashMap<>(); + + @Override + public void add(RepositoryFactoryProvider factory) { + map.put(factory.getIdentity(), factory); + } + + @Override + public void remove(String identity) { + map.remove(identity); + } + + @Override + @SuppressWarnings("unchecked") + public RepositoryFactoryProvider get(String identity) { + return map.get(identity); + } + }; + + ResourceModuleContext.setRepositoryContext(new RepositoryContextProvider() { + @Override + public FactoryLoaderProvider getFactoryLoader() { + + return loaderProvider; + } + + @Override + public ResourceModuleConfigProvider getConfig() { + return null; + } + + @Override + public RepositoryManagerProvider getManager() { + return null; + } + + @Override + public RepositoryInstallerProvider getInstaller() { + return null; + } + + @Override + public LockFactory getLockFactory() { + return null; + } + }); + } + + @After + public void after() throws Exception { + ResourceModuleContext.setRepositoryContext(null); + } + + /** + * Method: addFactory(@NotNull T factory) + */ + @Test + public void testAddFactory() throws Exception { + RepositoryFactoryProvider factory = EasyMock.createMock(RepositoryFactoryProvider.class); + EasyMock.expect(factory.getIdentity()).andReturn("MockRF").anyTimes(); + + EasyMock.replay(factory); + + Assert.assertNull(ResourceModuleContext.getFactory("MockRF")); + + ResourceModuleKit.addFactory(factory); + + Assert.assertNotNull(ResourceModuleContext.getFactory("MockRF")); + } + + + /** + * Method: addFactory(@NotNull T factory) + */ + @Test + public void testRemoveFactory() throws Exception { + RepositoryFactoryProvider factory = EasyMock.createMock(RepositoryFactoryProvider.class); + EasyMock.expect(factory.getIdentity()).andReturn("MockRF").anyTimes(); + + EasyMock.replay(factory); + + Assert.assertNull(ResourceModuleContext.getFactory("MockRF")); + + ResourceModuleKit.addFactory(factory); + + Assert.assertNotNull(ResourceModuleContext.getFactory("MockRF")); + + ResourceModuleKit.removeFactory(factory); + + Assert.assertNull(ResourceModuleContext.getFactory("MockRF")); + } +} diff --git a/src/test/java/com/fanruan/api/plugin/PluginKitTest.java b/src/test/java/com/fanruan/api/plugin/PluginKitTest.java new file mode 100644 index 0000000..7d5f9a5 --- /dev/null +++ b/src/test/java/com/fanruan/api/plugin/PluginKitTest.java @@ -0,0 +1,13 @@ +package com.fanruan.api.plugin; + +import com.fanruan.api.runtime.PluginKit; +import org.junit.Assert; +import org.junit.Test; + +public class PluginKitTest { + @Test + public void getArray() { + Assert.assertFalse(PluginKit.isCurrentPluginAvailable()); + + } +} diff --git a/src/test/java/com/fanruan/api/security/JwtKitTest.java b/src/test/java/com/fanruan/api/security/JwtKitTest.java new file mode 100644 index 0000000..abfd086 --- /dev/null +++ b/src/test/java/com/fanruan/api/security/JwtKitTest.java @@ -0,0 +1,77 @@ +package com.fanruan.api.security; + +import com.fanruan.api.Prepare; +import com.fr.cert.token.JwtBuilder; +import com.fr.cert.token.Jwts; +import com.fr.cert.token.SignatureAlgorithm; +import com.fr.security.SecurityToolbox; +import com.fr.stable.CodeUtils; +import org.junit.Assert; +import org.junit.Test; + +import java.io.UnsupportedEncodingException; +import java.util.Calendar; +import java.util.Date; +import java.util.Map; + +/** + * @author richie + * @version 10.0 + * Created by richie on 2019-09-03 + */ +public class JwtKitTest extends Prepare { + + @Test + public void testCreateDefaultJWT() throws Exception { + String tokenCN = JwtKit.createDefaultJWT("你好,我是中国人"); + Map claims = JwtKit.parseJWT(tokenCN); + Assert.assertEquals("你好,我是中国人", CodeUtils.cjkDecode(String.valueOf(claims.get("sub")))); + + String tokenEN = JwtKit.createDefaultJWT("Hello, world"); + Map claims2 = JwtKit.parseJWT(tokenEN); + Assert.assertEquals("Hello, world", CodeUtils.cjkDecode(String.valueOf(claims2.get("sub")))); + } + + @Test + public void testClaims() throws Exception { + String token = JwtKit.createDefaultJWT("千万", "我是千万的爹"); + Map claims2 = JwtKit.parseJWT(token); + String text = CodeUtils.cjkDecode(String.valueOf(claims2.get("description"))); + Assert.assertEquals("我是千万的爹", text); + } + + @Test + public void test1() throws UnsupportedEncodingException { + String token = createToken().compact(); + Assert.assertEquals(Jwts.parser().setSigningKey("abc=啊").parseClaimsJws(token).getBody().getSubject(), "hello.cpt"); + + token = createToken().signWithBase64SecretKey(SignatureAlgorithm.HS256, SecurityToolbox.byte2Base64("abc=啊".getBytes())).compact(); + Assert.assertEquals(Jwts.parser() + .setBase64SigningKey(SecurityToolbox.byte2Base64("abc=啊".getBytes())) + .parseClaimsJws(token).getBody().getSubject(), "hello.cpt"); + + token = createToken() + .signWith(SignatureAlgorithm.HS256, "abc=啊".getBytes("GBK")) + .compact(); + Assert.assertEquals("hello.cpt", Jwts.parser().setSigningKey("abc=啊".getBytes("GBK")).parseClaimsJws(token).getBody().getSubject()); + } + + private JwtBuilder createToken() { + SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; + + Calendar calendar = Calendar.getInstance(); + calendar.set(2019, Calendar.FEBRUARY, 20, 18, 0, 0); + Date currentTime = calendar.getTime(); + calendar.set(2029, Calendar.FEBRUARY, 20, 18, 0, 0); + Date expirationTime = calendar.getTime(); + return Jwts.builder() + .setHeaderParam("typ", "JWT") + .setIssuer("fanruan") + .setSubject("hello.cpt") + .setExpiration(expirationTime) + .setIssuedAt(currentTime) + .setId("01") + .signWith(signatureAlgorithm, "abc=啊"); + } + +} \ No newline at end of file diff --git a/src/test/java/com/fanruan/api/security/SecurityKitTest.java b/src/test/java/com/fanruan/api/security/SecurityKitTest.java new file mode 100644 index 0000000..6760606 --- /dev/null +++ b/src/test/java/com/fanruan/api/security/SecurityKitTest.java @@ -0,0 +1,18 @@ +package com.fanruan.api.security; + +import java.util.*; + +import com.fr.stable.CommonCodeUtils; +import org.junit.Assert; +import org.junit.Test; + +public class SecurityKitTest { + @Test + public void passwordDecode(){ + Assert.assertEquals(SecurityKit.passwordDecode("1234"), CommonCodeUtils.passwordDecode("1234")); + } + @Test + public void passwordEncode(){ + Assert.assertEquals(SecurityKit.passwordEncode("1234"), CommonCodeUtils.passwordEncode("1234")); + } +} diff --git a/src/test/java/com/fanruan/api/util/ArrayKitTest.java b/src/test/java/com/fanruan/api/util/ArrayKitTest.java index cfedded..45c6096 100644 --- a/src/test/java/com/fanruan/api/util/ArrayKitTest.java +++ b/src/test/java/com/fanruan/api/util/ArrayKitTest.java @@ -1,6 +1,8 @@ package com.fanruan.api.util; import com.fanruan.api.Prepare; +import java.util.*; + import org.junit.Assert; import org.junit.Test; @@ -97,4 +99,23 @@ public class ArrayKitTest extends Prepare { Assert.assertEquals(ArrayKit.addAll(longTestArray, 5L,6L), longTestResult); Assert.assertEquals(ArrayKit.addAll(shortTestArray, new Short("5"),new Short("6")), shortTestResult); } + + @Test + public void toList() throws Exception{ + Integer array[] = {1,2,3}; + ArrayList result = new ArrayList(); + result.add(1); + result.add(2); + result.add(3); + Assert.assertEquals(ArrayKit.toList(array),result); + } + + @Test + public void getLength() { + int[] a = new int[0]; + int[] b = new int[2]; + Assert.assertEquals(ArrayKit.getLength(a),0); + Assert.assertEquals(ArrayKit.getLength(null),0); + Assert.assertEquals(ArrayKit.getLength(b),2); + } } diff --git a/src/test/java/com/fanruan/api/util/CodeKitTest.java b/src/test/java/com/fanruan/api/util/CodeKitTest.java index 10853e6..5224324 100644 --- a/src/test/java/com/fanruan/api/util/CodeKitTest.java +++ b/src/test/java/com/fanruan/api/util/CodeKitTest.java @@ -1,5 +1,6 @@ package com.fanruan.api.util; +import com.fr.stable.CodeUtils; import com.fr.stable.CommonCodeUtils; import org.junit.Assert; import org.junit.Test; @@ -9,4 +10,17 @@ public class CodeKitTest { public void passwordDecode(String passwordText) { Assert.assertEquals(CodeKit.passwordDecode(passwordText), 123); } + + @Test + public void cjkDecode() { + String s = "中文 한글 日本語"; + String encode = CodeUtils.cjkEncode(s); + + try { + String decode = CodeKit.cjkDecode(encode); + Assert.assertTrue(s.equals(decode)); + } catch (Exception e) { + + } + } } diff --git a/src/test/java/com/fanruan/api/util/GeneralKitTest.java b/src/test/java/com/fanruan/api/util/GeneralKitTest.java index c8057ec..6ba3bf6 100644 --- a/src/test/java/com/fanruan/api/util/GeneralKitTest.java +++ b/src/test/java/com/fanruan/api/util/GeneralKitTest.java @@ -2,6 +2,8 @@ package com.fanruan.api.util; import com.fanruan.api.Prepare; import com.fr.general.GeneralUtils; +import com.fr.stable.AssistUtils; +import com.fr.stable.xml.XMLableReader; import org.junit.Assert; import org.junit.Test; @@ -52,4 +54,5 @@ public class GeneralKitTest extends Prepare { public void getLocale() { Assert.assertEquals(GeneralKit.getLocale(), Locale.CHINA); } + } \ No newline at end of file diff --git a/src/test/java/com/fanruan/api/util/PaintKitTest.java b/src/test/java/com/fanruan/api/util/PaintKitTest.java new file mode 100644 index 0000000..69acc07 --- /dev/null +++ b/src/test/java/com/fanruan/api/util/PaintKitTest.java @@ -0,0 +1,21 @@ +package com.fanruan.api.util; + +import com.fanruan.api.report.PaintKit; +import com.fr.base.Style; +import org.junit.Assert; +import org.junit.Test; + +import java.awt.*; +import java.awt.image.BufferedImage; + +public class PaintKitTest { + + @Test + public void value2Image() { + BufferedImage bi = new BufferedImage(40, 50, BufferedImage.TYPE_BYTE_GRAY); + Style style = Style.getInstance(); + Image image = PaintKit.value2Image(bi, 1, style, 30, 50); + Assert.assertEquals(30, image.getWidth(null)); + Assert.assertEquals(50, image.getHeight(null)); + } +} \ No newline at end of file diff --git a/src/test/java/com/fanruan/api/xml/XmlKitTest.java b/src/test/java/com/fanruan/api/xml/XmlKitTest.java new file mode 100644 index 0000000..2c33d4d --- /dev/null +++ b/src/test/java/com/fanruan/api/xml/XmlKitTest.java @@ -0,0 +1,38 @@ +package com.fanruan.api.xml; + +import com.fr.base.Parameter; +import com.fr.base.TableData; +import com.fr.plugin.db.json.core.JSONTableData; +import com.fr.stable.ParameterProvider; +import com.fr.stable.bridge.StableFactory; +import com.fr.stable.xml.StableXMLUtils; +import com.fr.stable.xml.XMLPrintWriter; +import com.fr.stable.xml.XMLUtils; +import com.fr.stable.xml.XMLableReader; +import com.fr.third.javax.xml.stream.XMLStreamException; +import org.junit.Assert; +import org.junit.Test; + +import static org.junit.Assert.*; + +public class XmlKitTest { + + @Test + public void readParameter() { + try { + XMLableReader xml = XMLableReader.createXMLableReader("\n" + + "\n" + + "Tove\n" + + "Jani\n" + + "Reminder\n" + + "Don't forget me this weekend!\n" + + ""); + Parameter parameter = new Parameter("test", 1); + StableFactory.registerXMLDescription("Parameter",parameter); + Parameter p = (Parameter)XmlKit.readParameter(xml); + Assert.assertTrue(p.getName().equals("test")); + } catch (XMLStreamException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file