You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by jb...@apache.org on 2006/02/07 23:37:40 UTC

svn commit: r375756 - in /incubator/tuscany/java: sdo/impl/src/main/java/commonj/sdo/impl/ sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/ sdo/impl/src/main/resources/META-INF/services/ spec/sdo/ spec/sdo/src/main/java/commonj/sdo/impl/ spec/sdo/...

Author: jboynes
Date: Tue Feb  7 14:37:37 2006
New Revision: 375756

URL: http://svn.apache.org/viewcvs?rev=375756&view=rev
Log:
version of HelperProvider that uses JAR service lookup to find the implementation
changed copyright on HelperProvider.java as this is a new implementation


Added:
    incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/HelperProviderImpl.java   (contents, props changed)
      - copied, changed from r375405, incubator/tuscany/java/sdo/impl/src/main/java/commonj/sdo/impl/HelperProviderImpl.java
    incubator/tuscany/java/sdo/impl/src/main/resources/META-INF/services/
    incubator/tuscany/java/sdo/impl/src/main/resources/META-INF/services/commonj.sdo.impl.HelperProvider
    incubator/tuscany/java/spec/sdo/src/main/java/commonj/sdo/impl/NoHelperProviderException.java   (with props)
    incubator/tuscany/java/spec/sdo/src/test/
    incubator/tuscany/java/spec/sdo/src/test/java/
    incubator/tuscany/java/spec/sdo/src/test/java/commonj/
    incubator/tuscany/java/spec/sdo/src/test/java/commonj/sdo/
    incubator/tuscany/java/spec/sdo/src/test/java/commonj/sdo/impl/
    incubator/tuscany/java/spec/sdo/src/test/java/commonj/sdo/impl/HelperProviderTestCase.java   (with props)
    incubator/tuscany/java/spec/sdo/src/test/java/test/
    incubator/tuscany/java/spec/sdo/src/test/java/test/DefaultHelperProvider.java   (with props)
    incubator/tuscany/java/spec/sdo/src/test/java/test/TCCL1HelperProvider.java   (with props)
    incubator/tuscany/java/spec/sdo/src/test/resources/
    incubator/tuscany/java/spec/sdo/src/test/resources/META-INF/
    incubator/tuscany/java/spec/sdo/src/test/resources/META-INF/services/
    incubator/tuscany/java/spec/sdo/src/test/resources/META-INF/services/commonj.sdo.impl.HelperProvider
    incubator/tuscany/java/spec/sdo/src/test/resources/tccl1/
    incubator/tuscany/java/spec/sdo/src/test/resources/tccl1/META-INF/
    incubator/tuscany/java/spec/sdo/src/test/resources/tccl1/META-INF/services/
    incubator/tuscany/java/spec/sdo/src/test/resources/tccl1/META-INF/services/commonj.sdo.impl.HelperProvider
Removed:
    incubator/tuscany/java/sdo/impl/src/main/java/commonj/sdo/impl/
Modified:
    incubator/tuscany/java/spec/sdo/pom.xml
    incubator/tuscany/java/spec/sdo/src/main/java/commonj/sdo/impl/HelperProvider.java

Copied: incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/HelperProviderImpl.java (from r375405, incubator/tuscany/java/sdo/impl/src/main/java/commonj/sdo/impl/HelperProviderImpl.java)
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/HelperProviderImpl.java?p2=incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/HelperProviderImpl.java&p1=incubator/tuscany/java/sdo/impl/src/main/java/commonj/sdo/impl/HelperProviderImpl.java&r1=375405&r2=375756&rev=375756&view=diff
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/main/java/commonj/sdo/impl/HelperProviderImpl.java (original)
+++ incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/HelperProviderImpl.java Tue Feb  7 14:37:37 2006
@@ -14,7 +14,7 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package commonj.sdo.impl;
+package org.apache.tuscany.sdo.helper;
 
 
 import org.apache.tuscany.sdo.helper.CopyHelperImpl;
@@ -30,6 +30,7 @@
 import commonj.sdo.helper.XMLHelper;
 import commonj.sdo.helper.XSDHelper;
 import commonj.sdo.impl.ExternalizableDelegator.Resolvable;
+import commonj.sdo.impl.HelperProvider;
 
 
 /**
@@ -51,7 +52,7 @@
 
   protected XSDHelper xsdHelper;
 
-  HelperProviderImpl()
+  public HelperProviderImpl()
   {
     typeHelper = SDOUtil.createTypeHelper();
     dataFactory = SDOUtil.createDataFactory(typeHelper);
@@ -62,47 +63,47 @@
     dataHelper = new DataHelperImpl();
   }
 
-  CopyHelper copyHelper()
+  public CopyHelper copyHelper()
   {
     return copyHelper;
   }
 
-  DataFactory dataFactory()
+  public DataFactory dataFactory()
   {
     return dataFactory;
   }
 
-  DataHelper dataHelper()
+  public DataHelper dataHelper()
   {
     return dataHelper;
   }
 
-  EqualityHelper equalityHelper()
+  public EqualityHelper equalityHelper()
   {
     return equalityHelper;
   }
 
-  TypeHelper typeHelper()
+  public TypeHelper typeHelper()
   {
     return typeHelper;
   }
 
-  XMLHelper xmlHelper()
+  public XMLHelper xmlHelper()
   {
     return xmlHelper;
   }
 
-  XSDHelper xsdHelper()
+  public XSDHelper xsdHelper()
   {
     return xsdHelper;
   }
 
-  Resolvable resolvable()
+  public Resolvable resolvable()
   {
     throw new UnsupportedOperationException(); //TODO
   }
 
-  Resolvable resolvable(Object target)
+  public Resolvable resolvable(Object target)
   {
     throw new UnsupportedOperationException(); //TODO
   }

Propchange: incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/HelperProviderImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/HelperProviderImpl.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sdo/impl/src/main/resources/META-INF/services/commonj.sdo.impl.HelperProvider
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sdo/impl/src/main/resources/META-INF/services/commonj.sdo.impl.HelperProvider?rev=375756&view=auto
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/main/resources/META-INF/services/commonj.sdo.impl.HelperProvider (added)
+++ incubator/tuscany/java/sdo/impl/src/main/resources/META-INF/services/commonj.sdo.impl.HelperProvider Tue Feb  7 14:37:37 2006
@@ -0,0 +1 @@
+org.apache.tuscany.sdo.helper.HelperProviderImpl
\ No newline at end of file

Modified: incubator/tuscany/java/spec/sdo/pom.xml
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/spec/sdo/pom.xml?rev=375756&r1=375755&r2=375756&view=diff
==============================================================================
--- incubator/tuscany/java/spec/sdo/pom.xml (original)
+++ incubator/tuscany/java/spec/sdo/pom.xml Tue Feb  7 14:37:37 2006
@@ -26,4 +26,12 @@
     <name>SDO API</name>
     <version>SNAPSHOT</version>
 
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>3.8.1</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
 </project>

Modified: incubator/tuscany/java/spec/sdo/src/main/java/commonj/sdo/impl/HelperProvider.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/spec/sdo/src/main/java/commonj/sdo/impl/HelperProvider.java?rev=375756&r1=375755&r2=375756&view=diff
==============================================================================
--- incubator/tuscany/java/spec/sdo/src/main/java/commonj/sdo/impl/HelperProvider.java (original)
+++ incubator/tuscany/java/spec/sdo/src/main/java/commonj/sdo/impl/HelperProvider.java Tue Feb  7 14:37:37 2006
@@ -1,18 +1,29 @@
 /**
- * <copyright>
  *
- * Service Data Objects
- * Version 2.0
- * Licensed Materials - Property of BEA and IBM
+ * Copyright 2006 The Apache Software Foundation
  *
- * (c) Copyright BEA Systems, Inc. and International Business Machines Corp 2005.  All rights reserved.
+ *  Licensed 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
  *
- * </copyright>
- * 
+ *     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.
  */
 
 package commonj.sdo.impl;
 
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
 
 import commonj.sdo.helper.CopyHelper;
 import commonj.sdo.helper.DataFactory;
@@ -21,122 +32,325 @@
 import commonj.sdo.helper.TypeHelper;
 import commonj.sdo.helper.XMLHelper;
 import commonj.sdo.helper.XSDHelper;
-import commonj.sdo.impl.ExternalizableDelegator.Resolvable;
 
 /**
- * This class instantiates a HelperProviderImpl that returns concrete helpers.
- * This class may be replaced by another implementation.
+ * A HelperProvider obtains specific default helpers and other
+ * implementation-specific objects used by a Java implementation of SDO.
+ *
+ * @version $Rev$ $Date$
  */
-public abstract class HelperProvider
-{
-  static HelperProvider INSTANCE = getHelperProviderImpl();
-  
-  static HelperProvider getHelperProviderImpl() 
-  {
-    try
-    {
-      return (HelperProvider)Class.forName("commonj.sdo.impl.HelperProviderImpl").newInstance();
-    } catch (Exception e)
-    {
-      throw new RuntimeException(e);
-    }
-  } // end method getHelperProvider()
-  
-  HelperProvider()
-  {
-  }
-  
-  /**
-   * Gets a CopyHelper
-   * @return a CopyHelper object
-   */
-  public static CopyHelper getCopyHelper()
-  {
-    return INSTANCE.copyHelper();
-  }
-
-  /**
-   * Gets a DataFactory
-   * @return a DataFactory object
-   */
-  public static DataFactory getDataFactory()
-  {
-    return INSTANCE.dataFactory();
-  }
-
-  /**
-   * Gets a DataHelper
-   * @return a DataHelper object
-   */
-  public static DataHelper getDataHelper()
-  {
-    return INSTANCE.dataHelper();
-  }
-
-  /**
-   * Gets an EqualityHelper
-   * @return an EqualityHelper object
-   */
-  public static EqualityHelper getEqualityHelper()
-  {
-    return INSTANCE.equalityHelper();
-  }
-  
-  /**
-   * Gets a TypeHelper 
-   * @return a TypeHelper object
-   */
-  public static TypeHelper getTypeHelper()
-  {
-    return INSTANCE.typeHelper();
-  }
-
-  /**
-   * Gets an XMLHelper
-   * @return an XMLHelper object
-   */
-  public static XMLHelper getXMLHelper()
-  {
-    return INSTANCE.xmlHelper();
-  }
-  
-  /**
-   * Gets an XSDHelper 
-   * @return an XSDHelper object
-   */
-  public static XSDHelper getXSDHelper()
-  {
-    return INSTANCE.xsdHelper();
-  }
-
-  /**
-   * Gets a Resolvable 
-   * @return a Resolvable object
-   * @see ExternalizableDelegator
-   */
-  public static Resolvable createResolvable()
-  {
-    return INSTANCE.resolvable();
-  }
-  
-  /**
-   * Gets a Resolvable 
-   * @param target the target object for the Resolvable
-   * @return a Resolvable object
-   * @see ExternalizableDelegator
-   */
-  public static Resolvable createResolvable(Object target)
-  {
-    return INSTANCE.resolvable(target);
-  }
-
-  abstract CopyHelper copyHelper();
-  abstract DataFactory dataFactory();
-  abstract DataHelper dataHelper();
-  abstract EqualityHelper equalityHelper();
-  abstract TypeHelper typeHelper();
-  abstract XMLHelper xmlHelper();
-  abstract XSDHelper xsdHelper();
-  abstract Resolvable resolvable();
-  abstract Resolvable resolvable(Object target);
-}
+public abstract class HelperProvider {
+    /**
+     * The default HelperProvider INSTANCE. This is located using the ClassLoader used
+     * to load the HelperProvider class itself and if no default implementation is available
+     * this field will be set to null.
+     */
+    public static final HelperProvider INSTANCE;
+
+    /**
+     * The name of the resource that is used for service location.
+     */
+    public static final String SERVICE_RESOURCE_NAME = "META-INF/services/commonj.sdo.impl.HelperProvider";
+
+    /**
+     * The name of the system property that will be checked for an implementation name.
+     */
+    public static final String PROPERTY_NAME = "commonj.sdo.impl.HelperProvider";
+
+    static {
+        // initialize the default instance using this class's classloader
+        // set to null if none could be located (implies no default implementation)
+        HelperProvider provider;
+        try {
+            provider = getInstance(HelperProvider.class.getClassLoader());
+        } catch (NoHelperProviderException e) {
+            provider = null;
+        }
+        INSTANCE = provider;
+    }
+
+    /**
+     * Locate and instantiate a HelperProvider.
+     * <p/>
+     * Attempt to locate a HelperProvider using first the Thread's current context classloader and then,
+     * if that is not set, not readable, or does not provide an implementation, using the classloader
+     * used to load the HelperProvider class itself.
+     *
+     * @return an implementation of HelperProvider
+     * @throws NoHelperProviderException if no provider implmentation was defined or it could not be instantiated
+     */
+    public static HelperProvider getInstance() throws NoHelperProviderException {
+        String implName = getImplementationName();
+
+        ClassLoader cl = getContextClassLoader();
+        if (cl != null) {
+            HelperProvider provider = loadImplementation(cl, implName);
+            if (provider != null) {
+                return provider;
+            }
+        }
+
+        cl = HelperProvider.class.getClassLoader();
+        HelperProvider provider = loadImplementation(cl, implName);
+        if (provider != null) {
+            return provider;
+        }
+
+        throw new NoHelperProviderException(implName);
+    }
+
+
+    /**
+     * Locate and instantiate a HelperProvider using the supplied ClassLoader.
+     * <p/>
+     * The name of the implementation to use is determined by the value of the "commonj.sdo.impl.HelperProvider"
+     * system property. If this is not set or this code does not have permission to read it then the name
+     * will be retrieved from the META-INF/services/commonj.sdo.impl.HelperProvider resource as returned
+     * by the supplied classloader as described
+     *
+     * @param cl the classloader to use to locate and instantiate the implementation
+     * @return the specified implementation of HelperProvider
+     * @throws NoHelperProviderException if no provider implmentation was defined or it could not be instantiated
+     */
+    public static HelperProvider getInstance(ClassLoader cl) throws NoHelperProviderException {
+        String implName = getImplementationName();
+        HelperProvider provider = loadImplementation(cl, implName);
+        if (provider == null) {
+            throw new NoHelperProviderException(implName);
+        }
+        return provider;
+    }
+
+    private static ClassLoader getContextClassLoader() {
+        try {
+            return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
+                public ClassLoader run() {
+                    return Thread.currentThread().getContextClassLoader();
+                }
+            });
+        } catch (SecurityException e) {
+            return null;
+        }
+    }
+
+    private static HelperProvider loadImplementation(ClassLoader cl, String implName) throws NoHelperProviderException {
+        // if no name is requested, locate using the supplied classloader
+        if (implName == null) {
+            implName = getImplementationName(cl);
+        }
+        // no implementation to try, return null
+        if (implName == null) {
+            return null;
+        }
+
+        // try an instantiate the implementation
+        try {
+            return (HelperProvider) cl.loadClass(implName).newInstance();
+        } catch (InstantiationException e) {
+            throw new NoHelperProviderException(implName, e);
+        } catch (IllegalAccessException e) {
+            throw new NoHelperProviderException(implName, e);
+        } catch (ClassNotFoundException e) {
+            throw new NoHelperProviderException(implName, e);
+        }
+    }
+
+    private static String getImplementationName() {
+        try {
+            return AccessController.doPrivileged(new PrivilegedAction<String>() {
+                @SuppressWarnings({"AccessOfSystemProperties"})
+                public String run() {
+                    return System.getProperty(PROPERTY_NAME);
+                }
+            });
+        } catch (SecurityException e) {
+            return null;
+        }
+    }
+
+    private static String getImplementationName(ClassLoader cl) {
+        InputStream is = cl.getResourceAsStream(SERVICE_RESOURCE_NAME);
+        if (is == null) {
+            return null;
+        }
+
+        InputStreamReader in;
+        try {
+            in = new InputStreamReader(is, "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            throw new AssertionError("UTF-8 encoding not available");
+        }
+
+        try {
+            BufferedReader reader = new BufferedReader(in, 128);
+            try {
+                String line;
+                while ((line = reader.readLine()) != null) {
+                    int i = line.indexOf('#');
+                    if (i != -1) {
+                        line = line.substring(0, i);
+                    }
+                    line = line.trim();
+                    if (line.length() > 0) {
+                        return line;
+                    }
+                }
+                return null;
+            } finally {
+                reader.close();
+            }
+        } catch (IOException e) {
+            throw new NoHelperProviderException(e);
+        }
+    }
+
+    // implementation specific methods for users that don't want to use the default implementation
+
+    /**
+     * Returns a CopyHelper obtained from this implementation.
+     *
+     * @return a CopyHelper obtained from this implementation
+     */
+    public abstract CopyHelper copyHelper();
+
+    /**
+     * Returns a DataFactory obtained from this implementation.
+     *
+     * @return a DataFactory obtained from this implementation
+     */
+    public abstract DataFactory dataFactory();
+
+    /**
+     * Returns a DataHelper obtained from this implementation.
+     *
+     * @return a DataHelper obtained from this implementation
+     */
+    public abstract DataHelper dataHelper();
+
+    /**
+     * Returns a EqualityHelper obtained from this implementation.
+     *
+     * @return a EqualityHelper obtained from this implementation
+     */
+    public abstract EqualityHelper equalityHelper();
+
+    /**
+     * Returns a TypeHelper obtained from this implementation.
+     *
+     * @return a TypeHelper obtained from this implementation
+     */
+    public abstract TypeHelper typeHelper();
+
+    /**
+     * Returns a XMLHelper obtained from this implementation.
+     *
+     * @return a XMLHelper obtained from this implementation
+     */
+    public abstract XMLHelper xmlHelper();
+
+    /**
+     * Returns a XSDHelper obtained from this implementation.
+     *
+     * @return a XSDHelper obtained from this implementation
+     */
+    public abstract XSDHelper xsdHelper();
+
+    /**
+     * Create a Resolvable using this implementation
+     *
+     * @return a Resolvable created using this implementation
+     */
+    public abstract ExternalizableDelegator.Resolvable resolvable();
+
+    /**
+     * Create a Resolvable using this implementation
+     *
+     * @param target the object to be resolved
+     * @return a Resolvable created using this implementation
+     */
+    public abstract ExternalizableDelegator.Resolvable resolvable(Object target);
+
+    // static helper methods required by the specification
+
+    /**
+     * Returns a CopyHelper obtained from the default HelperProvider.
+     *
+     * @return a CopyHelper obtained from the default HelperProvider
+     */
+    public static CopyHelper getCopyHelper() {
+        return INSTANCE.copyHelper();
+    }
+
+    /**
+     * Returns a DataFactory obtained from the default HelperProvider.
+     *
+     * @return a DataFactory obtained from the default HelperProvider
+     */
+    public static DataFactory getDataFactory() {
+        return INSTANCE.dataFactory();
+    }
+
+    /**
+     * Returns a DataHelper obtained from the default HelperProvider.
+     *
+     * @return a DataHelper obtained from the default HelperProvider
+     */
+    public static DataHelper getDataHelper() {
+        return INSTANCE.dataHelper();
+    }
+
+    /**
+     * Returns a EqualityHelper obtained from the default HelperProvider.
+     *
+     * @return a EqualityHelper obtained from the default HelperProvider
+     */
+    public static EqualityHelper getEqualityHelper() {
+        return INSTANCE.equalityHelper();
+    }
+
+    /**
+     * Returns a TypeHelper obtained from the default HelperProvider.
+     *
+     * @return a TypeHelper obtained from the default HelperProvider
+     */
+    public static TypeHelper getTypeHelper() {
+        return INSTANCE.typeHelper();
+    }
+
+    /**
+     * Returns a XMLHelper obtained from the default HelperProvider.
+     *
+     * @return a XMLHelper obtained from the default HelperProvider
+     */
+    public static XMLHelper getXMLHelper() {
+        return INSTANCE.xmlHelper();
+    }
+
+    /**
+     * Returns a XSDHelper obtained from the default HelperProvider.
+     *
+     * @return a XSDHelper obtained from the default HelperProvider
+     */
+    public static XSDHelper getXSDHelper() {
+        return INSTANCE.xsdHelper();
+    }
+
+    /**
+     * Create a Resolvable using the default HelperProvider
+     *
+     * @return a Resolvable created using the default HelperProvider
+     */
+    public static ExternalizableDelegator.Resolvable createResolvable() {
+        return INSTANCE.resolvable();
+    }
+
+    /**
+     * Create a Resolvable using the default HelperProvider
+     *
+     * @param target the object to be resolved
+     * @return a Resolvable created using the default HelperProvider
+     */
+    public static ExternalizableDelegator.Resolvable createResolvable(Object target) {
+        return INSTANCE.resolvable(target);
+    }
+}
\ No newline at end of file

Added: incubator/tuscany/java/spec/sdo/src/main/java/commonj/sdo/impl/NoHelperProviderException.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/spec/sdo/src/main/java/commonj/sdo/impl/NoHelperProviderException.java?rev=375756&view=auto
==============================================================================
--- incubator/tuscany/java/spec/sdo/src/main/java/commonj/sdo/impl/NoHelperProviderException.java (added)
+++ incubator/tuscany/java/spec/sdo/src/main/java/commonj/sdo/impl/NoHelperProviderException.java Tue Feb  7 14:37:37 2006
@@ -0,0 +1,54 @@
+/**
+ *
+ * Copyright 2005 International Business Machines Corporation
+ *
+ *  Licensed 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.
+ */
+package commonj.sdo.impl;
+
+/**
+ * Exception indicating that a HelperProvider could not be located or instantiated.
+ * The message will be set to the name of the implementation class; a null value
+ * indicates that the name of the implementation could not be determined.
+ * The cause will be set to the Throwable that prevented the provider from being
+ * located or created.
+ *
+ * @version $Revision$ $Date$
+ */
+public class NoHelperProviderException extends RuntimeException {
+    private static final long serialVersionUID = 727646133930924084L;
+
+    public NoHelperProviderException() {
+    }
+
+    public NoHelperProviderException(String message) {
+        super(message);
+    }
+
+    public NoHelperProviderException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public NoHelperProviderException(Throwable cause) {
+        super(cause);
+    }
+
+    /**
+     * Return the name of the implementation class that could not be provided.
+     *
+     * @return the name of the implementation class; may be null if not known
+     */
+    public String getImplementationName() {
+        return getMessage();
+    }
+}

Propchange: incubator/tuscany/java/spec/sdo/src/main/java/commonj/sdo/impl/NoHelperProviderException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/spec/sdo/src/main/java/commonj/sdo/impl/NoHelperProviderException.java
------------------------------------------------------------------------------
    svn:keywords = Rev,Date

Added: incubator/tuscany/java/spec/sdo/src/test/java/commonj/sdo/impl/HelperProviderTestCase.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/spec/sdo/src/test/java/commonj/sdo/impl/HelperProviderTestCase.java?rev=375756&view=auto
==============================================================================
--- incubator/tuscany/java/spec/sdo/src/test/java/commonj/sdo/impl/HelperProviderTestCase.java (added)
+++ incubator/tuscany/java/spec/sdo/src/test/java/commonj/sdo/impl/HelperProviderTestCase.java Tue Feb  7 14:37:37 2006
@@ -0,0 +1,87 @@
+/**
+ *
+ * Copyright 2005 International Business Machines Corporation
+ *
+ *  Licensed 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.
+ */
+package commonj.sdo.impl;
+
+import java.net.URL;
+import java.net.URLClassLoader;
+
+import junit.framework.TestCase;
+import test.DefaultHelperProvider;
+import test.TCCL1HelperProvider;
+
+/**
+ * @version $Revision$ $Date$
+ */
+@SuppressWarnings({"ClassLoader2Instantiation"})
+public class HelperProviderTestCase extends TestCase {
+    private URL classes;
+    private URL testClasses;
+    private URL tccl1;
+
+    public void testInstanceIsNullWithNoImplementation() throws Exception {
+        ClassLoader cl = new URLClassLoader(new URL[]{classes}, null);
+        Class<?> providerClass = cl.loadClass("commonj.sdo.impl.HelperProvider");
+        assertNull(providerClass.getField("INSTANCE").get(null));
+    }
+
+    public void testDefaultInstance() {
+        assertNotNull(HelperProvider.INSTANCE);
+        assertEquals(DefaultHelperProvider.class, HelperProvider.INSTANCE.getClass());
+    }
+
+    public void testLocateFromClassLoader() throws Exception {
+        ClassLoader cl = new URLClassLoader(new URL[]{classes, tccl1, testClasses}, null);
+        Class<?> providerClass = cl.loadClass(HelperProvider.class.getName());
+        Object provider = providerClass.getMethod("getInstance", ClassLoader.class).invoke(null, cl);
+        assertNotNull(provider);
+        assertEquals(TCCL1HelperProvider.class.getName(), provider.getClass().getName());
+    }
+
+    public void testThreadContextInstance() throws Exception {
+        ClassLoader cl = new URLClassLoader(new URL[]{classes, tccl1, testClasses}, null);
+        ClassLoader tccl = Thread.currentThread().getContextClassLoader();
+        try {
+            Thread.currentThread().setContextClassLoader(cl);
+            Class<?> providerClass = cl.loadClass(HelperProvider.class.getName());
+            Object provider = providerClass.getMethod("getInstance").invoke(null);
+            assertNotNull(provider);
+            assertEquals(TCCL1HelperProvider.class.getName(), provider.getClass().getName());
+        } finally {
+            Thread.currentThread().setContextClassLoader(tccl);
+        }
+
+    }
+
+    @SuppressWarnings({"AccessOfSystemProperties"})
+    public void testSystemProperty() {
+        System.setProperty("commonj.sdo.impl.HelperProvider", "test.TCCL1HelperProvider");
+        try {
+            HelperProvider provider = HelperProvider.getInstance();
+            assertNotNull(provider);
+            assertEquals(TCCL1HelperProvider.class, provider.getClass());
+        } finally {
+            System.getProperties().remove("commonj.sdo.impl.HelperProvider");
+        }
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        classes = new URL(HelperProvider.class.getResource("HelperProvider.class"), "../../..");
+        testClasses = new URL(HelperProviderTestCase.class.getResource("HelperProviderTestCase.class"), "../../..");
+        tccl1 = new URL(testClasses, "tccl1/");
+    }
+}

Propchange: incubator/tuscany/java/spec/sdo/src/test/java/commonj/sdo/impl/HelperProviderTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/spec/sdo/src/test/java/commonj/sdo/impl/HelperProviderTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev,Date

Added: incubator/tuscany/java/spec/sdo/src/test/java/test/DefaultHelperProvider.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/spec/sdo/src/test/java/test/DefaultHelperProvider.java?rev=375756&view=auto
==============================================================================
--- incubator/tuscany/java/spec/sdo/src/test/java/test/DefaultHelperProvider.java (added)
+++ incubator/tuscany/java/spec/sdo/src/test/java/test/DefaultHelperProvider.java Tue Feb  7 14:37:37 2006
@@ -0,0 +1,58 @@
+/* =====================================================================
+ *
+ * Copyright (c) 2005 Jeremy Boynes.  All rights reserved.
+ *
+ * =====================================================================
+ */
+package test;
+
+import commonj.sdo.impl.HelperProvider;
+import commonj.sdo.impl.ExternalizableDelegator;
+import commonj.sdo.helper.CopyHelper;
+import commonj.sdo.helper.DataFactory;
+import commonj.sdo.helper.DataHelper;
+import commonj.sdo.helper.EqualityHelper;
+import commonj.sdo.helper.TypeHelper;
+import commonj.sdo.helper.XMLHelper;
+import commonj.sdo.helper.XSDHelper;
+
+/**
+ * @version $Revision$ $Date$
+ */
+public class DefaultHelperProvider extends HelperProvider {
+    public CopyHelper copyHelper() {
+        throw new UnsupportedOperationException();
+    }
+
+    public DataFactory dataFactory() {
+        throw new UnsupportedOperationException();
+    }
+
+    public DataHelper dataHelper() {
+        throw new UnsupportedOperationException();
+    }
+
+    public EqualityHelper equalityHelper() {
+        throw new UnsupportedOperationException();
+    }
+
+    public TypeHelper typeHelper() {
+        throw new UnsupportedOperationException();
+    }
+
+    public XMLHelper xmlHelper() {
+        throw new UnsupportedOperationException();
+    }
+
+    public XSDHelper xsdHelper() {
+        throw new UnsupportedOperationException();
+    }
+
+    public ExternalizableDelegator.Resolvable resolvable() {
+        throw new UnsupportedOperationException();
+    }
+
+    public ExternalizableDelegator.Resolvable resolvable(Object target) {
+        throw new UnsupportedOperationException();
+    }
+}

Propchange: incubator/tuscany/java/spec/sdo/src/test/java/test/DefaultHelperProvider.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/spec/sdo/src/test/java/test/DefaultHelperProvider.java
------------------------------------------------------------------------------
    svn:keywords = Rev,Date

Added: incubator/tuscany/java/spec/sdo/src/test/java/test/TCCL1HelperProvider.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/spec/sdo/src/test/java/test/TCCL1HelperProvider.java?rev=375756&view=auto
==============================================================================
--- incubator/tuscany/java/spec/sdo/src/test/java/test/TCCL1HelperProvider.java (added)
+++ incubator/tuscany/java/spec/sdo/src/test/java/test/TCCL1HelperProvider.java Tue Feb  7 14:37:37 2006
@@ -0,0 +1,58 @@
+/* =====================================================================
+ *
+ * Copyright (c) 2005 Jeremy Boynes.  All rights reserved.
+ *
+ * =====================================================================
+ */
+package test;
+
+import commonj.sdo.impl.HelperProvider;
+import commonj.sdo.impl.ExternalizableDelegator;
+import commonj.sdo.helper.CopyHelper;
+import commonj.sdo.helper.DataFactory;
+import commonj.sdo.helper.DataHelper;
+import commonj.sdo.helper.EqualityHelper;
+import commonj.sdo.helper.TypeHelper;
+import commonj.sdo.helper.XMLHelper;
+import commonj.sdo.helper.XSDHelper;
+
+/**
+ * @version $Revision$ $Date$
+ */
+public class TCCL1HelperProvider extends HelperProvider {
+    public CopyHelper copyHelper() {
+        throw new UnsupportedOperationException();
+    }
+
+    public DataFactory dataFactory() {
+        throw new UnsupportedOperationException();
+    }
+
+    public DataHelper dataHelper() {
+        throw new UnsupportedOperationException();
+    }
+
+    public EqualityHelper equalityHelper() {
+        throw new UnsupportedOperationException();
+    }
+
+    public TypeHelper typeHelper() {
+        throw new UnsupportedOperationException();
+    }
+
+    public XMLHelper xmlHelper() {
+        throw new UnsupportedOperationException();
+    }
+
+    public XSDHelper xsdHelper() {
+        throw new UnsupportedOperationException();
+    }
+
+    public ExternalizableDelegator.Resolvable resolvable() {
+        throw new UnsupportedOperationException();
+    }
+
+    public ExternalizableDelegator.Resolvable resolvable(Object target) {
+        throw new UnsupportedOperationException();
+    }
+}

Propchange: incubator/tuscany/java/spec/sdo/src/test/java/test/TCCL1HelperProvider.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/spec/sdo/src/test/java/test/TCCL1HelperProvider.java
------------------------------------------------------------------------------
    svn:keywords = Rev,Date

Added: incubator/tuscany/java/spec/sdo/src/test/resources/META-INF/services/commonj.sdo.impl.HelperProvider
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/spec/sdo/src/test/resources/META-INF/services/commonj.sdo.impl.HelperProvider?rev=375756&view=auto
==============================================================================
--- incubator/tuscany/java/spec/sdo/src/test/resources/META-INF/services/commonj.sdo.impl.HelperProvider (added)
+++ incubator/tuscany/java/spec/sdo/src/test/resources/META-INF/services/commonj.sdo.impl.HelperProvider Tue Feb  7 14:37:37 2006
@@ -0,0 +1,3 @@
+# test comment and blank line
+
+  test.DefaultHelperProvider # comment

Added: incubator/tuscany/java/spec/sdo/src/test/resources/tccl1/META-INF/services/commonj.sdo.impl.HelperProvider
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/spec/sdo/src/test/resources/tccl1/META-INF/services/commonj.sdo.impl.HelperProvider?rev=375756&view=auto
==============================================================================
--- incubator/tuscany/java/spec/sdo/src/test/resources/tccl1/META-INF/services/commonj.sdo.impl.HelperProvider (added)
+++ incubator/tuscany/java/spec/sdo/src/test/resources/tccl1/META-INF/services/commonj.sdo.impl.HelperProvider Tue Feb  7 14:37:37 2006
@@ -0,0 +1 @@
+test.TCCL1HelperProvider
\ No newline at end of file