[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