diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/AbstractDataSet.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/AbstractDataSet.java index 440d0ddb3265bd22ef9c2a795fdee672cf3b697f..366e485728e7e237de0b86e97e0d58ca852b3141 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/AbstractDataSet.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/AbstractDataSet.java @@ -33,7 +33,7 @@ public abstract class AbstractDataSet implements DataSet { throw new Exception("本数据集为只读数据集,不可以修改数据!"); } - protected int getColumn(String fieldName) { + protected Integer getColumn(String fieldName) { return columnIndex.get(fieldName.toUpperCase()); } diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/RowComparator.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/RowComparator.java new file mode 100644 index 0000000000000000000000000000000000000000..75fa0d8fee145f0acab72b92ecda0cb6fac76a41 --- /dev/null +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/RowComparator.java @@ -0,0 +1,9 @@ +package org.tinygroup.tinyscript.dataset; + +public interface RowComparator { + + public boolean isEqual(DataSetRow o1, DataSetRow o2); + + public int countHash(DataSetRow row); + +} diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/AbstractDataSetOperateFunction.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/AbstractDataSetOperateFunction.java index 006bfc0cd4ac6d3e1c8af7d0dc92b3308977805c..6d55a4fe141b3adf600bcd8834b5b66d283765c4 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/AbstractDataSetOperateFunction.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/AbstractDataSetOperateFunction.java @@ -1,13 +1,19 @@ package org.tinygroup.tinyscript.dataset.function; import java.util.ArrayList; -import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.dataset.AbstractDataSet; import org.tinygroup.tinyscript.dataset.DataSet; +import org.tinygroup.tinyscript.dataset.DataSetRow; import org.tinygroup.tinyscript.dataset.Field; -import org.tinygroup.tinyscript.dataset.impl.SimpleDataSet; +import org.tinygroup.tinyscript.dataset.RowComparator; +import org.tinygroup.tinyscript.dataset.impl.DefaultDataSetRow; +import org.tinygroup.tinyscript.dataset.impl.LambdaRowComparator; +import org.tinygroup.tinyscript.dataset.impl.ListRowComparator; import org.tinygroup.tinyscript.dataset.util.DataSetUtil; import org.tinygroup.tinyscript.function.AbstractScriptFunction; import org.tinygroup.tinyscript.interpret.LambdaFunction; @@ -19,6 +25,12 @@ public abstract class AbstractDataSetOperateFunction extends AbstractScriptFunct return DataSet.class.getName(); } + /**批量转换主键(string→int) + * @param dataSet + * @param pks + * @return + * @throws Exception + */ @SuppressWarnings("unchecked") protected List showPkIndex(DataSet dataSet, Object pks) throws Exception { List pksIndex = new ArrayList(); @@ -26,51 +38,50 @@ public abstract class AbstractDataSetOperateFunction extends AbstractScriptFunct for (String pk : (List) pks) { int pkIndex = DataSetUtil.getFieldIndex(dataSet, pk); if (pkIndex != -1) { - pksIndex.add(pkIndex); + pksIndex.add(dataSet.isIndexFromOne() ? pkIndex + 1 : pkIndex); } } } else if (pks instanceof String) { int pkIndex = DataSetUtil.getFieldIndex(dataSet, (String) pks); if (pkIndex != -1) { - pksIndex.add(pkIndex); + pksIndex.add(dataSet.isIndexFromOne() ? pkIndex + 1 : pkIndex); } } return pksIndex; } - protected int checkRowData(Object[] rowData, Object[][] dataArray, List pks) { - for (int i = 0; i < dataArray.length; i++) { - boolean flag = true; - for (int pk : pks) { - if (!rowData[pk].equals(dataArray[i][pk])) { - flag = false; - break; - } - } - if (flag) { - return i; - } + /**创建行集合 + * @param dataSet + * @param pks + * @param context + * @return + * @throws Exception + */ + protected Set createDataSetRows(AbstractDataSet dataSet, Object pks, ScriptContext context) + throws Exception { + Set rows = new HashSet(); + for (int i = 1; i <= dataSet.getRows(); i++) { + rows.add(new DefaultDataSetRow(dataSet, i, createRowComparator(dataSet, pks, context))); } - return -1; + return rows; } - protected int checkRowData(SimpleDataSet dataSet1, SimpleDataSet dataSet2, int row, LambdaFunction pks, - ScriptContext context) throws Exception { - int flag = -1; - for (int j = 1; j <= dataSet2.getRows(); j++) { - HashMap map1 = new HashMap(); - HashMap map2 = new HashMap(); - for (Field field : dataSet1.getFields()) { - int col = DataSetUtil.getFieldIndex(dataSet1, field.getName()); - map1.put(field.getName(), dataSet1.getData(row, dataSet1.getShowIndex(col))); - map2.put(field.getName(), dataSet2.getData(j, dataSet2.getShowIndex(col))); - } - if ((Boolean) (((LambdaFunction) pks).execute(context, map1, map2).getResult())) { - flag = j; - break; - } + /** + * 创建行比较器 + * @param dataSet + * @param pks + * @param context + * @return + * @throws Exception + */ + protected RowComparator createRowComparator(DataSet dataSet, Object pks, ScriptContext context) throws Exception { + if (pks instanceof List || pks instanceof String) { + List pksIndex = showPkIndex(dataSet, pks); + return new ListRowComparator(pksIndex); + } else if (pks instanceof LambdaFunction) { + return new LambdaRowComparator((LambdaFunction) pks, context); } - return flag; + return null; } /** @@ -96,7 +107,7 @@ public abstract class AbstractDataSetOperateFunction extends AbstractScriptFunct return true; } - protected abstract DataSet operate(SimpleDataSet dataArray1, SimpleDataSet dataArray2, Object pks, + protected abstract DataSet operate(AbstractDataSet dataArray1, AbstractDataSet dataArray2, Object pks, ScriptContext context) throws Exception; } diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetIntersectionFunction.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetIntersectionFunction.java index 59dea625fa7611df8c90b4801624a72503c87c08..73c996b072ff0a06777175864b994326f23774bf 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetIntersectionFunction.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetIntersectionFunction.java @@ -1,15 +1,17 @@ package org.tinygroup.tinyscript.dataset.function; -import java.util.ArrayList; -import java.util.List; +import java.util.HashSet; +import java.util.Set; import org.tinygroup.tinyscript.ScriptContext; import org.tinygroup.tinyscript.ScriptException; import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.dataset.AbstractDataSet; import org.tinygroup.tinyscript.dataset.DataSet; -import org.tinygroup.tinyscript.dataset.impl.SimpleDataSet; +import org.tinygroup.tinyscript.dataset.DataSetRow; +import org.tinygroup.tinyscript.dataset.impl.DefaultDataSetRow; import org.tinygroup.tinyscript.dataset.util.DataSetUtil; -import org.tinygroup.tinyscript.interpret.LambdaFunction; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; public class DataSetIntersectionFunction extends AbstractDataSetOperateFunction { @@ -27,31 +29,24 @@ public class DataSetIntersectionFunction extends AbstractDataSetOperateFunction public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { try { if (parameters == null || parameters.length == 0) { - throw new ScriptException("intersect函数的参数为空!"); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); } else if (checkParameters(parameters, 3)) { - if (parameters[0].getClass() != parameters[1].getClass()) { - throw new ScriptException("参数类型类型不一致不支持集合运算"); - } - DataSet dataSet1 = (DataSet) parameters[0]; - DataSet dataSet2 = (DataSet) parameters[1]; + AbstractDataSet dataSet1 = (AbstractDataSet) parameters[0]; + AbstractDataSet dataSet2 = (AbstractDataSet) parameters[1]; if (!checkField(dataSet1, dataSet2)) { - throw new ScriptException("序表参数不一致"); + throw new ScriptException( + ResourceBundleUtil.getResourceMessage("dataset", "dataset.fields.inconsistent")); } - if (dataSet1 instanceof SimpleDataSet) { - return operate((SimpleDataSet) dataSet1, (SimpleDataSet) dataSet2, parameters[2], context); - } else { - throw new ScriptException("不支持的序表类型"); - } + return operate(dataSet1, dataSet2, parameters[2], context); + } else { - throw new ScriptException("intersect函数的参数格式不正确!"); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); } - } catch (ScriptException e) { - throw e; } catch (Exception e) { - throw new ScriptException("inersect函数执行错误!", e); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); } } @@ -65,25 +60,17 @@ public class DataSetIntersectionFunction extends AbstractDataSetOperateFunction * @return * @throws Exception */ - protected DataSet operate(SimpleDataSet dataSet1, SimpleDataSet dataSet2, Object pks, ScriptContext context) + protected DataSet operate(AbstractDataSet dataSet1, AbstractDataSet dataSet2, Object pks, ScriptContext context) throws Exception { - List result = new ArrayList(); - - if (pks instanceof List || pks instanceof String) { - List pksIndex = showPkIndex(dataSet1, pks); - for (int i = 1; i <= dataSet1.getRows(); i++) { - if (checkRowData(dataSet1.getDataArray()[i - 1], dataSet2.getDataArray(), pksIndex) != -1) { - result.add(i - 1); - } - } - } else if (pks instanceof LambdaFunction) { - for (int i = 1; i <= dataSet1.getRows(); i++) { - if (checkRowData(dataSet1, dataSet2, i, (LambdaFunction) pks, context) != -1) { - result.add(i - 1); - } + Set newRows = new HashSet(); + Set set = createDataSetRows(dataSet1, pks, context); + for (int i = 1; i <= dataSet2.getRows(); i++) { + DataSetRow row = new DefaultDataSetRow(dataSet2, i, createRowComparator(dataSet2, pks, context)); + if (set.contains(row)) { + newRows.add(row); } } - return DataSetUtil.createDynamicDataSet(dataSet1, result); + return DataSetUtil.createDynamicDataSet(newRows); } } diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetSubtractFunction.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetSubtractFunction.java index d2308c776bbd459533e1fdefe203edafd38e0f9e..1105160c8736f3ac63135e95191689f287cfd151 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetSubtractFunction.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetSubtractFunction.java @@ -1,15 +1,16 @@ package org.tinygroup.tinyscript.dataset.function; -import java.util.ArrayList; -import java.util.List; +import java.util.Set; import org.tinygroup.tinyscript.ScriptContext; import org.tinygroup.tinyscript.ScriptException; import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.dataset.AbstractDataSet; import org.tinygroup.tinyscript.dataset.DataSet; -import org.tinygroup.tinyscript.dataset.impl.SimpleDataSet; +import org.tinygroup.tinyscript.dataset.DataSetRow; +import org.tinygroup.tinyscript.dataset.impl.DefaultDataSetRow; import org.tinygroup.tinyscript.dataset.util.DataSetUtil; -import org.tinygroup.tinyscript.interpret.LambdaFunction; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; public class DataSetSubtractFunction extends AbstractDataSetOperateFunction { @Override @@ -26,54 +27,37 @@ public class DataSetSubtractFunction extends AbstractDataSetOperateFunction { public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { try { if (parameters == null || parameters.length == 0) { - throw new ScriptException("union函数的参数为空!"); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); } else if (checkParameters(parameters, 3)) { - if (parameters[0].getClass() != parameters[1].getClass()) { - throw new ScriptException("参数类型类型不一致不支持集合运算"); - } - DataSet dataSet1 = (DataSet) parameters[0]; - DataSet dataSet2 = (DataSet) parameters[1]; + AbstractDataSet dataSet1 = (AbstractDataSet) parameters[0]; + AbstractDataSet dataSet2 = (AbstractDataSet) parameters[1]; if (!checkField(dataSet1, dataSet2)) { - throw new ScriptException("序表参数不一致"); + throw new ScriptException( + ResourceBundleUtil.getResourceMessage("dataset", "dataset.fields.inconsistent")); } - if (dataSet1 instanceof SimpleDataSet) { - return operate((SimpleDataSet) dataSet1, (SimpleDataSet) dataSet2, parameters[2], context); - } else { - throw new ScriptException("不支持的序表类型"); - } + return operate(dataSet1, dataSet2, parameters[2], context); + } else { - throw new ScriptException("union函数的参数格式不正确!"); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); } - } catch (ScriptException e) { - throw e; } catch (Exception e) { - throw new ScriptException("union函数执行错误!", e); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); } } - protected DataSet operate(SimpleDataSet dataSet1, SimpleDataSet dataSet2, Object pks, ScriptContext context) + protected DataSet operate(AbstractDataSet dataSet1, AbstractDataSet dataSet2, Object pks, ScriptContext context) throws Exception { - List result = new ArrayList(); - - if (pks instanceof List || pks instanceof String) { - List pksIndex = showPkIndex(dataSet1, pks); - for (int i = 1; i <= dataSet1.getRows(); i++) { - if (checkRowData(dataSet1.getDataArray()[i - 1], dataSet2.getDataArray(), pksIndex) == -1) { - result.add(i - 1); - } - } - } else if (pks instanceof LambdaFunction) { - for (int i = 1; i <= dataSet1.getRows(); i++) { - if (checkRowData(dataSet1, dataSet2, i, (LambdaFunction) pks, context) == -1) { - result.add(i - 1); - } + Set set = createDataSetRows(dataSet1, pks, context); + for (int i = 1; i <= dataSet2.getRows(); i++) { + DataSetRow row = new DefaultDataSetRow(dataSet2, i, createRowComparator(dataSet2, pks, context)); + if (set.contains(row)) { + set.remove(row); } } - - return DataSetUtil.createDynamicDataSet(dataSet1, result); + return DataSetUtil.createDynamicDataSet(set); } } diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetUnionFunction.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetUnionFunction.java index 08d45a61f690f0867c48abe7e5230a05e1a0bf33..27ad841f2afc680f4516fd8478a4e86736018766 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetUnionFunction.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetUnionFunction.java @@ -1,14 +1,16 @@ package org.tinygroup.tinyscript.dataset.function; -import java.util.LinkedList; -import java.util.List; +import java.util.Set; import org.tinygroup.tinyscript.ScriptContext; import org.tinygroup.tinyscript.ScriptException; import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.dataset.AbstractDataSet; import org.tinygroup.tinyscript.dataset.DataSet; -import org.tinygroup.tinyscript.dataset.impl.SimpleDataSet; -import org.tinygroup.tinyscript.interpret.LambdaFunction; +import org.tinygroup.tinyscript.dataset.DataSetRow; +import org.tinygroup.tinyscript.dataset.impl.DefaultDataSetRow; +import org.tinygroup.tinyscript.dataset.util.DataSetUtil; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; public class DataSetUnionFunction extends AbstractDataSetOperateFunction { @@ -26,65 +28,35 @@ public class DataSetUnionFunction extends AbstractDataSetOperateFunction { public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { try { if (parameters == null || parameters.length == 0) { - throw new ScriptException("unite函数的参数为空!"); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); } else if (checkParameters(parameters, 3)) { - if (parameters[0].getClass() != parameters[1].getClass()) { - throw new ScriptException("参数类型类型不一致不支持集合运算"); - } - - DataSet dataSet1 = (DataSet) parameters[0]; - DataSet dataSet2 = (DataSet) parameters[1]; + AbstractDataSet dataSet1 = (AbstractDataSet) parameters[0]; + AbstractDataSet dataSet2 = (AbstractDataSet) parameters[1]; if (!checkField(dataSet1, dataSet2)) { - throw new ScriptException("序表参数不一致"); + throw new ScriptException( + ResourceBundleUtil.getResourceMessage("dataset", "dataset.fields.inconsistent")); } - if (dataSet1 instanceof SimpleDataSet) { - return operate((SimpleDataSet) dataSet1, (SimpleDataSet) dataSet2, parameters[2], context); - } else { - throw new ScriptException("不支持的序表类型"); - } + return operate(dataSet1, dataSet2, parameters[2], context); } else { - throw new ScriptException("unite函数的参数格式不正确!"); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); } - } catch (ScriptException e) { - throw e; } catch (Exception e) { - throw new ScriptException("unite函数执行错误!", e); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); } } @Override - protected DataSet operate(SimpleDataSet dataSet1, SimpleDataSet dataSet2, Object pks, ScriptContext context) + protected DataSet operate(AbstractDataSet dataSet1, AbstractDataSet dataSet2, Object pks, ScriptContext context) throws Exception { - List resultArray = new LinkedList(); - for (int i = 0; i < dataSet2.getRows(); i++) { - resultArray.add(dataSet2.getDataArray()[i]); + Set set1 = createDataSetRows(dataSet1, pks, context); + for (int i = 1; i <= dataSet2.getRows(); i++) { + DataSetRow row = new DefaultDataSetRow(dataSet2, i, createRowComparator(dataSet2, pks, context)); + set1.add(row); } - - if (pks instanceof List || pks instanceof String) { - List pksIndex = showPkIndex(dataSet1, pks); - for (int i = 1; i <= dataSet1.getRows(); i++) { - if (checkRowData(dataSet1.getDataArray()[i - 1], dataSet2.getDataArray(), pksIndex) == -1) { - resultArray.add(dataSet1.getDataArray()[i - 1]); - } - } - } else if (pks instanceof LambdaFunction) { - for (int i = 1; i <= dataSet1.getRows(); i++) { - if (checkRowData(dataSet1, dataSet2, i, (LambdaFunction) pks, context) == -1) { - resultArray.add(dataSet1.getDataArray()[i - 1]); - } - - } - } - - Object[][] newArray = new Object[resultArray.size()][]; - for (int i = 0; i < newArray.length; i++) { - newArray[i] = resultArray.get(i); - } - - return new SimpleDataSet(dataSet1.getFields(), newArray, dataSet1.isIndexFromOne()); + return DataSetUtil.createDynamicDataSet(set1); } } diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetXorFunction.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetXorFunction.java index eb56831571274b378c678b48cf65f54cf11fb54e..7e380f3156b3167ff554ac663b6005d9582078e9 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetXorFunction.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetXorFunction.java @@ -1,14 +1,17 @@ package org.tinygroup.tinyscript.dataset.function; -import java.util.ArrayList; -import java.util.List; +import java.util.HashSet; +import java.util.Set; import org.tinygroup.tinyscript.ScriptContext; import org.tinygroup.tinyscript.ScriptException; import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.dataset.AbstractDataSet; import org.tinygroup.tinyscript.dataset.DataSet; -import org.tinygroup.tinyscript.dataset.impl.SimpleDataSet; -import org.tinygroup.tinyscript.interpret.LambdaFunction; +import org.tinygroup.tinyscript.dataset.DataSetRow; +import org.tinygroup.tinyscript.dataset.impl.DefaultDataSetRow; +import org.tinygroup.tinyscript.dataset.util.DataSetUtil; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; public class DataSetXorFunction extends AbstractDataSetOperateFunction { @@ -21,78 +24,42 @@ public class DataSetXorFunction extends AbstractDataSetOperateFunction { public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { try { if (parameters == null || parameters.length == 0) { - throw new ScriptException("xor函数的参数为空!"); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); } else if (checkParameters(parameters, 3)) { - if (parameters[0].getClass() != parameters[1].getClass()) { - throw new ScriptException("参数类型类型不一致不支持集合运算"); - } - - DataSet dataSet1 = (DataSet) parameters[0]; - DataSet dataSet2 = (DataSet) parameters[1]; + AbstractDataSet dataSet1 = (AbstractDataSet) parameters[0]; + AbstractDataSet dataSet2 = (AbstractDataSet) parameters[1]; if (!checkField(dataSet1, dataSet2)) { - throw new ScriptException("序表参数不一致"); + throw new ScriptException( + ResourceBundleUtil.getResourceMessage("dataset", "dataset.fields.inconsistent")); } - if (dataSet1 instanceof SimpleDataSet) { - return operate((SimpleDataSet) dataSet1, (SimpleDataSet) dataSet2, parameters[2], context); - } else { - throw new ScriptException("不支持的序表类型"); - } + return operate(dataSet1, dataSet2, parameters[2], context); + } else { - throw new ScriptException("xor函数的参数格式不正确!"); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); } - } catch (ScriptException e) { - throw e; } catch (Exception e) { - throw new ScriptException("xor函数执行错误!", e); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); } } @Override - protected DataSet operate(SimpleDataSet dataSet1, SimpleDataSet dataSet2, Object pks, ScriptContext context) + protected DataSet operate(AbstractDataSet dataSet1, AbstractDataSet dataSet2, Object pks, ScriptContext context) throws Exception { - List result = new ArrayList(); - List equalResult = new ArrayList(); - - if (pks instanceof List || pks instanceof String) { - List pksIndex = showPkIndex(dataSet1, pks); - for (int i = 1; i <= dataSet1.getRows(); i++) { - int flag = checkRowData(dataSet1.getDataArray()[i - 1], dataSet2.getDataArray(), pksIndex); - if (flag == -1) { - result.add(i - 1); - } else { - equalResult.add(flag + 1); - } - } - } else if (pks instanceof LambdaFunction) { - for (int i = 1; i <= dataSet1.getRows(); i++) { - int flag = checkRowData(dataSet1, dataSet2, i, (LambdaFunction) pks, context); - if (flag == -1) { - result.add(i - 1); - }else { - equalResult.add(flag); - } + Set newRows = new HashSet(); + Set set = createDataSetRows(dataSet1, pks, context); + for (int i = 1; i <= dataSet2.getRows(); i++) { + DataSetRow row = new DefaultDataSetRow(dataSet2, i, createRowComparator(dataSet2, pks, context)); + if (!set.contains(row)) { + newRows.add(row); + } else { + set.remove(row); } } - - Object[][] newArray = new Object[dataSet2.getRows() + result.size()][]; - System.arraycopy(dataSet2.getDataArray(), 0, newArray, 0, dataSet2.getRows()); - - for (int i = dataSet2.getRows(); i < newArray.length; i++) { - newArray[i] = dataSet1.getDataArray()[result.get(i - dataSet1.getRows())]; - } - - SimpleDataSet uniteDataSet = new SimpleDataSet(dataSet1.getFields(), newArray, dataSet1.isIndexFromOne()); - - int count = 0; - for (int i : equalResult) { - uniteDataSet.deleteRow(i - count); - count++; - } - - return uniteDataSet; + newRows.addAll(set); + return DataSetUtil.createDynamicDataSet(newRows); } } diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/impl/DefaultDataSetRow.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/impl/DefaultDataSetRow.java index bfd84b2c1758c554274d0f7b4cc46c765ebddbdc..19c8e1f2ab95e99bf44eef2d60b7776d6878a0d2 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/impl/DefaultDataSetRow.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/impl/DefaultDataSetRow.java @@ -5,22 +5,47 @@ import java.util.List; import org.tinygroup.tinyscript.dataset.DataSet; import org.tinygroup.tinyscript.dataset.DataSetRow; import org.tinygroup.tinyscript.dataset.Field; +import org.tinygroup.tinyscript.dataset.RowComparator; /** * 默认的数据集行对象实现 + * * @author yancheng11334 * */ -public class DefaultDataSetRow implements DataSetRow{ +public class DefaultDataSetRow implements DataSetRow { - private DataSet dataSet; - private int row; //显示值 - - public DefaultDataSetRow(DataSet dataSet,int row) throws Exception{ + private DataSet dataSet; + private int row; // 显示值 + private RowComparator comparator; + + @Override + public boolean equals(Object o) { + if (comparator == null) { + return super.equals(o); + } + return comparator.isEqual(this, (DataSetRow) o); + } + + @Override + public int hashCode() { + if (comparator == null) { + return super.hashCode(); + } + return comparator.countHash(this); + } + + public DefaultDataSetRow(DataSet dataSet, int row) throws Exception { this.dataSet = dataSet; this.row = row; } - + + public DefaultDataSetRow(DataSet dataSet, int row, RowComparator comparator) throws Exception { + this.dataSet = dataSet; + this.row = row; + this.comparator = comparator; + } + public List getFields() { return dataSet.getFields(); } diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/impl/LambdaRowComparator.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/impl/LambdaRowComparator.java new file mode 100644 index 0000000000000000000000000000000000000000..5114ba619ec1c034865b4a9477edfcf36edc76aa --- /dev/null +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/impl/LambdaRowComparator.java @@ -0,0 +1,54 @@ +package org.tinygroup.tinyscript.dataset.impl; + +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.dataset.DataSetRow; +import org.tinygroup.tinyscript.dataset.Field; +import org.tinygroup.tinyscript.dataset.RowComparator; +import org.tinygroup.tinyscript.impl.DefaultScriptContext; +import org.tinygroup.tinyscript.interpret.LambdaFunction; + +public class LambdaRowComparator implements RowComparator { + + private LambdaFunction compareFunction; + private ScriptContext context; + + public LambdaRowComparator(LambdaFunction compareFunction, ScriptContext context) { + this.compareFunction = compareFunction; + this.context = context; + } + + @Override + public boolean isEqual(DataSetRow o1, DataSetRow o2) { + try { + String result1 = compareFunction.execute(createContext(o1)).getResult().toString(); + String result2 = compareFunction.execute(createContext(o2)).getResult().toString(); + return result1.equals(result2); + } catch (Exception e) { + return false; + } + } + + @Override + public int countHash(DataSetRow row) { + try { + String result = compareFunction.execute(createContext(row)).getResult().toString(); + return result.hashCode(); + } catch (Exception e) { + return 0; + } + + } + + private ScriptContext createContext(DataSetRow row) { + ScriptContext sub = new DefaultScriptContext(); + sub.setParent(context); + for (Field field : row.getFields()) { + try { + sub.put(field.getName(), row.getData(field.getName())); + } catch (Exception e) { + } + } + return sub; + } + +} diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/impl/ListRowComparator.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/impl/ListRowComparator.java new file mode 100644 index 0000000000000000000000000000000000000000..5e84a5480f1311aaae7fd392c6f7e394fbb3e56b --- /dev/null +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/impl/ListRowComparator.java @@ -0,0 +1,43 @@ +package org.tinygroup.tinyscript.dataset.impl; + +import java.util.List; + +import org.tinygroup.tinyscript.dataset.DataSetRow; +import org.tinygroup.tinyscript.dataset.RowComparator; + +public class ListRowComparator implements RowComparator { + + private List pks; + + public ListRowComparator(List pks) { + this.pks = pks; + } + + @Override + public boolean isEqual(DataSetRow o1, DataSetRow o2) { + for (Integer i : pks) { + try { + if (!(o1.getData(i).equals(o2.getData(i)))) { + return false; + } + } catch (Exception e) { + return false; + } + } + return true; + } + + @Override + public int countHash(DataSetRow row){ + int hash = 0; + for (Integer i : pks) { + try { + hash += row.getData(i).toString().hashCode(); + } catch (Exception e) { + //发生异常跳过当前hash值 + } + } + return hash; + } + +} diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/util/DataSetUtil.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/util/DataSetUtil.java index 0172be2b09a6eda6949f49578e01ac22d9edcbe8..338970cc811a61b06710b88acb364a2ed4706491 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/util/DataSetUtil.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/util/DataSetUtil.java @@ -46,6 +46,26 @@ public final class DataSetUtil { return new SimpleDataSet(fields, dataArray); } + /** + * 构建动态数据集 + * + * @param set + * @return + * @throws Exception + */ + public static DynamicDataSet createDynamicDataSet(Set set) throws Exception { + List fields = set.iterator().next().getFields(); + Object[][] data = new Object[set.size()][fields.size()]; + int rowId = 0; + for (DataSetRow row : set) { + for (int i = 0; i < fields.size(); i++) { + data[rowId][i] = row.getData(i + 1); + } + rowId++; + } + return new SimpleDataSet(fields, data, set.iterator().next().isIndexFromOne()); + } + /** * 构建动态数据集 * @@ -238,9 +258,10 @@ public final class DataSetUtil { } return -1; } - + /** * 返回索引字段对应的列 + * * @param fields * @param colName * @return @@ -405,4 +426,10 @@ public final class DataSetUtil { return columns; } + public static Set createDataSetRows(DataSet dataSet) { + Set result = new HashSet(); + + return result; + } + } diff --git a/org.tinygroup.tinyscript.dataset/src/main/resources/dataset.properties b/org.tinygroup.tinyscript.dataset/src/main/resources/dataset.properties new file mode 100644 index 0000000000000000000000000000000000000000..b120ff285141425eded5f9f8783105c1931aea58 --- /dev/null +++ b/org.tinygroup.tinyscript.dataset/src/main/resources/dataset.properties @@ -0,0 +1 @@ +dataset.fields.inconsistent=Order table parameters are inconsistent! \ No newline at end of file diff --git a/org.tinygroup.tinyscript.dataset/src/main/resources/dataset_zh_CN.properties b/org.tinygroup.tinyscript.dataset/src/main/resources/dataset_zh_CN.properties new file mode 100644 index 0000000000000000000000000000000000000000..23ec379ef994f7a2b95e3b53a3fdee4c09697374 --- /dev/null +++ b/org.tinygroup.tinyscript.dataset/src/main/resources/dataset_zh_CN.properties @@ -0,0 +1 @@ +dataset.fields.inconsistent=\u5e8f\u8868\u53c2\u6570\u4e0d\u4e00\u81f4! \ No newline at end of file diff --git a/org.tinygroup.tinyscript.excel/src/main/java/org/tinygroup/tinyscript/csv/function/ReadCsvFunction.java b/org.tinygroup.tinyscript.excel/src/main/java/org/tinygroup/tinyscript/csv/function/ReadCsvFunction.java index 8534472dec9faaf497c29e4179815758e4556f21..c71d0c917949321f06d021134f2989cbb9b7671d 100644 --- a/org.tinygroup.tinyscript.excel/src/main/java/org/tinygroup/tinyscript/csv/function/ReadCsvFunction.java +++ b/org.tinygroup.tinyscript.excel/src/main/java/org/tinygroup/tinyscript/csv/function/ReadCsvFunction.java @@ -11,10 +11,12 @@ import org.tinygroup.tinyscript.csv.CSVParser; import org.tinygroup.tinyscript.dataset.DataSet; import org.tinygroup.tinyscript.function.AbstractScriptFunction; import org.tinygroup.tinyscript.interpret.FileObjectUtil; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; import org.tinygroup.vfs.FileObject; /** * 读取csv格式文件 + * * @author yancheng11334 * */ @@ -24,49 +26,44 @@ public class ReadCsvFunction extends AbstractScriptFunction { return "readCsv"; } - public Object execute(ScriptSegment segment, ScriptContext context, - Object... parameters) throws ScriptException { - try{ + public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { + try { if (parameters == null || parameters.length == 0) { - throw new ScriptException(String.format("%s函数的参数为空!",getNames())); - }else if(parameters.length == 1 && parameters[0]!=null){ - return readCsv((String)parameters[0],"utf-8",context); - }else if(parameters.length == 2 && parameters[0]!=null && parameters[1]!=null){ - return readCsv((String)parameters[0],(String)parameters[1],context); - }else{ - throw new ScriptException(String.format("%s函数的参数格式不正确!",getNames())); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); + } else if (checkParameters(parameters, 1)) { + return readCsv((String) parameters[0], "utf-8", context); + } else if (checkParameters(parameters, 2)) { + return readCsv((String) parameters[0], (String) parameters[1], context); + } else { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); } - }catch (ScriptException e) { - throw e; } catch (Exception e) { - throw new ScriptException(String.format("%s函数的参数格式不正确!",getNames()),e); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); } } - - private DataSet readCsv(String file,String encode,ScriptContext context) throws Exception{ - DataSet dataSet = extractDataSet(file,encode); + + private DataSet readCsv(String file, String encode, ScriptContext context) throws Exception { + DataSet dataSet = extractDataSet(file, encode); dataSet.setIndexFromOne(getScriptEngine().isIndexFromOne()); return dataSet; } - - public DataSet extractDataSet(String file,String encode) - throws Exception { + + public DataSet extractDataSet(String file, String encode) throws Exception { FileObject fileObject = null; BufferedReader reader = null; - try{ + try { fileObject = FileObjectUtil.findFileObject(file, false); - reader = new BufferedReader(new InputStreamReader(fileObject.getInputStream(),encode)); - CSVParser parser = new CSVParser(reader,CSVFormat.DEFAULT); + reader = new BufferedReader(new InputStreamReader(fileObject.getInputStream(), encode)); + CSVParser parser = new CSVParser(reader, CSVFormat.DEFAULT); return parser.extractDataSet(); - }catch (Exception e) { - throw new Exception( - String.format("抽取csv文件%s,发生异常:", file ), e); + } catch (Exception e) { + throw new ScriptException(ResourceBundleUtil.getResourceMessage("excel", "file.find.error", file), e); } finally { - if(reader!=null){ - reader.close(); + if (reader != null) { + reader.close(); } - if(fileObject!=null){ - fileObject.clean(); + if (fileObject != null) { + fileObject.clean(); } } } diff --git a/org.tinygroup.tinyscript.excel/src/main/java/org/tinygroup/tinyscript/csv/function/WriteCsvFunction.java b/org.tinygroup.tinyscript.excel/src/main/java/org/tinygroup/tinyscript/csv/function/WriteCsvFunction.java new file mode 100644 index 0000000000000000000000000000000000000000..edc7ac7e8737a4344c29e435fecc0a346f9ee690 --- /dev/null +++ b/org.tinygroup.tinyscript.excel/src/main/java/org/tinygroup/tinyscript/csv/function/WriteCsvFunction.java @@ -0,0 +1,116 @@ +package org.tinygroup.tinyscript.csv.function; + +import java.io.OutputStreamWriter; +import java.util.ArrayList; +import java.util.List; + +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.csv.CSVFormat; +import org.tinygroup.tinyscript.csv.CSVPrinter; +import org.tinygroup.tinyscript.dataset.DataSet; +import org.tinygroup.tinyscript.dataset.Field; +import org.tinygroup.tinyscript.function.AbstractScriptFunction; +import org.tinygroup.tinyscript.interpret.FileObjectUtil; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; +import org.tinygroup.vfs.FileObject; + +public class WriteCsvFunction extends AbstractScriptFunction { + + private static final String DEFAULT_ENCODE = "utf-8"; + private static final String DEFAULT_TYPE = "DEFAULT"; + + @Override + public String getNames() { + return "writeCsv"; + } + + @Override + public String getBindingTypes() { + return DataSet.class.getName(); + } + + @Override + public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { + try { + if (parameters == null || parameters.length < 2) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); + } + + DataSet dataSet = (DataSet) parameters[0]; + String filePath = (String) parameters[1]; + + switch (parameters.length) { + case 2: + writeCsv(dataSet, filePath, DEFAULT_ENCODE, 1, dataSet.getRows(), DEFAULT_TYPE); + break; + case 3: + if (parameters[2] instanceof String) { + writeCsv(dataSet, filePath, (String) parameters[2], 1, dataSet.getRows(), DEFAULT_TYPE); + } else { + writeCsv(dataSet, filePath, DEFAULT_ENCODE, (Integer) parameters[2], dataSet.getRows(), + DEFAULT_TYPE); + } + break; + case 4: + if (parameters[2] instanceof String) { + writeCsv(dataSet, filePath, (String) parameters[2], (Integer) parameters[3], dataSet.getRows(), + DEFAULT_TYPE); + } else { + writeCsv(dataSet, filePath, DEFAULT_ENCODE, (Integer) parameters[2], (Integer) parameters[3], + DEFAULT_TYPE); + } + break; + case 5: + if (parameters[2] instanceof String) { + writeCsv(dataSet, filePath, (String) parameters[2], (Integer) parameters[3], + (Integer) parameters[4], DEFAULT_TYPE); + } else { + writeCsv(dataSet, filePath, DEFAULT_ENCODE, (Integer) parameters[2], (Integer) parameters[3], + (String) parameters[4]); + } + break; + case 6: + writeCsv(dataSet, filePath, (String) parameters[2], (Integer) parameters[3], (Integer) parameters[4], + (String) parameters[5]); + break; + default: + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); + } + + return null; + } catch (Exception e) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); + } + } + + private void writeCsv(DataSet dataSet, String filePath, String encode, int start, int end, String type) + throws Exception { + FileObject csvFile = FileObjectUtil.getOrCreateFile(filePath, false); + CSVPrinter printer = null; + try { + printer = new CSVPrinter(new OutputStreamWriter(csvFile.getOutputStream(), encode), + (CSVFormat) (CSVFormat.class.getDeclaredField(type).get(CSVFormat.class))); + } catch (NoSuchFieldException e) { + throw new ScriptException(ResourceBundleUtil.getResourceMessage("excel", "csv.type.error", type)); + } + + List records = new ArrayList(); + + for (Field field : dataSet.getFields()) { + records.add(field.getName()); + } + printer.printRecord(records); + + for (int i = start; i <= end; i++) { + records = new ArrayList(); + for (int j = 1; j <= dataSet.getColumns(); j++) { + records.add(dataSet.getData(i, j)); + } + printer.printRecord(records); + } + printer.close(); + } + +} diff --git a/org.tinygroup.tinyscript.excel/src/main/java/org/tinygroup/tinyscript/excel/function/ReadExcelFunction.java b/org.tinygroup.tinyscript.excel/src/main/java/org/tinygroup/tinyscript/excel/function/ReadExcelFunction.java index 7f838b4e39fe12dec4660e48456671630b017f87..0539f55af98b0c29395f2304cecba0e22e191f21 100644 --- a/org.tinygroup.tinyscript.excel/src/main/java/org/tinygroup/tinyscript/excel/function/ReadExcelFunction.java +++ b/org.tinygroup.tinyscript.excel/src/main/java/org/tinygroup/tinyscript/excel/function/ReadExcelFunction.java @@ -1,6 +1,8 @@ package org.tinygroup.tinyscript.excel.function; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; @@ -12,10 +14,12 @@ import org.tinygroup.tinyscript.excel.SheetDataSet; import org.tinygroup.tinyscript.excel.util.ExcelUtil; import org.tinygroup.tinyscript.function.AbstractScriptFunction; import org.tinygroup.tinyscript.interpret.FileObjectUtil; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; import org.tinygroup.vfs.FileObject; /** * 读取excel的函数 + * * @author yancheng11334 * */ @@ -25,59 +29,60 @@ public class ReadExcelFunction extends AbstractScriptFunction { return "readExcel"; } - - public Object execute(ScriptSegment segment, ScriptContext context, - Object... parameters) throws ScriptException { - try{ + public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { + try { if (parameters == null || parameters.length == 0) { - throw new ScriptException(String.format("%s函数的参数为空!",getNames())); - }else if(parameters.length == 1 && parameters[0]!=null){ - return readExcel((String)parameters[0],null,context); - }else if(parameters.length == 2 && parameters[0]!=null && parameters[1]!=null){ - return readExcel((String)parameters[0],(String)parameters[1],context); - }else{ - throw new ScriptException(String.format("%s函数的参数格式不正确!",getNames())); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); + } else if (checkParameters(parameters, 1)) { + return readExcel((String) parameters[0], null); + } else if (checkParameters(parameters, 2)) { + return readExcel((String) parameters[0], (String) parameters[1]); + } else { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); } - }catch (ScriptException e) { - throw e; } catch (Exception e) { - throw new ScriptException(String.format("%s函数的参数格式不正确!",getNames()),e); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); } } - - private DataSet readExcel(String file,String name,ScriptContext context) throws Exception{ - DataSet dataSet = extractDataSet(file,name); - dataSet.setIndexFromOne(getScriptEngine().isIndexFromOne()); + + private Object readExcel(String file, String name) throws Exception { + Object dataSet = extractDataSet(file, name); return dataSet; } - - public DataSet extractDataSet(String file,String name) - throws Exception { + + public Object extractDataSet(String file, String name) throws Exception { Workbook wb = null; FileObject fileObject = null; try { fileObject = FileObjectUtil.findFileObject(file, false); - wb = ExcelUtil.readWorkbook(fileObject); - - if(name!=null){ - for (int i = 0; i < wb.getNumberOfSheets(); i++) { - Sheet sheet = wb.getSheetAt(i); - if(name.equals(sheet.getSheetName())){ - DataSet dataSet = createDataSet(sheet); - return dataSet; - } - } - return null; - }else{ - Sheet sheet = wb.getSheetAt(0); - DataSet dataSet = createDataSet(sheet); - return dataSet; - } - + wb = ExcelUtil.readWorkbook(fileObject); + + if (name != null) { + for (int i = 0; i < wb.getNumberOfSheets(); i++) { + Sheet sheet = wb.getSheetAt(i); + if (name.equals(sheet.getSheetName())) { + DataSet dataSet = createDataSet(sheet); + dataSet.setIndexFromOne(getScriptEngine().isIndexFromOne()); + return dataSet; + } + } + return null; + } else { + List dataSets = new ArrayList(); + for (int i = 0; i < wb.getNumberOfSheets(); i++) { + Sheet sheet = wb.getSheetAt(i); + if (sheet.getPhysicalNumberOfRows() != 0) { + DataSet dataSet = createDataSet(sheet); + dataSet.setIndexFromOne(getScriptEngine().isIndexFromOne()); + dataSets.add(dataSet); + } + } + + return dataSets; + } } catch (Exception e) { - throw new Exception( - String.format("抽取excel文件%s,发生异常:", file ), e); + throw new ScriptException(ResourceBundleUtil.getResourceMessage("excel", "file.find.error", file), e); } finally { if (fileObject != null) { fileObject.clean(); @@ -100,10 +105,9 @@ public class ReadExcelFunction extends AbstractScriptFunction { * @throws Exception */ private DataSet createDataSet(Sheet sheet) throws Exception { - SheetDataSet dataSet = new SheetDataSet(sheet,null); + SheetDataSet dataSet = new SheetDataSet(sheet, null); dataSet.setName(sheet.getSheetName()); return dataSet; } - } diff --git a/org.tinygroup.tinyscript.excel/src/main/java/org/tinygroup/tinyscript/excel/function/WriteExcelFunction.java b/org.tinygroup.tinyscript.excel/src/main/java/org/tinygroup/tinyscript/excel/function/WriteExcelFunction.java new file mode 100644 index 0000000000000000000000000000000000000000..b359385826c9fdabf165bd9fe5824454f503164e --- /dev/null +++ b/org.tinygroup.tinyscript.excel/src/main/java/org/tinygroup/tinyscript/excel/function/WriteExcelFunction.java @@ -0,0 +1,140 @@ +package org.tinygroup.tinyscript.excel.function; + +import java.util.List; + +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.dataset.DataSet; +import org.tinygroup.tinyscript.function.AbstractScriptFunction; +import org.tinygroup.tinyscript.interpret.FileObjectUtil; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; +import org.tinygroup.vfs.FileObject; + +public class WriteExcelFunction extends AbstractScriptFunction { + + @Override + public String getNames() { + return "writeExcel"; + } + + @Override + public String getBindingTypes() { + return DataSet.class.getName() + "," + List.class.getName(); + } + + @SuppressWarnings("unchecked") + @Override + public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { + try { + if (parameters == null || parameters.length == 0) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); + } + + switch (parameters.length) { + case 2: + writeExcel((String) parameters[1], parameters[0], null, 1, -1); + break; + case 3: + if (parameters[2] instanceof List) { + writeExcel((String) parameters[1], parameters[0], (List) parameters[2], 1, -1); + } else { + writeExcel((String) parameters[1], parameters[0], null, (Integer) parameters[2], -1); + } + break; + case 4: + if (parameters[2] instanceof List) { + writeExcel((String) parameters[1], parameters[0], (List) parameters[2], + (Integer) parameters[3], -1); + } else { + writeExcel((String) parameters[1], parameters[0], null, (Integer) parameters[2], + (Integer) parameters[3]); + } + break; + case 5: + writeExcel((String) parameters[1], parameters[0], (List) parameters[2], (Integer) parameters[3], + (Integer) parameters[4]); + break; + default: + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); + } + + return null; + } catch (Exception e) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); + } + } + + @SuppressWarnings("unchecked") + private void writeExcel(String fileUrl, Object dataSet, List sheetNames, int start, int end) + throws Exception { + Workbook wb = null; + FileObject excelFile = FileObjectUtil.getOrCreateFile(fileUrl, false); + + if (fileUrl.endsWith("xls")) { + wb = new HSSFWorkbook(); + } else if (fileUrl.endsWith("xlsx")) { + wb = new XSSFWorkbook(); + } + + if (dataSet instanceof DataSet) { + writeSheet(wb, (DataSet) dataSet, + (sheetNames == null || sheetNames.size() == 0) ? "sheet1" : sheetNames.get(0), start, + checkEnd((DataSet) dataSet, end)); + } else { + List dataSets = ((List) dataSet); + for (int i = 0; i < dataSets.size(); i++) { + + String sheetName = null; + if (sheetNames != null && sheetNames.size() > i) { + sheetName = sheetNames.get(i); + } else { + sheetName = "sheet" + (i + 1); + } + + writeSheet(wb, dataSets.get(i), sheetName, start, checkEnd(dataSets.get(i), end)); + } + } + + wb.write(excelFile.getOutputStream()); + + } + + private void writeSheet(Workbook wb, DataSet dataSet, String sheetName, int start, int end) throws Exception { + Sheet sheet = (Sheet) wb.createSheet(sheetName); + CellStyle style = wb.createCellStyle(); + + style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);// 垂直 + style.setAlignment(CellStyle.ALIGN_CENTER);// 水平 + style.setWrapText(true);// 指定当单元格内容显示不下时自动换行 + + Row row = sheet.createRow(0); + Cell cell = null; + for (int i = 0; i < dataSet.getFields().size(); i++) { + cell = row.createCell(i); + cell.setCellValue(dataSet.getFields().get(i).getName()); + cell.setCellStyle(style); + } + + for (int i = 1 + start; i <= 1 + end; i++) { + row = sheet.createRow(i - start); + for (int j = 1; j <= dataSet.getFields().size(); j++) { + cell = row.createCell(j - 1); + cell.setCellValue(dataSet.getData(i, j).toString()); + cell.setCellStyle(style); + } + } + } + + private int checkEnd(DataSet dataSet, int end) throws Exception { + // 因为sheetdataset的data包括标题,所以计算rows时需要减一 + return end == -1 ? dataSet.getRows() - 1 : end <= dataSet.getRows() - 1 ? end : dataSet.getRows() - 1; + } +} diff --git a/org.tinygroup.tinyscript.excel/src/main/resources/excel.beans.xml b/org.tinygroup.tinyscript.excel/src/main/resources/excel.beans.xml index fa2ff72b8b6bbf43936c9cc1f680731925958120..c0190e66fedbf20793b3414b83159654f594688f 100644 --- a/org.tinygroup.tinyscript.excel/src/main/resources/excel.beans.xml +++ b/org.tinygroup.tinyscript.excel/src/main/resources/excel.beans.xml @@ -10,5 +10,13 @@ + + + + + + diff --git a/org.tinygroup.tinyscript.excel/src/main/resources/excel.properties b/org.tinygroup.tinyscript.excel/src/main/resources/excel.properties new file mode 100644 index 0000000000000000000000000000000000000000..895d69046df719f646c0f199086869e19ae1ba34 --- /dev/null +++ b/org.tinygroup.tinyscript.excel/src/main/resources/excel.properties @@ -0,0 +1,2 @@ +csv.type.error=CSV mode error, unsupported CSV mode +file.find.error=An exception occurred while extracting [%s] \ No newline at end of file diff --git a/org.tinygroup.tinyscript.excel/src/main/resources/excel_zh_CN.properties b/org.tinygroup.tinyscript.excel/src/main/resources/excel_zh_CN.properties new file mode 100644 index 0000000000000000000000000000000000000000..75fd7545bc13a3ea54e6f9b0137e5e67a35ff251 --- /dev/null +++ b/org.tinygroup.tinyscript.excel/src/main/resources/excel_zh_CN.properties @@ -0,0 +1,2 @@ +csv.type.error=\u0063\u0073\u0076\u6a21\u5f0f\u9519\u8bef\u002c\u4e0d\u652f\u6301\u7684\u0063\u0073\u0076\u6a21\u5f0f:[%s] +file.find.error=\u62bd\u53d6[%s]\u6587\u4ef6\uff0c\u53d1\u751f\u5f02\u5e38 \ No newline at end of file diff --git a/org.tinygroup.tinyscript/src/main/java/org/tinygroup/tinyscript/impl/DefaultTinyScriptEngine.java b/org.tinygroup.tinyscript/src/main/java/org/tinygroup/tinyscript/impl/DefaultTinyScriptEngine.java index 6e0be3aba3a4650182a79ed66e3ee5b04f1fcb07..55392a7761c1f14df89b26ce086268a0323cc3d4 100644 --- a/org.tinygroup.tinyscript/src/main/java/org/tinygroup/tinyscript/impl/DefaultTinyScriptEngine.java +++ b/org.tinygroup.tinyscript/src/main/java/org/tinygroup/tinyscript/impl/DefaultTinyScriptEngine.java @@ -32,6 +32,8 @@ import org.tinygroup.tinyscript.collection.function.set.SetUnionFunction; import org.tinygroup.tinyscript.collection.function.set.SetXorFunction; import org.tinygroup.tinyscript.collection.objectitem.ListToListProcessor; import org.tinygroup.tinyscript.collection.objectitem.MapItemProcessor; +import org.tinygroup.tinyscript.csv.function.ReadCsvFunction; +import org.tinygroup.tinyscript.csv.function.WriteCsvFunction; import org.tinygroup.tinyscript.database.function.ExecuteSqlFunction; import org.tinygroup.tinyscript.database.function.QuerySqlFunction; import org.tinygroup.tinyscript.database.function.WriteDBFunction; @@ -50,6 +52,7 @@ import org.tinygroup.tinyscript.dataset.function.DataSetForEachFunction; import org.tinygroup.tinyscript.dataset.function.DataSetGroupDynamicFunction; import org.tinygroup.tinyscript.dataset.function.DataSetGroupFunction; import org.tinygroup.tinyscript.dataset.function.DataSetGroupStagedFunction; +import org.tinygroup.tinyscript.dataset.function.DataSetIntersectionFunction; import org.tinygroup.tinyscript.dataset.function.DataSetJoinFunction; import org.tinygroup.tinyscript.dataset.function.DataSetLimitFunction; import org.tinygroup.tinyscript.dataset.function.DataSetMatchFunction; @@ -59,7 +62,10 @@ import org.tinygroup.tinyscript.dataset.function.DataSetReplaceFunction; import org.tinygroup.tinyscript.dataset.function.DataSetSelectFunction; import org.tinygroup.tinyscript.dataset.function.DataSetSortFunction; import org.tinygroup.tinyscript.dataset.function.DataSetSubFunction; +import org.tinygroup.tinyscript.dataset.function.DataSetSubtractFunction; +import org.tinygroup.tinyscript.dataset.function.DataSetUnionFunction; import org.tinygroup.tinyscript.dataset.function.DataSetUpdateFunction; +import org.tinygroup.tinyscript.dataset.function.DataSetXorFunction; import org.tinygroup.tinyscript.dataset.function.FirstRowFunction; import org.tinygroup.tinyscript.dataset.function.GroupDataSetAggregateFunction; import org.tinygroup.tinyscript.dataset.function.GroupDataSetFilterFunction; @@ -73,6 +79,7 @@ import org.tinygroup.tinyscript.dataset.objectitem.DataSetItemProcessor; import org.tinygroup.tinyscript.dataset.objectitem.DataSetRowItemProcessor; import org.tinygroup.tinyscript.datasetwithtree.function.DataSetToTreeFunction; import org.tinygroup.tinyscript.excel.function.ReadExcelFunction; +import org.tinygroup.tinyscript.excel.function.WriteExcelFunction; import org.tinygroup.tinyscript.expression.ExpressionUtil; import org.tinygroup.tinyscript.expression.Operator; import org.tinygroup.tinyscript.interpret.AttributeProcessor; @@ -158,6 +165,10 @@ public class DefaultTinyScriptEngine extends DefaultScriptEngine implements Scri addScriptFunction(new PermutationFunction()); addScriptFunction(new AllPermutationFunction()); + addScriptFunction(new DataSetIntersectionFunction()); + addScriptFunction(new DataSetSubtractFunction()); + addScriptFunction(new DataSetUnionFunction()); + addScriptFunction(new DataSetXorFunction()); addScriptFunction(new DataSetLimitFunction()); addScriptFunction(new DataSetCopyFunction()); addScriptFunction(new DataSetRemoveFunction()); @@ -192,6 +203,9 @@ public class DefaultTinyScriptEngine extends DefaultScriptEngine implements Scri addScriptFunction(new PreviewRowFunction()); addScriptFunction(new ReadExcelFunction()); + addScriptFunction(new WriteExcelFunction()); + addScriptFunction(new ReadCsvFunction()); + addScriptFunction(new WriteCsvFunction()); addScriptFunction(new ReadTxtFunction()); diff --git a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/intersect.ts b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/intersect.ts index 708699b4d38af26946a1bd33bd2b2354fc510cba..78539cba5de680c243905a82ab8291224c502bf9 100644 --- a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/intersect.ts +++ b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/intersect.ts @@ -1,6 +1,6 @@ dataSet1 = readTxt("/dataSetExample/data1.txt"); dataSet2 = readTxt("/dataSetExample/data2.txt"); -result = dataSet1.intersect(dataSet2,(a,b)->{ return a.name==b.name&&a.weight==b.weight; }); +result = dataSet1.intersect(dataSet2,()->{ return name+"|"+weight; }); for(i = 1;i<=result.getRows();i++){ for(j=1;j<=result.getColumns();j++){ print(result[i][j]+" "); diff --git a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/subtract.ts b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/subtract.ts index 7c064106fb38f31b4e65b8fcf9c125c3c0d6a7cd..5e7ba78e145d4d42654b7473b9d7ce9659d2db6a 100644 --- a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/subtract.ts +++ b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/subtract.ts @@ -1,6 +1,6 @@ dataSet1 = readTxt("/dataSetExample/data1.txt"); dataSet2 = readTxt("/dataSetExample/data2.txt"); -result = dataSet1.subtract(dataSet2,(a,b)->{ return a.name==b.name&&a.weight==b.weight; }); +result = dataSet1.subtract(dataSet2,()->{return name+"|"+weight;}); for(i = 1;i<=result.getRows();i++){ for(j=1;j<=result.getColumns();j++){ print(result[i][j]+" "); @@ -8,7 +8,7 @@ for(i = 1;i<=result.getRows();i++){ println(); } println("================================================================"); -result = dataSet2.subtract(dataSet1,["name","weight"]); +result = dataSet1.subtract(dataSet2,["name","weight"]); for(i = 1;i<=result.getRows();i++){ for(j=1;j<=result.getColumns();j++){ print(result[i][j]+" "); diff --git a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/union.ts b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/union.ts index 0a68e533fe72b40c7449acbd76269457037d043d..565acdb56727347b09745274a500103c462008d5 100644 --- a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/union.ts +++ b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/union.ts @@ -1,6 +1,6 @@ dataSet1 = readTxt("/dataSetExample/data1.txt"); dataSet2 = readTxt("/dataSetExample/data2.txt"); -result = dataSet1.unite(dataSet2,(a,b)->{ return a.name==b.name&&a.weight==b.weight; }); +result = dataSet1.unite(dataSet2,()->{ return name+"|"+weight; }); for(i = 1;i<=result.getRows();i++){ for(j=1;j<=result.getColumns();j++){ print(result[i][j]+" "); diff --git a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/writeCsvTest.csv b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/writeCsvTest.csv new file mode 100644 index 0000000000000000000000000000000000000000..54d24aa9571fd4e928853dab4353c1e95fdd6bb1 --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/writeCsvTest.csv @@ -0,0 +1,5 @@ +,name,age +,һ,12 +Ǯ,,20 +,,34 +,,11.5 diff --git a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/writeExcel.ts b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/writeExcel.ts new file mode 100644 index 0000000000000000000000000000000000000000..da8a9b10cb4546e4e5cb33bed97dff90445364cf --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/writeExcel.ts @@ -0,0 +1,16 @@ +dataSet1 = readExcel("/dataSetExample/writeExcelTest.xlsx"); +dataSet1.get(0).writeExcel("/dataSetExample/testExcel1.xlsx"); +dataSet1.writeExcel("/dataSetExample/testExcel2.xlsx",["mysheet"]); +dataSet1.writeExcel("/dataSetExample/testExcel3.xlsx",["mysheet"],2); +dataSet1.writeExcel("/dataSetExample/testExcel4.xlsx",1,2); +dataSet1.writeExcel("C:/Users/hspcadmin/Desktop/testExcel5.xlsx",["mysheet1","mysheet2"],1,2); + +dataSet1 = readCsv("/dataSetExample/writeCsvTest.csv","gbk"); +dataSet1.writeCsv("/dataSetExample/testCsv1.csv"); +dataSet1.writeCsv("/dataSetExample/testCsv2.csv",2); +dataSet1.writeCsv("/dataSetExample/testCsv3.csv","gbk"); +dataSet1.writeCsv("/dataSetExample/testCsv4.csv","gbk",2); +dataSet1.writeCsv("/dataSetExample/testCsv5.csv",2,3); +dataSet1.writeCsv("/dataSetExample/testCsv6.csv","gbk",2,3); +dataSet1.writeCsv("/dataSetExample/testCsv7.csv",1,4,"RFC4180"); +dataSet1.writeCsv("/dataSetExample/testCsv8.csv","gbk",2,3,"RFC4180"); diff --git a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/writeExcelTest.xlsx b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/writeExcelTest.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2a3536fa90650c3b1a455d6bca14cc2fc856d5c7 Binary files /dev/null and b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/writeExcelTest.xlsx differ diff --git a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/xor.ts b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/xor.ts index e2f64669f3f9b3c5d672ff7ca742e24d73de48a0..ae9d2399227ee60a6fa52ca8b08a08cb89c90365 100644 --- a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/xor.ts +++ b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/xor.ts @@ -1,6 +1,6 @@ dataSet1 = readTxt("/dataSetExample/data1.txt"); dataSet2 = readTxt("/dataSetExample/data2.txt"); -result = dataSet1.xor(dataSet2,(a,b)->{ return a.name==b.name&&a.weight==b.weight; }); +result = dataSet1.xor(dataSet2,()->{ return name+"|"+weight; }); for(i = 1;i<=result.getRows();i++){ for(j=1;j<=result.getColumns();j++){ print(result[i][j]+" "); diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/interpret/FileObjectUtil.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/interpret/FileObjectUtil.java index 10fcc51a3a490c0c2d7c2ee311ae67349aaf2acd..3ac7f34bf98f1deb546bb31dfed4ccdce4c10d83 100644 --- a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/interpret/FileObjectUtil.java +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/interpret/FileObjectUtil.java @@ -1,54 +1,104 @@ package org.tinygroup.tinyscript.interpret; +import java.io.File; +import java.io.IOException; + import org.tinygroup.beancontainer.BeanContainerFactory; import org.tinygroup.fileresolver.FileResolver; +import org.tinygroup.tinyscript.ScriptException; import org.tinygroup.vfs.FileObject; import org.tinygroup.vfs.VFS; +import org.tinygroup.vfs.impl.FileObjectImpl; +import org.tinygroup.vfs.impl.FileSchemaProvider; public final class FileObjectUtil { - private FileObjectUtil(){ - + private FileObjectUtil() { + } - - public static FileObject findFileObject(String path,boolean findInJar) throws Exception{ - //优先根据路径匹配 + + public static FileObject findFileObject(String path, boolean findInJar) throws Exception { + // 优先根据路径匹配 FileObject fileObject = VFS.resolveFile(path); - if(fileObject!=null && fileObject.isExist()){ - return fileObject; - } - //遍历资源扫描器 - FileResolver fileResolver = BeanContainerFactory - .getBeanContainer( - FileObjectUtil.class.getClassLoader()) - .getBean(FileResolver.BEAN_NAME); - if(fileResolver!=null){ - for(String sPath:fileResolver.getScanningPaths()){ - FileObject dir = VFS.resolveFile(sPath); - if(!dir.isInPackage() || findInJar){ - FileObject result = findFileObject(dir,path); - if(result!=null){ - return result; - } - } - } + if (fileObject != null && fileObject.isExist()) { + return fileObject; + } + // 遍历资源扫描器 + FileResolver fileResolver = BeanContainerFactory.getBeanContainer(FileObjectUtil.class.getClassLoader()) + .getBean(FileResolver.BEAN_NAME); + if (fileResolver != null) { + for (String sPath : fileResolver.getScanningPaths()) { + FileObject dir = VFS.resolveFile(sPath); + if (!dir.isInPackage() || findInJar) { + FileObject result = findFileObject(dir, path); + if (result != null) { + return result; + } + } + } } return null; } - - private static FileObject findFileObject(FileObject fileObject,String path){ - - if(fileObject.getPath().equals(path)){ - return fileObject; + + public static FileObject getOrCreateFile(String fileUrl, boolean findInJar) throws ScriptException, IOException { + + String parentFile = fileUrl.substring(0, fileUrl.lastIndexOf("/")); + String fileName = fileUrl.substring(fileUrl.lastIndexOf("/") + 1); + + FileObject fileObject = VFS.resolveFile(parentFile); + if (fileObject != null && fileObject.isExist()) { + return getOrCreateChildFile(fileObject, fileName); } - if(fileObject.getChildren()!=null){ - for(FileObject child:fileObject.getChildren()){ - FileObject result = findFileObject(child,path); - if(result!=null){ - return result; - } - } + + // 遍历资源扫描器 + FileResolver fileResolver = BeanContainerFactory.getBeanContainer(FileObjectUtil.class.getClassLoader()) + .getBean(FileResolver.BEAN_NAME); + if (fileResolver != null) { + for (String sPath : fileResolver.getScanningPaths()) { + FileObject dir = VFS.resolveFile(sPath); + if (!dir.isInPackage() || findInJar) { + FileObject result = getOrCreateChildFile(findFileObject(dir, parentFile), fileName); + if (result != null && result.isExist()) { + return result; + } + } + } } return null; + + } + + private static FileObject findFileObject(FileObject fileObject, String path) { + + if (fileObject.getPath().equals(path)) { + return fileObject; + } + if (fileObject.getChildren() != null) { + for (FileObject child : fileObject.getChildren()) { + FileObject result = findFileObject(child, path); + if (result != null) { + return result; + } + } + } + return null; + } + + private static FileObject getOrCreateChildFile(FileObject parent, String fileName) throws IOException { + + if (parent == null) { + return null; + } + + if (parent.getChild(fileName) == null) { + File file = new File(parent.getAbsolutePath() + File.separator + fileName); + if (file.createNewFile()) { + return new FileObjectImpl(new FileSchemaProvider(), file); + } + } else { + return parent.getChild(fileName); + } + + return null; } }