You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@abdera.apache.org by jm...@apache.org on 2009/05/06 22:36:22 UTC

svn commit: r772417 - in /abdera/java/trunk: client/src/main/java/org/apache/abdera/protocol/client/ core/src/main/java/org/apache/abdera/factory/ core/src/main/java/org/apache/abdera/util/ parser/src/main/java/org/apache/abdera/parser/stax/ parser/src...

Author: jmsnell
Date: Wed May  6 20:36:21 2009
New Revision: 772417

URL: http://svn.apache.org/viewvc?rev=772417&view=rev
Log:
Refactoring of some of the base level class discovery code. The moves things to a more logical location, improves the reliability of the implementation and simplifies the code structure a bit.

Added:
    abdera/java/trunk/core/src/main/java/org/apache/abdera/util/Discover.java
    abdera/java/trunk/core/src/main/java/org/apache/abdera/util/MultiIterator.java
Modified:
    abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/AbderaClient.java
    abdera/java/trunk/core/src/main/java/org/apache/abdera/factory/StreamBuilder.java
    abdera/java/trunk/core/src/main/java/org/apache/abdera/util/AbderaConfiguration.java
    abdera/java/trunk/core/src/main/java/org/apache/abdera/util/AbstractStreamWriter.java
    abdera/java/trunk/core/src/main/java/org/apache/abdera/util/Constants.java
    abdera/java/trunk/core/src/main/java/org/apache/abdera/util/ServiceUtil.java
    abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/FOMXPath.java
    abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/StaxStreamWriter.java
    abdera/java/trunk/parser/src/test/java/org/apache/abdera/test/parser/stax/FOMTest.java
    abdera/java/trunk/security/src/main/java/org/apache/abdera/security/AbderaSecurity.java
    abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/ServiceManager.java

Modified: abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/AbderaClient.java
URL: http://svn.apache.org/viewvc/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/AbderaClient.java?rev=772417&r1=772416&r2=772417&view=diff
==============================================================================
--- abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/AbderaClient.java (original)
+++ abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/AbderaClient.java Wed May  6 20:36:21 2009
@@ -49,8 +49,8 @@
 import org.apache.abdera.protocol.error.Error;
 import org.apache.abdera.protocol.error.ProtocolException;
 import org.apache.abdera.protocol.util.CacheControlUtil;
+import org.apache.abdera.util.Discover;
 import org.apache.abdera.util.EntityTag;
-import org.apache.abdera.util.ServiceUtil;
 import org.apache.abdera.util.Version;
 import org.apache.commons.httpclient.Cookie;
 import org.apache.commons.httpclient.Credentials;
@@ -154,7 +154,7 @@
 
   private CacheFactory initCacheFactory() {
     CacheFactory cacheFactory = 
-      (CacheFactory)ServiceUtil.newInstance(
+      (CacheFactory)Discover.locate(
         CacheFactory.class.getName(),
         LRUCacheFactory.class.getName(), 
         abdera);

Modified: abdera/java/trunk/core/src/main/java/org/apache/abdera/factory/StreamBuilder.java
URL: http://svn.apache.org/viewvc/abdera/java/trunk/core/src/main/java/org/apache/abdera/factory/StreamBuilder.java?rev=772417&r1=772416&r2=772417&view=diff
==============================================================================
--- abdera/java/trunk/core/src/main/java/org/apache/abdera/factory/StreamBuilder.java (original)
+++ abdera/java/trunk/core/src/main/java/org/apache/abdera/factory/StreamBuilder.java Wed May  6 20:36:21 2009
@@ -74,7 +74,7 @@
   }
   
   public StreamBuilder(Abdera abdera) {
-    super("fom");
+    super(abdera,"fom");
     this.abdera = abdera;
   }
 

Modified: abdera/java/trunk/core/src/main/java/org/apache/abdera/util/AbderaConfiguration.java
URL: http://svn.apache.org/viewvc/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/AbderaConfiguration.java?rev=772417&r1=772416&r2=772417&view=diff
==============================================================================
--- abdera/java/trunk/core/src/main/java/org/apache/abdera/util/AbderaConfiguration.java (original)
+++ abdera/java/trunk/core/src/main/java/org/apache/abdera/util/AbderaConfiguration.java Wed May  6 20:36:21 2009
@@ -19,6 +19,7 @@
 
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -96,12 +97,22 @@
     this.bundle = (bundle != null) ? bundle : 
       AbderaConfiguration.getBundle( 
         Locale.getDefault());
-    factories = ServiceUtil.loadExtensionFactories();
+    factories = loadExtensionFactories();
     writers = initNamedWriters();
     parsers = initNamedParsers();
     streamwriters = initStreamWriters();
   }  
   
+  private static synchronized List<ExtensionFactory> loadExtensionFactories() {
+    List<ExtensionFactory> list = 
+      new ArrayList<ExtensionFactory>();
+    Iterable<ExtensionFactory> factories =
+      Discover.locate("org.apache.abdera.factory.ExtensionFactory");
+    for (ExtensionFactory factory : factories)
+      list.add(factory);
+    return list;
+  }
+  
   private ResourceBundle getBundle() {
     return bundle;
   }
@@ -173,8 +184,8 @@
    */
   private Map<String,NamedWriter> initNamedWriters() {
     Map<String,NamedWriter> writers = null;
-    List<NamedWriter> _writers = 
-      ServiceUtil._loadimpls(NAMED_WRITER);
+    Iterable<NamedWriter> _writers = 
+      Discover.locate(NAMED_WRITER);
     writers = Collections.synchronizedMap(new HashMap<String,NamedWriter>());
     for (NamedWriter writer : _writers) {
       writers.put(writer.getName().toLowerCase(), writer);
@@ -188,8 +199,8 @@
    */
   private Map<String,Class<? extends StreamWriter>> initStreamWriters() {
     Map<String,Class<? extends StreamWriter>> writers = null;
-    List<Class<? extends StreamWriter>> _writers = 
-      ServiceUtil._loadimpls(STREAM_WRITER,true);
+    Iterable<Class<? extends StreamWriter>> _writers =
+      Discover.locate(STREAM_WRITER, true);
     writers = Collections.synchronizedMap(new HashMap<String,Class<? extends StreamWriter>>());
     for (Class<? extends StreamWriter> writer : _writers) {
       String name = getName(writer);
@@ -258,7 +269,7 @@
    */
   private Map<String,NamedParser> initNamedParsers() {
     Map<String,NamedParser> parsers = null;
-    List<NamedParser> _parsers = ServiceUtil._loadimpls(NAMED_PARSER);
+    Iterable<NamedParser> _parsers = Discover.locate(NAMED_PARSER);
     parsers = Collections.synchronizedMap(new HashMap<String,NamedParser>());
     for (NamedParser parser : _parsers) {
       parsers.put(parser.getName().toLowerCase(), parser);
@@ -287,8 +298,16 @@
    * 
    * @return A new factory instance
    */
-  public Factory newFactoryInstance(Abdera abdera) {
-    return ServiceUtil.newFactoryInstance(abdera);
+  public Factory newFactoryInstance(
+    Abdera abdera) {
+      return (Factory) Discover.locate(
+          CONFIG_FACTORY, 
+          abdera
+            .getConfiguration()
+            .getConfigurationOption(
+              CONFIG_FACTORY, 
+              DEFAULT_FACTORY),
+          abdera);
   }
     
   /**
@@ -296,8 +315,16 @@
    * 
    * @return A new parser instance
    */
-  public Parser newParserInstance(Abdera abdera) {
-    return ServiceUtil.newParserInstance(abdera);
+  public Parser newParserInstance(
+    Abdera abdera) {
+      return (Parser) Discover.locate(
+          CONFIG_PARSER, 
+          abdera
+            .getConfiguration()
+            .getConfigurationOption(
+              CONFIG_PARSER, 
+              DEFAULT_PARSER),
+          abdera);
   }
     
   /**
@@ -305,12 +332,22 @@
    * 
    * @return A new XPath instance
    */
-  public XPath newXPathInstance(Abdera abdera) {
-    try {
-      return ServiceUtil.newXPathInstance(abdera);
-    } catch (NoClassDefFoundError n) {
-      throw new RuntimeException(Localizer.sprintf("IMPLEMENTATION.NOT.AVAILABLE","XPath"),n);
-    }
+  public XPath newXPathInstance(
+    Abdera abdera) {
+      try {
+        return (XPath) Discover.locate(
+            CONFIG_XPATH,
+            abdera
+              .getConfiguration()
+              .getConfigurationOption(
+                CONFIG_XPATH, 
+                DEFAULT_XPATH), 
+            abdera);
+      } catch (Throwable n) {
+        throw throwex(
+          "IMPLEMENTATION.NOT.AVAILABLE",
+          "XPath",n);
+      }
   }
     
   /**
@@ -318,12 +355,22 @@
    * 
    * @return A new ParserFactory instance
    */
-  public ParserFactory newParserFactoryInstance(Abdera abdera) {
-    try {
-      return ServiceUtil.newParserFactoryInstance(abdera);
-    } catch (NoClassDefFoundError n) {
-      throw new RuntimeException(Localizer.sprintf("IMPLEMENTATION.NOT.AVAILABLE","Parser"),n);
-    }
+  public ParserFactory newParserFactoryInstance(
+    Abdera abdera) {
+      try {
+        return (ParserFactory) Discover.locate(
+            CONFIG_PARSERFACTORY,
+            abdera
+              .getConfiguration()
+              .getConfigurationOption(
+                CONFIG_PARSERFACTORY, 
+                DEFAULT_PARSERFACTORY),
+            abdera);
+      } catch (Throwable n) {
+        throw throwex(
+          "IMPLEMENTATION.NOT.AVAILABLE",
+          "Parser",n);
+      }
   }
     
   /**
@@ -331,12 +378,22 @@
    * 
    * @return A new WriterFactory instance
    */
-  public WriterFactory newWriterFactoryInstance(Abdera abdera) {
-    try {
-      return ServiceUtil.newWriterFactoryInstance(abdera);
-    } catch (NoClassDefFoundError n) {
-      throw new RuntimeException(Localizer.sprintf("IMPLEMENTATION.NOT.AVAILABLE","WriterFactory"),n);
-    }
+  public WriterFactory newWriterFactoryInstance(
+    Abdera abdera) {
+      try {
+        return (WriterFactory) Discover.locate(
+            CONFIG_WRITERFACTORY,
+            abdera
+              .getConfiguration()
+              .getConfigurationOption(
+                CONFIG_WRITERFACTORY, 
+                DEFAULT_WRITERFACTORY),
+            abdera) ;
+      } catch (Throwable n) {
+        throw throwex(
+          "IMPLEMENTATION.NOT.AVAILABLE",
+          "WriterFactory",n);
+      }
   }
     
   /**
@@ -344,12 +401,22 @@
    * 
    * @return A new default writer implementation instance
    */
-  public Writer newWriterInstance(Abdera abdera) {
-    try {
-      return ServiceUtil.newWriterInstance(abdera);
-    } catch (NoClassDefFoundError n) {
-      throw new RuntimeException(Localizer.sprintf("IMPLEMENTATION.NOT.AVAILABLE","Writer"),n);
-    }
+  public Writer newWriterInstance(
+    Abdera abdera) {
+      try {
+        return (Writer) Discover.locate(
+            CONFIG_WRITER,
+            abdera
+              .getConfiguration()
+              .getConfigurationOption(
+                CONFIG_WRITER, 
+                DEFAULT_WRITER),
+            abdera);
+      } catch (Throwable n) {
+        throw throwex(
+            "IMPLEMENTATION.NOT.AVAILABLE",
+            "Writer",n);
+      }
   }
   
   /**
@@ -357,12 +424,31 @@
    * 
    * @return A new default writer implementation instance
    */
-  public StreamWriter newStreamWriterInstance(Abdera abdera) {
-    try {
-      return ServiceUtil.newStreamWriterInstance(abdera);
-    } catch (NoClassDefFoundError n) {
-      throw new RuntimeException(Localizer.sprintf("IMPLEMENTATION.NOT.AVAILABLE","StreamWriter"),n);
-    }
+  public StreamWriter newStreamWriterInstance(
+    Abdera abdera) {
+      try {
+        return (StreamWriter) Discover.locate(
+            CONFIG_STREAMWRITER,
+            abdera
+              .getConfiguration()
+              .getConfigurationOption(
+                CONFIG_STREAMWRITER, 
+                DEFAULT_STREAMWRITER),
+            abdera);    
+      } catch (Throwable n) {
+        throw throwex(
+         "IMPLEMENTATION.NOT.AVAILABLE",
+         "StreamWriter",n);
+      }
   }  
 
+  private RuntimeException throwex(
+    String id, 
+    String arg, 
+    Throwable t) {
+      return new RuntimeException(
+        Localizer.sprintf(
+          id,arg),t);
+  }
+  
 }

Modified: abdera/java/trunk/core/src/main/java/org/apache/abdera/util/AbstractStreamWriter.java
URL: http://svn.apache.org/viewvc/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/AbstractStreamWriter.java?rev=772417&r1=772416&r2=772417&view=diff
==============================================================================
--- abdera/java/trunk/core/src/main/java/org/apache/abdera/util/AbstractStreamWriter.java (original)
+++ abdera/java/trunk/core/src/main/java/org/apache/abdera/util/AbstractStreamWriter.java Wed May  6 20:36:21 2009
@@ -29,6 +29,7 @@
 import javax.activation.DataHandler;
 import javax.xml.namespace.QName;
 
+import org.apache.abdera.Abdera;
 import org.apache.abdera.i18n.iri.IRI;
 import org.apache.abdera.i18n.rfc4646.Lang;
 import org.apache.abdera.model.AtomDate;
@@ -41,13 +42,17 @@
 public abstract class AbstractStreamWriter 
   implements StreamWriter {
   
+  protected final Abdera abdera;
   protected final String name;
   protected boolean autoflush = false;
   protected boolean autoclose = false;
   protected boolean autoindent = false;
   
-  protected AbstractStreamWriter(String name) {
-    this.name = name;
+  protected AbstractStreamWriter(
+    Abdera abdera, 
+    String name) {
+      this.abdera = abdera;
+      this.name = name;
   }
   
   public StreamWriter setAutoflush(boolean auto) {

Modified: abdera/java/trunk/core/src/main/java/org/apache/abdera/util/Constants.java
URL: http://svn.apache.org/viewvc/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/Constants.java?rev=772417&r1=772416&r2=772417&view=diff
==============================================================================
--- abdera/java/trunk/core/src/main/java/org/apache/abdera/util/Constants.java (original)
+++ abdera/java/trunk/core/src/main/java/org/apache/abdera/util/Constants.java Wed May  6 20:36:21 2009
@@ -35,9 +35,9 @@
   public static final String DEFAULT_WRITERFACTORY= "org.apache.abdera.parser.stax.FOMWriterFactory";
   public static final String DEFAULT_WRITER       = "org.apache.abdera.parser.stax.FOMWriter";
   public static final String DEFAULT_STREAMWRITER = "org.apache.abdera.parser.stax.StaxStreamWriter";
-  public static final String NAMED_WRITER         = "META-INF/services/org.apache.abdera.writer.NamedWriter";
-  public static final String NAMED_PARSER         = "META-INF/services/org.apache.abdera.parser.NamedParser";
-  public static final String STREAM_WRITER        = "META-INF/services/org.apache.abdera.writer.StreamWriter";
+  public static final String NAMED_WRITER         = "org.apache.abdera.writer.NamedWriter";
+  public static final String NAMED_PARSER         = "org.apache.abdera.parser.NamedParser";
+  public static final String STREAM_WRITER        = "org.apache.abdera.writer.StreamWriter";
   public static final String PREFIX               = "";
   public static final String APP_PREFIX           = "";
   public static final String CONTROL_PREFIX       = "";

Added: abdera/java/trunk/core/src/main/java/org/apache/abdera/util/Discover.java
URL: http://svn.apache.org/viewvc/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/Discover.java?rev=772417&view=auto
==============================================================================
--- abdera/java/trunk/core/src/main/java/org/apache/abdera/util/Discover.java (added)
+++ abdera/java/trunk/core/src/main/java/org/apache/abdera/util/Discover.java Wed May  6 20:36:21 2009
@@ -0,0 +1,365 @@
+package org.apache.abdera.util;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
+
+@SuppressWarnings("unchecked")
+public final class Discover {
+  
+  private Discover() {}
+
+  public static <T>T locate(
+    String id, 
+    String defaultImpl, 
+    Object... args) {
+      return locate(
+        id,
+        defaultImpl,
+        getLoader(),
+        args);
+  }
+  
+  public static <T>T locate(
+    String id, 
+    String defaultImpl, 
+    ClassLoader loader, 
+    Object... args) {
+      try {
+        T instance = null;
+        Iterable<T> items = 
+          locate(
+            id,
+            loader,
+            args);
+        for (T i : items) {
+          instance = i;
+          break;
+        }
+        if (instance == null) {
+          instance = 
+            load(
+              loader,
+              defaultImpl,
+              false,
+              args);
+        }
+        return instance;
+      } catch (Throwable t) {
+        throw new RuntimeException(t);
+      }
+  }
+  
+  private static ClassLoader getLoader() {
+    return Thread
+      .currentThread()
+      .getContextClassLoader();
+  }
+
+  public static <T>Iterable<T> locate(
+    String id, 
+    ClassLoader cl,
+    Object... args) {
+      return locate(id,false,cl,args);
+  }
+  
+  public static <T>Iterable<T> locate(
+    String id, 
+    boolean classesonly,
+    ClassLoader cl,
+    Object... args) {
+      return locate(
+        id,
+        classesonly,
+        new DefaultLoader<T>(id,classesonly,args,cl));
+  }
+
+  public static <T>Iterable<T> locate(
+    String id,
+    Object...args) {
+      return locate(id,false,args);
+  }
+  
+  public static <T>Iterable<T> locate(
+    String id,
+    boolean classesonly,
+    Object...args) {
+      return locate(
+        id,
+        new DefaultLoader<T>(id,classesonly,args));
+  }
+
+  public static <T>Iterable<T> locate(
+    String id,
+    Iterable<T> loader) {
+      List<T> impls = 
+        Collections.synchronizedList(
+          new ArrayList<T>());
+      try {
+        for (T instance : loader) {
+          if (instance != null)
+            impls.add(instance);
+        }
+      } catch (Throwable t) {
+        t.printStackTrace();
+      }
+      return impls;
+  }
+
+  public static class DefaultLoader<T> 
+    implements Iterable<T> {
+      protected final ClassLoader loader;
+      protected final String id;
+      protected final Iterator<T> iterator;
+      protected final Object[] args;
+      public DefaultLoader(
+        String id,
+        boolean classesonly,
+        Object[] args) {
+          this(
+            id,
+            classesonly,
+            args,
+            getLoader());
+      }
+      public DefaultLoader(
+        String id,
+        boolean classesonly,
+        Object[] args,
+        ClassLoader loader) {
+          this.loader = 
+            loader != null ? 
+              loader : 
+              getLoader();
+          this.id = id;
+          this.iterator= init(classesonly);
+          this.args = args;
+      }
+      private Iterator<T> init(boolean classesonly) {
+        try {
+          List<Iterator<T>> list = 
+            new ArrayList<Iterator<T>>();
+          Enumeration<URL> e = 
+            locateResources(
+              "META-INF/services/" + id,                                         //$NON-NLS-1$ 
+              loader, 
+              Discover.class);
+          while(e.hasMoreElements()) {
+            Iterator<T> i = 
+              new DefaultLoaderIterator<T>(
+                loader,
+                e.nextElement().openStream(),
+                classesonly,
+                args);
+            list.add(i);
+          }
+          return new MultiIterator<T>(list);
+        } catch (Throwable t) {
+          throw new RuntimeException(t);
+        }
+      }
+      public Iterator<T> iterator() {
+        return iterator;
+    }
+  }
+  
+  public static class DefaultLoaderIterator<T> 
+    extends LineReaderLoaderIterator<T> { 
+    public DefaultLoaderIterator(
+      ClassLoader cl,
+      InputStream in,
+      boolean classesonly,
+      Object[] args) {
+        super(cl,in,classesonly,args);
+    }
+    public T next() {
+      try {
+        if (!hasNext()) return null;
+        return create(read(),args);
+      } catch (Throwable t) {
+        return null;
+      }
+    } 
+    protected T create(String spec, Object[] args) {
+      try {
+        return load(cl,spec,classesonly,args);
+      } catch (RuntimeException e) {
+        throw e;
+      } catch (Throwable t) {
+        throw new RuntimeException(t);
+      }
+    }
+  }
+  
+  private static <T>T load(
+    ClassLoader loader, 
+    String spec, 
+    boolean classesonly,
+    Object[] args) 
+      throws Exception {
+    if (classesonly) {
+      return (T)getClass(loader,spec);
+    } else {
+      Class<T> _class = 
+        getClass(loader,spec);
+      Class<?>[] types = 
+        new Class<?>[args != null ? args.length : 0];
+      if (args != null) {
+        for (int n = 0; n < args.length; n++) {
+          types[n] = args[n].getClass();
+        }
+        return _class.getConstructor(types)
+          .newInstance(args);
+      } else {
+        return _class.newInstance();
+      }
+    }
+  }
+  
+  private static <T>Class<T> getClass(
+    ClassLoader loader, 
+    String spec) {
+    Class<T> c = null;
+      try {
+        c = (Class<T>) loader.loadClass(spec);
+        c = (Class<T>) (c != null ? c : 
+          getClass(Discover.class.getClassLoader(), spec));
+      } catch (ClassNotFoundException e) {
+        throw new RuntimeException(e);
+      }
+      return c;
+  }
+  
+  public static abstract class LineReaderLoaderIterator<T> 
+    extends LoaderIterator<T> {
+    private BufferedReader buf = null;
+    private String line = null;
+    protected final Object[] args;
+    protected final boolean classesonly;
+    protected LineReaderLoaderIterator(
+      ClassLoader cl, 
+      InputStream in,
+      boolean classesonly,
+      Object[] args) {
+        super(cl);
+        this.args = args;
+        this.classesonly = classesonly;
+        try {
+          InputStreamReader reader = new InputStreamReader(in);
+          buf = new BufferedReader(reader);
+          line = readNext();
+        } catch (Throwable t) {
+          throw new RuntimeException(t);
+        }
+    }
+    public boolean hasNext() {
+      return line != null;
+    }
+    protected String readNext() {
+      try {
+        String line = null;
+        while((line = buf.readLine()) != null) {
+          line = line.trim();
+          if (!line.startsWith("#")) break;                                      //$NON-NLS-1$
+        }
+        return line;
+      } catch (Throwable t) {
+        throw new RuntimeException(t);
+      }
+    }
+    protected String read() {
+      String val = line;
+      line = readNext();
+      return val;
+    }
+  }
+  
+  public static abstract class LoaderIterator<T> 
+    implements Iterator<T> {
+      protected final ClassLoader cl;
+      protected LoaderIterator(
+        ClassLoader cl) {
+          this.cl = cl;
+      }
+      public void remove() {}
+  }
+    
+  public static URL locateResource(
+    String id, 
+    ClassLoader loader,
+    Class<?> callingClass) {
+      URL url = loader.getResource(id);
+      if (url == null && id.startsWith("/"))
+        url = loader.getResource(
+          id.substring(1));
+      if (url == null)
+        url = locateResource(
+          id,
+          Discover.class.getClassLoader(),
+          callingClass);
+      if (url == null && callingClass != null)
+        url = locateResource(
+          id,
+          callingClass.getClassLoader(),
+          null);
+      if (url == null) {
+        url = 
+          callingClass
+            .getResource(id);
+      }      
+      if ((url == null) && id.startsWith("/")) {
+        url = 
+          callingClass
+            .getResource(
+              id.substring(1));
+      }
+      return url;
+  }
+
+  public static Enumeration<URL> locateResources(
+    String id, 
+    ClassLoader loader,
+    Class<?> callingClass) 
+      throws IOException {
+        Enumeration<URL> urls =
+          loader.getResources(id);
+        if (urls == null && id.startsWith("/"))
+          urls = loader.getResources(
+            id.substring(1));
+        if (urls == null)
+          urls = locateResources(
+            id,
+            Discover.class.getClassLoader(),
+            callingClass);
+        if (urls == null)
+          urls = locateResources(
+            id,
+            callingClass.getClassLoader(),
+            callingClass);
+        return urls;
+    }
+  
+    public static InputStream locateResourceAsStream(
+      String resourceName, 
+      ClassLoader loader,
+      Class<?> callingClass) {
+        URL url = 
+          locateResource(
+            resourceName, 
+            loader, 
+            callingClass);
+        try {
+          return (url != null) ? 
+            url.openStream() : null;
+        } catch (IOException e) {
+          return null;
+        }
+    }
+}

Added: abdera/java/trunk/core/src/main/java/org/apache/abdera/util/MultiIterator.java
URL: http://svn.apache.org/viewvc/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/MultiIterator.java?rev=772417&view=auto
==============================================================================
--- abdera/java/trunk/core/src/main/java/org/apache/abdera/util/MultiIterator.java (added)
+++ abdera/java/trunk/core/src/main/java/org/apache/abdera/util/MultiIterator.java Wed May  6 20:36:21 2009
@@ -0,0 +1,72 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  The ASF licenses this file to You
+* under the Apache License, Version 2.0 (the "License"); you may not
+* use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.  For additional information regarding
+* copyright in this work, please see the NOTICE file in the top level
+* directory of this distribution.
+*/
+package org.apache.abdera.util;
+
+import java.util.Arrays;
+import java.util.Iterator;
+
+/**
+ * Iterator implementation that wraps multiple iterators and invokes them
+ * in sequence.
+ */
+public final class MultiIterator<T> 
+  implements Iterator<T> {
+
+  private Iterator<Iterator<T>> iterators;
+  private Iterator<T> current;
+  
+  public MultiIterator(Iterable<Iterator<T>> i) {
+    this(i.iterator());
+  }
+  
+  public MultiIterator(Iterator<T>... iterators) {
+    this(Arrays.asList(iterators).iterator());
+  }
+  
+  public MultiIterator(Iterator<Iterator<T>> iterators) {
+    this.iterators = iterators;
+    current = selectCurrent();
+  }
+  
+  private Iterator<T> selectCurrent() {
+    if (current == null) {
+      if (iterators.hasNext())
+        current = iterators.next();
+    } else if (!current.hasNext() && iterators.hasNext()) { 
+      current = iterators.next();
+    }
+    return current;
+  }
+  
+  public boolean hasNext() {
+    Iterator<T> c = selectCurrent();
+    return c != null ? c.hasNext() : false;
+  }
+
+  public T next() {
+    if (hasNext())
+      return selectCurrent().next();
+    else 
+      return null;
+  }
+
+  public void remove() {
+    throw new UnsupportedOperationException();
+  }
+  
+}
\ No newline at end of file

Modified: abdera/java/trunk/core/src/main/java/org/apache/abdera/util/ServiceUtil.java
URL: http://svn.apache.org/viewvc/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/ServiceUtil.java?rev=772417&r1=772416&r2=772417&view=diff
==============================================================================
--- abdera/java/trunk/core/src/main/java/org/apache/abdera/util/ServiceUtil.java (original)
+++ abdera/java/trunk/core/src/main/java/org/apache/abdera/util/ServiceUtil.java Wed May  6 20:36:21 2009
@@ -17,15 +17,7 @@
 */
 package org.apache.abdera.util;
 
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.lang.reflect.Constructor;
-import java.net.URL;
 import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Enumeration;
 import java.util.List;
 
 import org.apache.abdera.Abdera;
@@ -40,6 +32,7 @@
 
 /**
  * Core utility methods that support Abdera's internal operation
+ * @deprecated
  */
 public final class ServiceUtil 
   implements Constants {
@@ -47,478 +40,170 @@
   ServiceUtil() {}
   
   /**
-   * Returns a new instance of the identified object class.  This will use
-   * the Abdera configuration mechanism to look up the implementation class
-   * for the specified id.  Several places will be checked: the abdera.properties
-   * file, the /META-INF/services directory, and the System properties.  If 
-   * no instance is configured, the default class name will be used.  Returns
-   * null if no instance can be created.
-   */
-  public static Object newInstance(String id, String _default, Abdera abdera) {
-    return locate(id, _default, abdera);
-  }
-  
-  /**
-   * Returns a new instance of the identified object class.  This will use
-   * the Abdera configuration mechanism to look up the implementation class
-   * for the specified id.  Several places will be checked: the abdera.properties
-   * file, the /META-INF/services directory, and the System properties.  If 
-   * no instance is configured, the default class name will be used.  Returns
-   * null if no instance can be created.
-   */
-  public static Object newInstance(String id, String _default, Abdera abdera, Object... args) {
-    return locate(id, _default, abdera, args);
-  }
-
-  /**
    * Utility method for returning an instance of the default Abdera XPath instance
+   * @deprecated
    */
-  public static XPath newXPathInstance(Abdera abdera) {
-    return (XPath) newInstance(
-      CONFIG_XPATH,
-      abdera.getConfiguration().getConfigurationOption(CONFIG_XPATH, DEFAULT_XPATH), 
-      abdera);
+  public static XPath newXPathInstance(
+    Abdera abdera) {
+      return (XPath) Discover.locate(
+        CONFIG_XPATH,
+        abdera
+          .getConfiguration()
+          .getConfigurationOption(
+            CONFIG_XPATH, 
+            DEFAULT_XPATH), 
+        abdera);
   }
   
   /**
    * Utility method for returning an instance of the default Abdera Parser instance
+   * @deprecated
    */
-  public static Parser newParserInstance(Abdera abdera) {
-    return (Parser) newInstance(
-      CONFIG_PARSER, 
-      abdera.getConfiguration().getConfigurationOption(CONFIG_PARSER, DEFAULT_PARSER),
-      abdera);
+  public static Parser newParserInstance(
+    Abdera abdera) {
+      return (Parser) Discover.locate(
+        CONFIG_PARSER, 
+        abdera
+          .getConfiguration()
+          .getConfigurationOption(
+            CONFIG_PARSER, 
+            DEFAULT_PARSER),
+        abdera);
   }
 
   /**
    * Utility method for returning an instance of the defaul Abdera Factory instance
+   * @deprecated
    */
-  public static Factory newFactoryInstance(Abdera abdera) {
-    return (Factory) newInstance(
-      CONFIG_FACTORY, 
-      abdera.getConfiguration().getConfigurationOption(CONFIG_FACTORY, DEFAULT_FACTORY),
-      abdera);
-  }
-  
-  public static ParserFactory newParserFactoryInstance(Abdera abdera) {
-    return (ParserFactory) newInstance(
-      CONFIG_PARSERFACTORY,
-      abdera.getConfiguration().getConfigurationOption(CONFIG_PARSERFACTORY, DEFAULT_PARSERFACTORY),
-      abdera);
-  }
-  
-  public static WriterFactory newWriterFactoryInstance(Abdera abdera) {
-    return (WriterFactory) newInstance(
-      CONFIG_WRITERFACTORY,
-      abdera.getConfiguration().getConfigurationOption(CONFIG_WRITERFACTORY, DEFAULT_WRITERFACTORY),
-      abdera) ;
+  public static Factory newFactoryInstance(
+    Abdera abdera) {
+      return (Factory) Discover.locate(
+        CONFIG_FACTORY, 
+        abdera
+          .getConfiguration()
+          .getConfigurationOption(
+            CONFIG_FACTORY, 
+            DEFAULT_FACTORY),
+        abdera);
   }
   
-  public static Writer newWriterInstance(Abdera abdera) {
-    return (Writer) newInstance(
-      CONFIG_WRITER,
-      abdera.getConfiguration().getConfigurationOption(CONFIG_WRITER, DEFAULT_WRITER),
-      abdera);
+  /**
+   * @deprecated
+   */
+  public static ParserFactory newParserFactoryInstance(
+    Abdera abdera) {
+      return (ParserFactory) Discover.locate(
+        CONFIG_PARSERFACTORY,
+        abdera
+          .getConfiguration()
+          .getConfigurationOption(
+            CONFIG_PARSERFACTORY, 
+            DEFAULT_PARSERFACTORY),
+        abdera);
   }
   
-  public static StreamWriter newStreamWriterInstance(Abdera abdera) {
-    return (StreamWriter) newInstance(
-      CONFIG_STREAMWRITER,
-      abdera.getConfiguration().getConfigurationOption(CONFIG_STREAMWRITER, DEFAULT_STREAMWRITER),
-      abdera);    
+  /**
+   * @deprecated
+   */
+  public static WriterFactory newWriterFactoryInstance(
+    Abdera abdera) {
+      return (WriterFactory) Discover.locate(
+        CONFIG_WRITERFACTORY,
+        abdera
+          .getConfiguration()
+          .getConfigurationOption(
+            CONFIG_WRITERFACTORY, 
+            DEFAULT_WRITERFACTORY),
+        abdera) ;
   }
   
-  public static Object locate(
-    String id, 
-    String _default, 
+  /**
+   * @deprecated
+   */
+  public static Writer newWriterInstance(
     Abdera abdera) {
-      Object object = locate(id, abdera);
-      if (object == null && _default != null) {
-        object = locateInstance(_default, abdera);
-      }
-      return object;
+      return (Writer) Discover.locate(
+        CONFIG_WRITER,
+        abdera
+          .getConfiguration()
+          .getConfigurationOption(
+            CONFIG_WRITER, 
+            DEFAULT_WRITER),
+        abdera);
   }
   
-  public static Object locate(
-    String id, 
-    String _default, 
-    Abdera abdera,
-    Object... args) {
-      Object object = locate(id, abdera);
-      if (object == null && _default != null) {
-        object = locateInstance(_default, abdera, args);
-      }
-      return object;
-  }
-
   /**
-   * Locate a class instance for the given id
+   * @deprecated
    */
-  public static Object locate(String id, Abdera abdera) {
-    Object service = checkAbderaConfiguration(id, abdera);
-    return ((service != null) ? service : checkMetaInfServices(id, abdera));
-  }
-  
-  @SuppressWarnings("unchecked")
-  private static Object _create(Class _class, Abdera abdera) {
-    if (_class == null) return null;
-    try {
-      if (abdera != null) {
-        Constructor c = _class.getConstructor(new Class[] {Abdera.class});
-        return c.newInstance(new Object[] {abdera});
-      }
-    } catch (Exception e) {
-      // Nothing
-    }
-    try {
-      return _class.newInstance();
-    } catch (Exception e) {
-      // Nothing
-    }
-    return null;
-  }
-  
-  @SuppressWarnings("unchecked")
-  private static Object _create(Class _class, Abdera abdera, Object... args) {
-    Class[] types = null;
-    Object[] values = null;
-    if (_class == null) return null;
-    try {
-      if (abdera != null) {
-        types = new Class[args.length + 1];
-        values = new Object[args.length + 1];
-        types[0] = Abdera.class;
-        values[0] = abdera;
-        for (int n = 0; n < args.length; n++) {
-          types[n+1] = args[n].getClass();
-          values[n+1] = args[n];
-        }
-        Constructor c = _class.getConstructor(types);
-        return c.newInstance(values);
-      }
-    } catch (Exception e) {
-      // Nothing
-    }
-    try {
-      types = new Class[args.length];
-      for (int n = 0; n < args.length; n++)
-        types[n] = args[n].getClass();
-      return _class.getConstructor(types).newInstance(args);
-    } catch (Exception e) {
-      // Nothing
-    }
-    return null;
-  }
-  
-  public static Object locateInstance(String id, Abdera abdera) {
-    return locateInstance(id,abdera,false);
-  }
-  
-  @SuppressWarnings("unchecked")
-  public static Object locateInstance(String id, Abdera abdera, boolean classesonly) {
-    try {
-      Class _class = loadClass(id, ServiceUtil.class);
-      return classesonly ? _class : _create(_class, abdera);
-    } catch (Exception e) {
-      // Nothing
-    }
-    try {
-      Class _class = ClassLoader.getSystemClassLoader().loadClass(id);
-      return classesonly ? _class : _create(_class, abdera);
-    } catch (Exception e) {
-      // Nothing
-    }
-    return null;
-  }
-  
-  @SuppressWarnings("unchecked")
-  public static Object locateInstance(String id, Abdera abdera, Object... args) {
-    try {
-      Class _class = loadClass(id, ServiceUtil.class);
-      return _create(_class, abdera, args);
-    } catch (Exception e) {
-      // Nothing
-    }
-    try {
-      Class _class = ClassLoader.getSystemClassLoader().loadClass(id);
-      return _create(_class, abdera, args);
-    } catch (Exception e) {
-      // Nothing
-    }
-    return null;
-  }
-  
-  public static InputStream locateStream(String id) {
-    InputStream in = getResourceAsStream(id, ServiceUtil.class);
-    return (in != null) ? in : ClassLoader.getSystemResourceAsStream(id);
-  }
-  
-  public static Enumeration<URL> locateResources(String id) {
-    try {
-      return getResources(id,ServiceUtil.class);
-    } catch (Exception e) {
-      // Nothing
-    }
-    try {
-      return ClassLoader.getSystemResources(id);
-    } catch (Exception e) {
-      // Nothing
-    }
-    return null;
-  }
-  
-  private static Object checkAbderaConfiguration(String id, Abdera abdera) {
-    String s = abdera.getConfiguration().getConfigurationOption(id);
-    return (s != null) ? locateInstance(id, abdera) : null;
-  }
-  
-  private static Object checkMetaInfServices(String id, Abdera abdera) {
-    Object object = null;
-    String sid = "META-INF/services/" + id;
-    BufferedReader buf = null;
-    try {
-      InputStream is = locateStream(sid);
-      if (is != null) {
-        buf = new BufferedReader(new InputStreamReader(is));
-        String line = buf.readLine();
-        if (line != null) {
-          String s = line.split("#",2)[0].trim();
-          object = locateInstance(s, abdera);
-        }
-      }
-    } catch (Exception e) {
-      // Nothing
-    } finally {
-      if (buf != null) {
-        try {
-          buf.close();
-        } catch (IOException ioe) {
-          // Nothing
-        }
-      }
-    }
-    return object;
+  public static StreamWriter newStreamWriterInstance(
+    Abdera abdera) {
+      return (StreamWriter) Discover.locate(
+        CONFIG_STREAMWRITER,
+        abdera
+          .getConfiguration()
+          .getConfigurationOption(
+            CONFIG_STREAMWRITER, 
+            DEFAULT_STREAMWRITER),
+        abdera);    
   }
   
-  protected static synchronized List<ExtensionFactory> loadExtensionFactories() {
-      List<ExtensionFactory> factories =
-        _loadimpls(
-          "META-INF/services/org.apache.abdera.factory.ExtensionFactory");
-      return factories;
-  }
-  
-  public static synchronized <T>List<T> loadimpls(String sid) {
-    return loadimpls(sid,false);
-  }
-  
-  public static synchronized <T>List<T> loadimpls(String sid, boolean classesonly) {
-    return _loadimpls(sid,classesonly);
-  }
-  
-  @SuppressWarnings("unchecked")
-  protected static <T>List<T> _loadimpls(String sid, boolean classesonly) {
-    List<T> impls = Collections.synchronizedList(new ArrayList<T>());
-    try {
-      Enumeration<URL> e = locateResources(sid);
-      for (;e.hasMoreElements();) {
-        BufferedReader buf = null;
-        try {
-          URL url = (URL) e.nextElement();
-          InputStream is = url.openStream();
-          if (is != null) {
-            buf = new BufferedReader(new InputStreamReader(is));
-            String line;
-            while ((line = buf.readLine()) != null) {
-              String s = line.split("#",2)[0].trim();
-              if (!"".equals(s)) { 
-                T impl = (T) locateInstance(s, null);
-                if (impl != null)
-                  impls.add(impl);
-              }
-            }
-          }
-        } catch (Exception ex) {
-          // Nothing
-        } finally {
-          if (buf != null) {
-            try {
-              buf.close();
-            } catch (IOException ioe) {
-              // Nothing
-            }
-          }
-        }
-      }
-    } catch (Exception e) {
-      // Nothing
-    }
-    
-    return impls;
-  }
- 
-  protected static <T>List<T> _loadimpls(String sid) {
-    return _loadimpls(sid,false);
-  }
-  
-  
-  // The following class loader functions were adopted from 
-  // http://svn.apache.org/repos/asf/cxf/trunk/common/common/src/main/java/org/apache/cxf/common/classloader/ClassLoaderUtils.java
-  // CXF is an Apache project licensed under the ASF License 2.0
-  // License statement from the file:
-  /**
-   * Licensed to the Apache Software Foundation (ASF) under one
-   * or more contributor license agreements. See the NOTICE file
-   * distributed with this work for additional information
-   * regarding copyright ownership. The ASF licenses this file
-   * to you under the Apache License, Version 2.0 (the
-   * "License"); you may not use this file except in compliance
-   * with the License. You may obtain a copy of the License at
-   *
-   * http://www.apache.org/licenses/LICENSE-2.0
-   *
-   * Unless required by applicable law or agreed to in writing,
-   * software distributed under the License is distributed on an
-   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-   * KIND, either express or implied. See the License for the
-   * specific language governing permissions and limitations
-   * under the License.
+  /**
+   * @deprecated
    */
-
+  protected static synchronized List<ExtensionFactory> loadExtensionFactories() {
+    List<ExtensionFactory> list = 
+      new ArrayList<ExtensionFactory>();
+    Iterable<ExtensionFactory> factories =
+      Discover.locate("org.apache.abdera.factory.ExtensionFactory");
+    for (ExtensionFactory factory : factories)
+      list.add(factory);
+    return list;
+  }
   
   /**
-   * Load a given resource. <p/> This method will try to load the resource
-   * using the following methods (in order):
-   * <ul>
-   * <li>From Thread.currentThread().getContextClassLoader()
-   * <li>From ClassLoaderUtil.class.getClassLoader()
-   * <li>callingClass.getClassLoader()
-   * </ul>
-   * 
-   * @param resourceName The name of the resource to load
-   * @param callingClass The Class object of the calling object
-   */
-  public static URL getResource(
-    String resourceName, 
-    Class<?> callingClass) {
-      URL url = Thread.currentThread().getContextClassLoader().getResource(resourceName);
-      if (url == null && resourceName.startsWith("/")) {
-        //certain classloaders need it without the leading /
-        url = Thread.currentThread().getContextClassLoader()
-            .getResource(resourceName.substring(1));
-      }
-      if (url == null) {
-        url = ServiceUtil.class.getClassLoader().getResource(resourceName);
-      }
-      if (url == null && resourceName.startsWith("/")) {
-        //certain classloaders need it without the leading /
-        url = ServiceUtil.class.getClassLoader()
-            .getResource(resourceName.substring(1));
-      }
-      if (url == null) {
-        ClassLoader cl = callingClass.getClassLoader();
-        if (cl != null) {
-          url = cl.getResource(resourceName);
-        }
-      }
-      if (url == null) {
-        url = callingClass.getResource(resourceName);
-      }      
-      if ((url == null) && (resourceName != null) && (resourceName.charAt(0) != '/')) {
-        return getResource('/' + resourceName, callingClass);
-      }
-      return url;
-  }
-
-  public static Enumeration<URL> getResources(
-    String resourceName, 
-    Class<?> callingClass) 
-      throws IOException {
-    Enumeration<URL> url = Thread.currentThread().getContextClassLoader().getResources(resourceName);
-    if (url == null && resourceName.startsWith("/")) {
-      //certain classloaders need it without the leading /
-      url = Thread.currentThread().getContextClassLoader()
-          .getResources(resourceName.substring(1));
-    }
-    if (url == null) {
-      url = ServiceUtil.class.getClassLoader().getResources(resourceName);
-    }
-    if (url == null && resourceName.startsWith("/")) {
-      //certain classloaders need it without the leading /
-      url = ServiceUtil.class.getClassLoader()
-          .getResources(resourceName.substring(1));
-    }
-    if (url == null) {
-      ClassLoader cl = callingClass.getClassLoader();
-      if (cl != null) {
-        url = cl.getResources(resourceName);
-      }
-    }      
-    if ((url == null) && (resourceName != null) && (resourceName.charAt(0) != '/')) {
-      return getResources('/' + resourceName, callingClass);
-    }
-    return url;
+   * @deprecated
+   */
+  public static synchronized <T>Iterable<T> loadimpls(String sid) {
+    return Discover.locate(sid);
   }
   
   /**
-   * This is a convenience method to load a resource as a stream. <p/> The
-   * algorithm used to find the resource is given in getResource()
-   * 
-   * @param resourceName The name of the resource to load
-   * @param callingClass The Class object of the calling object
-   */
-  public static InputStream getResourceAsStream(
-    String resourceName, 
-    Class<?> callingClass) {
-      URL url = getResource(resourceName, callingClass);
-      try {
-        return (url != null) ? url.openStream() : null;
-      } catch (IOException e) {
-        return null;
-      }
+   * @deprecated
+   */
+  public static synchronized <T>Iterable<T> loadimpls(String sid, boolean classesonly) {
+    return Discover.locate(sid,classesonly);
   }
 
   /**
-   * Load a class with a given name. <p/> It will try to load the class in the
-   * following order:
-   * <ul>
-   * <li>From Thread.currentThread().getContextClassLoader()
-   * <li>Using the basic Class.forName()
-   * <li>From ClassLoaderUtil.class.getClassLoader()
-   * <li>From the callingClass.getClassLoader()
-   * </ul>
-   * 
-   * @param className The name of the class to load
-   * @param callingClass The Class object of the calling object
-   * @throws ClassNotFoundException If the class cannot be found anywhere.
-   */
-  public static Class<?> loadClass(
-    String className, 
-    Class<?> callingClass) 
-      throws ClassNotFoundException {
-    try {
-      ClassLoader cl = Thread.currentThread().getContextClassLoader();
-      if (cl != null) {
-        return cl.loadClass(className);
-      }      
-      return loadClass2(className, callingClass);
-    } catch (ClassNotFoundException e) {
-      return loadClass2(className, callingClass);
-    }
+   * Returns a new instance of the identified object class.  This will use
+   * the Abdera configuration mechanism to look up the implementation class
+   * for the specified id.  Several places will be checked: the abdera.properties
+   * file, the /META-INF/services directory, and the System properties.  If 
+   * no instance is configured, the default class name will be used.  Returns
+   * null if no instance can be created.
+   * @deprecated
+   */
+  public static Object newInstance(
+    String id, 
+    String _default, 
+    Abdera abdera) {
+      return Discover.locate(id,_default,abdera);
   }
-
-  private static Class<?> loadClass2(
-    String className, 
-    Class<?> callingClass) 
-      throws ClassNotFoundException {
-    try {
-      return Class.forName(className);
-    } catch (ClassNotFoundException ex) {
-      try {
-        return ServiceUtil.class.getClassLoader().loadClass(className);
-      } catch (ClassNotFoundException exc) {
-        return callingClass.getClassLoader().loadClass(className);
-      }
-    }
+  
+  /**
+   * Returns a new instance of the identified object class.  This will use
+   * the Abdera configuration mechanism to look up the implementation class
+   * for the specified id.  Several places will be checked: the abdera.properties
+   * file, the /META-INF/services directory, and the System properties.  If 
+   * no instance is configured, the default class name will be used.  Returns
+   * null if no instance can be created.
+   * @deprecated
+   */
+  public static Object newInstance(
+    String id, 
+    String _default, 
+    Object... args) {
+      return Discover.locate(id,_default,args);
   }
 
 }

Modified: abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/FOMXPath.java
URL: http://svn.apache.org/viewvc/abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/FOMXPath.java?rev=772417&r1=772416&r2=772417&view=diff
==============================================================================
--- abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/FOMXPath.java (original)
+++ abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/FOMXPath.java Wed May  6 20:36:21 2009
@@ -24,6 +24,7 @@
 
 import javax.xml.namespace.QName;
 
+import org.apache.abdera.Abdera;
 import org.apache.abdera.model.Base;
 import org.apache.abdera.model.ElementWrapper;
 import org.apache.abdera.parser.stax.util.ResolveFunction;
@@ -46,7 +47,7 @@
   private final Map<QName,Function> functions;
   private final Map<QName,Object> variables;
   
-  public FOMXPath() {
+  public FOMXPath(Abdera abdera) {
     this(null,null,null);
   }
   

Modified: abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/StaxStreamWriter.java
URL: http://svn.apache.org/viewvc/abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/StaxStreamWriter.java?rev=772417&r1=772416&r2=772417&view=diff
==============================================================================
--- abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/StaxStreamWriter.java (original)
+++ abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/StaxStreamWriter.java Wed May  6 20:36:21 2009
@@ -30,6 +30,7 @@
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 
+import org.apache.abdera.Abdera;
 import org.apache.abdera.parser.stax.util.FOMHelper;
 import org.apache.abdera.util.AbstractStreamWriter;
 import org.apache.abdera.util.Constants;
@@ -45,26 +46,30 @@
   private int depth = 0;
   private int textwritten = 0;
   
-  public StaxStreamWriter() {
-    super(NAME);
+  public StaxStreamWriter(
+    Abdera abdera) {
+      super(abdera,NAME);
   }
   
   public StaxStreamWriter(
+    Abdera abdera,
     Writer writer) {
-    super(NAME);
+    super(abdera,NAME);
     setWriter(writer);
   }
 
   public StaxStreamWriter(
+    Abdera abdera,
     OutputStream out) {
-      super(NAME);
+      super(abdera,NAME);
       setOutputStream(out);
   }
   
   public StaxStreamWriter(
+    Abdera abdera,
     OutputStream out, 
     String charset) {
-    super(NAME);
+    super(abdera,NAME);
     setOutputStream(out,charset);
   }
 

Modified: abdera/java/trunk/parser/src/test/java/org/apache/abdera/test/parser/stax/FOMTest.java
URL: http://svn.apache.org/viewvc/abdera/java/trunk/parser/src/test/java/org/apache/abdera/test/parser/stax/FOMTest.java?rev=772417&r1=772416&r2=772417&view=diff
==============================================================================
--- abdera/java/trunk/parser/src/test/java/org/apache/abdera/test/parser/stax/FOMTest.java (original)
+++ abdera/java/trunk/parser/src/test/java/org/apache/abdera/test/parser/stax/FOMTest.java Wed May  6 20:36:21 2009
@@ -790,7 +790,7 @@
     edoc.writeTo(w);
     
     in = new ByteArrayInputStream(out.toByteArray());
-
+    
     entry = (Entry) abdera.getParser().parse(in).getRoot();
 
     assertEquals("tóst", entry.getContent());

Modified: abdera/java/trunk/security/src/main/java/org/apache/abdera/security/AbderaSecurity.java
URL: http://svn.apache.org/viewvc/abdera/java/trunk/security/src/main/java/org/apache/abdera/security/AbderaSecurity.java?rev=772417&r1=772416&r2=772417&view=diff
==============================================================================
--- abdera/java/trunk/security/src/main/java/org/apache/abdera/security/AbderaSecurity.java (original)
+++ abdera/java/trunk/security/src/main/java/org/apache/abdera/security/AbderaSecurity.java Wed May  6 20:36:21 2009
@@ -19,7 +19,7 @@
 
 import org.apache.abdera.Abdera;
 import org.apache.abdera.util.Configuration;
-import org.apache.abdera.util.ServiceUtil;
+import org.apache.abdera.util.Discover;
 
 /**
  * The AbderaSecurity class provides the entry point for using XML Digital
@@ -54,7 +54,7 @@
    */
   public Encryption newEncryption() {
     return
-      (Encryption) ServiceUtil.newInstance(
+      (Encryption) Discover.locate(
           "org.apache.abdera.security.Encryption", 
           "org.apache.abdera.security.xmlsec.XmlEncryption",
           getAbdera());
@@ -72,7 +72,7 @@
    */
   public Signature newSignature() {
     return
-      (Signature) ServiceUtil.newInstance(
+      (Signature) Discover.locate(
         "org.apache.abdera.security.Signature", 
         "org.apache.abdera.security.xmlsec.XmlSignature",
         getAbdera());

Modified: abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/ServiceManager.java
URL: http://svn.apache.org/viewvc/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/ServiceManager.java?rev=772417&r1=772416&r2=772417&view=diff
==============================================================================
--- abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/ServiceManager.java (original)
+++ abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/ServiceManager.java Wed May  6 20:36:21 2009
@@ -22,7 +22,7 @@
 import org.apache.abdera.Abdera;
 import org.apache.abdera.i18n.text.Localizer;
 import org.apache.abdera.protocol.server.impl.DefaultProvider;
-import org.apache.abdera.util.ServiceUtil;
+import org.apache.abdera.util.Discover;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -65,7 +65,7 @@
     String instance = properties.get(PROVIDER);
     log.debug(Localizer.sprintf("CREATING.NEW.INSTANCE","Provider"));
     Provider provider = 
-      (Provider) ServiceUtil.newInstance(
+      (Provider) Discover.locate(
         PROVIDER, 
         (instance != null) ? 
           instance :