[jboss-svn-commits] JBoss Common SVN: r3960 - in jbossxb/trunk/src: main/java/org/jboss/xb/builder and 2 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Jan 29 06:00:23 EST 2010


Author: alex.loubyansky at jboss.com
Date: 2010-01-29 06:00:22 -0500 (Fri, 29 Jan 2010)
New Revision: 3960

Modified:
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/AbstractPosition.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/DefaultHandlers.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ElementPosition.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/SequenceBinding.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/WildcardBinding.java
   jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java
   jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/ArrayWrapperRepeatableParticleHandler.java
   jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/BeanHandler.java
   jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/BuilderParticleHandler.java
   jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/CollectionPropertyHandler.java
   jbossxb/trunk/src/test/java/org/jboss/test/xml/MapsUnitTestCase.java
Log:
don't invoke handlers for skipped particles/positions, other minor optimizations

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/AbstractPosition.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/AbstractPosition.java	2010-01-27 15:44:50 UTC (rev 3959)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/AbstractPosition.java	2010-01-29 11:00:22 UTC (rev 3960)
@@ -58,6 +58,8 @@
    protected AbstractPosition next;
    private AbstractPosition notSkippedParent;
 
+   protected boolean skip;
+   
    protected AbstractPosition(QName qName, ParticleBinding particle)
    {
       if (particle == null)
@@ -69,6 +71,8 @@
 
       this.particle = particle;
       this.occurrence = 1;
+      
+      this.skip = particle.getTerm().isSkip();
    }
 
    public void setStack(PositionStack stack)
@@ -123,6 +127,12 @@
 
    protected void initValue(Attributes atts)
    {
+      if(skip)
+      {
+         o = previous == null ? null : previous.o;
+         return;
+      }
+      
       if(handler == null)
          handler = getHandler();
       Object parent = previous == null ? null : previous.o;
@@ -155,8 +165,7 @@
       AbstractPosition wildcardPosition = null;
       while(position != null)
       {
-         ParticleBinding particle = position.particle;
-         if(!particle.getTerm().isSkip() || position.repeatableParticleValue != null)
+         if(!position.skip || position.repeatableParticleValue != null)
          {
             notSkippedParent = position;
             return position;
@@ -167,7 +176,7 @@
             return wildcardPosition;
          }
 
-         if(particle.getTerm().isWildcard())
+         if(position.particle.getTerm().isWildcard())
             wildcardPosition = position;
          position = position.previous;
       }
@@ -177,14 +186,24 @@
 
    protected void setParent(AbstractPosition parentPosition, ParticleHandler handler)
    {
+      if(skip)
+         return;
+      
       if(repeatableParticleValue != null)
       {
          repeatableHandler.addTermValue(repeatableParticleValue, o, qName, particle, parentPosition.particle, handler);
       }
-      else if(parentPosition.repeatableParticleValue == null || !parentPosition.particle.getTerm().isSkip())
+      else if(parentPosition.repeatableParticleValue != null && parentPosition.skip)
       {
+         parentPosition.repeatableHandler.addTermValue(
+               parentPosition.repeatableParticleValue,
+               o, qName, particle,
+               parentPosition.particle, handler);
+      }
+      else
+      {
          TermBeforeSetParentCallback beforeSetParent = particle.getTerm().getBeforeSetParentCallback();
-         if(beforeSetParent != null)
+         if (beforeSetParent != null)
          {
             UnmarshallingContextImpl ctx = stack.getContext();
             ctx.parent = parentPosition.o;
@@ -193,14 +212,9 @@
             o = beforeSetParent.beforeSetParent(o, ctx);
             ctx.clear();
          }
-         
+
          handler.setParent(parentPosition.o, o, qName, particle, parentPosition.particle);
       }
-      else
-         parentPosition.repeatableHandler.addTermValue(
-               parentPosition.repeatableParticleValue,
-               o, qName, particle,
-               parentPosition.particle, handler);
    }
 
    protected abstract ParticleHandler getHandler();

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	2010-01-27 15:44:50 UTC (rev 3959)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ChoiceBinding.java	2010-01-29 11:00:22 UTC (rev 3960)
@@ -118,11 +118,14 @@
                   next.previous = this;
                   ++occurrence;
 
-                  o = handler.endParticle(o, qName, particle);
-                  if(previous.o != null)
-                     setParent(previous, handler);
-                  initValue(atts);
-
+                  if(!skip)
+                  {
+                     o = handler.endParticle(o, qName, particle);
+                     if (previous.o != null)
+                        setParent(previous, handler);
+                     initValue(atts);
+                  }
+                  
                   if (trace)
                      log.trace("found " + qName + " in " + ChoiceBinding.this + ", term=" + choice.getTerm());
                   return this;

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/DefaultHandlers.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/DefaultHandlers.java	2010-01-27 15:44:50 UTC (rev 3959)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/DefaultHandlers.java	2010-01-29 11:00:22 UTC (rev 3960)
@@ -72,6 +72,26 @@
    
    public static ParticleHandler XOP_HANDLER = new XOPElementHandler();
    
+   public static ParticleHandler UOE_PARTICLE_HANDLER = new ParticleHandler()
+   {
+      public Object endParticle(Object o, QName elementName, ParticleBinding particle)
+      {
+         throw new UnsupportedOperationException();
+      }
+
+      public void setParent(Object parent, Object o, QName elementName, ParticleBinding particle,
+            ParticleBinding parentParticle)
+      {
+         throw new UnsupportedOperationException();
+      }
+
+      public Object startParticle(Object parent, QName elementName, ParticleBinding particle, Attributes attrs,
+            NamespaceContext nsCtx)
+      {
+         throw new UnsupportedOperationException();
+      }
+   };
+
    public static ParticleHandler NOOP_PARTICLE_HANDLER = new ParticleHandler()
    {
       public Object endParticle(Object o, QName elementName, ParticleBinding particle)
@@ -90,7 +110,7 @@
          return parent;
       }
    };
-   
+
    public static RepeatableParticleHandler REPEATABLE_HANDLER = new RepeatableParticleHandler()
    {
       public Object startRepeatableParticle(Object parent, QName startName, ParticleBinding particle)

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ElementPosition.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ElementPosition.java	2010-01-27 15:44:50 UTC (rev 3959)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ElementPosition.java	2010-01-29 11:00:22 UTC (rev 3960)
@@ -268,6 +268,10 @@
    
    public void endParticle()
    {
+      ended = true;
+      if(skip)
+         return;
+      
       ElementBinding element = (ElementBinding) particle.getTerm();
       TypeBinding type = element.getType();
       
@@ -477,8 +481,6 @@
             o = parent;
          }
       }
-      
-      ended = true;
    }
    
    public ElementPosition startParticle(QName startName, Attributes atts)

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	2010-01-27 15:44:50 UTC (rev 3959)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/NonElementPosition.java	2010-01-29 11:00:22 UTC (rev 3960)
@@ -55,12 +55,15 @@
       if(ended)
          throw new JBossXBRuntimeException("The position has already been ended!");
       
-      o = handler.endParticle(o, qName, particle);
-      ended = true;
+      if(!skip)
+      {
+         o = handler.endParticle(o, qName, particle);
+         ended = true;
+
+         if (previous.o != null)
+            setParent(previous, handler);
+      }
       
-      if(previous.o != null)
-         setParent(previous, handler);
-      
       if(repeatableParticleValue != null)
          endRepeatableParticle();
    }
@@ -70,13 +73,16 @@
       if(ended)
          throw new JBossXBRuntimeException("The position has already been ended!");
 
-      o = handler.endParticle(o, qName, particle);
+      if (!skip)
+      {
+         o = handler.endParticle(o, qName, particle);
 
-      // model group should always have parent particle
-      AbstractPosition parentPosition = notSkippedParent();
-      if(parentPosition.o != null)
-         setParent(parentPosition, handler);
-
+         // model group should always have parent particle
+         AbstractPosition parentPosition = notSkippedParent();
+         if (parentPosition.o != null)
+            setParent(parentPosition, handler);
+      }
+      
       // if it is repeatable then this is the repeatable parent
       if(!particle.isRepeatable())
          previous.repeatForChild(atts);

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	2010-01-27 15:44:50 UTC (rev 3959)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SequenceBinding.java	2010-01-29 11:00:22 UTC (rev 3960)
@@ -151,11 +151,14 @@
                   next.previous = this;
                   ++occurrence;
 
-                  o = handler.endParticle(o, qName, particle);
-                  if(previous.o != null)
-                     setParent(previous, handler);
-                  initValue(atts);
-
+                  if(!skip)
+                  {
+                     o = handler.endParticle(o, qName, particle);
+                     if (previous.o != null)
+                        setParent(previous, handler);
+                     initValue(atts);
+                  }
+                  
                   if(trace)
                      log.trace("found " + qName + " in " + SequenceBinding.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	2010-01-27 15:44:50 UTC (rev 3959)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/WildcardBinding.java	2010-01-29 11:00:22 UTC (rev 3960)
@@ -315,11 +315,13 @@
                next.previous = this;
                ++occurrence;
 
-               o = handler.endParticle(o, qName, particle);
-               if(previous.o != null)
-                  setParent(previous, handler);
-               //o = initValue(stack.parent().getValue(), atts);
-
+               if(!skip)
+               {
+                  o = handler.endParticle(o, qName, particle);
+                  if (previous.o != null)
+                     setParent(previous, handler);
+                  //o = initValue(stack.parent().getValue(), atts);
+               }
                return this;
             }
          }
@@ -331,7 +333,7 @@
       @Override
       protected ParticleHandler getHandler()
       {
-         return DefaultHandlers.NOOP_PARTICLE_HANDLER;
+         return DefaultHandlers.UOE_PARTICLE_HANDLER;
       }
    }
 }

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java	2010-01-27 15:44:50 UTC (rev 3959)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java	2010-01-29 11:00:22 UTC (rev 3960)
@@ -1140,7 +1140,7 @@
       if (trace)
          log.trace(model.getGroupType() + " model group for type=" + beanInfo.getName());
 
-      model.setHandler(BuilderParticleHandler.PARENT_ELEMENT);
+      model.setHandler(BuilderParticleHandler.setParentDelegate(typeBinding.getHandler()));
       ParticleBinding typeParticle = new ParticleBinding(model);
       typeParticle.setMinOccurs(1);
       typeParticle.setMaxOccurs(1);
@@ -1447,7 +1447,7 @@
       if (elements.length > 1)
       {
          ChoiceBinding choice = new ChoiceBinding(schemaBinding);
-         choice.setHandler(BuilderParticleHandler.PARENT_GROUP);
+         choice.setHandler(BuilderParticleHandler.parentGroup(localModel));
          ParticleBinding particleBinding = new ParticleBinding(choice);
          particleBinding.setMinOccurs(0);
          // WARN normally maxOccursUnbounded should be set to true in this case
@@ -1558,7 +1558,7 @@
                }
                else
                {
-                  elementTypeBinding.setHandler(BuilderParticleHandler.PARENT_GROUP);
+                  elementTypeBinding.setHandler(BuilderParticleHandler.parentGroup(localModel));
                }
                elementTypeBinding.setSchemaBinding(schemaBinding);
                ElementBinding elementBinding = createElementBinding(localPropertyType, elementTypeBinding, propertyQName, false);
@@ -1571,7 +1571,7 @@
 
                // Setup the child model
                ChoiceBinding childModel = new ChoiceBinding(schemaBinding);
-               childModel.setHandler(BuilderParticleHandler.PARENT_ELEMENT);
+               childModel.setHandler(BuilderParticleHandler.setParentDelegate(elementTypeBinding.getHandler()));
                ParticleBinding particleBinding = new ParticleBinding(childModel);
                particleBinding.setMinOccurs(0);
                particleBinding.setMaxOccurs(1);
@@ -1966,10 +1966,10 @@
    {
       TypeBinding wrapperType = new TypeBinding();
       SequenceBinding seq = new SequenceBinding(schemaBinding);
-      seq.setHandler(BuilderParticleHandler.PARENT_ELEMENT);
+      seq.setHandler(DefaultHandlers.UOE_PARTICLE_HANDLER);
       ParticleBinding particle = new ParticleBinding(seq);
       wrapperType.setParticle(particle);
-      wrapperType.setHandler(DefaultHandlers.NOOP_PARTICLE_HANDLER);
+      wrapperType.setHandler(DefaultHandlers.UOE_PARTICLE_HANDLER);
 
       ElementBinding wrapperElement = createElementBinding(propertyType, wrapperType, wrapperQName, false);
       wrapperElement.setNillable(annotation.nillable());
@@ -2194,7 +2194,6 @@
          BeanAdapterFactory entryAdapterFactory = null;
          BeanInfo entryInfo = JBossXBBuilder.configuration.getBeanInfo(DefaultMapEntry.class);
          entryAdapterFactory = createAdapterFactory(DefaultBeanAdapterBuilder.class, entryInfo, null);
-         BeanHandler entryHandler = new BeanHandler(entryInfo.getName(), entryAdapterFactory);
 
          TypeBinding entryType = null;
          TypeInfo entryTypeInfo = null;
@@ -2209,6 +2208,7 @@
 
             entryType = new TypeBinding();
             entryType.setSchemaBinding(schemaBinding);
+            BeanHandler entryHandler = new BeanHandler(entryInfo.getName(), entryAdapterFactory);
             entryType.setHandler(entryHandler);
 
             entryTypeInfo = JBossXBBuilder.configuration.getTypeInfo(DefaultMapEntry.class);                     
@@ -2252,6 +2252,7 @@
             keyValueSequence = new SequenceBinding(schemaBinding);                     
             if(entryType == null)
             {
+               BeanHandler entryHandler = new BeanHandler(entryInfo.getName(), entryAdapterFactory);
                keyValueSequence.setSkip(false);
                keyValueSequence.setQName(propertyQName);
                schemaBinding.addGroup(keyValueSequence.getQName(), keyValueSequence);

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/ArrayWrapperRepeatableParticleHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/ArrayWrapperRepeatableParticleHandler.java	2010-01-27 15:44:50 UTC (rev 3959)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/ArrayWrapperRepeatableParticleHandler.java	2010-01-29 11:00:22 UTC (rev 3960)
@@ -61,8 +61,6 @@
    public void addTermValue(Object particleValue, Object termValue, QName elementName, ParticleBinding particle,
          ParticleBinding parentParticle, ParticleHandler handler)
    {
-      if(particle.getTerm().isSkip())
-         return;
       ValueAdapter valueAdapter = particle.getTerm().getValueAdapter();
       if(valueAdapter != null)
          termValue = valueAdapter.cast(termValue, null);

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/BeanHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/BeanHandler.java	2010-01-27 15:44:50 UTC (rev 3959)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/BeanHandler.java	2010-01-29 11:00:22 UTC (rev 3960)
@@ -45,7 +45,7 @@
 public class BeanHandler /*extends DefaultElementHandler*/ implements ParticleHandler
 {
    /** The log */
-   private final Logger log = Logger.getLogger(getClass());
+   protected static final Logger log = Logger.getLogger("org.jboss.xb.builder.runtime.BeanHandler");
    
    /** Whether trace is enabled */
    private boolean trace = log.isTraceEnabled();
@@ -110,6 +110,7 @@
          ElementBinding element = (ElementBinding) term;
          attrsHandler.attributes(o, elementName, element.getType(), attrs, nsCtx);
       }
+
       return o;
    }
 
@@ -120,25 +121,22 @@
 
       TermBinding term = particle.getTerm();
       ValueAdapter valueAdapter = null;
-      if(term.isModelGroup())
+      if(term.isElement()) // elements appear much more often than model groups
       {
+         valueAdapter = ((ElementBinding)term).getValueAdapter();
+      }
+      else if(term.isModelGroup())
+      {
          QName modelGroupName = ((ModelGroupBinding)term).getQName();
          if(modelGroupName != null)
-         {
             qName = modelGroupName;
-         }
-      }
-      else if(term.isElement())
-      {
-         valueAdapter = ((ElementBinding)term).getValueAdapter();
-      }
+      } 
 
       BeanAdapter beanAdapter = (BeanAdapter) parent;
       AbstractPropertyHandler propertyHandler = beanAdapter.getPropertyHandler(qName);
       if (propertyHandler == null)
       {
-         TermBinding element = term;
-         if (element.getSchema().isStrictSchema())
+         if (term.getSchema().isStrictSchema())
             throw new RuntimeException("QName " + qName + " unknown property parent=" + BuilderUtil.toDebugString(parent) + " child=" + BuilderUtil.toDebugString(o) + " available=" + beanAdapter.getAvailable());
          if (trace)
             log.trace("QName " + qName + " unknown property parent=" + BuilderUtil.toDebugString(parent) + " child=" + BuilderUtil.toDebugString(o));

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/BuilderParticleHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/BuilderParticleHandler.java	2010-01-27 15:44:50 UTC (rev 3959)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/BuilderParticleHandler.java	2010-01-29 11:00:22 UTC (rev 3960)
@@ -24,6 +24,8 @@
 import javax.xml.namespace.NamespaceContext;
 import javax.xml.namespace.QName;
 
+import org.jboss.xb.binding.JBossXBRuntimeException;
+import org.jboss.xb.binding.sunday.unmarshalling.DefaultHandlers;
 import org.jboss.xb.binding.sunday.unmarshalling.ElementBinding;
 import org.jboss.xb.binding.sunday.unmarshalling.ModelGroupBinding;
 import org.jboss.xb.binding.sunday.unmarshalling.ParticleBinding;
@@ -41,59 +43,7 @@
 {
    /** The singleton instance */
    public static final BuilderParticleHandler INSTANCE = new BuilderParticleHandler();
-   
-   public static final ParticleHandler PARENT_ELEMENT = new ParticleHandler()
-   {
-      public Object endParticle(Object o, QName elementName, ParticleBinding particle)
-      {
-         return o;
-      }
 
-      public void setParent(Object parent, Object o, QName elementName, ParticleBinding particle, ParticleBinding parentParticle)
-      {
-         if (particle.getTerm().isElement())
-         {
-            ParticleHandler particleHandler = ((ElementBinding)parentParticle.getTerm()).getType().getHandler();
-            if(particleHandler != null)
-               particleHandler.setParent(parent, o, elementName, particle, parentParticle);
-         }
-      }
-
-      public Object startParticle(Object parent, QName elementName, ParticleBinding particle, Attributes attrs,
-            NamespaceContext nsCtx)
-      {
-         return parent;
-      }
-   };
-
-   public static final ParticleHandler PARENT_GROUP = new ParticleHandler()
-   {
-      public Object endParticle(Object o, QName elementName, ParticleBinding particle)
-      {
-         return o;
-      }
-
-      public void setParent(Object parent, Object o, QName elementName, ParticleBinding particle, ParticleBinding parentParticle)
-      {
-         if (particle.getTerm().isElement())
-         {
-            TermBinding parentTerm = parentParticle.getTerm();
-            if (!parentTerm.isSkip())
-            {
-               ParticleHandler particleHandler = ((ModelGroupBinding)parentTerm).getHandler();
-               if(particleHandler != null)
-                  particleHandler.setParent(parent, o, elementName, particle, parentParticle);
-            }
-         }
-      }
-
-      public Object startParticle(Object parent, QName elementName, ParticleBinding particle, Attributes attrs,
-            NamespaceContext nsCtx)
-      {
-         return parent;
-      }
-   };
-
    public Object startParticle(Object parent, QName elementName, ParticleBinding particle, Attributes attrs, NamespaceContext nsCtx)
    {
       return parent;
@@ -123,4 +73,40 @@
    {
       return o;
    }
+   
+   public static ParticleHandler setParentDelegate(final ParticleHandler typeHandler)
+   {
+      return new ParticleHandler()
+      {
+         private final ParticleHandler delegate = typeHandler;
+         
+         public Object endParticle(Object o, QName elementName, ParticleBinding particle)
+         {
+            return o;
+         }
+
+         public void setParent(Object parent, Object o, QName elementName, ParticleBinding particle, ParticleBinding parentParticle)
+         {
+            if (particle.getTerm().isElement())
+               delegate.setParent(parent, o, elementName, particle, parentParticle);
+         }
+
+         public Object startParticle(Object parent, QName elementName, ParticleBinding particle, Attributes attrs,
+               NamespaceContext nsCtx)
+         {
+            return parent;
+         }
+      };
+   }
+   
+   public static ParticleHandler parentGroup(final ModelGroupBinding group)
+   {
+      if(group.isSkip())
+         return DefaultHandlers.UOE_PARTICLE_HANDLER;
+      
+      ParticleHandler handler = group.getHandler();
+      if(handler == null)
+         throw new JBossXBRuntimeException("The group is expected to have a non-null handler: " + group);
+      return setParentDelegate(handler);
+   }
 }

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/CollectionPropertyHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/CollectionPropertyHandler.java	2010-01-27 15:44:50 UTC (rev 3959)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/CollectionPropertyHandler.java	2010-01-29 11:00:22 UTC (rev 3960)
@@ -34,6 +34,7 @@
 import org.jboss.reflect.spi.ConstructorInfo;
 import org.jboss.reflect.spi.TypeInfo;
 import org.jboss.xb.annotations.JBossXmlCollection;
+import org.jboss.xb.binding.JBossXBRuntimeException;
 import org.jboss.xb.spi.BeanAdapter;
 
 /**
@@ -115,8 +116,19 @@
    @SuppressWarnings("unchecked")
    public void handle(PropertyInfo propertyInfo, TypeInfo propertyType, Object parent, Object child, QName qName)
    {
-      if (componentType != null && child != null && componentType.isInstance(child) == false)
-         throw new IllegalArgumentException("Child is not an instance of " + componentType + ", child: " + child);
+      if (componentType != null && child != null)
+      {
+         if(!componentType.isInstance(child))
+            throw new IllegalArgumentException("Child is not an instance of " + componentType + ", child: " + child);
+         try
+         {
+            child = componentType.convertValue(child);
+         }
+         catch (Throwable e)
+         {
+            throw new JBossXBRuntimeException("QName " + qName + " error converting " + BuilderUtil.toDebugString(child) + " to type " + componentType.getName(), e);
+         }
+      }
 
       BeanAdapter beanAdapter = (BeanAdapter) parent;
       
@@ -153,18 +165,7 @@
          }
       }
       
-      // Now add
-      try
-      {
-         if (componentType != null && child != null)
-            c.add(componentType.convertValue(child));
-         else
-            c.add(child);
-      }
-      catch (Throwable t)
-      {
-         throw new RuntimeException("QName " + qName + " error adding " + BuilderUtil.toDebugString(child) + " to collection " + BuilderUtil.toDebugString(c), t);
-      }
+      c.add(child);
    }
    
    private static interface CollectionFactory

Modified: jbossxb/trunk/src/test/java/org/jboss/test/xml/MapsUnitTestCase.java
===================================================================
--- jbossxb/trunk/src/test/java/org/jboss/test/xml/MapsUnitTestCase.java	2010-01-27 15:44:50 UTC (rev 3959)
+++ jbossxb/trunk/src/test/java/org/jboss/test/xml/MapsUnitTestCase.java	2010-01-29 11:00:22 UTC (rev 3960)
@@ -320,6 +320,7 @@
       );
 
       // sequence entry
+      entrySeq.setSkip(false);
       entrySeq.setHandler(new ParticleHandler()
       {
          public Object startParticle(Object parent,



More information about the jboss-svn-commits mailing list