[jboss-svn-commits] JBoss Common SVN: r1970 - trunk/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
Fri Aug 25 06:01:09 EDT 2006
Author: alex.loubyansky at jboss.com
Date: 2006-08-25 06:01:06 -0400 (Fri, 25 Aug 2006)
New Revision: 1970
Modified:
trunk/jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/AllBinding.java
trunk/jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ChoiceBinding.java
trunk/jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/JBXB76ContentHandler.java
trunk/jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ModelGroupBinding.java
trunk/jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SequenceBinding.java
Log:
more fixes and refactoring in handling of particles on the stack
Modified: trunk/jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/AllBinding.java
===================================================================
--- trunk/jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/AllBinding.java 2006-08-25 09:32:14 UTC (rev 1969)
+++ trunk/jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/AllBinding.java 2006-08-25 10:01:06 UTC (rev 1970)
@@ -101,6 +101,11 @@
return (ElementBinding)getCurrentParticle().getTerm();
}
+ public boolean isPositioned()
+ {
+ return curParticle != null;
+ }
+
public void endElement(QName qName)
{
if(curParticle == null || !getElement().getQName().equals(qName))
Modified: trunk/jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ChoiceBinding.java
===================================================================
--- trunk/jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ChoiceBinding.java 2006-08-25 09:32:14 UTC (rev 1969)
+++ trunk/jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ChoiceBinding.java 2006-08-25 10:01:06 UTC (rev 1970)
@@ -102,6 +102,11 @@
return element;
}
+ public boolean isPositioned()
+ {
+ return pos != -1;
+ }
+
public void endElement(QName qName)
{
if(element == null || !element.getQName().equals(qName))
Modified: trunk/jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/JBXB76ContentHandler.java
===================================================================
--- trunk/jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/JBXB76ContentHandler.java 2006-08-25 09:32:14 UTC (rev 1969)
+++ trunk/jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/JBXB76ContentHandler.java 2006-08-25 10:01:06 UTC (rev 1970)
@@ -94,7 +94,7 @@
StackItem item;
while(true)
{
- item = stack.peek();
+ item = stack.peek();
if(item.particle != null)
{
if(item.ended)
@@ -133,14 +133,6 @@
}
endElement(item.o, item.particle, item.textContent == null ? "" : item.textContent.toString());
-
- // if parent group is choice, it should also be finished
- StackItem parent = stack.size() < 2 ? null : (StackItem)stack.peek(1);
- if(parent != null && parent.cursor != null &&
- parent.cursor.getParticle().getTerm() instanceof ChoiceBinding)
- {
- parent.ended = true;
- }
}
public void startElement(String namespaceURI,
@@ -195,7 +187,7 @@
if(!particle.isRepeatable())
{
- endRepeatbleParent(startName);
+ endRepeatableParent(startName);
}
}
else
@@ -259,6 +251,14 @@
throw new JBossXBRuntimeException("No cursor for " + startName);
}
+ // todo review
+ if(cursor.isPositioned() && cursor.getParticle().getTerm() instanceof ChoiceBinding)
+ {
+ endParticle(item, startName, 1);
+ pop();
+ continue;
+ }
+
int currentOccurence = cursor.getOccurence();
List newCursors = cursor.startElement(startName, atts);
if(newCursors.isEmpty())
@@ -268,11 +268,6 @@
}
else
{
- if(item.ended && !item.cursor.getParticle().isRepeatable())
- {
- endRepeatbleParent(startName);
- }
-
if(cursor.getOccurence() - currentOccurence > 0 || item.ended)
{
endParticle(item, startName, 1);
@@ -281,15 +276,8 @@
ParticleHandler handler = getHandler(modelGroupParticle);
Object o = handler.startParticle(stack.peek(1).o, startName, modelGroupParticle, atts, nsRegistry);
- if(item.ended)
- {
- item.reset();
- item.o = o;
- }
- else
- {
- item = push(cursor, o);
- }
+ item.reset();
+ item.o = o;
}
// push all except the last one
@@ -467,20 +455,29 @@
return handler == null ? defParticleHandler : handler;
}
- private void endRepeatbleParent(QName startName)
+ private void endRepeatableParent(QName startName)
{
int parentPos = 1;
- StackItem parentItem = stack.peek(parentPos);
- ParticleBinding parentParticle =
- parentItem.cursor == null ? parentItem.particle : parentItem.cursor.getParticle();
- StackItem nonRepeatableChoiceItem = null;
- if(!parentParticle.isRepeatable() && parentParticle.getTerm() instanceof ChoiceBinding)
+ StackItem parentItem;
+ ParticleBinding parentParticle = null;
+ while(true)
{
- endParticle(parentItem, startName, ++parentPos);
- nonRepeatableChoiceItem = parentItem;
- nonRepeatableChoiceItem.reset();
parentItem = stack.peek(parentPos);
- parentParticle = parentItem.cursor == null ? parentItem.particle : parentItem.cursor.getParticle();
+ if(parentItem.cursor == null)
+ {
+ throw new JBossXBRuntimeException(
+ "Repeatable parent expected to be a model group but got element: " +
+ ((ElementBinding)parentItem.particle.getTerm()).getQName()
+ );
+ }
+
+ parentParticle = parentItem.cursor.getParticle();
+ if(parentParticle.isRepeatable())
+ {
+ break;
+ }
+
+ endParticle(parentItem, startName, ++parentPos);
}
if(!parentParticle.isRepeatable())
@@ -493,16 +490,10 @@
.append(currentParticle.getTerm())
.append(" is not repeatable.")
.append(" Its parent ")
- .append(parentParticle.getTerm());
+ .append(parentParticle.getTerm())
+ .append(" expected to be repeatable!")
+ .append("\ncurrent stack: ");
- if(nonRepeatableChoiceItem != null)
- {
- msg.append(" or the choice it contains ");
- }
-
- msg.append(" expected to be repeatable!");
-
- msg.append("\ncurrent stack: ");
for(int i = stack.size() - 1; i >= 0; --i)
{
item = stack.peek(i);
@@ -538,21 +529,17 @@
}
// todo startName is wrong here
- endParticle(parentItem, startName, ++parentPos);
- parentItem.reset();
+ endParticle(parentItem, startName, parentPos + 1);
- StackItem granItem = stack.peek(parentPos);
-
- ParticleHandler handler = getHandler(parentParticle);
- parentItem.o = handler.startParticle(granItem.o, startName, parentParticle, null, nsRegistry);
-
- if(nonRepeatableChoiceItem != null)
+ parentItem = stack.peek(parentPos + 1);
+ while(parentPos > 0)
{
- ParticleBinding choiceParticle = nonRepeatableChoiceItem.cursor.getParticle();
- handler = getHandler(choiceParticle);
- nonRepeatableChoiceItem.o = handler.startParticle(
- parentItem.o, startName, choiceParticle, null, nsRegistry
- );
+ StackItem item = stack.peek(parentPos--);
+ ParticleBinding itemParticle = item.cursor.getParticle();
+ ParticleHandler handler = getHandler(itemParticle);
+ item.reset();
+ item.o = handler.startParticle(parentItem.o, startName, itemParticle, null, nsRegistry);
+ parentItem = item;
}
}
@@ -566,8 +553,16 @@
//System.out.println("end repeatable particle: " + particle.getTerm());
}
- private StackItem endParticle(StackItem item, QName qName, int parentStackPos)
+ private void endParticle(StackItem item, QName qName, int parentStackPos)
{
+ if(item.ended)
+ {
+ throw new JBossXBRuntimeException(
+ (item.particle == null ? item.cursor.getParticle().getTerm() : item.particle.getTerm()) +
+ " has already been ended."
+ );
+ }
+
ParticleBinding modelGroupParticle = item.cursor.getParticle();
ParticleHandler handler = getHandler(modelGroupParticle);
@@ -586,6 +581,8 @@
o = handler.endParticle(item.o, qName, modelGroupParticle);
}
+ item.ended = true;
+
// model group should always have parent particle
item = (StackItem)stack.peek(parentStackPos);
if(item.o != null)
@@ -597,13 +594,6 @@
}
setParent(handler, item.o, o, qName, modelGroupParticle, parentParticle);
}
-
- if(item.cursor != null && item.cursor.getParticle().getTerm() instanceof ChoiceBinding)
- {
- item.ended = true;
- }
-
- return item;
}
public void startPrefixMapping(String prefix, String uri)
@@ -916,6 +906,7 @@
{
log.trace("pushed cursor " + cursor + ", o=" + o);
}
+
return item;
}
@@ -937,6 +928,7 @@
log.trace("poped null");
}
}
+
return item;
}
@@ -966,6 +958,12 @@
void reset()
{
+ if(!ended)
+ {
+ throw new JBossXBRuntimeException("Attempt to reset a particle that has already been reset: " +
+ (particle == null ? cursor.getParticle().getTerm() : particle.getTerm()));
+ }
+
ended = false;
o = null;
if(textContent != null)
Modified: trunk/jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ModelGroupBinding.java
===================================================================
--- trunk/jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ModelGroupBinding.java 2006-08-25 09:32:14 UTC (rev 1969)
+++ trunk/jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ModelGroupBinding.java 2006-08-25 10:01:06 UTC (rev 1970)
@@ -147,6 +147,8 @@
public abstract ElementBinding getElement();
+ public abstract boolean isPositioned();
+
public List startElement(QName qName, Attributes attrs)
{
return startElement(qName, attrs, Collections.EMPTY_SET, Collections.EMPTY_LIST, true);
Modified: trunk/jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SequenceBinding.java
===================================================================
--- trunk/jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SequenceBinding.java 2006-08-25 09:32:14 UTC (rev 1969)
+++ trunk/jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SequenceBinding.java 2006-08-25 10:01:06 UTC (rev 1970)
@@ -111,6 +111,11 @@
return element;
}
+ public boolean isPositioned()
+ {
+ return pos != -1;
+ }
+
public void endElement(QName qName)
{
if(element == null || !element.getQName().equals(qName))
More information about the jboss-svn-commits
mailing list