blob: d6e95d295e59e2698d22578fa8c688895b93aa73 [file] [log] [blame]
/*
* 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.cpe.model;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import org.apache.uima.UIMAFramework;
import org.apache.uima.analysis_engine.TaeDescription;
import org.apache.uima.application.metadata.UimaApplication;
import org.apache.uima.collection.CasConsumerDescription;
import org.apache.uima.collection.CollectionReaderDescription;
import org.apache.uima.collection.metadata.CasProcessorConfigurationParameterSettings;
import org.apache.uima.collection.metadata.CpeCasProcessor;
import org.apache.uima.collection.metadata.CpeCollectionReader;
import org.apache.uima.collection.metadata.CpeCollectionReaderCasInitializer;
import org.apache.uima.collection.metadata.CpeDescription;
import org.apache.uima.collection.metadata.CpeDescriptorException;
import org.apache.uima.collection.metadata.NameValuePair;
import org.apache.uima.resource.ResourceInitializationException;
import org.apache.uima.resource.ResourceSpecifier;
import org.apache.uima.resource.URISpecifier;
import org.apache.uima.resource.metadata.TypeSystemDescription;
import org.apache.uima.tools.debug.util.Trace;
import org.apache.uima.util.CasCreationUtils;
import org.apache.uima.util.InvalidXMLException;
import org.apache.uima.util.XMLInputSource;
import org.xml.sax.SAXException;
/**
* CpeDescriptorModel
* Collection Reader Model
* xml Descriptor
* Cas Initializer
* cpeCasProcessorModelList
* CpeCasProcessorModel 1
* xml Descriptor
* CpeCasProcessorModel 2
* xml Descriptor
*
*/
public class CpeDescriptorModel {
// UIMA Application for this CpeDescriptorModel
protected UimaApplication mUimaApplication = null;
// List of CollectionReaderModel
protected List collectionReaderModelList = null;
// List of CpeCasProcessorModel
protected List cpeCasProcessorModelList = null;
// UIMA Objects
protected CpeDescription cpeDesc;
protected CpeCollectionReader[] collRdrs;
protected CpeCasProcessor[] casProcs;
// List of ResourceSpecifier
protected List resourceSpecifierList = null;
// List of ResourceSpecifier for AnalysisEngine
protected List analysisEngineList = null;
protected List casConsumerList = null;
protected List typeSystemList = null;
protected TypeSystemDescription mergedTypeSystemDescription = null;
/*************************************************************************/
protected CpeDescriptorModel () {
}
static public CpeDescriptorModel createInstance (String cpeXmlDescriptorFile)
{
try {
CpeDescription cpeDescription = UIMAFramework.getXMLParser().parseCpeDescription(new XMLInputSource(new File(cpeXmlDescriptorFile)));
return createInstance (cpeXmlDescriptorFile, cpeDescription);
} catch (InvalidXMLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
static public CpeDescriptorModel createInstance (String cpeXmlDescriptorFile,
CpeDescription cpeDescription)
{
CpeDescriptorModel cpeModel = new CpeDescriptorModel ();
try {
cpeModel.cpeDesc = cpeDescription;
// Collection Reader
cpeModel.collRdrs = cpeModel.cpeDesc.getAllCollectionCollectionReaders();
cpeModel.collectionReaderModelList = new ArrayList();
if (cpeModel.collRdrs != null && cpeModel.collRdrs.length>0) {
for (int i=0; i<cpeModel.collRdrs.length; ++i) {
cpeModel.collectionReaderModelList.add(new UimaCollectionReader(cpeModel,
cpeModel.collRdrs[i], null));
}
}
/*****************************************************************/
// CPE Cas Processors
cpeModel.casProcs = cpeModel.cpeDesc.getCpeCasProcessors().getAllCpeCasProcessors();
if (cpeModel.casProcs == null) {
// Empty Cpe Descriptor
return cpeModel;
}
// Get list of CpeCasProcessor which can be an AE or a Cas Consumer
// For each CpeCasProcessor, get its type system (insert in cpeModel.typeSystemList)
cpeModel.cpeCasProcessorModelList = new ArrayList();
List specifierList = new ArrayList();
List aeList = new ArrayList();
List consumerList = new ArrayList();
cpeModel.typeSystemList = new ArrayList();
for (int i=0; i < cpeModel.casProcs.length; i++) {
// CpeCasProcessor casProc = model.casProcs[i];
printCpeCasProcessor(cpeModel.casProcs[i]);
String specifierFile = cpeModel.casProcs[i].getDescriptor();
ResourceSpecifier specifier = UIMAFramework.getXMLParser().
parseResourceSpecifier(new XMLInputSource(specifierFile));
specifierList.add(specifier);
cpeModel.cpeCasProcessorModelList.add(new CpeCasProcessorModel(cpeModel, cpeModel.casProcs[i], specifier));
if (cpeModel.isCasConsumerSpecifier(specifier)) {
consumerList.add(specifier);
} else {
aeList.add(specifier);
}
// Get type system
cpeModel.typeSystemList.add(getTypeSystemDescription(specifier));
}
if (specifierList.size() > 0)
cpeModel.resourceSpecifierList = specifierList;
if (aeList.size() > 0)
cpeModel.analysisEngineList = aeList;
if (consumerList.size() > 0)
cpeModel.casConsumerList = consumerList;
// Create Merged Type System
cpeModel.mergedTypeSystemDescription = CasCreationUtils.mergeTypeSystems(cpeModel.typeSystemList);
// Set Name and Description
cpeModel.mergedTypeSystemDescription.setName("Merged Type System for ???");
String descr = "Merge TSs of: ";
for (int i=0; i<cpeModel.casProcs.length; ++i) {
if (i > 0) {
descr += ", ";
}
descr += ((CpeCasProcessor) cpeModel.casProcs[i]).getName();
}
cpeModel.mergedTypeSystemDescription.setDescription(descr);
StringWriter sw = new StringWriter();
cpeModel.mergedTypeSystemDescription.toXML(sw);
// String taeDescString = new String(sw.toString());
sw.close();
// Trace.trace(taeDescString);
} catch (InvalidXMLException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
} catch (CpeDescriptorException e) {
e.printStackTrace();
return null;
} catch (ResourceInitializationException e) {
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return cpeModel;
} // createInstance
static public void printCpeCasProcessor (CpeCasProcessor cpeCasProc)
{
CasProcessorConfigurationParameterSettings settings = cpeCasProc.getConfigurationParameterSettings();
if (settings != null) {
printNameValuePairs (settings.getParameterSettings());
}
}
static public void printNameValuePairs (NameValuePair[] nvs)
{
for (int i=0; i<nvs.length; ++i) {
String name = nvs[i].getName();
Trace.trace("Param name:" + nvs[i].getName());
Object aValue = nvs[i].getValue();
if (aValue == null) {
System.out.println(" no value");
}
if (aValue instanceof String) {
} else if (aValue instanceof Integer) {
System.out.println(" Integer" + ((Integer) aValue).intValue());
} else if (aValue instanceof Float) {
} else if (aValue instanceof Boolean) {
} else if (aValue instanceof Object[]) {
Object[] obj = (Object[])aValue;
System.out.println(" Object[]:" + obj.length);
for (int k = 0; k < obj.length; k++) {
if (obj[k] instanceof String) {
System.out.println(" [" + k + "]:" + obj[k].toString());
}
else if (obj[k] instanceof Integer) {
System.out.println(" [" + k + "]:" + ((Integer)obj[k]).intValue());
}
else if (obj[k] instanceof Float) {
System.out.println(" [" + k + "]:" + ((Float)obj[k]).floatValue());
} else if (obj[k] instanceof Boolean) {
System.out.println(" [" + k + "]:" + ((Boolean)obj[k]).booleanValue());
}
}
} else {
}
}
}
static public CpeDescriptorModel printCpeXmlDescriptor (String cpeXmlDescriptorFile )
{
CpeDescriptorModel cpeModel = new CpeDescriptorModel ();
try {
cpeModel.cpeDesc =
UIMAFramework.getXMLParser().parseCpeDescription(new XMLInputSource(new File(cpeXmlDescriptorFile)));
// Collection Reader
cpeModel.collRdrs = cpeModel.cpeDesc.getAllCollectionCollectionReaders();
cpeModel.collectionReaderModelList = new ArrayList();
if (cpeModel.collRdrs != null && cpeModel.collRdrs.length>0) {
for (int i=0; i<cpeModel.collRdrs.length; ++i) {
cpeModel.collectionReaderModelList.add(new UimaCollectionReader(cpeModel,
cpeModel.collRdrs[i], null));
}
}
/*****************************************************************/
// CPE Cas Processors
cpeModel.casProcs = cpeModel.cpeDesc.getCpeCasProcessors().getAllCpeCasProcessors();
if (cpeModel.casProcs == null) {
// Empty Cpe Descriptor
return cpeModel;
}
// Get list of CpeCasProcessor which can be an AE or a Cas Consumer
// For each CpeCasProcessor, get its type system (insert in cpeModel.typeSystemList)
cpeModel.cpeCasProcessorModelList = new ArrayList();
List specifierList = new ArrayList();
List aeList = new ArrayList();
List consumerList = new ArrayList();
cpeModel.typeSystemList = new ArrayList();
for (int i=0; i < cpeModel.casProcs.length; i++) {
// CpeCasProcessor casProc = model.casProcs[i];
String specifierFile = cpeModel.casProcs[i].getDescriptor();
ResourceSpecifier specifier = UIMAFramework.getXMLParser().
parseResourceSpecifier(new XMLInputSource(specifierFile));
specifierList.add(specifier);
cpeModel.cpeCasProcessorModelList.add(new CpeCasProcessorModel(cpeModel, cpeModel.casProcs[i], specifier));
if (cpeModel.isCasConsumerSpecifier(specifier)) {
consumerList.add(specifier);
} else {
aeList.add(specifier);
}
// Get type system
cpeModel.typeSystemList.add(getTypeSystemDescription(specifier));
}
if (specifierList.size() > 0)
cpeModel.resourceSpecifierList = specifierList;
if (aeList.size() > 0)
cpeModel.analysisEngineList = aeList;
if (consumerList.size() > 0)
cpeModel.casConsumerList = consumerList;
// Create Merged Type System
cpeModel.mergedTypeSystemDescription = CasCreationUtils.mergeTypeSystems(cpeModel.typeSystemList);
// Set Name and Description
cpeModel.mergedTypeSystemDescription.setName("Merged Type System for ???");
String descr = "Merge TSs of: ";
for (int i=0; i<cpeModel.casProcs.length; ++i) {
if (i > 0) {
descr += ", ";
}
descr += ((CpeCasProcessor) cpeModel.casProcs[i]).getName();
}
cpeModel.mergedTypeSystemDescription.setDescription(descr);
StringWriter sw = new StringWriter();
cpeModel.mergedTypeSystemDescription.toXML(sw);
// String taeDescString = new String(sw.toString());
sw.close();
// Trace.trace(taeDescString);
} catch (InvalidXMLException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
} catch (CpeDescriptorException e) {
e.printStackTrace();
return null;
} catch (ResourceInitializationException e) {
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return cpeModel;
} // createInstance
/*************************************************************************/
static public TypeSystemDescription getTypeSystemDescription (ResourceSpecifier specifier)
{
TypeSystemDescription tsDescription = null;
try {
if (specifier instanceof TaeDescription) {
TaeDescription tae = (TaeDescription) specifier;
if ( tae.isPrimitive() ) {
tsDescription = tae.getAnalysisEngineMetaData().getTypeSystem();
} else {
tsDescription = CasCreationUtils.mergeDelegateAnalysisEngineTypeSystems(tae);
}
} else if (specifier instanceof CasConsumerDescription) {
CasConsumerDescription ccDescr = (CasConsumerDescription) specifier;
tsDescription = ccDescr.getCasConsumerMetaData().getTypeSystem();
} else if (specifier instanceof CollectionReaderDescription) {
CollectionReaderDescription crDescr = (CollectionReaderDescription) specifier;
tsDescription = crDescr.getCollectionReaderMetaData().getTypeSystem();
}
} catch (ResourceInitializationException e) {
e.printStackTrace();
}
return tsDescription;
} // getTypeSystemDescription
/**
* Return true if the ResourceSpecifier is CasConsumerDescription
*
* @param specifier
* @return
* @return boolean
*/
private boolean isCasConsumerSpecifier(ResourceSpecifier specifier)
{
if (specifier instanceof CasConsumerDescription) {
return true;
} else if (specifier instanceof URISpecifier) {
URISpecifier uriSpec = (URISpecifier)specifier;
return URISpecifier.RESOURCE_TYPE_CAS_CONSUMER.equals(uriSpec.getResourceType());
}
return false;
}
private void openCpeDescriptor (File aFile) throws InvalidXMLException,
IOException, CpeDescriptorException
{
// Parse
cpeDesc =
UIMAFramework.getXMLParser().parseCpeDescription(new XMLInputSource(aFile));
// Collection Reader
collRdrs = cpeDesc.getAllCollectionCollectionReaders(); //more than one??
CpeCollectionReader collRdr = null;
if (collRdrs != null && collRdrs.length > 0) {
// collRdr.getDescriptor().getInclude().get();
collRdr = collRdrs[0];
}
// CAS Initializer
CpeCollectionReaderCasInitializer casIni = null;
if (collRdr != null) {
casIni = collRdr.getCasInitializer();
}
if (casIni != null) {
String casIniDescFile = casIni.getDescriptor().getInclude().get();
}
// CAS Processors
casProcs = cpeDesc.getCpeCasProcessors().getAllCpeCasProcessors();
for (int i=0; i < casProcs.length; i++) {
CpeCasProcessor casProc = casProcs[i];
String specifierFile = casProcs[i].getDescriptor();
ResourceSpecifier specifier = UIMAFramework.getXMLParser().
parseResourceSpecifier(new XMLInputSource(specifierFile));
// if (isCasConsumerSpecifier(specifier)) {
// addConsumer(specifierFile);
// } else {
// addTae(specifierFile);
// }
}
}
/*************************************************************************/
public void setUimaApplication (UimaApplication model) {
mUimaApplication = model;
}
// public UimaCasProcessor getUimaCasProcessor(String casProcessorName) {
// return mUimaApplication.getUimaCasProcessor(casProcessorName);
// }
/*************************************************************************/
/**
* @return Returns the casProcs.
*/
public CpeCasProcessor[] getCasProcs() {
return casProcs;
}
/**
* @param casProcs The casProcs to set.
*/
public void setCasProcs(CpeCasProcessor[] casProcs) {
this.casProcs = casProcs;
}
/**
* @return Returns the collRdrs.
*/
public CpeCollectionReader[] getCollRdrs() {
return collRdrs;
}
/**
* @param collRdrs The collRdrs to set.
*/
public void setCollRdrs(CpeCollectionReader[] collRdrs) {
this.collRdrs = collRdrs;
}
/**
* @return Returns the cpeDesc.
*/
public CpeDescription getCpeDesc() {
return cpeDesc;
}
/**
* @param cpeDesc The cpeDesc to set.
*/
public void setCpeDesc(CpeDescription cpeDesc) {
this.cpeDesc = cpeDesc;
}
/**
* @return Returns the analysisEngineList.
*/
public List getAnalysisEngineList() {
return analysisEngineList;
}
/**
* @param analysisEngineList The analysisEngineList to set.
*/
public void setAnalysisEngineList(List analysisEngineList) {
this.analysisEngineList = analysisEngineList;
}
/**
* @return Returns the casConsumerList.
*/
public List getCasConsumerList() {
return casConsumerList;
}
/**
* @param casConsumerList The casConsumerList to set.
*/
public void setCasConsumerList(List casConsumerList) {
this.casConsumerList = casConsumerList;
}
/**
* @return Returns the mergedTypeSystemDescription.
*/
public TypeSystemDescription getMergedTypeSystemDescription() {
return mergedTypeSystemDescription;
}
/**
* @return Returns the resourceSpecifierList.
*/
public List getResourceSpecifierList() {
return resourceSpecifierList;
}
/**
* @return Returns the cpeCasProcessorModelList.
*/
public List getCpeCasProcessorModelList() {
return cpeCasProcessorModelList;
}
/**
* @param cpeCasProcessorModelList The cpeCasProcessorModelList to set.
*/
public void setCpeCasProcessorModelList(List cpeCasProcessorModelList) {
this.cpeCasProcessorModelList = cpeCasProcessorModelList;
}
public CpeCasProcessorModel getCpeCasProcessorModel (String name)
{
for (int i=0; i<cpeCasProcessorModelList.size(); ++i) {
if ( name.equals(((CpeCasProcessorModel) cpeCasProcessorModelList.get(i)).getName()) ) {
return (CpeCasProcessorModel) cpeCasProcessorModelList.get(i);
}
}
Trace.trace(" *** Cannot find CpeCasProcessorModel: " + name + " ***");
return null;
}
/**
* @return Returns the collectionReaderModelList.
*/
public List getCollectionReaderModelList() {
return collectionReaderModelList;
}
/**
* @param collectionReaderModelList The collectionReaderModelList to set.
*/
public void setCollectionReaderModelList(List collectionReaderModelList) {
this.collectionReaderModelList = collectionReaderModelList;
}
}