[jboss-svn-commits] JBoss Common SVN: r3814 - 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
Mon Nov 30 13:57:35 EST 2009


Author: alex.loubyansky at jboss.com
Date: 2009-11-30 13:57:34 -0500 (Mon, 30 Nov 2009)
New Revision: 3814

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/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:
actually make use of ElementBinding's newPosition() implementation

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 18:40:32 UTC (rev 3813)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/AllBinding.java	2009-11-30 18:57:34 UTC (rev 3814)
@@ -83,8 +83,9 @@
       ParticleBinding particle = elements.get(qName);
       if(particle != null)
       {
-         return new AllPosition(qName, allParticle, particle);
-      }               
+         Position next = particle.getTerm().newPosition(qName, attrs, particle);
+         return new AllPosition(qName, allParticle, particle, next);
+      }
 
       return null;
    }
@@ -97,9 +98,9 @@
    
    private final class AllPosition extends NonElementPosition
    {
-      private AllPosition(QName name, ParticleBinding particle, ParticleBinding currentParticle)
+      private AllPosition(QName name, ParticleBinding particle, ParticleBinding currentParticle, Position next)
       {
-         super(name, particle, currentParticle);
+         super(name, particle, currentParticle, next);
       }
 
       protected Position startElement(QName qName, Attributes atts, boolean required)
@@ -107,11 +108,13 @@
          if(currentParticle != null && repeatTerm(qName, atts))
             throw new IllegalStateException("maxOccurs in all model group can only be 1: " + qName);
 
+         next = null;
          ParticleBinding particle = elements.get(qName);
          if(particle != null)
          {
+            next = particle.getTerm().newPosition(qName, atts, particle);
             currentParticle = particle;
-            occurrence = 1;
+            occurrence = 1;            
             return this;
          }               
 

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 18:40:32 UTC (rev 3813)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ChoiceBinding.java	2009-11-30 18:57:34 UTC (rev 3814)
@@ -76,19 +76,9 @@
       for(int i = 0; i < choices.size(); ++i)
       {
          ParticleBinding particle = (ParticleBinding)choices.get(i);
-         TermBinding term = particle.getTerm();
-         if(term.isElement())
-         {
-            ElementBinding element = (ElementBinding)term;
-            if(qName.equals(element.getQName()))
-               return new ChoicePosition(qName, choiceParticle, particle);
-         }
-         else
-         {
-            Position next = term.newPosition(qName, attrs, particle);
-            if(next != null)
-               return new ChoicePosition(qName, choiceParticle, particle, next);
-         }
+         Position next = particle.getTerm().newPosition(qName, attrs, particle);
+         if(next != null)
+            return new ChoicePosition(qName, choiceParticle, particle, next);
       }
 
       return null;
@@ -122,7 +112,7 @@
          }
 
          next = null;
-         
+
          if(currentParticle != null)
          {
             if(repeatTerm(qName, atts))
@@ -133,23 +123,12 @@
          
          for(int i = 0; i < choices.size(); ++i)
          {
-            boolean found = false;
             ParticleBinding particle = (ParticleBinding)choices.get(i);
             TermBinding term = particle.getTerm();
-            if(term.isElement())
+            next = term.newPosition(qName, atts, particle);
+
+            if(next != null)
             {
-               ElementBinding element = (ElementBinding)term;
-               if(qName.equals(element.getQName()))
-                  found = true;
-            }
-            else
-            {
-               next = term.newPosition(qName, atts, particle);
-               found = next != null;
-            }
-            
-            if(found)
-            {
                occurrence = 1;
                currentParticle = particle;
                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 18:40:32 UTC (rev 3813)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ElementBinding.java	2009-11-30 18:57:34 UTC (rev 3814)
@@ -207,11 +207,14 @@
    
    public String toString()
    {
-      return super.toString() + "(" + qName + ", type=" + typeBinding.getQName() + ")";
+      return "element(" + qName + ", type=" + typeBinding.getQName() + ")";
    }
 
    public Position newPosition(QName name, Attributes attrs, ParticleBinding particle)
    {
-      return null;
+      if(!qName.equals(name))
+         return null;
+      
+      return new Position(name, 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 18:40:32 UTC (rev 3813)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SequenceBinding.java	2009-11-30 18:57:34 UTC (rev 3814)
@@ -85,19 +85,9 @@
       for(int i = 0; i < sequence.size(); ++i)
       {
          ParticleBinding particle = sequence.get(i);
-         TermBinding term = particle.getTerm();
-         if(term.isElement())
-         {
-            ElementBinding element = (ElementBinding)term;
-            if(qName.equals(element.getQName()))
-               return new SequencePosition(qName, seqParticle, i, particle);
-         }
-         else
-         {
-            Position next = term.newPosition(qName, attrs, particle);
-            if(next != null)
-               return new SequencePosition(qName, seqParticle, i, particle, next);
-         }
+         Position next = particle.getTerm().newPosition(qName, attrs, particle);
+         if(next != null)
+            return new SequencePosition(qName, seqParticle, i, particle, next);
          
          if(particle.isRequired())
          {
@@ -155,60 +145,27 @@
          while(i < sequence.size() - 1)
          {
             ParticleBinding particle = sequence.get(++i);
-            TermBinding term = particle.getTerm();
-            if(term.isElement())
-            {
-               ElementBinding element = (ElementBinding)term;
-               if(qName.equals(element.getQName()))
-               {
-                  pos = i;
-                  occurrence = 1;
-                  currentParticle = particle;
+            next = particle.getTerm().newPosition(qName, atts, particle);
 
-                  if(trace)
-                     log.trace("found " + qName + " in " + SequenceBinding.this);
-                  return this;
-               }
-
-               if(particle.getMinOccurs() > 0)
-               {
-                  if(required)
-                  {
-                     StringBuffer sb = new StringBuffer(250);
-                     sb.append(qName).append(" cannot appear in this position in group ")
-                     .append(SequenceBinding.this.toString());
-                     throw new JBossXBRuntimeException(sb.toString());
-                  }
-                  else
-                  {
-                     break;
-                  }
-               }
-            }
-            else
+            if (next != null)
             {
-               next = term.newPosition(qName, atts, particle);
+               pos = i;
+               occurrence = 1;
+               currentParticle = particle;
+               return this;
+            }
 
-               if (next != null)
+            if (particle.isRequired())
+            {
+               if (required)
                {
-                  pos = i;
-                  occurrence = 1;
-                  currentParticle = particle;
-                  return this;
+                  throw new JBossXBRuntimeException("Requested element " + qName
+                        + " is not allowed in this position in the sequence. A model group with minOccurs="
+                        + particle.getMinOccurs() + " that doesn't contain this element must follow.");
                }
-
-               if (particle.isRequired())
+               else
                {
-                  if (required)
-                  {
-                     throw new JBossXBRuntimeException("Requested element " + qName
-                           + " is not allowed in this position in the sequence. A model group with minOccurs="
-                           + particle.getMinOccurs() + " that doesn't contain this element must follow.");
-                  }
-                  else
-                  {
-                     break;
-                  }
+                  break;
                }
             }
          }

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 18:40:32 UTC (rev 3813)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SundayContentHandler.java	2009-11-30 18:57:34 UTC (rev 3814)
@@ -372,12 +372,12 @@
                   {
                      flushIgnorableCharacters();
 
-                     Position groupPosition = null;
                      Object o = position.o;
-                     while(newPosition != null)
+                     while(newPosition.getNext() != null)
                      {
-                        groupPosition = newPosition;
                         ParticleBinding groupParticle = newPosition.getParticle();
+                        if(groupParticle.getTerm().isElement())
+                           throw new IllegalStateException();
                         if(groupParticle.isRepeatable())
                            startRepeatableParticle(stack.peek(), o, startName, groupParticle);
 
@@ -387,7 +387,10 @@
                         
                         newPosition = newPosition.getNext();
                      }
-                     particle = groupPosition.getCurrentParticle();
+
+                     particle = newPosition.getParticle();
+                     if(!particle.getTerm().isElement())
+                        throw new IllegalStateException();
                   }                  
                }
                break;
@@ -423,7 +426,7 @@
                         endRepeatableParticle(position, position.qName, prevParticle, position.particle);
                      }
 
-                     if(newPosition.getNext() != null && curParticle.isRepeatable())
+                     if(newPosition.getNext() != null && curParticle.isRepeatable() && !curParticle.getTerm().isElement())
                      {
                         startRepeatableParticle(position, position.o, startName, curParticle);
                      }
@@ -432,19 +435,29 @@
                   // push all except the last one
                   parentType = position.parentType;
                   Object o = position.o;
-                  Position groupPosition = newPosition;
+                  particle = newPosition.getCurrentParticle();
                   newPosition = newPosition.getNext();
-                  while(newPosition != null)
+                  if(newPosition != null)
                   {
-                     groupPosition = newPosition;
-                     ParticleBinding modelGroupParticle = groupPosition.getParticle();
-                     handler = getHandler(modelGroupParticle.getTerm());
-                     o = handler.startParticle(o, startName, modelGroupParticle, atts, nsRegistry);
-                     push(groupPosition, o, handler, parentType);
-                     
-                     newPosition = newPosition.getNext();
+                     while (newPosition.getNext() != null)
+                     {
+                        ParticleBinding modelGroupParticle = newPosition.getParticle();
+                        if(modelGroupParticle.getTerm().isElement())
+                           throw new IllegalStateException();
+                        handler = getHandler(modelGroupParticle.getTerm());
+                        o = handler.startParticle(o, startName, modelGroupParticle, atts, nsRegistry);
+                        push(newPosition, o, handler, parentType);
+
+                        newPosition = newPosition.getNext();
+                     }
                   }
-                  particle = groupPosition.getCurrentParticle();
+
+                  if(newPosition != null)
+                     particle = newPosition.getParticle();
+
+                  if(!particle.getTerm().isElement())
+                     throw new IllegalStateException();
+
                   break;
                }
             }
@@ -506,9 +519,7 @@
          }
 
          if(!repeated && particle.isRepeatable())
-         {
             startRepeatableParticle(stack.peek(), parent, startName, particle);
-         }
 
          TypeBinding type = element.getType();
          if(type == null)
@@ -706,7 +717,7 @@
       if(repeatableContainer != null)
       {
          if(parentPosition.repeatableParticleValue != null)
-            throw new IllegalStateException();
+            throw new IllegalStateException("Previous repeatable particle hasn't been ended yet!");
          parentPosition.repeatableParticleValue = repeatableContainer;
          parentPosition.repeatableHandler = repeatableHandler;
       }
@@ -1229,7 +1240,7 @@
          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() ||

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 18:40:32 UTC (rev 3813)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/UnorderedSequenceBinding.java	2009-11-30 18:57:34 UTC (rev 3814)
@@ -104,7 +104,8 @@
    {
       ParticleBinding currentParticle = elementParticles.get(qName);
       if (currentParticle != null)
-         return new UnorderedSequencePosition(qName, seqParticle, currentParticle);
+         return new UnorderedSequencePosition(qName, seqParticle, currentParticle,
+               currentParticle.getTerm().newPosition(qName, attrs, currentParticle));
 
       for (ParticleBinding particle : groupParticles)
       {
@@ -159,6 +160,7 @@
          currentParticle = elementParticles.get(qName);
          if (currentParticle != null)
          {
+            next = currentParticle.getTerm().newPosition(qName, atts, currentParticle);
             occurrence = 1;
             if (trace)
                log.trace("found " + qName + " in " + UnorderedSequenceBinding.this);

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 18:40:32 UTC (rev 3813)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/WildcardBinding.java	2009-11-30 18:57:34 UTC (rev 3814)
@@ -244,11 +244,15 @@
       return element;
    }
 
-   public Position newPosition(QName qName, Attributes attrs, ParticleBinding particle)
+   public Position newPosition(QName qName, Attributes attrs, ParticleBinding wildcardParticle)
    {
       ElementBinding wildcardContent = getElement(qName, attrs);
       if(wildcardContent != null)
-         return new WildcardPosition(qName, particle, new ParticleBinding(wildcardContent));
+      {
+         ParticleBinding particle = new ParticleBinding(wildcardContent);
+         Position next = wildcardContent.newPosition(qName, attrs, particle);
+         return new WildcardPosition(qName, wildcardParticle, particle, next);
+      }
       return null;
    }
    
@@ -294,9 +298,9 @@
    
    private final class WildcardPosition extends NonElementPosition
    {
-      protected WildcardPosition(QName name, ParticleBinding particle, ParticleBinding currentParticle)
+      protected WildcardPosition(QName name, ParticleBinding particle, ParticleBinding currentParticle, Position next)
       {
-         super(name, particle, currentParticle);
+         super(name, particle, currentParticle, next);
       }
 
       @Override
@@ -306,10 +310,12 @@
          if(currentParticle != null && repeatTerm(qName, atts))
             return this;
 
+         next = null;
          ElementBinding wildcardContent = getElement(name, atts);
          if(wildcardContent != null)
          {
             currentParticle = new ParticleBinding(wildcardContent);
+            next = wildcardContent.newPosition(name, atts, currentParticle);
             occurrence = 1;
             return this;
          }



More information about the jboss-svn-commits mailing list