[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