在 XDocReport 中,我们希望有一个模块化的 API 报告来管理:
- 任何文档类型(docx、odt、pptx ...)。如果您愿意,您可以实现自己的文档类型并通过 javax.imageio.spi.ServiceRegistry 注册它。
- 任何模板引擎类型(Freemarker、velocity...)。如果您愿意,您可以实现自己的模板类型并通过 javax.imageio.spi.ServiceRegistry 注册它。
- 任何转换器类型(带有 POI+iText 的 docx->pdf 转换器,带有 POI 的 docx->xhtml 转换器,带有 ODFDOM+iText 的 odt->pdf 转换器,带有 ODFDOM 的 odt->xhtml 转换器......)。如果您愿意,您可以实现自己的转换器并通过 javax.imageio.spi.ServiceRegistry 注册它(例如:使用 docx4j+FOP 实现 docx->pdf 转换器,使用 JODConverter 实现 docx->pdf 转换器等)。
正如您所了解的,javax.imageio.spi.ServiceRegistry 在 OSGi 上下文中工作,因为我们使用 OSGi 片段(共享相同的类加载器)而不是 OSGi 包。我们选择使用相同的代码来管理非 OSGi 和 OSGi 上下文。
我们决定使用 OSGi 片段而不是 OSGi 捆绑包,因为:
- 如果我们使用 OSGi 包,我们需要开发一个 OSGi 激活器来注册我们的发现(在这个上下文包中,javax.imageio.spi.ServiceRegistry 不起作用)。
- 如果我们使用 OSGi 包,您需要为每个注册发现的包配置启动级别。
使用 OSGi 片段的唯一缺点是您不能在您的 OSGi 容器中使用多个版本的 XDocReport 模板、转换器、文档。但它是 XDocReport 的一个好功能吗?
您不能将javax.imageio.spi.ServiceRegistry与 JDK5(和 JDK6)一起使用。JDK6 提供了java.util.ServiceLoader,它是作为 javax.imageio.spi.ServiceRegistry 注册服务的新类。
在 XDocReport 中我们希望支持 JDK5+JDK6。XDocReport 0.9.8 仅使用javax.imageio.spi.ServiceRegistry。但似乎 Google App Engine 禁止使用此类(请参阅我们的问题 132)。所以我为 XDocReport 1.0.0 JDKServiceLoader开发了 Java 反射来管理JDK5 和 JDK6 的java.util.ServiceLoader 和javax.imageio.spi.ServiceRegistry。
问候安吉洛