You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by sc...@apache.org on 2014/09/08 23:08:21 UTC

svn commit: r1623579 - /uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/XmiSerializationSharedData.java

Author: schor
Date: Mon Sep  8 21:08:21 2014
New Revision: 1623579

URL: http://svn.apache.org/r1623579
Log:
[UIMA-4004] change to better data structures and store values as ints

Modified:
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/XmiSerializationSharedData.java

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/XmiSerializationSharedData.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/XmiSerializationSharedData.java?rev=1623579&r1=1623578&r2=1623579&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/XmiSerializationSharedData.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/XmiSerializationSharedData.java Mon Sep  8 21:08:21 2014
@@ -20,18 +20,18 @@
 package org.apache.uima.cas.impl;
 
 import java.util.ArrayList;
+import java.util.BitSet;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
+import org.apache.uima.internal.util.Int2IntHashMap;
+import org.apache.uima.internal.util.IntListIterator;
 import org.apache.uima.internal.util.XmlAttribute;
 import org.apache.uima.internal.util.XmlElementName;
 import org.apache.uima.internal.util.XmlElementNameAndContents;
-import org.apache.uima.internal.util.rb_trees.RedBlackTree;
 
 /**
  * A container for data that is shared between the {@link XmiCasSerializer} and the {@link XmiCasDeserializer}.
@@ -61,7 +61,7 @@ public class XmiSerializationSharedData 
    * getXmiId() method, which is done to ensure a consistent ID for each FS 
    * address across multiple serializations.
    */
-  private RedBlackTree<String> fsAddrToXmiIdMap = new RedBlackTree<String>();
+  private Int2IntHashMap fsAddrToXmiIdMap = new Int2IntHashMap();
   
   /** 
    * A map from xmi:id to FeatureStructure address.  This is populated whenever
@@ -69,7 +69,7 @@ public class XmiSerializationSharedData 
    * getFsAddrForXmiId() method, necessary to support merging multiple XMI
    * CASes into the same CAS object.
    **/
-  private RedBlackTree<Integer> xmiIdToFsAddrMap = new RedBlackTree<Integer>();
+  private Int2IntHashMap xmiIdToFsAddrMap = new Int2IntHashMap();
   
   /**
    * List of OotsElementData objects, each of which captures information about
@@ -107,33 +107,31 @@ public class XmiSerializationSharedData 
    * FS address of the encompassing FS which has a feature whose value is this multi-valued FS.
    * Used when deserializing a Delta CAS to find and serialize the encompassing FS when 
    * the non-shared array/list FS is modified. 
-   * @param fsAddr
-   * @param xmiId
    */
-  RedBlackTree<Integer> nonsharedfeatureIdToFSId = new RedBlackTree<Integer>();
+  Int2IntHashMap nonsharedfeatureIdToFSId = new Int2IntHashMap();
 
   void addIdMapping(int fsAddr, int xmiId) {
-    fsAddrToXmiIdMap.put(fsAddr, Integer.toString(xmiId));
+    fsAddrToXmiIdMap.put(fsAddr, xmiId);
     xmiIdToFsAddrMap.put(xmiId, fsAddr);
     if (xmiId > maxXmiId)
       maxXmiId = xmiId;
   }
 
   String getXmiId(int fsAddr) {
+    return Integer.toString(getXmiIdAsInt(fsAddr));
+  }
+
+  int getXmiIdAsInt(int fsAddr) {
     // see if we already have a mapping
-    String xmiId = fsAddrToXmiIdMap.get(fsAddr);
-    if (xmiId != null) {
-      return xmiId;
-    } else // no mapping for this FS. Generate a unique ID
-    {
+    int xmiId = fsAddrToXmiIdMap.get(fsAddr);
+    if (xmiId == 0) {
       // to be sure we get a unique Id, increment maxXmiId and use that
-      String idStr = Integer.toString(++maxXmiId);
-      fsAddrToXmiIdMap.put(fsAddr, idStr);
-      xmiIdToFsAddrMap.put(maxXmiId, Integer.valueOf(fsAddr));
-      return idStr;
+      xmiId = ++maxXmiId;
+      fsAddrToXmiIdMap.put(fsAddr, xmiId);
+      xmiIdToFsAddrMap.put(xmiId, fsAddr);
     }
+    return xmiId;
   }
-
   
   /**
    * Gets the maximum xmi:id that has been generated or read so far.
@@ -272,7 +270,7 @@ public class XmiSerializationSharedData 
    * @return an array containing all the FS addresses
    */
   public int[] getAllFsAddressesInIdMap() {
-    return fsAddrToXmiIdMap.keySet();
+    return fsAddrToXmiIdMap.getSortedKeys();
   }  
   
   /**
@@ -286,6 +284,10 @@ public class XmiSerializationSharedData 
     return this.ootsArrayElements.get(Integer.valueOf(addr));
   }
   
+  public boolean hasOutOfTypeSystemArrayElements() {
+    return ootsArrayElements != null && ootsArrayElements.size() > 0;
+  }
+  
 
   /**
    * Records an out-of-typesystem array element in the XmiSerializationSharedData.
@@ -311,7 +313,7 @@ public class XmiSerializationSharedData 
    * @param fsAddr - fs address of encompassing featurestructure
    */
   public void addNonsharedRefToFSMapping(int nonsharedFSAddr, int fsAddr) {
-	this.nonsharedfeatureIdToFSId.put(nonsharedFSAddr, Integer.valueOf(fsAddr));
+	this.nonsharedfeatureIdToFSId.put(nonsharedFSAddr, fsAddr);
   }
   
   /**
@@ -319,7 +321,7 @@ public class XmiSerializationSharedData 
    * @return the non-shared featureId to FS Id key set
    */
   public int[] getNonsharedMulitValuedFSs() {
-    return this.nonsharedfeatureIdToFSId.keySet();
+    return this.nonsharedfeatureIdToFSId.getSortedKeys();
   }
   
   /**
@@ -328,21 +330,22 @@ public class XmiSerializationSharedData 
    * @return the int handle to the encompassing FS or -1 if not found
    */
   public int getEncompassingFS(int nonsharedFS) {
-	Integer addr = (Integer) this.nonsharedfeatureIdToFSId.get(nonsharedFS);
-	return addr == null ? -1 : addr.intValue();
+	int addr = nonsharedfeatureIdToFSId.get(nonsharedFS);
+	return addr == 0 ? -1 : addr;
   }
   
   /**
    * For debugging purposes only.
    */
   void checkForDups() {
-    Set<String> ids = new HashSet<String>();
-    Iterator<String> iter = fsAddrToXmiIdMap.iterator();
+    BitSet ids = new BitSet();
+    IntListIterator iter = fsAddrToXmiIdMap.keyIterator();
     while (iter.hasNext()) {
-      String xmiId = (String) iter.next();
-      if (!ids.add(xmiId)) {
+      int xmiId = iter.next();
+      if (ids.get(xmiId)) {
         throw new RuntimeException("Duplicate ID " + xmiId + "!");
       }
+      ids.set(xmiId);
     }
   }
 
@@ -351,7 +354,7 @@ public class XmiSerializationSharedData 
    */
   public String toString() {
     StringBuffer buf = new StringBuffer();
-    int[] keys = fsAddrToXmiIdMap.keySet();
+    int[] keys = fsAddrToXmiIdMap.getSortedKeys();
     for (int i = 0; i < keys.length; i++) {
       buf.append(keys[i]).append(": ").append(fsAddrToXmiIdMap.get(keys[i])).append('\n');
     }