Обновление до новейшего FOP API

Я хочу обновить приложение, чтобы использовать новейший API FOP. Приложение использует библиотеку версии 0.20, например класс Driver все еще используется.

Никак не могу найти толковой информации, как обновиться до последней фоп-версии. Я нашел некоторые фрагменты, например, что следует использовать FOPFactory.

Поэтому мне было интересно, может ли кто-нибудь дать мне толчок к ресурсам по обновлению до нового (самого) fop API? Или не реально обновить и нужно переписывать эту часть приложения?

PS Я нашел страницу fop update (конечно), но она не выглядит чтобы указать на сходство между классами/API обеих версий.


person Veger    schedule 01.08.2011    source источник
comment
Я только что прочитал эту страницу «Обновление с более ранней версии» @ApacheFop, и мне кажется, что вам нужно кое-что переписать.   -  person Wivani    schedule 16.08.2011
comment
@Wivani, я так и боялся, но я как бы надеялся, что будет какой-нибудь простой способ.   -  person Veger    schedule 16.08.2011
comment
Если вы готовы, вы можете написать «Фасад» для обоих API и внести его в проект Apache FOP ;-)   -  person Wivani    schedule 16.08.2011


Ответы (1)


Ответ заключается в том, что это действительно зависит от того, сколько вы используете FOP.

Когда мы обновлялись с версии .2* до версии .9, а затем до версии 1.0, нам пришлось довольно много переделать, но мы создали большое разнообразие FO (мы преобразовали FO в PostScript), и нам нужно было сгенерировать множество PostScripts. чтобы увидеть, что сработало, а что не удалось в более новых версиях. Скорее всего, вы найдете легкую замену всему, что могло исчезнуть из-за того, что вы делали раньше.

К счастью, у нас были консолидированные ссылки на классы Driver и Fop в пользовательской утилите, и поэтому было не так уж плохо просто заменить новую ссылку на утилиту, которая использовала FopFactory.

Ваш первый шаг должен состоять в том, чтобы написать абстрактный Facade, как предлагает @Wivani, чтобы объединить ваши старые вызовы ссылок fop, убедиться, что они работают в вашем коде, а затем двигаться вперед, заменив ваш старый Facade реализацией, которая использует более новый код.

Единственное, что меня не устраивает в Fop, это то, что сообществу требуется довольно много времени, чтобы применить исправления ошибок и создать новые выпуски. Мы без проблем использовали v1 в производстве с XML Graphics 1.4 (базовый FO для создания файлов PostScript и TIFF).

Я дополню этот пост в понедельник вспомогательным кодом, если он вам понадобится.

ОБНОВЛЕНИЕ Вот что мы использовали для преобразования файла FO в PostScript:

String foAsString = "your_fo_as_string";
File destination = new File("path_to_file"");

BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(destination));
Driver driver = new Driver(new InputSource(new StringReader(foAsString)), out);
driver.setRenderer(Driver.RENDER_PS);
driver.run();

out.close();

return destination;

Вот краткое изложение того, что мы используем сейчас.

FopFactory создается на уровне экземпляра, как

this.fopFactory = FopFactory.newInstance();

код:

import javax.xml.transform.Source;
import javax.xml.transform.Templates;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.MimeConstants;

// ...

String foAsString = "your_fo_as_string";
File destination = new File("path_to_file"");

OutputStream outStream = new BufferedOutputStream(new FileOutputStream(destination));
Fop fop = fopFactory.newFop(MimeConstants.MIME_POSTSCRIPT, outStream);

Transformer transformer = transformerFactory.newTransformer();
Source source = new StreamSource(new StringReader(foAsString));
Result result = new SAXResult(fop.getDefaultHandler());

transformer.transform(source, result);

outStream.close();

return destination;
person JoshDM    schedule 16.10.2011
comment
Спасибо за Ваш ответ! Я позже действительно посмотрю на это! Если вы хотите опубликовать пример кода, это действительно поможет, но это зависит от вас :) - person Veger; 16.10.2011
comment
Ответ был обновлен с кодом. Помните, что вам все равно придется просмотреть все ошибки, сгенерированные вашим FO, и определить, в чем заключаются проблемы. Тестируйте много! - person JoshDM; 18.10.2011