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 2006/11/22 17:44:00 UTC

svn commit: r478226 [4/32] - in /incubator/uima/uimaj/trunk/uimaj-cpe/src: main/java/org/apache/uima/cas_data/impl/vinci/ main/java/org/apache/uima/collection/impl/ main/java/org/apache/uima/collection/impl/base_cpm/container/ main/java/org/apache/uima...

Modified: incubator/uima/uimaj/trunk/uimaj-cpe/src/main/java/org/apache/uima/collection/impl/cpm/container/CPEFactory.java
URL: http://svn.apache.org/viewvc/incubator/uima/uimaj/trunk/uimaj-cpe/src/main/java/org/apache/uima/collection/impl/cpm/container/CPEFactory.java?view=diff&rev=478226&r1=478225&r2=478226
==============================================================================
--- incubator/uima/uimaj/trunk/uimaj-cpe/src/main/java/org/apache/uima/collection/impl/cpm/container/CPEFactory.java (original)
+++ incubator/uima/uimaj/trunk/uimaj-cpe/src/main/java/org/apache/uima/collection/impl/cpm/container/CPEFactory.java Wed Nov 22 08:43:54 2006
@@ -28,17 +28,15 @@
 import java.io.InvalidObjectException;
 import java.util.HashMap;
 import java.util.Hashtable;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Vector;
 
+import javax.naming.ConfigurationException;
+
 import org.apache.uima.UIMAFramework;
 import org.apache.uima.UIMARuntimeException;
-import org.apache.uima.UIMA_IllegalArgumentException;
-import org.apache.uima.UIMA_IllegalStateException;
 import org.apache.uima.UimaContextAdmin;
-import org.apache.uima.analysis_engine.AnalysisEngine;
 import org.apache.uima.analysis_engine.AnalysisEngineDescription;
 import org.apache.uima.cas.CAS;
 import org.apache.uima.collection.CasConsumer;
@@ -51,9 +49,7 @@
 import org.apache.uima.collection.base_cpm.CasDataConsumer;
 import org.apache.uima.collection.base_cpm.CasDataInitializer;
 import org.apache.uima.collection.base_cpm.CasProcessor;
-import org.apache.uima.collection.impl.cpm.CPEConfig;
 import org.apache.uima.collection.impl.cpm.CPMException;
-import org.apache.uima.collection.impl.cpm.CheckpointConfig;
 import org.apache.uima.collection.impl.cpm.Constants;
 import org.apache.uima.collection.impl.cpm.container.deployer.DeployFactory;
 import org.apache.uima.collection.impl.cpm.utils.CPMUtils;
@@ -93,1472 +89,1538 @@
 import org.apache.uima.util.XMLInputSource;
 
 /**
- * Component responsible for generating objects representing cpe descriptor configuration.
- * Provides various ways to instantiate object model representing cpe configuration. 
- * In the simplest form it ingests an xml file (cpe descriptor), parses it and creates
- * an object for every element in the xml file. 
+ * Component responsible for generating objects representing cpe descriptor configuration. Provides
+ * various ways to instantiate object model representing cpe configuration. In the simplest form it
+ * ingests an xml file (cpe descriptor), parses it and creates an object for every element in the
+ * xml file.
  * <p>
- * Using objects representing configuration, this component creates CollectionReader
- * CasInitializer, Analysis Engines, and Cas Consumers.
+ * Using objects representing configuration, this component creates CollectionReader CasInitializer,
+ * Analysis Engines, and Cas Consumers.
  * <p>
- * In addition to creating object, this component provides read/write access to the
- * object model allowing for dynamic or programmatic modifications. It facilitates
- * plugging in existing CollectionReaders and CasProcessors.
- *  
+ * In addition to creating object, this component provides read/write access to the object model
+ * allowing for dynamic or programmatic modifications. It facilitates plugging in existing
+ * CollectionReaders and CasProcessors.
+ * 
  * 
  */
-public class CPEFactory
-{
-	public static final String CPM_HOME = "${CPM_HOME}";
-	private int processorCount = 0;
-	private String DEFAULT_CONFIG_FILE = "defaultCpeDescriptor.xml";
-	private boolean defaultConfig = true;
-	public HashMap casProcessorConfigMap = new HashMap();
-	private CpeDescription cpeDescriptor = null;
-	private boolean initialized = false;
-	private UimaContextAdmin uimaContext;
-	private boolean firstTime = true;
-	private HashMap cpMap = new HashMap();
-
-	/**
-	 * Create a new CPEFactory on which we will later call parse(String) to parse a CPE descriptor.
-	 */
-	public CPEFactory(ResourceManager aResourceManager)
-	{
-		uimaContext = UIMAFramework.newUimaContext(UIMAFramework.getLogger(), aResourceManager, UIMAFramework.newConfigurationManager());
-	}
-
-	/**
-	 * Create a new CPEFactory for a CpeDescription that's already been parsed.
-	 * @param aDescriptor
-	 * @param aResourceManager the resource manager that all components of this CPE will share
-	 *     If null, a new ResourceManager will be created.   
-	 */
-	public CPEFactory(CpeDescription aDescriptor, ResourceManager aResourceManager) throws ResourceInitializationException
-	{
-		if (aDescriptor == null)
-		{
-			throw new UIMARuntimeException(
-					new InvalidObjectException(CpmLocalizedMessage.getLocalizedMessage(CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
-							"UIMA_CPM_EXP_no_cpe_descriptor__WARNING",new Object[] {Thread.currentThread().getName()}) ));
-		}
-
-		if (aResourceManager == null)
-		{
-			aResourceManager = UIMAFramework.newDefaultResourceManager();
-		}
-		setCpeDescriptor(aDescriptor);
-		if (aDescriptor != null && aDescriptor instanceof CpeDescriptionImpl)
-		{
-			defaultConfig = false;
-		}
-
-		uimaContext = UIMAFramework.newUimaContext(UIMAFramework.getLogger(), aResourceManager, UIMAFramework.newConfigurationManager());
-		//if CpeDescription contains a ResourceManagerConfiguration, parse it and use it
-		//to configure the ResourceManager
-		CpeResourceManagerConfiguration resMgrCfgDesc = aDescriptor.getResourceManagerConfiguration();
-		if (resMgrCfgDesc != null)
-		{
-			ResourceManagerConfiguration resMgrCfg;
-			try
-			{
-				if (resMgrCfgDesc.get().length() > 0)
-				{
-					String descriptorPath = CPMUtils.convertToAbsolutePath(System.getProperty("CPM_HOME"), CPM_HOME, resMgrCfgDesc.get());
-					resMgrCfg = UIMAFramework.getXMLParser().parseResourceManagerConfiguration(new XMLInputSource(descriptorPath));
-					aResourceManager.initializeExternalResources(resMgrCfg, "/", null);
-				}
-			}
-			catch (InvalidXMLException e)
-			{
-				throw new ResourceInitializationException(e);
-			}
-			catch (IOException e)
-			{
-				throw new ResourceInitializationException(e);
-			}
-		}
-	}
-	/**
-	 * Creates an object representation for configuration in a given cpe descriptor file.
-	 * 
-	 * @param aDescriptor - path to the descriptor
-	 * 
-	 * @throws InstantiationException
-	 */
-	public void parse(String aDescriptor) throws InstantiationException
-	{
-		defaultConfig = false;
-
-		if (aDescriptor == null || aDescriptor.trim().length() == 0)
-		{
-			throw new UIMARuntimeException(
-					new FileNotFoundException(CpmLocalizedMessage.getLocalizedMessage(CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
-							"UIMA_CPM_EXP_no_cpe_descriptor__WARNING",new Object[] {Thread.currentThread().getName()}) ));
-		}
-
-		try
-		{
-			setCpeDescriptor(CpeDescriptorFactory.produceDescriptor(new FileInputStream(new File(aDescriptor))));
-
-		}
-		catch (Exception e)
-		{
-			throw new UIMARuntimeException(InvalidXMLException.INVALID_DESCRIPTOR_FILE, 
-                new Object[]{aDescriptor}, e);
-		}
-	}
-	/**
-	 * Creates an object representation for configuration in a given stream
-	 * 
-	 * @param aDescriptorStream - stream containing cpe description
-	 * @throws InstantiationException
-	 */
-	public void parse(InputStream aDescriptorStream) throws InstantiationException
-	{
-		defaultConfig = false;
-
-		if (aDescriptorStream == null)
-		{
-			throw new UIMARuntimeException(
-					new IOException(CpmLocalizedMessage.getLocalizedMessage(CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
-							"UIMA_CPM_EXP_invalid_cpe_descriptor_stream__WARNING",new Object[] {Thread.currentThread().getName()}) ));
-		}
-
-		try
-		{
-			setCpeDescriptor(CpeDescriptorFactory.produceDescriptor(aDescriptorStream));
-		}
-		catch (Exception e)
-		{
-			throw new UIMARuntimeException(e);
-		}
-	}
-	/**
-	 * Creates an object representation from default cpe descriptor.
-	 * 
-	 * @param aDescriptorStream - stream containing cpe description
-	 * @throws InstantiationException
-	 */
-
-	public void parse()
-	{
-		defaultConfig = true;
-		InputStream defaultDescriptorStream = getClass().getResourceAsStream(DEFAULT_CONFIG_FILE);
-		try
-		{
-			setCpeDescriptor(CpeDescriptorFactory.produceDescriptor(defaultDescriptorStream));
-		}
-		catch (Exception e)
-		{
-			throw new UIMARuntimeException(e);
-		}
-		finally
-		{
-			try
-			{
-				defaultDescriptorStream.close();
-			}
-			catch (IOException e)
-			{
-				e.printStackTrace();
-			}
-		}
-
-	}
-	/**
-	 * Checks if cpe description has been created
-	 * 
-	 * @throws ConfigurationException
-	 */
-	private void checkForErrors() throws ResourceConfigurationException
-	{
-		if (cpeDescriptor == null)
-		{
-			throw new ResourceConfigurationException(
-					new Exception(CpmLocalizedMessage.getLocalizedMessage(CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
-							"UIMA_CPM_EXP_no_cpe_descriptor__WARNING",new Object[] {Thread.currentThread().getName()}) ));
-		}
-	}
-	/**
-	 * Returns Collection Reader instantiated from configuration in the cpe descriptor. It also creates
-	 * and intializes the Cas Initializer if one is defined and associates it with the CollectionReader. 
-	 *   
-	 * @return - CollectionReader instance
-	 * 
-	 * @throws ConfigurationException
-	 */
-	public BaseCollectionReader getCollectionReader() throws ResourceConfigurationException
-	{
-		checkForErrors();
-		BaseCollectionReader colreader = null;
-		try
-		{
-			CpeCollectionReader reader = (getCpeDescriptor().getAllCollectionCollectionReaders())[0];
-			if (reader == null)
-			{
-				throw new ResourceConfigurationException(InvalidXMLException.ELEMENT_NOT_FOUND, new Object[] { "<collectionReader>", "<cpeDescriptor>" }, 
-						new Exception(CpmLocalizedMessage.getLocalizedMessage(CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
-								"UIMA_CPM_EXP_missing_required_element__WARNING",new Object[] {Thread.currentThread().getName(),"<collectionReader>"}) ));
-			}
-
-			CpeCollectionReaderIterator cit = reader.getCollectionIterator();
-			if (cit == null || cit.getDescriptor() == null || cit.getDescriptor().getInclude() == null)
-			{
-				throw new ResourceConfigurationException(InvalidXMLException.ELEMENT_NOT_FOUND, new Object[] { "<include>", "<collectionIterator>" }, 
-						new Exception(CpmLocalizedMessage.getLocalizedMessage(CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
-								"UIMA_CPM_EXP_missing_required_element__WARNING",new Object[] {Thread.currentThread().getName(),"<include>"}) ));
-			}
-			if (cit.getDescriptor().getInclude().get() == null)
-			{
-				throw new ResourceConfigurationException(InvalidXMLException.ELEMENT_NOT_FOUND, new Object[] { "<href>", "<collectionIterator>" }, 
-						new Exception(CpmLocalizedMessage.getLocalizedMessage(CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
-								"UIMA_CPM_EXP_missing_attribute_from_xml_element__WARNING",new Object[] {Thread.currentThread().getName(),"<href>","<collectionIterator>"}) ));
-			}
-
-			String descriptorPath = CPMUtils.convertToAbsolutePath(System.getProperty("CPM_HOME"), CPM_HOME, cit.getDescriptor().getInclude().get());
-			//create new collection reader from the descriptor
-			XMLInputSource in1 = new XMLInputSource(descriptorPath);
-			ResourceSpecifier colReaderSp = UIMAFramework.getXMLParser().parseCollectionReaderDescription(in1);
-
-			overrideParameterSettings(colReaderSp, cit.getConfigurationParameterSettings(), descriptorPath, "Collection Reader");
-
-			//compute sofa mapping for the CAS Initializer
-			CpeSofaMappings sofanamemappings = cit.getSofaNameMappings();
-			HashMap sofamap = new HashMap();
-			if (sofanamemappings != null)
-			{
-				CpeSofaMapping[] sofaNameMappingArray = sofanamemappings.getSofaNameMappings();
-				for (int i = 0; sofaNameMappingArray != null && i < sofaNameMappingArray.length; i++)
-				{
-					CpeSofaMapping aSofaMap = sofaNameMappingArray[i];
-					//if no component sofa name, then set it to default 
-					if (aSofaMap.getComponentSofaName() == null)
-						aSofaMap.setComponentSofaName(CAS.NAME_DEFAULT_TEXT_SOFA);
-					sofamap.put(aSofaMap.getComponentSofaName(), aSofaMap.getCpeSofaName());
-				}
-			}
-
-			//create child UimaContext for the CollectionReader
-			UimaContextAdmin collectionReaderContext = uimaContext.createChild("_CollectionReader", sofamap);
-			Map additionalParams = new HashMap();
-			additionalParams.put(Resource.PARAM_UIMA_CONTEXT, collectionReaderContext);
-			colreader = (BaseCollectionReader) UIMAFramework.produceResource(BaseCollectionReader.class, colReaderSp, getResourceManager(), additionalParams);
-
-			CpeCollectionReaderCasInitializer casInit = reader.getCasInitializer();
-			if (casInit != null)
-			{
-				if (casInit.getDescriptor() == null)
-				{
-					throw new ResourceConfigurationException(InvalidXMLException.ELEMENT_NOT_FOUND, new Object[] { "<descriptor>", "<casInitializer>" }, 
-							new Exception(CpmLocalizedMessage.getLocalizedMessage(CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
-									"UIMA_CPM_EXP_missing_required_element__WARNING",new Object[] {Thread.currentThread().getName(),"<descriptor>"}) ));
-				}
-				if (casInit.getDescriptor().getInclude() == null)
-				{
-					throw new ResourceConfigurationException(InvalidXMLException.ELEMENT_NOT_FOUND, new Object[] { "<include>", "<casInitializer>" }, 
-							new Exception(CpmLocalizedMessage.getLocalizedMessage(CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
-									"UIMA_CPM_EXP_missing_required_element__WARNING",new Object[] {Thread.currentThread().getName(),"<include>"}) ));
-				}
-				if (casInit.getDescriptor().getInclude().get() == null || casInit.getDescriptor().getInclude().get().length() == 0)
-				{
-					throw new ResourceConfigurationException(InvalidXMLException.ELEMENT_NOT_FOUND, new Object[] { "<href>", "<casInitializer>" }, 
-							new Exception(CpmLocalizedMessage.getLocalizedMessage(CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
-									"UIMA_CPM_EXP_missing_attribute_from_xml_element__WARNING",new Object[] {Thread.currentThread().getName(),"<href>","<casInitializer>"}) ));
-				}
-
-				descriptorPath = CPMUtils.convertToAbsolutePath(System.getProperty("CPM_HOME"), CPM_HOME, casInit.getDescriptor().getInclude().get());
-
-				File casInitializerSpecifierFile = new File(descriptorPath);
-				XMLInputSource in4 = new XMLInputSource(casInitializerSpecifierFile);
-				ResourceSpecifier casIniSp = UIMAFramework.getXMLParser().parseCasInitializerDescription(in4);
-
-				overrideParameterSettings(casIniSp, casInit.getConfigurationParameterSettings(), descriptorPath, "Cas Initializer");
-
-				//compute sofa mapping for the CAS Initializer
-				CpeSofaMappings sofaNamemappings = casInit.getSofaNameMappings();
-				sofamap = new HashMap();
-				if (sofaNamemappings != null)
-				{
-					CpeSofaMapping[] sofaNameMappingArray = sofaNamemappings.getSofaNameMappings();
-					for (int i = 0; sofaNameMappingArray != null && i < sofaNameMappingArray.length; i++)
-					{
-						CpeSofaMapping aSofaMap = sofaNameMappingArray[i];
-						//if no component sofa name, then set it to default 
-						if (aSofaMap.getComponentSofaName() == null)
-							aSofaMap.setComponentSofaName(CAS.NAME_DEFAULT_TEXT_SOFA);
-						sofamap.put(aSofaMap.getComponentSofaName(), aSofaMap.getCpeSofaName());
-					}
-				}
-
-				//create child UimaContext for the CAS Initializer
-				UimaContextAdmin initializerContext = uimaContext.createChild("_CasInitializer", sofamap);
-				additionalParams.put(Resource.PARAM_UIMA_CONTEXT, initializerContext);
-
-				Object initializer = produceInitializer(casIniSp, additionalParams);
-
-				if (initializer instanceof CasDataInitializer)
-				{
-					((CasDataCollectionReader) colreader).setCasInitializer((CasDataInitializer) initializer);
-				}
-				else if (initializer instanceof CasInitializer)
-				{
-					((CollectionReader) colreader).setCasInitializer((CasInitializer) initializer);
-				}
-				else
-				{
-					throw new ResourceConfigurationException(InvalidXMLException.INVALID_ELEMENT_TYPE, 
-							new Object[] { "CasDataInitializer", initializer.getClass().getName()},
-							new Exception(CpmLocalizedMessage.getLocalizedMessage(CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
-									"UIMA_CPM_EXP_incompatible_component__WARNING",new Object[] {Thread.currentThread().getName(),"CasInitializer","CasDataInitializer",initializer.getClass().getName()}) ));
-				}
-			}
-			//	Retrieve number of entities to process from CPE configuration
-			long numDocs2Process = getCPEConfig().getNumToProcess();
-			if (UIMAFramework.getLogger().isLoggable(Level.CONFIG))
-			{
-				UIMAFramework.getLogger(this.getClass()).logrb(Level.CONFIG, this.getClass().getName(), "process",
-				        CPMUtils.CPM_LOG_RESOURCE_BUNDLE, "UIMA_CPM_show_docs_to_process__CONFIG",
-				        new Object[] {Thread.currentThread().getName(), String.valueOf(numDocs2Process)});
-			}
-			//	Provide CollectionReader with the number of documents to process				
-			 ((ConfigurableResource_ImplBase) colreader).setConfigParameterValue("processSize", new Integer(new Long(numDocs2Process).intValue()));
-			CpeConfiguration cpeType = getCpeDescriptor().getCpeConfiguration();
-			if (cpeType != null && cpeType.getStartingEntityId() != null && cpeType.getStartingEntityId().trim().length() > 0)
-			{
-				if (UIMAFramework.getLogger().isLoggable(Level.FINEST))
-				{
-					UIMAFramework.getLogger(this.getClass()).logrb(Level.FINEST, this.getClass().getName(), "process",
-					        CPMUtils.CPM_LOG_RESOURCE_BUNDLE, "UIMA_CPM_show_start_doc_id__FINEST",
-					        new Object[] {Thread.currentThread().getName(), cpeType.getStartingEntityId()});
-				}
-				((BaseCollectionReader) colreader).getProcessingResourceMetaData().getConfigurationParameterSettings().setParameterValue("startNumber", cpeType.getStartingEntityId().trim());
-				if (UIMAFramework.getLogger().isLoggable(Level.FINEST))
-				{
-					UIMAFramework.getLogger(this.getClass()).log(Level.FINEST, "Retrieved Documents Starting with DocId ::" + ((BaseCollectionReader) colreader).getProcessingResourceMetaData().getConfigurationParameterSettings().getParameterValue("startNumber"));
-				}
-			}
-
-			if (UIMAFramework.getLogger().isLoggable(Level.FINEST))
-			{
-				UIMAFramework.getLogger(this.getClass()).log(Level.FINEST, "Retrieved processSize ::" + ((ConfigurableResource_ImplBase) colreader).getConfigParameterValue("processSize"));
-			}
-			return colreader;
-		}
-		catch (ResourceConfigurationException e)
-		{
-			throw e;
-		}
-		catch (Exception e)
-		{
-			throw new ResourceConfigurationException(e);
-		}
-	}
-	/**
-	 * Returns an array of Cas Processors instantiated from the cpe descriptor
-	 *  
-	 * @return - array of CasProcessor instances
-	 * 
-	 * @throws ResourceConfigurationException
-	 */
-	public CasProcessor[] getCasProcessors() throws ResourceConfigurationException
-	{
-		checkForErrors();
-		try
-		{
-			if (getCpeDescriptor().getCpeCasProcessors() == null)
-			{
-			throw new ResourceConfigurationException(InvalidXMLException.ELEMENT_NOT_FOUND, new Object[] { "<casProcessors>", "<cpeDescriptor>" }, 
-					new Exception(CpmLocalizedMessage.getLocalizedMessage(CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
-							"UIMA_CPM_EXP_bad_cpe_descriptor__WARNING",new Object[] {Thread.currentThread().getName()}) ));
-			}
-			CpeCasProcessors ct = getCpeDescriptor().getCpeCasProcessors();
-
-			CpeCasProcessor[] casProcessorList = ct.getAllCpeCasProcessors();
-			Vector v = new Vector();
-			if (casProcessorList == null || casProcessorList.length == 0)
-			{
-				throw new ResourceConfigurationException(InvalidXMLException.ELEMENT_NOT_FOUND, new Object[] { "<casProcessor>", "<casProcessors>" }, 
-						new Exception(CpmLocalizedMessage.getLocalizedMessage(CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
-								"UIMA_CPM_EXP_bad_cpe_descriptor__WARNING",new Object[] {Thread.currentThread().getName()}) ));
-			}
-
-			Hashtable namesMap = new Hashtable();
-			for (int i = 0; i < casProcessorList.length; i++)
-			{
-				CpeCasProcessor processorType = (CpeCasProcessor) casProcessorList[i];
-				if (processorType == null)
-				{
-					throw new ResourceConfigurationException(InvalidXMLException.ELEMENT_NOT_FOUND, new Object[] { "<casProcessor>", "<casProcessors>" }, 
-							new Exception(CpmLocalizedMessage.getLocalizedMessage(CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
-									"UIMA_CPM_EXP_bad_cpe_descriptor__WARNING",new Object[] {Thread.currentThread().getName()}) ));
-				}
-
-				//	Check for duplicate Cas Processor names. Names must be unique
-				if (namesMap.containsKey(processorType.getName()))
-				{
-					throw new ResourceConfigurationException(InvalidXMLException.INVALID_CPE_DESCRIPTOR, new Object[] { "casProcessor", "name" }, 
-							new CPMException(CpmLocalizedMessage.getLocalizedMessage(CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
-									"UIMA_CPM_EXP_duplicate_name__WARNING",new Object[] {Thread.currentThread().getName(),processorType.getName()}) ));
-				}
-				else
-				{
-					namesMap.put(processorType.getName(), processorType.getName());
-				}
-
-				String deploymentType = processorType.getDeployment();
-				if (deploymentType == null)
-				{
-					throw new ResourceConfigurationException(InvalidXMLException.REQUIRED_ATTRIBUTE_MISSING, new Object[] { "deployment", "<casProcessor>" }, 
-							new Exception(CpmLocalizedMessage.getLocalizedMessage(CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
-									"UIMA_CPM_EXP_missing_attribute_from_xml_element__WARNING",new Object[] {Thread.currentThread().getName(),processorType.getName(),"deployment","casProcessor"}) ));
-				}
-				CasProcessor casProcessor = null;
-				String deployModel = "";
-				boolean cpInMap = false;
-
-				//	Check if the CP has already been instantiated. The map holds one instance of a CP with a given name
-				//	The purpose of the map is to provide access to CP operational parameters. This is needed to 
-				//	determine if multiple instances of the CP are allowed.
-				if ( cpMap.containsKey(processorType.getName()) )
-				{
-					cpInMap = true;   // the CasProcessor is in the map
-					casProcessor = (CasProcessor)cpMap.get(processorType.getName());
-					//	Check operational parameters to determine if multiple instances of the CP are allowed
-					if ( !casProcessor.getProcessingResourceMetaData().getOperationalProperties().isMultipleDeploymentAllowed())
-					{
-						continue; // one instance already created. Multiple instances of this CP not allowed
-					}
-				}
-				
-				if (Constants.DEPLOYMENT_LOCAL.equals(deploymentType.toLowerCase()))
-				{
-					casProcessor = produceLocalCasProcessor(processorType);
-					deployModel = Constants.DEPLOYMENT_LOCAL;
-				}
-				else if (Constants.DEPLOYMENT_INTEGRATED.equals(deploymentType.toLowerCase()))
-				{
-
-					casProcessor = produceIntegratedCasProcessor(processorType);
-					deployModel = Constants.DEPLOYMENT_INTEGRATED;
-				}
-				else if (Constants.DEPLOYMENT_REMOTE.equals(deploymentType.toLowerCase()))
-				{
-					casProcessor = produceRemoteCasProcessor(processorType);
-					deployModel = Constants.DEPLOYMENT_REMOTE;
-				}
-				else
-				{
-					throw new ResourceConfigurationException(InvalidXMLException.REQUIRED_ATTRIBUTE_MISSING, new Object[] { "deployment", "<casProcessor>" }, 
-							new Exception(CpmLocalizedMessage.getLocalizedMessage(CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
-									"UIMA_CPM_Exception_invalid_deployment__WARNING",new Object[] {Thread.currentThread().getName(),processorType.getName(),deploymentType}) ));
-				}
-				
-				//	Add the casProcessor instantiated above to the map. The map is used to check if 
-				//	multiple instances of the cp are allowed. Need to store an instance in the map
-				//	since the only way to determine whether or not multiple instances are allowed is
-				//	to check OperationalProperties in the CP metadata.
-				if ( !cpInMap )
-				{
-					cpMap.put(processorType.getName(), casProcessor);
-				}
-				
-				String name = casProcessor.getProcessingResourceMetaData().getName();
-				if (!casProcessorConfigMap.containsKey(name))
-				{
-					casProcessorConfigMap.put(name, processorType);
-				}
-				else
-				{
-					//	Throw an exception due to a non-unique name. CPM requires Cas Processors to have a unique name.
-					//	The unique name enforcement for Local and Remote CP's is done 
-					//	above 'if ( namesMap.containsKey(processorType.getName()))'. In case of integrated CP, the 
-					//	name is taken from the CP descriptor. For Local and Remote, the names are taken from the
-					//	CPE descriptor
-					if (firstTime && Constants.DEPLOYMENT_INTEGRATED.equalsIgnoreCase(deployModel))
-					{
-						throw new ResourceConfigurationException(
-								new CPMException(CpmLocalizedMessage.getLocalizedMessage(CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
-										"UIMA_CPM_EXP_duplicate_name__WARNING",new Object[] {Thread.currentThread().getName(),processorType.getName()}) ));
-					}
-				}
-
-				v.add(casProcessor);
-			}
-
-			CasProcessor[] processors = new CasProcessor[v.size()];
-			v.copyInto(processors);
-			return processors;
-		}
-		catch (ResourceConfigurationException e)
-		{
-			throw e;
-		}
-		catch (Exception e)
-		{
-			throw new ResourceConfigurationException(e);
-		}
-		finally
-		{
-			firstTime = false;
-		}
-	}
-	/**
-	 * Check if a class has appropriate type
-	 * 
-	 * @param aResourceClass - class to check
-	 * @param resourceSpecifier - specifier containing expected type
-	 * @param aDescriptor - descriptor name
-	 *  
-	 * @return true - if class matches type
-	 * 
-	 * @throws ResourceConfigurationException
-	 */
-	public boolean isDefinitionInstanceOf(Class aResourceClass, ResourceSpecifier resourceSpecifier, String aDescriptor) throws ResourceConfigurationException
-	{
-		boolean validDefinition = false;
-		String implementationClass = null;
-		try
-		{
-			String frameworkName = null;
-			if ( resourceSpecifier instanceof AnalysisEngineDescription )
-			{
-				frameworkName = ((AnalysisEngineDescription)resourceSpecifier).getFrameworkImplementation();
-				implementationClass = ((AnalysisEngineDescription)resourceSpecifier).getImplementationName();
-			}
-			else if ( resourceSpecifier instanceof CasConsumerDescription )
-			{
-				frameworkName = ((CasConsumerDescription) resourceSpecifier).getFrameworkImplementation();				
-				implementationClass = ((CasConsumerDescription)resourceSpecifier).getImplementationName();
-			}
-			else
-			{
-				return false;
-			}
-			
-			if (frameworkName.startsWith("org.apache.uima.cpp") || frameworkName.startsWith("TAF"))
-			{
-				validDefinition = true;
-			}
-			else
-			{
-				//String className = ((CasConsumerDescription) resourceSpecifier).getImplementationName();
-				//load class using UIMA Extension ClassLoader if there is one
-				ClassLoader cl = null;
-				ResourceManager rm = getResourceManager();
-				if (rm != null)
-				{
-					cl = rm.getExtensionClassLoader();
-				}
-				if (cl == null)
-				{
-					cl = this.getClass().getClassLoader();
-				}
-//				Class currentClass = Class.forName(className, true, cl);
-				Class currentClass = Class.forName(implementationClass, true, cl);
-				
-				
-				//check to see if this is a subclass of aResourceClass
-				if (aResourceClass.isAssignableFrom(currentClass))
-				{
-					validDefinition = true;
-				}
-			}
-		}
-		catch (Exception e)
-		{
-			throw new ResourceConfigurationException(ResourceInitializationException.CLASS_NOT_FOUND,
-					new Object[] { implementationClass, aDescriptor}, e);
-		}
-		return validDefinition;
-	}
-	/**
-	 * Instantiates CasData Consumer from a given class.
-	 * 
-	 * @param aResourceClass - CasDataConsumer class
-	 * @param aSpecifier - specifier
-	 * @param aAdditionalParams - parameters used to initialize CasDataConsumer
-	 * @return - instance of CasProcessor
-	 * 
-	 * @throws ResourceInitializationException
-	 */
-	public CasProcessor produceCasDataConsumer(Class aResourceClass, ResourceSpecifier aSpecifier, Map aAdditionalParams) throws ResourceInitializationException
-	{
-		String className = null;
-		try
-		{
-			className = ((CasConsumerDescription) aSpecifier).getImplementationName();
-			//load class using UIMA Extension ClassLoader if there is one
-			ClassLoader cl = null;
-			ResourceManager rm = getResourceManager();
-			if (rm != null)
-			{
-				cl = rm.getExtensionClassLoader();
-			}
-			if (cl == null)
-			{
-				cl = this.getClass().getClassLoader();
-			}
-			Class currentClass = Class.forName(className, true, cl);
-			//check to see if this is a subclass of aResourceClass
-			if (aResourceClass.isAssignableFrom(currentClass))
-			{
-				//instantiate this Resource Class
-				CasDataConsumer casProcessor = (CasDataConsumer) currentClass.newInstance();
-
-				//attempt to initialize it
-				if (casProcessor.initialize(aSpecifier, aAdditionalParams))
-				{
-					//success!
-					return casProcessor;
-				}
-			}
-		}
-		//if an exception occurs, log it but do not throw it... yet
-		catch (ClassNotFoundException e)
-		{
-			throw new ResourceInitializationException(ResourceInitializationException.CLASS_NOT_FOUND, new Object[] { className,aSpecifier.getSourceUrlString() }, e);
-		}
-		catch (IllegalAccessException e)
-		{
-			throw new ResourceInitializationException(ResourceInitializationException.COULD_NOT_INSTANTIATE, new Object[] { className,aSpecifier.getSourceUrlString() }, e);
-		}
-		catch (InstantiationException e)
-		{
-			throw new ResourceInitializationException(ResourceInitializationException.COULD_NOT_INSTANTIATE, new Object[] { className,aSpecifier.getSourceUrlString() }, e);
-		}
-
-		return null;
-	}
-	/**
-	 * Instantiates Cas Initializer from a given class. It return 
-	 *  
-	 * @param aSpecifier - configuration for Cas Initializer
-	 * @param aAdditionalParams - parameters to initialize Cas Initializer
-	 * 
-	 * @return instance of CasDataInitializer or CasInitializer
-	 * @throws ResourceInitializationException
-	 */
-	private Object produceInitializer(ResourceSpecifier aSpecifier, Map aAdditionalParams) throws ResourceInitializationException
-	{
-		String className = null;
-		try
-		{
-			className = ((CasInitializerDescription) aSpecifier).getImplementationName();
-			//load class using UIMA Extension ClassLoader if there is one
-			ClassLoader cl = null;
-			ResourceManager rm = getResourceManager();
-			if (rm != null)
-			{
-				cl = rm.getExtensionClassLoader();
-			}
-			if (cl == null)
-			{
-				cl = this.getClass().getClassLoader();
-			}
-			Class currentClass = Class.forName(className, true, cl);
-			Object initializer = currentClass.newInstance();
-			//check to see if this is a subclass of aResourceClass
-			if (initializer instanceof CasInitializer)
-			{
-				((CasInitializer) initializer).initialize(aSpecifier, aAdditionalParams);
-				return initializer;
-			}
-			else if (initializer instanceof CasDataInitializer)
-			{
-				((CasDataInitializer) initializer).initialize(aSpecifier, aAdditionalParams);
-				return initializer;
-			}
-			else
-			{
-				throw new InstantiationException("Unexpected CasInitializer-" + initializer.getClass().getName());
-			}
-		}
-		//if an exception occurs, log it but do not throw it... yet
-		catch (ClassNotFoundException e)
-		{
-			throw new ResourceInitializationException(ResourceInitializationException.CLASS_NOT_FOUND, new Object[] { className,aSpecifier.getSourceUrlString() }, e);
-		}
-		catch (IllegalAccessException e)
-		{
-			throw new ResourceInitializationException(ResourceInitializationException.COULD_NOT_INSTANTIATE, new Object[] { className,aSpecifier.getSourceUrlString() }, e);
-		}
-		catch (InstantiationException e)
-		{
-			throw new ResourceInitializationException(ResourceInitializationException.COULD_NOT_INSTANTIATE, new Object[] { className,aSpecifier.getSourceUrlString() }, e);
-		}
-	}
-	/**
-	 * Returns a descriptor path associated with Cas Processor
-	 * 
-	 * @param aCasProcessorCfg - Cas Processor configuration
-	 * @return - Descriptor path
-	 * 
-	 * @throws ResourceConfigurationException
-	 */
-	public String getDescriptor(CpeCasProcessor aCasProcessorCfg) throws ResourceConfigurationException
-	{
-		String descriptor = null;
-		if (aCasProcessorCfg.getDescriptor() == null)
-		{
-			throw new ResourceConfigurationException(InvalidXMLException.ELEMENT_NOT_FOUND, new Object[] { "descriptor", "casProcessor" }, 
-					new Exception(CpmLocalizedMessage.getLocalizedMessage(CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
-							"UIMA_CPM_EXP_missing_xml_element__WARNING",new Object[] {Thread.currentThread().getName(),aCasProcessorCfg.getName(),"descriptor"}) ));
-		}
-		return aCasProcessorCfg.getDescriptor();
-	}
-	/**
-	 * Instantiates a ResourceSpecifier from a given descriptor
-	 * 
-	 * @param aFileName - descriptor path
-	 * @return - ResourceSpecifier
-	 * 
-	 * @throws Exception
-	 */
-	public ResourceSpecifier getSpecifier(String aFileName) throws Exception
-	{
-		File processorSpecifierFile = new File(aFileName);
-		XMLInputSource in = new XMLInputSource(processorSpecifierFile);
-		return UIMAFramework.getXMLParser().parseResourceSpecifier(in);
-
-	}
-	/**
-	 * Instantiates a local (managed) Cas Processor
-	 * 
-	 * @param aCasProcessorCfg - Cas Processor configuration 
-	 * @return - Local CasProcessor 
-	 * 
-	 * @throws ResourceConfigurationException
-	 */
-	private CasProcessor produceLocalCasProcessor(CpeCasProcessor aCasProcessorCfg) throws ResourceConfigurationException
-	{
-		if (aCasProcessorCfg == null)
-		{
-			throw new ResourceConfigurationException(InvalidXMLException.ELEMENT_NOT_FOUND, new Object[] { "casProcessor", "casProcessors" }, 
-					new Exception(CpmLocalizedMessage.getLocalizedMessage(CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
-							"UIMA_CPM_EXP_bad_cpe_descriptor_no_cp__WARNING",new Object[] {Thread.currentThread().getName()}) ));
-		}
-		CasProcessor casProcessor = new NetworkCasProcessorImpl(aCasProcessorCfg);
-		return casProcessor;
-	}
-	/**
-	 * Find a parameter with a given name in the in-memory component descriptor 
-	 * 
-	 * @param aCps - parameter settings from the component's descriptor
-	 * @param aParamName - name of the parameter to look for
-	 * 
-	 * @return - parameter as {@link NameValuePair} instance. If not found, returns null.
-	 *  
-	 * @throws Exception - any error
-	 */
-	private NameValuePair findMatchingNameValuePair(ConfigurationParameterSettings aCps, String aParamName) throws Exception
-	{
-		
-		NameValuePair[] nvp = aCps.getParameterSettings();
-		
-		//	Find a parameter with a given name
-		for (int i = 0; nvp != null && i < nvp.length; i++)
-		{
-			if (nvp[i].getName() != null)
-			{
-				if (nvp[i].getName().equalsIgnoreCase(aParamName))
-				{
-					return nvp[i]; // Found it
-				}
-			}
-		}
-		return null; // Parameter with a given name does not exist
-	}
-	/**
-	 * Replace a primitive value of a given parameter with a value defined in the CPE descriptor 
-	 * 
-	 * @param aType - type of the primitive value ( String, Integer, Boolean, or Float)
-	 * @param aCps - parameter settings from the component's descriptor
-	 * @param aCPE_nvp - parameter containing array of values to replace values in the component's descriptor
-	 * @throws Exception
-	 */
-	private void replacePrimitive(String aType, boolean aMandatoryParam, ConfigurationParameterSettings aCps, org.apache.uima.collection.metadata.NameValuePair aCPE_nvp, String aDescriptorPath, String aComponentName) throws Exception
-	{
-		boolean newParamSetting = false;
-
-		//	Get a new value for the primitive param
-		Object aValueObject = aCPE_nvp.getValue();
-		String param_name = aCPE_nvp.getName();
-
-		//	Find corresponding parameter in the in-memory component descriptor
-		NameValuePair nvp = findMatchingNameValuePair(aCps, param_name.trim());
-		if (nvp == null)
-		{
-			newParamSetting = true;
-			nvp = new NameValuePair_impl();
-			nvp.setName(param_name);
-		}
-		//	Copy a new value based on type
-		if (aType.equals("String") && aValueObject instanceof String)
-		{
-			nvp.setValue(aValueObject);
-		}
-		else if (aType.equals("Integer") && aValueObject instanceof Integer)
-		{
-			nvp.setValue(aValueObject);
-		}
-		else if (aType.equals("Float") && aValueObject instanceof Float)
-		{
-			nvp.setValue(aValueObject);
-
-		}
-		else if (aType.equals("Boolean") && aValueObject instanceof Boolean)
-		{
-			nvp.setValue(aValueObject);
-		}
-
-		if (newParamSetting)
-		{
-			aCps.setParameterValue(null, nvp.getName(), nvp.getValue());
-		}
-	}
-	/**
-	 * Replace array values found in the component's descriptor with values found in the CPE descriptor
-	 * 
-	 * @param aType - primitive type of the array (Sting, Integer, Float, or Boolean)
-	 * @param aCps - parameter settings from the component's descriptor
-	 * @param aCPE_nvp - parameter containing array of values to replace values in the component's descriptor
-	 * 
-	 * @throws Exception - any error
-	 */
-	private void replaceArray(String aType, boolean aMandatoryParam, ConfigurationParameterSettings aCps, org.apache.uima.collection.metadata.NameValuePair aCPE_nvp, String aDescriptorPath, String aComponentName) throws Exception
-	{
-		boolean newParamSetting = false;
-		Object valueObject = aCPE_nvp.getValue();
-		String param_name = aCPE_nvp.getName();
-		//	Find in the component in-memory descriptor a parameter with a given name
-		NameValuePair nvp = findMatchingNameValuePair(aCps, param_name.trim());
-		if (nvp == null)
-		{
-			//	Parameter setting does not exist in the component's descriptor so create new
-			newParamSetting = true;
-			nvp = new NameValuePair_impl();
-			nvp.setName(param_name);
-		}
-		//	Override component's parameters based on type 
-		if (aType.equals("String") && valueObject instanceof String[])
-		{
-			nvp.setValue(valueObject);
-		}
-		else if (aType.equals("Integer") && valueObject instanceof Integer[])
-		{
-			nvp.setValue(valueObject);
-		}
-		else if (aType.equals("Float") && valueObject instanceof Float[])
-		{
-			nvp.setValue(valueObject);
-		}
-		else if (aType.equals("Boolean") && valueObject instanceof Boolean[])
-		{
-			nvp.setValue(valueObject);
-		}
-		if (newParamSetting)
-		{
-			aCps.setParameterValue(null, nvp.getName(), nvp.getValue());
-		}
-
-	}
-	/**
-	 * Override component's parameters. This overridde effects the in-memory settings. The actual component's descriptor will not be changed.
-	 * 
-	 * @param aResourceSpecifier - in-memory descriptor of the component
-	 * @param aCPE_nvp - parameter represented as name-value pair. If the name of the parameter is found in the component's descriptor its value
-	 * 					will be changed.
-	 * 
-	 * @throws Exception - error during processing
-	 */
-	private boolean overrideParameterIfExists(ResourceSpecifier aResourceSpecifier, org.apache.uima.collection.metadata.NameValuePair aCPE_nvp, String aDescriptorPath, String aComponentName) throws Exception
-	{
-		//	Retrieve component's parameter settings from the in-memory descriptor
-		ConfigurationParameterDeclarations cpd = ((ResourceCreationSpecifier) aResourceSpecifier).getMetaData().getConfigurationParameterDeclarations();
-		//	Get the name of the parameter to find in the component's parameter list
-		String param_name = aCPE_nvp.getName().trim();
-		//	Extract parameter with a matching name from the parameter declaration section of the component's descriptor
-		ConfigurationParameter cparam = cpd.getConfigurationParameter(null, param_name);
-		if (cparam != null)
-		{
-			//	Retrieve component's parameter settings from the in-memory descriptor
-			ConfigurationParameterSettings cps = ((ResourceCreationSpecifier) aResourceSpecifier).getMetaData().getConfigurationParameterSettings();
-			//	Determie if it is a multi-value parameter (array)
-			boolean isMultiValue = cparam.isMultiValued();
-			//	Check if there is a match based on param name
-			if (cparam.getName().equals(param_name))
-			{
-				boolean mandatory = cparam.isMandatory();
-				if (isMultiValue)
-				{
-					//	Override array with values from the CPE descriptor
-					replaceArray(cparam.getType(), mandatory, cps, aCPE_nvp, aDescriptorPath, aComponentName);
-				}
-				else
-				{
-					//	Override primitive parameter with value from the CPE descriptor
-					replacePrimitive(cparam.getType(), mandatory, cps, aCPE_nvp, aDescriptorPath, aComponentName);
-				}
-				return true; // Found a match and did the override
-			}
-
-		}
-		return false; // The parameter does not exist in the component's descriptor
-	}
-	/**
-	 * Replace component's parameters. Its parameter values will be changed to match those defined 
-	 * in the CPE descriptor.  
-	 * 
-	 * @param aResourceSpecifier - component's descriptor containing parameters to override
-	 * @param aCasProcessorCPEConfig - cas processor configuration containing optional parameters to be used for overriding parameters in the descriptor
-	 * @throws Exception - failure during processing
-	 */
-	private void overrideParameterSettings(ResourceSpecifier aResourceSpecifier, CasProcessorConfigurationParameterSettings aCpe_cps, String aDescriptorPath, String aComponentName) throws Exception
-	{
-
-		if (aCpe_cps != null && aCpe_cps.getParameterSettings() != null )
-		{
-			//	Extract new parameters from the CPE descriptor
-			//	Parameters are optional, so test and do the override if necessary
-			org.apache.uima.collection.metadata.NameValuePair[] nvp = 
-				aCpe_cps.getParameterSettings();
-
-
-			for (int i = 0; i < nvp.length; i++)
-			{
-				//	Next parameter to overridde
-				if (nvp[i] != null)
-				{
-					overrideParameterIfExists(aResourceSpecifier, nvp[i], aDescriptorPath, aComponentName);
-				}
-			}
-		}
-	}
-	/**
-	 * Instantiates integrated Cas Processor
-	 * 
-	 * @param aCasProcessorCfg - Cas processor configuration
-	 * @return - Integrated CasProcessor
-	 * @throws ResourceConfigurationException
-	 */
-	private CasProcessor produceIntegratedCasProcessor(CpeCasProcessor aCasProcessorType) throws ResourceConfigurationException
-	{
-		CasProcessor casProcessor = null;
-		ResourceSpecifier resourceSpecifier = null;
-		try
-		{
-			if (aCasProcessorType != null)
-			{
-				String descriptor = getDescriptor(aCasProcessorType);
-				String descriptorPath = CPMUtils.convertToAbsolutePath(System.getProperty("CPM_HOME"), CPM_HOME, descriptor);
-				resourceSpecifier = getSpecifier(descriptorPath);
-
-				CpeSofaMappings sofanamemappings = aCasProcessorType.getSofaNameMappings();
-				HashMap sofamap = new HashMap();
-				if (sofanamemappings != null)
-				{
-					CpeSofaMapping[] sofaNameMappingArray = sofanamemappings.getSofaNameMappings();
-					for (int i = 0; sofaNameMappingArray != null && i < sofaNameMappingArray.length; i++)
-					{
-						CpeSofaMapping aSofaMap = sofaNameMappingArray[i];
-						//if no component sofa name, then set it to default 
-						if (aSofaMap.getComponentSofaName() == null)
-							aSofaMap.setComponentSofaName(CAS.NAME_DEFAULT_TEXT_SOFA);
-						sofamap.put(aSofaMap.getComponentSofaName(), aSofaMap.getCpeSofaName());
-					}
-				}
-				
-				//	Replace parameters in component descriptor with values defined in the CPE descriptor
-				overrideParameterSettings(resourceSpecifier, aCasProcessorType.getConfigurationParameterSettings(), descriptorPath, "CasProcessor:" + aCasProcessorType.getName());
-
-				//create child UimaContext and insert into mInitParams map
-				UimaContextAdmin childContext = uimaContext.createChild(aCasProcessorType.getName(), sofamap);
-				Map additionalParams = new HashMap();
-				additionalParams.put(Resource.PARAM_UIMA_CONTEXT, childContext);
-
-        //need this check to do specific CasDataConsumer processing
-        if (resourceSpecifier instanceof CasConsumerDescription &&
-            !isDefinitionInstanceOf(CasConsumer.class, resourceSpecifier, descriptorPath))
-				{
-					if (UIMAFramework.getLogger().isLoggable(Level.FINEST))
-					{
-						UIMAFramework.getLogger(this.getClass()).logrb(Level.FINEST, this.getClass().getName(), "process",
-						        CPMUtils.CPM_LOG_RESOURCE_BUNDLE, "UIMA_CPM_producing_cas_data_consumer__FINEST",
-						        new Object[] {Thread.currentThread().getName()});
-					}
-					casProcessor = produceCasDataConsumer(CasProcessor.class, resourceSpecifier, additionalParams);
-				}
-				else
-				{
-					//Except for CasDataConsumers, everything else is treated as an AnalysisEngine.
-          //This includes CAS Consumers, which will automatically be wrapped inside AnalysisEngines
-          //by the produceAnalysisEngine method.  It also handles UriSpecifiers for
-          //remote services (for either AE or CAS Consumer) 
-					casProcessor = UIMAFramework.produceAnalysisEngine(resourceSpecifier, getResourceManager(), additionalParams);
-				}
-
-				//	Check if CasProcesser has been instantiated 
-				if (casProcessor == null)
-				{
-					
-					throw new ResourceConfigurationException(new Exception(CpmLocalizedMessage.getLocalizedMessage(CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
-							"UIMA_CPM_EXP_instantiation_exception__WARNING",new Object[] {Thread.currentThread().getName(),aCasProcessorType.getName()}) ));
-				}
-			}
-		}
-		catch (ResourceConfigurationException e)
-		{
-			throw e;
-		}
-		catch (Exception e)
-		{
-			throw new ResourceConfigurationException(ResourceInitializationException.CAS_PROCESSOR_INITIALIZE_FAILED, new Object[] { aCasProcessorType.getName()}, e);
-		}
-		//	Override the name of the component with the name specified in the cpe descriptor
-		//	Uniqueness of names is enforced on names in the cpe descriptor not those defined
-		//	in the component descriptor
-		casProcessor.getProcessingResourceMetaData().setName(aCasProcessorType.getName());
-		
-		return casProcessor;
-
-	}
-	/**
-	 * Instantiates remote Cas Processor
-	 * 
-	 * @param aCasProcessorCfg - Cas Processor Configuration
-	 * @return - Remote CasProcessor
-	 * 
-	 * @throws ResourceConfigurationException
-	 */
-	private CasProcessor produceRemoteCasProcessor(CpeCasProcessor aCasProcessorType) throws ResourceConfigurationException
-	{
-		String protocol = DeployFactory.getProtocol(aCasProcessorType);
-		CasProcessor casProcessor = null;
-		if (Constants.SOCKET_PROTOCOL.equalsIgnoreCase(protocol))
-		{
-			casProcessor = new CasObjectNetworkCasProcessorImpl(aCasProcessorType);
-		}
-		else
-		{
-			//	For remote Cas Processor make sure that the required parameters are defined.
-			//	Specifically, VNS host and port are required. Do validation now. If it fails, the
-			//	ResourceConfigurationException is thrown and we are out here.
-			//			verifyDeploymentParams(aCasProcessorType.getName(), aCasProcessorType.getDeploymentParameters());
-			casProcessor = new NetworkCasProcessorImpl(aCasProcessorType);
-		}
-		return casProcessor;
-	}
-	/**
-	 * Returns an object containing global CPE configuration including:
-	 * <li>Number of documents to process</li>
-	 * <li>Checkpoint configuration</li>
-	 * <li>id of the document begin processing</li>
-	 * 
-	 * @return - Global CPE Configuration
-	 * @throws InstantiationException
-	 */
-	public CpeConfiguration getCPEConfig() throws InstantiationException
-	{
-		try
-		{
-			return getCpeDescriptor().getCpeConfiguration();
-		}
-		catch (Exception e)
-		{
-			throw new InstantiationException(e.getMessage());
-		}
-	}
-	/**
-	 * Returns number of processing threads (Processing Units) 
-	 * @return Number of processing threads
-	 * 
-	 * @throws ResourceConfigurationException
-	 */
-	public int getProcessingUnitThreadCount() throws ResourceConfigurationException
-	{
-		int threadCount;
-
-		try
-		{
-			threadCount = this.getCpeDescriptor().getCpeCasProcessors().getConcurrentPUCount();
-		}
-		catch (Exception e)
-		{
-			
-			
-			throw new ResourceConfigurationException(InvalidXMLException.REQUIRED_ATTRIBUTE_MISSING, new Object[] { "processingUnitThreadCount" }, 
-					new Exception(CpmLocalizedMessage.getLocalizedMessage(CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
-							"UIMA_CPM_EXP_missing_attribute_from_xml_element__WARNING",new Object[] {Thread.currentThread().getName(),"casProcessors","processingUnitThreadCount","<casProcessors>",}) ));
-		}
-
-		return threadCount;
-	}
-	/**
-	 * 
-	 * @return
-	 */
-	public boolean isDefault()
-	{
-		return defaultConfig;
-	}
-	/**
-	 * Returns Cpe Descriptor
-	 * 
-	* @return
-	*/
-	public CpeDescription getCpeDescriptor()
-	{
-		return cpeDescriptor;
-	}
-
-	/**
-	 * Assigns Cpe configuration to use
-	 * 
-	 * @param description
-	 */
-	private void setCpeDescriptor(CpeDescription description)
-	{
-		cpeDescriptor = description;
-	}
-	/**
-	 * Checks uniqueness of a given name. This name is compared against all
-	 * Cas Processors already defined. Cas Processor names must be unique.
-	 *  
-	 * @param aName - name to check 
-	 * @return - true if name is unique, false otherwise
-	 * 
-	 */
-	private boolean isUniqueName(String aName) throws CpeDescriptorException
-	{
-		int index = 0;
-		if (getCpeDescriptor().getCpeCasProcessors() != null && getCpeDescriptor().getCpeCasProcessors().getAllCpeCasProcessors() != null)
-		{
-			index = getCpeDescriptor().getCpeCasProcessors().getAllCpeCasProcessors().length;
-		}
-		for (int i = 0; i < index; i++)
-		{
-			CpeCasProcessor processor = getCpeDescriptor().getCpeCasProcessors().getCpeCasProcessor(i);
-			String name = processor.getName();
-			if (name != null && name.equalsIgnoreCase(aName))
-			{
-				return false;
-			}
-		}
-		return true;
-	}
-	/**
-	 * Checks for existance of two parameters required to launch remote Cas Processor
-	 * vnsHost and vnsPort. If not found the remote CasProcessor can not be located
-	 * since the VNS is not specified. In this case an exception is thrown.
-	 * 
-	 * @param aCasProcessorName
-	 * @param aDepParams
-	 * @throws ResourceConfigurationException
-	 */
-	private void verifyDeploymentParams(String aCasProcessorName, CasProcessorDeploymentParams aDepParams) throws ResourceConfigurationException
-	{
-		if (aDepParams == null)
-		{
-			throw new ResourceConfigurationException(
-					new Exception(CpmLocalizedMessage.getLocalizedMessage(CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
-							"UIMA_CPM_EXP_missing_xml_element__WARNING",new Object[] {Thread.currentThread().getName(),aCasProcessorName,"<deploymentParameters>"}) ));
-		}
-		if (aDepParams == null || aDepParams.getAll() == null)
-		{
-			return; //nothing to do
-		}
-		int totalParamCount = aDepParams.getAll().length; //getparameterCount();
-		boolean vnsHostFound = false;
-		boolean vnsPortFound = false;
-		try
-		{
-			CasProcessorDeploymentParam param = aDepParams.get(Constants.VNS_HOST);
-			if (param == null || param.getParameterValue() == null || param.getParameterValue().trim().length() == 0)
-			{
-				throw new ResourceConfigurationException(ResourceInitializationException.CONFIG_SETTING_ABSENT, new Object[] { "parameter" }, 
-						new Exception(CpmLocalizedMessage.getLocalizedMessage(CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
-								"UIMA_CPM_EXP_deploy_params_not_defined__WARNING",new Object[] {Thread.currentThread().getName(),aCasProcessorName,Constants.VNS_HOST}) ));
-
-			}
-			param = aDepParams.get(Constants.VNS_PORT);
-			if (param == null || param.getParameterValue() == null || param.getParameterValue().trim().length() == 0)
-			{
-				throw new ResourceConfigurationException(ResourceInitializationException.CONFIG_SETTING_ABSENT, new Object[] { "parameter" }, 
-						new Exception(CpmLocalizedMessage.getLocalizedMessage(CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
-								"UIMA_CPM_EXP_deploy_params_not_defined__WARNING",new Object[] {Thread.currentThread().getName(),aCasProcessorName,Constants.VNS_PORT}) ));
-
-			}
-		}
-		catch (ResourceConfigurationException e)
-		{
-			throw e;
-		}
-		catch (Exception e)
-		{
-			throw new ResourceConfigurationException(e);
-		}
-		//		for (int i = 0; i < totalParamCount; i++)
-		//		{
-		//			parameter param = aDepParams.getParameter(i);
-		//			if (Constants.VNS_HOST.equals(param.getName()) && param.getValue() != null && param.getValue().trim().length() > 0)
-		//			{
-		//				vnsHostFound = true;
-		//			}
-		//			else if (Constants.VNS_PORT.equals(param.getName()) && param.getValue() != null && param.getValue().trim().length() > 0)
-		//			{
-		//				vnsPortFound = true;
-		//			}
-		//		}
-		//		//	Check if required params have been found
-		//		if (!vnsHostFound || !vnsPortFound)
-		//		{
-		//			if (!vnsHostFound)
-		//			{
-		//				throw new ResourceConfigurationException(ResourceInitializationException.CONFIG_SETTING_ABSENT, new Object[] { "parameter" }, new Exception("Remote CasProcessor:'" + aCasProcessorName + "' not configured completely.Section '<deploymentParameters>' missing " + Constants.VNS_HOST + " parameter and its value"));
-		//			}
-		//			if (!vnsPortFound)
-		//			{
-		//				throw new ResourceConfigurationException(ResourceInitializationException.CONFIG_SETTING_ABSENT, new Object[] { "parameter" }, new Exception("Remote CasProcessor:'" + aCasProcessorName + "' not configured completely.Section '<deploymentParameters>' missing " + Constants.VNS_PORT + " parameter and its value"));
-		//			}
-		//
-		//		}
-
-	}
-	/**
-	 * Appends given Cas Processor to the list of CasProcessors
-	 * 
-	 * @param aCasProcessor - CasProcessor to add
-	 */
-	public void addCasProcessor(CasProcessor aCasProcessor) throws ResourceConfigurationException
-	{
-		if (!initialized)
-		{
-			addCasProcessor(aCasProcessor.getProcessingResourceMetaData().getName());
-		}
-	}
-	/**
-	 * Adds new Cas Processor with given name.
-	 *  
-	 * @param aCasProcessorName - name of the CasProcessor to add
-	 * 
-	 * @return - 
-	 */
-	private CpeCasProcessor addCasProcessor(String aCasProcessorName) 
-	throws ResourceConfigurationException
-	{
-		CpeCasProcessor newProcessor = null;
-		try
-		{
-			if (!isUniqueName(aCasProcessorName))
-			{
-			throw new ResourceConfigurationException(
-					new Exception(CpmLocalizedMessage.getLocalizedMessage(CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
-							"UIMA_CPM_EXP_duplicate_name__WARNING",new Object[] {Thread.currentThread().getName(),aCasProcessorName}) ));
-			}
-			int index = getCpeDescriptor().getCpeCasProcessors().getAllCpeCasProcessors().length; //getcasProcessorCount();
-
-			if (UIMAFramework.getLogger().isLoggable(Level.FINEST))
-			{
-			UIMAFramework.getLogger(this.getClass()).logrb(Level.FINEST, this.getClass().getName(), "initialize",
-			        CPMUtils.CPM_LOG_RESOURCE_BUNDLE, "UIMA_CPM_add_cp_with_index__FINEST",
-			        new Object[] {Thread.currentThread().getName(), aCasProcessorName, String.valueOf(index)});
-			}
-			CpeCasProcessor processor = getCpeDescriptor().getCpeCasProcessors().getCpeCasProcessor(index - 1);
-
-			if (processor.getCheckpoint() == null)
-			{
-			throw new ResourceConfigurationException(InvalidXMLException.ELEMENT_NOT_FOUND, new Object[] { "checkpoint", "casProcessor" }, 
-					new Exception(CpmLocalizedMessage.getLocalizedMessage(CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
-							"UIMA_CPM_EXP_missing_xml_element__WARNING",new Object[] {Thread.currentThread().getName(),aCasProcessorName,"<checkpoint>"}) ));
-			}
-
-			//	For remote Cas Processor make sure that the required parameters are defined.
-			//	Specifically, VNS host and port are required. Do validation now. If it fails, the
-			//	ResourceConfigurationException is thrown and we are out here.
-			if (Constants.DEPLOYMENT_REMOTE.equals(processor.getDeployment()))
-			{
-				String protocol = DeployFactory.getProtocol(processor);
-				if (Constants.VINCI_PROTOCOL.equals(protocol))
-				{
-					verifyDeploymentParams(aCasProcessorName, processor.getDeploymentParams());
-				}
-			}
-
-			if (processorCount == 0)
-			{
-				newProcessor = processor;
-				copyCasProcessor(newProcessor, aCasProcessorName);
-			}
-			else
-			{
-//				CpeCasProcessor cloneProcessor = getCpeDescriptor().getCpeCasProcessors().getCpeCasProcessor(0);
-
-				newProcessor = new CpeIntegratedCasProcessorImpl();
-				newProcessor.setDescriptor("href"); 
-				//				//	Clone casProcessor from an existing one
-				//newProcessor = cpeDescGen.createcasProcessor(cloneProcessor);
-				copyCasProcessor(newProcessor, aCasProcessorName);
-				getCpeDescriptor().getCpeCasProcessors().addCpeCasProcessor(newProcessor,processorCount);//setCpeCasProcessor(processorCount, newProcessor);
-			}
-			if (UIMAFramework.getLogger().isLoggable(Level.FINEST))
-			{
-				UIMAFramework.getLogger(this.getClass()).log(Level.FINEST, "getCpeDescriptor().getCasProcessors().getCasProcessor.getAttributeValue(name) " + " " + getCpeDescriptor().getCpeCasProcessors().getCpeCasProcessor(processorCount).getAttributeValue("name"));
-				UIMAFramework.getLogger(this.getClass()).log(Level.FINEST, "getCpeDescriptor().getCasProcessors().getCasProcessor(" + "processorCount).getErrorHandling().getMaxConsecutiveRestarts().getAction() " + " " + getCpeDescriptor().getCpeCasProcessors().getCpeCasProcessor(processorCount).getErrorHandling().getMaxConsecutiveRestarts().getAction());
-			}
-			if (!casProcessorConfigMap.containsKey(aCasProcessorName))
-			{
-				casProcessorConfigMap.put(aCasProcessorName, getCpeDescriptor().getCpeCasProcessors().getCpeCasProcessor(processorCount));
-			}
-		}
-		catch( Exception e)
-		{
-			throw new ResourceConfigurationException(e);			
-		}
-		processorCount++;
-		return newProcessor;
-	}
-	/**
-	 * 
-	 * @param aList
-	 * @return
-	 * @throws ResourceConfigurationException
-	 */
-	public String getDescriptor(List aList) throws ResourceConfigurationException
-	{
-		if (aList.size() == 0)
-		{
-			return "";
-		}
-
-		try
-		{
-			String[] colReader = (String[]) aList.get(0);
-			String[] casInitializer = (String[]) aList.get(1);
-
-			getCpeDescriptor().getAllCollectionCollectionReaders()[0].getCollectionIterator().getDescriptor().getInclude().set(colReader[0]);
-			//	Populate collection iterator descriptor path
-			//	Populate collection initializer descriptor path
-			if (casInitializer[0].length() > 0)
-			{
-				getCpeDescriptor().getAllCollectionCollectionReaders()[0].getCasInitializer().getDescriptor().getInclude().set(casInitializer[0]);
-			}
-			else
-			{
-				getCpeDescriptor().getAllCollectionCollectionReaders()[0].removeCasInitializer();
-			}
-
-			int procIndex = 2;
-			//	First check if casProcessors have been previously been added. If not, add them
-			//	to a descriptor.		
-			boolean create = false;
-			int numProcessors = 0;
-			CpeCasProcessors processorList = getCpeDescriptor().getCpeCasProcessors();
-			//	Check if added casProcessors using addCasProcessor API. If not create needed 
-			//	casProcessors and add descriptor paths
-			if (processorCount == 0)
-			{
-				create = true;
-				//	the list contains two other entires besides casProcessors. Namely collection iterator
-				//	and cas Initializer. So to get # of casProcessors in the list subtract 2 non-casProcessor
-				//	entries.
-				numProcessors = aList.size() - procIndex;
-			}
-			else
-			{
-				numProcessors = processorList.getAllCpeCasProcessors().length;
-			}
-			CpeCasProcessor newProcessor = null;
-
-			//	Now add each casProcessor to a descriptor
-			for (int i = 0; i < numProcessors; i++)
-			{
-				String[] casProcInfo = (String[]) aList.get(procIndex + i);
-				if (create)
-				{
-					if (UIMAFramework.getLogger().isLoggable(Level.FINEST))
-					{
-					UIMAFramework.getLogger(this.getClass()).logrb(Level.FINEST, this.getClass().getName(), "initialize",
-					        CPMUtils.CPM_LOG_RESOURCE_BUNDLE, "UIMA_CPM_create_new_cp_from_list__FINEST",
-					        new Object[] {Thread.currentThread().getName(), casProcInfo[0]});
-					}
-					//	The list suppose to contain an array of Strings of size 2.
-					//	Where the the first element is the name of the CasProcessor
-					//	and the second is the descriptor path
-					if (UIMAFramework.getLogger().isLoggable(Level.FINEST))
-					{
-					UIMAFramework.getLogger(this.getClass()).logrb(Level.FINEST, this.getClass().getName(), "initialize",
-					        CPMUtils.CPM_LOG_RESOURCE_BUNDLE, "UIMA_CPM_add_cp_from_list__FINEST",
-					        new Object[] {Thread.currentThread().getName(), casProcInfo[0]});
-					}
-					newProcessor = addCasProcessor(casProcInfo[0]);
-				}
-				else
-				{
-					newProcessor = processorList.getCpeCasProcessor(i);
-				}
-				if (newProcessor != null)
-				{
-					newProcessor.setDescriptor(casProcInfo[1]);
-				}
-			}
-
-			if (create)
-			{
-				//	Set global flag as an indicator that the CPE Descriptor has been instantiated
-				initialized = true;
-			}
-			ByteArrayOutputStream bos = new ByteArrayOutputStream();
-
-			getCpeDescriptor().toXML(bos);
-
-			return bos.toString();
-
-		}
-		catch (Exception e)
-		{
-			throw new ResourceConfigurationException(e);
-		}
-	}
-	/**
-	 * @param newProcessor
-	 * @param aCasProcessor
-	 */
-	private void copyCasProcessor(CpeCasProcessor aProcDesc, String aName)
-	{
-		try
-		{
-			aProcDesc.setName(aName);
-			if (UIMAFramework.getLogger().isLoggable(Level.FINEST))
-			{
-			UIMAFramework.getLogger(this.getClass()).logrb(Level.FINEST, this.getClass().getName(), "initialize",
-			        CPMUtils.CPM_LOG_RESOURCE_BUNDLE, "UIMA_CPM_show_cp_deployment__FINEST",
-			        new Object[] {Thread.currentThread().getName(), aName, aProcDesc.getDeployment()});
-			}
-		}
-		catch (Exception e)
-		{
-			e.printStackTrace();
-		}			
-	}
-	/**
-	 * 
-	 * 
-	 * @param collectionReader - collection reader to use by the CPM
-	 */
-	public void addCollectionReader(BaseCollectionReader collectionReader)
-	{
-		// nothing done as of now; If there is any field that will be accessed
-		// this method can be implemented to copy the values similar to addCasProcessod
-
-	}
-	/**
-	 * Gets the ResourceManager that all components of this CPE should share.
-	 * @return
-	 */
-	public ResourceManager getResourceManager()
-	{
-		return uimaContext.getResourceManager();
-	}
+public class CPEFactory {
+  public static final String CPM_HOME = "${CPM_HOME}";
+
+  private int processorCount = 0;
+
+  private String DEFAULT_CONFIG_FILE = "defaultCpeDescriptor.xml";
+
+  private boolean defaultConfig = true;
+
+  public HashMap casProcessorConfigMap = new HashMap();
+
+  private CpeDescription cpeDescriptor = null;
+
+  private boolean initialized = false;
+
+  private UimaContextAdmin uimaContext;
+
+  private boolean firstTime = true;
+
+  private HashMap cpMap = new HashMap();
+
+  /**
+   * Create a new CPEFactory on which we will later call parse(String) to parse a CPE descriptor.
+   */
+  public CPEFactory(ResourceManager aResourceManager) {
+    uimaContext = UIMAFramework.newUimaContext(UIMAFramework.getLogger(), aResourceManager,
+                    UIMAFramework.newConfigurationManager());
+  }
+
+  /**
+   * Create a new CPEFactory for a CpeDescription that's already been parsed.
+   * 
+   * @param aDescriptor
+   * @param aResourceManager
+   *          the resource manager that all components of this CPE will share If null, a new
+   *          ResourceManager will be created.
+   */
+  public CPEFactory(CpeDescription aDescriptor, ResourceManager aResourceManager)
+                  throws ResourceInitializationException {
+    if (aDescriptor == null) {
+      throw new UIMARuntimeException(new InvalidObjectException(CpmLocalizedMessage
+                      .getLocalizedMessage(CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
+                                      "UIMA_CPM_EXP_no_cpe_descriptor__WARNING",
+                                      new Object[] { Thread.currentThread().getName() })));
+    }
+
+    if (aResourceManager == null) {
+      aResourceManager = UIMAFramework.newDefaultResourceManager();
+    }
+    setCpeDescriptor(aDescriptor);
+    if (aDescriptor != null && aDescriptor instanceof CpeDescriptionImpl) {
+      defaultConfig = false;
+    }
+
+    uimaContext = UIMAFramework.newUimaContext(UIMAFramework.getLogger(), aResourceManager,
+                    UIMAFramework.newConfigurationManager());
+    // if CpeDescription contains a ResourceManagerConfiguration, parse it and use it
+    // to configure the ResourceManager
+    CpeResourceManagerConfiguration resMgrCfgDesc = aDescriptor.getResourceManagerConfiguration();
+    if (resMgrCfgDesc != null) {
+      ResourceManagerConfiguration resMgrCfg;
+      try {
+        if (resMgrCfgDesc.get().length() > 0) {
+          String descriptorPath = CPMUtils.convertToAbsolutePath(System.getProperty("CPM_HOME"),
+                          CPM_HOME, resMgrCfgDesc.get());
+          resMgrCfg = UIMAFramework.getXMLParser().parseResourceManagerConfiguration(
+                          new XMLInputSource(descriptorPath));
+          aResourceManager.initializeExternalResources(resMgrCfg, "/", null);
+        }
+      } catch (InvalidXMLException e) {
+        throw new ResourceInitializationException(e);
+      } catch (IOException e) {
+        throw new ResourceInitializationException(e);
+      }
+    }
+  }
+
+  /**
+   * Creates an object representation for configuration in a given cpe descriptor file.
+   * 
+   * @param aDescriptor -
+   *          path to the descriptor
+   * 
+   * @throws InstantiationException
+   */
+  public void parse(String aDescriptor) throws InstantiationException {
+    defaultConfig = false;
+
+    if (aDescriptor == null || aDescriptor.trim().length() == 0) {
+      throw new UIMARuntimeException(new FileNotFoundException(CpmLocalizedMessage
+                      .getLocalizedMessage(CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
+                                      "UIMA_CPM_EXP_no_cpe_descriptor__WARNING",
+                                      new Object[] { Thread.currentThread().getName() })));
+    }
+
+    try {
+      setCpeDescriptor(CpeDescriptorFactory.produceDescriptor(new FileInputStream(new File(
+                      aDescriptor))));
+
+    } catch (Exception e) {
+      throw new UIMARuntimeException(InvalidXMLException.INVALID_DESCRIPTOR_FILE,
+                      new Object[] { aDescriptor }, e);
+    }
+  }
+
+  /**
+   * Creates an object representation for configuration in a given stream
+   * 
+   * @param aDescriptorStream -
+   *          stream containing cpe description
+   * @throws InstantiationException
+   */
+  public void parse(InputStream aDescriptorStream) throws InstantiationException {
+    defaultConfig = false;
+
+    if (aDescriptorStream == null) {
+      throw new UIMARuntimeException(new IOException(CpmLocalizedMessage.getLocalizedMessage(
+                      CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
+                      "UIMA_CPM_EXP_invalid_cpe_descriptor_stream__WARNING", new Object[] { Thread
+                                      .currentThread().getName() })));
+    }
+
+    try {
+      setCpeDescriptor(CpeDescriptorFactory.produceDescriptor(aDescriptorStream));
+    } catch (Exception e) {
+      throw new UIMARuntimeException(e);
+    }
+  }
+
+  /**
+   * Creates an object representation from default cpe descriptor.
+   * 
+   * @param aDescriptorStream -
+   *          stream containing cpe description
+   * @throws InstantiationException
+   */
+
+  public void parse() {
+    defaultConfig = true;
+    InputStream defaultDescriptorStream = getClass().getResourceAsStream(DEFAULT_CONFIG_FILE);
+    try {
+      setCpeDescriptor(CpeDescriptorFactory.produceDescriptor(defaultDescriptorStream));
+    } catch (Exception e) {
+      throw new UIMARuntimeException(e);
+    } finally {
+      try {
+        defaultDescriptorStream.close();
+      } catch (IOException e) {
+        e.printStackTrace();
+      }
+    }
+
+  }
+
+  /**
+   * Checks if cpe description has been created
+   * 
+   * @throws ConfigurationException
+   */
+  private void checkForErrors() throws ResourceConfigurationException {
+    if (cpeDescriptor == null) {
+      throw new ResourceConfigurationException(new Exception(CpmLocalizedMessage
+                      .getLocalizedMessage(CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
+                                      "UIMA_CPM_EXP_no_cpe_descriptor__WARNING",
+                                      new Object[] { Thread.currentThread().getName() })));
+    }
+  }
+
+  /**
+   * Returns Collection Reader instantiated from configuration in the cpe descriptor. It also
+   * creates and intializes the Cas Initializer if one is defined and associates it with the
+   * CollectionReader.
+   * 
+   * @return - CollectionReader instance
+   * 
+   * @throws ConfigurationException
+   */
+  public BaseCollectionReader getCollectionReader() throws ResourceConfigurationException {
+    checkForErrors();
+    BaseCollectionReader colreader = null;
+    try {
+      CpeCollectionReader reader = (getCpeDescriptor().getAllCollectionCollectionReaders())[0];
+      if (reader == null) {
+        throw new ResourceConfigurationException(InvalidXMLException.ELEMENT_NOT_FOUND,
+                        new Object[] { "<collectionReader>", "<cpeDescriptor>" },
+                        new Exception(CpmLocalizedMessage.getLocalizedMessage(
+                                        CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
+                                        "UIMA_CPM_EXP_missing_required_element__WARNING",
+                                        new Object[] { Thread.currentThread().getName(),
+                                            "<collectionReader>" })));
+      }
+
+      CpeCollectionReaderIterator cit = reader.getCollectionIterator();
+      if (cit == null || cit.getDescriptor() == null || cit.getDescriptor().getInclude() == null) {
+        throw new ResourceConfigurationException(InvalidXMLException.ELEMENT_NOT_FOUND,
+                        new Object[] { "<include>", "<collectionIterator>" },
+                        new Exception(CpmLocalizedMessage.getLocalizedMessage(
+                                        CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
+                                        "UIMA_CPM_EXP_missing_required_element__WARNING",
+                                        new Object[] { Thread.currentThread().getName(),
+                                            "<include>" })));
+      }
+      if (cit.getDescriptor().getInclude().get() == null) {
+        throw new ResourceConfigurationException(InvalidXMLException.ELEMENT_NOT_FOUND,
+                        new Object[] { "<href>", "<collectionIterator>" },
+                        new Exception(CpmLocalizedMessage.getLocalizedMessage(
+                                        CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
+                                        "UIMA_CPM_EXP_missing_attribute_from_xml_element__WARNING",
+                                        new Object[] { Thread.currentThread().getName(), "<href>",
+                                            "<collectionIterator>" })));
+      }
+
+      String descriptorPath = CPMUtils.convertToAbsolutePath(System.getProperty("CPM_HOME"),
+                      CPM_HOME, cit.getDescriptor().getInclude().get());
+      // create new collection reader from the descriptor
+      XMLInputSource in1 = new XMLInputSource(descriptorPath);
+      ResourceSpecifier colReaderSp = UIMAFramework.getXMLParser()
+                      .parseCollectionReaderDescription(in1);
+
+      overrideParameterSettings(colReaderSp, cit.getConfigurationParameterSettings(),
+                      descriptorPath, "Collection Reader");
+
+      // compute sofa mapping for the CAS Initializer
+      CpeSofaMappings sofanamemappings = cit.getSofaNameMappings();
+      HashMap sofamap = new HashMap();
+      if (sofanamemappings != null) {
+        CpeSofaMapping[] sofaNameMappingArray = sofanamemappings.getSofaNameMappings();
+        for (int i = 0; sofaNameMappingArray != null && i < sofaNameMappingArray.length; i++) {
+          CpeSofaMapping aSofaMap = sofaNameMappingArray[i];
+          // if no component sofa name, then set it to default
+          if (aSofaMap.getComponentSofaName() == null)
+            aSofaMap.setComponentSofaName(CAS.NAME_DEFAULT_TEXT_SOFA);
+          sofamap.put(aSofaMap.getComponentSofaName(), aSofaMap.getCpeSofaName());
+        }
+      }
+
+      // create child UimaContext for the CollectionReader
+      UimaContextAdmin collectionReaderContext = uimaContext.createChild("_CollectionReader",
+                      sofamap);
+      Map additionalParams = new HashMap();
+      additionalParams.put(Resource.PARAM_UIMA_CONTEXT, collectionReaderContext);
+      colreader = (BaseCollectionReader) UIMAFramework.produceResource(BaseCollectionReader.class,
+                      colReaderSp, getResourceManager(), additionalParams);
+
+      CpeCollectionReaderCasInitializer casInit = reader.getCasInitializer();
+      if (casInit != null) {
+        if (casInit.getDescriptor() == null) {
+          throw new ResourceConfigurationException(InvalidXMLException.ELEMENT_NOT_FOUND,
+                          new Object[] { "<descriptor>", "<casInitializer>" },
+                          new Exception(CpmLocalizedMessage.getLocalizedMessage(
+                                          CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
+                                          "UIMA_CPM_EXP_missing_required_element__WARNING",
+                                          new Object[] { Thread.currentThread().getName(),
+                                              "<descriptor>" })));
+        }
+        if (casInit.getDescriptor().getInclude() == null) {
+          throw new ResourceConfigurationException(InvalidXMLException.ELEMENT_NOT_FOUND,
+                          new Object[] { "<include>", "<casInitializer>" },
+                          new Exception(CpmLocalizedMessage.getLocalizedMessage(
+                                          CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
+                                          "UIMA_CPM_EXP_missing_required_element__WARNING",
+                                          new Object[] { Thread.currentThread().getName(),
+                                              "<include>" })));
+        }
+        if (casInit.getDescriptor().getInclude().get() == null
+                        || casInit.getDescriptor().getInclude().get().length() == 0) {
+          throw new ResourceConfigurationException(
+                          InvalidXMLException.ELEMENT_NOT_FOUND,
+                          new Object[] { "<href>", "<casInitializer>" },
+                          new Exception(
+                                          CpmLocalizedMessage
+                                                          .getLocalizedMessage(
+                                                                          CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
+                                                                          "UIMA_CPM_EXP_missing_attribute_from_xml_element__WARNING",
+                                                                          new Object[] {
+                                                                              Thread
+                                                                                              .currentThread()
+                                                                                              .getName(),
+                                                                              "<href>",
+                                                                              "<casInitializer>" })));
+        }
+
+        descriptorPath = CPMUtils.convertToAbsolutePath(System.getProperty("CPM_HOME"), CPM_HOME,
+                        casInit.getDescriptor().getInclude().get());
+
+        File casInitializerSpecifierFile = new File(descriptorPath);
+        XMLInputSource in4 = new XMLInputSource(casInitializerSpecifierFile);
+        ResourceSpecifier casIniSp = UIMAFramework.getXMLParser().parseCasInitializerDescription(
+                        in4);
+
+        overrideParameterSettings(casIniSp, casInit.getConfigurationParameterSettings(),
+                        descriptorPath, "Cas Initializer");
+
+        // compute sofa mapping for the CAS Initializer
+        CpeSofaMappings sofaNamemappings = casInit.getSofaNameMappings();
+        sofamap = new HashMap();
+        if (sofaNamemappings != null) {
+          CpeSofaMapping[] sofaNameMappingArray = sofaNamemappings.getSofaNameMappings();
+          for (int i = 0; sofaNameMappingArray != null && i < sofaNameMappingArray.length; i++) {
+            CpeSofaMapping aSofaMap = sofaNameMappingArray[i];
+            // if no component sofa name, then set it to default
+            if (aSofaMap.getComponentSofaName() == null)
+              aSofaMap.setComponentSofaName(CAS.NAME_DEFAULT_TEXT_SOFA);
+            sofamap.put(aSofaMap.getComponentSofaName(), aSofaMap.getCpeSofaName());
+          }
+        }
+
+        // create child UimaContext for the CAS Initializer
+        UimaContextAdmin initializerContext = uimaContext.createChild("_CasInitializer", sofamap);
+        additionalParams.put(Resource.PARAM_UIMA_CONTEXT, initializerContext);
+
+        Object initializer = produceInitializer(casIniSp, additionalParams);
+
+        if (initializer instanceof CasDataInitializer) {
+          ((CasDataCollectionReader) colreader).setCasInitializer((CasDataInitializer) initializer);
+        } else if (initializer instanceof CasInitializer) {
+          ((CollectionReader) colreader).setCasInitializer((CasInitializer) initializer);
+        } else {
+          throw new ResourceConfigurationException(InvalidXMLException.INVALID_ELEMENT_TYPE,
+                          new Object[] { "CasDataInitializer", initializer.getClass().getName() },
+                          new Exception(CpmLocalizedMessage.getLocalizedMessage(
+                                          CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
+                                          "UIMA_CPM_EXP_incompatible_component__WARNING",
+                                          new Object[] { Thread.currentThread().getName(),
+                                              "CasInitializer", "CasDataInitializer",
+                                              initializer.getClass().getName() })));
+        }
+      }
+      // Retrieve number of entities to process from CPE configuration
+      long numDocs2Process = getCPEConfig().getNumToProcess();
+      if (UIMAFramework.getLogger().isLoggable(Level.CONFIG)) {
+        UIMAFramework.getLogger(this.getClass()).logrb(
+                        Level.CONFIG,
+                        this.getClass().getName(),
+                        "process",
+                        CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
+                        "UIMA_CPM_show_docs_to_process__CONFIG",
+                        new Object[] { Thread.currentThread().getName(),
+                            String.valueOf(numDocs2Process) });
+      }
+      // Provide CollectionReader with the number of documents to process
+      ((ConfigurableResource_ImplBase) colreader).setConfigParameterValue("processSize",
+                      new Integer(new Long(numDocs2Process).intValue()));
+      CpeConfiguration cpeType = getCpeDescriptor().getCpeConfiguration();
+      if (cpeType != null && cpeType.getStartingEntityId() != null
+                      && cpeType.getStartingEntityId().trim().length() > 0) {
+        if (UIMAFramework.getLogger().isLoggable(Level.FINEST)) {
+          UIMAFramework.getLogger(this.getClass()).logrb(
+                          Level.FINEST,
+                          this.getClass().getName(),
+                          "process",
+                          CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
+                          "UIMA_CPM_show_start_doc_id__FINEST",
+                          new Object[] { Thread.currentThread().getName(),
+                              cpeType.getStartingEntityId() });
+        }
+        colreader.getProcessingResourceMetaData().getConfigurationParameterSettings()
+                        .setParameterValue("startNumber", cpeType.getStartingEntityId().trim());
+        if (UIMAFramework.getLogger().isLoggable(Level.FINEST)) {
+          UIMAFramework.getLogger(this.getClass()).log(
+                          Level.FINEST,
+                          "Retrieved Documents Starting with DocId ::"
+                                          + colreader.getProcessingResourceMetaData()
+                                                          .getConfigurationParameterSettings()
+                                                          .getParameterValue("startNumber"));
+        }
+      }
+
+      if (UIMAFramework.getLogger().isLoggable(Level.FINEST)) {
+        UIMAFramework.getLogger(this.getClass()).log(
+                        Level.FINEST,
+                        "Retrieved processSize ::"
+                                        + ((ConfigurableResource_ImplBase) colreader)
+                                                        .getConfigParameterValue("processSize"));
+      }
+      return colreader;
+    } catch (ResourceConfigurationException e) {
+      throw e;
+    } catch (Exception e) {
+      throw new ResourceConfigurationException(e);
+    }
+  }
+
+  /**
+   * Returns an array of Cas Processors instantiated from the cpe descriptor
+   * 
+   * @return - array of CasProcessor instances
+   * 
+   * @throws ResourceConfigurationException
+   */
+  public CasProcessor[] getCasProcessors() throws ResourceConfigurationException {
+    checkForErrors();
+    try {
+      if (getCpeDescriptor().getCpeCasProcessors() == null) {
+        throw new ResourceConfigurationException(InvalidXMLException.ELEMENT_NOT_FOUND,
+                        new Object[] { "<casProcessors>", "<cpeDescriptor>" }, new Exception(
+                                        CpmLocalizedMessage.getLocalizedMessage(
+                                                        CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
+                                                        "UIMA_CPM_EXP_bad_cpe_descriptor__WARNING",
+                                                        new Object[] { Thread.currentThread()
+                                                                        .getName() })));
+      }
+      CpeCasProcessors ct = getCpeDescriptor().getCpeCasProcessors();
+
+      CpeCasProcessor[] casProcessorList = ct.getAllCpeCasProcessors();
+      Vector v = new Vector();
+      if (casProcessorList == null || casProcessorList.length == 0) {
+        throw new ResourceConfigurationException(InvalidXMLException.ELEMENT_NOT_FOUND,
+                        new Object[] { "<casProcessor>", "<casProcessors>" }, new Exception(
+                                        CpmLocalizedMessage.getLocalizedMessage(
+                                                        CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
+                                                        "UIMA_CPM_EXP_bad_cpe_descriptor__WARNING",
+                                                        new Object[] { Thread.currentThread()
+                                                                        .getName() })));
+      }
+
+      Hashtable namesMap = new Hashtable();
+      for (int i = 0; i < casProcessorList.length; i++) {
+        CpeCasProcessor processorType = casProcessorList[i];
+        if (processorType == null) {
+          throw new ResourceConfigurationException(InvalidXMLException.ELEMENT_NOT_FOUND,
+                          new Object[] { "<casProcessor>", "<casProcessors>" },
+                          new Exception(CpmLocalizedMessage.getLocalizedMessage(
+                                          CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
+                                          "UIMA_CPM_EXP_bad_cpe_descriptor__WARNING",
+                                          new Object[] { Thread.currentThread().getName() })));
+        }
+
+        // Check for duplicate Cas Processor names. Names must be unique
+        if (namesMap.containsKey(processorType.getName())) {
+          throw new ResourceConfigurationException(InvalidXMLException.INVALID_CPE_DESCRIPTOR,
+                          new Object[] { "casProcessor", "name" }, new CPMException(
+                                          CpmLocalizedMessage.getLocalizedMessage(
+                                                          CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
+                                                          "UIMA_CPM_EXP_duplicate_name__WARNING",
+                                                          new Object[] {
+                                                              Thread.currentThread().getName(),
+                                                              processorType.getName() })));
+        } else {
+          namesMap.put(processorType.getName(), processorType.getName());
+        }
+
+        String deploymentType = processorType.getDeployment();
+        if (deploymentType == null) {
+          throw new ResourceConfigurationException(
+                          InvalidXMLException.REQUIRED_ATTRIBUTE_MISSING,
+                          new Object[] { "deployment", "<casProcessor>" },
+                          new Exception(
+                                          CpmLocalizedMessage
+                                                          .getLocalizedMessage(
+                                                                          CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
+                                                                          "UIMA_CPM_EXP_missing_attribute_from_xml_element__WARNING",
+                                                                          new Object[] {
+                                                                              Thread
+                                                                                              .currentThread()
+                                                                                              .getName(),
+                                                                              processorType
+                                                                                              .getName(),
+                                                                              "deployment",
+                                                                              "casProcessor" })));
+        }
+        CasProcessor casProcessor = null;
+        String deployModel = "";
+        boolean cpInMap = false;
+
+        // Check if the CP has already been instantiated. The map holds one instance of a CP with a
+        // given name
+        // The purpose of the map is to provide access to CP operational parameters. This is needed
+        // to
+        // determine if multiple instances of the CP are allowed.
+        if (cpMap.containsKey(processorType.getName())) {
+          cpInMap = true; // the CasProcessor is in the map
+          casProcessor = (CasProcessor) cpMap.get(processorType.getName());
+          // Check operational parameters to determine if multiple instances of the CP are allowed
+          if (!casProcessor.getProcessingResourceMetaData().getOperationalProperties()
+                          .isMultipleDeploymentAllowed()) {
+            continue; // one instance already created. Multiple instances of this CP not allowed
+          }
+        }
+
+        if (Constants.DEPLOYMENT_LOCAL.equals(deploymentType.toLowerCase())) {
+          casProcessor = produceLocalCasProcessor(processorType);
+          deployModel = Constants.DEPLOYMENT_LOCAL;
+        } else if (Constants.DEPLOYMENT_INTEGRATED.equals(deploymentType.toLowerCase())) {
+
+          casProcessor = produceIntegratedCasProcessor(processorType);
+          deployModel = Constants.DEPLOYMENT_INTEGRATED;
+        } else if (Constants.DEPLOYMENT_REMOTE.equals(deploymentType.toLowerCase())) {
+          casProcessor = produceRemoteCasProcessor(processorType);
+          deployModel = Constants.DEPLOYMENT_REMOTE;
+        } else {
+          throw new ResourceConfigurationException(InvalidXMLException.REQUIRED_ATTRIBUTE_MISSING,
+                          new Object[] { "deployment", "<casProcessor>" },
+                          new Exception(CpmLocalizedMessage.getLocalizedMessage(
+                                          CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
+                                          "UIMA_CPM_Exception_invalid_deployment__WARNING",
+                                          new Object[] { Thread.currentThread().getName(),
+                                              processorType.getName(), deploymentType })));
+        }
+
+        // Add the casProcessor instantiated above to the map. The map is used to check if
+        // multiple instances of the cp are allowed. Need to store an instance in the map
+        // since the only way to determine whether or not multiple instances are allowed is
+        // to check OperationalProperties in the CP metadata.
+        if (!cpInMap) {
+          cpMap.put(processorType.getName(), casProcessor);
+        }
+
+        String name = casProcessor.getProcessingResourceMetaData().getName();
+        if (!casProcessorConfigMap.containsKey(name)) {
+          casProcessorConfigMap.put(name, processorType);
+        } else {
+          // Throw an exception due to a non-unique name. CPM requires Cas Processors to have a
+          // unique name.
+          // The unique name enforcement for Local and Remote CP's is done
+          // above 'if ( namesMap.containsKey(processorType.getName()))'. In case of integrated CP,
+          // the
+          // name is taken from the CP descriptor. For Local and Remote, the names are taken from
+          // the
+          // CPE descriptor
+          if (firstTime && Constants.DEPLOYMENT_INTEGRATED.equalsIgnoreCase(deployModel)) {
+            throw new ResourceConfigurationException(new CPMException(CpmLocalizedMessage
+                            .getLocalizedMessage(CPMUtils.CPM_LOG_RESOURCE_BUNDLE,

[... 999 lines stripped ...]