исполнитель scriptella с xml в виде строки вместо файла

Я пытаюсь использовать скриптеллу в своем проекте для копирования данных из одной базы данных в другую, теперь у приложения есть интерфейс, который пользователи могут использовать для создания сопоставления между таблицами и создания динамических запросов, теперь в настоящее время, когда пользователь отправляет запросы интерфейса, они передаются через механизм запросов и XML-скриптелла создаются с использованием шаблона freemarker

однако для выполнения xml исполнитель ожидает файл вместо строки xml, в настоящее время я достигаю этого, создавая xml во временном каталоге и удаляя его после выполнения запроса, есть ли способ пропустить создание файла и выполнить запрос как xml-строка


person Ambuj Jauhari    schedule 06.03.2018    source источник


Ответы (2)


Вы можете создать собственный URLStreamHandler, который будет обслуживать потоки непосредственно из памяти. Это похоже на то, что было сделано в Абстрактный тестовый случай. Его можно зарегистрировать, вызвав URL.setURLStreamHandlerFactory. См. Регистрация и использование пользовательского протокола java.net.URL или Можно ли создать URL-адрес, указывающий на объект в памяти?

После этого используйте EtlExecutor.newExecutor(java .net.URL) с новым URI, например. новый URL("memory://file")

person ejboy    schedule 06.03.2018

У меня был похожий вариант использования. Я скачал код и сделал небольшое изменение в ядре. Из-за каких-то личных функций у меня не было выбора. в пакет 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);
person user3486439    schedule 30.03.2021