[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();