我正在尝试在我的项目中使用 scriptella 将数据从一个数据库复制到另一个数据库,现在应用程序有一个前端,用户可以使用它来创建表之间的映射并创建动态查询,现在一旦用户提交前端查询通过使用 freemarker 模板创建查询引擎和 scriptella xml
但是,要执行 xml,执行程序需要一个文件而不是 xml 字符串,目前我通过在临时目录中创建一个 xml 并在执行查询后删除它来实现这一点,有什么方法可以跳过文件创建并将查询作为xml 字符串
我正在尝试在我的项目中使用 scriptella 将数据从一个数据库复制到另一个数据库,现在应用程序有一个前端,用户可以使用它来创建表之间的映射并创建动态查询,现在一旦用户提交前端查询通过使用 freemarker 模板创建查询引擎和 scriptella xml
但是,要执行 xml,执行程序需要一个文件而不是 xml 字符串,目前我通过在临时目录中创建一个 xml 并在执行查询后删除它来实现这一点,有什么方法可以跳过文件创建并将查询作为xml 字符串
您可以创建一个自定义URLStreamHandler,它将直接从内存中提供流。这类似于AbstractTestCase中所做的。它可以通过调用URL.setURLStreamHandlerFactory来注册。请参阅注册和使用自定义 java.net.URL 协议或是否可以创建指向内存对象的 URL?
之后,将
EtlExecutor.newExecutor(java.net.URL)与新的 URI 一起使用,例如 newURL("memory://file")
我有一个类似的用例。我下载了代码并对核心进行了一些小改动。由于一些私人功能,我别无选择。在包 scriptella.configuration.ConfigurationFactory 我添加了以下功能:
public ConfigurationEl createConfigurationFromTxt(String xml, final ParametersCallback externalParameters ) {
try {
DocumentBuilder db = DBF.newDocumentBuilder();
db.setEntityResolver(ETL_ENTITY_RESOLVER);
db.setErrorHandler(ETL_ERROR_HANDLER);
final InputStream in = new ByteArrayInputStream(xml.getBytes());
final Document document = db.parse(in);
HierarchicalParametersCallback params = new HierarchicalParametersCallback(
externalParameters == null ? NullParametersCallback.INSTANCE : externalParameters, null);
PropertiesSubstitutor ps = new PropertiesSubstitutor(params);
return new ConfigurationEl(new XmlElement(
document.getDocumentElement(), resourceURL, ps), params);
} catch (IOException e) {
throw new ConfigurationException("Unable to load document: " + e, e);
} catch (Exception e) {
throw new ConfigurationException("Unable to parse document: " + e, e);
}
}
然后从我的代码中我可以做这样的事情:
ConfigurationFactory cf = new ConfigurationFactory();
ConfigurationEl conf = cf.createConfigurationFromTxt(FETCH_ETLS, p);
EtlExecutor exec = new EtlExecutor(conf);