[jboss-svn-commits] JBoss Common SVN: r1923 - trunk/src/main/org/jboss/xb/binding/sunday/unmarshalling
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon Aug 7 10:47:42 EDT 2006
Author: alex.loubyansky at jboss.com
Date: 2006-08-07 10:47:40 -0400 (Mon, 07 Aug 2006)
New Revision: 1923
Modified:
trunk/src/main/org/jboss/xb/binding/sunday/unmarshalling/JBXB76ContentHandler.java
Log:
JBXB-77, other fixes for repeatable particles
Modified: trunk/src/main/org/jboss/xb/binding/sunday/unmarshalling/JBXB76ContentHandler.java
===================================================================
--- trunk/src/main/org/jboss/xb/binding/sunday/unmarshalling/JBXB76ContentHandler.java 2006-08-04 15:12:12 UTC (rev 1922)
+++ trunk/src/main/org/jboss/xb/binding/sunday/unmarshalling/JBXB76ContentHandler.java 2006-08-07 14:47:40 UTC (rev 1923)
@@ -114,7 +114,7 @@
}
else
{
- endParticle(item, endName);
+ endParticle(item, endName, 1);
pop();
}
}
@@ -192,6 +192,11 @@
particle = item.particle;
repeated = true;
item.reset();
+
+ if(!particle.isRepeatable())
+ {
+ endRepeatbleParent(startName);
+ }
}
else
{
@@ -230,19 +235,15 @@
}
else
{
+ Object o = item.o;
// push all except the last one
for(int i = newCursors.size() - 1; i >= 0; --i)
{
cursor = (ModelGroupBinding.Cursor)newCursors.get(i);
ParticleBinding modelGroupParticle = cursor.getParticle();
- ParticleHandler handler = ((ModelGroupBinding)modelGroupParticle.getTerm()).getHandler();
- if(handler == null)
- {
- handler = defParticleHandler;
- }
- Object o = handler.startParticle(item.o, startName, modelGroupParticle, atts, nsRegistry);
-
+ ParticleHandler handler = getHandler(modelGroupParticle);
+ o = handler.startParticle(o, startName, modelGroupParticle, atts, nsRegistry);
push(cursor, o);
}
particle = cursor.getCurrentParticle();
@@ -262,22 +263,23 @@
List newCursors = cursor.startElement(startName, atts);
if(newCursors.isEmpty())
{
- endParticle(item, startName);
+ endParticle(item, startName, 1);
pop();
}
else
{
+ if(item.ended && !item.cursor.getParticle().isRepeatable())
+ {
+ endRepeatbleParent(startName);
+ }
+
if(cursor.getOccurence() - currentOccurence > 0 || item.ended)
{
- endParticle(item, startName);
+ endParticle(item, startName, 1);
ParticleBinding modelGroupParticle = cursor.getParticle();
- ParticleHandler handler = ((ModelGroupBinding)modelGroupParticle.getTerm()).getHandler();
- if(handler == null)
- {
- handler = defParticleHandler;
- }
- Object o = handler.startParticle(item.o, startName, modelGroupParticle, atts, nsRegistry);
+ ParticleHandler handler = getHandler(modelGroupParticle);
+ Object o = handler.startParticle(stack.peek(1).o, startName, modelGroupParticle, atts, nsRegistry);
if(item.ended)
{
@@ -291,18 +293,14 @@
}
// push all except the last one
+ Object o = item.o;
for(int i = newCursors.size() - 2; i >= 0; --i)
{
cursor = (ModelGroupBinding.Cursor)newCursors.get(i);
ParticleBinding modelGroupParticle = cursor.getParticle();
- ParticleHandler handler = ((ModelGroupBinding)modelGroupParticle.getTerm()).getHandler();
- if(handler == null)
- {
- handler = defParticleHandler;
- }
- Object o = handler.startParticle(item.o, startName, modelGroupParticle, atts, nsRegistry);
-
+ ParticleHandler handler = getHandler(modelGroupParticle);
+ o = handler.startParticle(o, startName, modelGroupParticle, atts, nsRegistry);
push(cursor, o);
}
cursor = (ModelGroupBinding.Cursor)newCursors.get(0);
@@ -463,6 +461,101 @@
}
}
+ private ParticleHandler getHandler(ParticleBinding modelGroupParticle)
+ {
+ ParticleHandler handler = ((ModelGroupBinding)modelGroupParticle.getTerm()).getHandler();
+ return handler == null ? defParticleHandler : handler;
+ }
+
+ private void endRepeatbleParent(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)
+ {
+ endParticle(parentItem, startName, ++parentPos);
+ nonRepeatableChoiceItem = parentItem;
+ nonRepeatableChoiceItem.reset();
+ parentItem = stack.peek(parentPos);
+ parentParticle = parentItem.cursor == null ? parentItem.particle : parentItem.cursor.getParticle();
+ }
+
+ if(!parentParticle.isRepeatable())
+ {
+ StringBuffer msg = new StringBuffer();
+
+ StackItem item = stack.peek();
+ ParticleBinding currentParticle = item.particle == null ? item.cursor.getParticle() : item.particle;
+ msg.append("Failed to start ").append(startName).append(": ")
+ .append(currentParticle.getTerm())
+ .append(" is not repeatable.")
+ .append(" Its parent ")
+ .append(parentParticle.getTerm());
+
+ 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);
+ ParticleBinding particle = item.particle == null ? item.cursor.getParticle() : item.particle;
+ TermBinding term = particle.getTerm();
+ if(term.isModelGroup())
+ {
+ if(term instanceof SequenceBinding)
+ {
+ msg.append("sequence");
+ }
+ else if(term instanceof ChoiceBinding)
+ {
+ msg.append("choice");
+ }
+ else
+ {
+ msg.append("all");
+ }
+ }
+ else if(term.isWildcard())
+ {
+ msg.append("wildcard");
+ }
+ else
+ {
+ msg.append(((ElementBinding)term).getQName());
+ }
+ msg.append("\\");
+ }
+
+ throw new JBossXBRuntimeException(msg.toString());
+ }
+
+ // todo startName is wrong here
+ endParticle(parentItem, startName, ++parentPos);
+ parentItem.reset();
+
+ StackItem granItem = stack.peek(parentPos);
+
+ ParticleHandler handler = getHandler(parentParticle);
+ parentItem.o = handler.startParticle(granItem.o, startName, parentParticle, null, nsRegistry);
+
+ if(nonRepeatableChoiceItem != null)
+ {
+ ParticleBinding choiceParticle = nonRepeatableChoiceItem.cursor.getParticle();
+ handler = getHandler(choiceParticle);
+ nonRepeatableChoiceItem.o = handler.startParticle(
+ parentItem.o, startName, choiceParticle, null, nsRegistry
+ );
+ }
+ }
+
private void startRepeatableParticle(ParticleBinding particle)
{
//System.out.println("start repeatable particle: " + particle.getTerm());
@@ -473,21 +566,17 @@
//System.out.println("end repeatable particle: " + particle.getTerm());
}
- private StackItem endParticle(StackItem item, QName qName)
+ private StackItem endParticle(StackItem item, QName qName, int parentStackPos)
{
ParticleBinding modelGroupParticle = item.cursor.getParticle();
- ParticleHandler handler = ((ModelGroupBinding)modelGroupParticle.getTerm()).getHandler();
- if(handler == null)
- {
- handler = defParticleHandler;
- }
+ ParticleHandler handler = getHandler(modelGroupParticle);
Object o;
if(item.o instanceof ValueList && !modelGroupParticle.getTerm().isSkip())
{
if(trace)
{
- log.trace("endParticle " + qName + " valueList");
+ log.trace("endParticle " + modelGroupParticle.getTerm() + " valueList");
}
ValueList valueList = (ValueList)item.o;
o = valueList.getHandler().newInstance(modelGroupParticle, valueList);
@@ -498,7 +587,7 @@
}
// model group should always have parent particle
- item = (StackItem)stack.peek(1);
+ item = (StackItem)stack.peek(parentStackPos);
if(item.o != null)
{
ParticleBinding parentParticle = item.particle;
@@ -825,7 +914,7 @@
stack.push(item);
if(trace)
{
- log.trace("pushed cursor " + cursor);
+ log.trace("pushed cursor " + cursor + ", o=" + o);
}
return item;
}
More information about the jboss-svn-commits
mailing list