[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