Ver código fonte

调整结构,优化+1

zhou-hao 7 anos atrás
pai
commit
8ab2cb97fd
55 arquivos alterados com 310 adições e 958 exclusões
  1. 0 34
      hsweb-boost/hsweb-boost-compiler/pom.xml
  2. 0 5
      hsweb-boost/hsweb-boost-compiler/src/test/java/org/hswebframework/web/boost/Color.java
  3. 0 28
      hsweb-boost/hsweb-boost-compiler/src/test/java/org/hswebframework/web/boost/CompilerTest.java
  4. 0 1
      hsweb-boost/pom.xml
  5. 5 0
      hsweb-core/pom.xml
  6. 1 1
      hsweb-boost/hsweb-boost-compiler/src/main/java/org/hswebframework/web/boost/bean/Converter.java
  7. 2 2
      hsweb-boost/hsweb-boost-compiler/src/main/java/org/hswebframework/web/boost/bean/Copier.java
  8. 27 32
      hsweb-boost/hsweb-boost-compiler/src/main/java/org/hswebframework/web/boost/bean/FastBeanCopier.java
  9. 1 1
      hsweb-core/src/main/java/org/hswebframework/web/dict/Dict.java
  10. 83 0
      hsweb-core/src/main/java/org/hswebframework/web/dict/EnumDict.java
  11. 1 0
      hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultDictDefine.java
  12. 70 1
      hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultDictDefineRepository.java
  13. 1 1
      hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultDictSupportApi.java
  14. 10 10
      hsweb-boost/hsweb-boost-compiler/src/main/java/org/hswebframework/web/boost/Compiler.java
  15. 17 0
      hsweb-core/src/test/java/org/hswebframework/web/bean/Color.java
  16. 5 14
      hsweb-boost/hsweb-boost-compiler/src/test/java/org/hswebframework/web/boost/FastBeanCopierTest.java
  17. 1 1
      hsweb-boost/hsweb-boost-compiler/src/test/java/org/hswebframework/web/boost/NestObject.java
  18. 14 10
      hsweb-boost/hsweb-boost-compiler/src/test/java/org/hswebframework/web/boost/Source.java
  19. 17 12
      hsweb-boost/hsweb-boost-compiler/src/test/java/org/hswebframework/web/boost/Target.java
  20. 22 0
      hsweb-core/src/test/java/org/hswebframework/web/dict/DictDefineTest.java
  21. 20 0
      hsweb-core/src/test/java/org/hswebframework/web/dict/UserCode.java
  22. 0 15
      hsweb-eventbus/hsweb-eventbus-api/pom.xml
  23. 0 9
      hsweb-eventbus/hsweb-eventbus-api/src/main/java/org/hswebframework/web/eventbus/EventBus.java
  24. 0 9
      hsweb-eventbus/hsweb-eventbus-api/src/main/java/org/hswebframework/web/eventbus/EventListener.java
  25. 0 24
      hsweb-eventbus/hsweb-eventbus-api/src/main/java/org/hswebframework/web/eventbus/EventListenerDefine.java
  26. 0 9
      hsweb-eventbus/hsweb-eventbus-api/src/main/java/org/hswebframework/web/eventbus/EventPublisher.java
  27. 0 9
      hsweb-eventbus/hsweb-eventbus-api/src/main/java/org/hswebframework/web/eventbus/EventSubscriber.java
  28. 0 20
      hsweb-eventbus/hsweb-eventbus-api/src/main/java/org/hswebframework/web/eventbus/annotation/EventListener.java
  29. 0 12
      hsweb-eventbus/hsweb-eventbus-api/src/main/java/org/hswebframework/web/eventbus/annotation/EventMode.java
  30. 0 66
      hsweb-eventbus/hsweb-eventbus-default/pom.xml
  31. 0 44
      hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/AbstractEventBus.java
  32. 0 48
      hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/executor/AbstractEventContainer.java
  33. 0 31
      hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/executor/AsyncEventTaskSupplier.java
  34. 0 33
      hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/executor/AsyncTranscationEventTaskSupplier.java
  35. 0 72
      hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/executor/BackGroundEventTaskSupplier.java
  36. 0 26
      hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/executor/DefaultEventExecutor.java
  37. 0 9
      hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/executor/EventExecuteTask.java
  38. 0 16
      hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/executor/EventExecuteTaskSupplier.java
  39. 0 14
      hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/executor/EventListenerContainer.java
  40. 0 12
      hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/executor/EventListenerExecutor.java
  41. 0 21
      hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/executor/SyncEventListenerExecutor.java
  42. 0 53
      hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/spring/FastListener.java
  43. 0 32
      hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/spring/ReflectListener.java
  44. 0 52
      hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/spring/SpringEventBus.java
  45. 0 16
      hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/spring/SpringEventBusAutoConfiguration.java
  46. 0 40
      hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/spring/SpringEventContainer.java
  47. 0 3
      hsweb-eventbus/hsweb-eventbus-default/src/main/resources/META-INF/spring.factories
  48. 0 33
      hsweb-eventbus/hsweb-eventbus-default/src/test/java/org/hswebframework/web/eventbus/spring/SpringEventBusTest.java
  49. 0 33
      hsweb-eventbus/hsweb-eventbus-default/src/test/java/org/hswebframework/web/eventbus/spring/Test2.java
  50. 0 13
      hsweb-eventbus/hsweb-eventbus-default/src/test/java/org/hswebframework/web/eventbus/spring/TestApplication.java
  51. 0 9
      hsweb-eventbus/hsweb-eventbus-default/src/test/resources/application.yml
  52. 0 20
      hsweb-eventbus/pom.xml
  53. 9 0
      hsweb-starter/hsweb-spring-boot-starter/src/main/java/org/hswebframework/web/starter/RestControllerExceptionTranslator.java
  54. 4 1
      hsweb-starter/hsweb-spring-boot-starter/src/main/java/org/hswebframework/web/starter/entity/EntityFactoryInitConfiguration.java
  55. 0 1
      pom.xml

+ 0 - 34
hsweb-boost/hsweb-boost-compiler/pom.xml

@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>hsweb-boost</artifactId>
-        <groupId>org.hswebframework.web</groupId>
-        <version>3.0-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>hsweb-boost-compiler</artifactId>
-
-    <dependencies>
-        <!-- https://mvnrepository.com/artifact/org.javassist/javassist -->
-        <dependency>
-            <groupId>org.javassist</groupId>
-            <artifactId>javassist</artifactId>
-            <version>3.22.0-GA</version>
-        </dependency>
-        <dependency>
-            <groupId>commons-beanutils</groupId>
-            <artifactId>commons-beanutils</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-api</artifactId>
-        </dependency>
-    </dependencies>
-</project>

+ 0 - 5
hsweb-boost/hsweb-boost-compiler/src/test/java/org/hswebframework/web/boost/Color.java

@@ -1,5 +0,0 @@
-package org.hswebframework.web.boost;
-
-public enum Color {
-    RED,BLUE
-}

+ 0 - 28
hsweb-boost/hsweb-boost-compiler/src/test/java/org/hswebframework/web/boost/CompilerTest.java

@@ -1,28 +0,0 @@
-package org.hswebframework.web.boost;
-
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-/**
- * TODO 完成注释
- *
- * @author zhouhao
- * @since
- */
-public class CompilerTest {
-
-    @Test
-    public void Test() throws Exception {
-        Compiler<TestApi> compiler = Compiler.create(TestApi.class)
-                .addMethod("public void hello(int i){System.out.println(\"aa\"+i);}");
-        Class<TestApi> czz = compiler.getTargetClass();
-
-        System.out.println(czz.getConstructors().length);
-        compiler.newInstance().hello(11);
-    }
-
-    public interface TestApi {
-         void hello(int i);
-    }
-}

+ 0 - 1
hsweb-boost/pom.xml

@@ -32,7 +32,6 @@
     <modules>
         <module>hsweb-boost-validator</module>
         <module>hsweb-boost-aop</module>
-        <module>hsweb-boost-compiler</module>
     </modules>
 
 

+ 5 - 0
hsweb-core/pom.xml

@@ -13,6 +13,11 @@
 
 
     <dependencies>
+        <dependency>
+            <groupId>org.javassist</groupId>
+            <artifactId>javassist</artifactId>
+            <!--<version>3.22.0-GA</version>-->
+        </dependency>
         <dependency>
             <groupId>org.hswebframework</groupId>
             <artifactId>hsweb-utils</artifactId>

+ 1 - 1
hsweb-boost/hsweb-boost-compiler/src/main/java/org/hswebframework/web/boost/bean/Converter.java

@@ -1,4 +1,4 @@
-package org.hswebframework.web.boost.bean;
+package org.hswebframework.web.bean;
 
 @FunctionalInterface
 public interface Converter {

+ 2 - 2
hsweb-boost/hsweb-boost-compiler/src/main/java/org/hswebframework/web/boost/bean/Copier.java

@@ -1,4 +1,4 @@
-package org.hswebframework.web.boost.bean;
+package org.hswebframework.web.bean;
 
 import java.util.Arrays;
 import java.util.HashSet;
@@ -7,7 +7,7 @@ import java.util.Set;
 public interface Copier {
     void copy(Object source, Object target, Set<String> ignore, Converter converter);
 
-    default void copy(Object source, Object target, String ...ignore){
+    default void copy(Object source, Object target, String... ignore){
         copy(source,target,new HashSet<>(Arrays.asList(ignore)),FastBeanCopier.DEFAULT_CONVERT);
     }
 }

+ 27 - 32
hsweb-boost/hsweb-boost-compiler/src/main/java/org/hswebframework/web/boost/bean/FastBeanCopier.java

@@ -1,23 +1,17 @@
-package org.hswebframework.web.boost.bean;
+package org.hswebframework.web.bean;
 
 import lombok.AllArgsConstructor;
 import lombok.Getter;
-import lombok.Setter;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.beanutils.BeanUtilsBean;
 import org.apache.commons.beanutils.PropertyUtilsBean;
-import org.hswebframework.web.boost.Compiler;
+import org.hswebframework.web.dict.EnumDict;
+import org.hswebframework.web.proxy.Proxy;
 import org.springframework.util.ClassUtils;
 
-import java.beans.BeanDescriptor;
-import java.beans.FeatureDescriptor;
 import java.beans.PropertyDescriptor;
-import java.lang.reflect.Method;
 import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
 import java.util.function.BiFunction;
-import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
@@ -28,7 +22,7 @@ import java.util.stream.Stream;
  * @since 3.0
  */
 @Slf4j
-public class FastBeanCopier {
+public final class FastBeanCopier {
     private static final Map<CacheKey, Copier> CACHE = new HashMap<>();
 
     private static final PropertyUtilsBean propertyUtils = BeanUtilsBean.getInstance().getPropertyUtils();
@@ -92,7 +86,7 @@ public class FastBeanCopier {
 
     public static Copier createCopier(Class source, Class target) {
         String method = "public void copy(Object s, Object t, java.util.Set ignore, " +
-                "org.hswebframework.web.boost.bean.Converter converter){\n" +
+                "org.hswebframework.web.bean.Converter converter){\n" +
                 "try{\n\t" +
                 source.getName() + " source=(" + source.getName() + ")s;\n\t" +
                 target.getName() + " target=(" + target.getName() + ")t;\n\t" +
@@ -102,7 +96,8 @@ public class FastBeanCopier {
                 "\n}\n" +
                 "\n}";
         try {
-            return Compiler.create(Copier.class)
+            System.out.println(method);
+            return Proxy.create(Copier.class)
                     .addMethod(method)
                     .newInstance();
         } catch (Exception e) {
@@ -371,25 +366,7 @@ public class FastBeanCopier {
     }
 
 
-    static class DefaultConvert implements Converter {
-//        static {
-//            BeanUtilsBean
-//                    .getInstance()
-//                    .getConvertUtils().register(new org.apache.commons.beanutils.Converter() {
-//                @Override
-//                public <T> T convert(Class<T> type, Object value) {
-//                    if (value == null) {
-//                        return null;
-//                    }
-//                    if (value instanceof Collection) {
-//                        return (T) new ArrayList(((Collection) value));
-//                    } else if (value.getClass().isArray()) {
-//                        return (T) new ArrayList(Arrays.asList(((Object[]) value)));
-//                    }
-//                    return null;
-//                }
-//            }, List.class);
-//        }
+    static final class DefaultConvert implements Converter {
 
         public Collection newCollection(Class targetClass) {
 
@@ -409,10 +386,20 @@ public class FastBeanCopier {
         }
 
         @Override
+        @SuppressWarnings("all")
         public <T> T convert(Object source, Class<T> targetClass) {
             if (source == null) {
                 return null;
             }
+            if (source.getClass().isEnum()) {
+                if (source instanceof EnumDict) {
+                    Object val = (T) ((EnumDict) source).getValue();
+                    if (targetClass.isInstance(val)) {
+                        return ((T) val);
+                    }
+                    return convert(val, targetClass);
+                }
+            }
             if (targetClass == String.class) {
                 return (T) String.valueOf(source);
             }
@@ -444,6 +431,14 @@ public class FastBeanCopier {
             }
 
             if (targetClass.isEnum()) {
+                if (EnumDict.class.isAssignableFrom(targetClass)) {
+                    Object val = EnumDict.find((Class) targetClass, String.valueOf(source)).orElse(null);
+
+                    if (targetClass.isInstance(val)) {
+                        return ((T) val);
+                    }
+                    return convert(val, targetClass);
+                }
                 for (T t : targetClass.getEnumConstants()) {
                     if (((Enum) t).name().equalsIgnoreCase(String.valueOf(source))) {
                         return t;
@@ -454,7 +449,7 @@ public class FastBeanCopier {
             }
             try {
 
-                T newTarget = targetClass == Map.class ? (T)new HashMap<>() : targetClass.newInstance();
+                T newTarget = targetClass == Map.class ? (T) new HashMap<>() : targetClass.newInstance();
                 copy(source, newTarget);
                 return newTarget;
             } catch (Exception e) {

+ 1 - 1
hsweb-core/src/main/java/org/hswebframework/web/dict/Dict.java

@@ -8,7 +8,7 @@ import java.lang.annotation.*;
  * @author zhouhao
  * @since 3.0
  */
-@Target({ElementType.METHOD, ElementType.FIELD})
+@Target({ElementType.METHOD, ElementType.FIELD,ElementType.TYPE})
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
 public @interface Dict {

+ 83 - 0
hsweb-core/src/main/java/org/hswebframework/web/dict/EnumDict.java

@@ -0,0 +1,83 @@
+package org.hswebframework.web.dict;
+
+import java.util.Optional;
+import java.util.function.Predicate;
+
+/**
+ * 枚举字典,使用枚举来实现数据字典,可通过集成此接口来实现一些有趣的功能
+ *
+ * @author zhouhao
+ * @see 3.0
+ */
+public interface EnumDict<V> {
+    /**
+     * 枚举选项的值,通常由字母或者数字组成,并且在同一个枚举中值唯一;对应数据库中的值通常也为此值
+     *
+     * @return 枚举的值
+     * @see ItemDefine#getValue()
+     */
+    V getValue();
+
+    /**
+     * 枚举字典选项的文本,通常为中文
+     *
+     * @return 枚举的文本
+     * @see ItemDefine#getText()
+     */
+    String getText();
+
+    /**
+     * 枚举选项的描述,对一个选项进行详细的描述有时候是必要的.默认值为{@link this#getText()}
+     *
+     * @return 描述
+     */
+    default String getComments() {
+        return getText();
+    }
+
+    /**
+     * 从指定的枚举类中查找想要的枚举,并返回一个{@link Optional},如果未找到,则返回一个{@link Optional#empty()}
+     *
+     * @param type      实现了{@link EnumDict}的枚举类
+     * @param predicate 判断逻辑
+     * @param <T>       枚举类型
+     * @return 查找到的结果
+     */
+    static <T extends Enum & EnumDict> Optional<T> find(Class<T> type, Predicate<T> predicate) {
+        if (type.isEnum()) {
+            for (T enumDict : type.getEnumConstants()) {
+                if (predicate.test(enumDict)) {
+                    return Optional.of(enumDict);
+                }
+            }
+        }
+        return Optional.empty();
+    }
+
+    /**
+     * 根据枚举的{@link EnumDict#getValue()}来查找.
+     *
+     * @see this#find(Class, Predicate)
+     */
+    static <T extends Enum & EnumDict<?>> Optional<T> findByValue(Class<T> type, Object value) {
+        return find(type, e -> e.getValue() == value || e.getValue().equals(value) || String.valueOf(e.getValue()).equalsIgnoreCase(String.valueOf(value)));
+    }
+
+    /**
+     * 根据枚举的{@link EnumDict#getText()} 来查找.
+     *
+     * @see this#find(Class, Predicate)
+     */
+    static <T extends Enum & EnumDict> Optional<T> findByText(Class<T> type, String text) {
+        return find(type, e -> e.getText().equalsIgnoreCase(text));
+    }
+
+    /**
+     * 根据枚举的{@link EnumDict#getValue()},{@link EnumDict#getText()}来查找.
+     *
+     * @see this#find(Class, Predicate)
+     */
+    static <T extends Enum & EnumDict> Optional<T> find(Class<T> type, Object valueOrTextOrAlias) {
+        return Optional.ofNullable(findByValue(type, valueOrTextOrAlias).orElseGet(() -> findByText(type, String.valueOf(valueOrTextOrAlias)).orElse(null)));
+    }
+}

+ 1 - 0
hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultDictDefine.java

@@ -19,6 +19,7 @@ import java.util.List;
 @NoArgsConstructor
 @AllArgsConstructor
 public class DefaultDictDefine implements DictDefine {
+    private static final long serialVersionUID = 20094004707177152L;
     private String           id;
     private String           alias;
     private String           comments;

+ 70 - 1
hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultDictDefineRepository.java

@@ -1,8 +1,16 @@
 package org.hswebframework.web.dict.defaults;
 
+import lombok.extern.slf4j.Slf4j;
+import org.hswebframework.web.AopUtils;
 import org.hswebframework.web.dict.*;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.core.io.support.ResourcePatternResolver;
+import org.springframework.core.type.classreading.MetadataReader;
+import org.springframework.core.type.classreading.SimpleMetadataReaderFactory;
 import org.springframework.util.ReflectionUtils;
 
+import java.io.IOException;
 import java.lang.reflect.Field;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -11,6 +19,7 @@ import java.util.stream.Collectors;
  * @author zhouhao
  * @since 3.0
  */
+@Slf4j
 public class DefaultDictDefineRepository implements DictDefineRepository {
     protected Map<String, DictDefine> parsedDict = new HashMap<>();
 
@@ -18,6 +27,63 @@ public class DefaultDictDefineRepository implements DictDefineRepository {
         parsedDict.put(define.getId(), define);
     }
 
+    static {
+        ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
+        SimpleMetadataReaderFactory readerFactory = new SimpleMetadataReaderFactory();
+
+        try {
+            Resource[] resources = resourcePatternResolver.getResources("classpath*:org/hswebframework/web/**/*.class");
+            for (Resource resource : resources) {
+                try {
+                    MetadataReader reader = readerFactory.getMetadataReader(resource);
+                    String className = reader.getClassMetadata().getClassName();
+                    Class type = Class.forName(className);
+                    if (type.isEnum() && EnumDict.class.isAssignableFrom(type)) {
+
+                    }
+                } catch (Error e) {
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    protected <T extends Enum & EnumDict> List<DictDefine> parseEnumDict(Class<T> type) {
+        log.debug("parse enum dict :{}", type);
+
+
+        Dict dict = type.getAnnotation(Dict.class);
+
+        DefaultClassDictDefine define = new DefaultClassDictDefine();
+        define.setField("");
+        if (dict != null) {
+            define.setId(dict.id());
+            define.setParserId(dict.parserId());
+            define.setComments(dict.comments());
+            define.setAlias(dict.alias());
+        } else {
+            define.setId(type.getSimpleName());
+            define.setAlias(type.getName());
+            define.setComments(type.getSimpleName());
+        }
+
+        List<ItemDefine> items = new ArrayList<>();
+
+        for (T t : type.getEnumConstants()) {
+            items.add(DefaultItemDefine.builder()
+                    .text(t.getText())
+                    .comments(t.getComments())
+                    .value(String.valueOf(t.getValue()))
+                    .build());
+
+        }
+        define.setItems(items);
+
+        return new ArrayList<>(Collections.singletonList(define));
+
+    }
+
     @Override
     public DictDefine getDefine(String id) {
         return parsedDict.get(id);
@@ -27,7 +93,7 @@ public class DefaultDictDefineRepository implements DictDefineRepository {
         if (type == Object.class) {
             return Collections.emptyList();
         }
-        List<Field> fields=new ArrayList<>();
+        List<Field> fields = new ArrayList<>();
         ReflectionUtils.doWithFields(type, fields::add);
         return fields;
     }
@@ -40,6 +106,9 @@ public class DefaultDictDefineRepository implements DictDefineRepository {
     protected List<ClassDictDefine> parseDefine(Class type) {
         List<ClassDictDefine> defines = new ArrayList<>();
 
+        if (type.isEnum() && EnumDict.class.isAssignableFrom(type)) {
+            return parseEnumDict(type);
+        }
         for (Field field : parseField(type)) {
             Dict dict = field.getAnnotation(Dict.class);
             if (dict == null) {

+ 1 - 1
hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultDictSupportApi.java

@@ -74,7 +74,7 @@ public class DefaultDictSupportApi implements DictSupportApi {
                 }
                 BeanUtils.setProperty(target, fieldName, getParser(define.getParserId()).parseValue(define, String.valueOf(value)));
             } catch (Exception e) {
-                log.warn("wrap error", e.getMessage());
+                log.warn("unwrap error", e.getMessage());
             }
         }
         return target;

+ 10 - 10
hsweb-boost/hsweb-boost-compiler/src/main/java/org/hswebframework/web/boost/Compiler.java

@@ -1,4 +1,4 @@
-package org.hswebframework.web.boost;
+package org.hswebframework.web.proxy;
 
 import javassist.*;
 import javassist.bytecode.AnnotationsAttribute;
@@ -11,7 +11,7 @@ import java.util.concurrent.atomic.AtomicLong;
  * @author zhouhao
  * @since 3.0
  */
-public class Compiler<I> {
+public class Proxy<I> {
     public ClassPool classPool = new ClassPool(true);
     public static final AtomicLong counter = new AtomicLong(1);
 
@@ -25,15 +25,15 @@ public class Compiler<I> {
 
     private Class<I> targetClass;
 
-    public static <I> Compiler<I> create(Class<I> superClass, String... classPathString) {
+    public static <I> Proxy<I> create(Class<I> superClass, String... classPathString) {
         try {
-            return new Compiler<>(superClass, classPathString);
+            return new Proxy<>(superClass, classPathString);
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
     }
 
-    public Compiler(Class<I> superClass, String... classPathString) throws Exception {
+    public Proxy(Class<I> superClass, String... classPathString) throws Exception {
         if (superClass == null) {
             throw new NullPointerException("superClass can not be null");
         }
@@ -62,19 +62,19 @@ public class Compiler<I> {
         addConstructor("public " + className + "(){}");
     }
 
-    public Compiler<I> addMethod(String code) {
+    public Proxy<I> addMethod(String code) {
         return handleException(() -> ctClass.addMethod(CtNewMethod.make(code, ctClass)));
     }
 
-    public Compiler<I> addConstructor(String code) {
+    public Proxy<I> addConstructor(String code) {
         return handleException(() -> ctClass.addConstructor(CtNewConstructor.make(code, ctClass)));
     }
 
-    public Compiler<I> addField(String code) {
+    public Proxy<I> addField(String code) {
         return addField(code, null);
     }
 
-    public Compiler<I> addField(String code, String annotation) {
+    public Proxy<I> addField(String code, String annotation) {
         return handleException(() -> {
             CtField ctField = CtField.make(code, ctClass);
             if (null != annotation) {
@@ -89,7 +89,7 @@ public class Compiler<I> {
         });
     }
 
-    private Compiler<I> handleException(Task task) {
+    private Proxy<I> handleException(Task task) {
         try {
             task.run();
         } catch (RuntimeException e) {

+ 17 - 0
hsweb-core/src/test/java/org/hswebframework/web/bean/Color.java

@@ -0,0 +1,17 @@
+package org.hswebframework.web.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import org.hswebframework.web.dict.EnumDict;
+
+@Getter
+@AllArgsConstructor
+public enum Color implements EnumDict<Integer> {
+    RED(1, "红色"),
+    BLUE(2, "蓝色");
+
+    private Integer value;
+
+    private String text;
+
+}

+ 5 - 14
hsweb-boost/hsweb-boost-compiler/src/test/java/org/hswebframework/web/boost/FastBeanCopierTest.java

@@ -1,25 +1,14 @@
-package org.hswebframework.web.boost;
+package org.hswebframework.web.bean;
 
-import org.apache.commons.beanutils.BeanUtils;
-import org.apache.commons.beanutils.BeanUtilsBean;
-import org.hswebframework.web.boost.bean.Converter;
-import org.hswebframework.web.boost.bean.Copier;
-import org.hswebframework.web.boost.bean.FastBeanCopier;
 import org.junit.Test;
-import org.springframework.cglib.beans.BeanCopier;
 
-import java.lang.reflect.InvocationTargetException;
-import java.math.BigDecimal;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Map;
 
 /**
- * TODO 完成注释
- *
  * @author zhouhao
- * @since
+ * @since 3.0
  */
 public class FastBeanCopierTest {
 
@@ -31,6 +20,7 @@ public class FastBeanCopierTest {
         source.setIds(new String[]{"1", "2", "3"});
         source.setAge2(2);
         source.setBoy2(true);
+        source.setColor(Color.RED);
         source.setNestObject2(Collections.singletonMap("name","mapTest"));
         NestObject nestObject = new NestObject();
         nestObject.setAge(10);
@@ -43,11 +33,12 @@ public class FastBeanCopierTest {
 
         long t = System.currentTimeMillis();
 //        Copier copier = FastBeanCopier.getCopier(source, target, true);
-        for (int i = 10000; i > 0; i--) {
+        for (int i = 10_0000; i > 0; i--) {
             FastBeanCopier.copy(source, target);
         }
         System.out.println(System.currentTimeMillis() - t);
 
+        System.out.println(source);
         System.out.println(target);
         System.out.println(target.getNestObject() == source.getNestObject());
 //        Source source1=new Source();

+ 1 - 1
hsweb-boost/hsweb-boost-compiler/src/test/java/org/hswebframework/web/boost/NestObject.java

@@ -1,4 +1,4 @@
-package org.hswebframework.web.boost;
+package org.hswebframework.web.bean;
 
 import lombok.Data;
 

+ 14 - 10
hsweb-boost/hsweb-boost-compiler/src/test/java/org/hswebframework/web/boost/Source.java

@@ -1,4 +1,4 @@
-package org.hswebframework.web.boost;
+package org.hswebframework.web.bean;
 
 import lombok.Data;
 
@@ -7,33 +7,38 @@ import java.util.*;
 @Data
 public class Source {
     private String name;
-    private int age;
+
     private String[] ids;
 
     private boolean boy;
 
-    private Integer age2;
-
     private Boolean boy2;
 
+    private boolean boy3;
+
+    private int age;
+
+    private Integer age2;
+
     private int age3;
 
-    private boolean boy3;
 
     private NestObject nestObject;
 
-    private Map<String,Object> nestObject2=new HashMap<>();
+    private Map<String, Object> nestObject2 = new HashMap<>();
 
     private NestObject nestObject3;
 
 
     private Color color = Color.RED;
 
-    private String color2 = Color.RED.name();
+    private String color2 = "红色";
+
+    private int color3 = Color.BLUE.getValue();
 
-    private List<String> arr = Arrays.asList("2","3");
+    private List<String> arr = Arrays.asList("2", "3");
 
-    private List<String> arr4 = Arrays.asList("2","3");
+    private List<String> arr4 = Arrays.asList("2", "3");
 
     private String[] arr2 = {"1", "2"};
 
@@ -44,7 +49,6 @@ public class Source {
     private String[] arr6 = {"1", "2"};
 
 
-
 }
 
 

+ 17 - 12
hsweb-boost/hsweb-boost-compiler/src/test/java/org/hswebframework/web/boost/Target.java

@@ -1,4 +1,4 @@
-package org.hswebframework.web.boost;
+package org.hswebframework.web.bean;
 
 import lombok.Data;
 
@@ -9,36 +9,41 @@ import java.util.Map;
 @Data
 public class Target {
     private String name;
-    private int   age;
     private String[] ids;
-    private NestObject nestObject;
 
-    private NestObject nestObject2;
 
-    private Map<String,Object> nestObject3;
+    private Boolean boy;
+    private boolean boy2;
+    private String boy3;
 
-    private int age2;
 
-    private boolean boy2;
+    private int age;
 
-    private Boolean boy;
+    private int age2;
 
     private String age3;
 
-    private String boy3;
+    private NestObject nestObject;
+
+    private NestObject nestObject2;
+
+    private Map<String, Object> nestObject3;
 
-    private String color;
+
+    private int color;
 
     private Color color2;
 
+    private Color color3;
+
+
     private List<String> arr2;
 
-    private String[] arr ;
+    private String[] arr;
 
     private Integer[] arr3;
 
     private Integer[] arr4;
 
 
-
 }

+ 22 - 0
hsweb-core/src/test/java/org/hswebframework/web/dict/DictDefineTest.java

@@ -3,6 +3,7 @@ package org.hswebframework.web.dict;
 import org.hswebframework.web.dict.defaults.DefaultClassDictDefine;
 import org.hswebframework.web.dict.defaults.DefaultDictDefineRepository;
 import org.hswebframework.web.dict.defaults.DefaultDictSupportApi;
+import org.junit.Assert;
 import org.junit.Test;
 
 import java.util.HashMap;
@@ -20,6 +21,17 @@ public class DictDefineTest {
 
     private DictSupportApi api = new DefaultDictSupportApi(repository);
 
+
+    @Test
+    public void testEnumDict() {
+        Assert.assertEquals(UserCode.SIMPLE, EnumDict.findByValue(UserCode.class, UserCode.SIMPLE.getValue()).orElse(null));
+
+        Assert.assertEquals(UserCode.SIMPLE, EnumDict.findByText(UserCode.class, UserCode.SIMPLE.getText()).orElse(null));
+
+        Assert.assertEquals(UserCode.SIMPLE, EnumDict.find(UserCode.class, UserCode.SIMPLE.getText()).orElse(null));
+
+    }
+
     @Test
     public void testParse() {
 
@@ -28,9 +40,19 @@ public class DictDefineTest {
                 .field("code")
                 .build();
         repository.registerDefine(define);
+
+
         List<ClassDictDefine> defines = repository.getDefine(UseDictEntity2.class);
         assertFalse(defines.isEmpty());
         assertEquals(defines.size(), 2);
+
+        defines = repository.getDefine(UserCode.class);
+        assertFalse(defines.isEmpty());
+        assertEquals(defines.size(), 1);
+
+        assertEquals(defines.get(0).getItems().size(), 2);
+
+
     }
 
     @Test

+ 20 - 0
hsweb-core/src/test/java/org/hswebframework/web/dict/UserCode.java

@@ -0,0 +1,20 @@
+package org.hswebframework.web.dict;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+@Dict(id = "UserCode")
+public enum UserCode implements EnumDict {
+
+    SIMPLE("SIMPLE", "TEXT", "测试"),
+    TEST("TEST", "TEST", "测试");
+
+
+    private String value;
+
+    private String text;
+
+    private String comments;
+}

+ 0 - 15
hsweb-eventbus/hsweb-eventbus-api/pom.xml

@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>hsweb-eventbus</artifactId>
-        <groupId>org.hswebframework.web</groupId>
-        <version>3.0-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>hsweb-eventbus-api</artifactId>
-
-
-</project>

+ 0 - 9
hsweb-eventbus/hsweb-eventbus-api/src/main/java/org/hswebframework/web/eventbus/EventBus.java

@@ -1,9 +0,0 @@
-package org.hswebframework.web.eventbus;
-
-/**
- * @author zhouhao
- * @since 1.0
- */
-public interface EventBus extends EventPublisher {
-
-}

+ 0 - 9
hsweb-eventbus/hsweb-eventbus-api/src/main/java/org/hswebframework/web/eventbus/EventListener.java

@@ -1,9 +0,0 @@
-package org.hswebframework.web.eventbus;
-
-/**
- * @author zhouhao
- * @since 1.0
- */
-public interface EventListener<E> {
-    void onEvent(E event);
-}

+ 0 - 24
hsweb-eventbus/hsweb-eventbus-api/src/main/java/org/hswebframework/web/eventbus/EventListenerDefine.java

@@ -1,24 +0,0 @@
-package org.hswebframework.web.eventbus;
-
-import lombok.*;
-import org.hswebframework.web.eventbus.annotation.EventMode;
-
-
-/**
- * @author zhouhao
- * @since 3.0
- */
-@Getter
-@Setter
-@Builder
-@NoArgsConstructor
-@AllArgsConstructor
-public class EventListenerDefine {
-    private EventListener listener;
-
-    private EventMode eventMode = EventMode.SYNC;
-
-    private boolean transaction = true;
-
-    private int priority = 0;
-}

+ 0 - 9
hsweb-eventbus/hsweb-eventbus-api/src/main/java/org/hswebframework/web/eventbus/EventPublisher.java

@@ -1,9 +0,0 @@
-package org.hswebframework.web.eventbus;
-
-/**
- * @author zhouhao
- * @since 1.0
- */
-public interface EventPublisher {
-    void publish(Object event);
-}

+ 0 - 9
hsweb-eventbus/hsweb-eventbus-api/src/main/java/org/hswebframework/web/eventbus/EventSubscriber.java

@@ -1,9 +0,0 @@
-package org.hswebframework.web.eventbus;
-
-/**
- * @author zhouhao
- * @since 1.0
- */
-public interface EventSubscriber {
-    <E> void subscribe(Class<E> eventType, EventListenerDefine listener);
-}

+ 0 - 20
hsweb-eventbus/hsweb-eventbus-api/src/main/java/org/hswebframework/web/eventbus/annotation/EventListener.java

@@ -1,20 +0,0 @@
-package org.hswebframework.web.eventbus.annotation;
-
-import java.lang.annotation.*;
-
-/**
- * @author zhouhao
- * @since 1.0
- */
-@Target({ElementType.METHOD})
-@Retention(RetentionPolicy.RUNTIME)
-@Inherited
-@Documented
-public @interface EventListener {
-    EventMode mode() default EventMode.SYNC;
-
-    boolean transaction() default true;
-
-    int priority() default Integer.MIN_VALUE;
-
-}

+ 0 - 12
hsweb-eventbus/hsweb-eventbus-api/src/main/java/org/hswebframework/web/eventbus/annotation/EventMode.java

@@ -1,12 +0,0 @@
-package org.hswebframework.web.eventbus.annotation;
-
-/**
- *
- * @author zhouhao
- * @since
- */
-public enum EventMode {
-    SYNC,
-    ASYNC,
-    BACKGROUND
-}

+ 0 - 66
hsweb-eventbus/hsweb-eventbus-default/pom.xml

@@ -1,66 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>hsweb-eventbus</artifactId>
-        <groupId>org.hswebframework.web</groupId>
-        <version>3.0-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>hsweb-eventbus-default</artifactId>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.hswebframework.web</groupId>
-            <artifactId>hsweb-eventbus-api</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.hswebframework.web</groupId>
-            <artifactId>hsweb-concurrent-async-job</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.hswebframework</groupId>
-            <artifactId>hsweb-utils</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.hswebframework.web</groupId>
-            <artifactId>hsweb-boost-compiler</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.hswebframework.web</groupId>
-            <artifactId>hsweb-spring-boot-starter</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-test</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.alibaba</groupId>
-            <artifactId>druid</artifactId>
-            <version>1.0.26</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.h2database</groupId>
-            <artifactId>h2</artifactId>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-</project>

+ 0 - 44
hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/AbstractEventBus.java

@@ -1,44 +0,0 @@
-package org.hswebframework.web.eventbus;
-
-import lombok.extern.slf4j.Slf4j;
-import org.hswebframework.web.eventbus.executor.EventListenerContainer;
-
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-/**
- * @author zhouhao
- * @since 1.0
- */
-@Slf4j
-public abstract class AbstractEventBus implements EventBus, EventSubscriber {
-    private ConcurrentMap<String, EventListenerContainer> listenerStorage = new ConcurrentHashMap<>();
-
-    @Override
-    public void publish(Object event) {
-        EventListenerContainer container = listenerStorage.get(getKey(event));
-        if (null != container) {
-            container.doExecute(event);
-        } else {
-            log.warn("没有监听器处理此事件:{}", event);
-        }
-    }
-
-    public String getKey(Object event) {
-        return getKey(event.getClass());
-    }
-
-    public String getKey(Class eventType) {
-        return eventType.getName();
-    }
-
-    @Override
-    public <E> void subscribe(Class<E> eventType, EventListenerDefine define) {
-        EventListenerContainer container = listenerStorage
-                .computeIfAbsent(getKey(eventType), type -> createEventListenerContainer());
-        container.addListener(define);
-    }
-
-    protected abstract EventListenerContainer createEventListenerContainer();
-
-}

+ 0 - 48
hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/executor/AbstractEventContainer.java

@@ -1,48 +0,0 @@
-package org.hswebframework.web.eventbus.executor;
-
-import lombok.extern.slf4j.Slf4j;
-import org.hswebframework.web.eventbus.EventListenerDefine;
-
-import java.util.*;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-
-/**
- * @author zhouhao
- * @since 1.0
- */
-@Slf4j
-public abstract class AbstractEventContainer implements EventListenerContainer {
-
-    protected final List<EventListenerDefine> defines = new ArrayList<>();
-
-    protected final ReadWriteLock lock = new ReentrantReadWriteLock();
-
-    protected abstract EventListenerExecutor newExecutor();
-
-    protected abstract void executeAfter(EventListenerExecutor executor);
-
-    @Override
-    public void doExecute(Object event) {
-        lock.readLock().lock();
-        try {
-            EventListenerExecutor executor = newExecutor();
-            defines.forEach(define -> executor.doExecute(define, event));
-            executeAfter(executor);
-        } finally {
-            lock.readLock().unlock();
-        }
-    }
-
-    @Override
-    public void addListener(EventListenerDefine listener) {
-        lock.writeLock().lock();
-        try {
-            defines.add(listener);
-            defines.sort(Comparator.comparingInt(EventListenerDefine::getPriority));
-        } finally {
-            lock.writeLock().unlock();
-        }
-    }
-
-}

+ 0 - 31
hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/executor/AsyncEventTaskSupplier.java

@@ -1,31 +0,0 @@
-package org.hswebframework.web.eventbus.executor;
-
-import org.hswebframework.web.eventbus.EventListener;
-import org.hswebframework.web.eventbus.EventListenerDefine;
-import org.hswebframework.web.eventbus.annotation.EventMode;
-
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-/**
- * @author zhouhao
- * @since 3.0
- */
-public class AsyncEventTaskSupplier implements EventExecuteTaskSupplier {
-
-    private static final ExecutorService executorService;
-
-    static {
-        executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2);
-    }
-
-    @Override
-    public boolean isSupport(EventListenerDefine define) {
-        return define.getEventMode() == EventMode.ASYNC && !define.isTransaction();
-    }
-
-    @Override
-    public EventExecuteTask get(EventListener listener, Object event) {
-        return () -> executorService.execute(() -> listener.onEvent(event));
-    }
-}

+ 0 - 33
hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/executor/AsyncTranscationEventTaskSupplier.java

@@ -1,33 +0,0 @@
-package org.hswebframework.web.eventbus.executor;
-
-import org.hswebframework.web.async.BatchAsyncJobContainer;
-import org.hswebframework.web.eventbus.EventListener;
-import org.hswebframework.web.eventbus.EventListenerDefine;
-import org.hswebframework.web.eventbus.annotation.EventMode;
-
-
-/**
- * @author zhouhao
- * @since 3.0
- */
-public class AsyncTranscationEventTaskSupplier implements EventExecuteTaskSupplier {
-
-    public AsyncTranscationEventTaskSupplier(BatchAsyncJobContainer container) {
-        this.container = container;
-    }
-
-    private BatchAsyncJobContainer container;
-
-    @Override
-    public boolean isSupport(EventListenerDefine define) {
-        return define.getEventMode() == EventMode.ASYNC && define.isTransaction();
-    }
-
-    @Override
-    public EventExecuteTask get(EventListener listener, Object event) {
-        return () -> container.submit(() -> {
-            listener.onEvent(event);
-            return true;
-        }, true);
-    }
-}

+ 0 - 72
hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/executor/BackGroundEventTaskSupplier.java

@@ -1,72 +0,0 @@
-package org.hswebframework.web.eventbus.executor;
-
-import lombok.extern.slf4j.Slf4j;
-import org.hswebframework.web.eventbus.EventListener;
-import org.hswebframework.web.eventbus.EventListenerDefine;
-import org.hswebframework.web.eventbus.annotation.EventMode;
-
-import java.util.Queue;
-import java.util.concurrent.*;
-
-/**
- * @author zhouhao
- * @since 1.0
- */
-@Slf4j
-public class BackGroundEventTaskSupplier implements EventExecuteTaskSupplier {
-    private static final Queue<Runnable> queue = new ConcurrentLinkedDeque<>();
-
-    private static volatile boolean running   = true;
-    private static volatile boolean executing = false;
-
-    private static CyclicBarrier barrier = new CyclicBarrier(2);
-
-    static {
-        Thread thread = new Thread(() -> {
-            while (running) {
-                Runnable job = queue.poll();
-                if (job != null) {
-                    executing = true;
-                    try {
-                        job.run();
-                    } catch (Exception e) {
-                        log.error("执行事件执行失败", e);
-                    }
-                } else {
-                    executing = false;
-                    try {
-                        barrier.await(10, TimeUnit.SECONDS);
-                        barrier.reset();
-                    } catch (Exception e) {
-                        log.error(e.getMessage(), e);
-                    }
-                }
-            }
-        });
-        thread.setDaemon(false);
-        thread.setName("BackGroundEventExecutor");
-        Runtime.getRuntime().addShutdownHook(new Thread(() -> running = false));
-        thread.start();
-    }
-
-
-    @Override
-    public boolean isSupport(EventListenerDefine define) {
-        return define.getEventMode() == EventMode.BACKGROUND;
-    }
-
-
-    @Override
-    public EventExecuteTask get(EventListener listener, Object event) {
-        return () -> {
-            queue.add(() -> listener.onEvent(event));
-            try {
-                if (!executing) {
-                    barrier.await();
-                }
-            } catch (Exception e) {
-              //  e.printStackTrace();
-            }
-        };
-    }
-}

+ 0 - 26
hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/executor/DefaultEventExecutor.java

@@ -1,26 +0,0 @@
-package org.hswebframework.web.eventbus.executor;
-
-import lombok.Setter;
-import org.hswebframework.web.eventbus.EventListenerDefine;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author zhouhao
- * @since 3.0
- */
-public class DefaultEventExecutor implements EventListenerExecutor {
-    @Setter
-    private List<EventExecuteTaskSupplier> suppliers = new ArrayList<>();
-
-    @Override
-    public void doExecute(EventListenerDefine define, Object event) {
-        suppliers.stream().filter(supplier -> supplier.isSupport(define))
-                .findFirst()
-                .orElseThrow(() -> new UnsupportedOperationException("不支持的listener定义:" + define))
-                .get(define.getListener(), event)
-                .run();
-    }
-
-}

+ 0 - 9
hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/executor/EventExecuteTask.java

@@ -1,9 +0,0 @@
-package org.hswebframework.web.eventbus.executor;
-
-/**
- * @author zhouhao
- * @since 1.0
- */
-public interface EventExecuteTask {
-    void run();
-}

+ 0 - 16
hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/executor/EventExecuteTaskSupplier.java

@@ -1,16 +0,0 @@
-package org.hswebframework.web.eventbus.executor;
-
-import org.hswebframework.web.eventbus.EventListener;
-import org.hswebframework.web.eventbus.EventListenerDefine;
-
-/**
- * @author zhouhao
- * @since 1.0
- */
-public interface EventExecuteTaskSupplier {
-    boolean isSupport(EventListenerDefine define);
-
-    EventExecuteTask get(EventListener listener, Object event);
-
-   default void close(){}
-}

+ 0 - 14
hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/executor/EventListenerContainer.java

@@ -1,14 +0,0 @@
-package org.hswebframework.web.eventbus.executor;
-
-
-import org.hswebframework.web.eventbus.EventListenerDefine;
-
-/**
- * @author zhouhao
- * @since 3.0
- */
-public interface EventListenerContainer {
-    void doExecute(Object event);
-
-    void addListener(EventListenerDefine listener);
-}

+ 0 - 12
hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/executor/EventListenerExecutor.java

@@ -1,12 +0,0 @@
-package org.hswebframework.web.eventbus.executor;
-
-import org.hswebframework.web.eventbus.EventListener;
-import org.hswebframework.web.eventbus.EventListenerDefine;
-
-/**
- * @author zhouhao
- * @since 3.0
- */
-public interface EventListenerExecutor {
-    void doExecute(EventListenerDefine define, Object event);
-}

+ 0 - 21
hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/executor/SyncEventListenerExecutor.java

@@ -1,21 +0,0 @@
-package org.hswebframework.web.eventbus.executor;
-
-import org.hswebframework.web.eventbus.EventListener;
-import org.hswebframework.web.eventbus.EventListenerDefine;
-import org.hswebframework.web.eventbus.annotation.EventMode;
-
-/**
- * @author zhouhao
- * @since 1.0
- */
-public class SyncEventListenerExecutor implements EventExecuteTaskSupplier {
-    @Override
-    public boolean isSupport(EventListenerDefine define) {
-        return define.getEventMode() == EventMode.SYNC;
-    }
-
-    @Override
-    public EventExecuteTask get(EventListener listener, Object event) {
-        return () -> listener.onEvent(event);
-    }
-}

+ 0 - 53
hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/spring/FastListener.java

@@ -1,53 +0,0 @@
-package org.hswebframework.web.eventbus.spring;
-
-import lombok.extern.slf4j.Slf4j;
-import org.hswebframework.web.boost.Compiler;
-import org.hswebframework.web.eventbus.EventListener;
-import org.springframework.util.ClassUtils;
-
-import java.lang.reflect.Method;
-
-/**
- * @author zhouhao
- * @since 3.0
- */
-@Slf4j
-public class FastListener implements EventListener {
-
-    private Object target;
-
-    private FastListenerCallable callable;
-
-    public FastListener(Object target, Method method) {
-        Class[] type = method.getParameterTypes();
-        Class targetType = ClassUtils.getUserClass(target);
-        this.target = target;
-        StringBuilder methodImpl = new StringBuilder();
-
-        methodImpl.append("public void call(Object target, Object event) throws Exception{\n")
-                .append(targetType.getName())
-                .append(" targetObj=(")
-                .append(targetType.getName())
-                .append(")target;\n").append("targetObj.")
-                .append(method.getName())
-                .append("((").append(type[0].getName()).append(")event);\n")
-                .append("}");
-
-        callable = Compiler.create(FastListenerCallable.class)
-                .addMethod(methodImpl.toString())
-                .newInstance();
-    }
-
-    @Override
-    public void onEvent(Object event) {
-        try {
-            callable.call(target, event);
-        } catch (Exception e) {
-            log.error("执行event[{}]失败", event, e);
-        }
-    }
-
-    public interface FastListenerCallable {
-        void call(Object target, Object event) throws Exception;
-    }
-}

+ 0 - 32
hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/spring/ReflectListener.java

@@ -1,32 +0,0 @@
-package org.hswebframework.web.eventbus.spring;
-
-import lombok.extern.slf4j.Slf4j;
-import org.hswebframework.web.eventbus.EventListener;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-/**
- * @author zhouhao
- * @since 3.0
- */
-@Slf4j
-public class ReflectListener<E> implements EventListener<E> {
-
-    private Object target;
-    private Method method;
-
-    public ReflectListener(Object target, Method method) {
-        this.target = target;
-        this.method = method;
-    }
-
-    @Override
-    public void onEvent(E event) {
-        try {
-            method.invoke(target, event);
-        } catch (Exception e) {
-            log.error("反射执行事件失败. target={},method={},event={}", target, method, event, e);
-        }
-    }
-}

+ 0 - 52
hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/spring/SpringEventBus.java

@@ -1,52 +0,0 @@
-package org.hswebframework.web.eventbus.spring;
-
-import org.hswebframework.web.eventbus.AbstractEventBus;
-import org.hswebframework.web.eventbus.EventListenerDefine;
-import org.hswebframework.web.eventbus.annotation.EventListener;
-import org.hswebframework.web.eventbus.executor.EventListenerContainer;
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.config.BeanPostProcessor;
-
-import java.lang.reflect.Method;
-
-/**
- * @author zhouhao
- * @since 3.0
- */
-public class SpringEventBus extends AbstractEventBus implements BeanPostProcessor {
-
-    @Override
-    protected EventListenerContainer createEventListenerContainer() {
-        return new SpringEventContainer();
-    }
-
-    @Override
-    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
-        return bean;
-    }
-
-    @Override
-    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
-        return processListener(bean);
-    }
-
-    protected Object processListener(Object object) {
-        Method[] methods = object.getClass().getDeclaredMethods();
-        for (Method method : methods) {
-            EventListener eventListener = method.getAnnotation(EventListener.class);
-            if (eventListener != null) {
-                createListener(eventListener, object, method);
-            }
-        }
-        return object;
-    }
-
-    protected void createListener(EventListener type, Object target, Method method) {
-        EventListenerDefine define = EventListenerDefine.builder().eventMode(type.mode())
-                .transaction(type.transaction())
-                .listener(new FastListener(target, method))
-                .build();
-
-        subscribe(method.getParameterTypes()[0], define);
-    }
-}

+ 0 - 16
hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/spring/SpringEventBusAutoConfiguration.java

@@ -1,16 +0,0 @@
-package org.hswebframework.web.eventbus.spring;
-
-import org.hswebframework.web.eventbus.EventBus;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-public class SpringEventBusAutoConfiguration {
-
-    @Bean
-    @ConditionalOnMissingBean(EventBus.class)
-    public SpringEventBus springEventBus() {
-        return new SpringEventBus();
-    }
-}

+ 0 - 40
hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/spring/SpringEventContainer.java

@@ -1,40 +0,0 @@
-package org.hswebframework.web.eventbus.spring;
-
-import org.hswebframework.web.eventbus.annotation.EventMode;
-import org.hswebframework.web.eventbus.executor.*;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * @author zhouhao
- * @since 3.0
- */
-public class SpringEventContainer extends AbstractEventContainer {
-    List<EventExecuteTaskSupplier> suppliers = Arrays.asList(
-            new BackGroundEventTaskSupplier(), new AsyncEventTaskSupplier(),new SyncEventListenerExecutor());
-
-
-    protected boolean hasAsyncTx() {
-        return defines.stream()
-                .anyMatch(define -> define.getEventMode() == EventMode.ASYNC && define.isTransaction());
-    }
-
-    @Override
-    protected EventListenerExecutor newExecutor() {
-        DefaultEventExecutor eventExecutor = new DefaultEventExecutor();
-        List<EventExecuteTaskSupplier> suppliers = new ArrayList<>(this.suppliers);
-//        if (hasAsyncTx()) {
-//            // TODO: 18-3-24
-//        }
-        eventExecutor.setSuppliers(suppliers);
-        return eventExecutor;
-    }
-
-    @Override
-    protected void executeAfter(EventListenerExecutor executor) {
-
-    }
-
-}

+ 0 - 3
hsweb-eventbus/hsweb-eventbus-default/src/main/resources/META-INF/spring.factories

@@ -1,3 +0,0 @@
-# Auto Configure
-org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
-org.hswebframework.web.eventbus.spring.SpringEventBusAutoConfiguration

+ 0 - 33
hsweb-eventbus/hsweb-eventbus-default/src/test/java/org/hswebframework/web/eventbus/spring/SpringEventBusTest.java

@@ -1,33 +0,0 @@
-package org.hswebframework.web.eventbus.spring;
-
-import org.hswebframework.web.eventbus.EventBus;
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-/**
- * @author zhouhao
- * @since 3.0
- */
-@RunWith(SpringRunner.class)
-@SpringBootTest(classes = TestApplication.class,webEnvironment = SpringBootTest.WebEnvironment.NONE)
-public class SpringEventBusTest {
-
-    @Autowired
-    EventBus eventBus;
-
-    @Test
-    public void test() throws InterruptedException {
-        System.out.println(Thread.currentThread().getName());
-        long t = System.currentTimeMillis();
-        eventBus.publish(eventBus);
-        System.out.println(System.currentTimeMillis() - t);
-        Thread.sleep(1000);
-        Assert.assertEquals(Test2.counter.get(), 3);
-    }
-
-
-}

+ 0 - 33
hsweb-eventbus/hsweb-eventbus-default/src/test/java/org/hswebframework/web/eventbus/spring/Test2.java

@@ -1,33 +0,0 @@
-package org.hswebframework.web.eventbus.spring;
-
-import org.hswebframework.web.eventbus.annotation.EventMode;
-import org.hswebframework.web.eventbus.annotation.EventListener;
-import org.springframework.stereotype.Component;
-
-import java.util.concurrent.atomic.AtomicLong;
-
-@Component
-public class Test2 {
-    public static AtomicLong counter = new AtomicLong();
-
-    @EventListener(mode = EventMode.SYNC)
-    public void test1(SpringEventBus eventBus) {
-//            System.out.println(Thread.currentThread().getName());
-//            System.out.println(eventBus);
-        counter.addAndGet(1);
-    }
-
-    @EventListener(mode = EventMode.ASYNC, transaction = false)
-    public void test2(SpringEventBus eventBus) {
-//            System.out.println(Thread.currentThread().getName());
-//            System.out.println(eventBus);
-        counter.addAndGet(1);
-    }
-
-    @EventListener(mode = EventMode.BACKGROUND, transaction = false)
-    public void test3(SpringEventBus eventBus) {
-//            System.out.println(Thread.currentThread().getName());
-//            System.out.println(eventBus);
-        counter.addAndGet(1);
-    }
-}

+ 0 - 13
hsweb-eventbus/hsweb-eventbus-default/src/test/java/org/hswebframework/web/eventbus/spring/TestApplication.java

@@ -1,13 +0,0 @@
-package org.hswebframework.web.eventbus.spring;
-
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.context.annotation.Bean;
-
-@SpringBootApplication
-public class TestApplication {
-
-    @Bean
-    public Test2 test2(){
-        return new Test2();
-    }
-}

+ 0 - 9
hsweb-eventbus/hsweb-eventbus-default/src/test/resources/application.yml

@@ -1,9 +0,0 @@
-spring:
-    aop:
-        auto: true
-    datasource:
-       url : jdbc:h2:mem:permission_test_mem
-       username : sa
-       password :
-       type: com.alibaba.druid.pool.DruidDataSource
-       driver-class-name : org.h2.Driver

+ 0 - 20
hsweb-eventbus/pom.xml

@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>hsweb-framework</artifactId>
-        <groupId>org.hswebframework.web</groupId>
-        <version>3.0-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>hsweb-eventbus</artifactId>
-    <packaging>pom</packaging>
-    <modules>
-        <module>hsweb-eventbus-api</module>
-        <module>hsweb-eventbus-default</module>
-    </modules>
-
-
-</project>

+ 9 - 0
hsweb-starter/hsweb-spring-boot-starter/src/main/java/org/hswebframework/web/starter/RestControllerExceptionTranslator.java

@@ -121,6 +121,15 @@ public class RestControllerExceptionTranslator {
         return ResponseMessage.error(500, exception.getMessage());
     }
 
+    @ExceptionHandler(NullPointerException.class)
+    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
+    @ResponseBody
+    ResponseMessage handleException(NullPointerException exception) {
+        logger.error(exception.getMessage(), exception);
+        return ResponseMessage.error(500, "服务器内部错误");
+    }
+
+
     @ExceptionHandler(SQLException.class)
     @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
     @ResponseBody

+ 4 - 1
hsweb-starter/hsweb-spring-boot-starter/src/main/java/org/hswebframework/web/starter/entity/EntityFactoryInitConfiguration.java

@@ -1,5 +1,6 @@
 package org.hswebframework.web.starter.entity;
 
+import org.hswebframework.web.commons.entity.factory.DefaultPropertyCopier;
 import org.hswebframework.web.commons.entity.factory.MapperEntityFactory;
 import org.hswebframework.web.commons.entity.factory.PropertyCopier;
 import org.springframework.beans.BeansException;
@@ -18,7 +19,9 @@ public class EntityFactoryInitConfiguration implements BeanPostProcessor {
 
     @Override
     public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
-        if (bean instanceof PropertyCopier) {
+        if (bean instanceof DefaultPropertyCopier) {
+            mapperEntityFactory.setDefaultPropertyCopier(((DefaultPropertyCopier) bean));
+        } else if (bean instanceof PropertyCopier) {
             mapperEntityFactory.addCopier(((PropertyCopier) bean));
         }
         if (bean instanceof EntityMappingCustomer) {

+ 0 - 1
pom.xml

@@ -40,7 +40,6 @@
         <module>hsweb-examples</module>
         <module>hsweb-boost</module>
         <module>hsweb-thirdparty</module>
-        <module>hsweb-eventbus</module>
     </modules>
 
     <packaging>pom</packaging>