Re: Service Provider mechanism and javax.imageio.spi.ServiceRegistry
Dilum Ranatunga <[email protected]>
| Newsgroups | gmane.comp.windows.devel.java.advanced |
|---|---|
| Message-ID | <[email protected]> |
When programmatically writing properties files out, you also have to
worry about character encodings. The full 'contract' seems to be
defined here:
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Properties.html#load(java.io.InputStream)
On that SAX/DOM front, without a complete representation, programmatic
changes to properties files drop comments and shuffle the keys, making
diffs very ugly... You are absolutely right about a full SAX
implementation being an overkill, but similar behavior -- e.g
protected handleCommentLine ( String comment ) { }
protected handleBlankLine ( ) { }
protected handlePair( String key, String value ) {
setProperty ( key, value );
}
on Properties that got invoked by the parser logic in load ( ... )
would have prevented a lot of heartburn for many a developer.
On 11/7/07, Szegedi Attila <[email protected]> wrote:
> Dunno, having a SAX/DOM for .properties files strikes me as being a
> bit heavyweight approach...
>
> Anyway, the service implementation files aren't required to conform to
> the full .properties file format IIRC (there are provisions for
> multiline values and escaping in the properties file format that a
> parser for service files shouldn't care about). It'd be quite trivial
> to write a loop around BufferedReader.readLine() and ignore empty
> lines and those starting with # character if you really cared about
> ordering.
>
> Attila.
>
> On 2007.11.07., at 18:54, Dilum Ranatunga wrote:
>
> > Speaking of properties files, ordering and comments, does anyone know
> > of a readily available SAX handler-like or DOM-like parser for
> > properties files? (Seems like the right way to have written that code
> > in the first place...)
> >
> > On 11/3/07, Attila Szegedi <[email protected]> wrote:
> >> It's easy to dicover and process these files with a bit of custom
> >> code. I
> >> have it in few places, most notably here:
> >>
> >> <http://dynalang.svn.sourceforge.net/viewvc/dynalang/trunk/dynalang/src/org/dynalang/mop/impl/AutoDiscovery.java?view=markup
> >> >
> >>
> >> Something like this'll return you a list of service instances for all
> >> declared services within a ClassLoader's scope:
> >>
> >> <T> static List<T> getServices(Class<T> serviceItf, ClassLoader cl)
> >> throws IOException, InstantiationException, IllegalAccessException,
> >> ClassNotFoundException {
> >> List<T> list = new LinkedList<T>();
> >> String path = "/META-INF/services/" +
> >> serviceItf.getClass().getName();
> >> Enumeration<URL> urls;
> >> if(cl == null) {
> >> urls = ClassLoader.getSystemResources(path);
> >> }
> >> else {
> >> urls = cl.getResources(path);
> >> }
> >> for(;urls.hasMoreElements();) {
> >> URL url = urls.nextElement();
> >> InputStream in = url.openStream();
> >> try {
> >> Properties props = new Properties();
> >> props.load(in);
> >> for (Object className : props.keySet()) {
> >> T serviceInstance = (T)Class.forName(
> >> className.toString(), true, cl).newInstance());
> >> list.add(serviceInstance);
> >> }
> >> finally {
> >> in.close();
> >> }
> >> }
> >> return list;
> >> }
> >>
> >> I'm using Properties object 'cause I get skipping of empty lines and
> >> handling of # comments for free. It does not guarantee you that
> >> you'll
> >> instantiate the objects in the order they were declared in individual
> >> files though, but I can live with that...
> >>
> >> That's it :-)
> >>
> >> BTW, it stinks that java.util.Properties doesn't extend
> >> Hashtable<String,
> >> String>...
> >>
> >> Attila.
> >>
> >> On Wed, 31 Oct 2007 15:03:49 +0100, Bertrand Delacretaz
> >> <[email protected]> wrote:
> >>
> >>> On 10/31/07, Bertrand Delacretaz <[email protected]> wrote:
> >>>
> >>>> ...But it feels a bit weird to have this in javax.imageio.spi, is
> >>>> there
> >>>> a
> >>>> better alternative?...
> >>>
> >>> Someone mentioned off-list the java.util.ServiceLoader class, which
> >>> looks like what I'm looking for, but it's available starting with
> >>> Java
> >>> 1.6 only.
> >>>
> >>> -Bertrand
> >>>
> >> --
> >> home: http://www.szegedi.org
> >> weblog: http://constc.blogspot.com
> >>
> >> ===================================
> >> This list is hosted by DevelopMentor(R) http://www.develop.com
> >>
> >> View archives and manage your subscription(s) at http://discuss.develop.com
> >>
> >
> > ===================================
> > This list is hosted by DevelopMentor? http://www.develop.com
> >
> > View archives and manage your subscription(s) at http://discuss.develop.com
>
> ===================================
> This list is hosted by DevelopMentor(R) http://www.develop.com
>
> View archives and manage your subscription(s) at http://discuss.develop.com
>
===================================
This list is hosted by DevelopMentor® http://www.develop.com
View archives and manage your subscription(s) at http://discuss.develop.com