Browse Source

优化设置

zhouhao 6 years ago
parent
commit
6935f2301c
17 changed files with 395 additions and 149 deletions
  1. 10 2
      hsweb-core/src/main/java/org/hswebframework/web/bean/FastBeanCopier.java
  2. 1 1
      hsweb-core/src/main/java/org/hswebframework/web/dict/DictDefine.java
  3. 7 6
      hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultClassDictDefine.java
  4. 1 1
      hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultDictDefine.java
  5. 1 0
      hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultDictParser.java
  6. 0 73
      hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultDictSupportApi.java
  7. 49 7
      hsweb-core/src/main/java/org/hswebframework/web/proxy/Proxy.java
  8. 17 1
      hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/pom.xml
  9. 17 2
      hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/dict/DictionaryOptionalConvertBuilderStrategy.java
  10. 10 5
      hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/dict/EnumDictOptionConverter.java
  11. 44 36
      hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/dict/EnumDictValueConverter.java
  12. 52 0
      hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/validator/DynamicBeanValidator.java
  13. 66 0
      hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/validator/DynamicBeanValidatorFactory.java
  14. 0 5
      hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/validator/GroovyVlidator.java
  15. 110 0
      hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/validator/MapBean.java
  16. 1 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-local/src/main/java/org/hswebframework/web/service/organizational/simple/relations/DefaultLinkedRelations.java
  17. 9 10
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/DefaultCandidateDimensionParser.java

+ 10 - 2
hsweb-core/src/main/java/org/hswebframework/web/bean/FastBeanCopier.java

@@ -136,11 +136,19 @@ public final class FastBeanCopier {
     }
 
     public static Copier createCopier(Class source, Class target) {
+        String sourceName = source.getName();
+        String tartName = source.getName();
+        if (sourceName.startsWith("package ")) {
+            sourceName = sourceName.substring("package ".length());
+        }
+        if (tartName.startsWith("package ")) {
+            tartName = tartName.substring("package ".length());
+        }
         String method = "public void copy(Object s, Object t, java.util.Set ignore, " +
                 "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" +
+                sourceName + " source=(" + sourceName + ")s;\n\t" +
+                tartName + " target=(" + tartName + ")t;\n\t" +
                 createCopierCode(source, target) +
                 "}catch(Exception e){\n" +
                 "\tthrow new RuntimeException(e.getMessage(),e);" +

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

@@ -16,6 +16,6 @@ public interface DictDefine extends Serializable {
 
     String getParserId();
 
-    List<EnumDict<String>> getItems();
+    List<EnumDict<Object>> getItems();
 
 }

+ 7 - 6
hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultClassDictDefine.java

@@ -19,10 +19,11 @@ import java.util.List;
 @NoArgsConstructor
 @AllArgsConstructor
 public class DefaultClassDictDefine implements ClassDictDefine {
-    private String           field;
-    private String           id;
-    private String           alias;
-    private String           comments;
-    private String           parserId;
-    private List<EnumDict> items;
+    private static final long serialVersionUID = -4113467848927281082L;
+    private String                 field;
+    private String                 id;
+    private String                 alias;
+    private String                 comments;
+    private String                 parserId;
+    private List<EnumDict<Object>> items;
 }

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

@@ -23,5 +23,5 @@ public class DefaultDictDefine implements DictDefine {
     private String           alias;
     private String           comments;
     private String           parserId;
-    private List<EnumDict<String>> items;
+    private List<EnumDict<Object>> items;
 }

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

@@ -32,6 +32,7 @@ public class DefaultDictParser implements DictParser {
                 .stream()
                 .filter(itemDefine -> itemDefine.eq(text))
                 .map(EnumDict::getValue)
+                .map(String::valueOf)
                 .findFirst()
                 .orElse(text);
     }

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

@@ -43,85 +43,12 @@ public class DefaultDictSupportApi implements DictSupportApi {
     @Override
     @SuppressWarnings("all")
     public <T> T unwrap(T target) {
-        if (target == null) {
-            return null;
-        }
-        if (target instanceof Map) {
-            return target;
-        }
-        if (target instanceof List) {
-            return (T) ((List) target).stream()
-                    .map(this::wrap)
-                    .collect(Collectors.toList());
-        }
-        if (target instanceof String || target.getClass().isEnum() || target.getClass().isPrimitive() || target instanceof Type) {
-            return target;
-        }
-
-        Class type = ClassUtils.getUserClass(target);
-        List<ClassDictDefine> defines = repository.getDefine(type);
-        if (defines.isEmpty()) {
-            return target;
-        }
-        for (ClassDictDefine define : defines) {
-            String fieldName = define.getField();
-            String alias = define.getAlias();
-            if (StringUtils.isEmpty(alias)) {
-                continue;
-            }
-            try {
-                Object fieldValue = BeanUtils.getProperty(target, fieldName);
-                if (fieldValue != null) {
-                    continue;
-                }
-                Object value = BeanUtils.getProperty(target, alias);
-                if (value == null) {
-                    continue;
-                }
-                BeanUtils.setProperty(target, fieldName, getParser(define.getParserId()).parseValue(define, String.valueOf(value)));
-            } catch (Exception e) {
-                log.warn("unwrap error", e.getMessage());
-            }
-        }
         return target;
     }
 
     @Override
     @SuppressWarnings("all")
     public <T> T wrap(T target) {
-        if (target == null) {
-            return null;
-        }
-        if (target instanceof Map) {
-            return target;
-        }
-        if (target instanceof List) {
-            return (T) ((List) target).stream().map(this::wrap).collect(Collectors.toList());
-        }
-        if (target instanceof String || target.getClass().isEnum() || target.getClass().isPrimitive() || target instanceof Type) {
-            return target;
-        }
-        Class type = ClassUtils.getUserClass(target);
-        List<ClassDictDefine> defines = repository.getDefine(type);
-        if (defines.isEmpty()) {
-            return target;
-        }
-        for (ClassDictDefine define : defines) {
-            String fieldName = define.getField();
-            String alias = define.getAlias();
-            if (StringUtils.isEmpty(alias)) {
-                continue;
-            }
-            try {
-                Object value = BeanUtils.getProperty(target, fieldName);
-                if (value == null) {
-                    continue;
-                }
-                BeanUtils.setProperty(target, alias, getParser(define.getParserId()).parseText(define, String.valueOf(value)));
-            } catch (Exception e) {
-                log.warn("wrap error", e.getMessage());
-            }
-        }
         return target;
     }
 }

+ 49 - 7
hsweb-core/src/main/java/org/hswebframework/web/proxy/Proxy.java

@@ -3,10 +3,17 @@ package org.hswebframework.web.proxy;
 import javassist.*;
 import javassist.bytecode.AnnotationsAttribute;
 import javassist.bytecode.ConstPool;
+import javassist.bytecode.annotation.*;
+import javassist.scopedpool.*;
 import lombok.Getter;
 import lombok.SneakyThrows;
+import org.springframework.core.annotation.AnnotatedElementUtils;
+import org.springframework.core.type.AnnotationMetadata;
+import org.springframework.core.type.StandardAnnotationMetadata;
 import org.springframework.util.ClassUtils;
 
+import java.util.Arrays;
+import java.util.Map;
 import java.util.concurrent.atomic.AtomicLong;
 
 /**
@@ -37,11 +44,11 @@ public class Proxy<I> {
             throw new NullPointerException("superClass can not be null");
         }
         this.superClass = superClass;
+
         ClassPool classPool = new ClassPool(true);
 
         ClassPath classPath = new ClassClassPath(this.getClass());
         classPool.insertClassPath(classPath);
-
         if (classPathString != null) {
             for (String path : classPathString) {
                 classPool.insertClassPath(path);
@@ -51,7 +58,6 @@ public class Proxy<I> {
         classFullName = superClass.getPackage() + "." + className;
 
         ctClass = classPool.makeClass(classFullName);
-
         if (superClass != Object.class) {
             if (superClass.isInterface()) {
                 ctClass.setInterfaces(new CtClass[]{classPool.get(superClass.getName())});
@@ -74,16 +80,52 @@ public class Proxy<I> {
         return addField(code, null);
     }
 
+    public Proxy<I> addField(String code, Class<? extends java.lang.annotation.Annotation> annotation) {
+        return addField(code, annotation, null);
+    }
+
+    @SuppressWarnings("all")
+    protected MemberValue createMemberValue(Object value, ConstPool constPool) {
+        MemberValue memberValue = null;
+        if (value instanceof Integer) {
+            memberValue = new IntegerMemberValue(constPool, ((Integer) value));
+        } else if (value instanceof Boolean) {
+            memberValue = new BooleanMemberValue((Boolean) value, constPool);
+        } else if (value instanceof Long) {
+            memberValue = new LongMemberValue((Long) value, constPool);
+        } else if (value instanceof String) {
+            memberValue = new StringMemberValue((String) value, constPool);
+        } else if (value instanceof Class) {
+            memberValue = new ClassMemberValue(((Class) value).getName(), constPool);
+        } else if (value instanceof Object[]) {
+            Object[] arr = ((Object[]) value);
+            ArrayMemberValue arrayMemberValue = new ArrayMemberValue(new ClassMemberValue(arr[0].getClass().getName(), constPool), constPool);
+            arrayMemberValue.setValue(Arrays.stream(arr)
+                    .map(o -> createMemberValue(o, constPool))
+                    .toArray(MemberValue[]::new));
+            memberValue=arrayMemberValue;
+
+        }
+        return memberValue;
+    }
+
     @SneakyThrows
-    public Proxy<I> addField(String code, String annotation) {
+    public Proxy<I> addField(String code, Class<? extends java.lang.annotation.Annotation> annotation, Map<String, Object> annotationProperties) {
         return handleException(() -> {
             CtField ctField = CtField.make(code, ctClass);
             if (null != annotation) {
                 ConstPool constPool = ctClass.getClassFile().getConstPool();
-                AnnotationsAttribute attributeInfo =
-                        new AnnotationsAttribute(constPool, AnnotationsAttribute.visibleTag);
-                attributeInfo.addAnnotation(
-                        new javassist.bytecode.annotation.Annotation(annotation, constPool));
+                AnnotationsAttribute attributeInfo = new AnnotationsAttribute(constPool, AnnotationsAttribute.visibleTag);
+                Annotation ann = new javassist.bytecode.annotation.Annotation(annotation.getName(), constPool);
+                if (null != annotationProperties) {
+                    annotationProperties.forEach((key, value) -> {
+                        MemberValue memberValue = createMemberValue(value, constPool);
+                        if (memberValue != null) {
+                            ann.addMemberValue(key, memberValue);
+                        }
+                    });
+                }
+                attributeInfo.addAnnotation(ann);
                 ctField.getFieldInfo().addAttribute(attributeInfo);
             }
             ctClass.addField(ctField);

+ 17 - 1
hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/pom.xml

@@ -13,8 +13,24 @@
     <artifactId>hsweb-system-dynamic-form-local</artifactId>
 
 
-
     <dependencies>
+        <dependency>
+            <groupId>javax.el</groupId>
+            <artifactId>javax.el-api</artifactId>
+            <version>2.2.4</version>
+            <optional>true</optional>
+        </dependency>
+
+        <dependency>
+            <groupId>org.glassfish</groupId>
+            <artifactId>javax.el</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <optional>true</optional>
+        </dependency>
         <dependency>
             <groupId>org.hswebframework.web</groupId>
             <artifactId>hsweb-commons-service-simple</artifactId>

+ 17 - 2
hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/dict/DictionaryOptionalConvertBuilderStrategy.java

@@ -4,9 +4,13 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import org.hswebframework.ezorm.core.OptionConverter;
 import org.hswebframework.web.dict.DictDefineRepository;
+import org.hswebframework.web.dict.EnumDict;
 import org.hswebframework.web.entity.form.DictConfig;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+import java.util.Arrays;
 
 
 /**
@@ -14,6 +18,7 @@ import org.springframework.stereotype.Component;
  * @since 3.0
  */
 @Component
+@SuppressWarnings("all")
 public class DictionaryOptionalConvertBuilderStrategy implements OptionalConvertBuilderStrategy {
     @Autowired(required = false)
     private DictDefineRepository dictDefineRepository;
@@ -27,10 +32,20 @@ public class DictionaryOptionalConvertBuilderStrategy implements OptionalConvert
     @Override
     public OptionConverter build(DictConfig dictConfig) {
         JSONObject conf = JSON.parseObject(dictConfig.getConfig());
-        String dictType = conf.getString("dictType");
+        String dictId = conf.getString("dictId");
+        String fieldName = conf.getString("fieldName");
+        String sppliter = conf.getString("sppliter");
+
+        String writeObject = conf.getString("writeObject");
+
+        EnumDictOptionConverter<EnumDict<Object>> converter = new EnumDictOptionConverter<>(() -> dictDefineRepository.getDefine(dictId).getItems(), fieldName);
 
+        converter.setWriteObject(!"false".equalsIgnoreCase(writeObject));
 
+        if (!StringUtils.isEmpty(sppliter)) {
+            converter.setSplitter(str -> Arrays.asList(str.split(sppliter)));
+        }
 
-        return null;
+        return converter;
     }
 }

+ 10 - 5
hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/dict/EnumDictOptionConverter.java

@@ -7,8 +7,10 @@ import org.hswebframework.ezorm.core.OptionConverter;
 import org.hswebframework.web.dict.EnumDict;
 
 import java.util.*;
+import java.util.function.Function;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 @Slf4j
 public class EnumDictOptionConverter<T extends EnumDict> implements OptionConverter {
@@ -17,7 +19,11 @@ public class EnumDictOptionConverter<T extends EnumDict> implements OptionConver
 
     @Getter
     @Setter
-    protected boolean multi;
+    protected Function<Stream<String>, String> dictToText = stream -> stream.collect(Collectors.joining(","));
+
+    @Setter
+    @Getter
+    protected Function<String, List<Object>> splitter = str -> Arrays.asList(str.split("[, ; ;]"));
 
     @Getter
     @Setter
@@ -51,7 +57,7 @@ public class EnumDictOptionConverter<T extends EnumDict> implements OptionConver
     public Object converterValue(Object o) {
         List<Object> values;
         if (o instanceof String) {
-            values = Arrays.asList(((String) o).split("[, ; ;]"));
+            values = splitter.apply((String) o);
         } else if (o instanceof Object[]) {
             values = Arrays.asList(((Object[]) o));
         } else if (o instanceof Collection) {
@@ -65,11 +71,10 @@ public class EnumDictOptionConverter<T extends EnumDict> implements OptionConver
                     .filter(e -> e.eq(o))
                     .collect(Collectors.toSet());
         }
-        return allOptionSupplier.get()
+        return dictToText.apply(allOptionSupplier.get()
                 .stream()
                 .filter(e -> e.eq(o))
                 .map(EnumDict::getText)
-                .map(String::valueOf)
-                .collect(Collectors.joining(","));
+                .map(String::valueOf));
     }
 }

+ 44 - 36
hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/dict/EnumDictValueConverter.java

@@ -11,6 +11,7 @@ import java.util.*;
 import java.util.function.Function;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 @Slf4j
 public class EnumDictValueConverter<T extends EnumDict> implements ValueConverter {
@@ -22,6 +23,14 @@ public class EnumDictValueConverter<T extends EnumDict> implements ValueConverte
         return null;
     };
 
+    @Getter
+    @Setter
+    protected Function<Stream<String>, String> multiValueConvert = stream -> stream.collect(Collectors.joining(","));
+
+    @Setter
+    @Getter
+    protected Function<String, List<Object>> splitter = str -> Arrays.asList(str.split("[, ; ;]"));
+
     public EnumDictValueConverter(Supplier<List<T>> allOptionSupplier) {
         this.allOptionSupplier = allOptionSupplier;
     }
@@ -50,70 +59,69 @@ public class EnumDictValueConverter<T extends EnumDict> implements ValueConverte
 
     @Override
     @SuppressWarnings("all")
-    public Object getData(Object o) {
-        if (StringUtils.isEmpty(o)) {
-            return o;
+    public Object getData(Object value) {
+        if (StringUtils.isEmpty(value)) {
+            return value;
         }
         //多选
         if (multi) {
             List<Object> values;
-            if (o instanceof String) {
-                values = Arrays.asList(((String) o).split("[, ; ;]"));
-            } else if (o instanceof Object[]) {
-                values = Arrays.asList(((Object[]) o));
-            } else if (o instanceof Collection) {
-                values = new ArrayList<>(((Collection) o));
+            if (value instanceof String) {
+                values = splitter.apply((String) value);
+            } else if (value instanceof Object[]) {
+                values = Arrays.asList(((Object[]) value));
+            } else if (value instanceof Collection) {
+                values = new ArrayList<>(((Collection) value));
             } else {
-                values = Collections.singletonList(o);
+                values = Collections.singletonList(value);
             }
             //转为mask
             if (dataToMask) {
-                if (o instanceof Number) {
-                    return ((Number) o).longValue();
+                if (value instanceof Number) {
+                    return ((Number) value).longValue();
                 }
                 return EnumDict.toMask(values.stream()
                         .map(this::find)
                         .filter(Objects::nonNull)
                         .toArray(EnumDict[]::new));
             }
-            //以逗号分隔
-            return values.stream()
-                    .map(this::find)
-                    .filter(Objects::nonNull)
-                    .map(EnumDict::getValue)
-                    .map(String::valueOf)
-                    .collect(Collectors.joining(","));
+            return multiValueConvert
+                    .apply(values.stream()
+                            .map(this::find)
+                            .filter(Objects::nonNull)
+                            .map(EnumDict::getValue)
+                            .map(String::valueOf));
         }
 
-        return Optional.ofNullable(this.find(o))
+        return Optional.ofNullable(this.find(value))
                 .map(EnumDict::getValue)
-                .orElse(o);
+                .orElse(value);
     }
 
     @Override
-    public Object getValue(Object o) {
+    public Object getValue(Object data) {
         if (multi) {
             if (dataToMask) {
                 Long mask = null;
-                if (org.hswebframework.utils.StringUtils.isNumber(o)) {
-                    mask = org.hswebframework.utils.StringUtils.toLong(o);
+                if (org.hswebframework.utils.StringUtils.isNumber(data)) {
+                    mask = org.hswebframework.utils.StringUtils.toLong(data);
                 }
                 if (mask != null) {
-                    return EnumDict.getByMask(allOptionSupplier, mask)
-                            .stream()
-                            .map(EnumDict::getValue)
-                            .map(String::valueOf)
-                            .collect(Collectors.joining(","));
+                    return multiValueConvert
+                            .apply(EnumDict.getByMask(allOptionSupplier, mask)
+                                    .stream()
+                                    .map(EnumDict::getValue)
+                                    .map(String::valueOf));
                 }
             }
-            return allOptionSupplier.get()
-                    .stream()
-                    .filter(e -> e.eq(o))
-                    .map(EnumDict::getValue)
-                    .map(String::valueOf)
-                    .collect(Collectors.joining(","));
+            return multiValueConvert
+                    .apply(allOptionSupplier.get()
+                            .stream()
+                            .filter(e -> e.eq(data))
+                            .map(EnumDict::getValue)
+                            .map(String::valueOf));
         }
-        return o;
+        return data;
     }
 
 }

+ 52 - 0
hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/validator/DynamicBeanValidator.java

@@ -0,0 +1,52 @@
+package org.hswebframework.web.service.form.simple.validator;
+
+import org.hibernate.validator.constraints.NotBlank;
+import org.hswebframework.ezorm.core.Validator;
+import org.hswebframework.web.Maps;
+import org.hswebframework.web.bean.FastBeanCopier;
+import org.hswebframework.web.commons.bean.ValidateBean;
+import org.hswebframework.web.proxy.Proxy;
+import org.hswebframework.web.validator.group.CreateGroup;
+import org.hswebframework.web.validator.group.UpdateGroup;
+
+import javax.validation.GroupSequence;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.function.Supplier;
+
+public class DynamicBeanValidator implements Validator {
+
+    protected Supplier<ValidateBean> beanSupplier;
+
+    public static void main(String[] args) {
+        MapBean bean = Proxy.create(MapBean.class)
+                .addField("private String name;", NotBlank.class, Maps.<String, Object>buildMap()
+                        .put("message", "测试")
+                        .put("groups", new Class[]{CreateGroup.class})
+                        .get())
+                .addMethod("public String getName(){return this.name;}")
+                .addMethod("public java.util.Set keySet(){return new java.util.HashSet(java.util.Arrays.asList(new String[]{\"name\"}));}")
+                .addMethod("public void setName(String name){  this.name=name;}")
+                .addMethod("public void setProperty(String name,Object value){  this.name=(String)value;}")
+                .addMethod("public Object getProperty(String name){ return this.name;}")
+                .newInstance();
+
+
+        bean.setProperty("name", "test");
+
+        System.out.println((MapBean) bean.tryValidate(CreateGroup.class));
+
+    }
+
+    @Override
+    public boolean validate(Object o, Operation operation) {
+        ValidateBean validateBean = beanSupplier.get();
+        FastBeanCopier.copy(o, validateBean);
+        if (operation == Operation.INSERT) {
+            validateBean.tryValidate(CreateGroup.class);
+        } else {
+            validateBean.tryValidate(UpdateGroup.class);
+        }
+        return true;
+    }
+}

+ 66 - 0
hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/validator/DynamicBeanValidatorFactory.java

@@ -0,0 +1,66 @@
+package org.hswebframework.web.service.form.simple.validator;
+
+import org.hswebframework.ezorm.core.Validator;
+import org.hswebframework.ezorm.core.ValidatorFactory;
+import org.hswebframework.ezorm.core.meta.ColumnMetaData;
+import org.hswebframework.ezorm.core.meta.TableMetaData;
+import org.hswebframework.utils.StringUtils;
+import org.hswebframework.web.bean.FastBeanCopier;
+import org.hswebframework.web.proxy.Proxy;
+
+/**
+ * @author zhouhao
+ * @since 3.0.0-RC
+ */
+public class DynamicBeanValidatorFactory implements ValidatorFactory {
+
+    private String createSetPropertyCode(TableMetaData tableMetaData) {
+        StringBuilder builder = new StringBuilder();
+        builder.append("public void setProperty(String property,Object value){");
+        for (ColumnMetaData column : tableMetaData.getColumns()) {
+            String propertyName = column.getAlias();
+            Class type = column.getJavaType();
+            builder.append("if(property.intern()==\"")
+                    .append(propertyName)
+                    .append("\"||property.intern()==\"")
+                    .append(column.getName()).append("\"){\n")
+                    .append("this.set")
+                    .append(StringUtils.toUpperCaseFirstOne(propertyName))
+                    .append("((").append(type.getName()).append(")")
+                    .append("org.hswebframework.web.bean.FastBeanCopier.DEFAULT_CONVERT.convert(value,")
+                    .append(type.getName())
+                    .append(",null))")
+                    .append("\n}");
+
+        }
+        return builder.toString();
+    }
+
+    @Override
+    public Validator createValidator(TableMetaData tableMetaData) {
+        StringBuilder builder = new StringBuilder();
+
+        Proxy<MapBean> proxy = Proxy.create(MapBean.class);
+        proxy.addField("private java.util.Map proxy;")
+                .addMethod("public java.util.Map getProxy(){return this.proxy;};")
+                .addMethod("public org.hswebframework.web.service.form.simple.validator.MapBean setProxy(java.util.Map proxy){ this.proxy=proxy; return this;};");
+
+
+        for (ColumnMetaData column : tableMetaData.getColumns()) {
+            String propertyName = column.getAlias();
+            Class type = column.getJavaType();
+            String typeName = type.getName();
+
+            proxy.addField("private " + type.getName() + " " + propertyName + ";");
+            proxy.addField("public void set " + StringUtils.toUpperCaseFirstOne(propertyName) + "(" + typeName + " " + propertyName + "){\n" +
+                    "this." + propertyName + "=" + propertyName + ";\n" +
+                    "\n};");
+            proxy.addField("public " + typeName + " get " + StringUtils.toUpperCaseFirstOne(propertyName) + "(){\n" +
+                    "return this." + propertyName + ";\n" +
+                    "\n};");
+        }
+        proxy.addMethod(createSetPropertyCode(tableMetaData));
+
+        return null;
+    }
+}

+ 0 - 5
hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/validator/GroovyVlidator.java

@@ -1,5 +0,0 @@
-package org.hswebframework.web.service.form.simple.validator;
-
-public class GroovyVlidator {
-
-}

+ 110 - 0
hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/validator/MapBean.java

@@ -0,0 +1,110 @@
+package org.hswebframework.web.service.form.simple.validator;
+
+import org.hswebframework.web.commons.bean.ValidateBean;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * @author zhouhao
+ * @since 3.0.0
+ */
+public interface MapBean extends Map<String, Object>, ValidateBean {
+
+    @Override
+    default int size() {
+        return keySet().size();
+    }
+
+    @Override
+    default boolean isEmpty() {
+        return values().isEmpty();
+    }
+
+    @Override
+    default boolean containsKey(Object key) {
+        return keySet().contains(key);
+    }
+
+    @Override
+    default boolean containsValue(Object value) {
+        return values().contains(value);
+    }
+
+    @Override
+    default Set<Entry<String, Object>> entrySet() {
+        return keySet()
+                .stream()
+                .map(key -> new Entry<String, Object>() {
+                    @Override
+                    public String getKey() {
+                        return key;
+                    }
+
+                    @Override
+                    public Object getValue() {
+                        return getProperty(key);
+                    }
+
+                    @Override
+                    public Object setValue(Object value) {
+                        Object old = getValue();
+                        setProperty(key, value);
+                        return old;
+                    }
+
+                    @Override
+                    public boolean equals(Object o) {
+                        return getValue() != null && getValue().equals(o);
+                    }
+
+                    @Override
+                    public int hashCode() {
+                        return getValue() == null ? 0 : getValue().hashCode();
+                    }
+                })
+                .collect(Collectors.toSet());
+    }
+
+    @Override
+    default void putAll(Map<? extends String, ?> m) {
+        m.forEach(this::setProperty);
+    }
+
+    default void clear() {
+        for (String property : keySet()) {
+            setProperty(property, null);
+        }
+    }
+
+    @Override
+    default Collection<Object> values() {
+        return keySet()
+                .stream()
+                .map(this::getProperty)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    Set<String> keySet();
+
+    @Override
+    default Object get(Object key) {
+        return getProperty(String.valueOf(key));
+    }
+
+    @Override
+    default Object put(String key, Object value) {
+        Object old = get(key);
+        setProperty(key, value);
+        return old;
+    }
+
+    void setProperty(String key, Object value);
+
+    Object getProperty(String key);
+}

+ 1 - 0
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-local/src/main/java/org/hswebframework/web/service/organizational/simple/relations/DefaultLinkedRelations.java

@@ -80,6 +80,7 @@ public class DefaultLinkedRelations<C extends LinkedRelations> implements Linked
 
     public Supplier<List<String>> createLazyIdSupplier(Supplier<List<String>> idSupplier) {
         return Lazy.val(() -> {
+
             List<String> ids = idSupplier.get();
 
             return (Supplier) () -> ids;

+ 9 - 10
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/DefaultCandidateDimensionParser.java

@@ -36,16 +36,15 @@ public class DefaultCandidateDimensionParser implements CandidateDimensionParser
         }
 
         return Lazy.val(() -> {
-                    List<String> list = strategies
-                            .stream()
-                            .filter(strategy -> strategy.support(type))
-                            .map(strategy -> strategy.parse(context,config))
-                            .filter(CollectionUtils::isNotEmpty)
-                            .flatMap(Collection::stream)
-                            .collect(Collectors.toList());
-                    return (CandidateDimension) () -> list;
-                }
-                , CandidateDimension.class);
+            List<String> list = strategies
+                    .stream()
+                    .filter(strategy -> strategy.support(type))
+                    .map(strategy -> strategy.parse(context, config))
+                    .filter(CollectionUtils::isNotEmpty)
+                    .flatMap(Collection::stream)
+                    .collect(Collectors.toList());
+            return (CandidateDimension) () -> list;
+        }, CandidateDimension.class);
 
     }
 }