[jboss-svn-commits] JBoss Common SVN: r3634 - in jbossxb/trunk/src/main/java/org/jboss/xb: binding/group and 3 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Nov 4 11:22:23 EST 2009


Author: alex.loubyansky at jboss.com
Date: 2009-11-04 11:22:22 -0500 (Wed, 04 Nov 2009)
New Revision: 3634

Added:
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueListRepeatableParticleHandler.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/CollectionRepeatableParticleHandler.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/NoopRepeatableParticleHandler.java
Modified:
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/GenericValueContainer.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueListHandler.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/RepeatableParticleHandler.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/TermBinding.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/WildcardBinding.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/XsdBinder.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/impl/runtime/RtElementHandler.java
   jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java
Log:
JBXB-229, JBXB-230

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/GenericValueContainer.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/GenericValueContainer.java	2009-11-04 15:07:42 UTC (rev 3633)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/GenericValueContainer.java	2009-11-04 16:22:22 UTC (rev 3634)
@@ -24,6 +24,7 @@
 import java.lang.reflect.Array;
 import java.lang.reflect.Constructor;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 import javax.xml.namespace.QName;
 import org.jboss.xb.binding.sunday.unmarshalling.impl.runtime.RtUtil;
@@ -54,7 +55,10 @@
 
             public void addChild(QName name, Object value)
             {
-               items.add(value);
+               if(value != null && Collection.class.isAssignableFrom(value.getClass()))
+                  items.addAll((Collection<? extends Object>) value);
+               else
+                  items.add(value);
             }
 
             public Object instantiate()

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueListHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueListHandler.java	2009-11-04 15:07:42 UTC (rev 3633)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueListHandler.java	2009-11-04 16:22:22 UTC (rev 3634)
@@ -198,7 +198,8 @@
                      if(childParticle.isRepeatable())
                      {
                         TermBinding term = childParticle.getTerm();
-                        if(!(o instanceof GenericValueContainer) &&
+/* Has to be commented for the NOOP RepeatableParticleHandler
+ *                         if(!(o instanceof GenericValueContainer) &&
                               term.getAddMethodMetaData() == null &&
                               term.getMapEntryMetaData() == null &&
                               term.getPutMethodMetaData() == null)
@@ -206,7 +207,7 @@
                            pHandler.setParent(o, valueEntry.value, valueEntry.qName, childParticle, particle);
                         }
                         else
-                        {
+*/                        {
                            Collection<?> col = (Collection<?>)valueEntry.value;
                            for(Iterator<?> iter = col.iterator(); iter.hasNext();)
                            {

Added: jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueListRepeatableParticleHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueListRepeatableParticleHandler.java	                        (rev 0)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueListRepeatableParticleHandler.java	2009-11-04 16:22:22 UTC (rev 3634)
@@ -0,0 +1,116 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2009, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.xb.binding.group;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import javax.xml.namespace.QName;
+
+import org.jboss.xb.binding.GenericValueContainer;
+import org.jboss.xb.binding.JBossXBRuntimeException;
+import org.jboss.xb.binding.group.ValueList.NonRequiredValue;
+import org.jboss.xb.binding.sunday.unmarshalling.ParticleBinding;
+import org.jboss.xb.binding.sunday.unmarshalling.ParticleHandler;
+import org.jboss.xb.binding.sunday.unmarshalling.RepeatableParticleHandler;
+import org.jboss.xb.binding.sunday.unmarshalling.TermBinding;
+
+/**
+ * 
+ * @author <a href="alex at jboss.com">Alexey Loubyansky</a>
+ * @version $Revision: 1.1 $
+ */
+public class ValueListRepeatableParticleHandler implements RepeatableParticleHandler
+{
+   public static final ValueListRepeatableParticleHandler INSTANCE = new ValueListRepeatableParticleHandler();
+   
+   public Object startRepeatableParticle(Object parent, QName startName, ParticleBinding particle)
+   {
+      TermBinding term = particle.getTerm();
+      if(term.isSkip())
+      {
+         return null;
+      }
+      
+      if(parent != null &&
+            !(parent instanceof GenericValueContainer) &&
+            (parent instanceof Collection == false) &&
+            term.getAddMethodMetaData() == null &&
+            term.getMapEntryMetaData() == null &&
+            term.getPutMethodMetaData() == null)
+      {
+         ValueListHandler handler = ValueListHandler.FACTORY.lazy(parent);
+         Class<?> cls = parent.getClass();
+         return new ValueListInitializer().newValueList(handler, cls);
+      }
+      return null;
+   }
+
+   public void endRepeatableParticle(Object parent, Object o, QName elementName, ParticleBinding particle, ParticleBinding parentParticle)
+   {
+      if (o == null)
+         throw new IllegalArgumentException("Collection value is null for repeatable particle " + particle.getTerm());
+
+      ValueList valueList = (ValueList) o;
+      if (valueList.size() == 0)
+         return;
+
+      if (particle.getTerm().isWildcard())
+      {
+         ParticleHandler handler = null;
+
+         // that's not good. some elements can be handled as "unresolved" and some as "resolved"
+         QName qName = valueList.getValue(0).qName;
+         Collection<Object> col = new ArrayList<Object>();
+         for (int i = 0; i < valueList.size(); ++i)
+         {
+            NonRequiredValue value = valueList.getValue(i);
+            col.add(value.value);
+
+            if (handler != value.handler)
+            {
+               if (handler == null && i == 0)
+               {
+                  handler = (ParticleHandler) value.handler;
+               }
+               else
+               {
+                  throw new JBossXBRuntimeException("Handlers in the list are supposed to be the same.");
+               }
+            }
+         }
+
+         handler.setParent(parent, col, qName, particle, parentParticle);
+      }
+      else
+      {
+         valueList.getHandler().newInstance(particle, valueList);
+      }
+   }
+
+   public void addTermValue(Object particleValue, Object termValue, QName elementName,
+         ParticleBinding particle, ParticleBinding parentParticle, ParticleHandler handler)
+   {
+      ValueList valueList = (ValueList)particleValue;
+      valueList.getInitializer().addTermValue(elementName, particle, handler, valueList, termValue, parentParticle);
+   }
+}
\ No newline at end of file

Added: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/CollectionRepeatableParticleHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/CollectionRepeatableParticleHandler.java	                        (rev 0)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/CollectionRepeatableParticleHandler.java	2009-11-04 16:22:22 UTC (rev 3634)
@@ -0,0 +1,72 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2009, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.xb.binding.sunday.unmarshalling;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import javax.xml.namespace.QName;
+
+/**
+ * 
+ * @author <a href="alex at jboss.com">Alexey Loubyansky</a>
+ * @version $Revision: 1.1 $
+ */
+public class CollectionRepeatableParticleHandler implements RepeatableParticleHandler
+{
+   public static final CollectionRepeatableParticleHandler INSTANCE = new CollectionRepeatableParticleHandler();
+   
+   public Object startRepeatableParticle(Object parent, QName startName, ParticleBinding particle)
+   {
+      return createCollection();
+   }
+
+   public void endRepeatableParticle(Object parent, Object o, QName elementName, ParticleBinding particle, ParticleBinding parentParticle)
+   {
+      if(o == null)
+         return;
+      
+      ParticleHandler handler;
+      TermBinding term = particle.getTerm();
+      if(term.isElement())
+         handler = ((ElementBinding)term).getType().getHandler();
+      else if(term.isModelGroup())
+         handler = ((ModelGroupBinding)term).getHandler();
+      else
+         handler = ((WildcardBinding)term).getWildcardHandler();
+
+      if(handler == null)
+         handler = DefaultHandlers.ELEMENT_HANDLER;
+      handler.setParent(parent, o, elementName, particle, parentParticle);
+   }
+
+   public void addTermValue(Object particleValue, Object termValue, QName elementName,
+         ParticleBinding particle, ParticleBinding parentParticle, ParticleHandler handler)
+   {
+      ((Collection<Object>)particleValue).add(termValue);
+   }
+   
+   protected Collection<Object> createCollection()
+   {
+      return new ArrayList<Object>();
+   }
+}
\ No newline at end of file

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	2009-11-04 15:07:42 UTC (rev 3633)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/DefaultHandlers.java	2009-11-04 16:22:22 UTC (rev 3634)
@@ -56,4 +56,6 @@
    public static CharactersHandler CHARACTERS_HANDLER = RtCharactersHandler.INSTANCE;
 
    public static ParticleHandler XOP_HANDLER = new XOPElementHandler();
+   
+   public static RepeatableParticleHandler REPEATABLE_HANDLER = NoopRepeatableParticleHandler.INSTANCE;
 }

Added: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/NoopRepeatableParticleHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/NoopRepeatableParticleHandler.java	                        (rev 0)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/NoopRepeatableParticleHandler.java	2009-11-04 16:22:22 UTC (rev 3634)
@@ -0,0 +1,48 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2009, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.xb.binding.sunday.unmarshalling;
+
+import javax.xml.namespace.QName;
+
+/**
+ * 
+ * @author <a href="alex at jboss.com">Alexey Loubyansky</a>
+ * @version $Revision: 1.1 $
+ */
+public class NoopRepeatableParticleHandler implements RepeatableParticleHandler
+{
+   public static final NoopRepeatableParticleHandler INSTANCE = new NoopRepeatableParticleHandler();
+   
+   public Object startRepeatableParticle(Object parent, QName startName, ParticleBinding particle)
+   {
+      return null;
+   }
+
+   public void endRepeatableParticle(Object parent, Object o, QName elementName, ParticleBinding particle, ParticleBinding parentParticle)
+   {
+   }
+
+   public void addTermValue(Object particleValue, Object termValue, QName elementName,
+         ParticleBinding particle, ParticleBinding parentParticle, ParticleHandler handler)
+   {
+   }
+}
\ No newline at end of file

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/RepeatableParticleHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/RepeatableParticleHandler.java	2009-11-04 15:07:42 UTC (rev 3633)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/RepeatableParticleHandler.java	2009-11-04 16:22:22 UTC (rev 3634)
@@ -21,18 +21,11 @@
 */
 package org.jboss.xb.binding.sunday.unmarshalling;
 
-import java.util.ArrayList;
-import java.util.Collection;
 
 import javax.xml.namespace.QName;
 
-import org.jboss.xb.binding.GenericValueContainer;
-import org.jboss.xb.binding.JBossXBRuntimeException;
-import org.jboss.xb.binding.group.ValueList;
-import org.jboss.xb.binding.group.ValueListHandler;
-import org.jboss.xb.binding.group.ValueListInitializer;
-import org.jboss.xb.binding.group.ValueList.NonRequiredValue;
 
+
 /**
  * A RepeatableParticleHandler.
  * 
@@ -41,140 +34,9 @@
  */
 public interface RepeatableParticleHandler
 {
-   RepeatableParticleHandler VALUE_LIST = new RepeatableParticleHandler()
-   {
-      public Object startRepeatableParticle(Object parent, QName startName, ParticleBinding particle)
-      {
-         TermBinding term = particle.getTerm();
-         if(term.isSkip())
-         {
-            return null;
-         }
-         
-         if(parent != null &&
-               !(parent instanceof GenericValueContainer) &&
-               (parent instanceof Collection == false) &&
-               term.getAddMethodMetaData() == null &&
-               term.getMapEntryMetaData() == null &&
-               term.getPutMethodMetaData() == null)
-         {
-            ValueListHandler handler = ValueListHandler.FACTORY.lazy(parent);
-            Class<?> cls = parent.getClass();
-            return new ValueListInitializer().newValueList(handler, cls);
-         }
-         return null;
-      }      
-
-      public void endRepeatableParticle(Object parent, Object o, QName elementName, ParticleBinding particle, ParticleBinding parentParticle)
-      {
-         if (o == null)
-            throw new IllegalArgumentException("Collection value is null for repeatable particle " + particle.getTerm());
-
-         ValueList valueList = (ValueList) o;
-         if (valueList.size() == 0)
-            return;
-
-         if (particle.getTerm().isWildcard())
-         {
-            ParticleHandler handler = null;
-
-            // that's not good. some elements can be handled as "unresolved" and some as "resolved"
-            QName qName = valueList.getValue(0).qName;
-            Collection<Object> col = new ArrayList<Object>();
-            for (int i = 0; i < valueList.size(); ++i)
-            {
-               NonRequiredValue value = valueList.getValue(i);
-               col.add(value.value);
-
-               if (handler != value.handler)
-               {
-                  if (handler == null && i == 0)
-                  {
-                     handler = (ParticleHandler) value.handler;
-                  }
-                  else
-                  {
-                     throw new JBossXBRuntimeException("Handlers in the list are supposed to be the same.");
-                  }
-               }
-            }
-
-            handler.setParent(parent, col, qName, particle, parentParticle);
-         }
-         else
-         {
-            valueList.getHandler().newInstance(particle, valueList);
-         }
-      }
-
-      public void addTermValue(Object parent, Object particleValue, Object termValue, QName elementName,
-            ParticleBinding particle, ParticleBinding parentParticle, ParticleHandler handler)
-      {
-         if(parent == termValue)
-            return;
-
-         ValueList valueList = (ValueList)particleValue;
-         valueList.getInitializer().addTermValue(elementName, particle, handler, valueList, termValue, parentParticle);
-      }
-   };
-
-   RepeatableParticleHandler NOOP = new RepeatableParticleHandler()
-   {
-      public Object startRepeatableParticle(Object parent, QName startName, ParticleBinding particle)
-      {
-         return null;
-      }
-
-      public void endRepeatableParticle(Object parent, Object o, QName elementName, ParticleBinding particle, ParticleBinding parentParticle)
-      {
-      }
-
-      public void addTermValue(Object parent, Object particleValue, Object termValue, QName elementName,
-            ParticleBinding particle, ParticleBinding parentParticle, ParticleHandler handler)
-      {
-      }
-   };
-
-   RepeatableParticleHandler LIST = new RepeatableParticleHandler()
-   {
-      public Object startRepeatableParticle(Object parent, QName startName, ParticleBinding particle)
-      {
-         return new ArrayList<Object>();
-      }
-
-      public void endRepeatableParticle(Object parent, Object o, QName elementName, ParticleBinding particle, ParticleBinding parentParticle)
-      {
-         if(o == null)
-            return;
-         
-         ParticleHandler handler;
-         TermBinding term = particle.getTerm();
-         if(term.isElement())
-         {
-            handler = ((ElementBinding)term).getType().getHandler();
-         }
-         else if(term.isModelGroup())
-         {
-            handler = ((ModelGroupBinding)term).getHandler();
-         }
-         else
-         {
-            handler = ((WildcardBinding)term).getWildcardHandler();
-         }
-         
-         handler.setParent(parent, o, elementName, particle, parentParticle);
-      }
-
-      public void addTermValue(Object parent, Object particleValue, Object termValue, QName elementName,
-            ParticleBinding particle, ParticleBinding parentParticle, ParticleHandler handler)
-      {
-         ((Collection<Object>)particleValue).add(termValue);
-      }
-   };
-
    Object startRepeatableParticle(Object parent, QName startName, ParticleBinding particle);
    
-   void addTermValue(Object parent, Object particleValue, Object termValue, QName elementName, ParticleBinding particle, ParticleBinding parentParticle, ParticleHandler handler);
+   void addTermValue(Object particleValue, Object termValue, QName elementName, ParticleBinding particle, ParticleBinding parentParticle, ParticleHandler handler);
    
    void endRepeatableParticle(Object parent, Object o, QName elementName, ParticleBinding particle, ParticleBinding parentParticle);
 }

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-04 15:07:42 UTC (rev 3633)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SundayContentHandler.java	2009-11-04 16:22:22 UTC (rev 3634)
@@ -66,7 +66,6 @@
    private NamespaceRegistry nsRegistry = new NamespaceRegistry();
 
    private ParticleHandler defParticleHandler = DefaultHandlers.ELEMENT_HANDLER;
-   private RepeatableParticleHandler defRepeatableHandler = RepeatableParticleHandler.VALUE_LIST;
 
    private UnmarshallingContextImpl ctx = new UnmarshallingContextImpl();
    // DTD information frm startDTD
@@ -592,9 +591,10 @@
                );
             }
 
-            element = new ElementBinding(schemaBinding, startName, xsiTypeBinding);
+            ElementBinding xsiElement = new ElementBinding(schemaBinding, startName, xsiTypeBinding);
+            xsiElement.setRepeatableHandler(element.getRepeatableHandler());
             particle =
-               new ParticleBinding(element,
+               new ParticleBinding(xsiElement,
                   particle.getMinOccurs(),
                   particle.getMaxOccurs(),
                   particle.getMaxOccursUnbounded()
@@ -805,7 +805,9 @@
    {
       if(trace)
          log.trace(" start repeatable (" + stack.size() + "): " + particle.getTerm());
-      return defRepeatableHandler.startRepeatableParticle(parent, startName, particle);
+      RepeatableParticleHandler repeatableHandler = particle.getTerm().getRepeatableHandler();
+      // the way it is now it's never null
+      return repeatableHandler.startRepeatableParticle(parent, startName, particle);
    }
 
    private void endRepeatableParticle(Object parent, Object o, QName elementName, ParticleBinding particle, ParticleBinding parentParticle)
@@ -813,7 +815,9 @@
       if (trace)
          log.trace(" end repeatable (" + stack.size() + "): " + particle.getTerm());
 
-      defRepeatableHandler.endRepeatableParticle(parent, o, elementName, particle, parentParticle);
+      RepeatableParticleHandler repeatableHandler = particle.getTerm().getRepeatableHandler();
+      // the way it is now it's never null
+      repeatableHandler.endRepeatableParticle(parent, o, elementName, particle, parentParticle);
    }
 
    private void endParticle(QName qName, StackItem item, StackItem parentItem)
@@ -841,7 +845,10 @@
          if(parentItem.repeatableParticleValue == null)
             setParent(handler, parentItem.o, o, qName, modelGroupParticle, parentParticle);
          else
-            defRepeatableHandler.addTermValue(parentItem.o, parentItem.repeatableParticleValue, o, qName, modelGroupParticle, parentParticle, handler);
+         {
+            RepeatableParticleHandler repeatableHandler = modelGroupParticle.getTerm().getRepeatableHandler();
+            repeatableHandler.addTermValue(parentItem.repeatableParticleValue, o, qName, modelGroupParticle, parentParticle, handler);
+         }
       }
    }
 
@@ -1133,7 +1140,10 @@
             if(parentItem.repeatableParticleValue == null)
                setParent(handler, parent, o, endName, particle, parentParticle);
             else
-               defRepeatableHandler.addTermValue(parent, parentItem.repeatableParticleValue, o, endName, particle, parentParticle, handler);
+            {
+               RepeatableParticleHandler repeatableHandler = particle.getTerm().getRepeatableHandler();
+               repeatableHandler.addTermValue(parentItem.repeatableParticleValue, o, endName, particle, parentParticle, handler);
+            }
          }
          else if(parentParticle != null && hasWildcard && stack.size() > 1)
          {

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/TermBinding.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/TermBinding.java	2009-11-04 15:07:42 UTC (rev 3633)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/TermBinding.java	2009-11-04 16:22:22 UTC (rev 3634)
@@ -49,6 +49,7 @@
    protected ValueAdapter valueAdapter;
    protected TermBeforeMarshallingCallback beforeMarshallingCallback;
    protected TermBeforeSetParentCallback beforeSetParentCallback;
+   protected RepeatableParticleHandler repeatableHandler = DefaultHandlers.REPEATABLE_HANDLER;
 
    protected TermBinding(SchemaBinding schema)
    {
@@ -187,4 +188,14 @@
    {
       return beforeSetParentCallback;
    }
+   
+   public RepeatableParticleHandler getRepeatableHandler()
+   {
+      return repeatableHandler;
+   }
+   
+   public void setRepeatableHandler(RepeatableParticleHandler repeatableHandler)
+   {
+      this.repeatableHandler = repeatableHandler;
+   }
 }

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-04 15:07:42 UTC (rev 3633)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/WildcardBinding.java	2009-11-04 16:22:22 UTC (rev 3634)
@@ -249,7 +249,9 @@
       type.setSimpleType(unresolvedCharactersHandler);
       type.setParticle(new ParticleBinding(sequence, 1, 0, true));
 
-      return new ElementBinding(schema, qName, type);
+      ElementBinding element = new ElementBinding(schema, qName, type);
+      element.setRepeatableHandler(repeatableHandler);
+      return element;
    }
 
    public boolean isSkip()

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/XsdBinder.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/XsdBinder.java	2009-11-04 15:07:42 UTC (rev 3633)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/XsdBinder.java	2009-11-04 16:22:22 UTC (rev 3634)
@@ -57,6 +57,7 @@
 import org.jboss.xb.binding.Util;
 import org.jboss.xb.binding.resolver.MultiClassSchemaResolver;
 import org.jboss.xb.binding.sunday.xop.XOPIncludeHandler;
+import org.jboss.xb.binding.group.ValueListRepeatableParticleHandler;
 import org.jboss.xb.binding.metadata.AddMethodMetaData;
 import org.jboss.xb.binding.metadata.CharactersMetaData;
 import org.jboss.xb.binding.metadata.ClassMetaData;
@@ -976,6 +977,7 @@
 
    private void bindParticle(XSParticle particle)
    {
+      ParticleBinding particleBinding = null;
       XSTerm term = particle.getTerm();
       switch(term.getType())
       {
@@ -986,7 +988,7 @@
             {
                ModelGroupBinding groupBinding = bindModelGroup(modelGroup);
 
-               ParticleBinding particleBinding = new ParticleBinding(groupBinding);
+               particleBinding = new ParticleBinding(groupBinding);
                particleBinding.setMaxOccursUnbounded(particle.getMaxOccursUnbounded());
                particleBinding.setMinOccurs(particle.getMinOccurs());
                particleBinding.setMaxOccurs(particle.getMaxOccurs());
@@ -1020,10 +1022,10 @@
             }
             break;
          case XSConstants.WILDCARD:
-            bindWildcard(particle);
+            particleBinding = bindWildcard(particle);
             break;
          case XSConstants.ELEMENT_DECLARATION:
-            bindElement(
+            particleBinding = bindElement(
                (XSElementDeclaration)term,
                particle.getMinOccurs(),
                particle.getMaxOccurs(),
@@ -1033,6 +1035,9 @@
          default:
             throw new IllegalStateException("Unexpected term type: " + term.getType());
       }
+      
+      if(particleBinding != null)
+         particleBinding.getTerm().setRepeatableHandler(ValueListRepeatableParticleHandler.INSTANCE);
    }
 
    private ModelGroupBinding bindModelGroup(XSModelGroup modelGroup)
@@ -1069,7 +1074,7 @@
       return groupBinding;
    }
 
-   private void bindWildcard(XSParticle particle)
+   private ParticleBinding bindWildcard(XSParticle particle)
    {
       WildcardBinding binding = new WildcardBinding(schema);
 
@@ -1096,6 +1101,7 @@
             customizeTerm(annotation, binding, trace);
          }
       }
+      return particleBinding;
    }
 
    private ParticleBinding bindElement(XSElementDeclaration elementDec,

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/impl/runtime/RtElementHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/impl/runtime/RtElementHandler.java	2009-11-04 15:07:42 UTC (rev 3633)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/impl/runtime/RtElementHandler.java	2009-11-04 16:22:22 UTC (rev 3634)
@@ -309,20 +309,9 @@
             }
 
             if (trace)
-            {
                log.trace("setParent " + qName + " metadata set " + propName);
-            }
 
-            /*if(particle.isRepeatable())
-            {
-               RtUtil.add(owner, o, propName, colType,
-                  term.getSchema().isIgnoreUnresolvedFieldOrClass(),
-                  term.getValueAdapter()
-               );
-            }
-            else
-            {*/
-
+            // TODO with RepeatableParticleHandler.NOOP check for Collection should be commented out
             if(particle.isRepeatable() && !(o instanceof Collection))
             {
                RtUtil.add(owner, o, propName, colType,

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java	2009-11-04 15:07:42 UTC (rev 3633)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java	2009-11-04 16:22:22 UTC (rev 3634)
@@ -95,6 +95,7 @@
 import org.jboss.xb.annotations.JBossXmlValue;
 import org.jboss.xb.binding.JBossXBRuntimeException;
 import org.jboss.xb.binding.SimpleTypeBindings;
+import org.jboss.xb.binding.sunday.unmarshalling.CollectionRepeatableParticleHandler;
 import org.jboss.xb.binding.sunday.unmarshalling.AllBinding;
 import org.jboss.xb.binding.sunday.unmarshalling.AnyAttributeBinding;
 import org.jboss.xb.binding.sunday.unmarshalling.AttributeBinding;
@@ -107,6 +108,7 @@
 import org.jboss.xb.binding.sunday.unmarshalling.ModelGroupBinding;
 import org.jboss.xb.binding.sunday.unmarshalling.ParticleBinding;
 import org.jboss.xb.binding.sunday.unmarshalling.ParticleHandler;
+import org.jboss.xb.binding.sunday.unmarshalling.RepeatableParticleHandler;
 import org.jboss.xb.binding.sunday.unmarshalling.SchemaBinding;
 import org.jboss.xb.binding.sunday.unmarshalling.SequenceBinding;
 import org.jboss.xb.binding.sunday.unmarshalling.TypeBinding;
@@ -1620,12 +1622,15 @@
          }
          else
          {
+            RepeatableParticleHandler repeatableHandler = null;
             XBValueAdapter valueAdapter = null;
             XmlJavaTypeAdapter xmlTypeAdapter = property.getUnderlyingAnnotation(XmlJavaTypeAdapter.class);
             if (xmlTypeAdapter != null)
             {
                valueAdapter = new XBValueAdapter(xmlTypeAdapter.value(), propertyType.getTypeInfoFactory());
                localPropertyType = valueAdapter.getAdaptedTypeInfo();
+               if(localPropertyType.isCollection())
+                  repeatableHandler = CollectionRepeatableParticleHandler.INSTANCE;
             }
 
             ModelGroupBinding targetGroup = localModel;
@@ -1750,6 +1755,8 @@
                ElementBinding elementBinding = createElementBinding(localPropertyType, elementType, propertyQName, false);
                elementBinding.setNillable(nillable);
                elementBinding.setValueAdapter(valueAdapter);
+               if(repeatableHandler != null)
+                  elementBinding.setRepeatableHandler(repeatableHandler);
 
                JBossXmlPreserveWhitespace preserveSpace = property.getUnderlyingAnnotation(JBossXmlPreserveWhitespace.class);
                if (preserveSpace != null)



More information about the jboss-svn-commits mailing list