Search in sources :

Example 6 with IControlMsgHandler

use of com.qlangtech.tis.runtime.module.misc.IControlMsgHandler in project tis by qlangtech.

the class GenerateDAOAndIncrScript method generateDAOScript.

// private void compileAndPackage(Context context, IControlMsgHandler msgHandler, Map<DBNode, List<String>> dbNameMap, File sourceRoot) throws Exception {
// /**
// * *********************************************************************************
// * 编译增量脚本
// * ***********************************************************************************
// */
// if (this.streamScriptCompile(sourceRoot, dbNameMap.keySet())) {
// msgHandler.addErrorMessage(context, "增量脚本编译失败");
// msgHandler.addFieldError(context, "incr_script_compile_error", "error");
// return;
// }
// /**
// * *********************************************************************************
// * 对scala代码进行 打包
// * ***********************************************************************************
// */
// JavaCompilerProcess.SourceGetterStrategy getterStrategy
// = new JavaCompilerProcess.SourceGetterStrategy(false, "/src/main/scala", ".scala") {
// 
// @Override
// public JavaFileObject.Kind getSourceKind() {
// // 没有scala的类型,暂且用other替换一下
// return JavaFileObject.Kind.OTHER;
// }
// 
// @Override
// public MyJavaFileObject processMyJavaFileObject(MyJavaFileObject fileObj) {
// try {
// try (InputStream input = FileUtils.openInputStream(fileObj.getSourceFile())) {
// IOUtils.copy(input, fileObj.openOutputStream());
// }
// } catch (IOException e) {
// throw new RuntimeException(e);
// }
// return fileObj;
// }
// };
// //
// JavaCompilerProcess.FileObjectsContext fileObjects = JavaCompilerProcess.getFileObjects(sourceRoot, getterStrategy);
// final JavaCompilerProcess.FileObjectsContext compiledCodeContext = new JavaCompilerProcess.FileObjectsContext();
// File streamScriptClassesDir = new File(sourceRoot, "classes");
// appendClassFile(streamScriptClassesDir, compiledCodeContext, null);
// // 取得spring配置文件相关resourece
// JavaCompilerProcess.FileObjectsContext xmlConfigs = indexStreamCodeGenerator.getSpringXmlConfigsObjectsContext();
// 
// JavaCompilerProcess.packageJar(
// sourceRoot, StreamContextConstant.getIncrStreamJarName(indexStreamCodeGenerator.collection)
// , fileObjects, compiledCodeContext, xmlConfigs);
// }
private void generateDAOScript(Context context, Map<Integer, Long> dependencyDbs) throws Exception {
    final Map<DBNode, List<String>> dbNameMap = Collections.unmodifiableMap(indexStreamCodeGenerator.getDbTables());
    if (dbNameMap.size() < 1) {
        throw new IllegalStateException("dbNameMap size can not small than 1");
    }
    if (dbNameMap.size() != dependencyDbs.size()) {
        throw new IllegalStateException("dbNameMap.size() " + dbNameMap.size() + " != dependencyDbs.size()" + dependencyDbs.size());
    }
    // long timestampp;// = Long.parseLong(ManageUtils.formatNowYyyyMMddHHmmss());
    DataSourceFactoryPluginStore dbPluginStore = null;
    final KoubeiProgressCallback koubeiProgressCallback = new KoubeiProgressCallback();
    List<IbatorContext> daoFacadeList = Lists.newArrayList();
    Long lastOptime = null;
    List<DataSourceFactoryPluginStore> leakFacadeDsPlugin = Lists.newArrayList();
    for (Map.Entry<DBNode, List<String>> /* dbname */
    entry : dbNameMap.entrySet()) {
        dbPluginStore = getFacadePluginStore(entry);
        if (dbPluginStore.getPlugin() == null) {
            leakFacadeDsPlugin.add(dbPluginStore);
        }
    }
    if (leakFacadeDsPlugin.size() > 0) {
        this.msgHandler.addErrorMessage(context, "数据库:" + leakFacadeDsPlugin.stream().map((p) -> "'" + p.getDSKey().keyVal + "'").collect(Collectors.joining(",")) + "还没有定义对应的Facade数据源");
        return;
    }
    for (Map.Entry<DBNode, List<String>> /* dbname */
    entry : dbNameMap.entrySet()) {
        lastOptime = dependencyDbs.get(entry.getKey().getDbId());
        if (lastOptime == null) {
            throw new IllegalStateException("db " + entry.getKey() + " is not find in dependency dbs:" + dbNameMap.keySet().stream().map((r) -> "[" + r.getDbId() + ":" + r.getDbName() + "]").collect(Collectors.joining(",")));
        }
        long timestamp = lastOptime;
        dbPluginStore = getFacadePluginStore(entry);
        FacadeDataSource facadeDataSource = dbPluginStore.createFacadeDataSource();
        IbatorProperties properties = new IbatorProperties(facadeDataSource, entry.getValue(), timestamp);
        entry.getKey().setTimestampVer(timestamp);
        if (entry.getValue().size() < 1) {
            throw new IllegalStateException("db:" + entry.getKey() + " relevant tablesList can not small than 1");
        }
        KoubeiIbatorRunner runner = new KoubeiIbatorRunner(properties) {

            @Override
            protected KoubeiProgressCallback getProgressCallback() {
                return koubeiProgressCallback;
            }
        };
        IbatorContext ibatorContext = runner.getIbatorContext();
        daoFacadeList.add(ibatorContext);
        try {
            if (!properties.isDaoScriptCreated()) {
                // 生成源代码
                runner.build();
                // dao script 脚本已经创建不需要再创建了
                // if (compilerAndPackage) {
                // 直接生成就行了,别管当前是不是要编译了
                File classpathDir = new File(Config.getDataDir(), "libs/tis-ibatis");
                // File classpathDir = new File("/Users/mozhenghua/Desktop/j2ee_solution/project/tis-ibatis/target/dependency");
                JavaCompilerProcess daoCompilerPackageProcess = new JavaCompilerProcess(facadeDataSource.dbMeta, properties.getDaoDir(), classpathDir);
                // 打包,生成jar包
                daoCompilerPackageProcess.compileAndBuildJar();
            // }
            }
        } catch (Exception e) {
            // 将文件夹清空
            FileUtils.forceDelete(properties.getDaoDir());
            throw new RuntimeException("dao path:" + properties.getDaoDir(), e);
        }
    }
    if (daoFacadeList.size() < 1) {
        throw new IllegalStateException("daoFacadeList can not small than 1");
    }
    daoFacadeList.stream().forEach((r) -> {
        FacadeContext fc = new FacadeContext();
        fc.setFacadeInstanceName(r.getFacadeInstanceName());
        fc.setFullFacadeClassName(r.getFacadeFullClassName());
        fc.setFacadeInterfaceName(r.getFacadeInterface());
        indexStreamCodeGenerator.getFacadeList().add(fc);
    });
// return dbNameMap;
}
Also used : PluginStore(com.qlangtech.tis.plugin.PluginStore) DataSourceFactoryPluginStore(com.qlangtech.tis.plugin.ds.DataSourceFactoryPluginStore) TIS(com.qlangtech.tis.TIS) PostedDSProp(com.qlangtech.tis.plugin.ds.PostedDSProp) DbScope(com.qlangtech.tis.offline.DbScope) Context(com.alibaba.citrus.turbine.Context) DBNode(com.qlangtech.tis.sql.parser.DBNode) Config(com.qlangtech.tis.manage.common.Config) Lists(com.google.common.collect.Lists) Map(java.util.Map) KoubeiProgressCallback(com.koubei.abator.KoubeiProgressCallback) IPluginStore(com.qlangtech.tis.plugin.IPluginStore) FacadeContext(com.qlangtech.tis.sql.parser.stream.generate.FacadeContext) StreamContextConstant(com.qlangtech.tis.manage.common.incr.StreamContextConstant) IncrStreamFactory(com.qlangtech.tis.plugin.incr.IncrStreamFactory) IbatorProperties(com.qlangtech.tis.coredefine.module.action.IbatorProperties) JavaCompilerProcess(com.qlangtech.tis.compiler.java.JavaCompilerProcess) IOutputEntry(com.qlangtech.tis.compiler.java.IOutputEntry) FileUtils(org.apache.commons.io.FileUtils) IOException(java.io.IOException) KoubeiIbatorRunner(com.koubei.abator.KoubeiIbatorRunner) IPluginContext(com.qlangtech.tis.util.IPluginContext) Collectors(java.util.stream.Collectors) FacadeDataSource(com.qlangtech.tis.plugin.ds.FacadeDataSource) File(java.io.File) IndexIncrStatus(com.qlangtech.tis.coredefine.module.action.IndexIncrStatus) Objects(java.util.Objects) List(java.util.List) HeteroEnum(com.qlangtech.tis.util.HeteroEnum) IControlMsgHandler(com.qlangtech.tis.runtime.module.misc.IControlMsgHandler) IbatorContext(org.apache.ibatis.ibator.config.IbatorContext) Collections(java.util.Collections) KoubeiIbatorRunner(com.koubei.abator.KoubeiIbatorRunner) FacadeDataSource(com.qlangtech.tis.plugin.ds.FacadeDataSource) JavaCompilerProcess(com.qlangtech.tis.compiler.java.JavaCompilerProcess) DataSourceFactoryPluginStore(com.qlangtech.tis.plugin.ds.DataSourceFactoryPluginStore) IOException(java.io.IOException) IbatorContext(org.apache.ibatis.ibator.config.IbatorContext) DBNode(com.qlangtech.tis.sql.parser.DBNode) KoubeiProgressCallback(com.koubei.abator.KoubeiProgressCallback) List(java.util.List) Map(java.util.Map) File(java.io.File) IbatorProperties(com.qlangtech.tis.coredefine.module.action.IbatorProperties) FacadeContext(com.qlangtech.tis.sql.parser.stream.generate.FacadeContext)

Example 7 with IControlMsgHandler

use of com.qlangtech.tis.runtime.module.misc.IControlMsgHandler in project tis by qlangtech.

the class TestValidator method testValidateFieldByMultiRules.

public void testValidateFieldByMultiRules() {
    final String numbericValidateFaild = "必须是数字";
    // 
    // 
    Map<String, Validator.FieldValidators> validatorsRules = // 
    Validator.fieldsValidator(// 
    field1Name, new Validator.FieldValidators(Validator.require) {
    }, (Validator.IFieldValidator) ((msgHandler, context, fieldKey, fieldData) -> {
        if (!StringUtils.isNumeric(fieldData)) {
            msgHandler.addFieldError(context, field1Name, numbericValidateFaild);
            // 校验是否是数字
            return false;
        }
        return true;
    }));
    assertEquals("validatorsRules size", 1, validatorsRules.size());
    Validator.FieldValidators fieldValidators = validatorsRules.get(field1Name);
    assertNotNull(fieldValidators);
    assertEquals(2, fieldValidators.validators.size());
    Context context = new DefaultContext();
    IControlMsgHandler msgHandler = EasyMock.createMock("msgHandler", IControlMsgHandler.class);
    EasyMock.expect(msgHandler.getString(field1Name)).andReturn("123");
    msgHandler.errorsPageShow(context);
    EasyMock.expectLastCall().andVoid().times(2);
    EasyMock.expect(msgHandler.getString(field1Name)).andReturn("123aaa");
    msgHandler.addFieldError(context, field1Name, numbericValidateFaild);
    msgHandler.addErrorMessage(context, Validator.FORM_ERROR_SUMMARY);
    // EasyMock.expect().andReturn("123aaa");
    EasyMock.replay(msgHandler);
    assertTrue(Validator.validate(msgHandler, context, validatorsRules));
    // 第二次应该校验失败了
    assertFalse(Validator.validate(msgHandler, context, validatorsRules));
    EasyMock.verify(msgHandler);
}
Also used : DefaultContext(com.alibaba.citrus.turbine.impl.DefaultContext) Context(com.alibaba.citrus.turbine.Context) DefaultContext(com.alibaba.citrus.turbine.impl.DefaultContext) IControlMsgHandler(com.qlangtech.tis.runtime.module.misc.IControlMsgHandler)

Example 8 with IControlMsgHandler

use of com.qlangtech.tis.runtime.module.misc.IControlMsgHandler in project tis by qlangtech.

the class TestValidator method testValidateIdentityWithDependencyRule.

/**
 * 一个校验项,的值需要依赖另外一个校验项运行
 */
public void testValidateIdentityWithDependencyRule() {
    IControlMsgHandler msgHandler = EasyMock.createMock("msgHandler", IControlMsgHandler.class);
    String field1NameVal = "123";
    EasyMock.expect(msgHandler.getString(field1Name)).andReturn(field1NameVal);
    EasyMock.expect(msgHandler.getString(field2Name)).andReturn("field2NameValue");
    Context context = new DefaultContext();
    final String[] field1Val = new String[1];
    // field2Name 字段依赖 fieldName 的值
    // 
    Map<String, Validator.FieldValidators> validatorsRules = // 
    Validator.fieldsValidator(// 
    field1Name, new Validator.FieldValidators(Validator.require) {

        @Override
        public void setFieldVal(String val) {
            field1Val[0] = val;
        }
    }, // 
    field2Name, new Validator.FieldValidators(Validator.require) {
    }.addDependency(field1Name), (Validator.IFieldValidator) ((msgHdr, ctx, fieldKey, fieldData) -> {
        assertEquals(field1NameVal, field1Val[0]);
        return true;
    }));
    msgHandler.errorsPageShow(context);
    EasyMock.expectLastCall().andVoid().times(1);
    EasyMock.replay(msgHandler);
    assertTrue(Validator.validate(msgHandler, context, validatorsRules));
    EasyMock.verify(msgHandler);
}
Also used : DefaultContext(com.alibaba.citrus.turbine.impl.DefaultContext) Context(com.alibaba.citrus.turbine.Context) IControlMsgHandler(com.qlangtech.tis.runtime.module.misc.IControlMsgHandler) DefaultContext(com.alibaba.citrus.turbine.impl.DefaultContext)

Example 9 with IControlMsgHandler

use of com.qlangtech.tis.runtime.module.misc.IControlMsgHandler in project tis by qlangtech.

the class TestAttrValMap method testCreateDescribable.

public void testCreateDescribable() {
    IControlMsgHandler fieldErrorHandler = EasyMock.createMock("fieldErrorHandler", IControlMsgHandler.class);
    IPluginContext pluginContext = EasyMock.createMock("pluginContext", IPluginContext.class);
    JSONObject jsonObject = IOUtils.loadResourceFromClasspath(TestPluginImpl.class, "testPluginImpl-post-content.json", true, (input) -> {
        return JSON.parseObject(org.apache.commons.io.IOUtils.toString(input, TisUTF8.get()));
    });
    EasyMock.replay(fieldErrorHandler, pluginContext);
    AttrValMap attrValMap = AttrValMap.parseDescribableMap(fieldErrorHandler, Optional.empty(), jsonObject);
    Descriptor.ParseDescribable describable = attrValMap.createDescribable(pluginContext);
    assertNotNull(describable);
    TestPluginImpl testPlugin = (TestPluginImpl) describable.instance;
    assertNotNull(testPlugin);
    // 没有设置值,所以值对象应该为空,不能为0
    assertTrue("testPlugin.connectionsPerHost must be null", testPlugin.connectionsPerHost == null);
    assertEquals(12, (int) testPlugin.maxPendingPerConnection);
    EasyMock.verify(fieldErrorHandler, pluginContext);
}
Also used : JSONObject(com.alibaba.fastjson.JSONObject) TestPluginImpl(com.qlangtech.tis.util.plugin.TestPluginImpl) Descriptor(com.qlangtech.tis.extension.Descriptor) IControlMsgHandler(com.qlangtech.tis.runtime.module.misc.IControlMsgHandler)

Example 10 with IControlMsgHandler

use of com.qlangtech.tis.runtime.module.misc.IControlMsgHandler in project tis by qlangtech.

the class DataxAction method doSaveWriterColsMeta.

/**
 * @param context
 */
@Func(value = PermissionConstant.DATAX_MANAGE)
public void doSaveWriterColsMeta(Context context) {
    String dataxName = this.getString(PARAM_KEY_DATAX_NAME);
    DataxProcessor.DataXCreateProcessMeta processMeta = DataxProcessor.getDataXCreateProcessMeta(this, dataxName);
    if ((processMeta.isReaderRDBMS())) {
        throw new IllegalStateException("can not process the flow with:" + processMeta.toString());
    }
    List<ISelectedTab.ColMeta> writerCols = Lists.newArrayList();
    IDataxProcessor.TableMap tableMapper = new IDataxProcessor.TableMap(new ISelectedTab() {

        @Override
        public List<ColMeta> getCols() {
            return writerCols;
        }
    });
    // tableMapper.setSourceCols(writerCols);
    // //////////////////
    final String keyColsMeta = "colsMeta";
    IControlMsgHandler handler = new DelegateControl4JsonPostMsgHandler(this, this.parseJsonPost());
    if (!Validator.validate(handler, context, // 
    Validator.fieldsValidator(// 
    "writerTargetTabName", new Validator.FieldValidators(Validator.require, Validator.db_col_name) {

        @Override
        public void setFieldVal(String val) {
            tableMapper.setTo(val);
        }
    }, "writerFromTabName", new Validator.FieldValidators(Validator.require, Validator.db_col_name) {

        @Override
        public void setFieldVal(String val) {
            tableMapper.setFrom(val);
        }
    }, // 
    keyColsMeta, new Validator.FieldValidators(Validator.require) {

        @Override
        public void setFieldVal(String val) {
        }
    }, new Validator.IFieldValidator() {

        @Override
        public boolean validate(IFieldErrorHandler msgHandler, Context context, String fieldKey, String fieldData) {
            ISelectedTab.ColMeta colMeta = null;
            JSONArray targetCols = JSON.parseArray(fieldData);
            JSONObject targetCol = null;
            int index;
            String targetColName = null;
            if (targetCols.size() < 1) {
                msgHandler.addFieldError(context, fieldKey, "Writer目标表列不能为空");
                return false;
            }
            Map<String, Integer> existCols = Maps.newHashMap();
            boolean validateFaild = false;
            Integer previousColIndex = null;
            for (int i = 0; i < targetCols.size(); i++) {
                targetCol = targetCols.getJSONObject(i);
                index = targetCol.getInteger("index");
                targetColName = targetCol.getString("name");
                if (StringUtils.isNotBlank(targetColName) && (previousColIndex = existCols.put(targetColName, index)) != null) {
                    msgHandler.addFieldError(context, keyColsMeta + "[" + previousColIndex + "]", "内容不能与第" + index + "行重复");
                    msgHandler.addFieldError(context, keyColsMeta + "[" + index + "]", "内容不能与第" + previousColIndex + "行重复");
                    return false;
                }
                if (!Validator.require.validate(DataxAction.this, context, keyColsMeta + "[" + index + "]", targetColName)) {
                    validateFaild = true;
                } else if (!Validator.db_col_name.validate(DataxAction.this, context, keyColsMeta + "[" + index + "]", targetColName)) {
                    validateFaild = true;
                }
                colMeta = new ISelectedTab.ColMeta();
                colMeta.setName(targetColName);
                DataType dataType = targetCol.getObject("type", DataType.class);
                // colMeta.setType(ISelectedTab.DataXReaderColType.parse(targetCol.getString("type")));
                colMeta.setType(dataType);
                writerCols.add(colMeta);
            }
            return !validateFaild;
        }
    }))) {
        return;
    }
    this.saveTableMapper(this, dataxName, Collections.singletonList(tableMapper));
}
Also used : ServletActionContext(org.apache.struts2.ServletActionContext) Context(com.alibaba.citrus.turbine.Context) IParamContext(com.qlangtech.tis.order.center.IParamContext) DelegateControl4JsonPostMsgHandler(com.qlangtech.tis.runtime.module.misc.impl.DelegateControl4JsonPostMsgHandler) ISelectedTab(com.qlangtech.tis.plugin.ds.ISelectedTab) IFieldErrorHandler(com.qlangtech.tis.runtime.module.misc.IFieldErrorHandler) JSONArray(com.alibaba.fastjson.JSONArray) JSONObject(com.alibaba.fastjson.JSONObject) DataType(com.qlangtech.tis.plugin.ds.DataType) DescriptorExtensionList(com.qlangtech.tis.extension.DescriptorExtensionList) IControlMsgHandler(com.qlangtech.tis.runtime.module.misc.IControlMsgHandler) Validator(com.qlangtech.tis.plugin.annotation.Validator) Func(com.qlangtech.tis.manage.spring.aop.Func)

Aggregations

IControlMsgHandler (com.qlangtech.tis.runtime.module.misc.IControlMsgHandler)12 Context (com.alibaba.citrus.turbine.Context)8 Validator (com.qlangtech.tis.plugin.annotation.Validator)5 DefaultContext (com.alibaba.citrus.turbine.impl.DefaultContext)4 JSONArray (com.alibaba.fastjson.JSONArray)3 IFieldErrorHandler (com.qlangtech.tis.runtime.module.misc.IFieldErrorHandler)3 DelegateControl4JsonPostMsgHandler (com.qlangtech.tis.runtime.module.misc.impl.DelegateControl4JsonPostMsgHandler)3 JSONObject (com.alibaba.fastjson.JSONObject)2 IndexIncrStatus (com.qlangtech.tis.coredefine.module.action.IndexIncrStatus)2 Descriptor (com.qlangtech.tis.extension.Descriptor)2 Func (com.qlangtech.tis.manage.spring.aop.Func)2 Collections (java.util.Collections)2 List (java.util.List)2 Matcher (java.util.regex.Matcher)2 OSS (com.aliyun.oss.OSS)1 OSSClientBuilder (com.aliyun.oss.OSSClientBuilder)1 Bucket (com.aliyun.oss.model.Bucket)1 Lists (com.google.common.collect.Lists)1 KoubeiIbatorRunner (com.koubei.abator.KoubeiIbatorRunner)1 KoubeiProgressCallback (com.koubei.abator.KoubeiProgressCallback)1