From ba3e9051bca2eb10968e2e3f5b6f0cfa89f1697b Mon Sep 17 00:00:00 2001 From: godot Date: Fri, 8 Jul 2022 15:34:10 +0800 Subject: [PATCH] =?UTF-8?q?perf[storage]:=20=E4=BC=98=E5=8C=96storage?= =?UTF-8?q?=EF=BC=8C=E8=B0=83=E6=95=B4=E4=BA=86=E7=BB=93=E6=9E=84=E5=B9=B6?= =?UTF-8?q?=E5=87=8F=E5=B0=91=E4=BA=86=E9=87=8D=E5=A4=8D=E7=9A=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/zfoo/protocol/util/JsonUtils.java | 20 ++- .../com/zfoo/protocol/util/JsonUtilTest.java | 11 +- .../java/com/zfoo/storage/StorageContext.java | 4 +- .../storage/interpreter/IResourceReader.java | 7 +- .../storage/interpreter/ResourceConfig.java | 83 ------------ .../storage/interpreter/ResourceReader.java | 125 +++--------------- .../zfoo/storage/manager/IStorageManager.java | 4 +- .../zfoo/storage/manager/StorageManager.java | 4 +- .../java/com/zfoo/storage/model/anno/Id.java | 4 +- .../com/zfoo/storage/model/anno/Index.java | 4 +- .../zfoo/storage/model/anno/ResInjection.java | 4 +- .../com/zfoo/storage/model/anno/Resource.java | 4 +- .../storage/model/config/StorageConfig.java | 4 +- .../storage/model/resource/ResourceData.java | 56 ++++++++ .../storage/model/resource/ResourceEnum.java | 65 +++++++++ .../model/resource/ResourceHeader.java | 61 +++++++++ .../java/com/zfoo/storage/model/vo/IdDef.java | 4 +- .../com/zfoo/storage/model/vo/IndexDef.java | 4 +- .../zfoo/storage/model/vo/ResourceDef.java | 4 +- .../com/zfoo/storage/model/vo/Storage.java | 4 +- .../zfoo/storage/schema/NamespaceHandler.java | 4 +- .../schema/StorageDefinitionParser.java | 4 +- .../strategy/JsonToArrayConverter.java | 4 +- .../storage/strategy/JsonToMapConverter.java | 4 +- .../strategy/JsonToObjectConverter.java | 4 +- .../strategy/StringToClassConverter.java | 4 +- .../strategy/StringToDateConverter.java | 4 +- .../strategy/StringToMapConverter.java | 4 +- .../java/com/zfoo/storage/util/CellUtils.java | 4 +- .../zfoo/storage/util/ExcelToJsonUtils.java | 93 +++++-------- .../com/zfoo/storage/ApplicationTest.java | 4 +- .../java/com/zfoo/storage/StudentManager.java | 4 +- .../java/com/zfoo/storage/TestManager.java | 6 +- .../storage/conversion/ConversionTest.java | 4 +- .../com/zfoo/storage/excel/ExcelTest.java | 4 +- .../zfoo/storage/pathmatch/PathMatchTest.java | 4 +- .../java/com/zfoo/storage/resource/Item.java | 4 +- .../storage/resource/StudentResource.java | 4 +- .../zfoo/storage/resource/TestResource.java | 10 +- .../java/com/zfoo/storage/resource/User.java | 4 +- .../{TestResource.txt => TestResource.json} | 8 +- 41 files changed, 326 insertions(+), 335 deletions(-) delete mode 100644 storage/src/main/java/com/zfoo/storage/interpreter/ResourceConfig.java create mode 100644 storage/src/main/java/com/zfoo/storage/model/resource/ResourceData.java create mode 100644 storage/src/main/java/com/zfoo/storage/model/resource/ResourceEnum.java create mode 100644 storage/src/main/java/com/zfoo/storage/model/resource/ResourceHeader.java rename storage/src/test/resources/excel/{TestResource.txt => TestResource.json} (97%) 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 79e5af59..f9a1e6cb 100644 --- a/protocol/src/main/java/com/zfoo/protocol/util/JsonUtils.java +++ b/protocol/src/main/java/com/zfoo/protocol/util/JsonUtils.java @@ -14,13 +14,11 @@ 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; @@ -29,7 +27,7 @@ import java.io.IOException; import java.util.*; /** - * @author jaysunxiao + * @author godotg * @version 3.0 */ public abstract class JsonUtils { @@ -58,12 +56,10 @@ 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); + DefaultPrettyPrinter prettyPrinter = (DefaultPrettyPrinter) MAPPER.getSerializationConfig().getDefaultPrettyPrinter(); + DefaultPrettyPrinter.Indenter indenter = new DefaultIndenter(StringUtils.TAB_ASCII, FileUtils.LS); + prettyPrinter.indentObjectsWith(indenter); + prettyPrinter.indentArraysWith(indenter); MAPPER_TURBO.setSerializationInclusion(JsonInclude.Include.NON_NULL); MAPPER_TURBO.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); @@ -88,7 +84,7 @@ public abstract class JsonUtils { } } - //格式化/美化/优雅的输出 + // 格式化/美化/优雅的输出 public static String object2StringPrettyPrinter(Object object) { try { return MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(object); @@ -214,9 +210,9 @@ public abstract class JsonUtils { // 循环遍历子节点下的信息 while (iterator.hasNext()) { var node = iterator.next(); - var filed = node.getKey(); + var field = node.getKey(); var value = node.getValue().asText(); - jsonMap.put(filed, value); + jsonMap.put(field, value); } } return jsonMap; diff --git a/protocol/src/test/java/com/zfoo/protocol/util/JsonUtilTest.java b/protocol/src/test/java/com/zfoo/protocol/util/JsonUtilTest.java index 3a42e20b..ed51017d 100644 --- a/protocol/src/test/java/com/zfoo/protocol/util/JsonUtilTest.java +++ b/protocol/src/test/java/com/zfoo/protocol/util/JsonUtilTest.java @@ -10,7 +10,6 @@ * See the License for the specific language governing permissions and limitations under the License. * */ - package com.zfoo.protocol.util; import com.zfoo.protocol.model.Triple; @@ -21,11 +20,9 @@ import org.junit.Test; import java.util.*; /** - * @author jaysunxiao + * @author godotg * @version 3.0 */ - - public class JsonUtilTest { public static String id = "\"id\":\"1000\""; @@ -114,5 +111,11 @@ public class JsonUtilTest { var tripleStr = JsonUtils.object2String(triple); var temp = JsonUtils.string2Object(tripleStr, Triple.class); } + + @Test + public void prettyPrinterTest() { + var user = JsonUtils.string2Object(userJson, User.class); + System.out.println(JsonUtils.object2StringPrettyPrinter(user)); + } } diff --git a/storage/src/main/java/com/zfoo/storage/StorageContext.java b/storage/src/main/java/com/zfoo/storage/StorageContext.java index fbacd23e..08614ceb 100644 --- a/storage/src/main/java/com/zfoo/storage/StorageContext.java +++ b/storage/src/main/java/com/zfoo/storage/StorageContext.java @@ -26,8 +26,8 @@ import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.core.Ordered; /** - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ public class StorageContext implements ApplicationListener, Ordered { 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 7eda29cb..a4c1737d 100644 --- a/storage/src/main/java/com/zfoo/storage/interpreter/IResourceReader.java +++ b/storage/src/main/java/com/zfoo/storage/interpreter/IResourceReader.java @@ -13,6 +13,7 @@ package com.zfoo.storage.interpreter; +import java.io.IOException; import java.io.InputStream; import java.util.List; @@ -22,11 +23,11 @@ import java.util.List; * interpreter [in'ter·pret·er || ɪn'tɜrprɪtə(r) /-'tɜːp-] * n. 直译程序, 翻译员, 解释者 * - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ public interface IResourceReader { - List read(InputStream inputStream, Class clazz, String suffix); + List read(InputStream inputStream, Class clazz, String suffix) throws IOException; } diff --git a/storage/src/main/java/com/zfoo/storage/interpreter/ResourceConfig.java b/storage/src/main/java/com/zfoo/storage/interpreter/ResourceConfig.java deleted file mode 100644 index ee5d77c2..00000000 --- a/storage/src/main/java/com/zfoo/storage/interpreter/ResourceConfig.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.zfoo.storage.interpreter; - -import java.util.ArrayList; -import java.util.List; - -/** - * 配置文件资源 - * - */ -public class ResourceConfig { - // 文件名 - private String name; - //配置表字段名 - private List
header = new ArrayList<>(); - // 配置表数据 - private List> data = new ArrayList<>(); - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public List
getHeader() { - return header; - } - - public void setHeader(List
header) { - this.header = header; - } - - public List> getData() { - return data; - } - - public void setData(List> data) { - this.data = data; - } - - public static class Header { - //字段名 - private String name; - //类型 - private String type; - //列 - private int index; - - public Header() { - } - - public Header(String name, String type, int index) { - this.name = name; - this.type = type; - this.index = index; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getType() { - return type; - } - - 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/interpreter/ResourceReader.java b/storage/src/main/java/com/zfoo/storage/interpreter/ResourceReader.java index 3137c152..0b62bad6 100644 --- a/storage/src/main/java/com/zfoo/storage/interpreter/ResourceReader.java +++ b/storage/src/main/java/com/zfoo/storage/interpreter/ResourceReader.java @@ -10,20 +10,18 @@ * 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.interpreter; import com.zfoo.protocol.exception.RunException; +import com.zfoo.protocol.util.IOUtils; 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.model.resource.ResourceData; +import com.zfoo.storage.model.resource.ResourceEnum; import com.zfoo.storage.strategy.*; -import com.zfoo.storage.util.CellUtils; - -import org.apache.commons.io.IOUtils; -import org.apache.poi.ss.usermodel.Sheet; +import com.zfoo.storage.util.ExcelToJsonUtils; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import org.springframework.context.support.ConversionServiceFactoryBean; @@ -33,13 +31,12 @@ 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; /** - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ public class ResourceReader implements IResourceReader { @@ -60,20 +57,23 @@ public class ResourceReader implements IResourceReader { } @Override - 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()); - } - + public List read(InputStream inputStream, Class clazz, String suffix) throws IOException { + ResourceData resource = null; + var resourceEnum = ResourceEnum.getResourceEnumByType(suffix); + if (resourceEnum == ResourceEnum.JSON) { + resource = JsonUtils.string2Object(StringUtils.bytesToString(IOUtils.toByteArray(inputStream)), ResourceData.class); + } else if (resourceEnum == ResourceEnum.EXCEL_XLS || resourceEnum == ResourceEnum.EXCEL_XLSX) { + resource = ExcelToJsonUtils.readResourceDataFromExcel(inputStream, clazz.getSimpleName()); + } else { + throw new RunException("不支持文件[{}]的配置类型[{}]", clazz.getSimpleName(), suffix); + } + var result = new ArrayList(); //获取所有字段 var cellFieldMap = getFieldMap(resource, clazz); var fieldInfos = getFieldInfos(cellFieldMap, clazz); - var iterator = resource.getData().iterator(); + var iterator = resource.getRows().iterator(); // 从ROW_SERVER这行开始读取数据 while (iterator.hasNext()) { var row = iterator.next(); @@ -89,81 +89,7 @@ public class ResourceReader 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); @@ -229,9 +155,9 @@ public class ResourceReader implements IResourceReader { this.field = field; } } - - public Map getFieldMap(ResourceConfig resource, Class clazz) { - var header = resource.getHeader(); + + public Map getFieldMap(ResourceData resource, Class clazz) { + var header = resource.getHeaders(); if (header == null) { throw new RunException("无法获取资源[class:{}]的Excel文件的属性控制列", clazz.getSimpleName()); } @@ -255,13 +181,4 @@ public class ResourceReader implements IResourceReader { 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/IStorageManager.java b/storage/src/main/java/com/zfoo/storage/manager/IStorageManager.java index 1d261ce7..2dd72f61 100644 --- a/storage/src/main/java/com/zfoo/storage/manager/IStorageManager.java +++ b/storage/src/main/java/com/zfoo/storage/manager/IStorageManager.java @@ -19,8 +19,8 @@ import org.springframework.lang.Nullable; import java.util.Map; /** - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ public interface IStorageManager { 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 19b91a3a..6280fe51 100644 --- a/storage/src/main/java/com/zfoo/storage/manager/StorageManager.java +++ b/storage/src/main/java/com/zfoo/storage/manager/StorageManager.java @@ -38,8 +38,8 @@ import java.lang.reflect.Type; import java.util.*; /** - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ public class StorageManager implements IStorageManager { diff --git a/storage/src/main/java/com/zfoo/storage/model/anno/Id.java b/storage/src/main/java/com/zfoo/storage/model/anno/Id.java index fd5f0e2f..1b36aa42 100644 --- a/storage/src/main/java/com/zfoo/storage/model/anno/Id.java +++ b/storage/src/main/java/com/zfoo/storage/model/anno/Id.java @@ -19,8 +19,8 @@ import java.lang.annotation.*; /** * 主键 * - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ @Documented diff --git a/storage/src/main/java/com/zfoo/storage/model/anno/Index.java b/storage/src/main/java/com/zfoo/storage/model/anno/Index.java index d1f56f82..3c4b9aed 100644 --- a/storage/src/main/java/com/zfoo/storage/model/anno/Index.java +++ b/storage/src/main/java/com/zfoo/storage/model/anno/Index.java @@ -18,8 +18,8 @@ import java.lang.annotation.*; /** * 索引,索引的名称使用字段属性的名称,用HaspMap实现 * - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ @Documented diff --git a/storage/src/main/java/com/zfoo/storage/model/anno/ResInjection.java b/storage/src/main/java/com/zfoo/storage/model/anno/ResInjection.java index 12cd734f..b243c4ef 100644 --- a/storage/src/main/java/com/zfoo/storage/model/anno/ResInjection.java +++ b/storage/src/main/java/com/zfoo/storage/model/anno/ResInjection.java @@ -18,8 +18,8 @@ import java.lang.annotation.*; /** * 静态数据的注入 * - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ @Documented diff --git a/storage/src/main/java/com/zfoo/storage/model/anno/Resource.java b/storage/src/main/java/com/zfoo/storage/model/anno/Resource.java index 3f809a1b..595b9349 100644 --- a/storage/src/main/java/com/zfoo/storage/model/anno/Resource.java +++ b/storage/src/main/java/com/zfoo/storage/model/anno/Resource.java @@ -18,8 +18,8 @@ import java.lang.annotation.*; /** * 资源注解 * - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ @Documented @Retention(RetentionPolicy.RUNTIME) 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 5136b5db..d40fd63a 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 @@ -14,8 +14,8 @@ package com.zfoo.storage.model.config; /** - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ public class StorageConfig { diff --git a/storage/src/main/java/com/zfoo/storage/model/resource/ResourceData.java b/storage/src/main/java/com/zfoo/storage/model/resource/ResourceData.java new file mode 100644 index 00000000..14c8908b --- /dev/null +++ b/storage/src/main/java/com/zfoo/storage/model/resource/ResourceData.java @@ -0,0 +1,56 @@ +/* + * 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.model.resource; + +import java.util.ArrayList; +import java.util.List; + +/** + * 配置文件资源 + * + * @author meiwei666 + */ +public class ResourceData { + + // 文件名 + private String name; + // 配置表字段名 + private List headers = new ArrayList<>(); + // 配置表数据 + private List> rows = new ArrayList<>(); + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getHeaders() { + return headers; + } + + public void setHeaders(List headers) { + this.headers = headers; + } + + public List> getRows() { + return rows; + } + + public void setRows(List> rows) { + this.rows = rows; + } + +} diff --git a/storage/src/main/java/com/zfoo/storage/model/resource/ResourceEnum.java b/storage/src/main/java/com/zfoo/storage/model/resource/ResourceEnum.java new file mode 100644 index 00000000..39947d0b --- /dev/null +++ b/storage/src/main/java/com/zfoo/storage/model/resource/ResourceEnum.java @@ -0,0 +1,65 @@ +/* + * 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.model.resource; + +import com.zfoo.protocol.util.AssertionUtils; +import org.springframework.lang.Nullable; + +import java.util.HashMap; +import java.util.Map; + +/** + * 支持读取配置文件的类型后缀 + * + * @author godotg + * @version 4.0 + */ +public enum ResourceEnum { + + EXCEL_XLS("xls"), + + EXCEL_XLSX("xlsx"), + + JSON("json"), + + ; + + private static Map typeMap = new HashMap<>(); + + static { + for (var resourceEnum : ResourceEnum.values()) { + var previousValue = typeMap.putIfAbsent(resourceEnum.type, resourceEnum); + AssertionUtils.isNull(previousValue, "ResourceEnum中不应该含有重复type的枚举类[{}]和[{}]", resourceEnum, previousValue); + } + } + + private String type; + + ResourceEnum(String type) { + this.type = type; + } + + @Nullable + public static ResourceEnum getResourceEnumByType(String type) { + return typeMap.get(type); + } + + public static boolean containsResourceEnum(String type) { + return typeMap.containsKey(type); + } + + public String getType() { + return type; + } + +} diff --git a/storage/src/main/java/com/zfoo/storage/model/resource/ResourceHeader.java b/storage/src/main/java/com/zfoo/storage/model/resource/ResourceHeader.java new file mode 100644 index 00000000..9ca387aa --- /dev/null +++ b/storage/src/main/java/com/zfoo/storage/model/resource/ResourceHeader.java @@ -0,0 +1,61 @@ +/* + * 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.model.resource; + +/** + * @author godotg + * @version 4.0 + */ +public class ResourceHeader { + + //字段名 + private String name; + //类型 + private String type; + //列 + private int index; + + public ResourceHeader() { + } + + public ResourceHeader(String name, String type, int index) { + this.name = name; + this.type = type; + this.index = index; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + 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/model/vo/IdDef.java b/storage/src/main/java/com/zfoo/storage/model/vo/IdDef.java index 0d6e2a0f..7a521e1d 100644 --- a/storage/src/main/java/com/zfoo/storage/model/vo/IdDef.java +++ b/storage/src/main/java/com/zfoo/storage/model/vo/IdDef.java @@ -20,8 +20,8 @@ import com.zfoo.storage.model.anno.Id; import java.lang.reflect.Field; /** - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ public class IdDef { diff --git a/storage/src/main/java/com/zfoo/storage/model/vo/IndexDef.java b/storage/src/main/java/com/zfoo/storage/model/vo/IndexDef.java index eefaae4a..02316216 100644 --- a/storage/src/main/java/com/zfoo/storage/model/vo/IndexDef.java +++ b/storage/src/main/java/com/zfoo/storage/model/vo/IndexDef.java @@ -27,8 +27,8 @@ import java.util.Map; /** * 简化索引的名称,使用字段的名称作为索引的名称 * - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ public class IndexDef { diff --git a/storage/src/main/java/com/zfoo/storage/model/vo/ResourceDef.java b/storage/src/main/java/com/zfoo/storage/model/vo/ResourceDef.java index 70c73e88..d82e4355 100644 --- a/storage/src/main/java/com/zfoo/storage/model/vo/ResourceDef.java +++ b/storage/src/main/java/com/zfoo/storage/model/vo/ResourceDef.java @@ -16,8 +16,8 @@ package com.zfoo.storage.model.vo; import org.springframework.core.io.Resource; /** - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ public class ResourceDef { 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 a498f7ba..d13d1220 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 @@ -25,8 +25,8 @@ import java.io.InputStream; import java.util.*; /** - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ public class Storage { diff --git a/storage/src/main/java/com/zfoo/storage/schema/NamespaceHandler.java b/storage/src/main/java/com/zfoo/storage/schema/NamespaceHandler.java index 0526bdf9..4f17dbd4 100644 --- a/storage/src/main/java/com/zfoo/storage/schema/NamespaceHandler.java +++ b/storage/src/main/java/com/zfoo/storage/schema/NamespaceHandler.java @@ -16,8 +16,8 @@ package com.zfoo.storage.schema; import org.springframework.beans.factory.xml.NamespaceHandlerSupport; /** - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ public class NamespaceHandler extends NamespaceHandlerSupport { 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 430fa8ff..87a53520 100644 --- a/storage/src/main/java/com/zfoo/storage/schema/StorageDefinitionParser.java +++ b/storage/src/main/java/com/zfoo/storage/schema/StorageDefinitionParser.java @@ -26,8 +26,8 @@ import org.springframework.beans.factory.xml.ParserContext; import org.w3c.dom.Element; /** - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ public class StorageDefinitionParser implements BeanDefinitionParser { diff --git a/storage/src/main/java/com/zfoo/storage/strategy/JsonToArrayConverter.java b/storage/src/main/java/com/zfoo/storage/strategy/JsonToArrayConverter.java index 7c92bd83..e7614ec8 100644 --- a/storage/src/main/java/com/zfoo/storage/strategy/JsonToArrayConverter.java +++ b/storage/src/main/java/com/zfoo/storage/strategy/JsonToArrayConverter.java @@ -22,8 +22,8 @@ import java.util.Collections; import java.util.Set; /** - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ public class JsonToArrayConverter implements ConditionalGenericConverter { diff --git a/storage/src/main/java/com/zfoo/storage/strategy/JsonToMapConverter.java b/storage/src/main/java/com/zfoo/storage/strategy/JsonToMapConverter.java index a65c035b..d60bb2cb 100644 --- a/storage/src/main/java/com/zfoo/storage/strategy/JsonToMapConverter.java +++ b/storage/src/main/java/com/zfoo/storage/strategy/JsonToMapConverter.java @@ -22,8 +22,8 @@ import java.util.Map; import java.util.Set; /** - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ public class JsonToMapConverter implements ConditionalGenericConverter { @Override diff --git a/storage/src/main/java/com/zfoo/storage/strategy/JsonToObjectConverter.java b/storage/src/main/java/com/zfoo/storage/strategy/JsonToObjectConverter.java index 4599615a..5b142d7b 100644 --- a/storage/src/main/java/com/zfoo/storage/strategy/JsonToObjectConverter.java +++ b/storage/src/main/java/com/zfoo/storage/strategy/JsonToObjectConverter.java @@ -24,8 +24,8 @@ import java.util.Set; /** * 转换一个String到一个POJO对象,且这个对象不能继承如何接口 * - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ public class JsonToObjectConverter implements ConditionalGenericConverter { diff --git a/storage/src/main/java/com/zfoo/storage/strategy/StringToClassConverter.java b/storage/src/main/java/com/zfoo/storage/strategy/StringToClassConverter.java index c71741af..1828ca99 100644 --- a/storage/src/main/java/com/zfoo/storage/strategy/StringToClassConverter.java +++ b/storage/src/main/java/com/zfoo/storage/strategy/StringToClassConverter.java @@ -18,8 +18,8 @@ import com.zfoo.storage.StorageContext; import org.springframework.core.convert.converter.Converter; /** - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ public class StringToClassConverter implements Converter> { diff --git a/storage/src/main/java/com/zfoo/storage/strategy/StringToDateConverter.java b/storage/src/main/java/com/zfoo/storage/strategy/StringToDateConverter.java index 3d0a3761..f1b332e0 100644 --- a/storage/src/main/java/com/zfoo/storage/strategy/StringToDateConverter.java +++ b/storage/src/main/java/com/zfoo/storage/strategy/StringToDateConverter.java @@ -21,8 +21,8 @@ import java.text.SimpleDateFormat; import java.util.Date; /** - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ public class StringToDateConverter implements Converter { diff --git a/storage/src/main/java/com/zfoo/storage/strategy/StringToMapConverter.java b/storage/src/main/java/com/zfoo/storage/strategy/StringToMapConverter.java index 1bc2a363..05c8ad0a 100644 --- a/storage/src/main/java/com/zfoo/storage/strategy/StringToMapConverter.java +++ b/storage/src/main/java/com/zfoo/storage/strategy/StringToMapConverter.java @@ -19,8 +19,8 @@ import org.springframework.core.convert.converter.Converter; import java.util.Map; /** - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ public class StringToMapConverter implements Converter> { @Override diff --git a/storage/src/main/java/com/zfoo/storage/util/CellUtils.java b/storage/src/main/java/com/zfoo/storage/util/CellUtils.java index d2f942d3..e60fd680 100644 --- a/storage/src/main/java/com/zfoo/storage/util/CellUtils.java +++ b/storage/src/main/java/com/zfoo/storage/util/CellUtils.java @@ -20,8 +20,8 @@ import org.apache.poi.ss.usermodel.DateUtil; import org.apache.poi.ss.usermodel.FormulaError; /** - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ public abstract class CellUtils { 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 a5d52d58..2274e404 100644 --- a/storage/src/main/java/com/zfoo/storage/util/ExcelToJsonUtils.java +++ b/storage/src/main/java/com/zfoo/storage/util/ExcelToJsonUtils.java @@ -14,76 +14,55 @@ package com.zfoo.storage.util; import com.zfoo.protocol.exception.RunException; +import com.zfoo.protocol.util.FileUtils; import com.zfoo.protocol.util.JsonUtils; import com.zfoo.protocol.util.StringUtils; -import com.zfoo.storage.interpreter.ResourceConfig; -import com.zfoo.storage.interpreter.ResourceConfig.Header; - -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 com.zfoo.storage.model.resource.ResourceData; +import com.zfoo.storage.model.resource.ResourceEnum; +import com.zfoo.storage.model.resource.ResourceHeader; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + /** * @author meiwei666 - * @version 3.0 + * @version 4.0 */ public class ExcelToJsonUtils { - - public static void excelConvertJson(String inputDir, String outputDir) throws Exception{ - var listFiles = FileUtils.listFiles(new File(inputDir), new String[] { "xls", "xlsx"}, true); + + public static void excelConvertJson(String inputDir, String outputDir) throws IOException { + var listFiles = FileUtils.getAllReadableFiles(new File(inputDir)) + .stream() + .filter(it -> ResourceEnum.containsResourceEnum(FileUtils.fileExtName(it.getName()))) + .collect(Collectors.toList()); + for (var file : listFiles) { - var fileName = getFileName(file); + var fileName = StringUtils.format("{}.json", FileUtils.fileSimpleName(file.getName())); var inputStream = FileUtils.openInputStream(file); - var jsonStr = read(inputStream, fileName); - writeJsonFile(outputDir, jsonStr, fileName); + var resourceData = readResourceDataFromExcel(inputStream, fileName); + FileUtils.writeStringToFile(new File(FileUtils.joinPath(outputDir, fileName)), JsonUtils.object2StringPrettyPrinter(resourceData)); } } - - private 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) { + public static ResourceData readResourceDataFromExcel(InputStream inputStream, String fileName) { + // 只读取代码里写的字段 var wb = createWorkbook(inputStream, fileName); - var resource = new ResourceConfig(); + var resource = new ResourceData(); resource.setName(fileName); // 默认取到第一个sheet页 var sheet = wb.getSheetAt(0); //设置所有列 var headers = getHeaders(sheet, fileName); - resource.setHeader(headers); + resource.setHeaders(headers); // 行数定位到有效数据行,默认是第四行为有效数据行 var iterator = sheet.iterator(); @@ -102,12 +81,12 @@ public class ExcelToJsonUtils { } data.add(rowData); } - resource.setData(data); - return JsonUtils.object2StringPrettyPrinter(resource); + resource.setRows(data); + return resource; } - + // 只读取代码里写的字段 - private static List
getHeaders(Sheet sheet, String fileName) { + private static List getHeaders(Sheet sheet, String fileName) { var iterator = sheet.iterator(); // 获取配置表的有效列名称,默认第一行就是字段名称 var fieldRow = iterator.next(); @@ -120,7 +99,7 @@ public class ExcelToJsonUtils { throw new RunException("无法获取资源[class:{}]的Excel文件的类型控制列", fileName); } - var headerList = new ArrayList
(); + var headerList = new ArrayList(); var cellFieldMap = new HashMap(); for (var i = 0; i < fieldRow.getLastCellNum(); i++) { var fieldCell = fieldRow.getCell(i); @@ -143,9 +122,9 @@ public class ExcelToJsonUtils { if (Objects.nonNull(previousValue)) { throw new RunException("资源[class:{}]的Excel文件出现重复的属性控制列[field:{}]", fileName, fieldName); } - headerList.add(new Header(fieldName, typeName, i)); + headerList.add(new ResourceHeader(fieldName, typeName, i)); } - return headerList; + return headerList; } private static Workbook createWorkbook(InputStream input, String fileName) { @@ -155,5 +134,5 @@ public class ExcelToJsonUtils { 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 eec5af52..4250cdcf 100644 --- a/storage/src/test/java/com/zfoo/storage/ApplicationTest.java +++ b/storage/src/test/java/com/zfoo/storage/ApplicationTest.java @@ -25,8 +25,8 @@ import org.springframework.context.support.ClassPathXmlApplicationContext; import java.util.Map; /** - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ @Ignore diff --git a/storage/src/test/java/com/zfoo/storage/StudentManager.java b/storage/src/test/java/com/zfoo/storage/StudentManager.java index a3f27229..06113f8b 100644 --- a/storage/src/test/java/com/zfoo/storage/StudentManager.java +++ b/storage/src/test/java/com/zfoo/storage/StudentManager.java @@ -19,8 +19,8 @@ import com.zfoo.storage.resource.StudentResource; import org.springframework.stereotype.Component; /** - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ @Component public class StudentManager { diff --git a/storage/src/test/java/com/zfoo/storage/TestManager.java b/storage/src/test/java/com/zfoo/storage/TestManager.java index fe3c9a29..fe5f1e76 100644 --- a/storage/src/test/java/com/zfoo/storage/TestManager.java +++ b/storage/src/test/java/com/zfoo/storage/TestManager.java @@ -15,14 +15,12 @@ package com.zfoo.storage; import com.zfoo.storage.model.anno.ResInjection; import com.zfoo.storage.model.vo.Storage; -import com.zfoo.storage.resource.StudentResource; import com.zfoo.storage.resource.TestResource; - import org.springframework.stereotype.Component; /** - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ @Component public class TestManager { 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 f8fbfbea..bab96873 100644 --- a/storage/src/test/java/com/zfoo/storage/conversion/ConversionTest.java +++ b/storage/src/test/java/com/zfoo/storage/conversion/ConversionTest.java @@ -29,8 +29,8 @@ import java.util.Map; import java.util.Set; /** - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ public class ConversionTest { private static final ConversionServiceFactoryBean csfb = new ConversionServiceFactoryBean(); 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 ee3902a3..46d84771 100644 --- a/storage/src/test/java/com/zfoo/storage/excel/ExcelTest.java +++ b/storage/src/test/java/com/zfoo/storage/excel/ExcelTest.java @@ -27,8 +27,8 @@ import java.io.IOException; import java.util.Iterator; /** - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ @Ignore public class ExcelTest { diff --git a/storage/src/test/java/com/zfoo/storage/pathmatch/PathMatchTest.java b/storage/src/test/java/com/zfoo/storage/pathmatch/PathMatchTest.java index 34950835..dd97ac44 100644 --- a/storage/src/test/java/com/zfoo/storage/pathmatch/PathMatchTest.java +++ b/storage/src/test/java/com/zfoo/storage/pathmatch/PathMatchTest.java @@ -22,8 +22,8 @@ import org.springframework.core.io.support.ResourcePatternResolver; import java.io.IOException; /** - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ @Ignore public class PathMatchTest { diff --git a/storage/src/test/java/com/zfoo/storage/resource/Item.java b/storage/src/test/java/com/zfoo/storage/resource/Item.java index 9ef9c45c..f1923ef1 100644 --- a/storage/src/test/java/com/zfoo/storage/resource/Item.java +++ b/storage/src/test/java/com/zfoo/storage/resource/Item.java @@ -14,8 +14,8 @@ package com.zfoo.storage.resource; /** - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ public class Item { 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 172c26e3..303a3a77 100644 --- a/storage/src/test/java/com/zfoo/storage/resource/StudentResource.java +++ b/storage/src/test/java/com/zfoo/storage/resource/StudentResource.java @@ -18,8 +18,8 @@ import com.zfoo.storage.model.anno.Index; import com.zfoo.storage.model.anno.Resource; /** - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ @Resource public class StudentResource { 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..1e9efe48 100644 --- a/storage/src/test/java/com/zfoo/storage/resource/TestResource.java +++ b/storage/src/test/java/com/zfoo/storage/resource/TestResource.java @@ -13,16 +13,14 @@ package com.zfoo.storage.resource; -import java.util.List; -import java.util.Map; - import com.zfoo.storage.model.anno.Id; -import com.zfoo.storage.model.anno.Index; import com.zfoo.storage.model.anno.Resource; +import java.util.Map; + /** - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ @Resource public class TestResource { diff --git a/storage/src/test/java/com/zfoo/storage/resource/User.java b/storage/src/test/java/com/zfoo/storage/resource/User.java index d648ba6d..6b72b80a 100644 --- a/storage/src/test/java/com/zfoo/storage/resource/User.java +++ b/storage/src/test/java/com/zfoo/storage/resource/User.java @@ -14,8 +14,8 @@ package com.zfoo.storage.resource; /** - * @author jaysunxiao - * @version 3.0 + * @author godotg + * @version 4.0 */ public class User { diff --git a/storage/src/test/resources/excel/TestResource.txt b/storage/src/test/resources/excel/TestResource.json similarity index 97% rename from storage/src/test/resources/excel/TestResource.txt rename to storage/src/test/resources/excel/TestResource.json index 99b958f6..84eedbe9 100644 --- a/storage/src/test/resources/excel/TestResource.txt +++ b/storage/src/test/resources/excel/TestResource.json @@ -1,15 +1,15 @@ { "name": "Test", - "header": [ + "headers": [ { "name": "Id", "type": "int", - "index" : 0 + "index": 0 }, { "name": "Type0", "type": "long", - "index" : 0 + "index": 0 }, { "name": "Type1", @@ -52,7 +52,7 @@ "index" : 0 } ], - "data": [ + "rows": [ [ "1", "0",