From f9a19e194727bb21bc5415ea3a925502d421c156 Mon Sep 17 00:00:00 2001 From: aoyu <1790306716@qq.com> Date: Mon, 12 Dec 2022 15:21:10 +0800 Subject: [PATCH] =?UTF-8?q?feat[storage]:=E9=85=8D=E7=BD=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=8F=AF=E4=BB=A5=E5=90=8C=E6=97=B6=E6=8C=87=E5=AE=9A?= =?UTF-8?q?=E5=A4=9A=E4=B8=AA=E6=89=AB=E6=8F=8F=E8=B7=AF=E5=BE=84=E5=92=8C?= =?UTF-8?q?=E6=89=AB=E6=8F=8F=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/zfoo/protocol/util/StringUtils.java | 35 ++++++++ .../zfoo/storage/manager/StorageManager.java | 85 ++++++++++++------- .../storage/model/config/StorageConfig.java | 20 ++--- .../zfoo/storage/model/vo/ResourceDef.java | 27 ++++++ .../schema/StorageDefinitionParser.java | 6 +- .../zfoo/storage/export/ExportBinaryTest.java | 4 +- storage/src/test/resources/application.xml | 5 +- 7 files changed, 134 insertions(+), 48 deletions(-) diff --git a/protocol/src/main/java/com/zfoo/protocol/util/StringUtils.java b/protocol/src/main/java/com/zfoo/protocol/util/StringUtils.java index 16c311a3..59e29126 100644 --- a/protocol/src/main/java/com/zfoo/protocol/util/StringUtils.java +++ b/protocol/src/main/java/com/zfoo/protocol/util/StringUtils.java @@ -484,4 +484,39 @@ public abstract class StringUtils { public static boolean isStopChar(char ch) { return Character.isWhitespace(ch) || STOP_WORD.contains(ch); } + + /** + * + * @param str 待匹配字符串 + * @param matchStr 匹配的后缀 + * @return 是否成功匹配后缀 + */ + public static boolean suffixMatch(final String str,final String matchStr){ + if(matchStr.length()>str.length()) + return false; + for(int i=0;i, ResourceDef>(); // 扫描Excel的class类文件 - var clazzNameSet = scanResourceAnno(storageConfig.getScanPackage()); + var clazzNameSet = scanResourceAnno(storageConfig.getScanPackages()); // 通过class类文件扫描excel文件地址 for (var clazzName : clazzNameSet) { @@ -221,22 +222,24 @@ public class StorageManager implements IStorageManager { return getStorageConfig(); } - private Set scanResourceAnno(String scanLocation) { + private Set scanResourceAnno(String[] scanPackages) { var resourcePatternResolver = new PathMatchingResourcePatternResolver(); var metadataReaderFactory = new CachingMetadataReaderFactory(resourcePatternResolver); try { - var packageSearchPath = ResourceUtils.CLASSPATH_URL_PREFIX + scanLocation.replace(StringUtils.PERIOD, StringUtils.SLASH) + StringUtils.SLASH + SUFFIX_PATTERN; - var resources = resourcePatternResolver.getResources(packageSearchPath); var result = new HashSet(); - var name = com.zfoo.storage.model.anno.Resource.class.getName(); - for (var resource : resources) { - if (resource.isReadable()) { - var metadataReader = metadataReaderFactory.getMetadataReader(resource); - var annoMeta = metadataReader.getAnnotationMetadata(); - if (annoMeta.hasAnnotation(name)) { - ClassMetadata clazzMeta = metadataReader.getClassMetadata(); - result.add(clazzMeta.getClassName()); + for(var scanPackage:scanPackages) { + var packageSearchPath = ResourceUtils.CLASSPATH_URL_PREFIX + scanPackage.replace(StringUtils.PERIOD, StringUtils.SLASH) + StringUtils.SLASH + SUFFIX_PATTERN; + var resources = resourcePatternResolver.getResources(packageSearchPath); + var resourceName = com.zfoo.storage.model.anno.Resource.class.getName(); + for (var resource : resources) { + if (resource.isReadable()) { + var metadataReader = metadataReaderFactory.getMetadataReader(resource); + var annoMeta = metadataReader.getAnnotationMetadata(); + if (annoMeta.hasAnnotation(resourceName)) { + ClassMetadata clazzMeta = metadataReader.getClassMetadata(); + result.add(clazzMeta.getClassName()); + } } } } @@ -251,30 +254,48 @@ public class StorageManager implements IStorageManager { var metadataReaderFactory = new CachingMetadataReaderFactory(resourcePatternResolver); try { - var resourceList = new ArrayList(); - - var packageSearchPath = StringUtils.format("{}/**/{}.*", storageConfig.getResourceLocation(), clazz.getSimpleName()); - packageSearchPath = packageSearchPath.replaceAll("//", "/"); - try { - resourceList.addAll(Arrays.asList(resourcePatternResolver.getResources(packageSearchPath))); - } catch (Exception e) { - // do nothing - } - - // 通配符无法匹配根目录,所以如果找不到,再从根目录查找一遍 - if (CollectionUtils.isEmpty(resourceList)) { - packageSearchPath = StringUtils.format("{}/{}.*", storageConfig.getResourceLocation(), clazz.getSimpleName()); + var resourceDefSet = new HashSet(); + for(var resourceLocation: storageConfig.getResourceLocations()) { + var packageSearchPath = StringUtils.format("{}/**/{}.*", resourceLocation, clazz.getSimpleName()); packageSearchPath = packageSearchPath.replaceAll("//", "/"); - resourceList.addAll(Arrays.asList(resourcePatternResolver.getResources(packageSearchPath))); + try { + for(var resource :resourcePatternResolver.getResources(packageSearchPath)){ + if(StringUtils.suffixMatch(resource.getFilename(), ResourceEnum.CSV.getType()) + ||StringUtils.suffixMatch(resource.getFilename(), ResourceEnum.EXCEL_XLS.getType()) + ||StringUtils.suffixMatch(resource.getFilename(), ResourceEnum.EXCEL_XLSX.getType()) + ||StringUtils.suffixMatch(resource.getFilename(), ResourceEnum.JSON.getType())) + resourceDefSet.add(new ResourceDef(clazz,resource)); + } + } catch (Exception e) { + // do nothing + } + + // 通配符无法匹配根目录,所以如果找不到,再从根目录查找一遍 + if (resourceDefSet.isEmpty()) { + packageSearchPath = StringUtils.format("{}/{}.*", resourceLocation, clazz.getSimpleName()); + packageSearchPath = packageSearchPath.replaceAll("//", "/"); + for(var resource :resourcePatternResolver.getResources(packageSearchPath)){ + if(StringUtils.suffixMatch(resource.getFilename(), ResourceEnum.CSV.getType()) + ||StringUtils.suffixMatch(resource.getFilename(), ResourceEnum.EXCEL_XLS.getType()) + ||StringUtils.suffixMatch(resource.getFilename(), ResourceEnum.EXCEL_XLSX.getType()) + ||StringUtils.suffixMatch(resource.getFilename(), ResourceEnum.JSON.getType())) + resourceDefSet.add(new ResourceDef(clazz,resource)); + } + } } - if (CollectionUtils.isEmpty(resourceList)) { - throw new RuntimeException(StringUtils.format("无法找到配置文件[{}]", clazz.getSimpleName())); - } else if (resourceList.size() > 1) { - var resourceNames = resourceList.stream().map(it -> it.getFilename()).collect(Collectors.joining(StringUtils.COMMA)); - throw new RuntimeException(StringUtils.format("资源类[class:{}]找到重复的配置文件[{}]", clazz.getSimpleName(), resourceNames)); + if (CollectionUtils.isEmpty(resourceDefSet)) { + throw new RuntimeException(StringUtils.format("资源类[class:{}]无法找到配置文件", clazz.getSimpleName())); + } else if (resourceDefSet.size() > 1) { + var resourceNames=new String[resourceDefSet.size()]; + var index=0; + for(var resourceDef:resourceDefSet){ + resourceNames[index++]=resourceDef.getResource().getFile().getAbsolutePath(); + } + + throw new RuntimeException(StringUtils.format("资源类[class:{}]找到重复的配置文件{}", clazz.getSimpleName(),StringUtils.stringArrayToString(resourceNames))); } else { - return resourceList.get(0); + return ((ResourceDef)(resourceDefSet.toArray()[0])).getResource(); } } catch (IOException e) { 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 3a361b2e..eb4fe699 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 @@ -21,9 +21,9 @@ public class StorageConfig { private String id; - private String scanPackage; + private String[] scanPackages; - private String resourceLocation; + private String[] resourceLocations; // 类的属性是否可写,如果为false则类的属性必须为private并且不能有set方法 private boolean writeable; @@ -39,20 +39,20 @@ public class StorageConfig { this.id = id; } - public String getScanPackage() { - return scanPackage; + public String[] getScanPackages() { + return scanPackages; } - public void setScanPackage(String scanPackage) { - this.scanPackage = scanPackage; + public void setScanPackages(String[] scanPackages) { + this.scanPackages = scanPackages; } - public String getResourceLocation() { - return resourceLocation; + public String[] getResourceLocations() { + return resourceLocations; } - public void setResourceLocation(String resourceLocation) { - this.resourceLocation = resourceLocation; + public void setResourceLocations(String[] resourceLocations) { + this.resourceLocations = resourceLocations; } public boolean isWriteable() { 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 d82e4355..bf07b481 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 @@ -15,6 +15,9 @@ package com.zfoo.storage.model.vo; import org.springframework.core.io.Resource; +import java.io.IOException; +import java.util.Objects; + /** * @author godotg * @version 4.0 @@ -38,4 +41,28 @@ public class ResourceDef { return resource; } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ResourceDef that = (ResourceDef) o; + boolean equal= false; + try { + equal = this.resource.getFile().getAbsolutePath().equals(that.resource.getFile().getAbsolutePath()); + } catch (IOException e) { + e.printStackTrace(); + } + return equal; + } + + @Override + public int hashCode() { + int hashCode=0; + try { + hashCode=this.resource.getFile().getAbsolutePath().hashCode(); + } catch (IOException e) { + e.printStackTrace(); + } + return hashCode; + } } 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 df4377e0..756e5eb0 100644 --- a/storage/src/main/java/com/zfoo/storage/schema/StorageDefinitionParser.java +++ b/storage/src/main/java/com/zfoo/storage/schema/StorageDefinitionParser.java @@ -66,10 +66,10 @@ public class StorageDefinitionParser implements BeanDefinitionParser { } resolvePlaceholder("id", "id", builder, element, parserContext); - resolvePlaceholder("package", "scanPackage", builder, scanElement, parserContext); + resolvePlaceholder("package", "scanPackages", builder, scanElement, parserContext); resolvePlaceholder("writeable", "writeable", builder, scanElement, parserContext); resolvePlaceholder("recycle", "recycle", builder, scanElement, parserContext); - resolvePlaceholder("location", "resourceLocation", builder, resourceElement, parserContext); + resolvePlaceholder("location", "resourceLocations", builder, resourceElement, parserContext); parserContext.getRegistry().registerBeanDefinition(clazz.getCanonicalName(), builder.getBeanDefinition()); } @@ -90,6 +90,8 @@ public class StorageDefinitionParser implements BeanDefinitionParser { private void resolvePlaceholder(String attributeName, String fieldName, BeanDefinitionBuilder builder, Element element, ParserContext parserContext) { var attributeValue = element.getAttribute(attributeName); + attributeValue=attributeValue.replaceAll(";",","); + attributeValue=attributeValue.replaceAll(" ",","); var environment = parserContext.getReaderContext().getEnvironment(); var placeholder = environment.resolvePlaceholders(attributeValue); builder.addPropertyValue(fieldName, placeholder); diff --git a/storage/src/test/java/com/zfoo/storage/export/ExportBinaryTest.java b/storage/src/test/java/com/zfoo/storage/export/ExportBinaryTest.java index 3a322e95..929fd57f 100644 --- a/storage/src/test/java/com/zfoo/storage/export/ExportBinaryTest.java +++ b/storage/src/test/java/com/zfoo/storage/export/ExportBinaryTest.java @@ -78,8 +78,8 @@ public class ExportBinaryTest { @Test public void test() throws Exception { var config = new StorageConfig(); - config.setScanPackage("com.zfoo.storage.export"); - config.setResourceLocation("classpath:/excel"); + config.setScanPackages(new String[]{"com.zfoo.storage.export"}); + config.setResourceLocations(new String[]{"classpath:/excel"}); config.setWriteable(true); config.setRecycle(false); var storageManager = new StorageManager(); diff --git a/storage/src/test/resources/application.xml b/storage/src/test/resources/application.xml index e4fb46b8..0353107a 100644 --- a/storage/src/test/resources/application.xml +++ b/storage/src/test/resources/application.xml @@ -47,9 +47,10 @@ + - - + +