blob: 0d88135310660751ce88f77106b1a1b974357c93 [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.aae.deployment.impl;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.apache.uima.Constants;
import org.apache.uima.UIMAFramework;
import org.apache.uima.aae.deployment.AEDeploymentConstants;
import org.apache.uima.aae.deployment.AEDeploymentMetaData;
import org.apache.uima.aae.deployment.AEService;
import org.apache.uima.aae.deployment.AsyncAggregateErrorConfiguration;
import org.apache.uima.aae.deployment.AsyncPrimitiveErrorConfiguration;
import org.apache.uima.analysis_engine.AnalysisEngineDescription;
import org.apache.uima.resource.ResourceCreationSpecifier;
import org.apache.uima.resource.ResourceManager;
import org.apache.uima.resource.ResourceSpecifier;
import org.apache.uima.resource.metadata.Import;
import org.apache.uima.resource.metadata.impl.Import_impl;
import org.apache.uima.resource.metadata.impl.MetaDataObject_impl;
import org.apache.uima.resource.metadata.impl.PropertyXmlInfo;
import org.apache.uima.resource.metadata.impl.XmlizationInfo;
import org.apache.uima.tools.debug.util.Trace;
import org.apache.uima.util.InvalidXMLException;
import org.apache.uima.util.XMLInputSource;
import org.apache.uima.util.XMLParser;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;
/**
*
*
*/
public class AEService_Impl extends MetaDataObject_impl implements AEService, AEDeploymentConstants {
protected String endPoint = null;
protected String brokerURL = null;
protected int prefetch = 0; // default to 0
protected AEDeploymentMetaData analysisEngineDeploymentMetaData;
protected Import importDescriptor;
protected boolean importResolved = false;
protected ResourceSpecifier topAnalysisEngineDescription;
protected boolean cPlusPlusTopAE = false;
protected String customValue; // <custom name=....>
protected List<NameValue> environmentVariables = new ArrayList<NameValue>();
/** ********************************************************************** */
public AEService_Impl() {
}
/** ********************************************************************** */
protected ResourceSpecifier resolveImport(ResourceManager aResourceManager)
throws InvalidXMLException {
// Trace.err("resolveImport: " + importDescriptor.getLocation());
// make sure Import's relative path base is set, to allow for
// users who create new import objects
// Trace.err("resolveImport 1 - getSourceUrlString: " + importDescriptor.getSourceUrlString());
if (importDescriptor instanceof Import_impl) {
((Import_impl) importDescriptor).setSourceUrlIfNull(this.getSourceUrl());
}
// locate import target
URL url = importDescriptor.findAbsoluteUrl(aResourceManager);
// Trace.err("resolveImport 2 - getSourceUrlString: " + importDescriptor.getSourceUrlString());
// Trace.err("resolveImport 3 - findAbsoluteUrl: " + url.toString());
// parse import target
XMLInputSource input;
try {
input = new XMLInputSource(url);
} catch (IOException e) {
throw new InvalidXMLException(InvalidXMLException.IMPORT_FAILED_COULD_NOT_READ_FROM_URL,
new Object[] { url, importDescriptor.getSourceUrlString() }, e);
}
ResourceSpecifier spec = UIMAFramework.getXMLParser().parseResourceSpecifier(input);
// Trace.err("Top AE sourceUrl: " + ((AnalysisEngineDescription) spec).getSourceUrlString());
return spec;
}
/**
* Overridden to provide custom XMLization.
*
* @see org.apache.uima.util.XMLizable#buildFromXMLElement(org.w3c.dom.Element,
* org.apache.uima.util.XMLParser)
*/
public void buildFromXMLElement(Element aElement, XMLParser aParser,
XMLParser.ParsingOptions aOptions) throws InvalidXMLException {
// Trace.trace();
NodeList childNodes = aElement.getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++) {
Node curNode = childNodes.item(i);
if (curNode instanceof Element) {
Element elem = (Element) curNode;
if (TAG_INPUT_QUEUE.equalsIgnoreCase(elem.getTagName())) {
checkAndSetInputQueueAttributes(elem);
} else if (TAG_TOP_DESCRIPTOR.equalsIgnoreCase(elem.getTagName())) {
// setTopDescriptor(XMLUtils.getText(elem));
// setImportByLocation("");
NodeList nodes = elem.getChildNodes();
if (nodes.getLength() > 0) {
// Should be an "import"
for (int k = 0; k < nodes.getLength(); ++k) {
Node n = nodes.item(k);
if (!(n instanceof Element)) {
// Trace.err("NOT an import");
// setImportByLocation("");
continue;
} else if (!((Element) n).getTagName().equalsIgnoreCase(TAG_IMPORT)) {
throw new InvalidXMLException(InvalidXMLException.UNKNOWN_ELEMENT,
new Object[]{((Element) n).getTagName()});
} else {
importDescriptor = (Import) aParser.buildObject((Element) n, aOptions);
}
}
}
} else if (TAG_ANALYSIS_ENGINE.equalsIgnoreCase(elem.getTagName())) {
analysisEngineDeploymentMetaData = (AEDeploymentMetaData) aParser.buildObject(elem,
aOptions);
analysisEngineDeploymentMetaData.setTopAnalysisEngine(true);
} else if (TAG_CUSTOM.equalsIgnoreCase(elem.getTagName())) {
// Check for "name"
NamedNodeMap map = elem.getAttributes();
if (map != null) {
for (int k=0; k<map.getLength(); ++k) {
Node item = map.item(k);
String name = item.getNodeName();
String val = item.getNodeValue();
if (val == null) {
val = "";
} else {
val = val.trim();
}
if (TAG_ATTR_NAME.equalsIgnoreCase(name)) {
// set "name = ..." attribute
customValue = val;
} else {
throw new InvalidXMLException(InvalidXMLException.UNKNOWN_ELEMENT,
new Object[]{name});
}
}
}
} else if (TAG_ENV_VARS.equalsIgnoreCase(elem.getTagName())) {
// delegates = new AEDelegates_Impl(this);
NodeList nodes = elem.getChildNodes();
if (nodes.getLength() > 0) {
// Look for "environmentVariable"
for (int k = 0; k < nodes.getLength(); ++k) {
Node n = nodes.item(k);
if (!(n instanceof Element)) {
continue;
}
Element e = (Element) n;
if (TAG_ENV_VAR.equalsIgnoreCase(e.getTagName())) {
String envName = getValueOfNameAttribute(e);
if (envName == null) {
throw new InvalidXMLException(InvalidXMLException.UNKNOWN_ELEMENT,
new Object[]{e.getTagName()});
}
if (environmentVariables == null) {
environmentVariables = new ArrayList<NameValue>();
}
environmentVariables.add(new NameValue(envName, e.getTextContent()));
} else {
throw new InvalidXMLException(InvalidXMLException.UNKNOWN_ELEMENT,
new Object[]{e.getTagName()});
}
}
}
} else {
throw new InvalidXMLException(InvalidXMLException.UNKNOWN_ELEMENT,
new Object[]{elem.getTagName()});
}
}
}
// Create DEFAULT AEDeploymentMetaData for TOP AE
if (analysisEngineDeploymentMetaData == null) {
analysisEngineDeploymentMetaData = new AEDeploymentMetaData_Impl();
analysisEngineDeploymentMetaData.setTopAnalysisEngine(true);
}
if (analysisEngineDeploymentMetaData.getAsyncAEErrorConfiguration() == null) {
// Create a new Error Config
Object obj = UIMAFramework.getResourceSpecifierFactory().createObject(
AsyncPrimitiveErrorConfiguration.class);
if (obj == null) {
Trace.err("Cannot create AsyncPrimitiveErrorConfiguration for TOP");
}
analysisEngineDeploymentMetaData.setAsyncAEErrorConfiguration((AsyncPrimitiveErrorConfiguration) obj);
}
}
protected String getValueOfNameAttribute (Element elem) throws InvalidXMLException {
// Check for "name"
NamedNodeMap map = elem.getAttributes();
if (map != null) {
for (int k=0; k<map.getLength(); ++k) {
Node item = map.item(k);
String name = item.getNodeName();
String val = item.getNodeValue();
if (val == null) {
val = "";
} else {
val = val.trim();
}
if (TAG_ATTR_NAME.equalsIgnoreCase(name)) {
// get "name = ..." attribute
return val;
} else {
throw new InvalidXMLException(InvalidXMLException.UNKNOWN_ELEMENT,
new Object[]{name});
}
}
}
return null;
}
/**
* Check and set the attributes of Input Queue
*
* @param aElement
* @throws InvalidXMLException
* @return void
*/
protected void checkAndSetInputQueueAttributes (Element aElement) throws InvalidXMLException {
// Check for "key" and "async" attributes
NamedNodeMap map = aElement.getAttributes();
if (map != null) {
for (int i=0; i<map.getLength(); ++i) {
Node item = map.item(i);
String name = item.getNodeName();
String val = item.getNodeValue();
if (val == null) {
val = "";
} else {
val = val.trim();
}
if (AEDeploymentConstants.TAG_ATTR_END_POINT.equalsIgnoreCase(name)) {
// set "endpoint = ..." attribute
setEndPoint(val);
} else if (AEDeploymentConstants.TAG_ATTR_BROKER_URL.equalsIgnoreCase(name)) {
// set "brokerURL =" attribute
setBrokerURL(val);
} else if (AEDeploymentConstants.TAG_ATTR_PREFETCH.equalsIgnoreCase(name)) {
// set "prefetch =" attribute
if (val.trim().length() > 0) {
setPrefetch(Integer.parseInt(val));
}
} else {
throw new InvalidXMLException(InvalidXMLException.UNKNOWN_ELEMENT,
new Object[]{name});
}
}
}
// Check for missing attributes
if (getEndPoint() == null) {
throw new InvalidXMLException(InvalidXMLException.ELEMENT_NOT_FOUND,
new Object[]{AEDeploymentConstants.TAG_ATTR_END_POINT, AEDeploymentConstants.TAG_SERVICE});
}
if (getBrokerURL() == null) {
throw new InvalidXMLException(InvalidXMLException.ELEMENT_NOT_FOUND,
new Object[]{AEDeploymentConstants.TAG_ATTR_BROKER_URL, AEDeploymentConstants.TAG_SERVICE});
}
}
/**
* Overridden to provide custom XML representation.
*
* @see org.apache.uima.util.XMLizable#toXML(ContentHandler)
*/
public void toXML(ContentHandler aContentHandler, boolean aWriteDefaultNamespaceAttribute)
throws SAXException {
// <TAG_SERVICES>
AttributesImpl attrs = new AttributesImpl();
aContentHandler.startElement("", TAG_SERVICE, TAG_SERVICE, attrs);
// <TAG_INPUT_QUEUE />
attrs.addAttribute("", TAG_ATTR_END_POINT, TAG_ATTR_END_POINT, null, getEndPoint());
attrs.addAttribute("", TAG_ATTR_BROKER_URL, TAG_ATTR_BROKER_URL, null, getBrokerURL());
attrs.addAttribute("", TAG_ATTR_PREFETCH, TAG_ATTR_PREFETCH, null, ""+getPrefetch());
aContentHandler.startElement("", TAG_INPUT_QUEUE, TAG_INPUT_QUEUE, attrs);
aContentHandler.endElement("", "", TAG_INPUT_QUEUE);
attrs.clear();
if (isCPlusPlusTopAE()) {
if (customValue != null) {
attrs.addAttribute("", TAG_ATTR_NAME, TAG_ATTR_NAME, null, getCustomValue());
aContentHandler.startElement("", TAG_CUSTOM, TAG_CUSTOM, attrs);
aContentHandler.endElement("", "", TAG_CUSTOM);
attrs.clear();
if (environmentVariables != null && environmentVariables.size() > 0) {
aContentHandler.startElement("", TAG_ENV_VARS, TAG_ENV_VARS, attrs);
for (NameValue nv: environmentVariables) {
attrs.addAttribute("", TAG_ATTR_NAME, TAG_ATTR_NAME, null, nv.getName());
aContentHandler.startElement("", TAG_ENV_VAR, TAG_ENV_VAR, attrs);
aContentHandler.characters(nv.getValue().toCharArray(), 0, nv.getValue().length());
aContentHandler.endElement("", "", TAG_ENV_VAR);
attrs.clear();
}
aContentHandler.endElement("", "", TAG_ENV_VARS);
}
}
}
// <TAG_TOP_DESCRIPTOR>
aContentHandler.startElement("", TAG_TOP_DESCRIPTOR, TAG_TOP_DESCRIPTOR, attrs);
if (importDescriptor != null) {
importDescriptor.toXML(aContentHandler, aWriteDefaultNamespaceAttribute);
}
// </TAG_TOP_DESCRIPTOR>
aContentHandler.endElement("", "", TAG_TOP_DESCRIPTOR);
attrs.clear();
if (analysisEngineDeploymentMetaData != null) {
analysisEngineDeploymentMetaData.toXML(aContentHandler, aWriteDefaultNamespaceAttribute);
}
// </TAG_SERVICES>
aContentHandler.endElement("", "", TAG_SERVICE);
}
/** ********************************************************************** */
protected XmlizationInfo getXmlizationInfo() {
// return XMLIZATION_INFO;
return new XmlizationInfo(null, null);
// this object has custom XMLization routines
}
static final private XmlizationInfo XMLIZATION_INFO = new XmlizationInfo("uimaApplication",
new PropertyXmlInfo[] { new PropertyXmlInfo("cpeDescriptor", false),
new PropertyXmlInfo("defaultCasProcessorSettings", false) });
/*
* (non-Javadoc)
*
* @see com.ibm.uima.application.metadata.impl.AEService#getBrokerURL()
*/
public String getBrokerURL() {
return brokerURL;
}
/*
* (non-Javadoc)
*
* @see com.ibm.uima.application.metadata.impl.AEService#setBrokerURL(java.lang.String)
*/
public void setBrokerURL(String brokerURL) {
this.brokerURL = brokerURL;
}
/*
* (non-Javadoc)
*
* @see com.ibm.uima.application.metadata.impl.AEService#getEndPoint()
*/
public String getEndPoint() {
return endPoint;
}
/*
* (non-Javadoc)
*
* @see com.ibm.uima.application.metadata.impl.AEService#setEndPoint(java.lang.String)
*/
public void setEndPoint(String endPoint) {
this.endPoint = endPoint;
}
/*
* (non-Javadoc)
*
* @see com.ibm.uima.application.metadata.impl.AEService#getImportByLocation()
*/
// public String getImportByLocation() {
// return importByLocation;
// }
//
// /* (non-Javadoc)
// * @see com.ibm.uima.application.metadata.impl.AEService#setImportByLocation(java.lang.String)
// */
// public void setImportByLocation(String importByLocation) {
// this.importByLocation = importByLocation;
// }
/*
* (non-Javadoc)
*
* @see com.ibm.uima.application.metadata.impl.AEService#getTopDescriptor()
*/
// public String getTopDescriptor() {
// return topDescriptor;
// }
//
// /* (non-Javadoc)
// * @see com.ibm.uima.application.metadata.impl.AEService#setTopDescriptor(java.lang.String)
// */
// public void setTopDescriptor(String topDescriptor) {
// this.topDescriptor = topDescriptor;
// }
// public String getImportByName() {
// return importByName;
// }
//
// public void setImportByName(String importByName) {
// this.importByName = importByName;
// }
/**
* @return the analysisEngineDeploymentMetaData
* @throws InvalidXMLException
*/
public AEDeploymentMetaData getAnalysisEngineDeploymentMetaData() throws InvalidXMLException {
// Trace.err(10, "");
return getAnalysisEngineDeploymentMetaData(UIMAFramework.newDefaultResourceManager());
}
/**
* @return the analysisEngineDeploymentMetaData
* @throws InvalidXMLException
*/
public AEDeploymentMetaData getAnalysisEngineDeploymentMetaData(ResourceManager aResourceManager)
throws InvalidXMLException {
// Trace.err("ResourceManager 0");
if (analysisEngineDeploymentMetaData == null) {
return null;
}
// Trace.err("ResourceManager 1");
// Resolve import descriptor
// CANNOT RESOLVE IMPORT HERE BECAUSE THIS METHOD IS CALLED BY REFLECTION
// FROM SUPER-CLASS WHEN PARSING "IMPORT"
// resolveTopAnalysisEngineDescription(aResourceManager, false);
return analysisEngineDeploymentMetaData;
}
/**
* @param analysisEngineDeploymentMetaData
* the analysisEngineDeploymentMetaData to set
*/
public void setAnalysisEngineDeploymentMetaData(
AEDeploymentMetaData analysisEngineDeploymentMetaData) {
this.analysisEngineDeploymentMetaData = analysisEngineDeploymentMetaData;
analysisEngineDeploymentMetaData.setTopAnalysisEngine(true);
}
/**
* @return the importDescriptor
*/
public Import getImportDescriptor() {
return importDescriptor;
}
/**
* @param importDescriptor
* the importDescriptor to set
*/
public void setImportDescriptor(Import importDescriptor) {
this.importDescriptor = importDescriptor;
// Handle the case that the top AE descriptor is reloaded
importResolved = false;
topAnalysisEngineDescription = null;
}
/**
* @return the topAnalysisEngineDescription
* @throws InvalidXMLException
*/
public ResourceSpecifier getTopAnalysisEngineDescription() throws InvalidXMLException {
return getTopAnalysisEngineDescription(UIMAFramework.newDefaultResourceManager());
}
/**
* @return the topAnalysisEngineDescription
* @throws InvalidXMLException
*/
public ResourceSpecifier getTopAnalysisEngineDescription(ResourceManager aResourceManager)
throws InvalidXMLException {
if (topAnalysisEngineDescription == null) {
// Resolve import.
// CANNOT RESOLVE IMPORT HERE BECAUSE THIS METHOD IS CALLED BY REFLECTION
// FROM SUPER-CLASS WHEN PARSING "IMPORT"
// resolveTopAnalysisEngineDescription(aResourceManager, false);
}
return topAnalysisEngineDescription;
}
/**
* @return the topAnalysisEngineDescription
* @throws InvalidXMLException
*/
public ResourceSpecifier resolveTopAnalysisEngineDescription(boolean recursive)
throws InvalidXMLException {
return resolveTopAnalysisEngineDescription(UIMAFramework.newDefaultResourceManager(), recursive);
}
/**
* @return the topAnalysisEngineDescription
* @throws InvalidXMLException
*/
public ResourceSpecifier resolveTopAnalysisEngineDescription(
ResourceManager aResourceManager, boolean recursive) throws InvalidXMLException {
if (importDescriptor == null) {
return null;
}
topAnalysisEngineDescription = resolveImport(aResourceManager);
// If C++ descriptor, active C++ settings
if (topAnalysisEngineDescription != null) {
if (((ResourceCreationSpecifier)topAnalysisEngineDescription).getFrameworkImplementation().equalsIgnoreCase(Constants.CPP_FRAMEWORK_NAME)) {
cPlusPlusTopAE = true;
} else {
cPlusPlusTopAE = false;
// Check that there are NO Settings for C++
// Note: Comment out to be "user-friendly" when switching from C++ to Java AE
// if (customValue != null) {
// throw new InvalidXMLException(InvalidXMLException.UNKNOWN_ELEMENT,
// new Object[]{TAG_CUSTOM});
// }
}
}
if (topAnalysisEngineDescription != null && analysisEngineDeploymentMetaData != null) {
analysisEngineDeploymentMetaData.setResourceSpecifier(topAnalysisEngineDescription,
aResourceManager, recursive);
}
importResolved = true;
return topAnalysisEngineDescription;
}
/**
* @param topAnalysisEngineDescription
* the topAnalysisEngineDescription to set
*/
public void setTopAnalysisEngineDescription(AnalysisEngineDescription topAnalysisEngineDescription) {
this.topAnalysisEngineDescription = topAnalysisEngineDescription;
}
/**
* Will through exception if import is not resolved
*
* @return void
*/
protected void checkImport () {
Trace.err(" ---> Import is not resolved");
}
/**
* @return the importResolved
*/
protected boolean isImportResolved() {
return importResolved;
}
/**
* @param importResolved the importResolved to set
*/
protected void setImportResolved(boolean importResolved) {
this.importResolved = importResolved;
}
/**
* @return the prefetch
*/
public int getPrefetch() {
return prefetch;
}
/**
* @param prefetch the prefetch to set
*/
public void setPrefetch(int prefetch) {
this.prefetch = prefetch;
}
/**
* @return the environmentVariables
*/
public List<NameValue> getEnvironmentVariables() {
return environmentVariables;
}
/**
* @param environmentVariables the environmentVariables to set
*/
public void setEnvironmentVariables(List<NameValue> environmentVariables) {
this.environmentVariables = environmentVariables;
}
/**
* @return the customValue
*/
public String getCustomValue() {
return customValue;
}
/**
* @param customValue the customValue to set
*/
public void setCustomValue(String customValue) {
this.customValue = customValue;
}
/**
* @return the cPlusPlusTopAE
*/
public boolean isCPlusPlusTopAE() {
return cPlusPlusTopAE;
}
/**
* @param plusPlusTopAE the cPlusPlusTopAE to set
*/
public void setCPlusPlusTopAE(boolean plusPlusTopAE) {
cPlusPlusTopAE = plusPlusTopAE;
}
}