[jboss-svn-commits] JBoss Common SVN: r3812 - jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sun Nov 29 11:22:41 EST 2009
Author: alex.loubyansky at jboss.com
Date: 2009-11-29 11:22:40 -0500 (Sun, 29 Nov 2009)
New Revision: 3812
Modified:
jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/AllBinding.java
jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ChoiceBinding.java
jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ElementBinding.java
jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/NonElementPosition.java
jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/NonElementTermBinding.java
jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SequenceBinding.java
jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SundayContentHandler.java
jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/UnorderedSequenceBinding.java
jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/WildcardBinding.java
Log:
making Position the main usable API and NonElementPosition override some its methods, other refactoring
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/AllBinding.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/AllBinding.java 2009-11-29 11:02:52 UTC (rev 3811)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/AllBinding.java 2009-11-29 16:22:40 UTC (rev 3812)
@@ -27,6 +27,7 @@
import java.util.Collection;
import javax.xml.namespace.QName;
import org.jboss.xb.binding.JBossXBRuntimeException;
+import org.jboss.xb.binding.sunday.unmarshalling.SundayContentHandler.Position;
import org.xml.sax.Attributes;
@@ -77,7 +78,7 @@
return elements.values();
}
- public NonElementPosition newPosition(QName qName, Attributes attrs, ParticleBinding allParticle)
+ public Position newPosition(QName qName, Attributes attrs, ParticleBinding allParticle)
{
ParticleBinding particle = elements.get(qName);
if(particle != null)
@@ -101,7 +102,7 @@
super(name, particle, currentParticle);
}
- protected NonElementPosition startElement(QName qName, Attributes atts, boolean required)
+ protected Position startElement(QName qName, Attributes atts, boolean required)
{
if(currentParticle != null && repeatTerm(qName, atts))
throw new IllegalStateException("maxOccurs in all model group can only be 1: " + qName);
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ChoiceBinding.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ChoiceBinding.java 2009-11-29 11:02:52 UTC (rev 3811)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ChoiceBinding.java 2009-11-29 16:22:40 UTC (rev 3812)
@@ -26,6 +26,8 @@
import java.util.ArrayList;
import java.util.Collection;
import javax.xml.namespace.QName;
+
+import org.jboss.xb.binding.sunday.unmarshalling.SundayContentHandler.Position;
import org.xml.sax.Attributes;
@@ -69,7 +71,7 @@
return choices;
}
- public NonElementPosition newPosition(QName qName, Attributes attrs, ParticleBinding choiceParticle)
+ public Position newPosition(QName qName, Attributes attrs, ParticleBinding choiceParticle)
{
for(int i = 0; i < choices.size(); ++i)
{
@@ -84,7 +86,7 @@
else
{
NonElementTermBinding ne = (NonElementTermBinding)item;
- NonElementPosition next = ne.newPosition(qName, attrs, particle);
+ Position next = ne.newPosition(qName, attrs, particle);
if(next != null)
return new ChoicePosition(qName, choiceParticle, particle, next);
}
@@ -106,12 +108,12 @@
super(name, particle, currentParticle);
}
- private ChoicePosition(QName name, ParticleBinding particle, ParticleBinding currentParticle, NonElementPosition next)
+ private ChoicePosition(QName name, ParticleBinding particle, ParticleBinding currentParticle, Position next)
{
super(name, particle, currentParticle, next);
}
- protected NonElementPosition startElement(QName qName, Attributes atts, boolean required)
+ protected Position startElement(QName qName, Attributes atts, boolean required)
{
if(trace)
{
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ElementBinding.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ElementBinding.java 2009-11-29 11:02:52 UTC (rev 3811)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ElementBinding.java 2009-11-29 16:22:40 UTC (rev 3812)
@@ -33,14 +33,16 @@
import org.jboss.xb.binding.metadata.ValueMetaData;
import org.jboss.xb.binding.JBossXBRuntimeException;
import org.jboss.xb.binding.sunday.marshalling.TermBeforeMarshallingCallback;
+import org.jboss.xb.binding.sunday.unmarshalling.SundayContentHandler.Position;
import org.jboss.xb.binding.sunday.xop.XOPUnmarshaller;
+import org.xml.sax.Attributes;
/**
* @author <a href="mailto:alex at jboss.org">Alexey Loubyansky</a>
* @version <tt>$Revision$</tt>
*/
public class ElementBinding
- extends TermBinding
+ extends TermBinding implements NonElementTermBinding
{
protected List<ElementInterceptor> interceptors = Collections.emptyList();
@@ -207,4 +209,9 @@
{
return super.toString() + "(" + qName + ", type=" + typeBinding.getQName() + ")";
}
+
+ public Position newPosition(QName name, Attributes attrs, ParticleBinding particle)
+ {
+ return null;
+ }
}
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/NonElementPosition.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/NonElementPosition.java 2009-11-29 11:02:52 UTC (rev 3811)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/NonElementPosition.java 2009-11-29 16:22:40 UTC (rev 3812)
@@ -23,7 +23,7 @@
import javax.xml.namespace.QName;
-import org.xml.sax.Attributes;
+import org.jboss.xb.binding.sunday.unmarshalling.SundayContentHandler.Position;
/**
* @author <a href="alex at jboss.com">Alexey Loubyansky</a>
@@ -31,9 +31,7 @@
*/
public abstract class NonElementPosition extends SundayContentHandler.Position
{
- protected int occurrence;
protected ParticleBinding currentParticle;
- protected NonElementPosition next;
protected NonElementPosition(QName qName, ParticleBinding particle)
{
@@ -45,15 +43,13 @@
{
this(name, particle);
this.currentParticle = currentParticle;
- occurrence = 1;
}
- protected NonElementPosition(QName name, ParticleBinding particle, ParticleBinding currentParticle, NonElementPosition next)
+ protected NonElementPosition(QName name, ParticleBinding particle, ParticleBinding currentParticle, Position next)
{
this(name, particle);
this.currentParticle = currentParticle;
this.next = next;
- occurrence = 1;
}
protected boolean isElement()
@@ -65,63 +61,14 @@
{
return true;
}
-
- public ParticleBinding getParticle()
- {
- return particle;
- }
-
- public NonElementPosition getNext()
- {
- return next;
- }
public ParticleBinding getCurrentParticle()
{
return currentParticle;
}
- public NonElementPosition startElement(QName qName, Attributes attrs)
+ public void setCurrentParticle(ParticleBinding currentParticle)
{
- return startElement(qName, attrs, true);
+ this.currentParticle = currentParticle;
}
-
- public boolean repeatTerm(QName qName, Attributes atts)
- {
- if(currentParticle == null)
- throw new IllegalStateException("The cursor has not been positioned yet!");
-
- boolean repeated = false;
- if(currentParticle.getMaxOccursUnbounded() ||
- occurrence < currentParticle.getMinOccurs() ||
- occurrence < currentParticle.getMaxOccurs())
- {
- TermBinding item = currentParticle.getTerm();
- if(item.isElement())
- {
- ElementBinding element = (ElementBinding)item;
- repeated = qName.equals(element.getQName());
- }
- else
- {
- NonElementTermBinding ne = (NonElementTermBinding)item;
- next = ne.newPosition(qName, atts, currentParticle);
- repeated = next != null;
- }
- }
-
- if(repeated)
- {
- ++occurrence;
- }
- else
- {
- currentParticle = null;
- occurrence = 0;
- }
-
- return repeated;
- }
-
- protected abstract NonElementPosition startElement(QName qName, Attributes atts, boolean required);
}
\ No newline at end of file
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/NonElementTermBinding.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/NonElementTermBinding.java 2009-11-29 11:02:52 UTC (rev 3811)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/NonElementTermBinding.java 2009-11-29 16:22:40 UTC (rev 3812)
@@ -23,6 +23,7 @@
import javax.xml.namespace.QName;
+import org.jboss.xb.binding.sunday.unmarshalling.SundayContentHandler.Position;
import org.xml.sax.Attributes;
/**
@@ -33,5 +34,5 @@
*/
public interface NonElementTermBinding
{
- NonElementPosition newPosition(QName qName, Attributes attrs, ParticleBinding particle);
+ Position newPosition(QName qName, Attributes attrs, ParticleBinding particle);
}
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SequenceBinding.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SequenceBinding.java 2009-11-29 11:02:52 UTC (rev 3811)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SequenceBinding.java 2009-11-29 16:22:40 UTC (rev 3812)
@@ -27,6 +27,7 @@
import java.util.Collection;
import javax.xml.namespace.QName;
import org.jboss.xb.binding.JBossXBRuntimeException;
+import org.jboss.xb.binding.sunday.unmarshalling.SundayContentHandler.Position;
import org.xml.sax.Attributes;
@@ -79,7 +80,7 @@
return sequence;
}
- public NonElementPosition newPosition(QName qName, Attributes attrs, ParticleBinding seqParticle)
+ public Position newPosition(QName qName, Attributes attrs, ParticleBinding seqParticle)
{
for(int i = 0; i < sequence.size(); ++i)
{
@@ -94,7 +95,7 @@
else
{
NonElementTermBinding ne = (NonElementTermBinding)term;
- NonElementPosition next = ne.newPosition(qName, attrs, particle);
+ Position next = ne.newPosition(qName, attrs, particle);
if(next != null)
return new SequencePosition(qName, seqParticle, i, particle, next);
}
@@ -128,7 +129,7 @@
this.pos = pos;
}
- protected SequencePosition(QName qName, ParticleBinding particle, int pos, ParticleBinding currentParticle, NonElementPosition next)
+ protected SequencePosition(QName qName, ParticleBinding particle, int pos, ParticleBinding currentParticle, Position next)
{
super(qName, particle, currentParticle, next);
this.pos = pos;
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SundayContentHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SundayContentHandler.java 2009-11-29 11:02:52 UTC (rev 3811)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SundayContentHandler.java 2009-11-29 16:22:40 UTC (rev 3812)
@@ -103,7 +103,7 @@
public void characters(char[] ch, int start, int length)
{
Position position = stack.peek();
- if(position.isModelGroup())
+ if(!position.isElement())
return;
ElementBinding e = (ElementBinding) position.particle.getTerm();
@@ -111,7 +111,7 @@
if(position.ended)
{
position = stack.peek1();
- if(position.isModelGroup())
+ if(!position.isElement())
{
for(int i = stack.size() - 3; i >= 0; --i)
{
@@ -160,9 +160,7 @@
}
if (position.textContent == null)
- {
position.textContent = new StringBuffer();
- }
position.textContent.append(ch, start, length);
}
}
@@ -170,11 +168,9 @@
public void endElement(String namespaceURI, String localName, String qName)
{
ElementBinding elementBinding = null;
- QName endName = localName.length() == 0 ? new QName(qName) : new QName(namespaceURI, localName);
- Position position;
- while(true)
+ while(elementBinding == null && !stack.isEmpty())
{
- position = stack.peek();
+ Position position = stack.peek();
if(position.isElement())
{
if(position.ended)
@@ -191,7 +187,6 @@
{
elementBinding = (ElementBinding)position.particle.getTerm();
position.ended = true;
- break;
}
}
else
@@ -212,6 +207,7 @@
if(elementBinding == null)
throw new JBossXBRuntimeException("Failed to endElement " + qName + ": binding not found");
+ QName endName = localName.length() == 0 ? new QName(qName) : new QName(namespaceURI, localName);
if(!elementBinding.getQName().equals(endName))
{
throw new JBossXBRuntimeException("Failed to end element " +
@@ -285,7 +281,7 @@
{
if(position.particle.isRepeatable())
{
- NonElementPosition parentPosition = (NonElementPosition) stack.peek1();
+ Position parentPosition = stack.peek1();
if(parentPosition.repeatTerm(startName, atts))
{
position.reset();
@@ -307,7 +303,6 @@
particle = position.particle;
parentType = position.parentType;
repeated = true;
-
endRepeatableParent(startName);
}
}
@@ -317,9 +312,7 @@
{
Position parentPosition = stack.peek1();
if(parentPosition.repeatableParticleValue != null)
- {
endRepeatableParticle(parentPosition, position.qName, position.particle, parentPosition.particle);
- }
}
pop();
continue;
@@ -367,7 +360,7 @@
);
}
- NonElementPosition newPosition = modelGroup.newPosition(startName, atts, typeParticle);
+ Position newPosition = modelGroup.newPosition(startName, atts, typeParticle);
if(newPosition == null)
{
throw new JBossXBRuntimeException(startName +
@@ -379,7 +372,7 @@
{
flushIgnorableCharacters();
- NonElementPosition groupPosition = null;
+ Position groupPosition = null;
Object o = position.o;
while(newPosition != null)
{
@@ -401,10 +394,8 @@
}
else
{
- NonElementPosition groupPosition = (NonElementPosition) position;
-
- ParticleBinding prevParticle = groupPosition.getCurrentParticle();
- NonElementPosition newPosition = groupPosition.startElement(startName, atts);
+ ParticleBinding prevParticle = position.getCurrentParticle();
+ Position newPosition = position.startElement(startName, atts);
if(newPosition == null)
{
if(!position.ended)
@@ -413,7 +404,7 @@
pop();
if(!position.particle.isRepeatable() && stack.peek().isElement())
{
- TermBinding t = groupPosition.getParticle().getTerm();
+ TermBinding t = position.getParticle().getTerm();
StringBuffer sb = new StringBuffer(250);
sb.append(startName).append(" cannot appear in this position. Expected content of ")
.append(((ElementBinding)stack.peek().particle.getTerm()).getQName())
@@ -423,17 +414,7 @@
}
else
{
- if(position.ended) // for repeatable choices
- {
- if(!position.particle.isRepeatable())
- throw new JBossXBRuntimeException("The particle expected to be repeatable but it's not: " + position.particle.getTerm());
-
- position.reset();
- handler = getHandler(position.particle.getTerm());
- position.o = handler.startParticle(stack.peek1().o, startName, position.particle, atts, nsRegistry);
- }
-
- ParticleBinding curParticle = groupPosition.getCurrentParticle();
+ ParticleBinding curParticle = position.getCurrentParticle();
if(curParticle != prevParticle)
{
if(position.repeatableParticleValue != null &&
@@ -451,7 +432,7 @@
// push all except the last one
parentType = position.parentType;
Object o = position.o;
- groupPosition = newPosition;
+ Position groupPosition = newPosition;
newPosition = newPosition.getNext();
while(newPosition != null)
{
@@ -753,20 +734,12 @@
if(position.ended)
throw new JBossXBRuntimeException(position.particle.getTerm() + " has already been ended.");
- ParticleHandler handler = position.handler;
- Object o = handler.endParticle(position.o, position.qName, position.particle);
+ position.endParticle();
- position.ended = true;
// model group should always have parent particle
- //Position parentPosition = getNotSkippedParent();
Position parentPosition = stack.peek1();
if(parentPosition.o != null)
- {
- if(parentPosition.repeatableParticleValue == null)
- setParent(handler, parentPosition.o, o, position.qName, position.particle, parentPosition.particle);
- else
- parentPosition.repeatableHandler.addTermValue(parentPosition.repeatableParticleValue, o, position.qName, position.particle, parentPosition.particle, handler);
- }
+ setParent(position.handler, parentPosition, position);
}
private void endParticle(Position position, int parentIdex)
@@ -774,19 +747,12 @@
if(position.ended)
throw new JBossXBRuntimeException(position.particle.getTerm() + " has already been ended.");
- ParticleHandler handler = position.handler;
- Object o = handler.endParticle(position.o, position.qName, position.particle);
+ position.endParticle();
- position.ended = true;
// model group should always have parent particle
Position parentPosition = getNotSkippedParent(parentIdex);
if(parentPosition.o != null)
- {
- if(parentPosition.repeatableParticleValue == null)
- setParent(handler, parentPosition.o, o, position.qName, position.particle, parentPosition.particle);
- else
- parentPosition.repeatableHandler.addTermValue(parentPosition.repeatableParticleValue, o, position.qName, position.particle, parentPosition.particle, handler);
- }
+ setParent(position.handler, parentPosition, position);
}
public void startPrefixMapping(String prefix, String uri)
@@ -912,17 +878,15 @@
private void endElement()
{
Position position = stack.peek();
- Object o = position.o;
- ParticleBinding particle = position.particle;
- ElementBinding element = (ElementBinding)particle.getTerm();
+ ElementBinding element = (ElementBinding)position.particle.getTerm();
QName endName = element.getQName();
TypeBinding type = element.getType();
List<ElementInterceptor> interceptors = element.getInterceptors();
List<ElementInterceptor> localInterceptors = position.parentType == null ? Collections.EMPTY_LIST : position.parentType.getInterceptors(endName);
int allInterceptors = interceptors.size() + localInterceptors.size();
- if(o != NIL)
+ if(position.o != NIL)
{
//
// characters
@@ -1007,23 +971,23 @@
if(unmarshalled != null)
{
// if startElement returned null, we use characters as the object for this element
- if(o == null)
+ if(position.o == null)
{
- o = unmarshalled;
+ position.o = unmarshalled;
}
else if(charHandler != null)
{
TermBeforeSetParentCallback beforeSetParent = charType.getBeforeSetParentCallback();
if(beforeSetParent != null)
{
- ctx.parent = o;
- ctx.particle = particle;
+ ctx.parent = position.o;
+ ctx.particle = position.particle;
ctx.parentParticle = getNotSkippedParent().particle;
unmarshalled = beforeSetParent.beforeSetParent(unmarshalled, ctx);
ctx.clear();
}
- charHandler.setValue(endName, element, o, unmarshalled);
+ charHandler.setValue(endName, element, position.o, unmarshalled);
}
}
@@ -1046,18 +1010,14 @@
}
else
{
- o = null;
+ position.o = null;
}
//
// endElement
//
- Position parentPosition = stack.size() == 1 ? null : stack.peek1();
- Object parent = parentPosition == null ? null : parentPosition.o;
- ParticleHandler handler = position.handler;
-
- o = handler.endParticle(o, endName, particle);
+ position.endParticle();
if(!interceptors.isEmpty())
{
@@ -1080,20 +1040,17 @@
{
ParticleBinding parentParticle = notSkippedParent.particle;
TermBinding parentTerm = parentParticle.getTerm();
- if (parentTerm.isWildcard())
- {
- ParticleHandler wh = ((WildcardBinding) parentTerm).getWildcardHandler();
- if (wh != null)
- handler = wh;
- }
- if (parent != null)
+ if (notSkippedParent.o != null)
{
- if (notSkippedParent.repeatableParticleValue == null)
- setParent(handler, parent, o, endName, particle, parentParticle);
- else
- notSkippedParent.repeatableHandler.addTermValue(notSkippedParent.repeatableParticleValue, o, endName,
- particle, parentParticle, handler);
+ ParticleHandler handler = position.handler;
+ if (parentTerm.isWildcard())
+ {
+ ParticleHandler wh = ((WildcardBinding) parentTerm).getWildcardHandler();
+ if (wh != null)
+ handler = wh;
+ }
+ setParent(handler, notSkippedParent, position);
}
else if (parentTerm.isWildcard() && stack.size() > 1)
{
@@ -1101,13 +1058,13 @@
for (int i = stack.size() - 2; i >= 0; --i)
{
Position peeked = stack.peek(i);
- peeked.o = o;
+ peeked.o = position.o;
if (peeked.isElement())
break;
}
if (trace)
- log.trace("Value of " + endName + " " + o + " is promoted as the value of its parent element.");
+ log.trace("Value of " + endName + " " + position.o + " is promoted as the value of its parent element.");
}
}
}
@@ -1118,27 +1075,26 @@
for(int i = interceptors.size() - 1; i >= 0; --i)
{
ElementInterceptor interceptor = interceptors.get(i);
- parent = pop().o;
- interceptor.add(parent, o, endName);
- o = parent;
+ Object parent = pop().o;
+ interceptor.add(parent, position.o, endName);
+ position.o = parent;
}
for(int i = localInterceptors.size() - 1; i >= 0; --i)
{
ElementInterceptor interceptor = localInterceptors.get(i);
- parent = pop().o;
- interceptor.add(parent, o, endName);
- o = parent;
+ Object parent = pop().o;
+ interceptor.add(parent, position.o, endName);
+ position.o = parent;
}
- // need to have correst endRepeatableParticle events
+ // need to push it back to have correct endRepeatableParticle events
stack.push(popped);
}
if(stack.size() == 1)
{
- o = type.getValueAdapter().cast(o, Object.class);
- root = o;
+ root = type.getValueAdapter().cast(position.o, Object.class);
stack.clear();
if(sawDTD)
@@ -1148,36 +1104,36 @@
{
// setDTD(String root, String publicId, String systemId)
Class[] sig = {String.class, String.class, String.class};
- Method setDTD = o.getClass().getMethod("setDTD", sig);
+ Method setDTD = root.getClass().getMethod("setDTD", sig);
Object[] args = {dtdRootName, dtdPublicId, dtdSystemId};
- setDTD.invoke(o, args);
+ setDTD.invoke(root, args);
}
catch(Exception e)
{
- log.debug("No setDTD found on root: " + o);
+ log.debug("No setDTD found on root: " + root);
}
}
}
}
- private void setParent(ParticleHandler handler,
- Object parent,
- Object o,
- QName endName,
- ParticleBinding particle,
- ParticleBinding parentParticle)
+ private void setParent(ParticleHandler handler, Position parentPosition, Position position)
{
- TermBeforeSetParentCallback beforeSetParent = particle.getTerm().getBeforeSetParentCallback();
- if(beforeSetParent != null)
+ if(parentPosition.repeatableParticleValue == null)
{
- ctx.parent = parent;
- ctx.particle = particle;
- ctx.parentParticle = getNotSkippedParent().particle;
- o = beforeSetParent.beforeSetParent(o, ctx);
- ctx.clear();
+ TermBeforeSetParentCallback beforeSetParent = position.particle.getTerm().getBeforeSetParentCallback();
+ if(beforeSetParent != null)
+ {
+ ctx.parent = parentPosition.o;
+ ctx.particle = position.particle;
+ ctx.parentParticle = getNotSkippedParent().particle;
+ position.o = beforeSetParent.beforeSetParent(position.o, ctx);
+ ctx.clear();
+ }
+
+ handler.setParent(parentPosition.o, position.o, position.qName, position.particle, parentPosition.particle);
}
-
- handler.setParent(parent, o, endName, particle, parentParticle);
+ else
+ parentPosition.repeatableHandler.addTermValue(parentPosition.repeatableParticleValue, position.o, position.qName, position.particle, parentPosition.particle, handler);
}
private void push(QName qName, ParticleBinding particle, Object o, ParticleHandler handler, TypeBinding parentType)
@@ -1191,7 +1147,7 @@
log.trace("pushed[" + (stack.size() - 1) + "] " + particle.getTerm().getQName() + "=" + o);
}
- private void push(NonElementPosition position, Object o, ParticleHandler handler, TypeBinding parentType)
+ private void push(Position position, Object o, ParticleHandler handler, TypeBinding parentType)
{
position.o = o;
position.handler = handler;
@@ -1228,6 +1184,9 @@
boolean ignorableCharacters = true;
boolean ended;
+ protected Position next;
+ protected int occurrence;
+
public Position(QName qName, ParticleBinding particle)
{
if (particle == null)
@@ -1238,6 +1197,7 @@
this.qName = qName;
this.particle = particle;
+ this.occurrence = 1;
}
protected boolean isElement()
@@ -1249,16 +1209,86 @@
{
return false;
}
-
- void reset()
+
+ public ParticleBinding getParticle()
{
- if(!ended)
+ return particle;
+ }
+
+ public void setCurrentParticle(ParticleBinding currentParticle)
+ {
+ this.particle = currentParticle;
+ }
+
+ public ParticleBinding getCurrentParticle()
+ {
+ return particle;
+ }
+
+ public Position getNext()
+ {
+ return next;
+ }
+
+ public boolean repeatTerm(QName qName, Attributes atts)
+ {
+ ParticleBinding currentParticle = getCurrentParticle();
+ if(currentParticle == null)
+ throw new IllegalStateException("The cursor has not been positioned yet!");
+
+ boolean repeated = false;
+ if(currentParticle.getMaxOccursUnbounded() ||
+ occurrence < currentParticle.getMinOccurs() ||
+ occurrence < currentParticle.getMaxOccurs())
{
- throw new JBossXBRuntimeException(
- "Attempt to reset a particle that has already been reset: " + particle.getTerm()
- );
+ TermBinding item = currentParticle.getTerm();
+ if(item.isElement())
+ {
+ ElementBinding element = (ElementBinding)item;
+ repeated = qName.equals(element.getQName());
+ }
+ else
+ {
+ NonElementTermBinding ne = (NonElementTermBinding)item;
+ next = ne.newPosition(qName, atts, currentParticle);
+ repeated = next != null;
+ }
}
+ if(repeated)
+ {
+ ++occurrence;
+ }
+ else
+ {
+ setCurrentParticle(null);
+ occurrence = 0;
+ }
+
+ return repeated;
+ }
+
+ public Position startElement(QName qName, Attributes attrs)
+ {
+ return startElement(qName, attrs, true);
+ }
+
+ protected Position startElement(QName qName, Attributes atts, boolean required)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public void endParticle()
+ {
+ o = handler.endParticle(o, qName, particle);
+ ended = true;
+ }
+
+ void reset()
+ {
+ if(!ended)
+ throw new JBossXBRuntimeException("Attempt to reset a particle that has already been reset: " + particle.getTerm());
+
ended = false;
o = null;
if(textContent != null)
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/UnorderedSequenceBinding.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/UnorderedSequenceBinding.java 2009-11-29 11:02:52 UTC (rev 3811)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/UnorderedSequenceBinding.java 2009-11-29 16:22:40 UTC (rev 3812)
@@ -31,6 +31,7 @@
import javax.xml.namespace.QName;
import org.jboss.xb.binding.JBossXBRuntimeException;
+import org.jboss.xb.binding.sunday.unmarshalling.SundayContentHandler.Position;
import org.xml.sax.Attributes;
/**
@@ -99,7 +100,7 @@
return allParticles;
}
- public NonElementPosition newPosition(QName qName, Attributes attrs, ParticleBinding seqParticle)
+ public Position newPosition(QName qName, Attributes attrs, ParticleBinding seqParticle)
{
ParticleBinding currentParticle = elementParticles.get(qName);
if (currentParticle != null)
@@ -108,7 +109,7 @@
for (ParticleBinding particle : groupParticles)
{
NonElementTermBinding term = (NonElementTermBinding) particle.getTerm();
- NonElementPosition next = term.newPosition(qName, attrs, particle);
+ Position next = term.newPosition(qName, attrs, particle);
if (next != null)
return new UnorderedSequencePosition(qName, seqParticle, particle, next);
}
@@ -116,7 +117,7 @@
for (ParticleBinding particle : wildcardParticles)
{
NonElementTermBinding term = (NonElementTermBinding) particle.getTerm();
- NonElementPosition next = term.newPosition(qName, attrs, particle);
+ Position next = term.newPosition(qName, attrs, particle);
if (next != null)
return new UnorderedSequencePosition(qName, seqParticle, particle, next);
}
@@ -137,13 +138,13 @@
super(name, particle, currentParticle);
}
- private UnorderedSequencePosition(QName name, ParticleBinding particle, ParticleBinding currentParticle, NonElementPosition next)
+ private UnorderedSequencePosition(QName name, ParticleBinding particle, ParticleBinding currentParticle, Position next)
{
super(name, particle, currentParticle, next);
}
@Override
- protected NonElementPosition startElement(QName qName, Attributes atts, boolean required)
+ protected Position startElement(QName qName, Attributes atts, boolean required)
{
if(trace)
{
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/WildcardBinding.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/WildcardBinding.java 2009-11-29 11:02:52 UTC (rev 3811)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/WildcardBinding.java 2009-11-29 16:22:40 UTC (rev 3812)
@@ -26,6 +26,7 @@
import org.jboss.xb.binding.JBossXBRuntimeException;
import org.jboss.xb.binding.ObjectLocalMarshaller;
import org.jboss.xb.binding.Util;
+import org.jboss.xb.binding.sunday.unmarshalling.SundayContentHandler.Position;
import org.xml.sax.Attributes;
/**
@@ -243,7 +244,7 @@
return element;
}
- public NonElementPosition newPosition(QName qName, Attributes attrs, ParticleBinding particle)
+ public Position newPosition(QName qName, Attributes attrs, ParticleBinding particle)
{
ElementBinding wildcardContent = getElement(qName, attrs);
if(wildcardContent != null)
@@ -299,7 +300,7 @@
}
@Override
- protected NonElementPosition startElement(QName name, Attributes atts, boolean required)
+ protected Position startElement(QName name, Attributes atts, boolean required)
{
// if positioned try repeating
if(currentParticle != null && repeatTerm(qName, atts))
More information about the jboss-svn-commits
mailing list