[jboss-svn-commits] JBoss Common SVN: r2020 - in jbossxb/trunk/src/main/java/org/jboss/xb/binding: . group sunday/unmarshalling sunday/unmarshalling/impl/runtime

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Sep 14 19:44:32 EDT 2006


Author: alex.loubyansky at jboss.com
Date: 2006-09-14 19:44:26 -0400 (Thu, 14 Sep 2006)
New Revision: 2020

Modified:
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/GenericValueContainer.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/UnmarshallerImpl.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueList.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueListHandler.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueListInitializer.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/JBXB76ContentHandler.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/impl/runtime/RtElementHandler.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/impl/runtime/RtUtil.java
Log:
fixed start/end repeatable particles with interceptors present, a bunch of other refactorings and incomplete things on the way to JBXB-76

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/GenericValueContainer.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/GenericValueContainer.java	2006-09-14 18:58:26 UTC (rev 2019)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/GenericValueContainer.java	2006-09-14 23:44:26 UTC (rev 2020)
@@ -41,6 +41,30 @@
          return array(null, null, itemClass);
       }
 
+      public static GenericValueContainer child(final Class childClass)
+      {
+         return new GenericValueContainer()
+         {
+            private Object child;
+            
+            public void addChild(QName name, Object value)
+            {
+               this.child = value;
+            }
+
+            public Class getTargetClass()
+            {
+               return childClass;
+            }
+
+            public Object instantiate()
+            {
+               return child;
+            }
+            
+         };
+      }
+      
       public static GenericValueContainer array(final Class wrapperClass,
                                                 final String itemProperty,
                                                 final Class itemClass)
@@ -59,6 +83,41 @@
 
             public Object instantiate()
             {
+/* for collected repeatable particles  
+               Object arr;
+               if(items.isEmpty())
+               {
+                  arr = Array.newInstance(itemType, 0);
+               }
+               else
+               {
+                  java.util.Collection col = (java.util.Collection)items.get(0);
+                  arr = Array.newInstance(itemType, col.size());
+                  if(itemType.isPrimitive())
+                  {
+                     int i = 0;
+                     for(java.util.Iterator iter = col.iterator(); iter.hasNext();)
+                     {
+                        Object item = iter.next();
+                        try
+                        {
+                           Array.set(arr, i++, item);
+                        }
+                        catch(IllegalArgumentException e)
+                        {
+                           throw new JBossXBRuntimeException("Failed to set " +
+                              item +
+                              " as an item of array " + arr
+                           );
+                        }
+                     }
+                  }
+                  else
+                  {
+                     col.toArray((Object[])arr);
+                  }
+               }             
+*/
                Object arr = Array.newInstance(itemType, items.size());
                for(int i = 0; i < items.size(); ++i)
                {
@@ -123,7 +182,6 @@
                      );
                   }
                }
-
                return result;
             }
 
@@ -133,6 +191,11 @@
                // todo: what's the best way to get a class for array having the item class?
                return Array.newInstance(itemType, 0).getClass();
             }
+            
+            public String toString()
+            {
+               return super.toString() + "array";
+            }
          };
       }
    }

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/UnmarshallerImpl.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/UnmarshallerImpl.java	2006-09-14 18:58:26 UTC (rev 2019)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/UnmarshallerImpl.java	2006-09-14 23:44:26 UTC (rev 2020)
@@ -29,6 +29,7 @@
 import org.jboss.xb.binding.sunday.unmarshalling.SchemaBinding;
 import org.jboss.xb.binding.sunday.unmarshalling.SchemaBindingResolver;
 import org.jboss.xb.binding.sunday.unmarshalling.SundayContentHandler;
+//import org.jboss.xb.binding.sunday.unmarshalling.JBXB76ContentHandler;
 import org.jboss.xb.binding.metadata.unmarshalling.DocumentBinding;
 import org.xml.sax.EntityResolver;
 import org.xml.sax.ErrorHandler;
@@ -108,42 +109,42 @@
 
    public Object unmarshal(String xml, SchemaBinding schemaBinding) throws JBossXBException
    {
-      SundayContentHandler cHandler = new SundayContentHandler(schemaBinding);
+      JBossXBParser.ContentHandler cHandler = new SundayContentHandler(schemaBinding);
       parser.parse(xml, cHandler);
       return cHandler.getRoot();
    }
 
    public Object unmarshal(Reader xmlReader, SchemaBinding schemaBinding) throws JBossXBException
    {
-      SundayContentHandler cHandler = new SundayContentHandler(schemaBinding);
+      JBossXBParser.ContentHandler cHandler = new SundayContentHandler(schemaBinding);
       parser.parse(xmlReader, cHandler);
       return cHandler.getRoot();
    }
 
    public Object unmarshal(InputStream xmlStream, SchemaBinding schemaBinding) throws JBossXBException
    {
-      SundayContentHandler cHandler = new SundayContentHandler(schemaBinding);
+      JBossXBParser.ContentHandler cHandler = new SundayContentHandler(schemaBinding);
       parser.parse(xmlStream, cHandler);
       return cHandler.getRoot();
    }
 
    public Object unmarshal(String xml, SchemaBindingResolver schemaResolver) throws JBossXBException
    {
-      SundayContentHandler cHandler = new SundayContentHandler(schemaResolver);
+      JBossXBParser.ContentHandler cHandler = new SundayContentHandler(schemaResolver);
       parser.parse(xml, cHandler);
       return cHandler.getRoot();
    }
 
    public Object unmarshal(Reader xmlReader, SchemaBindingResolver schemaResolver) throws JBossXBException
    {
-      SundayContentHandler cHandler = new SundayContentHandler(schemaResolver);
+      JBossXBParser.ContentHandler cHandler = new SundayContentHandler(schemaResolver);
       parser.parse(xmlReader, cHandler);
       return cHandler.getRoot();
    }
 
    public Object unmarshal(InputStream xmlStream, SchemaBindingResolver schemaResolver) throws JBossXBException
    {
-      SundayContentHandler cHandler = new SundayContentHandler(schemaResolver);
+      JBossXBParser.ContentHandler cHandler = new SundayContentHandler(schemaResolver);
       parser.parse(xmlStream, cHandler);
       return cHandler.getRoot();
    }

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueList.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueList.java	2006-09-14 18:58:26 UTC (rev 2019)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueList.java	2006-09-14 23:44:26 UTC (rev 2020)
@@ -93,15 +93,15 @@
 
    void setAttributeValue(QName qName, AttributeBinding binding, Object value)
    {
-      setNonRequiredValue(qName, binding, null, value);
+      setNonRequiredValue(qName, binding, null, value, null);
    }
 
    void addTextValue(QName qName, ParticleBinding particle, CharactersHandler handler, Object value)
    {
-      setNonRequiredValue(qName, particle, handler, value);
+      setNonRequiredValue(qName, particle, handler, value, null);
    }
 
-   void addTermValue(QName qName, ParticleBinding binding, Object handler, Object value)
+   void addTermValue(QName qName, ParticleBinding binding, Object handler, Object value, ParticleBinding parentParticle)
    {
       if(binding.isRepeatable())
       {
@@ -113,7 +113,7 @@
          if(last == null || last.binding != binding)
          {
             value = Collections.singletonList(value);
-            setNonRequiredValue(qName, binding, handler, value);
+            setNonRequiredValue(qName, binding, handler, value, parentParticle);
          }
          else
          {
@@ -128,13 +128,13 @@
       }
       else
       {
-         setNonRequiredValue(qName, binding, handler, value);
+         setNonRequiredValue(qName, binding, handler, value, parentParticle);
       }
    }
 
-   void setNonRequiredValue(QName qName, Object binding, Object handler, Object value)
+   void setNonRequiredValue(QName qName, Object binding, Object handler, Object value, ParticleBinding parentParticle)
    {
-      NonRequiredValue val = new NonRequiredValue(qName, binding, handler, value);
+      NonRequiredValue val = new NonRequiredValue(qName, binding, handler, value, parentParticle);
       switch(nonRequiredValues.size())
       {
          case 0:
@@ -202,13 +202,15 @@
       public final Object binding;
       public final Object handler;
       public Object value;
+      public ParticleBinding parentParticle;
 
-      public NonRequiredValue(QName qName, Object binding, Object handler, Object value)
+      public NonRequiredValue(QName qName, Object binding, Object handler, Object value, ParticleBinding parentParticle)
       {
          this.qName = qName;
          this.binding = binding;
          this.handler = handler;
          this.value = value;
+         this.parentParticle = parentParticle;
       }
    }
 }

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	2006-09-14 18:58:26 UTC (rev 2019)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueListHandler.java	2006-09-14 23:44:26 UTC (rev 2020)
@@ -348,5 +348,119 @@
       }
    };
 
+   class FACTORY
+   {
+      /**
+       * Collects children and adds them all at the time of newInstance is called.
+       * 
+       * @param parent  the parent object
+       * @return the parent object
+       */
+      public static ValueListHandler lazy(final Object parent)
+      {
+         return new ValueListHandler()
+         {
+            private final ValueList parentValueList = parent instanceof ValueList ? (ValueList)parent : null;
+            
+            public Object newInstance(ParticleBinding particle, ValueList valueList)
+            {
+               for(int i = 0; i < valueList.size(); ++i)
+               {
+                  ValueList.NonRequiredValue valueEntry = valueList.getValue(i);
+                  Object binding = valueEntry.binding;
+                  if(binding instanceof ParticleBinding)
+                  {
+                     Object handler = valueEntry.handler;
+                     ParticleBinding childParticle = (ParticleBinding)binding;
+                     if(handler instanceof ParticleHandler)
+                     {
+                        ParticleHandler pHandler = (ParticleHandler)handler;
+                        if(childParticle.isRepeatable())
+                        {
+                           List list = (List)valueEntry.value;
+                           //System.out.println("newInstance: " + childParticle.getTerm() + "=" + list);
+                           for(int listInd = 0; listInd < list.size(); ++listInd)
+                           {
+                              if(parentValueList != null)
+                              {
+                                 parentValueList.addTermValue(valueEntry.qName, childParticle, pHandler, list.get(listInd), null);
+                              }
+                              else
+                              {
+                                 pHandler.setParent(parent, list.get(listInd), valueEntry.qName, childParticle, valueEntry.parentParticle);
+                              }
+                           }
+
+/*                           if(parentValueList != null)
+                           {
+                              parentValueList.addTermValue(valueEntry.qName, childParticle, pHandler, list, null);
+                           }
+                           else
+                           {
+                              pHandler.setParent(parent, list, valueEntry.qName, childParticle, valueEntry.parentParticle);
+                           }
+*/                           
+                        }
+                        else
+                        {
+                           if(parentValueList != null)
+                           {
+                              parentValueList.addTermValue(valueEntry.qName, childParticle, pHandler, valueEntry.value, valueEntry.parentParticle);
+                           }
+                           else
+                           {
+                              pHandler.setParent(parent, valueEntry.value, valueEntry.qName, childParticle, valueEntry.parentParticle);
+                           }
+                        }
+                     }
+                     else
+                     {
+                        CharactersHandler cHandler = (CharactersHandler)handler;
+                        if(parentValueList != null)
+                        {
+                           parentValueList.addTextValue(valueEntry.qName, childParticle, cHandler, valueEntry.value);
+                        }
+                        else
+                        {
+                           cHandler.setValue(valueEntry.qName, (ElementBinding) childParticle.getTerm(), parent, valueEntry.value);
+                        }
+                     }
+                  }
+                  else if(binding instanceof AttributeBinding)
+                  {
+                     AttributeBinding attr = (AttributeBinding)binding;
+                     AttributeHandler handler = attr.getHandler();
+                     if(handler != null)
+                     {
+                        if(parentValueList != null)
+                        {
+                           parentValueList.setAttributeValue(attr.getQName(), attr, valueEntry.value);
+                        }
+                        else
+                        {
+                           handler.attribute(valueEntry.qName, attr.getQName(), attr, parent, valueEntry.value);
+                        }
+                     }
+                     else
+                     {
+                        throw new JBossXBRuntimeException("Attribute binding present but has no handler: element=" +
+                           valueEntry.qName +
+                           ", attrinute=" +
+                           attr.getQName()
+                        );
+                     }
+                  }
+                  else
+                  {
+                     throw new JBossXBRuntimeException("Unexpected binding type: " + binding);
+                  }
+               }
+
+               return parent;
+            }
+         };
+      }
+   };
+   
    Object newInstance(ParticleBinding particle, ValueList valueList);
 }

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueListInitializer.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueListInitializer.java	2006-09-14 18:58:26 UTC (rev 2019)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueListInitializer.java	2006-09-14 23:44:26 UTC (rev 2020)
@@ -23,7 +23,6 @@
 
 import java.util.Map;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.List;
 import java.util.ArrayList;
 import javax.xml.namespace.QName;
@@ -31,7 +30,6 @@
 import org.jboss.xb.binding.sunday.unmarshalling.AttributeBinding;
 import org.jboss.xb.binding.sunday.unmarshalling.ElementBinding;
 import org.jboss.xb.binding.sunday.unmarshalling.ParticleBinding;
-import org.jboss.xb.binding.sunday.unmarshalling.ParticleHandler;
 import org.jboss.xb.binding.sunday.unmarshalling.CharactersHandler;
 
 /**
@@ -116,12 +114,12 @@
       valueList.addTextValue(qName, particle, handler, value);
    }
 
-   public void addTermValue(QName qName, ParticleBinding binding, Object handler, ValueList valueList, Object value)
+   public void addTermValue(QName qName, ParticleBinding binding, Object handler, ValueList valueList, Object value, ParticleBinding parentParticle)
    {
       Integer index = (Integer)elemIndex.get(qName);
       if(index == null)
       {
-         valueList.addTermValue(qName, binding, handler, value);
+         valueList.addTermValue(qName, binding, handler, value, parentParticle);
       }
       else
       {

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/JBXB76ContentHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/JBXB76ContentHandler.java	2006-09-14 18:58:26 UTC (rev 2019)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/JBXB76ContentHandler.java	2006-09-14 23:44:26 UTC (rev 2020)
@@ -28,10 +28,13 @@
 import org.apache.xerces.xs.XSTypeDefinition;
 import org.jboss.logging.Logger;
 import org.jboss.util.StringPropertyReplacer;
+import org.jboss.xb.binding.GenericValueContainer;
 import org.jboss.xb.binding.JBossXBRuntimeException;
 import org.jboss.xb.binding.NamespaceRegistry;
 import org.jboss.xb.binding.Util;
 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.metadata.CharactersMetaData;
 import org.jboss.xb.binding.metadata.ValueMetaData;
 import org.jboss.xb.binding.parser.JBossXBParser;
@@ -196,7 +199,7 @@
                   }
                   else
                   {
-                     pop();
+                     pop();                     
                      if(item.particle.isRepeatable())
                      {
                         endRepeatableParticle(item.particle);
@@ -292,20 +295,6 @@
                      }
                   }
 
-/*
-                  if(cursor.getOccurence() - prevOccurence > 0 || item.ended)
-                  {
-                     endParticle(item, startName, 1);
-
-                     ParticleBinding modelGroupParticle = cursor.getParticle();
-                     ParticleHandler handler = getHandler(modelGroupParticle);
-                     Object o = handler.startParticle(stack.peek(1).o, startName, modelGroupParticle, atts, nsRegistry);
-
-                     item.reset();
-                     item.o = o;
-                  }
-*/
-
                   // push all except the last one
                   Object o = item.o;
                   for(int i = newCursors.size() - 2; i >= 0; --i)
@@ -410,12 +399,26 @@
          }
 
          List interceptors = element.getInterceptors();
-         for(int i = 0; i < interceptors.size(); ++i)
+         if(!interceptors.isEmpty())
          {
-            ElementInterceptor interceptor = (ElementInterceptor)interceptors.get(i);
-            parent = interceptor.startElement(parent, startName, type);
-            push(startName, particle, parent);
-            interceptor.attributes(parent, startName, type, atts, nsRegistry);
+            if (repeated)
+            {
+               pop();
+            }
+
+            for (int i = 0; i < interceptors.size(); ++i)
+            {
+               ElementInterceptor interceptor = (ElementInterceptor) interceptors.get(i);
+               parent = interceptor.startElement(parent, startName, type);
+               push(startName, particle, parent);
+               interceptor.attributes(parent, startName, type, atts, nsRegistry);
+            }
+
+            if (repeated)
+            {
+               // to have correct endRepeatableParticle calls
+               stack.push(item);
+            }
          }
 
          ParticleHandler handler = type.getHandler();
@@ -492,7 +495,8 @@
          if(parentItem.cursor == null)
          {
             throw new JBossXBRuntimeException(
-               "Repeatable parent expected to be a model group but got element: " +
+               "Failed to start " + startName +
+               ": the element is not repeatable, repeatable parent expected to be a model group but got element " +
                ((ElementBinding)parentItem.particle.getTerm()).getQName()
             );
          }
@@ -571,75 +575,37 @@
    private void startRepeatableParticle(QName startName, ParticleBinding particle)
    {
       //System.out.println(" start repeatable particle: " + particle.getTerm());
-/*
-      StackItem item = stack.peek();
-
-      TermBinding parentTerm = item.particle.getTerm();
-      WildcardBinding wc = null;
-      if(parentTerm.isWildcard())
-      {
-         wc = (WildcardBinding)parentTerm;
-      }
-      else if(!parentTerm.isModelGroup())
-      {
-         ElementBinding el = (ElementBinding)parentTerm;
-         wc = el.getType().getWildcard();
-         if(wc != null && el.getType().getElement(startName) != null)
-         {
-            wc = null;
-         }
-      }
-
+      
       TermBinding term = particle.getTerm();
-      if(term.getAddMethodMetaData() != null ||
-         wc != null && wc.getAddMethodMetaData() != null ||
-         term.getPutMethodMetaData() != null ||
-         term.getMapEntryMetaData() != null)
+      if(term.isSkip())
       {
          return;
       }
-
-      item.tmp = item.o;
-      item.o = new ArrayList();
-      item.repeatbleParticleName = startName;
-
-*/
+      
+      StackItem item = stack.peek();
+      if(item.o != null &&
+            !(item.o instanceof GenericValueContainer) &&
+            term.getAddMethodMetaData() == null &&
+            term.getMapEntryMetaData() == null &&
+            term.getPutMethodMetaData() == null)
+      {
+         ValueListHandler handler = ValueListHandler.FACTORY.lazy(item.o);
+         Class cls = item.o.getClass();
+         item.repeatableParticleValue = new ValueListInitializer().newValueList(handler, cls);
+      }
    }
 
    private void endRepeatableParticle(ParticleBinding particle)
    {
       //System.out.println(" end repeatable particle: " + particle.getTerm());
 
-/*
       StackItem item = stack.peek();
-      if(item.repeatbleParticleName == null)
+      ValueList valueList = item.repeatableParticleValue;
+      if(valueList != null)
       {
-         return;
+         valueList.getHandler().newInstance(particle, valueList);
+         item.repeatableParticleValue = null;
       }
-
-      TermBinding term = particle.getTerm();
-      ParticleHandler handler = null;
-      if(term.isModelGroup())
-      {
-         handler = getHandler(particle);
-      }
-      else
-      {
-         ElementBinding el = (ElementBinding)term;
-         handler = el.getType().getHandler();
-         if(handler == null)
-         {
-            handler = defParticleHandler;
-         }
-
-      }
-
-      setParent(handler, item.tmp, item.o, item.repeatbleParticleName, particle, item.particle);
-
-      item.o = item.tmp;
-      item.tmp = null;
-      item.repeatbleParticleName = null;
-*/
    }
 
    private void endParticle(StackItem item, QName qName, int parentStackPos)
@@ -678,7 +644,9 @@
          {
             parentParticle = item.particle;
          }
-         setParent(handler, item.o, o, qName, modelGroupParticle, parentParticle);
+         setParent(handler,
+               item.repeatableParticleValue == null ? item.o : item.repeatableParticleValue,
+               o, qName, modelGroupParticle, parentParticle);
       }
    }
 
@@ -805,7 +773,8 @@
                            particle,
                            charHandler,
                            valueList,
-                           unmarshalled
+                           unmarshalled,
+                           null
                         );
                      }
                      else
@@ -843,7 +812,8 @@
       // endElement
       //
 
-      Object parent = stack.size() == 1 ? null : ((StackItem)stack.peek(1)).o;
+      StackItem parentItem = stack.size() == 1 ? null : stack.peek(1);
+      Object parent = parentItem == null ? null : parentItem.o;
       ParticleHandler handler = type.getHandler();
       if(handler == null)
       {
@@ -904,11 +874,15 @@
             } */
             if(wildcardHandler != null)
             {
-               setParent(wildcardHandler, parent, o, endName, particle, parentParticle);
+               setParent(wildcardHandler,
+                     parentItem.repeatableParticleValue == null ? parent : parentItem.repeatableParticleValue,
+                     o, endName, particle, parentParticle);
             }
             else
             {
-               setParent(handler, parent, o, endName, particle, parentParticle);
+               setParent(handler,
+                     parentItem.repeatableParticleValue == null ? parent : parentItem.repeatableParticleValue,
+                     o, endName, particle, parentParticle);
             }
          }
          else if(parentParticle != null &&
@@ -935,7 +909,7 @@
       }
       else
       {
-         pop();
+         StackItem popped = pop();
          for(int i = interceptorsTotal - 1; i >= 0; --i)
          {
             ElementInterceptor interceptor = (ElementInterceptor)interceptors.get(i);
@@ -943,6 +917,8 @@
             interceptor.add(parent, o, endName);
             o = parent;
          }
+         // need to have correst endRepeatableParticle events
+         stack.push(popped);
       }
 
       if(stack.size() == 1)
@@ -958,10 +934,10 @@
                           ParticleBinding particle,
                           ParticleBinding parentParticle)
    {
-      if(parent instanceof ValueList && !particle.getTerm().isSkip())
+      if(parent instanceof ValueList /*&& !particle.getTerm().isSkip()*/)
       {
          ValueList valueList = (ValueList)parent;
-         valueList.getInitializer().addTermValue(endName, particle, handler, valueList, o);
+         valueList.getInitializer().addTermValue(endName, particle, handler, valueList, o, parentParticle);
       }
       else
       {
@@ -1018,8 +994,7 @@
       final ModelGroupBinding.Cursor cursor;
       final ParticleBinding particle;
       Object o;
-      //Object tmp;
-      //QName repeatbleParticleName;
+      ValueList repeatableParticleValue;
       StringBuffer textContent;
       boolean ended;
 

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	2006-09-14 18:58:26 UTC (rev 2019)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SundayContentHandler.java	2006-09-14 23:44:26 UTC (rev 2020)
@@ -805,7 +805,8 @@
                            particle,
                            charHandler,
                            valueList,
-                           unmarshalled
+                           unmarshalled,
+                           null
                         );
                      }
                      else
@@ -961,7 +962,7 @@
       if(parent instanceof ValueList && !particle.getTerm().isSkip())
       {
          ValueList valueList = (ValueList)parent;
-         valueList.getInitializer().addTermValue(endName, particle, handler, valueList, o);
+         valueList.getInitializer().addTermValue(endName, particle, handler, valueList, o, parentParticle);
       }
       else
       {

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	2006-09-14 18:58:26 UTC (rev 2019)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/impl/runtime/RtElementHandler.java	2006-09-14 23:44:26 UTC (rev 2020)
@@ -527,6 +527,8 @@
             }
             else if(Collection.class.isAssignableFrom(fieldType))
             {
+               //System.out.println("GeenericValueContainer.child: " + elementName);
+               //o = GenericValueContainer.FACTORY.child(fieldType);
                o = new ArrayList();
             }
             else
@@ -701,7 +703,6 @@
             {
                ElementBinding element = (ElementBinding)term;
                cls = classForNonArrayItem(element, parentClass);
-
                if(cls != null)
                {
                   // todo: before that, the type should be checked for required attributes and elements
@@ -740,7 +741,6 @@
             }
          }
       }
-
       return o;
    }
 

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/impl/runtime/RtUtil.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/impl/runtime/RtUtil.java	2006-09-14 18:58:26 UTC (rev 2019)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/impl/runtime/RtUtil.java	2006-09-14 23:44:26 UTC (rev 2020)
@@ -131,6 +131,7 @@
             length = Array.getLength(arr);
             arr = Array.newInstance(fieldType.getComponentType(), length + 1);
             System.arraycopy(tmp, 0, arr, 0, length);
+            //System.out.println("copied array (1)");
          }
          Array.set(arr, length, value);
          fieldInfo.setValue(o, arr);
@@ -157,9 +158,7 @@
          value = valueAdapter.cast(value, fieldType);
       }
 
-      if(colType != null ||
-         // todo collections of collections
-         Collection.class.isAssignableFrom(fieldType) &&
+      if(Collection.class.isAssignableFrom(fieldType) &&
          !Collection.class.isAssignableFrom(value.getClass()))
       {
          Collection col = (Collection)fieldInfo.getValue(o);
@@ -194,6 +193,7 @@
             fieldInfo.setValue(o, col);
          }
 
+         //System.out.println("col.add(value): " + prop + "=" + value);
          col.add(value);
       }
       else if(fieldType.isArray() &&
@@ -215,6 +215,7 @@
             length = Array.getLength(arr);
             arr = Array.newInstance(fieldType.getComponentType(), length + 1);
             System.arraycopy(tmp, 0, arr, 0, length);
+            throw new JBossXBRuntimeException("copied array (2)");
          }
          Array.set(arr, length, value);
          fieldInfo.setValue(o, arr);
@@ -223,37 +224,23 @@
       {
          // todo: unmarshalling should produce the right type instead
          Class valueClass = value == null ? null : value.getClass();
-         if(valueClass != null && !fieldType.isAssignableFrom(valueClass))
+         if (valueClass != null && fieldType.isArray() && Collection.class.isAssignableFrom(valueClass))
          {
-            if(fieldType.isArray() && Collection.class.isAssignableFrom(valueClass))
+            Collection col = (Collection) value;
+            Class compType = fieldType.getComponentType();
+            value = Array.newInstance(compType, col.size());
+            if (compType.isPrimitive())
             {
-               Collection col = (Collection)value;
-               Class compType = fieldType.getComponentType();
-               value = Array.newInstance(compType, col.size());
-               if(compType.isPrimitive())
+               int i = 0;
+               for (Iterator iter = col.iterator(); iter.hasNext();)
                {
-                  int i = 0;
-                  for(Iterator iter = col.iterator(); iter.hasNext();)
-                  {
-                     Array.set(value, i++, iter.next());
-                  }
+                  Array.set(value, i++, iter.next());
                }
-               else
-               {
-                  value = col.toArray((Object[])value);
-               }
             }
-            else if(Collection.class.isAssignableFrom(fieldType) && valueClass.isArray())
+            else
             {
-               int length = Array.getLength(value);
-               Collection col = new ArrayList(length);
-               for(int i = 0; i < length; ++i)
-               {
-                  col.add(Array.get(value, i));
-               }
-               value = col;
+               value = col.toArray((Object[]) value);
             }
-            // else hopefully it's a primitive/wrapper case
          }
 
          fieldInfo.setValue(o, value);




More information about the jboss-svn-commits mailing list