[jboss-svn-commits] JBoss Common SVN: r3860 - in jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling: position and 1 other directory.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Dec 15 17:58:17 EST 2009


Author: alex.loubyansky at jboss.com
Date: 2009-12-15 17:58:16 -0500 (Tue, 15 Dec 2009)
New Revision: 3860

Modified:
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/TypeBinding.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/position/ElementPosition.java
Log:
use ElementPosition local variable to store objects created by interceptors instead of pushing them to the global position stack

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/TypeBinding.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/TypeBinding.java	2009-12-15 18:30:37 UTC (rev 3859)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/TypeBinding.java	2009-12-15 22:58:16 UTC (rev 3860)
@@ -391,7 +391,7 @@
    public List<ElementInterceptor> getInterceptors(QName qName)
    {
       List<ElementInterceptor> list = interceptors.get(qName);
-      return list == null ? Collections.EMPTY_LIST : list;
+      return list == null ? Collections.<ElementInterceptor>emptyList() : list;
    }
    
    public TypeBinding getBaseType()

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/position/ElementPosition.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/position/ElementPosition.java	2009-12-15 18:30:37 UTC (rev 3859)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/position/ElementPosition.java	2009-12-15 22:58:16 UTC (rev 3860)
@@ -64,6 +64,8 @@
    private Boolean indentation;
    private boolean ignorableCharacters = true;
 
+   private Object[] interceptorObjects;
+
    public ElementPosition(QName qName, ParticleBinding particle)
    {
       super(qName, particle);
@@ -288,9 +290,14 @@
    {
       ElementBinding element = (ElementBinding) particle.getTerm();
       TypeBinding type = element.getType();
-      List<ElementInterceptor> interceptors = element.getInterceptors();
-      List<ElementInterceptor> localInterceptors = parentType == null ? Collections.<ElementInterceptor>emptyList() : parentType.getInterceptors(qName);
-      int allInterceptors = interceptors.size() + localInterceptors.size();
+      
+      List<ElementInterceptor> interceptors = null;
+      List<ElementInterceptor> localInterceptors = null;
+      if(interceptorObjects != null)
+      {
+         interceptors = element.getInterceptors();
+         localInterceptors = parentType == null ? Collections.<ElementInterceptor>emptyList() : parentType.getInterceptors(qName);
+      }
 
       if(o != SundayContentHandler.NIL)
       {
@@ -393,22 +400,20 @@
                }
             }
 
-            if(allInterceptors > 0)
+            if(interceptorObjects != null)
             {
                NamespaceRegistry nsRegistry = stack.getNamespaceRegistry();
-               Position iPos = previous;
+               int ioIndex = 0;
                for (int i = interceptors.size() - 1; i >= 0; --i)
                {
                   ElementInterceptor interceptor = interceptors.get(i);
-                  interceptor.characters(iPos.getValue(), qName, type, nsRegistry, dataContent);
-                  iPos = iPos.getPrevious();
+                  interceptor.characters(interceptorObjects[ioIndex++], qName, type, nsRegistry, dataContent);
                }
 
                for (int i = localInterceptors.size() - 1; i >= 0; --i)
                {
                   ElementInterceptor interceptor = localInterceptors.get(i);
-                  interceptor.characters(iPos.getValue(), qName, type, nsRegistry, dataContent);
-                  iPos = iPos.getPrevious();
+                  interceptor.characters(interceptorObjects[ioIndex++], qName, type, nsRegistry, dataContent);
                }
             }
          }
@@ -424,14 +429,13 @@
 
       o = handler.endParticle(o, qName, particle);
 
-      if(!interceptors.isEmpty())
+      if(interceptorObjects != null && !interceptors.isEmpty())
       {
-         Position iPos = previous;
+         int ioIndex = 0;
          for (int i = interceptors.size() - 1; i >= 0; --i)
          {
             ElementInterceptor interceptor = interceptors.get(i);
-            interceptor.endElement(iPos.getValue(), qName, type);
-            iPos = iPos.getPrevious();
+            interceptorObjects[ioIndex] = interceptor.endElement(interceptorObjects[ioIndex++], qName, type);
          }
       }
       
@@ -439,7 +443,7 @@
       // setParent
       //
 
-      if(allInterceptors == 0)
+      if(interceptorObjects == null)
       {
          Position notSkippedParent = notSkippedParent();
          if (notSkippedParent != null)
@@ -476,12 +480,11 @@
       }
       else
       {
-         stack.pop(); // which is this
-
+         int ioIndex = 0;
          for(int i = interceptors.size() - 1; i >= 0; --i)
          {
             ElementInterceptor interceptor = interceptors.get(i);
-            Object parent = stack.pop().getValue();
+            Object parent = interceptorObjects[ioIndex++];
             interceptor.add(parent, o, qName);
             o = parent;
          }
@@ -489,14 +492,10 @@
          for(int i = localInterceptors.size() - 1; i >= 0; --i)
          {
             ElementInterceptor interceptor = localInterceptors.get(i);
-            Object parent = stack.pop().getValue();
+            Object parent = interceptorObjects[ioIndex++];
             interceptor.add(parent, o, qName);
             o = parent;
          }
-
-         previous = stack.head();
-         previous.setNext(this);
-         stack.push(this);
       }
       
       ended = true;
@@ -589,38 +588,43 @@
 
       Object parent = previous == null ? null : previous.getValue();
 
-      List<ElementInterceptor> localInterceptors = parentType == null
-            ? Collections.<ElementInterceptor>emptyList()
-            : parentType.getInterceptors(qName);
-      List<ElementInterceptor> interceptors = element.getInterceptors();
-      if (interceptors.size() + localInterceptors.size() > 0)
+      if(parentType != null)
       {
-         if (repeated)
-            stack.pop();
-
+         List<ElementInterceptor> interceptors = parentType.getInterceptors(qName);
+         if(!interceptors.isEmpty())
+         {
+            NamespaceRegistry nsRegistry = stack.getNamespaceRegistry();
+            interceptorObjects = new Object[interceptors.size() + element.getInterceptors().size()];
+            // objects are written to the array in the reversed order to optimize endParticle iterations
+            int ioIndex = interceptorObjects.length - 1;
+            for(ElementInterceptor i : interceptors)
+            {
+               parent = i.startElement(parent, qName, type);
+               i.attributes(parent, qName, type, atts, nsRegistry);
+               interceptorObjects[ioIndex--] = parent;
+            }
+         }
+      }
+      
+      if(!element.getInterceptors().isEmpty())
+      {
          NamespaceRegistry nsRegistry = stack.getNamespaceRegistry();
-         for (int i = 0; i < localInterceptors.size(); ++i)
+         int ioIndex;
+         if(interceptorObjects == null)
          {
-            ElementInterceptor interceptor = localInterceptors.get(i);
-            parent = interceptor.startElement(parent, qName, type);
-            interceptor.attributes(parent, qName, type, atts, nsRegistry);
-            previous = new ElementPosition(qName, particle, parent, handler, parentType, previous);
-            stack.push(previous);
+            interceptorObjects = new Object[element.getInterceptors().size()];
+            ioIndex = interceptorObjects.length - 1;
          }
-
-         for (int i = 0; i < interceptors.size(); ++i)
+         else
+            ioIndex = element.getInterceptors().size() - 1;
+         for(ElementInterceptor i : element.getInterceptors())
          {
-            ElementInterceptor interceptor = interceptors.get(i);
-            parent = interceptor.startElement(parent, qName, type);
-            interceptor.attributes(parent, qName, type, atts, nsRegistry);
-            previous = new ElementPosition(qName, particle, parent, handler, parentType, previous);
-            stack.push(previous);
+            parent = i.startElement(parent, qName, type);
+            i.attributes(parent, qName, type, atts, nsRegistry);
+            interceptorObjects[ioIndex--] = parent;
          }
-
-         if (repeated)
-            stack.push(this);         
       }
-
+      
       if (!repeated)
          stack.push(this);
 



More information about the jboss-svn-commits mailing list