3 Replies Latest reply on Oct 19, 2006 10:46 AM by aloubyansky

    Problem with repeated but not repeatable particles.

      In the ejb-jar xsd there is a repeated particle that is not a repeatable
      particle, this causes problems for JBossXB which wants to
      treat it as a repeatable.

      I added a test for this, see RepeatedElementsUnitTestCase.

      I have a patch that fixes the problem, but this is obviously a hack,
      besides the fact that it doesn't cater for the more compliated case:

      <xsd:sequence>
       <xsd:element ref="child"/>
       <xsd:element ref="another" minoccurs="0"/>
       <xsd:element ref="child"/>
      </xsd:sequence>
      


      The patch only marks the repeated element if they are consecutive.

      Index: SequenceBinding.java
      ===================================================================
      --- SequenceBinding.java (revision 2115)
      +++ SequenceBinding.java (working copy)
      @@ -54,6 +54,25 @@
      
       public void addParticle(ParticleBinding particle)
       {
      + // TODO Revisit this is a hack and incomplete
      + // see RepeatedElementUnitTestCase
      + if (sequence.isEmpty() == false)
      + {
      + TermBinding term = particle.getTerm();
      + if (term instanceof ElementBinding)
      + {
      + QName name = ((ElementBinding) term).getQName();
      + ParticleBinding previous = (ParticleBinding) sequence.get(sequence.size()-1);
      + term = previous.getTerm();
      + if (term instanceof ElementBinding)
      + {
      + QName previousName = ((ElementBinding) term).getQName();
      + if (previousName.equals(name))
      + previous.setRepeated(true);
      + }
      + }
      + }
      +
       switch(sequence.size())
       {
       case 0:
      @@ -61,10 +80,7 @@
       if(particle.isRepeatable() && particle.getTerm() instanceof ElementBinding)
       {
       ElementBinding element = (ElementBinding)particle.getTerm();
      - if(particle.isRepeatable())
      - {
       arrayItem = element;
      - }
       }
       break;
       case 1:
      Index: ParticleBinding.java
      ===================================================================
      --- ParticleBinding.java (revision 2115)
      +++ ParticleBinding.java (working copy)
      @@ -31,6 +31,7 @@
       private int minOccurs = 1;
       private int maxOccurs = -1;
       private boolean maxOccursUnbounded;
      + private boolean repeated;
      
       public ParticleBinding(TermBinding term, int minOccurs, int maxOccurs, boolean maxOccursUnbounded)
       {
      @@ -100,6 +101,16 @@
       return minOccurs > occurs && (!term.isModelGroup() || ((ModelGroupBinding)term).hasRequiredParticle());
       }
      
      + public boolean isRepeated()
      + {
      + return repeated;
      + }
      +
      + public void setRepeated(boolean repeated)
      + {
      + this.repeated = repeated;
      + }
      +
       public String toString()
       {
       return term.toString();
      Index: SundayContentHandler.java
      ===================================================================
      --- SundayContentHandler.java (revision 2115)
      +++ SundayContentHandler.java (working copy)
      @@ -29,6 +29,7 @@
       import org.apache.xerces.xs.XSTypeDefinition;
       import org.jboss.logging.Logger;
       import org.jboss.util.StringPropertyReplacer;
      +import org.jboss.util.Strings;
       import org.jboss.xb.binding.Constants;
       import org.jboss.xb.binding.GenericValueContainer;
       import org.jboss.xb.binding.JBossXBRuntimeException;
      @@ -206,9 +207,9 @@
       ElementBinding element = (ElementBinding)term;
       if(item.ended)
       {
      - if(element.getQName().equals(startName))
      + particle = item.particle;
      + if(element.getQName().equals(startName) && particle.isRepeated() == false)
       {
      - particle = item.particle;
       repeated = true;
       item.reset();
      
      @@ -1056,7 +1057,7 @@
       {
       binding = particle.getTerm();
       }
      - log.trace("pushed " + qName + "=" + o + ", binding=" + binding);
      + log.trace("pushed " + qName + "=" + o + ", binding=" + Strings.defaultToString(binding));
       }
       }