You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by re...@apache.org on 2020/01/13 11:40:49 UTC

[uima-uimaj] branch feature/UIMA-5936-PearSpecifier-should-be-able-to-store-every-parametertype-that-analysisEngines-support created (now 24dd9ce)

This is an automated email from the ASF dual-hosted git repository.

rec pushed a change to branch feature/UIMA-5936-PearSpecifier-should-be-able-to-store-every-parametertype-that-analysisEngines-support
in repository https://gitbox.apache.org/repos/asf/uima-uimaj.git.


      at 24dd9ce  [UIMA-5936] PearSpecifier should be able to store every parametertype that analysisEngines support

This branch includes the following new commits:

     new 24dd9ce  [UIMA-5936] PearSpecifier should be able to store every parametertype that analysisEngines support

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[uima-uimaj] 01/01: [UIMA-5936] PearSpecifier should be able to store every parametertype that analysisEngines support

Posted by re...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rec pushed a commit to branch feature/UIMA-5936-PearSpecifier-should-be-able-to-store-every-parametertype-that-analysisEngines-support
in repository https://gitbox.apache.org/repos/asf/uima-uimaj.git

commit 24dd9cee0998d18ba0c17d5e218677f924fddc70
Author: Richard Eckart de Castilho <re...@apache.org>
AuthorDate: Mon Jan 13 12:40:39 2020 +0100

    [UIMA-5936] PearSpecifier should be able to store every parametertype that analysisEngines support
    
    - Support legacy string-valued as well as new object-valued parameters
    - Added more unit testing
    - Switching unit-testing to AssertJ
    - Changed setParameters from an array-valued to a variadic signature to allow setting values without having to wrap them explicitly in an array
    - Removed redundant JavaDoc in PearSpecified_Impl in favor of the JavaDoc written in the PearSpecifier interface
---
 .../impl/PearAnalysisEngineWrapper.java            |  13 +
 .../org/apache/uima/resource/PearSpecifier.java    |  45 ++-
 .../uima/resource/impl/PearSpecifier_impl.java     |  37 ++-
 .../src/main/resources/resourceSpecifierSchema.xsd |  12 +
 .../impl/PearAnalysisEngineWrapperTest.java        | 314 +++++++++++----------
 .../uima/resource/impl/PearSpecifier_implTest.java |  45 +--
 .../apache/uima/util/impl/XMLParser_implTest.java  |  17 +-
 .../resources/XmlParserTest/TestPearSpecifier.xml  |  64 +++--
 uimaj-parent/pom.xml                               |  10 +
 uimaj-test-util/pom.xml                            |   5 +-
 10 files changed, 339 insertions(+), 223 deletions(-)

diff --git a/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/PearAnalysisEngineWrapper.java b/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/PearAnalysisEngineWrapper.java
index c42b8cc..86fbccd 100644
--- a/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/PearAnalysisEngineWrapper.java
+++ b/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/PearAnalysisEngineWrapper.java
@@ -40,6 +40,7 @@ import org.apache.uima.cas.CAS;
 import org.apache.uima.cas.TypeSystem;
 import org.apache.uima.impl.ChildUimaContext_impl;
 import org.apache.uima.pear.tools.PackageBrowser;
+import org.apache.uima.resource.Parameter;
 import org.apache.uima.resource.PearSpecifier;
 import org.apache.uima.resource.Resource;
 import org.apache.uima.resource.ResourceConfigurationException;
@@ -267,6 +268,18 @@ public class PearAnalysisEngineWrapper extends AnalysisEngineImplBase {
               .getAnalysisEngineMetaData();
       ConfigurationParameterSettings configurationParameterSettings = analysisEngineMetaData
               .getConfigurationParameterSettings();
+
+      // Legacy parameters that only support string values.
+      Parameter[] parameters = pearSpec.getParameters();
+
+      if (parameters != null) {
+        for (Parameter parameter : parameters) {
+          configurationParameterSettings.setParameterValue(parameter.getName(),
+                  parameter.getValue());
+        }
+      }      
+
+      // Parameters supporting arbitrary objects as values
       NameValuePair[] pearParameters = pearSpec.getPearParameters();
 
       if (pearParameters != null) {
diff --git a/uimaj-core/src/main/java/org/apache/uima/resource/PearSpecifier.java b/uimaj-core/src/main/java/org/apache/uima/resource/PearSpecifier.java
index a313598..ba40a89 100644
--- a/uimaj-core/src/main/java/org/apache/uima/resource/PearSpecifier.java
+++ b/uimaj-core/src/main/java/org/apache/uima/resource/PearSpecifier.java
@@ -43,7 +43,46 @@ public interface PearSpecifier extends ResourceServiceSpecifier {
   public void setPearPath(String aPearPath);
 
   /**
-   * Gets pearParameters that may be read by the pear resource class when it is initialized.
+   * Gets legacy string-valued parameters that may be read by the pear resource class when it is
+   * initialized. These parameters are represented as follows in the PEAR specifier XML:
+   * 
+   * <pre>{@code
+   * <parameters>
+   *   <parameter name="param1" value="val1"/>
+   * </parameters>  
+   * }</pre>
+   * 
+   * @return an array of parameters. This will never return <code>null</code>.
+   * 
+   * @deprecated These parameters only support string values. Better use
+   *             {@link #setPearParameters(NameValuePair[])}.
+   */
+  public Parameter[] getParameters();
+
+  /**
+   * Sets legacy string-valued parameters that may be read by the pear resource class when it is 
+   * initialized.
+   * 
+   * @param parameters the Parameters to set.
+   * 
+   * @see #getParameters()
+   * @deprecated These parameters only support string values. Better use
+   *             {@link #getPearParameters()}.
+   */
+  public void setParameters(Parameter... parameters);
+  
+  /**
+   * Gets parameters that may be read by the pear resource class when it is initialized. These 
+   * parameters are represented as follows in the PEAR specifier XML:
+   * 
+   * <pre>{@code
+   * <pearParameters>
+   *   <nameValuePair>
+   *    <name>param1</name>
+   *    <value><string>val1</string></value>
+   *   </nameValuePair>
+   * </pearParameters>
+   * }</pre>
    * 
    * @return an array of pearParameters.  This will never return <code>null</code>.
    */
@@ -53,6 +92,8 @@ public interface PearSpecifier extends ResourceServiceSpecifier {
    * Sets pearParameters that may be read by the pear resource class when it is initialized.
    * 
    * @param pearParameters the pearParameters to set.
+   * 
+   * @see #getPearParameters()
    */
-  public void setPearParameters(NameValuePair[] pearParameters);
+  public void setPearParameters(NameValuePair... pearParameters);
 }
\ No newline at end of file
diff --git a/uimaj-core/src/main/java/org/apache/uima/resource/impl/PearSpecifier_impl.java b/uimaj-core/src/main/java/org/apache/uima/resource/impl/PearSpecifier_impl.java
index a1bc6b1..5936cc3 100644
--- a/uimaj-core/src/main/java/org/apache/uima/resource/impl/PearSpecifier_impl.java
+++ b/uimaj-core/src/main/java/org/apache/uima/resource/impl/PearSpecifier_impl.java
@@ -18,6 +18,7 @@
  */
 
 package org.apache.uima.resource.impl;
+import org.apache.uima.resource.Parameter;
 import org.apache.uima.resource.PearSpecifier;
 import org.apache.uima.resource.metadata.NameValuePair;
 import org.apache.uima.resource.metadata.impl.MetaDataObject_impl;
@@ -36,7 +37,8 @@ public class PearSpecifier_impl extends MetaDataObject_impl implements PearSpeci
   /** PEAR path setting */
   private String mPearPath;
 
-  private NameValuePair[] mParameters;
+  private Parameter[] mParameters;
+  private NameValuePair[] mPearParameters;
 
   /**
    * Creates a new <code>PearSpecifier_impl</code>.
@@ -44,31 +46,28 @@ public class PearSpecifier_impl extends MetaDataObject_impl implements PearSpeci
   public PearSpecifier_impl() {
   }
 
-  /**
-   * @return Returns the Parameters.
-   */
-  public NameValuePair[] getPearParameters() {
+  @Deprecated
+  public Parameter[] getParameters() {
     return this.mParameters;
   }
+  
+  public NameValuePair[] getPearParameters() {
+    return this.mPearParameters;
+  }
 
-  /**
-   * @param parameters
-   *          The Parameters to set.
-   */
-  public void setPearParameters(NameValuePair[] pearParameters) {
-    this.mParameters = pearParameters;
+  @Deprecated
+  public void setParameters(Parameter... parameters) {
+    this.mParameters = parameters;
+  }
+  
+  public void setPearParameters(NameValuePair... pearParameters) {
+    this.mPearParameters = pearParameters;
   }
 
-  /* (non-Javadoc)
-   * @see org.apache.uima.resource.PearSpecifier#getPearPath()
-   */
   public String getPearPath() {
     return this.mPearPath;
   }
 
-  /* (non-Javadoc)
-   * @see org.apache.uima.resource.PearSpecifier#setPearPath(java.lang.String)
-   */
   public void setPearPath(String aPearPath) {
     this.mPearPath = aPearPath;    
   }
@@ -77,6 +76,6 @@ public class PearSpecifier_impl extends MetaDataObject_impl implements PearSpeci
     return XMLIZATION_INFO;
   }
 
-  static final private XmlizationInfo XMLIZATION_INFO = new XmlizationInfo("pearSpecifier",
-          new PropertyXmlInfo[] { new PropertyXmlInfo("pearPath"), new PropertyXmlInfo("pearParameters") });
+  static final private XmlizationInfo XMLIZATION_INFO = new XmlizationInfo("pearSpecifier", new PropertyXmlInfo[] {
+      new PropertyXmlInfo("pearPath"), new PropertyXmlInfo("parameters"), new PropertyXmlInfo("pearParameters") });
 }
diff --git a/uimaj-core/src/main/resources/resourceSpecifierSchema.xsd b/uimaj-core/src/main/resources/resourceSpecifierSchema.xsd
index 9e33350..fc701e2 100644
--- a/uimaj-core/src/main/resources/resourceSpecifierSchema.xsd
+++ b/uimaj-core/src/main/resources/resourceSpecifierSchema.xsd
@@ -675,6 +675,18 @@
     <complexType>
       <sequence>
         <element name="pearPath" type="string"/>
+        <element name="parameters" minOccurs="0">
+          <complexType>
+            <sequence>
+              <element name="parameter" minOccurs="0" maxOccurs="unbounded">
+                <complexType>
+                  <attribute name="name" type="string"/>
+                  <attribute name="value" type="string"/>
+                </complexType>
+              </element>
+            </sequence>
+          </complexType>
+        </element>
         <element name="pearParameters" minOccurs="0">
           <complexType>
             <sequence>
diff --git a/uimaj-core/src/test/java/org/apache/uima/analysis_engine/impl/PearAnalysisEngineWrapperTest.java b/uimaj-core/src/test/java/org/apache/uima/analysis_engine/impl/PearAnalysisEngineWrapperTest.java
index ac8334b..ffc10fe 100644
--- a/uimaj-core/src/test/java/org/apache/uima/analysis_engine/impl/PearAnalysisEngineWrapperTest.java
+++ b/uimaj-core/src/test/java/org/apache/uima/analysis_engine/impl/PearAnalysisEngineWrapperTest.java
@@ -1,148 +1,166 @@
-/*
- * 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.analysis_engine.impl;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.HashMap;
-
-import org.apache.uima.pear.tools.PackageBrowser;
-import org.apache.uima.pear.tools.PackageInstaller;
-import org.apache.uima.pear.util.FileUtil;
-import org.apache.uima.resource.PearSpecifier;
-import org.apache.uima.resource.impl.PearSpecifier_impl;
-import org.apache.uima.resource.metadata.NameValuePair;
-import org.apache.uima.resource.metadata.impl.NameValuePair_impl;
-import org.apache.uima.test.junit_extension.JUnitExtension;
-import org.junit.Assert;
-
-import junit.framework.TestCase;
-
-public class PearAnalysisEngineWrapperTest extends TestCase {
-
-  private final static String PARAMETER_NAME = "StringParam";
-
-  private final static String PARAMETER_VALUE = "test";
-
-  private final static String PARAMETER_VALUE_OVERRIDE = "testOverride";
-
-  private PearAnalysisEngineWrapper pearAnalysisEngineWrapper;
-
-  private File tempInstallDirectory = null;
-
-  private PackageBrowser installedPearPackage;
-
-  public PearAnalysisEngineWrapperTest(String arg0) {
-
-    super(arg0);
-  }
-
-  @Override
-  protected void setUp() throws Exception {
-
-    this.pearAnalysisEngineWrapper = new PearAnalysisEngineWrapper();
-
-    this.tempInstallDirectory = this.createInstallationDirectory();
-
-    this.installedPearPackage = this.installPearPackage();
-  }
-
-  @Override
-  protected void tearDown() throws Exception {
-    this.removeInstallationDirectory();
-  }
-
-  public void testInitializeWithOverride() throws Exception {
-
-    PearSpecifier pearSpecifier = this.createPearSpecifierWithParameters();
-
-    boolean initialized = this.pearAnalysisEngineWrapper.initialize(pearSpecifier,
-            new HashMap<String, Object>());
-
-    Assert.assertTrue("Pear was not initialized", initialized);
-
-    String stringParamValue = (String) this.pearAnalysisEngineWrapper
-            .getConfigParameterValue(PearAnalysisEngineWrapperTest.PARAMETER_NAME);
-
-    Assert.assertEquals("The value of StringParam was not overridden",
-            PearAnalysisEngineWrapperTest.PARAMETER_VALUE_OVERRIDE, stringParamValue);
-  }
-
-  private PearSpecifier createPearSpecifierWithParameters() {
-
-	NameValuePair pearParameterStringParam = new NameValuePair_impl();
-    pearParameterStringParam.setName(PearAnalysisEngineWrapperTest.PARAMETER_NAME);
-    pearParameterStringParam.setValue(PearAnalysisEngineWrapperTest.PARAMETER_VALUE_OVERRIDE);
-
-    PearSpecifier_impl pearSpecifier_impl = new PearSpecifier_impl();
-    pearSpecifier_impl.setPearPath(this.installedPearPackage.getRootDirectory().toString());
-    pearSpecifier_impl.setPearParameters(new NameValuePair[] { pearParameterStringParam });
-    return pearSpecifier_impl;
-  }
-
-  public void testInitializeWithoutOverride() throws Exception {
-
-    PearSpecifier pearSpecifier = this.createPearSpecifierWithoutParameters();
-
-    boolean initialized = this.pearAnalysisEngineWrapper.initialize(pearSpecifier,
-            new HashMap<String, Object>());
-
-    Assert.assertTrue("Pear was not initialized", initialized);
-
-    String stringParamValue = (String) this.pearAnalysisEngineWrapper
-            .getConfigParameterValue(PearAnalysisEngineWrapperTest.PARAMETER_NAME);
-
-    Assert.assertEquals("The value of StringParam has changed",
-            PearAnalysisEngineWrapperTest.PARAMETER_VALUE, stringParamValue);
-  }
-
-  private PearSpecifier createPearSpecifierWithoutParameters() {
-
-    PearSpecifier_impl pearSpecifier_impl = new PearSpecifier_impl();
-    pearSpecifier_impl.setPearPath(this.installedPearPackage.getRootDirectory().toString());
-    return pearSpecifier_impl;
-  }
-
-  private File createInstallationDirectory() throws IOException {
-
-    File tempDirectory = File.createTempFile("pear_verification_test_", "tmp");
-    if (tempDirectory.delete()) {
-
-      if (!tempDirectory.mkdirs()) {
-        throw new IllegalStateException(
-                "Tmp directory (" + tempDirectory + ") could not be created");
-      }
-    }
-
-    return tempDirectory;
-  }
-
-  private PackageBrowser installPearPackage() {
-    File pearFile = JUnitExtension.getFile("pearTests/analysisEngineWithParameters.pear");
-    Assert.assertNotNull("analysisEngine.pear file not found", pearFile);
-
-    return PackageInstaller.installPackage(this.tempInstallDirectory, pearFile, false);
-  }
-
-  private void removeInstallationDirectory() throws IOException {
-    if (this.tempInstallDirectory != null) {
-      FileUtil.deleteDirectory(this.tempInstallDirectory);
-    }
-  }
-}
+/*
+ * 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.analysis_engine.impl;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+
+import org.apache.uima.pear.tools.PackageBrowser;
+import org.apache.uima.pear.tools.PackageInstaller;
+import org.apache.uima.pear.util.FileUtil;
+import org.apache.uima.resource.PearSpecifier;
+import org.apache.uima.resource.impl.Parameter_impl;
+import org.apache.uima.resource.impl.PearSpecifier_impl;
+import org.apache.uima.resource.metadata.impl.NameValuePair_impl;
+import org.apache.uima.test.junit_extension.JUnitExtension;
+import org.junit.Assert;
+
+import junit.framework.TestCase;
+
+public class PearAnalysisEngineWrapperTest extends TestCase {
+
+  // This parameter is defined in the PEAR specifier file!
+  private final static String PARAMETER_NAME = "StringParam";
+
+  private final static String PARAMETER_VALUE = "test";
+
+  private final static String PARAMETER_VALUE_OVERRIDE = "testOverride";
+
+  private PearAnalysisEngineWrapper pearAnalysisEngineWrapper;
+
+  private File tempInstallDirectory = null;
+
+  private PackageBrowser installedPearPackage;
+
+  public PearAnalysisEngineWrapperTest(String arg0) {
+
+    super(arg0);
+  }
+
+  @Override
+  protected void setUp() throws Exception {
+
+    this.pearAnalysisEngineWrapper = new PearAnalysisEngineWrapper();
+
+    this.tempInstallDirectory = this.createInstallationDirectory();
+
+    this.installedPearPackage = this.installPearPackage();
+  }
+
+  @Override
+  protected void tearDown() throws Exception {
+    this.removeInstallationDirectory();
+  }
+
+  public void testInitializeWithOverride() throws Exception {
+
+    PearSpecifier_impl pearSpecifier = new PearSpecifier_impl();
+    pearSpecifier.setPearPath(this.installedPearPackage.getRootDirectory().toString());
+    pearSpecifier.setPearParameters(new NameValuePair_impl(PARAMETER_NAME, PARAMETER_VALUE_OVERRIDE));
+
+    boolean initialized = this.pearAnalysisEngineWrapper.initialize(pearSpecifier, new HashMap<>());
+
+    assertThat(initialized).isTrue().as("Pear was initialized");
+    assertThat(pearAnalysisEngineWrapper.getConfigParameterValue(PARAMETER_NAME))
+        .isEqualTo(PARAMETER_VALUE_OVERRIDE)
+        .as("The value of StringParam was overridden");
+  }
+
+  public void testInitializeWithOverrideLegacy() throws Exception {
+
+    PearSpecifier_impl pearSpecifier = new PearSpecifier_impl();
+    pearSpecifier.setPearPath(this.installedPearPackage.getRootDirectory().toString());
+    pearSpecifier.setParameters(new Parameter_impl(PARAMETER_NAME, PARAMETER_VALUE_OVERRIDE));
+
+    boolean initialized = this.pearAnalysisEngineWrapper.initialize(pearSpecifier, new HashMap<>());
+
+    assertThat(initialized).isTrue().as("Pear was initialized");
+    assertThat(pearAnalysisEngineWrapper.getConfigParameterValue(PARAMETER_NAME))
+        .isEqualTo(PARAMETER_VALUE_OVERRIDE)
+        .as("The value of StringParam was overridden");
+  }
+
+  public void testInitializeWithOverrideModernTakingPrecedenceOverLegacy() throws Exception {
+
+    PearSpecifier_impl pearSpecifier = new PearSpecifier_impl();
+    pearSpecifier.setPearPath(this.installedPearPackage.getRootDirectory().toString());
+    pearSpecifier.setParameters(new Parameter_impl(PARAMETER_NAME, "legacy"));
+    pearSpecifier.setPearParameters(new NameValuePair_impl(PARAMETER_NAME, "modern"));
+
+    boolean initialized = this.pearAnalysisEngineWrapper.initialize(pearSpecifier, new HashMap<>());
+
+    assertThat(initialized).isTrue().as("Pear was initialized");
+    assertThat(pearAnalysisEngineWrapper.getConfigParameterValue(PARAMETER_NAME))
+        .isEqualTo("modern")
+        .as("The value of StringParam was overridden");
+  }
+
+  public void testInitializeWithoutOverride() throws Exception {
+
+    PearSpecifier pearSpecifier = this.createPearSpecifierWithoutParameters();
+
+    boolean initialized = this.pearAnalysisEngineWrapper.initialize(pearSpecifier,
+            new HashMap<String, Object>());
+
+    Assert.assertTrue("Pear was not initialized", initialized);
+
+    String stringParamValue = (String) this.pearAnalysisEngineWrapper
+            .getConfigParameterValue(PearAnalysisEngineWrapperTest.PARAMETER_NAME);
+
+    Assert.assertEquals("The value of StringParam has changed",
+            PearAnalysisEngineWrapperTest.PARAMETER_VALUE, stringParamValue);
+  }
+
+  private PearSpecifier createPearSpecifierWithoutParameters() {
+
+    PearSpecifier_impl pearSpecifier_impl = new PearSpecifier_impl();
+    pearSpecifier_impl.setPearPath(this.installedPearPackage.getRootDirectory().toString());
+    return pearSpecifier_impl;
+  }
+
+  private File createInstallationDirectory() throws IOException {
+
+    File tempDirectory = File.createTempFile("pear_verification_test_", "tmp");
+    if (tempDirectory.delete()) {
+
+      if (!tempDirectory.mkdirs()) {
+        throw new IllegalStateException(
+                "Tmp directory (" + tempDirectory + ") could not be created");
+      }
+    }
+
+    return tempDirectory;
+  }
+
+  private PackageBrowser installPearPackage() {
+    File pearFile = JUnitExtension.getFile("pearTests/analysisEngineWithParameters.pear");
+    Assert.assertNotNull("analysisEngine.pear file not found", pearFile);
+
+    return PackageInstaller.installPackage(this.tempInstallDirectory, pearFile, false);
+  }
+
+  private void removeInstallationDirectory() throws IOException {
+    if (this.tempInstallDirectory != null) {
+      FileUtil.deleteDirectory(this.tempInstallDirectory);
+    }
+  }
+}
diff --git a/uimaj-core/src/test/java/org/apache/uima/resource/impl/PearSpecifier_implTest.java b/uimaj-core/src/test/java/org/apache/uima/resource/impl/PearSpecifier_implTest.java
index a5f7729..d61b7ee 100644
--- a/uimaj-core/src/test/java/org/apache/uima/resource/impl/PearSpecifier_implTest.java
+++ b/uimaj-core/src/test/java/org/apache/uima/resource/impl/PearSpecifier_implTest.java
@@ -19,6 +19,7 @@
 package org.apache.uima.resource.impl;
 
 import static org.apache.uima.analysis_engine.impl.AnalysisEngineDescription_implTest.encoding;
+import static org.assertj.core.api.Assertions.assertThat;
 
 import java.io.ByteArrayInputStream;
 import java.io.StringWriter;
@@ -45,34 +46,42 @@ public class PearSpecifier_implTest extends TestCase {
   public void testProducePearResource() throws Exception {
     PearSpecifier specifier = UIMAFramework.getResourceSpecifierFactory().createPearSpecifier();
     specifier.setPearPath("/home/user/uimaApp/installedPears/testpear");
-    NameValuePair[] pearParameters = new NameValuePair[2];
-    pearParameters[0] = UIMAFramework.getResourceSpecifierFactory().createNameValuePair();
-    pearParameters[0].setName("param1");
-    pearParameters[0].setValue("val1");
-    pearParameters[1] = UIMAFramework.getResourceSpecifierFactory().createNameValuePair();
-    pearParameters[1].setName("param2");
-    pearParameters[1].setValue("val2");
-    specifier.setPearParameters(pearParameters);  
+    specifier.setParameters(new Parameter_impl("legacyParam1", "legacyVal1"),
+        new Parameter_impl("legacyParam2", "legacyVal2"));
+    specifier.setPearParameters(new NameValuePair_impl("param1", "stringVal1"), 
+        new NameValuePair_impl("param2", "stringVal2"));
       
     //compare created specifier with available test specifier
     XMLInputSource in = new XMLInputSource(
             JUnitExtension.getFile("XmlParserTest/TestPearSpecifier.xml"));
     PearSpecifier pearSpec = UIMAFramework.getXMLParser().parsePearSpecifier(in);
     
-    Assert.assertEquals(pearSpec.getPearPath(), specifier.getPearPath());
-    Assert.assertEquals(pearSpec.getPearParameters()[0].getValue(), specifier.getPearParameters()[0].getValue());
-    Assert.assertEquals(pearSpec.getPearParameters()[1].getValue(), specifier.getPearParameters()[1].getValue());   
+    assertThat(specifier.getPearPath()).isEqualTo(pearSpec.getPearPath());
+
+    assertThat(specifier.getParameters())
+        .usingElementComparatorOnFields("name", "value")
+        .containsExactly(pearSpec.getParameters());
+
+    assertThat(specifier.getPearParameters())
+        .usingElementComparatorOnFields("name", "value")
+        .containsExactly(pearSpec.getPearParameters());
+    
     
     //compare created specifier with a manually create pear specifier
     PearSpecifier manPearSpec = new PearSpecifier_impl();
     manPearSpec.setPearPath("/home/user/uimaApp/installedPears/testpear");
-    manPearSpec.setPearParameters(new NameValuePair[] { new NameValuePair_impl("param1", "val1"),
-        new NameValuePair_impl("param2", "val2") });
-
-    Assert.assertEquals(manPearSpec.getPearPath(), specifier.getPearPath());
-    Assert.assertEquals(manPearSpec.getPearParameters()[0].getValue(), specifier.getPearParameters()[0].getValue());
-    Assert.assertEquals(manPearSpec.getPearParameters()[1].getValue(), specifier.getPearParameters()[1].getValue());   
+    manPearSpec.setParameters(new Parameter_impl("legacyParam1", "legacyVal1"),
+            new Parameter_impl("legacyParam2", "legacyVal2"));
+    manPearSpec.setPearParameters(new NameValuePair_impl("param1", "stringVal1"),
+        new NameValuePair_impl("param2", "stringVal2"));
 
+    assertThat(specifier.getParameters())
+        .usingElementComparatorOnFields("name", "value")
+        .containsExactly(manPearSpec.getParameters());
+    
+    assertThat(specifier.getPearParameters())
+        .usingElementComparatorOnFields("name", "value")
+        .containsExactly(manPearSpec.getPearParameters());
   }
   
   /*
@@ -82,6 +91,8 @@ public class PearSpecifier_implTest extends TestCase {
     try {
       PearSpecifier pearSpec = new PearSpecifier_impl();
       pearSpec.setPearPath("/home/user/uimaApp/installedPears/testpear");
+      pearSpec.setParameters(new Parameter_impl("param1", "val1"),
+              new Parameter_impl("param2", "val2"));
       pearSpec.setPearParameters(new NameValuePair[] { new NameValuePair_impl("param1", "val1"),
           new NameValuePair_impl("param2", "val2") });
 
diff --git a/uimaj-core/src/test/java/org/apache/uima/util/impl/XMLParser_implTest.java b/uimaj-core/src/test/java/org/apache/uima/util/impl/XMLParser_implTest.java
index 628e803..0ec53ae 100644
--- a/uimaj-core/src/test/java/org/apache/uima/util/impl/XMLParser_implTest.java
+++ b/uimaj-core/src/test/java/org/apache/uima/util/impl/XMLParser_implTest.java
@@ -19,6 +19,9 @@
 
 package org.apache.uima.util.impl;
 
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.tuple;
+
 import java.io.File;
 
 import javax.xml.parsers.SAXParser;
@@ -186,11 +189,13 @@ public class XMLParser_implTest extends TestCase {
             JUnitExtension.getFile("XmlParserTest/TestPearSpecifier.xml"));
     PearSpecifier pearSpec = this.mXmlParser.parsePearSpecifier(in);
     assertEquals("/home/user/uimaApp/installedPears/testpear", pearSpec.getPearPath());
-    NameValuePair[] pearParams = pearSpec.getPearParameters();
-    assertEquals(2, pearParams.length);
-    assertEquals("param1", pearParams[0].getName());
-    assertEquals("val1", pearParams[0].getValue());
-    assertEquals("param2", pearParams[1].getName());
-    assertEquals("val2", pearParams[1].getValue());  
+    
+    assertThat(pearSpec.getParameters())
+        .extracting(Parameter::getName, Parameter::getValue)
+        .containsExactly(tuple("param1", "val1"), tuple("param2", "val2"));
+
+    assertThat(pearSpec.getPearParameters())
+        .extracting(NameValuePair::getName, NameValuePair::getValue)
+        .containsExactly(tuple("param1", "stringVal1"), tuple("param2", "stringVal2"));
   }
 }
diff --git a/uimaj-core/src/test/resources/XmlParserTest/TestPearSpecifier.xml b/uimaj-core/src/test/resources/XmlParserTest/TestPearSpecifier.xml
index 022dca9..09fa76e 100644
--- a/uimaj-core/src/test/resources/XmlParserTest/TestPearSpecifier.xml
+++ b/uimaj-core/src/test/resources/XmlParserTest/TestPearSpecifier.xml
@@ -1,31 +1,35 @@
-<!--
- * 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.
- -->
-<pearSpecifier xmlns="http://uima.apache.org/resourceSpecifier">
-   <pearPath>/home/user/uimaApp/installedPears/testpear</pearPath>
-   <pearParameters>
-     <nameValuePair>
-     	<name>param1</name>
-     	<value><string>val1</string></value>
-     </nameValuePair>
-     <nameValuePair>
-     	<name>param2</name>
-     	<value><string>val2</string></value>
-     </nameValuePair>
-   </pearParameters>  
+<!--
+ * 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.
+ -->
+<pearSpecifier xmlns="http://uima.apache.org/resourceSpecifier">
+   <pearPath>/home/user/uimaApp/installedPears/testpear</pearPath>
+   <parameters>
+     <parameter name="legacyParam1" value="legacyVal1"/>
+     <parameter name="legacyParam2" value="legacyVal2"/>
+   </parameters>
+   <pearParameters>
+     <nameValuePair>
+     	<name>param1</name>
+     	<value><string>stringVal1</string></value>
+     </nameValuePair>
+     <nameValuePair>
+     	<name>param2</name>
+     	<value><string>stringVal2</string></value>
+     </nameValuePair>
+   </pearParameters>
 </pearSpecifier>
\ No newline at end of file
diff --git a/uimaj-parent/pom.xml b/uimaj-parent/pom.xml
index beeebb5..cc21d3e 100644
--- a/uimaj-parent/pom.xml
+++ b/uimaj-parent/pom.xml
@@ -156,6 +156,16 @@
         <version>4.12</version>
         <scope>test</scope>
       </dependency>
+      <dependency>
+        <groupId>org.assertj</groupId>
+        <artifactId>assertj-core</artifactId>
+        <version>3.14.0</version>
+      </dependency>
+      <dependency>
+        <groupId>xmlunit</groupId>
+        <artifactId>xmlunit</artifactId>
+        <version>1.6</version>
+      </dependency>
     </dependencies>
   </dependencyManagement>
   
diff --git a/uimaj-test-util/pom.xml b/uimaj-test-util/pom.xml
index 287659b..0102561 100644
--- a/uimaj-test-util/pom.xml
+++ b/uimaj-test-util/pom.xml
@@ -65,10 +65,13 @@
 			<artifactId>junit</artifactId>
 			<scope>compile</scope>  <!-- needed because dependency management has it as test -->
 		</dependency>
+    <dependency>
+      <groupId>org.assertj</groupId>
+      <artifactId>assertj-core</artifactId>
+    </dependency>
 		<dependency>
       <groupId>xmlunit</groupId>
       <artifactId>xmlunit</artifactId>
-      <version>1.6</version>
     </dependency>
 	</dependencies>
 </project>