You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by bu...@apache.org on 2012/06/07 00:32:47 UTC

svn commit: r1347183 - in /uima/uimaj/trunk/uimaj-core/src: main/java/org/apache/uima/analysis_engine/asb/impl/ main/java/org/apache/uima/analysis_engine/impl/ test/java/org/apache/uima/analysis_engine/impl/ test/resources/TextAnalysisEngineImplTest/

Author: burn
Date: Wed Jun  6 22:32:46 2012
New Revision: 1347183

URL: http://svn.apache.org/viewvc?rev=1347183&view=rev
Log:
[UIMA-2418] Use LinkedHashMap to hold the delegates in an aggregate to preserve their declaration order.  Added a JUnit test.

Added:
    uima/uimaj/trunk/uimaj-core/src/test/resources/TextAnalysisEngineImplTest/AggregateWithManyDelegates.xml
Modified:
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/ASB_impl.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/AnalysisEngineDescription_impl.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/AnalysisEngineManagementImpl.java
    uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/analysis_engine/impl/AnalysisEngine_implTest.java
    uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/analysis_engine/impl/TestAnnotator2.java

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/ASB_impl.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/ASB_impl.java?rev=1347183&r1=1347182&r2=1347183&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/ASB_impl.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/ASB_impl.java Wed Jun  6 22:32:46 2012
@@ -23,6 +23,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -89,7 +90,7 @@ public class ASB_impl extends Resource_I
    * Map from String key to delegate AnalysisEngine for all component AnalysisEngines within this
    * ASB.
    */
-  private Map<String, AnalysisEngine> mComponentAnalysisEngineMap = new HashMap<String, AnalysisEngine>();
+  private Map<String, AnalysisEngine> mComponentAnalysisEngineMap = new LinkedHashMap<String, AnalysisEngine>();
 
   /**
    * Map from String key to delegate AnalysisEngineMetaData for all component AnalysisEngines within
@@ -101,7 +102,7 @@ public class ASB_impl extends Resource_I
   /**
    * Map from String key to component (AnalysisEngine or FlowController) metadata.
    */
-  private Map<String, ProcessingResourceMetaData> mAllComponentMetaDataMap = new HashMap<String, ProcessingResourceMetaData>();
+  private Map<String, ProcessingResourceMetaData> mAllComponentMetaDataMap = new LinkedHashMap<String, ProcessingResourceMetaData>();
 
   /**
    * Initialization parameters passed to this ASB's initialize method. They will be passed along to
@@ -272,7 +273,7 @@ public class ASB_impl extends Resource_I
     initFlowController(aFlowControllerDeclaration, aParentContext, aAggregateMetadata);
 
     // initialize the AllComponentMetaData map to include AEs plus the FlowController
-    mAllComponentMetaDataMap = new HashMap<String, ProcessingResourceMetaData>(mComponentAnalysisEngineMetaDataMap);
+    mAllComponentMetaDataMap = new LinkedHashMap<String, ProcessingResourceMetaData>(mComponentAnalysisEngineMetaDataMap);
     mAllComponentMetaDataMap.put(aFlowControllerDeclaration.getKey(), mFlowControllerContainer
             .getProcessingResourceMetaData());
     mAllComponentMetaDataMap = Collections.unmodifiableMap(mAllComponentMetaDataMap);

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/AnalysisEngineDescription_impl.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/AnalysisEngineDescription_impl.java?rev=1347183&r1=1347182&r2=1347183&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/AnalysisEngineDescription_impl.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/AnalysisEngineDescription_impl.java Wed Jun  6 22:32:46 2012
@@ -28,6 +28,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -102,9 +103,9 @@ public class AnalysisEngineDescription_i
 
   private FlowControllerDeclaration mFlowControllerDeclaration;
 
-  private Map<String, ResourceSpecifier> mDelegateAnalysisEngineSpecifiers = new HashMap<String, ResourceSpecifier>();
+  private Map<String, ResourceSpecifier> mDelegateAnalysisEngineSpecifiers = new LinkedHashMap<String, ResourceSpecifier>();
 
-  private Map<String, MetaDataObject> mDelegateAnalysisEngineSpecifiersWithImports = new HashMap<String, MetaDataObject>();
+  private Map<String, MetaDataObject> mDelegateAnalysisEngineSpecifiersWithImports = new LinkedHashMap<String, MetaDataObject>();
 
   private Map<String, Import> mProcessedImports = new HashMap<String, Import>();
 
@@ -218,7 +219,7 @@ public class AnalysisEngineDescription_i
       aResourceManager = UIMAFramework.newDefaultResourceManager();
     }
     resolveImports(aResourceManager);
-    Map<String, ResourceSpecifier> map = new HashMap<String, ResourceSpecifier>(mDelegateAnalysisEngineSpecifiers);
+    Map<String, ResourceSpecifier> map = new LinkedHashMap<String, ResourceSpecifier>(mDelegateAnalysisEngineSpecifiers);
     if (getFlowControllerDeclaration() != null) {
       map.put(getFlowControllerDeclaration().getKey(), getFlowControllerDeclaration()
               .getSpecifier());

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/AnalysisEngineManagementImpl.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/AnalysisEngineManagementImpl.java?rev=1347183&r1=1347182&r2=1347183&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/AnalysisEngineManagementImpl.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/AnalysisEngineManagementImpl.java Wed Jun  6 22:32:46 2012
@@ -21,9 +21,9 @@ package org.apache.uima.analysis_engine.
 
 import java.text.DecimalFormat;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Set;
 import java.util.regex.Pattern;
@@ -70,7 +70,7 @@ public class AnalysisEngineManagementImp
 
   private long serviceCallTime;
 
-  private Map<String, AnalysisEngineManagement> components = new HashMap<String, AnalysisEngineManagement>();
+  private Map<String, AnalysisEngineManagement> components = new LinkedHashMap<String, AnalysisEngineManagement>();
 
   private String uniqueMBeanName;
 

Modified: uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/analysis_engine/impl/AnalysisEngine_implTest.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/analysis_engine/impl/AnalysisEngine_implTest.java?rev=1347183&r1=1347182&r2=1347183&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/analysis_engine/impl/AnalysisEngine_implTest.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/analysis_engine/impl/AnalysisEngine_implTest.java Wed Jun  6 22:32:46 2012
@@ -19,6 +19,7 @@
 
 package org.apache.uima.analysis_engine.impl;
 
+import java.io.BufferedOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
@@ -60,6 +61,7 @@ import org.apache.uima.cas.text.Annotati
 import org.apache.uima.resource.Resource;
 import org.apache.uima.resource.ResourceInitializationException;
 import org.apache.uima.resource.ResourceManager;
+import org.apache.uima.resource.ResourceSpecifier;
 import org.apache.uima.resource.impl.URISpecifier_impl;
 import org.apache.uima.resource.metadata.AllowedValue;
 import org.apache.uima.resource.metadata.Capability;
@@ -86,8 +88,11 @@ import org.apache.uima.util.InvalidXMLEx
 import org.apache.uima.util.Level;
 import org.apache.uima.util.Settings;
 import org.apache.uima.util.XMLInputSource;
+import org.apache.uima.util.XMLParser;
+import org.apache.uima.util.XMLSerializer;
 import org.apache.uima.util.impl.ProcessTrace_impl;
 import org.apache.uima.util.impl.Settings_impl;
+import org.xml.sax.ContentHandler;
 
 /**
  * Tests the TextAnalysisEngine_impl class.
@@ -1487,5 +1492,38 @@ public class AnalysisEngine_implTest ext
     }
   }
   
+  public void testManyDelegates() throws Exception {
+    // Test that an aggregate can be copied preserving all comments and ordering of delegates
+    XMLParser.ParsingOptions parsingOptions = new XMLParser.ParsingOptions(false);
+    parsingOptions.preserveComments = true;
+    XMLParser parser = UIMAFramework.getXMLParser();
+    File inFile = JUnitExtension.getFile("TextAnalysisEngineImplTest/AggregateWithManyDelegates.xml");
+    AnalysisEngineDescription desc = parser.parseAnalysisEngineDescription(new XMLInputSource(inFile), parsingOptions);
+
+    // Write out descriptor
+    File cloneFile = new File(inFile.getParentFile(), "CopyOfAggregateWithManyDelegates.xml");
+    BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(cloneFile));
+    XMLSerializer xmlSerializer = new XMLSerializer(true);
+    xmlSerializer.setOutputStream(os);
+    xmlSerializer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
+    ContentHandler contentHandler = xmlSerializer.getContentHandler();
+    contentHandler.startDocument();
+    desc.toXML(contentHandler, true);
+    contentHandler.endDocument();
+    os.close();
+    assertEquals(inFile.length(), cloneFile.length());
+
+    // Initialize all delegates and check the initialization order (should be declaration order)
+    TestAnnotator2.allContexts = "";
+    UIMAFramework.produceAnalysisEngine(desc);
+    assertEquals("D/C/B/A/F/E/", TestAnnotator2.allContexts);
+    
+    // Check that copying aggregate preserved the order of the delegates
+    desc = parser.parseAnalysisEngineDescription(new XMLInputSource(cloneFile), parsingOptions);
+    TestAnnotator2.allContexts = "";
+    UIMAFramework.produceAnalysisEngine(desc);
+    assertEquals("D/C/B/A/F/E/", TestAnnotator2.allContexts);
+    cloneFile.delete();
+  }
   
 }

Modified: uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/analysis_engine/impl/TestAnnotator2.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/analysis_engine/impl/TestAnnotator2.java?rev=1347183&r1=1347182&r2=1347183&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/analysis_engine/impl/TestAnnotator2.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/analysis_engine/impl/TestAnnotator2.java Wed Jun  6 22:32:46 2012
@@ -40,7 +40,7 @@ import org.apache.uima.util.impl.Setting
  * 
  */
 public class TestAnnotator2 extends CasAnnotator_ImplBase {
-  // Process method saves information to these static fields,
+  // Initialize and process methods save information to these static fields,
   // which are queried by the unit test.
   public static String lastDocument;
 
@@ -48,6 +48,8 @@ public class TestAnnotator2 extends CasA
 
   public static boolean typeSystemInitCalled;
 
+  public static String allContexts = "";
+  
   public static synchronized String getLastDocument() {
     return lastDocument;  
   }
@@ -93,6 +95,8 @@ public class TestAnnotator2 extends CasA
         Assert.fail(e.toString());
       }
     }
+    // Used to check initialization order by testManyDelegates
+    allContexts  = allContexts + contextName.substring(1);
   }
 
   public void typeSystemInit(TypeSystem aTypeSystem) {

Added: uima/uimaj/trunk/uimaj-core/src/test/resources/TextAnalysisEngineImplTest/AggregateWithManyDelegates.xml
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/test/resources/TextAnalysisEngineImplTest/AggregateWithManyDelegates.xml?rev=1347183&view=auto
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/test/resources/TextAnalysisEngineImplTest/AggregateWithManyDelegates.xml (added)
+++ uima/uimaj/trunk/uimaj-core/src/test/resources/TextAnalysisEngineImplTest/AggregateWithManyDelegates.xml Wed Jun  6 22:32:46 2012
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- * 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.                                           * -->
+<!--                                                                  -->
+<!-- Note: Multi-line comments cause problems on Windows as the       -->
+<!-- internal LFs are not expanded back to CR/LF on output.           -->
+<!--                                                                  -->
+<!-- Descriptor for testing the editing and copying of an aggregate.  -->
+<!--                                                                  -->
+<analysisEngineDescription xmlns="http://uima.apache.org/resourceSpecifier">
+  <frameworkImplementation>org.apache.uima.java</frameworkImplementation>
+  <primitive>false</primitive>
+  <!-- Test that order of declarations is preserved when re-written  -->
+  <delegateAnalysisEngineSpecifiers>
+    <delegateAnalysisEngine key="D">
+      <import location="TestPrimitiveTae2.xml"/>
+    </delegateAnalysisEngine>
+    <delegateAnalysisEngine key="C">
+      <import location="TestPrimitiveTae2.xml"/>
+    </delegateAnalysisEngine>
+    <delegateAnalysisEngine key="B">
+      <import location="TestPrimitiveTae2.xml"/>
+    </delegateAnalysisEngine>
+    <delegateAnalysisEngine key="A">
+      <import location="TestPrimitiveTae2.xml"/>
+    </delegateAnalysisEngine>
+    <delegateAnalysisEngine key="F">
+      <import location="TestPrimitiveTae2.xml"/>
+    </delegateAnalysisEngine>
+    <delegateAnalysisEngine key="E">
+      <import location="TestPrimitiveTae2.xml"/>
+    </delegateAnalysisEngine>
+  </delegateAnalysisEngineSpecifiers>
+  <!-- The above declaration order should be preserved when the UIMA APIs are used to parse and -->
+  <!-- serialize back to disk  -->
+  <analysisEngineMetaData>
+    <name>AggregateWithManyDelegates</name>
+    <description/>
+    <version>1.0</version>
+    <vendor/>
+    <configurationParameters/>
+    <configurationParameterSettings/>
+    <flowConstraints>
+      <fixedFlow>
+        <node>A</node>
+        <node>B</node>
+        <node>C</node>
+        <node>D</node>
+        <node>E</node>
+        <node>F</node>
+      </fixedFlow>
+    </flowConstraints>
+    <fsIndexCollection/>
+    <capabilities>
+      <capability>
+        <inputs/>
+        <outputs/>
+        <languagesSupported/>
+      </capability>
+    </capabilities>
+    <operationalProperties>
+      <modifiesCas>true</modifiesCas>
+      <multipleDeploymentAllowed>true</multipleDeploymentAllowed>
+      <outputsNewCASes>false</outputsNewCASes>
+    </operationalProperties>
+  </analysisEngineMetaData>
+  <resourceManagerConfiguration/>
+</analysisEngineDescription>
\ No newline at end of file