blob: e60f8849642c308d94ce6a07872af83b6c02c255 [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.IOException;
import java.io.OutputStream;
import java.io.Writer;
import java.util.List;
import org.apache.uima.resource.metadata.ConfigurationParameter;
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.XMLParser;
import org.apache.uima.util.XMLParser.ParsingOptions;
import org.w3c.dom.Element;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;
/**
* Encapsulate the following 3 UIMA classes into one class:
* Config Parameter Declaration
* Config Parameter Settings (value)
* - for Cas Processor
* - for CPE
*
*/
public class ConfigParameterModel {
/**
* MultiValues[] is used to represent the multi-values of the Configuration Parameter.
* MultiValues[i] is the value of the i-th index of multivalues.
* Example:
* <nameValuePair>
* <name>Locations</name>
* <value>
* <array> multiValues[]
* <string>a</string> multiValues[0]= {Locations, "a", 0}
* <string>b</string> multiValues[1]= {Locations, "b", 0}
* <string>c</string> multiValues[2]= {Locations, "b", 0}
* <array>
* </value>
* </nameValuePair>
*
*/
public static class MultiValues {
public ConfigParameterModel parameterModel;
// The "values" cannot be used since this MultiValues can be DYNAMICALLY created !
public Object[] values;
public int index; // index within values[] (0, 1, ...)
// private boolean forCpe = false;
public MultiValues(ConfigParameterModel paramModel, boolean forCpe, int index)
{
super();
this.parameterModel = paramModel;
// this.forCpe = forCpe;
this.index = index;
}
public MultiValues(ConfigParameterModel paramModel, Object[] values, int index)
{
super();
this.parameterModel = paramModel;
this.values = values;
this.index = index;
}
public String getType() {
return parameterModel.getType();
}
public String getName() {
return parameterModel.getName();
}
public Object getDefValue() {
return values[index];
}
public void setDefValue(Object value) {
values[index] = value;
}
public Object getCpeValue() {
Object[] cpeValues = (Object[]) parameterModel.getCpeValue();
if (cpeValues == null) {
return null;
}
return cpeValues[index];
}
public void setCpeValue(Object value) {
Object[] cpeValues = (Object[]) parameterModel.getCpeValue();
// Trace.trace("setValue: index=" + index + " ; value:" + value.toString());
cpeValues[index] = value;
}
/**
* @return Returns the index.
*/
public int getIndex() {
return index;
}
/**
* Get the total number of multi-values
*
* @return int
*/
public int getMultiValuesSize () {
Object[] cpeValues = (Object[]) parameterModel.getCpeValue();
if (cpeValues == null) {
Trace.err(getName() + ": getMultiValuesSize = 0");
return 0;
}
return cpeValues.length;
}
/**
* @return Returns the parameterModel.
*/
public ConfigParameterModel getParameterModel() {
return parameterModel;
}
/**
* @param parameterModel The parameterModel to set.
*/
public void setParameterModel(ConfigParameterModel parameterModel) {
this.parameterModel = parameterModel;
}
/**
* Use to moved value up/down
* @param index the index to set
*/
public void setIndex(int index) {
this.index = index;
}
} // MultiValues
private ConfigurationParameter configParam;
private Object value; // for Cas Processor
private Object cpeValue = null; // for CPE
public ConfigParameterModel(ConfigurationParameter configParam) {
super();
this.configParam = configParam;
}
public void toXML(ContentHandler aContentHandler,
boolean aWriteDefaultNamespaceAttribute)
throws SAXException
{
if (getCpeValue() == null) {
Trace.trace("No value");
return;
}
AttributesImpl attrs = new AttributesImpl();
// <nameValuePair>
aContentHandler.startElement(getXmlizationInfo().namespace,
"","nameValuePair",attrs);
// <name> </name>
aContentHandler.startElement(getXmlizationInfo().namespace,
"","name",attrs);
String valStr = getName();
aContentHandler.characters(valStr.toCharArray(),0,valStr.length());
aContentHandler.endElement(getXmlizationInfo().namespace,
"","name");
// <value>
aContentHandler.startElement(getXmlizationInfo().namespace, "","value",attrs);
String lowerCaseType = getType().toLowerCase();
if (isMultiValued()) {
aContentHandler.startElement(getXmlizationInfo().namespace, "","array",attrs);
Object[] v = (Object[]) getCpeValue();
for (int i=0; i<v.length; ++i) {
aContentHandler.startElement(getXmlizationInfo().namespace, "", lowerCaseType, attrs);
valStr ="" + v[i];
aContentHandler.characters(valStr.toCharArray(),0,valStr.length());
aContentHandler.endElement(getXmlizationInfo().namespace, "", lowerCaseType);
}
} else {
aContentHandler.startElement(getXmlizationInfo().namespace, "", lowerCaseType, attrs);
valStr = "" + getCpeValue();
aContentHandler.characters(valStr.toCharArray(),0,valStr.length());
aContentHandler.endElement(getXmlizationInfo().namespace, "", lowerCaseType);
}
if (isMultiValued()) {
aContentHandler.endElement(getXmlizationInfo().namespace, "","array");
}
// </value>
aContentHandler.endElement(getXmlizationInfo().namespace, "","value");
// </nameValuePair>
aContentHandler.endElement(getXmlizationInfo().namespace,
"","nameValuePair");
}
protected XmlizationInfo getXmlizationInfo() {
// return XMLIZATION_INFO;
return new XmlizationInfo(null, null);
//this object has custom XMLization routines
}
/**
* @return Returns the value.
*/
public Object getValue() {
return value;
}
/**
* @param value The value to set.
*/
public void setValue(Object value) {
this.value = value;
}
public void cloneValue ()
{
// cpeValue = value.clone();
}
/**
* Get total number of multi-values
*
* @return int
*/
public int getMultivalueSize ()
{
if (value == null) return 0;
if (!isMultiValued()) return 1;
return ((Object[]) value).length;
}
/**
* Get total number of CPE values
*
* @return int
*/
public int getCpeValueSize ()
{
if (cpeValue == null) return 0;
if (!isMultiValued()) return 1;
return ((Object[]) cpeValue).length;
}
/**
* @return Returns the cpeValue.
*/
public Object getCpeValue() {
if (cpeValue != null && getCpeValueSize() > 0) {
return cpeValue;
}
return null;
}
/**
* @param cpeValue The cpeValue to set.
*/
public void setCpeValue(Object cpeValue) {
this.cpeValue = cpeValue;
}
public void setCpeValue (String aValueString)
{
if (!isMultiValued()) {
// Single value
setCpeValue(getValueObjectFromString(aValueString));
} else {
addValueToCpeMultivalue(aValueString);
}
}
public Object getValueObjectFromString (String aValueString)
{
if (aValueString == null || aValueString.trim().length() == 0) {
return null;
}
Object aValue = null;
String paramType = getType();
try {
if (ConfigurationParameter.TYPE_STRING.equals(paramType)) {
aValue = aValueString;
} else if (ConfigurationParameter.TYPE_INTEGER.equals(paramType)) {
aValue = Integer.valueOf(aValueString);
} else if (ConfigurationParameter.TYPE_FLOAT.equals(paramType)) {
aValue = Float.valueOf(aValueString);
} else if (ConfigurationParameter.TYPE_BOOLEAN.equals(paramType)) {
aValue = Boolean.valueOf(aValueString);
} else {
Trace.bug("Wrong param type: " + paramType);
}
} catch (NumberFormatException e) {
Trace.err(e.toString());
}
return aValue;
}
private Object _insertValueToMultivalue (Object[] v, Object aValue, int atIndex)
{
Object[] newValues;
if (v != null) {
// Copy OLD values
newValues = new Object[v.length+1];
for (int i=0; i<atIndex; ++i) {
newValues[i] = v[i];
}
newValues[atIndex] = aValue;
for (int i=atIndex; i<v.length; ++i) {
newValues[i+1] = v[i];
}
} else {
newValues = new Object[1];
newValues[0] = aValue;
}
return newValues;
}
public void addValueToMultivalue (String aValueString, int atIndex)
{
if (!isMultiValued()) return;
value =_insertValueToMultivalue ((Object[]) value,
getValueObjectFromString(aValueString), atIndex);
}
public void addValueToCpeMultivalue (String aValueString, int atIndex)
{
if (!isMultiValued()) return;
cpeValue =_insertValueToMultivalue ((Object[]) cpeValue,
getValueObjectFromString(aValueString), atIndex);
}
/**
* Add a value to multi-value parameter override (for AE)
*
* @param value
* @return void
*/
public void addValueToMultivalue (String aValueString)
{
if (!isMultiValued()) return;
Object aValue = getValueObjectFromString(aValueString);
Object[] newValues;
Object[] v = (Object[]) getValue();
if (v != null) {
// Copy OLD values
newValues = new Object[v.length+1];
for (int i=0; i<v.length; ++i) {
newValues[i] = v[i];
}
newValues[v.length] = aValue;
} else {
newValues = new Object[1];
newValues[0] = aValue;
}
setValue(newValues);
}
/**
* Add a value to multi-value parameter override (for CPE)
*
* @param value
* @return void
*/
public void addValueToCpeMultivalue (String aValueString)
{
if (!isMultiValued()) return;
Object aValue = getValueObjectFromString(aValueString);
Object[] newValues;
Object[] v = (Object[]) cpeValue;
if (v != null) {
// Copy OLD values
newValues = new Object[v.length+1];
for (int i=0; i<v.length; ++i) {
newValues[i] = v[i];
}
newValues[v.length] = aValue;
} else {
newValues = new Object[1];
newValues[0] = aValue;
}
setCpeValue(newValues);
}
private Object _removeMultivalue (Object[] v, MultiValues mv)
{
if (v.length == 1) {
// Has only 1 element to be removed
return null;
}
int index = mv.getIndex();
Object[] newValues = new Object[v.length-1];
for (int i=0; i<index; ++i) {
newValues[i] = v[i];
}
for (int i=index; i<(v.length-1); ++i) {
newValues[i] = v[i+1];
}
return newValues;
}
public void removeMultivalue (MultiValues mv)
{
if (!isMultiValued()) return;
value = _removeMultivalue ((Object[]) value, mv);
}
public void removeCpeMultivalue (MultiValues mv)
{
if (!isMultiValued()) return;
cpeValue = _removeMultivalue ((Object[]) cpeValue, mv);
}
private boolean moveMultivalue (boolean moveUp, Object[] v, int index)
{
if (!isMultiValued()) return false;
Object aValue;
if (v != null && index < v.length) {
if (moveUp) {
// Move Up
if (index > 0) {
aValue = v[index];
v[index] = v[index-1];
v[index-1] = aValue;
return true; // is moved
}
} else {
// Move Down
if (index < (v.length-1)) {
aValue = v[index];
v[index] = v[index+1];
v[index+1] = aValue;
return true; // is moved
}
}
}
return false; // NOT moved
} // moveMultivalue
public boolean moveValue (boolean moveUp, int index)
{
return moveMultivalue (moveUp, (Object[]) value, index);
} // moveValue
public boolean moveCpeValue (boolean moveUp, int index)
{
return moveMultivalue (moveUp, (Object[]) cpeValue, index);
} // moveCpeValue
/* (non-Javadoc)
* @see org.apache.uima.resource.metadata.ConfigurationParameter#addOverride(java.lang.String)
*/
public void addOverride(String arg0) {
configParam.addOverride(arg0);
}
/* (non-Javadoc)
* @see org.apache.uima.util.XMLizable#buildFromXMLElement(org.w3c.dom.Element, org.apache.uima.util.XMLParser, org.apache.uima.util.XMLParser.ParsingOptions)
*/
public void buildFromXMLElement(Element arg0, XMLParser arg1, ParsingOptions arg2) throws InvalidXMLException {
configParam.buildFromXMLElement(arg0, arg1, arg2);
}
/* (non-Javadoc)
* @see org.apache.uima.util.XMLizable#buildFromXMLElement(org.w3c.dom.Element, org.apache.uima.util.XMLParser)
*/
public void buildFromXMLElement(Element arg0, XMLParser arg1) throws InvalidXMLException {
configParam.buildFromXMLElement(arg0, arg1);
}
/* (non-Javadoc)
* @see org.apache.uima.resource.metadata.MetaDataObject#clone()
*/
public Object clone() {
return configParam.clone();
}
/* (non-Javadoc)
* @see org.apache.uima.resource.metadata.MetaDataObject#equals(java.lang.Object)
*/
public boolean equals(Object arg0) {
return configParam.equals(arg0);
}
/* (non-Javadoc)
* @see org.apache.uima.resource.metadata.MetaDataObject#getAttributeValue(java.lang.String)
*/
public Object getAttributeValue(String arg0) {
return configParam.getAttributeValue(arg0);
}
/* (non-Javadoc)
* @see org.apache.uima.resource.metadata.ConfigurationParameter#getDescription()
*/
public String getDescription() {
return configParam.getDescription();
}
/* (non-Javadoc)
* @see org.apache.uima.resource.metadata.ConfigurationParameter#getName()
*/
public String getName() {
return configParam.getName();
}
/* (non-Javadoc)
* @see org.apache.uima.resource.metadata.ConfigurationParameter#getOverrides()
*/
public String[] getOverrides() {
return configParam.getOverrides();
}
/* (non-Javadoc)
* @see org.apache.uima.resource.metadata.ConfigurationParameter#getType()
*/
public String getType() {
return configParam.getType();
}
/* (non-Javadoc)
* @see org.apache.uima.resource.metadata.ConfigurationParameter#isMandatory()
*/
public boolean isMandatory() {
return configParam.isMandatory();
}
/* (non-Javadoc)
* @see org.apache.uima.resource.metadata.MetaDataObject#isModifiable()
*/
public boolean isModifiable() {
return configParam.isModifiable();
}
/* (non-Javadoc)
* @see org.apache.uima.resource.metadata.ConfigurationParameter#isMultiValued()
*/
public boolean isMultiValued() {
return configParam.isMultiValued();
}
/* (non-Javadoc)
* @see org.apache.uima.resource.metadata.MetaDataObject#listAttributes()
*/
public List listAttributes() {
return configParam.listAttributes();
}
/* (non-Javadoc)
* @see org.apache.uima.resource.metadata.ConfigurationParameter#removeOverride(java.lang.String)
*/
public void removeOverride(String arg0) {
configParam.removeOverride(arg0);
}
/* (non-Javadoc)
* @see org.apache.uima.resource.metadata.MetaDataObject#setAttributeValue(java.lang.String, java.lang.Object)
*/
public void setAttributeValue(String arg0, Object arg1) {
configParam.setAttributeValue(arg0, arg1);
}
/* (non-Javadoc)
* @see org.apache.uima.resource.metadata.ConfigurationParameter#setDescription(java.lang.String)
*/
public void setDescription(String arg0) {
configParam.setDescription(arg0);
}
/* (non-Javadoc)
* @see org.apache.uima.resource.metadata.ConfigurationParameter#setMandatory(boolean)
*/
public void setMandatory(boolean arg0) {
configParam.setMandatory(arg0);
}
/* (non-Javadoc)
* @see org.apache.uima.resource.metadata.ConfigurationParameter#setMultiValued(boolean)
*/
public void setMultiValued(boolean arg0) {
configParam.setMultiValued(arg0);
}
/* (non-Javadoc)
* @see org.apache.uima.resource.metadata.ConfigurationParameter#setName(java.lang.String)
*/
public void setName(String arg0) {
configParam.setName(arg0);
}
/* (non-Javadoc)
* @see org.apache.uima.resource.metadata.ConfigurationParameter#setOverrides(java.lang.String[])
*/
public void setOverrides(String[] arg0) {
configParam.setOverrides(arg0);
}
/* (non-Javadoc)
* @see org.apache.uima.resource.metadata.ConfigurationParameter#setType(java.lang.String)
*/
public void setType(String arg0) {
configParam.setType(arg0);
}
/* (non-Javadoc)
* @see org.apache.uima.util.XMLizable#toXML(org.xml.sax.ContentHandler, boolean)
*/
// public void toXML(ContentHandler arg0, boolean arg1) throws SAXException {
// configParam.toXML(arg0, arg1);
// }
/* (non-Javadoc)
* @see org.apache.uima.util.XMLizable#toXML(org.xml.sax.ContentHandler)
*/
public void toXML(ContentHandler arg0) throws SAXException {
configParam.toXML(arg0);
}
/* (non-Javadoc)
* @see org.apache.uima.util.XMLizable#toXML(java.io.OutputStream)
*/
public void toXML(OutputStream arg0) throws SAXException, IOException {
configParam.toXML(arg0);
}
/* (non-Javadoc)
* @see org.apache.uima.util.XMLizable#toXML(java.io.Writer)
*/
public void toXML(Writer arg0) throws SAXException, IOException {
configParam.toXML(arg0);
}
}