Hello all

I committed today a "DefaultNameFactoryTest" file. If one looks at the source code [1], the interesting aspect is that this file doesn't contain any test. Instead it just creates a SIS DefaultNameFactoryTest instance, passes it to the super-class constructor and inherits all the tests defined in GeoAPI [2]. This illustrates the GeoAPI inter-operability goal, admittedly only at the test suite level in this case.

In this test case, DefaultNameFactory is instantiated directly. However in a production environment, we need to allow users to specify their own Factory instance. In Geotk, we tried to do that using java.util.ServiceLoader. However while ServiceLoader is still very well suited to situations where we need *all* instances of a given interface (all map projections, or image readers for all formats, etc.), it become difficult when we need to select one instance among many possibilities. An alternative proposed years ago was to use Spring, but I would like to avoid making such dependency mandatory.

Since 2009, JSR-330 [3] is providing an @Inject annotation for that. JSR-330 is a 2.4 JAR file available on Maven central under Apache 2 license, so it seems a reasonable dependency. Note that JSR-330 provides only annotations - implementations is another matter, discussed below.

Those annotations are now included in JEE 6 [4]. So they do not introduce any new dependency in JEE environments. But it would introduce dependency in JSE environments. In addition to the above-cited JSR-330 JAR files, JSE environments would need an implementation. One impossible implementation is Google Guice [5], also available on Maven Central under Apache 2 license. However this is an almost 700 kb dependency, with some transitive dependencies (I didn't analysed them yet). However I'm not yet familiar with Juice - in particular does it forces applications to be run is some kind of containers?

An alternative could also be to provide our own trivial implementation (just hard-coded references to the factory implementations), which users can replace by Guice or JEE when such environment in available. Since I have never experimented JSR-330 yet, I don't know if it is a reasonable approach.

Any though?

    Martin


[1] https://svn.apache.org/repos/asf/sis/branches/JDK7/sis-utility/src/test/java/org/apache/sis/util/type/DefaultNameFactoryTest.java [2] http://www.geoapi.org/geoapi-conformance/apidocs/org/opengis/test/util/NameTest.html
[3] http://jcp.org/aboutJava/communityprocess/final/jsr330/index.html
[4] http://docs.oracle.com/javaee/6/api/javax/inject/package-summary.html
[5] http://code.google.com/p/google-guice/

Reply via email to