You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by tr...@apache.org on 2006/01/20 14:48:55 UTC

svn commit: r370807 [3/22] - in /directory/sandbox/trustin/mina-spi: ./ core/src/main/java/org/apache/mina/common/ core/src/main/java/org/apache/mina/common/support/ core/src/main/java/org/apache/mina/common/support/discovery/ core/src/main/java/org/ap...

Added: directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/resource/names/DiscoverNamesInManagedProperties.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/resource/names/DiscoverNamesInManagedProperties.java?rev=370807&view=auto
==============================================================================
--- directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/resource/names/DiscoverNamesInManagedProperties.java (added)
+++ directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/resource/names/DiscoverNamesInManagedProperties.java Fri Jan 20 05:47:50 2006
@@ -0,0 +1,98 @@
+/*
+ * ====================================================================
+ *
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Commons", and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+package org.apache.mina.common.support.discovery.resource.names;
+
+import org.apache.mina.common.support.discovery.ResourceNameDiscover;
+import org.apache.mina.common.support.discovery.ResourceNameIterator;
+import org.apache.mina.common.support.discovery.tools.ManagedProperties;
+
+
+/**
+ * Recover resource name from Managed Properties.
+ * @see org.apache.mina.common.support.discovery.tools.ManagedProperties
+ * 
+ * @author Richard A. Sitze
+ */
+public class DiscoverNamesInManagedProperties
+    extends ResourceNameDiscoverImpl
+    implements ResourceNameDiscover
+{
+    /** Construct a new resource discoverer
+     */
+    public DiscoverNamesInManagedProperties() {
+    }
+
+    /**
+     * @return Enumeration of ResourceInfo
+     */
+    public ResourceNameIterator findResourceNames(final String resourceName) {
+        return new ResourceNameIterator() {
+            private String resource = ManagedProperties.getProperty(resourceName);
+            
+            public boolean hasNext() {
+                return resource != null;
+            }
+            
+            public String nextResourceName() {
+                String element = resource;
+                resource = null;
+                return element;
+            }
+        };
+    }
+}

Propchange: directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/resource/names/DiscoverNamesInManagedProperties.java
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision

Added: directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/resource/names/DiscoverNamesInSystemProperties.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/resource/names/DiscoverNamesInSystemProperties.java?rev=370807&view=auto
==============================================================================
--- directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/resource/names/DiscoverNamesInSystemProperties.java (added)
+++ directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/resource/names/DiscoverNamesInSystemProperties.java Fri Jan 20 05:47:50 2006
@@ -0,0 +1,96 @@
+/*
+ * ====================================================================
+ *
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Commons", and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+package org.apache.mina.common.support.discovery.resource.names;
+
+import org.apache.mina.common.support.discovery.ResourceNameDiscover;
+import org.apache.mina.common.support.discovery.ResourceNameIterator;
+
+
+/**
+ * Recover resource name from System Properties.
+ * 
+ * @author Richard A. Sitze
+ */
+public class DiscoverNamesInSystemProperties
+    extends ResourceNameDiscoverImpl
+    implements ResourceNameDiscover
+{
+    /** Construct a new resource discoverer
+     */
+    public DiscoverNamesInSystemProperties() {
+    }
+
+    /**
+     * @return Enumeration of ResourceInfo
+     */
+    public ResourceNameIterator findResourceNames(final String resourceName) {
+        return new ResourceNameIterator() {
+            private String resource = System.getProperty(resourceName);
+            
+            public boolean hasNext() {
+                return resource != null;
+            }
+            
+            public String nextResourceName() {
+                String element = resource;
+                resource = null;
+                return element;
+            }
+        };
+    }
+}

Propchange: directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/resource/names/DiscoverNamesInSystemProperties.java
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision

Added: directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/resource/names/DiscoverServiceNames.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/resource/names/DiscoverServiceNames.java?rev=370807&view=auto
==============================================================================
--- directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/resource/names/DiscoverServiceNames.java (added)
+++ directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/resource/names/DiscoverServiceNames.java Fri Jan 20 05:47:50 2006
@@ -0,0 +1,108 @@
+/*
+ * ====================================================================
+ *
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Commons", and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+package org.apache.mina.common.support.discovery.resource.names;
+
+import org.apache.mina.common.support.discovery.ResourceDiscover;
+import org.apache.mina.common.support.discovery.ResourceNameDiscover;
+import org.apache.mina.common.support.discovery.ResourceNameIterator;
+import org.apache.mina.common.support.discovery.resource.ClassLoaders;
+
+
+/**
+ * Provide JDK 1.3 style service discovery...
+ * 
+ * The caller will first configure the discoverer by creating a
+ * root Discoverer for the files.
+ *
+ * @author Richard A. Sitze
+ * @author Craig R. McClanahan
+ * @author Costin Manolache
+ * @author James Strachan
+ */
+public class DiscoverServiceNames
+    extends DiscoverNamesInFile
+    implements ResourceNameDiscover
+{
+    protected static final String SERVICE_HOME = "META-INF/services/";
+    
+    /** Construct a new service discoverer
+     */
+    public DiscoverServiceNames() {
+        super();
+    }
+    
+    /**
+     *  Construct a new resource discoverer
+     */
+    public DiscoverServiceNames(ClassLoaders loaders) {
+        super(loaders);
+    }
+    
+    /** Construct a new service discoverer
+     */
+    public DiscoverServiceNames(ResourceDiscover discoverer) {
+        super(discoverer);
+    }
+    
+    /**
+     * @return Enumeration of ServiceInfo
+     */
+    public ResourceNameIterator findResourceNames(String serviceName) {
+        return super.findResourceNames(SERVICE_HOME + serviceName);
+    }
+}

Propchange: directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/resource/names/DiscoverServiceNames.java
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision

Added: directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/resource/names/NameDiscoverers.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/resource/names/NameDiscoverers.java?rev=370807&view=auto
==============================================================================
--- directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/resource/names/NameDiscoverers.java (added)
+++ directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/resource/names/NameDiscoverers.java Fri Jan 20 05:47:50 2006
@@ -0,0 +1,141 @@
+/*
+ * ====================================================================
+ *
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Commons", and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+package org.apache.mina.common.support.discovery.resource.names;
+
+import java.util.Vector;
+
+import org.apache.mina.common.support.discovery.ResourceNameDiscover;
+import org.apache.mina.common.support.discovery.ResourceNameIterator;
+
+
+/**
+ * Holder for multiple ResourceNameDiscover instances.
+ * The result is the union of the results from each
+ * (not a chained sequence, where results feed the next in line.
+ *
+ * @author Richard A. Sitze
+ */
+public class NameDiscoverers
+    extends ResourceNameDiscoverImpl
+    implements ResourceNameDiscover
+{
+    private Vector discoverers = new Vector();
+    
+    /**
+     *  Construct a new resource name discoverer
+     */
+    public NameDiscoverers() {
+    }
+    
+    /**
+     * Specify an additional class loader to be used in searching.
+     * The order of loaders determines the order of the result.
+     * It is recommended to add the most specific loaders first.
+     */
+    public void addResourceNameDiscover(ResourceNameDiscover discover) {
+        if (discover != null) {
+            discoverers.addElement(discover);
+        }
+    }
+
+    protected ResourceNameDiscover getResourceNameDiscover(int idx) {
+        return (ResourceNameDiscover)discoverers.get(idx);
+    }
+
+    protected int size() {
+        return discoverers.size();
+    }
+
+    /**
+     * Set of results of all discoverers.
+     * 
+     * @return ResourceIterator
+     */
+    public ResourceNameIterator findResourceNames(final String resourceName) {
+        return new ResourceNameIterator() {
+            private int idx = 0;
+            private ResourceNameIterator iterator = null;
+            
+            public boolean hasNext() {
+                if (iterator == null  ||  !iterator.hasNext()) {
+                    iterator = getNextIterator();
+                    if (iterator == null) {
+                        return false;
+                    }
+                }
+                return iterator.hasNext();
+            }
+            
+            public String nextResourceName() {
+                return iterator.nextResourceName();
+            }
+            
+            private ResourceNameIterator getNextIterator() {
+                while (idx < size()) {
+                    ResourceNameIterator iter =
+                        getResourceNameDiscover(idx++).findResourceNames(resourceName);
+
+                    if (iter.hasNext()) {
+                        return iter;
+                    }
+                }
+                return null;
+            }
+        };
+    }
+}

Propchange: directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/resource/names/NameDiscoverers.java
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision

Added: directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/resource/names/ResourceNameDiscoverImpl.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/resource/names/ResourceNameDiscoverImpl.java?rev=370807&view=auto
==============================================================================
--- directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/resource/names/ResourceNameDiscoverImpl.java (added)
+++ directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/resource/names/ResourceNameDiscoverImpl.java Fri Jan 20 05:47:50 2006
@@ -0,0 +1,113 @@
+/*
+ * ====================================================================
+ *
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Commons", and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+package org.apache.mina.common.support.discovery.resource.names;
+
+import org.apache.mina.common.support.discovery.ResourceNameDiscover;
+import org.apache.mina.common.support.discovery.ResourceNameIterator;
+
+
+/**
+ * Helper class for methods implementing the ResourceNameDiscover interface.
+ * 
+ * @author Richard A. Sitze
+ */
+public abstract class ResourceNameDiscoverImpl implements ResourceNameDiscover
+{
+    /**
+     * Locate names of resources that are bound to <code>resourceName</code>.
+     * 
+     * @return ResourceNameIterator
+     */
+    public abstract ResourceNameIterator findResourceNames(String resourceName);
+
+    /**
+     * Locate names of resources that are bound to <code>resourceName</code>.
+     * 
+     * @return ResourceNameIterator
+     */
+    public ResourceNameIterator findResourceNames(final ResourceNameIterator inputNames) {
+        return new ResourceNameIterator() {
+            private ResourceNameIterator resourceNames = null;
+            private String resourceName = null;
+            
+            public boolean hasNext() {
+                if (resourceName == null) {
+                    resourceName = getNextResourceName();
+                }
+                return resourceName != null;
+            }
+            
+            public String nextResourceName() {
+                String name = resourceName;
+                resourceName = null;
+                return name;
+            }
+            
+            private String getNextResourceName() {
+                while (inputNames.hasNext() && (resourceNames == null  ||  !resourceNames.hasNext())) {
+                    resourceNames =
+                        findResourceNames(inputNames.nextResourceName());
+                }
+    
+                return (resourceNames != null  &&  resourceNames.hasNext())
+                       ? resourceNames.nextResourceName()
+                       : null;
+            }
+        };
+    }
+}

Propchange: directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/resource/names/ResourceNameDiscoverImpl.java
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision

Added: directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/tools/ClassUtils.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/tools/ClassUtils.java?rev=370807&view=auto
==============================================================================
--- directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/tools/ClassUtils.java (added)
+++ directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/tools/ClassUtils.java Fri Jan 20 05:47:50 2006
@@ -0,0 +1,163 @@
+/*
+ * $Header$
+ * $Revision$
+ * $Date$
+ *
+ * ====================================================================
+ *
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Commons", and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+package org.apache.mina.common.support.discovery.tools;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+
+import org.apache.mina.common.support.discovery.DiscoveryException;
+
+
+/**
+ * @author Richard A. Sitze
+ */
+public class ClassUtils {
+    /**
+     * Get package name.
+     * Not all class loaders 'keep' package information,
+     * in which case Class.getPackage() returns null.
+     * This means that calling Class.getPackage().getName()
+     * is unreliable at best.
+     */
+    public static String getPackageName(Class clazz) {
+        Package clazzPackage = clazz.getPackage();
+        String packageName;
+        if (clazzPackage != null) {
+            packageName = clazzPackage.getName();
+        } else {
+            String clazzName = clazz.getName();
+            packageName = clazzName.substring(0, clazzName.lastIndexOf('.'));
+        }
+        return packageName;
+    }
+    
+    /**
+     * @return Method 'public static returnType methodName(paramTypes)',
+     *         if found to be <strong>directly</strong> implemented by clazz.
+     */
+    public static Method findPublicStaticMethod(Class clazz,
+                                                Class returnType,
+                                                String methodName,
+                                                Class[] paramTypes) {
+        boolean problem = false;
+        Method method = null;
+
+        // verify '<methodName>(<paramTypes>)' is directly in class.
+        try {
+            method = clazz.getDeclaredMethod(methodName, paramTypes);
+        } catch(NoSuchMethodException e) {
+            problem = true;
+        }
+        
+        // verify 'public static <returnType>'
+        if (!problem  &&
+            !(Modifier.isPublic(method.getModifiers()) &&
+              Modifier.isStatic(method.getModifiers()) &&
+              method.getReturnType() == returnType)) {
+            problem = true;
+            method = null;
+        }
+        
+        return method;
+    }
+
+    /**
+     * Instantiate a new 
+     */    
+    public static Object newInstance(Class impl, Class paramClasses[], Object params[])
+        throws DiscoveryException,
+               InstantiationException,
+               IllegalAccessException,
+               NoSuchMethodException,
+               InvocationTargetException
+    {
+        if (paramClasses == null || params == null) {
+            return impl.newInstance();
+        } else {
+            Constructor constructor = impl.getConstructor(paramClasses);
+            return constructor.newInstance(params);
+        }
+    }
+    
+    /**
+     * Throws exception if <code>impl</code> does not
+     * implement or extend the SPI.
+     */
+    public static void verifyAncestory(Class spi, Class impl)
+        throws DiscoveryException
+    {
+        if (spi == null) {
+            throw new DiscoveryException("No interface defined!");
+        }
+
+        if (impl == null) {
+            throw new DiscoveryException("No implementation defined for " + spi.getName());
+        }
+
+        if (!spi.isAssignableFrom(impl)) {
+            throw new DiscoveryException("Class " + impl.getName() +
+                                         " does not implement " + spi.getName());
+        }
+    }
+}

Propchange: directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/tools/ClassUtils.java
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision

Added: directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/tools/DefaultClassHolder.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/tools/DefaultClassHolder.java?rev=370807&view=auto
==============================================================================
--- directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/tools/DefaultClassHolder.java (added)
+++ directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/tools/DefaultClassHolder.java Fri Jan 20 05:47:50 2006
@@ -0,0 +1,124 @@
+/*
+ * $Header$
+ * $Revision$
+ * $Date$
+ *
+ * ====================================================================
+ *
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Commons", and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+package org.apache.mina.common.support.discovery.tools;
+
+import org.apache.mina.common.support.discovery.ResourceClass;
+import org.apache.mina.common.support.discovery.ResourceClassIterator;
+import org.apache.mina.common.support.discovery.resource.classes.DiscoverClasses;
+import org.apache.mina.common.support.discovery.resource.ClassLoaders;
+
+
+/**
+ * Holder for a default class.
+ * 
+ * Class may be specified by name (String) or class (Class).
+ * Using the holder complicates the users job, but minimized # of API's.
+ * 
+ * @author Richard A. Sitze
+ */
+public class DefaultClassHolder {
+    private Class        defaultClass;
+    private final String defaultName;
+    
+    public DefaultClassHolder(Class defaultClass) {
+        this.defaultClass = defaultClass;
+        this.defaultName = defaultClass.getName();
+    }
+    
+    public DefaultClassHolder(String defaultName) {
+        this.defaultClass = null;
+        this.defaultName = defaultName;
+    }
+
+    /**
+     * @param spi non-null SPI
+     * @param loaders Used only if class needs to be loaded.
+     * 
+     * @return Default Class.  Load the class if necessary,
+     *         and verify that it implements the SPI.
+     *         (this forces the check, no way out..).
+     */
+    public Class getDefaultClass(SPInterface spi, ClassLoaders loaders) {
+        if (defaultClass == null) {
+            DiscoverClasses classDiscovery = new DiscoverClasses(loaders);
+            ResourceClassIterator classes = classDiscovery.findResourceClasses(getDefaultName());
+            if (classes.hasNext()) {
+                ResourceClass info = classes.nextResourceClass();
+                try {
+                    defaultClass = info.loadClass();
+                } catch (Exception e) {
+                    // ignore
+                }
+            }
+        }
+        
+        if (defaultClass != null) {
+            spi.verifyAncestory(defaultClass);
+        }
+
+        return defaultClass;
+    }
+
+    public String getDefaultName() {
+        return defaultName;
+    }
+}

Propchange: directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/tools/DefaultClassHolder.java
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision

Added: directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/tools/DiscoverClass.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/tools/DiscoverClass.java?rev=370807&view=auto
==============================================================================
--- directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/tools/DiscoverClass.java (added)
+++ directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/tools/DiscoverClass.java Fri Jan 20 05:47:50 2006
@@ -0,0 +1,656 @@
+/*
+ * $Header$
+ * $Revision$
+ * $Date$
+ *
+ * ====================================================================
+ *
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Commons", and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+package org.apache.mina.common.support.discovery.tools;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Properties;
+import java.util.Vector;
+
+import org.apache.mina.common.support.discovery.DiscoveryException;
+import org.apache.mina.common.support.discovery.ResourceClass;
+import org.apache.mina.common.support.discovery.ResourceClassIterator;
+import org.apache.mina.common.support.discovery.ResourceNameIterator;
+import org.apache.mina.common.support.discovery.resource.ClassLoaders;
+import org.apache.mina.common.support.discovery.resource.classes.DiscoverClasses;
+import org.apache.mina.common.support.discovery.resource.names.DiscoverServiceNames;
+
+
+/**
+ * <p>Discover class that implements a given service interface,
+ * with discovery and configuration features similar to that employed
+ * by standard Java APIs such as JAXP.
+ * </p>
+ * 
+ * <p>In the context of this package, a service interface is defined by a
+ * Service Provider Interface (SPI).  The SPI is expressed as a Java interface,
+ * abstract class, or (base) class that defines an expected programming
+ * interface.
+ * </p>
+ * 
+ * <p>DiscoverClass provides the <code>find</code> methods for locating a
+ * class that implements a service interface (SPI).  Each form of
+ * <code>find</code> varies slightly, but they all perform the same basic
+ * function.
+ * 
+ * The <code>DiscoverClass.find</code> methods proceed as follows:
+ * </p>
+ * <ul>
+ *   <p><li>
+ *   Get the name of an implementation class.  The name is the first
+ *   non-null value obtained from the following resources:
+ *   <ul>
+ *     <li>
+ *     The value of the (scoped) system property whose name is the same as
+ *     the SPI's fully qualified class name (as given by SPI.class.getName()).
+ *     The <code>ScopedProperties</code> class provides a way to bind
+ *     properties by classloader, in a secure hierarchy similar in concept
+ *     to the way classloader find class and resource files.
+ *     See <code>ScopedProperties</code> for more details.
+ *     <p>If the ScopedProperties are not set by users, then behaviour
+ *     is equivalent to <code>System.getProperty()</code>.
+ *     </p>
+ *     </li>
+ *     <p><li>
+ *     The value of a <code>Properties properties</code> property, if provided
+ *     as a parameter, whose name is the same as the SPI's fully qualifed class
+ *     name (as given by SPI.class.getName()).
+ *     </li></p>
+ *     <p><li>
+ *     The value obtained using the JDK1.3+ 'Service Provider' specification
+ *     (http://java.sun.com/j2se/1.3/docs/guide/jar/jar.html) to locate a
+ *     service named <code>SPI.class.getName()</code>.  This is implemented
+ *     internally, so there is not a dependency on JDK 1.3+.
+ *     </li></p>
+ *   </ul>
+ *   </li></p>
+ *   <p><li>
+ *   If the name of the implementation class is non-null, load that class.
+ *   The class loaded is the first class loaded by the following sequence
+ *   of class loaders:
+ *   <ul>
+ *     <li>Thread Context Class Loader</li>
+ *     <li>DiscoverSingleton's Caller's Class Loader</li>
+ *     <li>SPI's Class Loader</li>
+ *     <li>DiscoverSingleton's (this class or wrapper) Class Loader</li>
+ *     <li>System Class Loader</li>
+ *   </ul>
+ *   An exception is thrown if the class cannot be loaded.
+ *   </li></p>
+ *   <p><li>
+ *   If the name of the implementation class is null, AND the default
+ *   implementation class name (<code>defaultImpl</code>) is null,
+ *   then an exception is thrown.
+ *   </li></p>
+ *   <p><li>
+ *   If the name of the implementation class is null, AND the default
+ *   implementation class (<code>defaultImpl</code>) is non-null,
+ *   then load the default implementation class.  The class loaded is the
+ *   first class loaded by the following sequence of class loaders:
+ *   <ul>
+ *     <li>SPI's Class Loader</li>
+ *     <li>DiscoverSingleton's (this class or wrapper) Class Loader</li>
+ *     <li>System Class Loader</li>
+ *   </ul>
+ *   <p>
+ *   This limits the scope in which the default class loader can be found
+ *   to the SPI, DiscoverSingleton, and System class loaders.  The assumption here
+ *   is that the default implementation is closely associated with the SPI
+ *   or system, and is not defined in the user's application space.
+ *   </p>
+ *   <p>
+ *   An exception is thrown if the class cannot be loaded.
+ *   </p>
+ *   </li></p>
+ *   <p><li>
+ *   Verify that the loaded class implements the SPI: an exception is thrown
+ *   if the loaded class does not implement the SPI.
+ *   </li></p>
+ * </ul>
+ * </p>
+ *
+ * <p><strong>IMPLEMENTATION NOTE</strong> - This implementation is modelled
+ * after the SAXParserFactory and DocumentBuilderFactory implementations
+ * (corresponding to the JAXP pluggability APIs) found in Apache Xerces.
+ * </p>
+ * 
+ * @author Richard A. Sitze
+ * @author Craig R. McClanahan
+ * @author Costin Manolache
+ * @version $Revision$ $Date$
+ */
+public class DiscoverClass {
+    /**
+     * Readable placeholder for a null value.
+     */
+    public static final DefaultClassHolder nullDefaultImpl = null;
+
+    /**
+     * Readable placeholder for a null value.
+     */
+    public static final PropertiesHolder nullProperties = null;
+    
+    
+    private ClassLoaders classLoaders = null;
+
+
+    /**
+     * Create a class instance with dynamic environment
+     * (thread context class loader is determined on each call).
+     * 
+     * Dynamically construct class loaders on each call.
+     */    
+    public DiscoverClass() {
+        this(null);
+    }
+
+    /**
+     * Create a class instance with dynamic environment
+     * (thread context class loader is determined on each call).
+     * 
+     * Cache static list of class loaders for each call.
+     */    
+    public DiscoverClass(ClassLoaders classLoaders) {
+        this.classLoaders = classLoaders;
+    }
+    
+    
+    public ClassLoaders getClassLoaders(Class spiClass) {
+        return classLoaders;
+    }
+
+
+    /**
+     * Find class implementing SPI.
+     * 
+     * @param spiClass Service Provider Interface Class.
+     * 
+     * @return Class implementing the SPI.
+     * 
+     * @exception DiscoveryException Thrown if the name of a class implementing
+     *            the SPI cannot be found, if the class cannot be loaded, or if
+     *            the resulting class does not implement (or extend) the SPI.
+     */
+    public Class find(Class spiClass)
+        throws DiscoveryException
+    {
+        return find(getClassLoaders(spiClass),
+                    new SPInterface(spiClass),
+                    nullProperties,
+                    nullDefaultImpl);
+    }
+
+    /**
+     * Find class implementing SPI.
+     * 
+     * @param spiClass Service Provider Interface Class.
+     * 
+     * @param properties Used to determine name of SPI implementation.
+     * 
+     * @return Class implementing the SPI.
+     * 
+     * @exception DiscoveryException Thrown if the name of a class implementing
+     *            the SPI cannot be found, if the class cannot be loaded, or if
+     *            the resulting class does not implement (or extend) the SPI.
+     */
+    public Class find(Class spiClass, Properties properties)
+        throws DiscoveryException
+    {
+        return find(getClassLoaders(spiClass),
+                    new SPInterface(spiClass),
+                    new PropertiesHolder(properties),
+                    nullDefaultImpl);
+    }
+
+    /**
+     * Find class implementing SPI.
+     * 
+     * @param spiClass Service Provider Interface Class.
+     * 
+     * @param defaultImpl Default implementation name.
+     * 
+     * @return Class implementing the SPI.
+     * 
+     * @exception DiscoveryException Thrown if the name of a class implementing
+     *            the SPI cannot be found, if the class cannot be loaded, or if
+     *            the resulting class does not implement (or extend) the SPI.
+     */
+    public Class find(Class spiClass, String defaultImpl)
+        throws DiscoveryException
+    {
+        return find(getClassLoaders(spiClass),
+                    new SPInterface(spiClass),
+                    nullProperties,
+                    new DefaultClassHolder(defaultImpl));
+    }
+
+    /**
+     * Find class implementing SPI.
+     * 
+     * @param spiClass Service Provider Interface Class.
+     * 
+     * @param properties Used to determine name of SPI implementation,.
+     * 
+     * @param defaultImpl Default implementation class.
+     * 
+     * @return Class implementing the SPI.
+     * 
+     * @exception DiscoveryException Thrown if the name of a class implementing
+     *            the SPI cannot be found, if the class cannot be loaded, or if
+     *            the resulting class does not implement (or extend) the SPI.
+     */
+    public Class find(Class spiClass, Properties properties, String defaultImpl)
+        throws DiscoveryException
+    {
+        return find(getClassLoaders(spiClass),
+                    new SPInterface(spiClass),
+                    new PropertiesHolder(properties),
+                    new DefaultClassHolder(defaultImpl));
+    }
+
+    /**
+     * Find class implementing SPI.
+     * 
+     * @param spiClass Service Provider Interface Class.
+     * 
+     * @param properties Used to determine name of SPI implementation,.
+     * 
+     * @param defaultImpl Default implementation class.
+     * 
+     * @return Class implementing the SPI.
+     * 
+     * @exception DiscoveryException Thrown if the name of a class implementing
+     *            the SPI cannot be found, if the class cannot be loaded, or if
+     *            the resulting class does not implement (or extend) the SPI.
+     */
+    public Class find(Class spiClass, String propertiesFileName, String defaultImpl)
+        throws DiscoveryException
+    {
+        return find(getClassLoaders(spiClass),
+                    new SPInterface(spiClass),
+                    new PropertiesHolder(propertiesFileName),
+                    new DefaultClassHolder(defaultImpl));
+    }
+
+    /**
+     * Find class implementing SPI.
+     * 
+     * @param spiClass Service Provider Interface Class.
+     * 
+     * @param properties Used to determine name of SPI implementation,.
+     * 
+     * @param defaultImpl Default implementation class.
+     * 
+     * @return Class implementing the SPI.
+     * 
+     * @exception DiscoveryException Thrown if the name of a class implementing
+     *            the SPI cannot be found, if the class cannot be loaded, or if
+     *            the resulting class does not implement (or extend) the SPI.
+     */
+    public static Class find(ClassLoaders loaders,
+                             SPInterface spi,
+                             PropertiesHolder properties,
+                             DefaultClassHolder defaultImpl)
+        throws DiscoveryException
+    {
+        if (loaders == null) {
+            loaders = ClassLoaders.getLibLoaders(spi.getSPClass(),
+                                                 DiscoverClass.class,
+                                                 true);
+        }
+        
+        Properties props = (properties == null)
+                           ? null
+                           : properties.getProperties(spi, loaders);
+        
+        String[] classNames = discoverClassNames(spi, props);
+        
+        if (classNames.length > 0) {
+            DiscoverClasses classDiscovery = new DiscoverClasses(loaders);
+            
+            ResourceClassIterator classes =
+                classDiscovery.findResourceClasses(classNames[0]);
+            
+            // If it's set as a property.. it had better be there!
+            if (classes.hasNext()) {
+                ResourceClass info = classes.nextResourceClass();
+                try {
+                    return info.loadClass();
+                } catch (Exception e) {
+                    // ignore
+                }
+            }
+        } else {
+            ResourceNameIterator classIter =
+                (new DiscoverServiceNames(loaders)).findResourceNames(spi.getSPName());
+
+            ResourceClassIterator classes =
+                (new DiscoverClasses(loaders)).findResourceClasses(classIter);
+                
+            
+            if (!classes.hasNext()  &&  defaultImpl != null) {
+                return defaultImpl.getDefaultClass(spi, loaders);
+            }
+            
+            // Services we iterate through until we find one that loads..
+            while (classes.hasNext()) {
+                ResourceClass info = classes.nextResourceClass();
+                try {
+                    return info.loadClass();
+                } catch (Exception e) {
+                    // ignore
+                }
+            }
+        }
+        
+        throw new DiscoveryException("No implementation defined for " + spi.getSPName());
+        // return null;
+    }
+    
+    /**
+     * Create new instance of class implementing SPI.
+     * 
+     * @param spiClass Service Provider Interface Class.
+     * 
+     * @return Instance of a class implementing the SPI.
+     * 
+     * @exception DiscoveryException Thrown if the name of a class implementing
+     *            the SPI cannot be found, if the class cannot be loaded and
+     *            instantiated, or if the resulting class does not implement
+     *            (or extend) the SPI.
+     */
+    public Object newInstance(Class spiClass)
+        throws DiscoveryException,
+               InstantiationException,
+               IllegalAccessException,
+               NoSuchMethodException,
+               InvocationTargetException
+    {
+        return newInstance(getClassLoaders(spiClass),
+                           new SPInterface(spiClass),
+                           nullProperties,
+                           nullDefaultImpl);
+    }
+
+    /**
+     * Create new instance of class implementing SPI.
+     * 
+     * @param spiClass Service Provider Interface Class.
+     * 
+     * @param properties Used to determine name of SPI implementation,
+     *                   and passed to implementation.init() method if
+     *                   implementation implements Service interface.
+     * 
+     * @return Instance of a class implementing the SPI.
+     * 
+     * @exception DiscoveryException Thrown if the name of a class implementing
+     *            the SPI cannot be found, if the class cannot be loaded and
+     *            instantiated, or if the resulting class does not implement
+     *            (or extend) the SPI.
+     */
+    public Object newInstance(Class spiClass, Properties properties)
+        throws DiscoveryException,
+               InstantiationException,
+               IllegalAccessException,
+               NoSuchMethodException,
+               InvocationTargetException
+    {
+        return newInstance(getClassLoaders(spiClass),
+                           new SPInterface(spiClass),
+                           new PropertiesHolder(properties),
+                           nullDefaultImpl);
+    }
+
+    /**
+     * Create new instance of class implementing SPI.
+     * 
+     * @param spiClass Service Provider Interface Class.
+     * 
+     * @param defaultImpl Default implementation.
+     * 
+     * @return Instance of a class implementing the SPI.
+     * 
+     * @exception DiscoveryException Thrown if the name of a class implementing
+     *            the SPI cannot be found, if the class cannot be loaded and
+     *            instantiated, or if the resulting class does not implement
+     *            (or extend) the SPI.
+     */
+    public Object newInstance(Class spiClass, String defaultImpl)
+        throws DiscoveryException,
+               InstantiationException,
+               IllegalAccessException,
+               NoSuchMethodException,
+               InvocationTargetException
+    {
+        return newInstance(getClassLoaders(spiClass),
+                           new SPInterface(spiClass),
+                           nullProperties,
+                           new DefaultClassHolder(defaultImpl));
+    }
+
+    /**
+     * Create new instance of class implementing SPI.
+     * 
+     * @param spiClass Service Provider Interface Class.
+     * 
+     * @param properties Used to determine name of SPI implementation,
+     *                   and passed to implementation.init() method if
+     *                   implementation implements Service interface.
+     * 
+     * @param defaultImpl Default implementation.
+     * 
+     * @return Instance of a class implementing the SPI.
+     * 
+     * @exception DiscoveryException Thrown if the name of a class implementing
+     *            the SPI cannot be found, if the class cannot be loaded and
+     *            instantiated, or if the resulting class does not implement
+     *            (or extend) the SPI.
+     */
+    public Object newInstance(Class spiClass, Properties properties, String defaultImpl)
+        throws DiscoveryException,
+               InstantiationException,
+               IllegalAccessException,
+               NoSuchMethodException,
+               InvocationTargetException
+    {
+        return newInstance(getClassLoaders(spiClass),
+                           new SPInterface(spiClass),
+                           new PropertiesHolder(properties),
+                           new DefaultClassHolder(defaultImpl));
+    }
+
+    /**
+     * Create new instance of class implementing SPI.
+     * 
+     * @param spiClass Service Provider Interface Class.
+     * 
+     * @param properties Used to determine name of SPI implementation,
+     *                   and passed to implementation.init() method if
+     *                   implementation implements Service interface.
+     * 
+     * @param defaultImpl Default implementation.
+     * 
+     * @return Instance of a class implementing the SPI.
+     * 
+     * @exception DiscoveryException Thrown if the name of a class implementing
+     *            the SPI cannot be found, if the class cannot be loaded and
+     *            instantiated, or if the resulting class does not implement
+     *            (or extend) the SPI.
+     */
+    public Object newInstance(Class spiClass, String propertiesFileName, String defaultImpl)
+        throws DiscoveryException,
+               InstantiationException,
+               IllegalAccessException,
+               NoSuchMethodException,
+               InvocationTargetException
+    {
+        return newInstance(getClassLoaders(spiClass),
+                           new SPInterface(spiClass),
+                           new PropertiesHolder(propertiesFileName),
+                           new DefaultClassHolder(defaultImpl));
+    }
+
+    /**
+     * Create new instance of class implementing SPI.
+     * 
+     * @param spiClass Service Provider Interface Class.
+     * 
+     * @param properties Used to determine name of SPI implementation,
+     *                   and passed to implementation.init() method if
+     *                   implementation implements Service interface.
+     * 
+     * @param defaultImpl Default implementation.
+     * 
+     * @return Instance of a class implementing the SPI.
+     * 
+     * @exception DiscoveryException Thrown if the name of a class implementing
+     *            the SPI cannot be found, if the class cannot be loaded and
+     *            instantiated, or if the resulting class does not implement
+     *            (or extend) the SPI.
+     */
+    public static Object newInstance(ClassLoaders loaders,
+                                     SPInterface spi,
+                                     PropertiesHolder properties,
+                                     DefaultClassHolder defaultImpl)
+        throws DiscoveryException,
+               InstantiationException,
+               IllegalAccessException,
+               NoSuchMethodException,
+               InvocationTargetException
+    {
+        return spi.newInstance(find(loaders, spi, properties, defaultImpl));
+    }
+
+    /**
+     * <p>Discover names of SPI implementation Classes from properties.
+     * The names are the non-null values, in order, obtained from the following
+     * resources:
+     *   <ul>
+     *     <li>ManagedProperty.getProperty(SPI.class.getName());</li>
+     *     <li>properties.getProperty(SPI.class.getName());</li>
+     *   </ul>
+     * 
+     * @param properties Properties that may define the implementation
+     *                   class name(s).
+     * 
+     * @return String[] Name of classes implementing the SPI.
+     * 
+     * @exception DiscoveryException Thrown if the name of a class implementing
+     *            the SPI cannot be found.
+     */
+    public static String[] discoverClassNames(SPInterface spi,
+                                              Properties properties)
+    {
+        Vector names = new Vector();
+        
+        String spiName = spi.getSPName();
+        String propertyName = spi.getPropertyName();
+
+        boolean includeAltProperty = !spiName.equals(propertyName);
+        
+        // Try the (managed) system property spiName
+        String className = getManagedProperty(spiName);
+        if (className != null) names.addElement(className);
+        
+        if (includeAltProperty) {
+            // Try the (managed) system property propertyName
+            className = getManagedProperty(propertyName);
+            if (className != null) names.addElement(className);
+        }
+
+        if (properties != null) {
+            // Try the properties parameter spiName
+            className = properties.getProperty(spiName);
+            if (className != null) names.addElement(className);
+
+            if (includeAltProperty) {
+                // Try the properties parameter propertyName
+                className = properties.getProperty(propertyName);
+                if (className != null) names.addElement(className);
+            }
+        }
+
+        String[] results = new String[names.size()];
+        names.copyInto(results);        
+
+        return results;
+    }
+
+
+    /**
+     * Load the class whose name is given by the value of a (Managed)
+     * System Property.
+     * 
+     * @see ManagedProperties
+     * 
+     * @param attribute the name of the system property whose value is
+     *        the name of the class to load.
+     */
+    public static String getManagedProperty(String propertyName) {
+        String value;
+        try {
+            value = ManagedProperties.getProperty(propertyName);
+        } catch (SecurityException e) {
+            value = null;
+        }
+        return value;
+    }
+}

Propchange: directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/support/discovery/tools/DiscoverClass.java
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision