You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by al...@apache.org on 2007/03/21 16:13:03 UTC

svn commit: r520910 - in /incubator/uima/uimaj/trunk/uimaj-core/src: main/java/org/apache/uima/ main/java/org/apache/uima/impl/ main/java/org/apache/uima/resource/ main/java/org/apache/uima/resource/impl/ main/java/org/apache/uima/util/ main/java/org/a...

Author: alally
Date: Wed Mar 21 08:13:00 2007
New Revision: 520910

URL: http://svn.apache.org/viewvc?view=rev&rev=520910
Log:
Added support for CustomResourceSpecifier.
UIMA-352: https://issues.apache.org/jira/browse/UIMA-352

Added:
    incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/CustomResourceFactory_impl.java
    incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/CustomResourceSpecifier.java
    incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/impl/CustomResourceSpecifier_impl.java
    incubator/uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/impl/CustomResourceSpecifierFactory_implTest.java
    incubator/uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/impl/SomeCustomResource.java
    incubator/uima/uimaj/trunk/uimaj-core/src/test/resources/XmlParserTest/TestCustomResourceSpecifier.xml
Modified:
    incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/ResourceSpecifierFactory.java
    incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/ResourceSpecifierFactory_impl.java
    incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/util/XMLParser.java
    incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/util/impl/XMLParser_impl.java
    incubator/uima/uimaj/trunk/uimaj-core/src/main/resources/org/apache/uima/impl/factoryConfig.xml
    incubator/uima/uimaj/trunk/uimaj-core/src/main/resources/resourceSpecifierSchema.xsd
    incubator/uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/util/impl/XMLParser_implTest.java

Modified: incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/ResourceSpecifierFactory.java
URL: http://svn.apache.org/viewvc/incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/ResourceSpecifierFactory.java?view=diff&rev=520910&r1=520909&r2=520910
==============================================================================
--- incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/ResourceSpecifierFactory.java (original)
+++ incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/ResourceSpecifierFactory.java Wed Mar 21 08:13:00 2007
@@ -47,6 +47,7 @@
 import org.apache.uima.collection.metadata.CpeInclude;
 import org.apache.uima.collection.metadata.OutputQueue;
 import org.apache.uima.flow.FlowControllerDescription;
+import org.apache.uima.resource.CustomResourceSpecifier;
 import org.apache.uima.resource.ExternalResourceDependency;
 import org.apache.uima.resource.ExternalResourceDescription;
 import org.apache.uima.resource.FileLanguageResourceSpecifier;
@@ -419,6 +420,13 @@
    */
   public FlowControllerDeclaration createFlowControllerDeclaration();
 
+  /**
+   * Creates a <code>CustomResourceSpecifier</code>.
+   * 
+   * @return an instance of an object implementing <code>CustomResourceSpecifier</code>.
+   */
+  public CustomResourceSpecifier createCustomResourceSpecifier();
+  
   /**
    * Creates a <code>FlowControllerDescription</code>
    * 

Added: incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/CustomResourceFactory_impl.java
URL: http://svn.apache.org/viewvc/incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/CustomResourceFactory_impl.java?view=auto&rev=520910
==============================================================================
--- incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/CustomResourceFactory_impl.java (added)
+++ incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/CustomResourceFactory_impl.java Wed Mar 21 08:13:00 2007
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.uima.impl;
+
+import java.util.Map;
+
+import org.apache.uima.ResourceFactory;
+import org.apache.uima.resource.CustomResourceSpecifier;
+import org.apache.uima.resource.Resource;
+import org.apache.uima.resource.ResourceInitializationException;
+import org.apache.uima.resource.ResourceManager;
+import org.apache.uima.resource.ResourceSpecifier;
+
+/**
+ * Resource Factory that handles {@link CustomResourceSpecifier} elements.
+ */
+public class CustomResourceFactory_impl implements ResourceFactory {
+  /**
+   * @see org.apache.uima.ResourceFactory#produceResource(java.lang.Class,
+   *      org.apache.uima.resource.ResourceSpecifier, java.util.Map)
+   */
+  public Resource produceResource(Class aResourceClass, ResourceSpecifier aSpecifier,
+          Map aAdditionalParams) throws ResourceInitializationException {
+    
+    if (aSpecifier instanceof CustomResourceSpecifier) {
+      String className = ((CustomResourceSpecifier)aSpecifier).getResourceClassName();
+      //check additional params map for ResourceManager, and use the UIMA extension ClassLoader
+      //if one exists
+      ClassLoader loader = null;
+      ResourceManager resMgr = (ResourceManager)aAdditionalParams.get(Resource.PARAM_RESOURCE_MANAGER);
+      if (resMgr != null) {
+        resMgr.getExtensionClassLoader();
+      }
+      if (loader == null) {
+        loader = this.getClass().getClassLoader();
+      }
+      
+      //load the Resourceclass
+      Class resourceClass;
+      try {
+        resourceClass = Class.forName(className, true, loader);
+      } catch (ClassNotFoundException e) {
+        throw new ResourceInitializationException(
+                ResourceInitializationException.CLASS_NOT_FOUND, new Object[] { className,
+                    aSpecifier.getSourceUrlString() }, e);
+      }
+      
+      //check that the class implements the required interface
+      if (!aResourceClass.isAssignableFrom(resourceClass)) {
+        throw new ResourceInitializationException(
+                ResourceInitializationException.RESOURCE_DOES_NOT_IMPLEMENT_INTERFACE,
+                new Object[] { className, aResourceClass.getName(),
+                    aSpecifier.getSourceUrlString() });
+      }
+      
+      // instantiate this Resource Class
+      Resource resource;
+      try {
+        resource = (Resource) resourceClass.newInstance();
+      } catch (InstantiationException e) {
+        throw new ResourceInitializationException(
+                ResourceInitializationException.COULD_NOT_INSTANTIATE, new Object[] { className,
+                    aSpecifier.getSourceUrlString() }, e);
+      } catch (IllegalAccessException e) {
+        throw new ResourceInitializationException(
+                ResourceInitializationException.COULD_NOT_INSTANTIATE, new Object[] { className,
+                    aSpecifier.getSourceUrlString() }, e);
+      }
+      // attempt to initialize it
+      if (resource.initialize(aSpecifier, aAdditionalParams)) {
+        // success!
+        return resource;
+      } else
+      // failure, for some unknown reason :( 
+      {
+        throw new ResourceInitializationException(
+                ResourceInitializationException.ERROR_INITIALIZING_FROM_DESCRIPTOR, new Object[] {
+                    className, aSpecifier.getSourceUrlString() });
+      }     
+    }  
+    //unsupported ResourceSpecifier type
+    return null;
+  }
+}

Modified: incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/ResourceSpecifierFactory_impl.java
URL: http://svn.apache.org/viewvc/incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/ResourceSpecifierFactory_impl.java?view=diff&rev=520910&r1=520909&r2=520910
==============================================================================
--- incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/ResourceSpecifierFactory_impl.java (original)
+++ incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/ResourceSpecifierFactory_impl.java Wed Mar 21 08:13:00 2007
@@ -56,6 +56,7 @@
 import org.apache.uima.collection.metadata.CpeSofaMappings;
 import org.apache.uima.collection.metadata.OutputQueue;
 import org.apache.uima.flow.FlowControllerDescription;
+import org.apache.uima.resource.CustomResourceSpecifier;
 import org.apache.uima.resource.ExternalResourceDependency;
 import org.apache.uima.resource.ExternalResourceDescription;
 import org.apache.uima.resource.FileLanguageResourceSpecifier;
@@ -436,10 +437,14 @@
   public FlowControllerDeclaration createFlowControllerDeclaration() {
     return (FlowControllerDeclaration) createObject(FlowControllerDeclaration.class);
   }
-
+  
   public FlowControllerDescription createFlowControllerDescription() {
     return (FlowControllerDescription) createObject(FlowControllerDescription.class);
   }
+  
+  public CustomResourceSpecifier createCustomResourceSpecifier() {
+    return (CustomResourceSpecifier) createObject(CustomResourceSpecifier.class);
+  }  
 
   public CpeCollectionReaderCasInitializer createCasInitializer() {
     return (CpeCollectionReaderCasInitializer) createObject(CpeCollectionReaderCasInitializer.class);

Added: incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/CustomResourceSpecifier.java
URL: http://svn.apache.org/viewvc/incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/CustomResourceSpecifier.java?view=auto&rev=520910
==============================================================================
--- incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/CustomResourceSpecifier.java (added)
+++ incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/CustomResourceSpecifier.java Wed Mar 21 08:13:00 2007
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.uima.resource;
+
+
+/**
+ * A type of <code>ResourceSpecifier</code> that specifically names the
+ * Java class that should be created.  This allows users to plug in their own
+ * custom resource implementations.
+ */
+public interface CustomResourceSpecifier extends ResourceSpecifier {
+
+  /**
+   * Retrieves the name of the Java class that will be instantiated when
+   * one of the <code>UIMAFramework.produceXXX(ResourceSpecifier,...)</code> methods is called
+   * with this resource specifier.
+   * 
+   * @return a fully-qualified Java class name.  The named class should implement {@link Resource}.
+   */
+  public String getResourceClassName();
+
+  /**
+   * Setss the name of the Java class that will be instantiated when
+   * one of the <code>UIMAFramework.produceXXX(ResourceSpecifier,...)</code> methods is called
+   * with this resource specifier.
+   * 
+   * @param aResourceClassName a fully-qualified Java class name.  The named class should implement {@link Resource}.
+   */
+  public void setResourceClassName(String aResourceClassName);
+
+
+  /**
+   * Gets parameters that may be read by the custom resource class when it is initialized.
+   * 
+   * @return an array of parameters.  This will never return <code>null</code>.
+   */
+  public Parameter[] getParameters();
+
+  /**
+   * Sets parameters that may be read by the custom resource class when it is initialized.
+   * 
+   * @param parameters the Parameters to set.
+   */
+  public void setParameters(Parameter[] parameters);
+
+}

Added: incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/impl/CustomResourceSpecifier_impl.java
URL: http://svn.apache.org/viewvc/incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/impl/CustomResourceSpecifier_impl.java?view=auto&rev=520910
==============================================================================
--- incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/impl/CustomResourceSpecifier_impl.java (added)
+++ incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/impl/CustomResourceSpecifier_impl.java Wed Mar 21 08:13:00 2007
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.uima.resource.impl;
+
+import org.apache.uima.resource.CustomResourceSpecifier;
+import org.apache.uima.resource.Parameter;
+import org.apache.uima.resource.metadata.impl.MetaDataObject_impl;
+import org.apache.uima.resource.metadata.impl.PropertyXmlInfo;
+import org.apache.uima.resource.metadata.impl.XmlizationInfo;
+
+/**
+ * Implementation of {@link CustomResourceSpecifier}.
+ */
+public class CustomResourceSpecifier_impl extends MetaDataObject_impl implements
+        CustomResourceSpecifier {
+  private static final long serialVersionUID = 8922306013278525153L;
+  
+  private Parameter[] mParameters = new Parameter[0];
+  private String mResourceClassName;
+  
+  /* (non-Javadoc)
+   * @see org.apache.uima.resource.CustomResourceSpecifier#getParameters()
+   */
+  public Parameter[] getParameters() {
+    return mParameters;
+  }
+
+  /* (non-Javadoc)
+   * @see org.apache.uima.resource.CustomResourceSpecifier#getResourceClassName()
+   */
+  public String getResourceClassName() {
+    return mResourceClassName;
+  }
+
+  /* (non-Javadoc)
+   * @see org.apache.uima.resource.CustomResourceSpecifier#setParameters(org.apache.uima.resource.Parameter[])
+   */
+  public void setParameters(Parameter[] aParameters) {
+    if (aParameters != null) {
+      mParameters = aParameters;
+    } else {
+      mParameters = new Parameter[0];
+    }
+    
+  }
+
+  /* (non-Javadoc)
+   * @see org.apache.uima.resource.CustomResourceSpecifier#setResourceClassName(java.lang.String)
+   */
+  public void setResourceClassName(String aResourceClassName) {
+    mResourceClassName = aResourceClassName;
+  }
+
+  /* (non-Javadoc)
+   * @see org.apache.uima.resource.metadata.impl.MetaDataObject_impl#getXmlizationInfo()
+   */
+  protected XmlizationInfo getXmlizationInfo() {
+    return XMLIZATION_INFO;
+  }
+
+  static final private XmlizationInfo XMLIZATION_INFO = new XmlizationInfo("customResourceSpecifier",
+          new PropertyXmlInfo[] { new PropertyXmlInfo("resourceClassName"),
+              new PropertyXmlInfo("parameters")});
+}

Modified: incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/util/XMLParser.java
URL: http://svn.apache.org/viewvc/incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/util/XMLParser.java?view=diff&rev=520910&r1=520909&r2=520910
==============================================================================
--- incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/util/XMLParser.java (original)
+++ incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/util/XMLParser.java Wed Mar 21 08:13:00 2007
@@ -29,6 +29,7 @@
 import org.apache.uima.collection.CollectionReaderDescription;
 import org.apache.uima.collection.metadata.CpeDescription;
 import org.apache.uima.flow.FlowControllerDescription;
+import org.apache.uima.resource.CustomResourceSpecifier;
 import org.apache.uima.resource.ResourceSpecifier;
 import org.apache.uima.resource.URISpecifier;
 import org.apache.uima.resource.metadata.FsIndexCollection;
@@ -590,6 +591,36 @@
    *           if the input XML is not valid or does not specify a valid FlowControllerDescription
    */
   public FlowControllerDescription parseFlowControllerDescription(XMLInputSource aInput,
+          ParsingOptions aOptions) throws InvalidXMLException;
+
+  /**
+   * Parses a CustomResourceSpecifier from an XML input stream.
+   * 
+   * @param aInput
+   *          the input source from which to read the XML document
+   * 
+   * @return a <code>CustomResourceSpecifier</code> object constructed from the XML document
+   * 
+   * @throws InvalidXMLException
+   *           if the input XML is not valid or does not specify a valid CustomResourceSpecifier
+   */
+  public CustomResourceSpecifier parseCustomResourceSpecifier(XMLInputSource aInput)
+          throws InvalidXMLException;
+
+  /**
+   * Parses a CustomResourceSpecifier from an XML input stream.
+   * 
+   * @param aInput
+   *          the input source from which to read the XML document
+   * @param aOptions
+   *          option settings
+   * 
+   * @return a <code>CustomResourceSpecifier</code> object constructed from the XML document
+   * 
+   * @throws InvalidXMLException
+   *           if the input XML is not valid or does not specify a valid CustomResourceSpecifier
+   */
+  public CustomResourceSpecifier parseCustomResourceSpecifier(XMLInputSource aInput,
           ParsingOptions aOptions) throws InvalidXMLException;
 
   /**

Modified: incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/util/impl/XMLParser_impl.java
URL: http://svn.apache.org/viewvc/incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/util/impl/XMLParser_impl.java?view=diff&rev=520910&r1=520909&r2=520910
==============================================================================
--- incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/util/impl/XMLParser_impl.java (original)
+++ incubator/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/util/impl/XMLParser_impl.java Wed Mar 21 08:13:00 2007
@@ -41,6 +41,7 @@
 import org.apache.uima.collection.metadata.CpeDescription;
 import org.apache.uima.flow.FlowControllerDescription;
 import org.apache.uima.internal.util.XMLUtils;
+import org.apache.uima.resource.CustomResourceSpecifier;
 import org.apache.uima.resource.ResourceSpecifier;
 import org.apache.uima.resource.URISpecifier;
 import org.apache.uima.resource.metadata.FsIndexCollection;
@@ -788,6 +789,28 @@
     }
   }
 
+  /* (non-Javadoc)
+   * @see org.apache.uima.util.XMLParser#parseCustomResourceSpecifier(org.apache.uima.util.XMLInputSource)
+   */
+  public CustomResourceSpecifier parseCustomResourceSpecifier(XMLInputSource aInput) throws InvalidXMLException {
+    return parseCustomResourceSpecifier(aInput, DEFAULT_PARSING_OPTIONS);
+  }
+
+  /* (non-Javadoc)
+   * @see org.apache.uima.util.XMLParser#parseCustomResourceSpecifier(org.apache.uima.util.XMLInputSource, org.apache.uima.util.XMLParser.ParsingOptions)
+   */
+  public CustomResourceSpecifier parseCustomResourceSpecifier(XMLInputSource aInput, ParsingOptions aOptions) throws InvalidXMLException {
+    // attempt to locate resource specifier schema
+    URL schemaURL = getResourceSpecifierSchemaUrl();
+    XMLizable object = parse(aInput, RESOURCE_SPECIFIER_NAMESPACE, schemaURL, aOptions);
+
+    if (object instanceof CustomResourceSpecifier) {
+      return (CustomResourceSpecifier) object;
+    } else {
+      throw new InvalidXMLException(InvalidXMLException.INVALID_CLASS, new Object[] {
+              CustomResourceSpecifier.class.getName(), object.getClass().getName() });
+    }
+  }
   /*
    * (non-Javadoc)
    * 

Modified: incubator/uima/uimaj/trunk/uimaj-core/src/main/resources/org/apache/uima/impl/factoryConfig.xml
URL: http://svn.apache.org/viewvc/incubator/uima/uimaj/trunk/uimaj-core/src/main/resources/org/apache/uima/impl/factoryConfig.xml?view=diff&rev=520910&r1=520909&r2=520910
==============================================================================
--- incubator/uima/uimaj/trunk/uimaj-core/src/main/resources/org/apache/uima/impl/factoryConfig.xml (original)
+++ incubator/uima/uimaj/trunk/uimaj-core/src/main/resources/org/apache/uima/impl/factoryConfig.xml Wed Mar 21 08:13:00 2007
@@ -53,6 +53,8 @@
 	  	             factoryClass="org.apache.uima.impl.CollectionReaderFactory_impl"/>
 	  <customFactory specifier="org.apache.uima.resource.ResourceCreationSpecifier"
 	  	             factoryClass="org.apache.uima.impl.AnalysisEngineFactory_impl"/>
+	  <customFactory specifier="org.apache.uima.resource.CustomResourceSpecifier"
+	  	             factoryClass="org.apache.uima.impl.CustomResourceFactory_impl"/>
 	</resource>
 
 	<resourceSpecifier>
@@ -69,6 +71,7 @@
 		<binding element="configurationParameter" interface="org.apache.uima.resource.metadata.ConfigurationParameter" class="org.apache.uima.resource.metadata.impl.ConfigurationParameter_impl"/>
 		<binding element="configurationParameterSettings" interface="org.apache.uima.resource.metadata.ConfigurationParameterSettings" class="org.apache.uima.resource.metadata.impl.ConfigurationParameterSettings_impl"/>
 		<binding element="configurationParameters" interface="org.apache.uima.resource.metadata.ConfigurationParameterDeclarations" class="org.apache.uima.resource.metadata.impl.ConfigurationParameterDeclarations_impl"/>
+		<binding element="customResourceSpecifier" interface="org.apache.uima.resource.CustomResourceSpecifier" class="org.apache.uima.resource.impl.CustomResourceSpecifier_impl"/>
 		<binding element="externalResource" interface="org.apache.uima.resource.ExternalResourceDescription" class="org.apache.uima.resource.impl.ExternalResourceDescription_impl"/>
 		<binding element="externalResourceBinding" interface="org.apache.uima.resource.metadata.ExternalResourceBinding" class="org.apache.uima.resource.metadata.impl.ExternalResourceBinding_impl"/>
 		<binding element="externalResourceDependency" interface="org.apache.uima.resource.ExternalResourceDependency" class="org.apache.uima.resource.impl.ExternalResourceDependency_impl"/>

Modified: incubator/uima/uimaj/trunk/uimaj-core/src/main/resources/resourceSpecifierSchema.xsd
URL: http://svn.apache.org/viewvc/incubator/uima/uimaj/trunk/uimaj-core/src/main/resources/resourceSpecifierSchema.xsd?view=diff&rev=520910&r1=520909&r2=520910
==============================================================================
--- incubator/uima/uimaj/trunk/uimaj-core/src/main/resources/resourceSpecifierSchema.xsd (original)
+++ incubator/uima/uimaj/trunk/uimaj-core/src/main/resources/resourceSpecifierSchema.xsd Wed Mar 21 08:13:00 2007
@@ -616,7 +616,7 @@
         <element name="parameters" minOccurs="0">
           <complexType>
             <sequence>
-              <element name="parameter" maxOccurs="unbounded">
+              <element name="parameter" minOccurs="0" maxOccurs="unbounded">
                 <complexType>
                   <attribute name="name" type="string"/>
                   <attribute name="value" type="string"/>
@@ -628,5 +628,27 @@
       </sequence>
     </complexType>
   </element>
+  
+  <!-- Top Level Element Definitions for Custom ResourceSpecifiers -->
+
+  <element name="customResourceSpecifier" substitutionGroup="rs:resourceSpecifier">
+    <complexType>
+      <sequence>
+        <element name="resourceClassName" type="string"/>
+        <element name="parameters" minOccurs="0">
+          <complexType>
+            <sequence>
+              <element name="parameter" minOccurs="0" maxOccurs="unbounded">
+                <complexType>
+                  <attribute name="name" type="string"/>
+                  <attribute name="value" type="string"/>
+                </complexType>
+              </element>
+            </sequence>
+          </complexType>
+        </element>
+      </sequence>
+    </complexType>
+  </element>  
   
 </schema>

Added: incubator/uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/impl/CustomResourceSpecifierFactory_implTest.java
URL: http://svn.apache.org/viewvc/incubator/uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/impl/CustomResourceSpecifierFactory_implTest.java?view=auto&rev=520910
==============================================================================
--- incubator/uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/impl/CustomResourceSpecifierFactory_implTest.java (added)
+++ incubator/uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/impl/CustomResourceSpecifierFactory_implTest.java Wed Mar 21 08:13:00 2007
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.uima.impl;
+
+import java.util.Collections;
+
+import junit.framework.TestCase;
+
+import org.apache.uima.UIMAFramework;
+import org.apache.uima.collection.CasConsumer;
+import org.apache.uima.collection.CasConsumerDescription;
+import org.apache.uima.collection.impl.CasConsumerDescription_impl;
+import org.apache.uima.resource.CustomResourceSpecifier;
+import org.apache.uima.resource.Parameter;
+import org.apache.uima.resource.Resource;
+import org.apache.uima.resource.ResourceInitializationException;
+
+/**
+ * 
+ */
+public class CustomResourceSpecifierFactory_implTest extends TestCase {
+ 
+  private CustomResourceFactory_impl crFactory;
+
+  protected void setUp() throws Exception {
+    crFactory = new CustomResourceFactory_impl();
+  }
+
+  public void testProduceResource() throws Exception {
+    CustomResourceSpecifier specifier = UIMAFramework.getResourceSpecifierFactory().createCustomResourceSpecifier();
+    specifier.setResourceClassName("org.apache.uima.impl.SomeCustomResource");
+    Parameter[] parameters = new Parameter[2];
+    parameters[0] = UIMAFramework.getResourceSpecifierFactory().createParameter();
+    parameters[0].setName("param1");
+    parameters[0].setValue("val1");
+    parameters[1] = UIMAFramework.getResourceSpecifierFactory().createParameter();
+    parameters[1].setName("param2");
+    parameters[1].setValue("val2");
+    specifier.setParameters(parameters);    
+    
+    Resource res = crFactory.produceResource(Resource.class, specifier, Collections.EMPTY_MAP);   
+    assertTrue(res instanceof SomeCustomResource);
+    assertEquals("val1", ((SomeCustomResource)res).paramMap.get("param1"));
+    assertEquals("val2", ((SomeCustomResource)res).paramMap.get("param2"));
+    
+    //also UIMAFramework.produceResource should do the same thing
+    res = UIMAFramework.produceResource(specifier, Collections.EMPTY_MAP);    
+    assertTrue(res instanceof SomeCustomResource);
+    assertEquals("val1", ((SomeCustomResource)res).paramMap.get("param1"));
+    assertEquals("val2", ((SomeCustomResource)res).paramMap.get("param2"));  
+  }
+
+}

Added: incubator/uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/impl/SomeCustomResource.java
URL: http://svn.apache.org/viewvc/incubator/uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/impl/SomeCustomResource.java?view=auto&rev=520910
==============================================================================
--- incubator/uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/impl/SomeCustomResource.java (added)
+++ incubator/uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/impl/SomeCustomResource.java Wed Mar 21 08:13:00 2007
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.uima.impl;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.Assert;
+
+import org.apache.uima.resource.CustomResourceSpecifier;
+import org.apache.uima.resource.Parameter;
+import org.apache.uima.resource.ResourceInitializationException;
+import org.apache.uima.resource.ResourceSpecifier;
+import org.apache.uima.resource.Resource_ImplBase;
+
+/**
+ * 
+ */
+public class SomeCustomResource extends Resource_ImplBase {
+  
+  public Map paramMap = new HashMap();
+
+  /* (non-Javadoc)
+   * @see org.apache.uima.resource.Resource_ImplBase#initialize(org.apache.uima.resource.ResourceSpecifier, java.util.Map)
+   */
+  public boolean initialize(ResourceSpecifier aSpecifier, Map aAdditionalParams) throws ResourceInitializationException {
+    Assert.assertTrue(aSpecifier instanceof CustomResourceSpecifier);
+    Parameter[] params = ((CustomResourceSpecifier)aSpecifier).getParameters();
+    for (int i = 0; i < params.length; i++) {
+      paramMap.put(params[i].getName(), params[i].getValue());
+    }
+    return true;
+  }
+
+}

Modified: incubator/uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/util/impl/XMLParser_implTest.java
URL: http://svn.apache.org/viewvc/incubator/uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/util/impl/XMLParser_implTest.java?view=diff&rev=520910&r1=520909&r2=520910
==============================================================================
--- incubator/uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/util/impl/XMLParser_implTest.java (original)
+++ incubator/uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/util/impl/XMLParser_implTest.java Wed Mar 21 08:13:00 2007
@@ -31,6 +31,7 @@
 import org.apache.uima.analysis_engine.AnalysisEngineDescription;
 import org.apache.uima.analysis_engine.TaeDescription;
 import org.apache.uima.flow.FlowControllerDescription;
+import org.apache.uima.resource.CustomResourceSpecifier;
 import org.apache.uima.resource.Parameter;
 import org.apache.uima.resource.URISpecifier;
 import org.apache.uima.test.junit_extension.JUnitExtension;
@@ -163,5 +164,18 @@
     assertEquals("some.internet.ip.name-or-address", params[0].getValue());
     assertEquals("VNS_PORT", params[1].getName());
     assertEquals("9000", params[1].getValue());    
+  }
+  
+  public void testParseCustomResourceSpecifier() throws Exception {
+    XMLInputSource in = new XMLInputSource(
+            JUnitExtension.getFile("XmlParserTest/TestCustomResourceSpecifier.xml"));
+    CustomResourceSpecifier uriSpec = mXmlParser.parseCustomResourceSpecifier(in);
+    assertEquals("foo.bar.MyResource", uriSpec.getResourceClassName());
+    Parameter[] params = uriSpec.getParameters();
+    assertEquals(2, params.length);
+    assertEquals("param1", params[0].getName());
+    assertEquals("val1", params[0].getValue());
+    assertEquals("param2", params[1].getName());
+    assertEquals("val2", params[1].getValue());  
   }
 }

Added: incubator/uima/uimaj/trunk/uimaj-core/src/test/resources/XmlParserTest/TestCustomResourceSpecifier.xml
URL: http://svn.apache.org/viewvc/incubator/uima/uimaj/trunk/uimaj-core/src/test/resources/XmlParserTest/TestCustomResourceSpecifier.xml?view=auto&rev=520910
==============================================================================
--- incubator/uima/uimaj/trunk/uimaj-core/src/test/resources/XmlParserTest/TestCustomResourceSpecifier.xml (added)
+++ incubator/uima/uimaj/trunk/uimaj-core/src/test/resources/XmlParserTest/TestCustomResourceSpecifier.xml Wed Mar 21 08:13:00 2007
@@ -0,0 +1,25 @@
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ -->
+<customResourceSpecifier xmlns="http://uima.apache.org/resourceSpecifier">
+   <resourceClassName>foo.bar.MyResource</resourceClassName>
+   <parameters>
+     <parameter name="param1" value="val1"/>
+     <parameter name="param2" value="val2"/>
+   </parameters>
+</customResourceSpecifier>
\ No newline at end of file