[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