Browse Source

增加触发器支持

zhouhao 7 years ago
parent
commit
93e66d611f

+ 13 - 6
hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-service/hsweb-system-dynamic-form-service-simple/src/main/java/org/hswebframework/web/service/form/simple/SimpleDynamicFormOperationService.java

@@ -18,9 +18,11 @@ import org.hswebframework.web.service.form.DynamicFormService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
 
 import java.sql.SQLException;
 import java.util.List;
+import java.util.Objects;
 
 @Service("dynamicFormOperationService")
 @Transactional
@@ -41,13 +43,12 @@ public class SimpleDynamicFormOperationService implements DynamicFormOperationSe
     }
 
     protected <T> RDBTable<T> getTable(String formId){
-        DynamicFormEntity entity= dynamicFormService.selectByPk(formId);
-        if(null==entity)throw new NotFoundException("表单不存在");
+        DynamicFormEntity form= dynamicFormService.selectByPk(formId);
+        if(null==form)throw new NotFoundException("表单不存在");
 
-        RDBDatabase database=entity.getDataSourceId()!=null?
-                databaseRepository.getDatabase(entity.getDataSourceId()):
-                databaseRepository.getDefaultDatabase();
-        return database.getTable(entity.getDatabaseTableName());
+        RDBDatabase database= StringUtils.isEmpty(form.getDataSourceId())?
+                databaseRepository.getDefaultDatabase():databaseRepository.getDatabase(form.getDataSourceId());
+        return database.getTable(form.getDatabaseTableName());
     };
     @Override
     public <T> PagerResult<T> selectPager(String formId, QueryParamEntity paramEntity) {
@@ -109,6 +110,9 @@ public class SimpleDynamicFormOperationService implements DynamicFormOperationSe
 
     @Override
     public <T> int update(String formId, UpdateParamEntity<T> paramEntity) {
+        if(Objects.requireNonNull(paramEntity).getTerms().isEmpty()){
+            throw new UnsupportedOperationException("can not use empty condition for update");
+        }
         RDBTable table=getTable(formId);
         try {
             Update<T> update=table.createUpdate();
@@ -134,6 +138,9 @@ public class SimpleDynamicFormOperationService implements DynamicFormOperationSe
 
     @Override
     public int delete(String formId, DeleteParamEntity paramEntity) {
+        if(Objects.requireNonNull(paramEntity).getTerms().isEmpty()){
+            throw new UnsupportedOperationException("can not use empty condition for delete");
+        }
         RDBTable table=getTable(formId);
         try {
             Delete delete=table.createDelete();

+ 36 - 0
hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-service/hsweb-system-dynamic-form-service-simple/src/main/java/org/hswebframework/web/service/form/simple/SimpleDynamicFormService.java

@@ -1,12 +1,20 @@
 package org.hswebframework.web.service.form.simple;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.hsweb.ezorm.core.Trigger;
 import org.hsweb.ezorm.core.ValueConverter;
 import org.hsweb.ezorm.rdb.RDBDatabase;
 import org.hsweb.ezorm.rdb.meta.RDBColumnMetaData;
 import org.hsweb.ezorm.rdb.meta.RDBTableMetaData;
 import org.hsweb.ezorm.rdb.meta.converter.*;
 import org.hsweb.ezorm.rdb.render.dialect.Dialect;
+import org.hsweb.ezorm.rdb.simple.trigger.ScriptTraggerSupport;
+import org.hswebframework.expands.script.engine.DynamicScriptEngine;
+import org.hswebframework.expands.script.engine.DynamicScriptEngineFactory;
+import org.hswebframework.web.BusinessException;
 import org.hswebframework.web.commons.entity.DataStatus;
 import org.hswebframework.web.dao.form.DynamicFormColumnDao;
 import org.hswebframework.web.dao.form.DynamicFormDao;
@@ -296,12 +304,40 @@ public class SimpleDynamicFormService extends GenericEntityService<DynamicFormEn
         }
     }
 
+    protected Map<String,Trigger> buildTrigger(String config){
+        if(StringUtils.isEmpty(config))return new HashMap<>();
+        JSONArray triggerConfig = JSON.parseArray(config);
+        Map<String,Trigger> triggers=new HashMap<>();
+        for (int i = 0; i < triggerConfig.size(); i++) {
+            JSONObject single = triggerConfig.getJSONObject(i);
+            String trigger = single.getString("trigger");
+            String language = single.getString("language");
+            String script = single.getString("script");
+            String scriptId = DigestUtils.md5Hex(script);
+            try {
+                DynamicScriptEngine engine = DynamicScriptEngineFactory.getEngine(language);
+                if(engine==null){
+                    throw new UnsupportedOperationException("not support script language : "+language);
+                }
+                if (!engine.compiled(scriptId)) {
+                    engine.compile(scriptId, script);
+                }
+                Trigger singleTrigger = new ScriptTraggerSupport(engine,scriptId);
+                triggers.put(trigger,singleTrigger);
+            }catch (Exception e){
+                throw new BusinessException("compile script error :"+e.getMessage(),e);
+            }
+        }
+        return triggers;
+    }
+
     protected RDBTableMetaData buildTable(RDBDatabase database, DynamicFormEntity form, List<DynamicFormColumnEntity> columns) {
         RDBTableMetaData metaData = new RDBTableMetaData();
         metaData.setComment(form.getDescribe());
         metaData.setName(form.getDatabaseTableName());
         metaData.setProperties(form.getProperties());
         metaData.setAlias(form.getAlias());
+        buildTrigger(form.getTriggers()).forEach(metaData::on);
         columns.forEach(column -> {
             RDBColumnMetaData columnMeta = new RDBColumnMetaData();
             columnMeta.setName(column.getColumnName());

+ 5 - 0
hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-starter/pom.xml

@@ -45,6 +45,11 @@
             <artifactId>h2</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.codehaus.groovy</groupId>
+            <artifactId>groovy-all</artifactId>
+            <scope>test</scope>
+        </dependency>
       
         <dependency>
             <groupId>com.alibaba</groupId>

+ 7 - 0
hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-starter/src/test/java/org/hswebframework/web/service/form/simple/SimpleDynamicFormServiceTest.java

@@ -1,5 +1,6 @@
 package org.hswebframework.web.service.form.simple;
 
+import org.hsweb.ezorm.core.Trigger;
 import org.hsweb.ezorm.rdb.executor.SqlExecutor;
 import org.hswebframework.web.commons.entity.param.QueryParamEntity;
 import org.hswebframework.web.entity.form.DynamicFormColumnEntity;
@@ -41,6 +42,12 @@ public class SimpleDynamicFormServiceTest extends SimpleWebApplicationTests {
         DynamicFormEntity form = entityFactory.newInstance(DynamicFormEntity.class);
         form.setName("test");
         form.setDatabaseTableName("f_test");
+        form.setTriggers("[" +
+                "{\"trigger\":\"select.wrapper.done\"" +
+                ",\"language\":\"groovy\"" +
+                ",\"script\":\"println('wrapper done:'+instance);return true;\"" +
+                "}" +
+                "]");
         String id = dynamicFormService.insert(form);
         DynamicFormColumnEntity column_id = entityFactory.newInstance(DynamicFormColumnEntity.class);
         column_id.setFormId(id);