[UIMA-6312] Better PEAR parameter support
- When fetching parameters from PEARs, fetch legacy parameters as well as the new NameValuePair parameters - latter override former
- When setting parameters, try updating first the modern parameter, then (if present) the legacy ones - if a parameter is not present yet, create a modern NameValuePair parameter
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/factory/ConfigurationParameterFactory.java b/uimafit-core/src/main/java/org/apache/uima/fit/factory/ConfigurationParameterFactory.java
index 067de15..af9a86f 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/factory/ConfigurationParameterFactory.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/factory/ConfigurationParameterFactory.java
@@ -42,6 +42,7 @@
import org.apache.uima.resource.metadata.NameValuePair;
import org.apache.uima.resource.metadata.ResourceMetaData;
import org.apache.uima.resource.metadata.impl.ConfigurationParameter_impl;
+import org.apache.uima.resource.metadata.impl.NameValuePair_impl;
import org.springframework.beans.SimpleTypeConverter;
import org.springframework.beans.TypeMismatchException;
@@ -548,8 +549,23 @@
settings.put(p.getName(), p.getValue());
}
} else if (spec instanceof PearSpecifier) {
- for (Parameter p : ((PearSpecifier) spec).getParameters()) {
- settings.put(p.getName(), p.getValue());
+ PearSpecifier pearSpec = ((PearSpecifier) spec);
+ // Legacy parameters that only support string values.
+ Parameter[] parameters = pearSpec.getParameters();
+
+ if (parameters != null) {
+ for (Parameter parameter : parameters) {
+ settings.put(parameter.getName(), parameter.getValue());
+ }
+ }
+
+ // Parameters supporting arbitrary objects as values
+ NameValuePair[] pearParameters = pearSpec.getPearParameters();
+
+ if (pearParameters != null) {
+ for (NameValuePair pearParameter : pearParameters) {
+ settings.put(pearParameter.getName(), pearParameter.getValue());
+ }
}
} else if (spec instanceof ResourceCreationSpecifier) {
for (NameValuePair p : ((ResourceCreationSpecifier) spec).getMetaData()
@@ -609,23 +625,36 @@
} else if (aSpec instanceof PearSpecifier) {
PearSpecifier spec = (PearSpecifier) aSpec;
- // If the parameter is already there, update it
boolean found = false;
- for (Parameter p : spec.getParameters()) {
+
+ // Check modern parameters and if the parameter is present there, update it
+ NameValuePair[] parameters = spec.getPearParameters();
+ for (NameValuePair p : parameters) {
if (p.getName().equals(name)) {
- p.setValue((String) value);
+ p.setValue(value);
found = true;
}
}
+
+ // Check legacy parameters and if the parameter is present there, update it
+ Parameter[] legacyParameters = spec.getParameters();
+ if (legacyParameters != null) {
+ for (Parameter p : legacyParameters) {
+ if (p.getName().equals(name)) {
+ p.setValue((String) value);
+ found = true;
+ }
+ }
+ }
// If the parameter is not there, add it
if (!found) {
- Parameter[] params = new Parameter[spec.getParameters().length + 1];
- System.arraycopy(spec.getParameters(), 0, params, 0, spec.getParameters().length);
- params[params.length - 1] = new Parameter_impl();
+ NameValuePair[] params = new NameValuePair[parameters.length + 1];
+ System.arraycopy(parameters, 0, params, 0, parameters.length);
+ params[params.length - 1] = new NameValuePair_impl();
params[params.length - 1].setName(name);
- params[params.length - 1].setValue((String) value);
- spec.setParameters(params);
+ params[params.length - 1].setValue(value);
+ spec.setPearParameters(params);
}
} else if (aSpec instanceof ResourceCreationSpecifier) {
ResourceMetaData md = ((ResourceCreationSpecifier) aSpec).getMetaData();