From 81457743d695e9eb901906d68c395e84a03561f6 Mon Sep 17 00:00:00 2001 From: godot Date: Thu, 7 Jul 2022 10:21:27 +0800 Subject: [PATCH 1/9] =?UTF-8?q?perf[protocol]:=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=A9=BA=E5=AD=97=E7=AC=A6=E4=B8=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/idea/idea-set-up.md | 2 ++ .../java/com/zfoo/protocol/generate/GenerateProtocolPath.java | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/idea/idea-set-up.md b/doc/idea/idea-set-up.md index 9776f945..713477f1 100644 --- a/doc/idea/idea-set-up.md +++ b/doc/idea/idea-set-up.md @@ -15,6 +15,8 @@ 安装好以后,在git bash中输入:git --version,有结果返回则表示安装成功 ``` +- 参看所有的git配置,git config --list + - git下载代码慢的解决方法|无法下载代码的解决方法,取消git配置使用git config --global --unset http.proxy ``` diff --git a/protocol/src/main/java/com/zfoo/protocol/generate/GenerateProtocolPath.java b/protocol/src/main/java/com/zfoo/protocol/generate/GenerateProtocolPath.java index aec46319..d9b7426a 100644 --- a/protocol/src/main/java/com/zfoo/protocol/generate/GenerateProtocolPath.java +++ b/protocol/src/main/java/com/zfoo/protocol/generate/GenerateProtocolPath.java @@ -55,8 +55,8 @@ public abstract class GenerateProtocolPath { public static String getRelativePath(short protocolId, short relativeProtocolId) { // 不是折叠协议的话,protocolPathMap一定是空,这里返回“”,上层会解析为同一个文件下 - if(protocolPathMap.size() == 0){ - return ""; + if(CollectionUtils.isEmpty(protocolPathMap)){ + return StringUtils.EMPTY; } var protocolPath = protocolPathMap.get(protocolId); var relativePath = protocolPathMap.get(relativeProtocolId); From 938d50c1d176117145005b2629aaf6ffead80df8 Mon Sep 17 00:00:00 2001 From: godot Date: Thu, 7 Jul 2022 11:22:13 +0800 Subject: [PATCH 2/9] =?UTF-8?q?fix[protocol]:=20=E4=BF=AE=E5=A4=8Dtest?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/java/com/zfoo/protocol/util/DomUtilsTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/protocol/src/test/java/com/zfoo/protocol/util/DomUtilsTest.java b/protocol/src/test/java/com/zfoo/protocol/util/DomUtilsTest.java index 615f3caa..c1873f7e 100644 --- a/protocol/src/test/java/com/zfoo/protocol/util/DomUtilsTest.java +++ b/protocol/src/test/java/com/zfoo/protocol/util/DomUtilsTest.java @@ -22,23 +22,23 @@ public class DomUtilsTest { private static final String XML_WITH_HEAD = "\n" + "\n" + "\n" + - " \n" + + " \n" + " \n" + " \n" + " \n" + "\n" + - " \n" + + " \n" + " \n" + " \n" + ""; private static final String XML_OF_STANDARD_TEXT = "\n" + - " \n" + + " \n" + " \n" + " \n" + " \n" + "\n" + - " \n" + + " \n" + " \n" + " \n" + ""; From 3a33a093b3de98660e52840464da05eab963833a Mon Sep 17 00:00:00 2001 From: jianan <1072772483@qq.com> Date: Thu, 7 Jul 2022 11:41:53 +0800 Subject: [PATCH 3/9] =?UTF-8?q?fix[module]:=20=E4=BF=AE=E6=94=B9XmlProtoco?= =?UTF-8?q?lDefinition=E5=9B=A0=E4=B8=BA=E5=AD=97=E6=AE=B5=E8=A2=AB?= =?UTF-8?q?=E6=A0=87=E6=B3=A8=E4=B8=BAfinal=E5=AF=BC=E8=87=B4=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E4=BF=AE=E6=94=B9=E5=80=BC=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/zfoo/protocol/xml/XmlProtocolDefinition.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/protocol/src/main/java/com/zfoo/protocol/xml/XmlProtocolDefinition.java b/protocol/src/main/java/com/zfoo/protocol/xml/XmlProtocolDefinition.java index 070973e1..d0567ab0 100644 --- a/protocol/src/main/java/com/zfoo/protocol/xml/XmlProtocolDefinition.java +++ b/protocol/src/main/java/com/zfoo/protocol/xml/XmlProtocolDefinition.java @@ -20,13 +20,13 @@ import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; public class XmlProtocolDefinition { @JacksonXmlProperty(isAttribute = true, localName = "id") - private final short id = -1; + private short id = -1; @JacksonXmlProperty(isAttribute = true, localName = "location") private String location; @JacksonXmlProperty(isAttribute = true, localName = "enhance") - private final boolean enhance = true; + private boolean enhance = true; public short getId() { From c5760e52b88e4ab8d44545fcc11082e2f1221fb1 Mon Sep 17 00:00:00 2001 From: jianan <1072772483@qq.com> Date: Thu, 7 Jul 2022 14:16:08 +0800 Subject: [PATCH 4/9] =?UTF-8?q?fix[module]:=20=E4=BF=AE=E6=94=B9String?= =?UTF-8?q?=E8=BD=ACMap=E6=97=B6Map=E7=9A=84TypeDescriptor=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/java/com/zfoo/storage/conversion/ConversionTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/storage/src/test/java/com/zfoo/storage/conversion/ConversionTest.java b/storage/src/test/java/com/zfoo/storage/conversion/ConversionTest.java index 4548134c..f8fbfbea 100644 --- a/storage/src/test/java/com/zfoo/storage/conversion/ConversionTest.java +++ b/storage/src/test/java/com/zfoo/storage/conversion/ConversionTest.java @@ -75,7 +75,8 @@ public class ConversionTest { Map map = new HashMap(); - map = (Map) conversionService.convert(str, TypeDescriptor.valueOf(String.class), TypeDescriptor.valueOf(map.getClass())); + // 注意:第3个参数不能写成TypeDescriptor.valueOf(map.getClass()) 而是要明确指定Map的key和value的类型 + map = (Map) conversionService.convert(str, TypeDescriptor.valueOf(String.class), TypeDescriptor.map(map.getClass(), TypeDescriptor.valueOf(String.class), TypeDescriptor.valueOf(Integer.class))); Assert.assertEquals(3, map.size()); } From e8b1d8f079eb7b743fed97c3791ff77ec226f9cc Mon Sep 17 00:00:00 2001 From: meiwei <309921330@qq.com> Date: Thu, 7 Jul 2022 15:20:20 +0800 Subject: [PATCH 5/9] =?UTF-8?q?feat[storage]:=20=E6=96=B0=E5=A2=9Eexcel?= =?UTF-8?q?=E8=BD=AC=E6=8D=A2=E6=88=90json=E6=A0=BC=E5=BC=8F=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/zfoo/protocol/util/JsonUtils.java | 25 ++- .../storage/interpreter/JsonResource.java | 21 ++- .../zfoo/storage/util/ExcelToJsonUtils.java | 162 ++++++++++++++++++ .../com/zfoo/storage/ApplicationTest.java | 38 +++- .../java/com/zfoo/storage/StudentManager.java | 2 +- .../java/com/zfoo/storage/TestManager.java | 2 +- .../storage/resource/StudentResource.java | 2 +- .../zfoo/storage/resource/TestResource.java | 2 +- .../test/resources/excel/StudentResource.txt | 78 +++++++++ .../src/test/resources/excel/TestResource.txt | 30 ++-- 10 files changed, 342 insertions(+), 20 deletions(-) create mode 100644 storage/src/main/java/com/zfoo/storage/util/ExcelToJsonUtils.java create mode 100644 storage/src/test/resources/excel/StudentResource.txt diff --git a/protocol/src/main/java/com/zfoo/protocol/util/JsonUtils.java b/protocol/src/main/java/com/zfoo/protocol/util/JsonUtils.java index 4e06cc91..79e5af59 100644 --- a/protocol/src/main/java/com/zfoo/protocol/util/JsonUtils.java +++ b/protocol/src/main/java/com/zfoo/protocol/util/JsonUtils.java @@ -14,9 +14,13 @@ package com.zfoo.protocol.util; import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.core.PrettyPrinter; +import com.fasterxml.jackson.core.util.DefaultIndenter; +import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationConfig; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.module.afterburner.AfterburnerModule; import com.zfoo.protocol.exception.RunException; @@ -53,6 +57,13 @@ public abstract class JsonUtils { //反序列化 //当反序列化有未知属性则抛异常,true打开这个设置 MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true); + //美化输出 + SerializationConfig config = MAPPER.getSerializationConfig(); + PrettyPrinter prettyPrinter = config.getDefaultPrettyPrinter(); + DefaultPrettyPrinter defpp = (DefaultPrettyPrinter) prettyPrinter; + DefaultPrettyPrinter.Indenter indenter = new DefaultIndenter(" ", DefaultIndenter.SYS_LF); + defpp.indentArraysWith(indenter); + defpp.indentObjectsWith(indenter); MAPPER_TURBO.setSerializationInclusion(JsonInclude.Include.NON_NULL); MAPPER_TURBO.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); @@ -68,6 +79,7 @@ public abstract class JsonUtils { } } + //普通输出 public static String object2String(Object object) { try { return MAPPER.writeValueAsString(object); @@ -76,6 +88,15 @@ public abstract class JsonUtils { } } + //格式化/美化/优雅的输出 + public static String object2StringPrettyPrinter(Object object) { + try { + return MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(object); + } catch (Exception e) { + throw new RunException(e, "将对象[object:{}]转换为json字符串时异常", object); + } + } + /** * 涡轮增压极大提升json转换性能,字节码增强 */ @@ -193,9 +214,9 @@ public abstract class JsonUtils { // 循环遍历子节点下的信息 while (iterator.hasNext()) { var node = iterator.next(); - var field = node.getKey(); + var filed = node.getKey(); var value = node.getValue().asText(); - jsonMap.put(field, value); + jsonMap.put(filed, value); } } return jsonMap; diff --git a/storage/src/main/java/com/zfoo/storage/interpreter/JsonResource.java b/storage/src/main/java/com/zfoo/storage/interpreter/JsonResource.java index 7848c06e..94b39ef4 100644 --- a/storage/src/main/java/com/zfoo/storage/interpreter/JsonResource.java +++ b/storage/src/main/java/com/zfoo/storage/interpreter/JsonResource.java @@ -44,7 +44,18 @@ public class JsonResource { private String name; //类型 private String type; - + //列 + private int index; + + public ColumnMeta() { + } + + public ColumnMeta(String name, String type, int index) { + this.name = name; + this.type = type; + this.index = index; + } + public String getName() { return name; } @@ -60,5 +71,13 @@ public class JsonResource { public void setType(String type) { this.type = type; } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } } } diff --git a/storage/src/main/java/com/zfoo/storage/util/ExcelToJsonUtils.java b/storage/src/main/java/com/zfoo/storage/util/ExcelToJsonUtils.java new file mode 100644 index 00000000..4803efe7 --- /dev/null +++ b/storage/src/main/java/com/zfoo/storage/util/ExcelToJsonUtils.java @@ -0,0 +1,162 @@ +/* + * Copyright (C) 2020 The zfoo Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and limitations under the License. + */ + +package com.zfoo.storage.util; + +import com.zfoo.protocol.exception.RunException; +import com.zfoo.protocol.util.JsonUtils; +import com.zfoo.protocol.util.StringUtils; +import com.zfoo.storage.interpreter.JsonResource; +import com.zfoo.storage.interpreter.JsonResource.ColumnMeta; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +import org.apache.commons.io.FileUtils; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.usermodel.WorkbookFactory; + +/** + * @author jaysunxiao + * @version 3.0 + */ +public class ExcelToJsonUtils { + + public static void main(String[] args) throws Exception{ + File inputDir = new File("E:\\workspace\\zfoo\\storage\\src\\test\\resources\\excel"); + String outputDir = "E:\\workspace\\zfoo\\storage\\src\\test\\resources\\excel"; + var listFiles = FileUtils.listFiles(inputDir, new String[] { "xls", "xlsx"}, true); + for (var file : listFiles) { + var fileName = getFileName(file); + var inputStream = FileUtils.openInputStream(file); + var jsonStr = read(inputStream, fileName); + writeJsonFile(outputDir, jsonStr, fileName); + } + } + + public static void writeJsonFile(String outDir, String jsonStr, String name) { + System.out.println("resource: " + name + ".txt"); + PrintWriter pw = null; + try { + File outFile = new File(outDir, name + ".txt"); + if (!outFile.exists()) + outFile.createNewFile(); + pw = new PrintWriter(outFile, "utf-8"); + pw.write(jsonStr); + } catch (IOException e) { + System.err.println("error resource:" + name); + } finally { + if (pw != null) + pw.close(); + } + } + + private static String getFileName(File file) { + String name = file.getName(); + int index = name.lastIndexOf("."); + if (index <= 0) { + return ""; + } + return name.substring(0, index); + } + + public static String read(InputStream inputStream, String fileName) { + var wb = createWorkbook(inputStream, fileName); + var resource = new JsonResource(); + resource.setName(fileName); + // 默认取到第一个sheet页 + var sheet = wb.getSheetAt(0); + //设置所有列 + var columns = getColumnMetas(sheet, fileName); + resource.setColumns(columns); + + // 行数定位到有效数据行,默认是第四行为有效数据行 + var iterator = sheet.iterator(); + iterator.next(); + iterator.next(); + iterator.next(); + // 从ROW_SERVER这行开始读取数据 + List> data = new ArrayList<>(); + while (iterator.hasNext()) { + var row = iterator.next(); + List rowData = new ArrayList<>(); + for (var column : columns) { + var cell = row.getCell(column.getIndex()); + var content = CellUtils.getCellStringValue(cell); + rowData.add(content); + } + data.add(rowData); + } + resource.setData(data); + return JsonUtils.object2StringPrettyPrinter(resource); + } + + // 只读取代码里写的字段 + private static List getColumnMetas(Sheet sheet, String fileName) { + var iterator = sheet.iterator(); + // 获取配置表的有效列名称,默认第一行就是字段名称 + var fieldRow = iterator.next(); + if (fieldRow == null) { + throw new RunException("无法获取资源[class:{}]的Excel文件的属性控制列", fileName); + } + //默认第二行字段类型 + var typeRow = iterator.next(); + if (typeRow == null) { + throw new RunException("无法获取资源[class:{}]的Excel文件的类型控制列", fileName); + } + + var columnMetaList = new ArrayList(); + var cellFieldMap = new HashMap(); + for (var i = 0; i < fieldRow.getLastCellNum(); i++) { + var fieldCell = fieldRow.getCell(i); + if (Objects.isNull(fieldCell)) { + continue; + } + var typeCell = typeRow.getCell(i); + if (Objects.isNull(typeCell)) { + continue; + } + var fieldName = CellUtils.getCellStringValue(fieldCell); + if (StringUtils.isEmpty(fieldName)) { + continue; + } + var typeName = CellUtils.getCellStringValue(typeCell); + if (StringUtils.isEmpty(typeName)) { + continue; + } + var previousValue = cellFieldMap.put(fieldName, i); + if (Objects.nonNull(previousValue)) { + throw new RunException("资源[class:{}]的Excel文件出现重复的属性控制列[field:{}]", fileName, fieldName); + } + columnMetaList.add(new ColumnMeta(fieldName, typeName, i)); + } + return columnMetaList; + } + + private static Workbook createWorkbook(InputStream input, String fileName) { + try { + return WorkbookFactory.create(input); + } catch (IOException e) { + throw new RunException("静态资源[{}]异常,无法读取文件", fileName); + } + } + + +} diff --git a/storage/src/test/java/com/zfoo/storage/ApplicationTest.java b/storage/src/test/java/com/zfoo/storage/ApplicationTest.java index 7bf9dc3f..23435db0 100644 --- a/storage/src/test/java/com/zfoo/storage/ApplicationTest.java +++ b/storage/src/test/java/com/zfoo/storage/ApplicationTest.java @@ -71,18 +71,50 @@ public class ApplicationTest { // 配置文件中resource,需要映射Excel的文件所在位置 var context = new ClassPathXmlApplicationContext("application.xml"); + // Excel的映射内容需要在被Spring管理的bean的方法上加上@ResInjection注解,即可自动注入Excel对应的对象 + // 参考StudentManager中的标准用法 + + var studentManager = context.getBean(StudentManager.class); + var studentResources = studentManager.studentResources; + // 类名称和Excel名称必须完全一致,Excel的列名称必须对应对象的属性名称 + // 类名称和Excel名称必须完全一致,Excel的列名称必须对应对象的属性名称 + for (StudentResource resource : studentResources.getAll()) { + logger.info(JsonUtils.object2String(resource)); + } + System.out.println(StringUtils.MULTIPLE_HYPHENS); + + // 通过id找到对应的行 + var id = 1002; + var valueById = studentResources.get(id); + logger.info(JsonUtils.object2String(valueById)); + System.out.println(StringUtils.MULTIPLE_HYPHENS); + + // 通过索引找对应的行 + var valuesByIndex = studentResources.getIndex("name", "james0"); + logger.info(JsonUtils.object2String(valuesByIndex)); + } + + + // storage教程 + @Test + public void startStorageTestTxt2() { + // 加载配置文件,配置文件中必须引入storage + // 配置文件中scan,需要映射Excel的类所在位置,会自动搜索文件夹下的Excel文件,Excel文件可以放在指定文件夹的任意目录 + // 配置文件中resource,需要映射Excel的文件所在位置 + var context = new ClassPathXmlApplicationContext("application.xml"); + // Excel的映射内容需要在被Spring管理的bean的方法上加上@ResInjection注解,即可自动注入Excel对应的对象 var testManager = context.getBean(TestManager.class); var testResources = testManager.testResources; for (com.zfoo.storage.resource.TestResource resource : testResources.getAll()) { Map map = resource.getType9(); - logger.info(map.get(1)); -// logger.info(JsonUtils.object2String(resource)); + System.err.println(map.get(1)); + logger.info(JsonUtils.object2String(resource)); } // 通过id找到对应的行 var id = 2; var valueById = testResources.get(id); logger.info(JsonUtils.object2String(valueById)); - logger.info(StringUtils.MULTIPLE_HYPHENS); + System.out.println(StringUtils.MULTIPLE_HYPHENS); } } diff --git a/storage/src/test/java/com/zfoo/storage/StudentManager.java b/storage/src/test/java/com/zfoo/storage/StudentManager.java index d0801284..a3f27229 100644 --- a/storage/src/test/java/com/zfoo/storage/StudentManager.java +++ b/storage/src/test/java/com/zfoo/storage/StudentManager.java @@ -22,7 +22,7 @@ import org.springframework.stereotype.Component; * @author jaysunxiao * @version 3.0 */ -//@Component +@Component public class StudentManager { @ResInjection diff --git a/storage/src/test/java/com/zfoo/storage/TestManager.java b/storage/src/test/java/com/zfoo/storage/TestManager.java index fe3c9a29..1de51a0c 100644 --- a/storage/src/test/java/com/zfoo/storage/TestManager.java +++ b/storage/src/test/java/com/zfoo/storage/TestManager.java @@ -24,7 +24,7 @@ import org.springframework.stereotype.Component; * @author jaysunxiao * @version 3.0 */ -@Component +//@Component public class TestManager { @ResInjection diff --git a/storage/src/test/java/com/zfoo/storage/resource/StudentResource.java b/storage/src/test/java/com/zfoo/storage/resource/StudentResource.java index 88039ac7..172c26e3 100644 --- a/storage/src/test/java/com/zfoo/storage/resource/StudentResource.java +++ b/storage/src/test/java/com/zfoo/storage/resource/StudentResource.java @@ -21,7 +21,7 @@ import com.zfoo.storage.model.anno.Resource; * @author jaysunxiao * @version 3.0 */ -//@Resource +@Resource public class StudentResource { @Id diff --git a/storage/src/test/java/com/zfoo/storage/resource/TestResource.java b/storage/src/test/java/com/zfoo/storage/resource/TestResource.java index beb01ee0..81aedf19 100644 --- a/storage/src/test/java/com/zfoo/storage/resource/TestResource.java +++ b/storage/src/test/java/com/zfoo/storage/resource/TestResource.java @@ -24,7 +24,7 @@ import com.zfoo.storage.model.anno.Resource; * @author jaysunxiao * @version 3.0 */ -@Resource +//@Resource public class TestResource { @Id diff --git a/storage/src/test/resources/excel/StudentResource.txt b/storage/src/test/resources/excel/StudentResource.txt new file mode 100644 index 00000000..7d1d6053 --- /dev/null +++ b/storage/src/test/resources/excel/StudentResource.txt @@ -0,0 +1,78 @@ +{ + "name" : "StudentResource", + "columns" : [ + { + "name" : "id", + "type" : "string", + "index" : 0 + }, + { + "name" : "name", + "type" : "string", + "index" : 1 + }, + { + "name" : "age", + "type" : "int", + "index" : 2 + }, + { + "name" : "score", + "type" : "float", + "index" : 3 + }, + { + "name" : "courses", + "type" : "array", + "index" : 4 + }, + { + "name" : "users", + "type" : "array", + "index" : 5 + }, + { + "name" : "user", + "type" : "string", + "index" : 6 + } + ], + "data" : [ + [ + "1000", + "james0", + "10", + "60.8", + "[\"History\",\"Chiness\"]", + "[{\"id\":\"1000\",\"name\":\"SunInsanity\",\"sex\":\"boy\",\"age\":22},{\"id\":\"1000\",\"name\":\"SunInsanity\",\"sex\":\"boy\",\"age\":22}]", + "{\"id\":\"1000\",\"name\":\"SunInsanity\",\"sex\":\"boy\",\"age\":22}" + ], + [ + "1001", + "james1", + "10", + "70.1", + "[\"History\",\"Chiness\"]", + "[{\"id\":\"1000\",\"name\":\"SunInsanity\",\"sex\":\"boy\",\"age\":22},{\"id\":\"1000\",\"name\":\"SunInsanity\",\"sex\":\"boy\",\"age\":23}]", + "{\"id\":\"1000\",\"name\":\"SunInsanity\",\"sex\":\"boy\",\"age\":22}" + ], + [ + "1002", + "james2", + "10", + "80.2", + "[\"History\",\"Chiness\"]", + "[{\"id\":\"1000\",\"name\":\"SunInsanity\",\"sex\":\"boy\",\"age\":22},{\"id\":\"1000\",\"name\":\"SunInsanity\",\"sex\":\"boy\",\"age\":24}]", + "{\"id\":\"1000\",\"name\":\"SunInsanity\",\"sex\":\"boy\",\"age\":22}" + ], + [ + "1003", + "james3", + "10", + "59", + "[\"History\",\"Chiness\"]", + "[{\"id\":\"1000\",\"name\":\"SunInsanity\",\"sex\":\"boy\",\"age\":22},{\"id\":\"1000\",\"name\":\"SunInsanity\",\"sex\":\"boy\",\"age\":25}]", + "{\"id\":\"1000\",\"name\":\"SunInsanity\",\"sex\":\"boy\",\"age\":22}" + ] + ] +} \ No newline at end of file diff --git a/storage/src/test/resources/excel/TestResource.txt b/storage/src/test/resources/excel/TestResource.txt index de49bb5d..8505908b 100644 --- a/storage/src/test/resources/excel/TestResource.txt +++ b/storage/src/test/resources/excel/TestResource.txt @@ -3,43 +3,53 @@ "columns": [ { "name": "Id", - "type": "int" + "type": "int", + "index" : 0 }, { "name": "Type0", - "type": "long" + "type": "long", + "index" : 0 }, { "name": "Type1", - "type": "string" + "type": "string", + "index" : 0 }, { "name": "Type2", - "type": "list\u003cstring\u003e" + "type": "list\u003cstring\u003e", + "index" : 0 }, { "name": "Type3", - "type": "list\u003cint\u003e" + "type": "list\u003cint\u003e", + "index" : 0 }, { "name": "Type4", - "type": "list\u003clong\u003e" + "type": "list\u003clong\u003e", + "index" : 0 }, { "name": "Type5", - "type": "array\u003cattr,id,name\u003e" + "type": "array\u003cattr,id,name\u003e", + "index" : 0 }, { "name": "Type8", - "type": "map\u003cint,int\u003e" + "type": "map\u003cint,int\u003e", + "index" : 0 }, { "name": "Type9", - "type": "map\u003cint,string\u003e" + "type": "map\u003cint,string\u003e", + "index" : 0 }, { "name": "Type10", - "type": "map\u003cstring,string\u003e" + "type": "map\u003cstring,string\u003e", + "index" : 0 } ], "data": [ From b6838471f24d8e10c4445bb90f5678d3ba26e29f Mon Sep 17 00:00:00 2001 From: meiwei <309921330@qq.com> Date: Thu, 7 Jul 2022 19:56:46 +0800 Subject: [PATCH 6/9] =?UTF-8?q?perf[storage]:=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BA=86=E9=85=8D=E7=BD=AE=E8=A1=A8=E8=AF=BB=E5=8F=96=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zfoo/boot/StorageAutoConfiguration.java | 1 - .../storage/interpreter/IResourceReader.java | 2 +- .../interpreter/JsonResourceReader.java | 156 -------------- ...{JsonResource.java => ResourceConfig.java} | 18 +- ...esourceReader.java => ResourceReader.java} | 194 ++++++++++++------ .../zfoo/storage/manager/StorageManager.java | 9 +- .../storage/model/config/StorageConfig.java | 10 - .../com/zfoo/storage/model/vo/Storage.java | 4 +- .../schema/StorageDefinitionParser.java | 26 +-- .../zfoo/storage/util/ExcelToJsonUtils.java | 33 ++- storage/src/main/resources/storage-1.0.xsd | 2 - .../com/zfoo/storage/ApplicationTest.java | 46 +---- .../java/com/zfoo/storage/TestManager.java | 2 +- .../com/zfoo/storage/excel/ExcelTest.java | 8 + .../zfoo/storage/resource/TestResource.java | 2 +- .../{excel => }/StudentResource.xlsx | Bin storage/src/test/resources/application.xml | 5 +- 17 files changed, 190 insertions(+), 328 deletions(-) delete mode 100644 storage/src/main/java/com/zfoo/storage/interpreter/JsonResourceReader.java rename storage/src/main/java/com/zfoo/storage/interpreter/{JsonResource.java => ResourceConfig.java} (78%) rename storage/src/main/java/com/zfoo/storage/interpreter/{ExcelResourceReader.java => ResourceReader.java} (59%) rename storage/src/test/resources/{excel => }/StudentResource.xlsx (100%) diff --git a/boot/src/main/java/com/zfoo/boot/StorageAutoConfiguration.java b/boot/src/main/java/com/zfoo/boot/StorageAutoConfiguration.java index 1f05fffa..5486f90d 100644 --- a/boot/src/main/java/com/zfoo/boot/StorageAutoConfiguration.java +++ b/boot/src/main/java/com/zfoo/boot/StorageAutoConfiguration.java @@ -13,7 +13,6 @@ package com.zfoo.boot; import com.zfoo.storage.StorageContext; -import com.zfoo.storage.interpreter.ExcelResourceReader; import com.zfoo.storage.manager.StorageManager; import com.zfoo.storage.model.config.StorageConfig; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; diff --git a/storage/src/main/java/com/zfoo/storage/interpreter/IResourceReader.java b/storage/src/main/java/com/zfoo/storage/interpreter/IResourceReader.java index cbc165ea..7eda29cb 100644 --- a/storage/src/main/java/com/zfoo/storage/interpreter/IResourceReader.java +++ b/storage/src/main/java/com/zfoo/storage/interpreter/IResourceReader.java @@ -27,6 +27,6 @@ import java.util.List; */ public interface IResourceReader { - List read(InputStream inputStream, Class clazz); + List read(InputStream inputStream, Class clazz, String suffix); } diff --git a/storage/src/main/java/com/zfoo/storage/interpreter/JsonResourceReader.java b/storage/src/main/java/com/zfoo/storage/interpreter/JsonResourceReader.java deleted file mode 100644 index c442652b..00000000 --- a/storage/src/main/java/com/zfoo/storage/interpreter/JsonResourceReader.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.zfoo.storage.interpreter; - -import com.zfoo.protocol.exception.RunException; -import com.zfoo.protocol.util.JsonUtils; -import com.zfoo.protocol.util.ReflectionUtils; -import com.zfoo.protocol.util.StringUtils; -import com.zfoo.storage.model.anno.Id; -import com.zfoo.storage.strategy.*; - -import org.apache.commons.io.IOUtils; -import org.springframework.context.support.ConversionServiceFactoryBean; -import org.springframework.core.convert.TypeDescriptor; - -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.nio.charset.StandardCharsets; -import java.util.*; -import java.util.stream.Collectors; - -public class JsonResourceReader implements IResourceReader { - - private static final TypeDescriptor TYPE_DESCRIPTOR = TypeDescriptor.valueOf(String.class); - - private static final ConversionServiceFactoryBean conversionServiceFactoryBean = new ConversionServiceFactoryBean(); - - static { - var converters = new HashSet<>(); - converters.add(new JsonToArrayConverter()); - converters.add(new JsonToMapConverter()); - converters.add(new JsonToObjectConverter()); - converters.add(new StringToClassConverter()); - converters.add(new StringToDateConverter()); - converters.add(new StringToMapConverter()); - conversionServiceFactoryBean.setConverters(converters); - conversionServiceFactoryBean.afterPropertiesSet(); - } - - @Override - public List read(InputStream inputStream, Class clazz) { - String txt = readTxt(inputStream, clazz); - JsonResource JsonResource = JsonUtils.string2Object(txt, JsonResource.class); - - var result = new ArrayList(); - - // 默认取到第一个sheet页 - var fieldInfos = getFieldInfos(JsonResource, clazz); - - var iterator = JsonResource.getData().iterator(); - // 从ROW_SERVER这行开始读取数据 - while (iterator.hasNext()) { - var row = iterator.next(); - var instance = ReflectionUtils.newInstance(clazz); - - for (var fieldInfo : fieldInfos) { - var content = row.get(fieldInfo.index); - if (StringUtils.isNotEmpty(content) || fieldInfo.field.getType() == String.class) { - inject(instance, fieldInfo.field, content); - } - } - result.add(instance); - } - return result; - } - - private void inject(Object instance, Field field, String content) { - try { - var targetType = new TypeDescriptor(field); - var value = conversionServiceFactoryBean.getObject().convert(content, TYPE_DESCRIPTOR, targetType); - ReflectionUtils.makeAccessible(field); - ReflectionUtils.setField(field, instance, value); - } catch (Exception e) { - throw new RunException(e, "无法将Excel资源[class:{}]中的[content:{}]转换为属性[field:{}]", instance.getClass().getSimpleName(), content, field.getName()); - } - } - - - // 只读取代码里写的字段 - private Collection getFieldInfos(JsonResource resource, Class clazz) { - var fieldRow = resource.getColumns(); - if (fieldRow == null) { - throw new RunException("无法获取资源[class:{}]的Excel文件的属性控制列", clazz.getSimpleName()); - } - - var cellFieldMap = new HashMap(); - for (var i = 0; i < fieldRow.size(); i++) { - var cell = fieldRow.get(i); - if (Objects.isNull(cell)) { - continue; - } - - var name = cell.getName(); - if (StringUtils.isEmpty(name)) { - continue; - } - var previousValue = cellFieldMap.put(name, i); - if (Objects.nonNull(previousValue)) { - throw new RunException("资源[class:{}]的Excel文件出现重复的属性控制列[field:{}]", clazz.getSimpleName(), name); - } - } - - var fieldList = Arrays.stream(clazz.getDeclaredFields()) - .filter(it -> !Modifier.isTransient(it.getModifiers())) - .filter(it -> !Modifier.isStatic(it.getModifiers())) - .collect(Collectors.toList()); - - for (var field : fieldList) { - if (!cellFieldMap.containsKey(field.getName())) { - throw new RunException("资源类[class:{}]的声明属性[filed:{}]无法获取,请检查配置表的格式", clazz, field.getName()); - } - - if (field.isAnnotationPresent(Id.class)) { - var cellIndex = cellFieldMap.get(field.getName()); - if (cellIndex != 0) { - throw new RunException("资源类[class:{}]的主键[Id:{}]必须放在Excel配置表的第一列,请检查配置表的格式", clazz, field.getName()); - } - } - - if (Modifier.isPublic(field.getModifiers())) { - throw new RunException("因为静态资源类是不能被修改的,所以资源类[class:{}]的属性[filed:{}]不能被public修饰,请改为private修饰", clazz, field.getName()); - } - - var setMethodName = StringUtils.EMPTY; - try { - setMethodName = ReflectionUtils.fieldToSetMethod(clazz, field); - } catch (Exception e) { - // 没有setMethod是正确的 - } - if (StringUtils.isNotBlank(setMethodName)) { - throw new RunException("因为静态资源类是不能被修改的,所以资源类[class:{}]的属性[filed:{}]不能含有set方法[{}]", clazz, field.getName(), setMethodName); - } - } - - return fieldList.stream().map(it -> new FieldInfo(cellFieldMap.get(it.getName()), it)).collect(Collectors.toList()); - - } - - private String readTxt(InputStream input, Class clazz) { - try { - return IOUtils.toString(input, StandardCharsets.UTF_8); - } catch (IOException e) { - throw new RunException("静态资源[{}]异常,无法读取文件", clazz.getSimpleName()); - } - } - - private static class FieldInfo { - public final int index; - public final Field field; - - public FieldInfo(int index, Field field) { - this.index = index; - this.field = field; - } - } -} diff --git a/storage/src/main/java/com/zfoo/storage/interpreter/JsonResource.java b/storage/src/main/java/com/zfoo/storage/interpreter/ResourceConfig.java similarity index 78% rename from storage/src/main/java/com/zfoo/storage/interpreter/JsonResource.java rename to storage/src/main/java/com/zfoo/storage/interpreter/ResourceConfig.java index 94b39ef4..ee5d77c2 100644 --- a/storage/src/main/java/com/zfoo/storage/interpreter/JsonResource.java +++ b/storage/src/main/java/com/zfoo/storage/interpreter/ResourceConfig.java @@ -7,11 +7,11 @@ import java.util.List; * 配置文件资源 * */ -public class JsonResource { +public class ResourceConfig { // 文件名 private String name; //配置表字段名 - private List columns = new ArrayList<>(); + private List
header = new ArrayList<>(); // 配置表数据 private List> data = new ArrayList<>(); @@ -23,12 +23,12 @@ public class JsonResource { this.name = name; } - public List getColumns() { - return columns; + public List
getHeader() { + return header; } - public void setColumns(List columns) { - this.columns = columns; + public void setHeader(List
header) { + this.header = header; } public List> getData() { @@ -39,7 +39,7 @@ public class JsonResource { this.data = data; } - public static class ColumnMeta { + public static class Header { //字段名 private String name; //类型 @@ -47,10 +47,10 @@ public class JsonResource { //列 private int index; - public ColumnMeta() { + public Header() { } - public ColumnMeta(String name, String type, int index) { + public Header(String name, String type, int index) { this.name = name; this.type = type; this.index = index; diff --git a/storage/src/main/java/com/zfoo/storage/interpreter/ExcelResourceReader.java b/storage/src/main/java/com/zfoo/storage/interpreter/ResourceReader.java similarity index 59% rename from storage/src/main/java/com/zfoo/storage/interpreter/ExcelResourceReader.java rename to storage/src/main/java/com/zfoo/storage/interpreter/ResourceReader.java index 0579e943..3137c152 100644 --- a/storage/src/main/java/com/zfoo/storage/interpreter/ExcelResourceReader.java +++ b/storage/src/main/java/com/zfoo/storage/interpreter/ResourceReader.java @@ -14,12 +14,15 @@ package com.zfoo.storage.interpreter; import com.zfoo.protocol.exception.RunException; +import com.zfoo.protocol.util.JsonUtils; import com.zfoo.protocol.util.ReflectionUtils; import com.zfoo.protocol.util.StringUtils; +import com.zfoo.storage.interpreter.ResourceConfig.Header; import com.zfoo.storage.model.anno.Id; import com.zfoo.storage.strategy.*; import com.zfoo.storage.util.CellUtils; -import org.apache.poi.ss.usermodel.Row; + +import org.apache.commons.io.IOUtils; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; @@ -30,6 +33,7 @@ import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Field; import java.lang.reflect.Modifier; +import java.nio.charset.StandardCharsets; import java.util.*; import java.util.stream.Collectors; @@ -37,7 +41,7 @@ import java.util.stream.Collectors; * @author jaysunxiao * @version 3.0 */ -public class ExcelResourceReader implements IResourceReader { +public class ResourceReader implements IResourceReader { private static final TypeDescriptor TYPE_DESCRIPTOR = TypeDescriptor.valueOf(String.class); @@ -56,33 +60,27 @@ public class ExcelResourceReader implements IResourceReader { } @Override - public List read(InputStream inputStream, Class clazz) { - var wb = createWorkbook(inputStream, clazz); + public List read(InputStream inputStream, Class clazz, String suffix) { + ResourceConfig resource = null; + if (suffix.equals("txt")) { + resource = readJson(inputStream, clazz.getSimpleName()); + } else { + resource = readExcel(inputStream, clazz.getSimpleName()); + } + var result = new ArrayList(); + //获取所有字段 + var cellFieldMap = getFieldMap(resource, clazz); + var fieldInfos = getFieldInfos(cellFieldMap, clazz); - // 默认取到第一个sheet页 - var sheet = wb.getSheetAt(0); - var fieldInfos = getFieldInfos(sheet, clazz); - - var iterator = sheet.iterator(); - // 行数定位到有效数据行,默认是第四行为有效数据行 - iterator.next(); - iterator.next(); - iterator.next(); - + var iterator = resource.getData().iterator(); // 从ROW_SERVER这行开始读取数据 while (iterator.hasNext()) { var row = iterator.next(); var instance = ReflectionUtils.newInstance(clazz); - var idCell = row.getCell(0); - if (StringUtils.isBlank(CellUtils.getCellStringValue(idCell))) { - continue; - } - for (var fieldInfo : fieldInfos) { - var cell = row.getCell(fieldInfo.index); - var content = CellUtils.getCellStringValue(cell); + var content = row.get(fieldInfo.index); if (StringUtils.isNotEmpty(content) || fieldInfo.field.getType() == String.class) { inject(instance, fieldInfo.field, content); } @@ -91,7 +89,81 @@ public class ExcelResourceReader implements IResourceReader { } return result; } + + public ResourceConfig readExcel(InputStream inputStream, String name) { + var wb = createWorkbook(inputStream, name); + var resource = new ResourceConfig(); + resource.setName(name); + // 默认取到第一个sheet页 + var sheet = wb.getSheetAt(0); + //设置所有列 + var headers = getHeaders(sheet, name); + resource.setHeader(headers); + // 行数定位到有效数据行,默认是第四行为有效数据行 + var iterator = sheet.iterator(); + iterator.next(); + iterator.next(); + iterator.next(); + // 从ROW_SERVER这行开始读取数据 + List> data = new ArrayList<>(); + while (iterator.hasNext()) { + var row = iterator.next(); + List rowData = new ArrayList<>(); + for (var header : headers) { + var cell = row.getCell(header.getIndex()); + var content = CellUtils.getCellStringValue(cell); + rowData.add(content); + } + data.add(rowData); + } + resource.setData(data); + return resource; + } + + // 只读取代码里写的字段 + private List
getHeaders(Sheet sheet, String fileName) { + var iterator = sheet.iterator(); + // 获取配置表的有效列名称,默认第一行就是字段名称 + var fieldRow = iterator.next(); + if (fieldRow == null) { + throw new RunException("无法获取资源[class:{}]的Excel文件的属性控制列", fileName); + } + //默认第二行字段类型 + var typeRow = iterator.next(); + if (typeRow == null) { + throw new RunException("无法获取资源[class:{}]的Excel文件的类型控制列", fileName); + } + + var headerList = new ArrayList
(); + var cellFieldMap = new HashMap(); + for (var i = 0; i < fieldRow.getLastCellNum(); i++) { + var fieldCell = fieldRow.getCell(i); + if (Objects.isNull(fieldCell)) { + continue; + } + var typeCell = typeRow.getCell(i); + if (Objects.isNull(typeCell)) { + continue; + } + var fieldName = CellUtils.getCellStringValue(fieldCell); + if (StringUtils.isEmpty(fieldName)) { + continue; + } + var typeName = CellUtils.getCellStringValue(typeCell); + if (StringUtils.isEmpty(typeName)) { + continue; + } + var previousValue = cellFieldMap.put(fieldName, i); + if (Objects.nonNull(previousValue)) { + throw new RunException("资源[class:{}]的Excel文件出现重复的属性控制列[field:{}]", fileName, fieldName); + } + headerList.add(new Header(fieldName, typeName, i)); + } + return headerList; + } + + private void inject(Object instance, Field field, String content) { try { var targetType = new TypeDescriptor(field); @@ -103,43 +175,20 @@ public class ExcelResourceReader implements IResourceReader { } } - // 只读取代码里写的字段 - private Collection getFieldInfos(Sheet sheet, Class clazz) { - var fieldRow = getFieldRow(sheet); - if (fieldRow == null) { - throw new RunException("无法获取资源[class:{}]的Excel文件的属性控制列", clazz.getSimpleName()); - } - - var cellFieldMap = new HashMap(); - for (var i = 0; i < fieldRow.getLastCellNum(); i++) { - var cell = fieldRow.getCell(i); - if (Objects.isNull(cell)) { - continue; - } - - var name = CellUtils.getCellStringValue(cell); - if (StringUtils.isEmpty(name)) { - continue; - } - var previousValue = cellFieldMap.put(name, i); - if (Objects.nonNull(previousValue)) { - throw new RunException("资源[class:{}]的Excel文件出现重复的属性控制列[field:{}]", clazz.getSimpleName(), name); - } - } - + private Collection getFieldInfos(Map fieldMap, Class clazz) { var fieldList = Arrays.stream(clazz.getDeclaredFields()) .filter(it -> !Modifier.isTransient(it.getModifiers())) .filter(it -> !Modifier.isStatic(it.getModifiers())) .collect(Collectors.toList()); for (var field : fieldList) { - if (!cellFieldMap.containsKey(field.getName())) { + if (!fieldMap.containsKey(field.getName())) { throw new RunException("资源类[class:{}]的声明属性[filed:{}]无法获取,请检查配置表的格式", clazz, field.getName()); } if (field.isAnnotationPresent(Id.class)) { - var cellIndex = cellFieldMap.get(field.getName()); + var cellIndex = fieldMap.get(field.getName()); if (cellIndex != 0) { throw new RunException("资源类[class:{}]的主键[Id:{}]必须放在Excel配置表的第一列,请检查配置表的格式", clazz, field.getName()); } @@ -160,27 +209,17 @@ public class ExcelResourceReader implements IResourceReader { } } - return fieldList.stream().map(it -> new FieldInfo(cellFieldMap.get(it.getName()), it)).collect(Collectors.toList()); - + return fieldList.stream().map(it -> new FieldInfo(fieldMap.get(it.getName()), it)).collect(Collectors.toList()); } - // 获取配置表的有效列名称,默认第一行就是字段名称 - private Row getFieldRow(Sheet sheet) { - var iterator = sheet.iterator(); - var row = iterator.next(); - return row; - } - - - private Workbook createWorkbook(InputStream input, Class clazz) { + private Workbook createWorkbook(InputStream input, String name) { try { return WorkbookFactory.create(input); } catch (IOException e) { - throw new RunException("静态资源[{}]异常,无法读取文件", clazz.getSimpleName()); + throw new RunException("静态资源[{}]异常,无法读取文件", name); } } - private static class FieldInfo { public final int index; public final Field field; @@ -190,4 +229,39 @@ public class ExcelResourceReader implements IResourceReader { this.field = field; } } + + public Map getFieldMap(ResourceConfig resource, Class clazz) { + var header = resource.getHeader(); + if (header == null) { + throw new RunException("无法获取资源[class:{}]的Excel文件的属性控制列", clazz.getSimpleName()); + } + + var cellFieldMap = new HashMap(); + for (var i = 0; i < header.size(); i++) { + var cell = header.get(i); + if (Objects.isNull(cell)) { + continue; + } + + var name = cell.getName(); + if (StringUtils.isEmpty(name)) { + continue; + } + var previousValue = cellFieldMap.put(name, i); + if (Objects.nonNull(previousValue)) { + throw new RunException("资源[class:{}]的Excel文件出现重复的属性控制列[field:{}]", clazz.getSimpleName(), name); + } + } + return cellFieldMap; + } + + private ResourceConfig readJson(InputStream input, String name) { + try { + var jsonStr = IOUtils.toString(input, StandardCharsets.UTF_8); + //将json字符转换成对象 + return JsonUtils.string2Object(jsonStr, ResourceConfig.class); + } catch (IOException e) { + throw new RunException("静态资源[{}]异常,无法读取文件", name); + } + } } diff --git a/storage/src/main/java/com/zfoo/storage/manager/StorageManager.java b/storage/src/main/java/com/zfoo/storage/manager/StorageManager.java index 32a82004..19b91a3a 100644 --- a/storage/src/main/java/com/zfoo/storage/manager/StorageManager.java +++ b/storage/src/main/java/com/zfoo/storage/manager/StorageManager.java @@ -16,6 +16,7 @@ package com.zfoo.storage.manager; import com.zfoo.protocol.collection.CollectionUtils; import com.zfoo.protocol.exception.ExceptionUtils; import com.zfoo.protocol.exception.RunException; +import com.zfoo.protocol.util.FileUtils; import com.zfoo.protocol.util.ReflectionUtils; import com.zfoo.protocol.util.StringUtils; import com.zfoo.storage.StorageContext; @@ -98,8 +99,10 @@ public class StorageManager implements IStorageManager { try { for (var definition : resourceDefinitionMap.values()) { var clazz = definition.getClazz(); + var resource = definition.getResource(); + var fileExtName = FileUtils.fileExtName(resource.getFilename()); Storage storage = new Storage<>(); - storage.init(definition.getResource().getInputStream(), definition.getClazz()); + storage.init(resource.getInputStream(), definition.getClazz(), fileExtName); storageMap.putIfAbsent(clazz, storage); allStorageUsableMap.put(clazz, false); } @@ -224,7 +227,7 @@ public class StorageManager implements IStorageManager { try { var resourceList = new ArrayList(); - var packageSearchPath = StringUtils.format("{}/**/{}.{}", storageConfig.getResourceLocation(), clazz.getSimpleName(), storageConfig.getResourceSuffix()); + var packageSearchPath = StringUtils.format("{}/**/{}.*", storageConfig.getResourceLocation(), clazz.getSimpleName()); packageSearchPath = packageSearchPath.replaceAll("//", "/"); try { resourceList.addAll(Arrays.asList(resourcePatternResolver.getResources(packageSearchPath))); @@ -234,7 +237,7 @@ public class StorageManager implements IStorageManager { // 通配符无法匹配根目录,所以如果找不到,再从根目录查找一遍 if (CollectionUtils.isEmpty(resourceList)) { - packageSearchPath = StringUtils.format("{}/{}.{}", storageConfig.getResourceLocation(), clazz.getSimpleName(), storageConfig.getResourceSuffix()); + packageSearchPath = StringUtils.format("{}/{}.*", storageConfig.getResourceLocation(), clazz.getSimpleName()); packageSearchPath = packageSearchPath.replaceAll("//", "/"); resourceList.addAll(Arrays.asList(resourcePatternResolver.getResources(packageSearchPath))); } diff --git a/storage/src/main/java/com/zfoo/storage/model/config/StorageConfig.java b/storage/src/main/java/com/zfoo/storage/model/config/StorageConfig.java index 362383ee..5136b5db 100644 --- a/storage/src/main/java/com/zfoo/storage/model/config/StorageConfig.java +++ b/storage/src/main/java/com/zfoo/storage/model/config/StorageConfig.java @@ -25,8 +25,6 @@ public class StorageConfig { private String resourceLocation; - private String resourceSuffix; - public String getId() { return id; } @@ -50,12 +48,4 @@ public class StorageConfig { public void setResourceLocation(String resourceLocation) { this.resourceLocation = resourceLocation; } - - public String getResourceSuffix() { - return resourceSuffix; - } - - public void setResourceSuffix(String resourceSuffix) { - this.resourceSuffix = resourceSuffix; - } } diff --git a/storage/src/main/java/com/zfoo/storage/model/vo/Storage.java b/storage/src/main/java/com/zfoo/storage/model/vo/Storage.java index 608fb58a..a498f7ba 100644 --- a/storage/src/main/java/com/zfoo/storage/model/vo/Storage.java +++ b/storage/src/main/java/com/zfoo/storage/model/vo/Storage.java @@ -44,14 +44,14 @@ public class Storage { public Storage() { } - public void init(InputStream inputStream, Class resourceClazz) { + public void init(InputStream inputStream, Class resourceClazz, String suffix) { try { this.clazz = (Class) resourceClazz; var reader = StorageContext.getResourceReader(); idDef = IdDef.valueOf(resourceClazz); indexDefMap = IndexDef.createResourceIndexes(resourceClazz); - var list = reader.read(inputStream, resourceClazz); + var list = reader.read(inputStream, resourceClazz, suffix); dataMap.clear(); indexMap.clear(); diff --git a/storage/src/main/java/com/zfoo/storage/schema/StorageDefinitionParser.java b/storage/src/main/java/com/zfoo/storage/schema/StorageDefinitionParser.java index db59383d..430fa8ff 100644 --- a/storage/src/main/java/com/zfoo/storage/schema/StorageDefinitionParser.java +++ b/storage/src/main/java/com/zfoo/storage/schema/StorageDefinitionParser.java @@ -16,8 +16,7 @@ package com.zfoo.storage.schema; import com.zfoo.protocol.util.DomUtils; import com.zfoo.protocol.util.StringUtils; import com.zfoo.storage.StorageContext; -import com.zfoo.storage.interpreter.ExcelResourceReader; -import com.zfoo.storage.interpreter.JsonResourceReader; +import com.zfoo.storage.interpreter.ResourceReader; import com.zfoo.storage.manager.StorageManager; import com.zfoo.storage.model.config.StorageConfig; import org.springframework.beans.factory.support.AbstractBeanDefinition; @@ -70,20 +69,9 @@ public class StorageDefinitionParser implements BeanDefinitionParser { resolvePlaceholder("id", "id", builder, element, parserContext); resolvePlaceholder("package", "scanPackage", builder, scanElement, parserContext); resolvePlaceholder("location", "resourceLocation", builder, resourceElement, parserContext); - resolvePlaceholder("suffix", "resourceSuffix", builder, resourceElement, parserContext); parserContext.getRegistry().registerBeanDefinition(clazz.getCanonicalName(), builder.getBeanDefinition()); - - // 注册ExcelResourceReader - Class readerClazz = ExcelResourceReader.class; - var resourceSuffix = resourceElement.getAttribute("suffix"); - if (resourceSuffix.equals("txt")) { - readerClazz = JsonResourceReader.class; - } - - var readerName = StringUtils.uncapitalize(readerClazz.getName()); - builder = BeanDefinitionBuilder.rootBeanDefinition(readerClazz); - parserContext.getRegistry().registerBeanDefinition(readerName, builder.getBeanDefinition()); + } private void registerBeanDefinition(ParserContext parserContext) { @@ -99,11 +87,11 @@ public class StorageDefinitionParser implements BeanDefinitionParser { builder = BeanDefinitionBuilder.rootBeanDefinition(clazz); registry.registerBeanDefinition(name, builder.getBeanDefinition()); - // 注册ExcelResourceReader -// clazz = ExcelResourceReader.class; -// name = StringUtils.uncapitalize(clazz.getName()); -// builder = BeanDefinitionBuilder.rootBeanDefinition(clazz); -// registry.registerBeanDefinition(name, builder.getBeanDefinition()); + // 注册ResourceReader + clazz = ResourceReader.class; + name = StringUtils.uncapitalize(clazz.getName()); + builder = BeanDefinitionBuilder.rootBeanDefinition(clazz); + registry.registerBeanDefinition(name, builder.getBeanDefinition()); } private void resolvePlaceholder(String attributeName, String fieldName, BeanDefinitionBuilder builder, Element element, ParserContext parserContext) { diff --git a/storage/src/main/java/com/zfoo/storage/util/ExcelToJsonUtils.java b/storage/src/main/java/com/zfoo/storage/util/ExcelToJsonUtils.java index 4803efe7..a5d52d58 100644 --- a/storage/src/main/java/com/zfoo/storage/util/ExcelToJsonUtils.java +++ b/storage/src/main/java/com/zfoo/storage/util/ExcelToJsonUtils.java @@ -16,8 +16,8 @@ package com.zfoo.storage.util; import com.zfoo.protocol.exception.RunException; import com.zfoo.protocol.util.JsonUtils; import com.zfoo.protocol.util.StringUtils; -import com.zfoo.storage.interpreter.JsonResource; -import com.zfoo.storage.interpreter.JsonResource.ColumnMeta; +import com.zfoo.storage.interpreter.ResourceConfig; +import com.zfoo.storage.interpreter.ResourceConfig.Header; import java.io.File; import java.io.IOException; @@ -34,15 +34,13 @@ import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; /** - * @author jaysunxiao + * @author meiwei666 * @version 3.0 */ public class ExcelToJsonUtils { - public static void main(String[] args) throws Exception{ - File inputDir = new File("E:\\workspace\\zfoo\\storage\\src\\test\\resources\\excel"); - String outputDir = "E:\\workspace\\zfoo\\storage\\src\\test\\resources\\excel"; - var listFiles = FileUtils.listFiles(inputDir, new String[] { "xls", "xlsx"}, true); + public static void excelConvertJson(String inputDir, String outputDir) throws Exception{ + var listFiles = FileUtils.listFiles(new File(inputDir), new String[] { "xls", "xlsx"}, true); for (var file : listFiles) { var fileName = getFileName(file); var inputStream = FileUtils.openInputStream(file); @@ -51,7 +49,7 @@ public class ExcelToJsonUtils { } } - public static void writeJsonFile(String outDir, String jsonStr, String name) { + private static void writeJsonFile(String outDir, String jsonStr, String name) { System.out.println("resource: " + name + ".txt"); PrintWriter pw = null; try { @@ -79,13 +77,13 @@ public class ExcelToJsonUtils { public static String read(InputStream inputStream, String fileName) { var wb = createWorkbook(inputStream, fileName); - var resource = new JsonResource(); + var resource = new ResourceConfig(); resource.setName(fileName); // 默认取到第一个sheet页 var sheet = wb.getSheetAt(0); //设置所有列 - var columns = getColumnMetas(sheet, fileName); - resource.setColumns(columns); + var headers = getHeaders(sheet, fileName); + resource.setHeader(headers); // 行数定位到有效数据行,默认是第四行为有效数据行 var iterator = sheet.iterator(); @@ -97,8 +95,8 @@ public class ExcelToJsonUtils { while (iterator.hasNext()) { var row = iterator.next(); List rowData = new ArrayList<>(); - for (var column : columns) { - var cell = row.getCell(column.getIndex()); + for (var header : headers) { + var cell = row.getCell(header.getIndex()); var content = CellUtils.getCellStringValue(cell); rowData.add(content); } @@ -109,7 +107,7 @@ public class ExcelToJsonUtils { } // 只读取代码里写的字段 - private static List getColumnMetas(Sheet sheet, String fileName) { + private static List
getHeaders(Sheet sheet, String fileName) { var iterator = sheet.iterator(); // 获取配置表的有效列名称,默认第一行就是字段名称 var fieldRow = iterator.next(); @@ -122,7 +120,7 @@ public class ExcelToJsonUtils { throw new RunException("无法获取资源[class:{}]的Excel文件的类型控制列", fileName); } - var columnMetaList = new ArrayList(); + var headerList = new ArrayList
(); var cellFieldMap = new HashMap(); for (var i = 0; i < fieldRow.getLastCellNum(); i++) { var fieldCell = fieldRow.getCell(i); @@ -145,9 +143,9 @@ public class ExcelToJsonUtils { if (Objects.nonNull(previousValue)) { throw new RunException("资源[class:{}]的Excel文件出现重复的属性控制列[field:{}]", fileName, fieldName); } - columnMetaList.add(new ColumnMeta(fieldName, typeName, i)); + headerList.add(new Header(fieldName, typeName, i)); } - return columnMetaList; + return headerList; } private static Workbook createWorkbook(InputStream input, String fileName) { @@ -157,6 +155,5 @@ public class ExcelToJsonUtils { throw new RunException("静态资源[{}]异常,无法读取文件", fileName); } } - } diff --git a/storage/src/main/resources/storage-1.0.xsd b/storage/src/main/resources/storage-1.0.xsd index 764685e1..f373f4cf 100644 --- a/storage/src/main/resources/storage-1.0.xsd +++ b/storage/src/main/resources/storage-1.0.xsd @@ -45,8 +45,6 @@ - - diff --git a/storage/src/test/java/com/zfoo/storage/ApplicationTest.java b/storage/src/test/java/com/zfoo/storage/ApplicationTest.java index 23435db0..eec5af52 100644 --- a/storage/src/test/java/com/zfoo/storage/ApplicationTest.java +++ b/storage/src/test/java/com/zfoo/storage/ApplicationTest.java @@ -45,35 +45,6 @@ public class ApplicationTest { // Excel的映射内容需要在被Spring管理的bean的方法上加上@ResInjection注解,即可自动注入Excel对应的对象 // 参考StudentManager中的标准用法 - var studentManager = context.getBean(StudentManager.class); - var studentResources = studentManager.studentResources; - // 类名称和Excel名称必须完全一致,Excel的列名称必须对应对象的属性名称 - for (StudentResource resource : studentResources.getAll()) { - logger.info(JsonUtils.object2String(resource)); - } - System.out.println(StringUtils.MULTIPLE_HYPHENS); - - // 通过id找到对应的行 - var id = 1000; - var valueById = studentResources.get(id); - logger.info(JsonUtils.object2String(valueById)); - System.out.println(StringUtils.MULTIPLE_HYPHENS); - - // 通过索引找对应的行 - var valuesByIndex = studentResources.getIndex("name", "james0"); - logger.info(JsonUtils.object2String(valuesByIndex)); - } - - @Test - public void startStorageTestTxt() { - // 加载配置文件,配置文件中必须引入storage - // 配置文件中scan,需要映射Excel的类所在位置,会自动搜索文件夹下的Excel文件,Excel文件可以放在指定文件夹的任意目录 - // 配置文件中resource,需要映射Excel的文件所在位置 - var context = new ClassPathXmlApplicationContext("application.xml"); - - // Excel的映射内容需要在被Spring管理的bean的方法上加上@ResInjection注解,即可自动注入Excel对应的对象 - // 参考StudentManager中的标准用法 - var studentManager = context.getBean(StudentManager.class); var studentResources = studentManager.studentResources; // 类名称和Excel名称必须完全一致,Excel的列名称必须对应对象的属性名称 @@ -92,16 +63,6 @@ public class ApplicationTest { // 通过索引找对应的行 var valuesByIndex = studentResources.getIndex("name", "james0"); logger.info(JsonUtils.object2String(valuesByIndex)); - } - - - // storage教程 - @Test - public void startStorageTestTxt2() { - // 加载配置文件,配置文件中必须引入storage - // 配置文件中scan,需要映射Excel的类所在位置,会自动搜索文件夹下的Excel文件,Excel文件可以放在指定文件夹的任意目录 - // 配置文件中resource,需要映射Excel的文件所在位置 - var context = new ClassPathXmlApplicationContext("application.xml"); // Excel的映射内容需要在被Spring管理的bean的方法上加上@ResInjection注解,即可自动注入Excel对应的对象 var testManager = context.getBean(TestManager.class); @@ -112,9 +73,10 @@ public class ApplicationTest { logger.info(JsonUtils.object2String(resource)); } // 通过id找到对应的行 - var id = 2; - var valueById = testResources.get(id); - logger.info(JsonUtils.object2String(valueById)); + id = 2; + var resource = testResources.get(id); + logger.info(JsonUtils.object2String(resource)); System.out.println(StringUtils.MULTIPLE_HYPHENS); } + } diff --git a/storage/src/test/java/com/zfoo/storage/TestManager.java b/storage/src/test/java/com/zfoo/storage/TestManager.java index 1de51a0c..fe3c9a29 100644 --- a/storage/src/test/java/com/zfoo/storage/TestManager.java +++ b/storage/src/test/java/com/zfoo/storage/TestManager.java @@ -24,7 +24,7 @@ import org.springframework.stereotype.Component; * @author jaysunxiao * @version 3.0 */ -//@Component +@Component public class TestManager { @ResInjection diff --git a/storage/src/test/java/com/zfoo/storage/excel/ExcelTest.java b/storage/src/test/java/com/zfoo/storage/excel/ExcelTest.java index 2e7220cd..ee3902a3 100644 --- a/storage/src/test/java/com/zfoo/storage/excel/ExcelTest.java +++ b/storage/src/test/java/com/zfoo/storage/excel/ExcelTest.java @@ -13,6 +13,7 @@ package com.zfoo.storage.excel; +import com.zfoo.storage.util.ExcelToJsonUtils; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; @@ -32,6 +33,13 @@ import java.util.Iterator; @Ignore public class ExcelTest { + @Test + public void excelConvertJson() throws Exception{ + String inputDir = "E:\\workspace\\zfoo\\storage\\src\\test\\resources\\excel"; + String outputDir = "E:\\workspace\\zfoo\\storage\\src\\test\\resources\\excel"; + ExcelToJsonUtils.excelConvertJson(inputDir, outputDir); + } + @Test public void createExcelTest() throws IOException { //第一步创建workbook diff --git a/storage/src/test/java/com/zfoo/storage/resource/TestResource.java b/storage/src/test/java/com/zfoo/storage/resource/TestResource.java index 81aedf19..beb01ee0 100644 --- a/storage/src/test/java/com/zfoo/storage/resource/TestResource.java +++ b/storage/src/test/java/com/zfoo/storage/resource/TestResource.java @@ -24,7 +24,7 @@ import com.zfoo.storage.model.anno.Resource; * @author jaysunxiao * @version 3.0 */ -//@Resource +@Resource public class TestResource { @Id diff --git a/storage/src/test/resources/excel/StudentResource.xlsx b/storage/src/test/resources/StudentResource.xlsx similarity index 100% rename from storage/src/test/resources/excel/StudentResource.xlsx rename to storage/src/test/resources/StudentResource.xlsx diff --git a/storage/src/test/resources/application.xml b/storage/src/test/resources/application.xml index 819e37fd..500143be 100644 --- a/storage/src/test/resources/application.xml +++ b/storage/src/test/resources/application.xml @@ -49,9 +49,8 @@ - - - + + \ No newline at end of file From 22acf58aa81cfaf85b8969756c7979d2440dba16 Mon Sep 17 00:00:00 2001 From: godotg Date: Thu, 7 Jul 2022 20:06:36 +0800 Subject: [PATCH 7/9] =?UTF-8?q?perf[aes]:=20=E6=8F=90=E7=A4=BAAes=E5=8A=A0?= =?UTF-8?q?=E5=AF=86=E7=9A=84=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/zfoo/util/security/AesUtils.java | 32 ++++++++++++------- .../com/zfoo/util/security/AesUtilsTest.java | 8 +++-- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/util/src/main/java/com/zfoo/util/security/AesUtils.java b/util/src/main/java/com/zfoo/util/security/AesUtils.java index 083c3738..a9806c47 100644 --- a/util/src/main/java/com/zfoo/util/security/AesUtils.java +++ b/util/src/main/java/com/zfoo/util/security/AesUtils.java @@ -20,6 +20,7 @@ import io.netty.util.concurrent.FastThreadLocal; import javax.crypto.Cipher; import javax.crypto.NoSuchPaddingException; import javax.crypto.spec.SecretKeySpec; +import java.security.InvalidKeyException; import java.security.Key; import java.security.NoSuchAlgorithmException; import java.util.Base64; @@ -46,13 +47,6 @@ public abstract class AesUtils { */ private static final String ALGORITHM_STR = "AES/ECB/PKCS5Padding"; - private static final FastThreadLocal LOCAL_CIPHER = new FastThreadLocal() { - @Override - protected Cipher initialValue() throws NoSuchPaddingException, NoSuchAlgorithmException { - return Cipher.getInstance(ALGORITHM_STR); - } - }; - static { try { KEY = new SecretKeySpec(KEY_STR.getBytes(StringUtils.DEFAULT_CHARSET_NAME), ALGORITHM); @@ -61,6 +55,24 @@ public abstract class AesUtils { } } + private static final FastThreadLocal LOCAL_ENCRYPT_CIPHER = new FastThreadLocal() { + @Override + protected Cipher initialValue() throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException { + var cipher = Cipher.getInstance(ALGORITHM_STR); + cipher.init(Cipher.ENCRYPT_MODE, KEY); + return cipher; + } + }; + + private static final FastThreadLocal LOCAL_DECRYPT_CIPHER = new FastThreadLocal() { + @Override + protected Cipher initialValue() throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException { + var cipher = Cipher.getInstance(ALGORITHM_STR); + cipher.init(Cipher.DECRYPT_MODE, KEY); + return cipher; + } + }; + /** * 对str进行AES加密 @@ -81,8 +93,7 @@ public abstract class AesUtils { public static byte[] encrypt(byte[] bytes) { try { - var cipher = LOCAL_CIPHER.get(); - cipher.init(Cipher.ENCRYPT_MODE, KEY); + var cipher = LOCAL_ENCRYPT_CIPHER.get(); return cipher.doFinal(bytes); } catch (Exception e) { throw new RuntimeException(e); @@ -108,8 +119,7 @@ public abstract class AesUtils { public static byte[] decrypt(byte[] bytes) { try { - var cipher = LOCAL_CIPHER.get(); - cipher.init(Cipher.DECRYPT_MODE, KEY); + var cipher = LOCAL_DECRYPT_CIPHER.get(); return cipher.doFinal(bytes); } catch (Exception e) { throw new RuntimeException(e); diff --git a/util/src/test/java/com/zfoo/util/security/AesUtilsTest.java b/util/src/test/java/com/zfoo/util/security/AesUtilsTest.java index 977fdd68..cdaf5a8b 100644 --- a/util/src/test/java/com/zfoo/util/security/AesUtilsTest.java +++ b/util/src/test/java/com/zfoo/util/security/AesUtilsTest.java @@ -23,9 +23,11 @@ public class AesUtilsTest { @Test public void test() { - String passWord = "hello world"; - String encodePassWorld = AesUtils.getEncryptString(passWord); - Assert.assertEquals(passWord, AesUtils.getDecryptString(encodePassWorld)); + for (int i = 0; i < 10; i++) { + var passWord = "hello world"; + var encodePassWorld = AesUtils.getEncryptString(passWord); + Assert.assertEquals(passWord, AesUtils.getDecryptString(encodePassWorld)); + } } } From a3c0f0346b89e93d70d00715841cd395e4071f2e Mon Sep 17 00:00:00 2001 From: godotg Date: Thu, 7 Jul 2022 20:22:31 +0800 Subject: [PATCH 8/9] =?UTF-8?q?perf[aes]:=20=E6=8F=90=E5=8D=87Aes=E5=8A=A0?= =?UTF-8?q?=E5=AF=86=E7=9A=84=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- util/src/main/java/com/zfoo/util/security/AesUtils.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/util/src/main/java/com/zfoo/util/security/AesUtils.java b/util/src/main/java/com/zfoo/util/security/AesUtils.java index a9806c47..c1e68242 100644 --- a/util/src/main/java/com/zfoo/util/security/AesUtils.java +++ b/util/src/main/java/com/zfoo/util/security/AesUtils.java @@ -30,7 +30,7 @@ import java.util.Base64; *

* 默认AES/ECB/PKCS5Padding * - * @author jaysunxiao + * @author godotg * @version 3.0 */ public abstract class AesUtils { @@ -93,8 +93,7 @@ public abstract class AesUtils { public static byte[] encrypt(byte[] bytes) { try { - var cipher = LOCAL_ENCRYPT_CIPHER.get(); - return cipher.doFinal(bytes); + return LOCAL_ENCRYPT_CIPHER.get().doFinal(bytes); } catch (Exception e) { throw new RuntimeException(e); } @@ -119,8 +118,7 @@ public abstract class AesUtils { public static byte[] decrypt(byte[] bytes) { try { - var cipher = LOCAL_DECRYPT_CIPHER.get(); - return cipher.doFinal(bytes); + return LOCAL_DECRYPT_CIPHER.get().doFinal(bytes); } catch (Exception e) { throw new RuntimeException(e); } From 3e0f78aaa1728d868ab125155fa7fa49fae0fa35 Mon Sep 17 00:00:00 2001 From: meiwei <309921330@qq.com> Date: Thu, 7 Jul 2022 20:39:38 +0800 Subject: [PATCH 9/9] =?UTF-8?q?perf[storage]:=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BA=86=E9=85=8D=E7=BD=AE=E8=A1=A8=E8=AF=BB=E5=8F=96=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zfoo/boot/StorageAutoConfiguration.java | 5 +- .../test/resources/excel/StudentResource.txt | 78 ------------------ .../test/resources/excel/StudentResource.xlsx | Bin 0 -> 10035 bytes .../src/test/resources/excel/TestResource.txt | 2 +- 4 files changed, 4 insertions(+), 81 deletions(-) delete mode 100644 storage/src/test/resources/excel/StudentResource.txt create mode 100644 storage/src/test/resources/excel/StudentResource.xlsx diff --git a/boot/src/main/java/com/zfoo/boot/StorageAutoConfiguration.java b/boot/src/main/java/com/zfoo/boot/StorageAutoConfiguration.java index 5486f90d..5432a6d7 100644 --- a/boot/src/main/java/com/zfoo/boot/StorageAutoConfiguration.java +++ b/boot/src/main/java/com/zfoo/boot/StorageAutoConfiguration.java @@ -13,6 +13,7 @@ package com.zfoo.boot; import com.zfoo.storage.StorageContext; +import com.zfoo.storage.interpreter.ResourceReader; import com.zfoo.storage.manager.StorageManager; import com.zfoo.storage.model.config.StorageConfig; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; @@ -39,8 +40,8 @@ public class StorageAutoConfiguration { @Bean @ConditionalOnMissingBean - public ExcelResourceReader excelResourceReader() { - return new ExcelResourceReader(); + public ResourceReader excelResourceReader() { + return new ResourceReader(); } @Bean diff --git a/storage/src/test/resources/excel/StudentResource.txt b/storage/src/test/resources/excel/StudentResource.txt deleted file mode 100644 index 7d1d6053..00000000 --- a/storage/src/test/resources/excel/StudentResource.txt +++ /dev/null @@ -1,78 +0,0 @@ -{ - "name" : "StudentResource", - "columns" : [ - { - "name" : "id", - "type" : "string", - "index" : 0 - }, - { - "name" : "name", - "type" : "string", - "index" : 1 - }, - { - "name" : "age", - "type" : "int", - "index" : 2 - }, - { - "name" : "score", - "type" : "float", - "index" : 3 - }, - { - "name" : "courses", - "type" : "array", - "index" : 4 - }, - { - "name" : "users", - "type" : "array", - "index" : 5 - }, - { - "name" : "user", - "type" : "string", - "index" : 6 - } - ], - "data" : [ - [ - "1000", - "james0", - "10", - "60.8", - "[\"History\",\"Chiness\"]", - "[{\"id\":\"1000\",\"name\":\"SunInsanity\",\"sex\":\"boy\",\"age\":22},{\"id\":\"1000\",\"name\":\"SunInsanity\",\"sex\":\"boy\",\"age\":22}]", - "{\"id\":\"1000\",\"name\":\"SunInsanity\",\"sex\":\"boy\",\"age\":22}" - ], - [ - "1001", - "james1", - "10", - "70.1", - "[\"History\",\"Chiness\"]", - "[{\"id\":\"1000\",\"name\":\"SunInsanity\",\"sex\":\"boy\",\"age\":22},{\"id\":\"1000\",\"name\":\"SunInsanity\",\"sex\":\"boy\",\"age\":23}]", - "{\"id\":\"1000\",\"name\":\"SunInsanity\",\"sex\":\"boy\",\"age\":22}" - ], - [ - "1002", - "james2", - "10", - "80.2", - "[\"History\",\"Chiness\"]", - "[{\"id\":\"1000\",\"name\":\"SunInsanity\",\"sex\":\"boy\",\"age\":22},{\"id\":\"1000\",\"name\":\"SunInsanity\",\"sex\":\"boy\",\"age\":24}]", - "{\"id\":\"1000\",\"name\":\"SunInsanity\",\"sex\":\"boy\",\"age\":22}" - ], - [ - "1003", - "james3", - "10", - "59", - "[\"History\",\"Chiness\"]", - "[{\"id\":\"1000\",\"name\":\"SunInsanity\",\"sex\":\"boy\",\"age\":22},{\"id\":\"1000\",\"name\":\"SunInsanity\",\"sex\":\"boy\",\"age\":25}]", - "{\"id\":\"1000\",\"name\":\"SunInsanity\",\"sex\":\"boy\",\"age\":22}" - ] - ] -} \ No newline at end of file diff --git a/storage/src/test/resources/excel/StudentResource.xlsx b/storage/src/test/resources/excel/StudentResource.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d7378b7a60000be9ed5a13782afd0f5c7adfa986 GIT binary patch literal 10035 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 W72qH~2mqi!el!p_zW7NW!2ba{XC@B- literal 0 HcmV?d00001 diff --git a/storage/src/test/resources/excel/TestResource.txt b/storage/src/test/resources/excel/TestResource.txt index 8505908b..99b958f6 100644 --- a/storage/src/test/resources/excel/TestResource.txt +++ b/storage/src/test/resources/excel/TestResource.txt @@ -1,6 +1,6 @@ { "name": "Test", - "columns": [ + "header": [ { "name": "Id", "type": "int",