Scripttel Executor с XML в качестве строки вместо файла
Я пытаюсь использовать scriptella в своем проекте для копирования данных из одной базы данных в другую, теперь в приложении есть внешний интерфейс, который пользователи могут использовать для создания сопоставления между таблицами и создания динамических запросов, теперь в настоящее время, когда пользователь отправляет запросы внешнего интерфейса, передаются через механизм запросов и сценарий xml создаются с использованием шаблона freemarker
Однако, чтобы выполнить xml, исполнитель ожидает файл вместо строки xml. В настоящее время я достигаю этого, создав xml во временном каталоге и удалив его после выполнения запроса. Есть ли способ пропустить создание файла и выполнить запрос как строка XML
2 ответа
Вы можете создать собственный URLStreamHandler, который будет обслуживать потоки непосредственно из памяти. Это похоже на то, что было сделано в AbstractTestCase. Его можно зарегистрировать, вызвав URL.setURLStreamHandlerFactory. См. Регистрация и использование пользовательского протокола java.net.URL или Возможно ли создать URL, указывающий на объект в памяти?
После этого используйте EtlExecutor.newExecutor(java.net.URL) с новым URI, например, new URL("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);