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);
Другие вопросы по тегам