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;
}
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);
}
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);
}
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);
}
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));
}
Aggregations