[jboss-svn-commits] JBoss Common SVN: r4018 - in jbossxb/trunk/src/main/java/org/jboss/xb: binding/sunday/unmarshalling/impl/runtime and 2 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Feb 9 12:47:36 EST 2010


Author: alex.loubyansky at jboss.com
Date: 2010-02-09 12:47:35 -0500 (Tue, 09 Feb 2010)
New Revision: 4018

Modified:
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/CollectionRepeatableParticleHandler.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ElementBinding.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ElementPosition.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ModelGroupBinding.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SchemaBinding.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/impl/runtime/RtElementHandler.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
Log:
pass property that's used in setParent to handlers of local components at their construction time instead of resolving the property at runtime, move valueAdapter.cast() to endParticle callback, avoid duplicate annotation scanning in the builder

Modified: 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	2010-02-09 14:28:24 UTC (rev 4017)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/CollectionRepeatableParticleHandler.java	2010-02-09 17:47:35 UTC (rev 4018)
@@ -45,17 +45,15 @@
       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();
-
+      ParticleHandler handler = term.getHandler();
       if(handler == null)
          handler = DefaultHandlers.ELEMENT_HANDLER;
+      
+      ValueAdapter valueAdapter = term.getValueAdapter();
+      if(valueAdapter != null)
+         o = valueAdapter.cast(o, null);
+      
       handler.setParent(parent, o, elementName, particle, parentParticle);
    }
 

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ElementBinding.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ElementBinding.java	2010-02-09 14:28:24 UTC (rev 4017)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ElementBinding.java	2010-02-09 17:47:35 UTC (rev 4018)
@@ -52,6 +52,8 @@
 
    protected XOPUnmarshaller xopUnmarshaller;
 
+   private ParticleHandler handler;
+   
    public ElementBinding(SchemaBinding schema, QName qName, TypeBinding typeBinding)
    {
       super(schema);
@@ -87,6 +89,18 @@
       this.typeBinding = type;
    }
 
+   @Override
+   public ParticleHandler getHandler()
+   {
+      return handler == null ? typeBinding.getHandler() : handler;
+   }
+   
+   @Override
+   public void setHandler(ParticleHandler handler)
+   {
+      this.handler = handler;
+   }
+   
    public void pushInterceptor(ElementInterceptor interceptor)
    {
       switch(interceptors.size())

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-02-09 14:28:24 UTC (rev 4017)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ElementPosition.java	2010-02-09 17:47:35 UTC (rev 4018)
@@ -545,7 +545,7 @@
       if (type == null)
          throw new JBossXBRuntimeException("No type for element " + element);
 
-      handler = type.getHandler();
+      handler = element.getHandler();
       if (handler == null)
          handler = DefaultHandlers.ELEMENT_HANDLER;
 

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ModelGroupBinding.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ModelGroupBinding.java	2010-02-09 14:28:24 UTC (rev 4017)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ModelGroupBinding.java	2010-02-09 17:47:35 UTC (rev 4018)
@@ -36,23 +36,13 @@
    extends TermBinding
 {
    protected boolean requiredParticle;
-   protected ParticleHandler handler = DefaultHandlers.MODEL_GROUP_HANDLER;
 
    protected ModelGroupBinding(SchemaBinding schema)
    {
       super(schema);
+      handler = DefaultHandlers.MODEL_GROUP_HANDLER;
    }
 
-   public ParticleHandler getHandler()
-   {
-      return handler;
-   }
-
-   public void setHandler(ParticleHandler handler)
-   {
-      this.handler = handler;
-   }
-
    public abstract ElementBinding getArrayItem();
 
    /**

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SchemaBinding.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SchemaBinding.java	2010-02-09 14:28:24 UTC (rev 4017)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SchemaBinding.java	2010-02-09 17:47:35 UTC (rev 4018)
@@ -58,7 +58,7 @@
    {
       public Object cast(Object o, Class<?> c)
       {
-         if (o != null && java.util.Date.class.isAssignableFrom(c))
+         if (c != null && o != null && java.util.Date.class.isAssignableFrom(c))
          {
             o = ((java.util.Calendar) o).getTime();
          }

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	2010-02-09 14:28:24 UTC (rev 4017)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SundayContentHandler.java	2010-02-09 17:47:35 UTC (rev 4018)
@@ -230,8 +230,7 @@
       if(head.getPrevious() != null)
          throw new IllegalStateException("The stack still contains positions!");
 
-      ElementBinding elementBinding = (ElementBinding) head.getParticle().getTerm();
-      Object root = elementBinding.getType().getValueAdapter().cast(head.getValue(), Object.class);
+      Object root = head.getValue();
       head = null;
       nsRegistry = null;
       

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	2010-02-09 14:28:24 UTC (rev 4017)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/TermBinding.java	2010-02-09 17:47:35 UTC (rev 4018)
@@ -56,6 +56,8 @@
    protected TermBeforeSetParentCallback beforeSetParentCallback;
    protected RepeatableParticleHandler repeatableHandler = DefaultHandlers.REPEATABLE_HANDLER;
 
+   protected ParticleHandler handler;
+   
    protected TermBinding(SchemaBinding schema)
    {
       this.schema = schema;
@@ -203,6 +205,16 @@
       return beforeSetParentCallback;
    }
    
+   public ParticleHandler getHandler()
+   {
+      return handler;
+   }
+   
+   public void setHandler(ParticleHandler handler)
+   {
+      this.handler = handler;
+   }
+   
    public RepeatableParticleHandler getRepeatableHandler()
    {
       return 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	2010-02-09 14:28:24 UTC (rev 4017)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/WildcardBinding.java	2010-02-09 17:47:35 UTC (rev 4018)
@@ -48,7 +48,6 @@
    private ParticleHandler unresolvedElementHandler;
    private CharactersHandler unresolvedCharactersHandler;
    private ObjectLocalMarshaller unresolvedMarshaller;
-   private ParticleHandler wildcardHandler;
 
 
    public WildcardBinding(SchemaBinding schema)
@@ -95,14 +94,21 @@
       return pc == PC_STRICT;
    }
 
+   /**
+    * TermBinding.setHandler should be used instead
+    */
+   @Deprecated
    public void setWildcardHandler(ParticleHandler wildcardHandler)
    {
-      this.wildcardHandler = wildcardHandler;
+      this.handler = wildcardHandler;
    }
 
+   /**
+    * TermBinding.getHandler should be used instead
+    */
    public ParticleHandler getWildcardHandler()
    {
-      return wildcardHandler;
+      return handler;
    }
 
    public ParticleHandler getUnresolvedElementHandler()

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	2010-02-09 14:28:24 UTC (rev 4017)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/impl/runtime/RtElementHandler.java	2010-02-09 17:47:35 UTC (rev 4018)
@@ -57,6 +57,7 @@
 import org.jboss.xb.binding.sunday.unmarshalling.SchemaBinding;
 import org.jboss.xb.binding.sunday.unmarshalling.TermBinding;
 import org.jboss.xb.binding.sunday.unmarshalling.TypeBinding;
+import org.jboss.xb.binding.sunday.unmarshalling.ValueAdapter;
 import org.jboss.xb.binding.sunday.unmarshalling.WildcardBinding;
 import org.xml.sax.Attributes;
 
@@ -370,6 +371,10 @@
          log.trace("endParticle " + elementName + " object=" + o + " term=" + term);
       }
 
+      ValueAdapter valueAdapter = term.getValueAdapter();
+      if(valueAdapter != null)
+         o = valueAdapter.cast(o, null);
+
       return o;
    }
 

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java	2010-02-09 14:28:24 UTC (rev 4017)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java	2010-02-09 17:47:35 UTC (rev 4018)
@@ -112,6 +112,7 @@
 import org.jboss.xb.binding.sunday.unmarshalling.SchemaBinding;
 import org.jboss.xb.binding.sunday.unmarshalling.SequenceBinding;
 import org.jboss.xb.binding.sunday.unmarshalling.SimpleTypeBinding;
+import org.jboss.xb.binding.sunday.unmarshalling.TermBinding;
 import org.jboss.xb.binding.sunday.unmarshalling.TypeBinding;
 import org.jboss.xb.binding.sunday.unmarshalling.UnorderedSequenceBinding;
 import org.jboss.xb.binding.sunday.unmarshalling.ValueAdapter;
@@ -136,6 +137,7 @@
 import org.jboss.xb.builder.runtime.PropertyHandler;
 import org.jboss.xb.builder.runtime.PropertyInterceptor;
 import org.jboss.xb.builder.runtime.PropertyWildcardHandler;
+import org.jboss.xb.builder.runtime.SetParentOverrideHandler;
 import org.jboss.xb.builder.runtime.ValueHandler;
 import org.jboss.xb.builder.runtime.WrapperBeanAdapterFactory;
 import org.jboss.xb.spi.BeanAdapterBuilder;
@@ -1249,7 +1251,7 @@
          if (wildcardType.isArray())
          {
             particleBinding.setMaxOccursUnbounded(true);
-            wildcard.setRepeatableHandler(new ArrayWrapperRepeatableParticleHandler(beanAdapterFactory));
+            wildcard.setRepeatableHandler(new ArrayWrapperRepeatableParticleHandler(wildcardHandler));
             type = ((ArrayInfo) wildcardType).getComponentType();
             if (trace)
                log.trace("Wildcard " + wildcardProperty.getName() + " is an array of type " + type.getName());
@@ -1278,7 +1280,7 @@
             wildcard.setUnresolvedCharactersHandler(DOMHandler.INSTANCE);
          }
 
-         wildcard.setWildcardHandler((ParticleHandler) wildcardHandler);
+         wildcard.setHandler((ParticleHandler) wildcardHandler);
          beanAdapterFactory.setWildcardHandler(wildcardHandler);         
       }
 
@@ -1435,9 +1437,9 @@
          String wrapperNamespace = xmlWrapper.namespace();
          String wrapperName = xmlWrapper.name();
          QName wrapperQName = generateXmlName(property.getName(), elementForm, wrapperNamespace, wrapperName);
-         localModel = bindXmlElementWrapper(beanAdapterFactory, propertyType, localModel, xmlWrapper, wrapperQName);
-         beanAdapterFactory.addProperty(wrapperQName, new PropertyHandler(property, propertyType));
-
+         PropertyHandler setWrapperProperty = new PropertyHandler(property, propertyType);
+         beanAdapterFactory.addProperty(wrapperQName, setWrapperProperty);
+         localModel = bindXmlElementWrapper(setWrapperProperty, propertyType, localModel, xmlWrapper, wrapperQName);
          if (trace)
             log.trace("Added property " + wrapperQName + " for type=" + property.getBeanInfo().getName() + " property="
                   + property.getName() + " as a wrapper element");
@@ -1458,12 +1460,160 @@
          localModel = choice;
 
          if(xmlWrapper == null && propertyType.isArray())
-            choice.setRepeatableHandler(new ArrayWrapperRepeatableParticleHandler(beanAdapterFactory));
+            choice.setRepeatableHandler(new ArrayWrapperRepeatableParticleHandler(new PropertyHandler(property, propertyType)));
 
          if (trace)
             log.trace("XmlElements seen adding choice for type=" + property.getBeanInfo().getName() + " property=" + property.getName());
       }
 
+      String overridenDefaultNamespace = defaultNamespace;
+
+      // for now support just one JBossXmlNsPrefix
+      String overrideNamespace = null;
+      String prefixNs = null;
+      JBossXmlNsPrefix xmlNsPrefix = property.getUnderlyingAnnotation(JBossXmlNsPrefix.class);
+      if (xmlNsPrefix != null)
+      {
+         prefixNs = schemaBinding.getNamespace(xmlNsPrefix.prefix());
+         if (prefixNs == null)
+         {
+            if (xmlNsPrefix.schemaTargetIfNotMapped())
+               prefixNs = defaultNamespace;
+            else
+               throw new IllegalStateException("Prefix '" + xmlNsPrefix.prefix() + "' is not mapped to any namespace!");
+         }
+         
+         if(xmlNsPrefix.applyToComponentQName())
+            overrideNamespace = prefixNs;
+      }
+
+      JBossXmlGroup jbossXmlGroup = null;
+      if (!propertyType.isPrimitive())
+         jbossXmlGroup = ((ClassInfo) propertyType).getUnderlyingAnnotation(JBossXmlGroup.class);
+      if(elements[0] == null && jbossXmlGroup != null)
+      {
+         if(prefixNs != null && xmlNsPrefix.applyToComponentContent())
+            defaultNamespace = prefixNs;
+
+         if (trace)
+            log.trace("Processing group for property " + property.getName() + " in "
+                  + property.getBeanInfo().getName() + " " + jbossXmlGroup);
+
+         JBossXmlChild[] children = jbossXmlGroup.value();
+         if (children != null && children.length > 0)
+         {
+            TypeBinding elementTypeBinding = new TypeBinding();
+            JBossXmlGroupText groupText = ((ClassInfo) propertyType).getUnderlyingAnnotation(JBossXmlGroupText.class);
+            if (groupText != null && groupText.wrapper() != Object.class)
+            {
+               BeanInfo wrapperInfo = JBossXBBuilder.configuration.getBeanInfo(groupText.wrapper());
+               TypeBinding wrapperTypeBinding = resolveTypeBinding(wrapperInfo.getClassInfo());
+
+               ParticleHandler particleHandler = wrapperTypeBinding.getHandler();
+               if (particleHandler instanceof BeanHandler == false)
+                  throw new IllegalStateException("Cannot wrap " + wrapperInfo.getName() + " not a bean type " + particleHandler);
+               BeanHandler beanHandler = (BeanHandler) particleHandler;
+               WrapperBeanAdapterFactory wrapperFactory = new WrapperBeanAdapterFactory(beanHandler.getBeanAdapterFactory(), propertyType.getType());
+               BeanHandler wrapperHandler = new BeanHandler(wrapperInfo.getName(), wrapperFactory);
+
+               // Steal the attributes
+               Collection<AttributeBinding> otherAttributes = wrapperTypeBinding.getAttributes();
+               if (otherAttributes != null)
+               {
+                  for (AttributeBinding other : otherAttributes)
+                  {
+                     elementTypeBinding.addAttribute(other);
+                     wrapperHandler.getAttributesHandler().addAttribute(other);
+                  }
+               }
+               elementTypeBinding.setHandler(wrapperHandler);
+               elementTypeBinding.setSimpleType(wrapperTypeBinding.getSimpleType());
+            }
+            else
+            {
+               elementTypeBinding.setHandler(BuilderParticleHandler.parentGroup(localModel));
+            }
+            elementTypeBinding.setSchemaBinding(schemaBinding);
+            QName propertyQName = generateXmlName(property.getName(), elementForm, overrideNamespace, null);
+            ElementBinding elementBinding = createElementBinding(propertyType, elementTypeBinding, propertyQName, false);
+
+            AbstractPropertyHandler propertyHandler = new PropertyHandler(property, propertyType);
+            elementBinding.setHandler(new SetParentOverrideHandler(elementTypeBinding.getHandler(), propertyHandler));
+            beanAdapterFactory.addProperty(propertyQName, propertyHandler);
+
+            // Bind it to the model
+            ParticleBinding particle = new ParticleBinding(elementBinding, 0, 1, false);
+            localModel.addParticle(particle);
+
+            // Setup the child model
+            ChoiceBinding childModel = new ChoiceBinding(schemaBinding);
+            childModel.setHandler(BuilderParticleHandler.setParentDelegate(elementTypeBinding.getHandler()));
+            ParticleBinding particleBinding = new ParticleBinding(childModel);
+            particleBinding.setMinOccurs(0);
+            particleBinding.setMaxOccurs(1);
+            elementTypeBinding.setParticle(particleBinding);
+
+            JBossXmlGroupWildcard groupWildcard = ((ClassInfo) propertyType).getUnderlyingAnnotation(JBossXmlGroupWildcard.class);
+            if (groupWildcard != null)
+            {
+               ChildWildcardHandler groupWildcardHandler;
+               if (groupWildcard.wrapper() != Object.class)
+               {
+                  BeanInfo wrapperInfo = JBossXBBuilder.configuration.getBeanInfo(groupWildcard.wrapper());
+                  groupWildcardHandler = new ChildWildcardHandler(property, wrapperInfo, groupWildcard.property());
+               }
+               else
+                  groupWildcardHandler = new ChildWildcardHandler(property);
+
+               WildcardBinding wildcard = new WildcardBinding(schemaBinding);
+               if (groupWildcard.lax())
+                  wildcard.setProcessContents((short) 3); // Lax
+               else
+                  wildcard.setProcessContents((short) 1); // Strict
+
+               particleBinding = new ParticleBinding(wildcard);
+               particleBinding.setMinOccurs(0);
+               particleBinding.setMaxOccurs(1);
+               childModel.addParticle(particleBinding);
+
+               elementTypeBinding.getWildcard().setHandler(groupWildcardHandler);
+            }
+            
+            DefaultElementInterceptor interceptor = new PropertyInterceptor(property, propertyType);
+            for (JBossXmlChild child : children)
+            {
+               QName childName = generateXmlName(child.name(), elementForm, child.namespace(), child.name());
+               TypeInfo childType = JBossXBBuilder.configuration.getTypeInfo(child.type());
+
+               TypeBinding childTypeBinding = resolveTypeBinding(childType);
+               ElementBinding childBinding = createElementBinding(childType, childTypeBinding, childName, false);
+
+               // Bind it to the model
+               particle = new ParticleBinding(childBinding, child.minOccurs(), child.maxOccurs(), child.unbounded());
+               particle.setMinOccurs(0);
+               childModel.addParticle(particle);
+
+               if(childType.isMap())
+                  bindMapProperty(property, (ClassInfo) childType, childName, (ModelGroupBinding) childTypeBinding.getParticle().getTerm());
+                                 
+               elementTypeBinding.pushInterceptor(childName, interceptor);
+               if (trace)
+                  log.trace("Added interceptor " + childName + " for type=" + property.getBeanInfo().getName()
+                        + " property=" + property.getName() + " interceptor=" + interceptor + " " + childType.getName());
+            }
+         }
+
+         defaultNamespace = overridenDefaultNamespace;
+         return;
+      }
+
+      XBValueAdapter valueAdapter = null;
+      XmlJavaTypeAdapter xmlTypeAdapter = property.getUnderlyingAnnotation(XmlJavaTypeAdapter.class);
+      if (xmlTypeAdapter != null)
+         valueAdapter = new XBValueAdapter(xmlTypeAdapter.value(), propertyType.getTypeInfoFactory());
+
+      JBossXmlPreserveWhitespace preserveSpace = property.getUnderlyingAnnotation(JBossXmlPreserveWhitespace.class);
+
       for (int i = 0; i < elements.length; ++i)
       {
          XmlElement element = elements[i];
@@ -1471,7 +1621,6 @@
             log.trace("Processing " + element + " for type=" + property.getBeanInfo().getName() + " property=" + property.getName());
 
          // Determine the parameters
-         String overrideNamespace = null;
          String overrideName = null;
          boolean nillable = false;
          boolean required = false;
@@ -1480,7 +1629,8 @@
 
          if (element != null)
          {
-            overrideNamespace = element.namespace();
+            if(prefixNs == null || !xmlNsPrefix.applyToComponentQName())
+               overrideNamespace = element.namespace();
             overrideName = element.name();
             nillable = element.nillable();
             required = element.required();
@@ -1489,27 +1639,6 @@
                localPropertyType = propertyType.getTypeInfoFactory().getTypeInfo(elementType);
          }
 
-         // for now support just one JBossXmlNsPrefix
-         String prefixNs = null;
-         JBossXmlNsPrefix xmlNsPrefix = property.getUnderlyingAnnotation(JBossXmlNsPrefix.class);
-         String overridenDefaultNamespace = defaultNamespace;
-         try
-         {
-         if (xmlNsPrefix != null)
-         {
-            prefixNs = schemaBinding.getNamespace(xmlNsPrefix.prefix());
-            if (prefixNs == null)
-            {
-               if (xmlNsPrefix.schemaTargetIfNotMapped())
-                  prefixNs = defaultNamespace;
-               else
-                  throw new IllegalStateException("Prefix '" + xmlNsPrefix.prefix() + "' is not mapped to any namespace!");
-            }
-            
-            if(xmlNsPrefix.applyToComponentQName())
-               overrideNamespace = prefixNs;
-         }
-
          // Determine the name
          QName propertyQName = generateXmlName(property.getName(), elementForm, overrideNamespace, overrideName);
 
@@ -1517,273 +1646,132 @@
             defaultNamespace = prefixNs;
 
          // Create the element
-         JBossXmlGroup jbossXmlGroup = null;
-         if (!propertyType.isPrimitive())
-            jbossXmlGroup = ((ClassInfo) propertyType).getUnderlyingAnnotation(JBossXmlGroup.class);
-         if (element == null && jbossXmlGroup != null)
+         RepeatableParticleHandler repeatableHandler = null;
+         if (valueAdapter != null)
          {
-            if (trace)
-               log.trace("Processing group for property " + property.getName() + " in "
-                     + property.getBeanInfo().getName() + " " + jbossXmlGroup);
+            localPropertyType = valueAdapter.getAdaptedTypeInfo();
+            if(localPropertyType.isCollection())
+               repeatableHandler = CollectionRepeatableParticleHandler.INSTANCE;
+         }
 
-            JBossXmlChild[] children = jbossXmlGroup.value();
-            if (children != null && children.length > 0)
-            {
-               TypeBinding elementTypeBinding = new TypeBinding();
-               JBossXmlGroupText groupText = ((ClassInfo) propertyType).getUnderlyingAnnotation(JBossXmlGroupText.class);
-               if (groupText != null && groupText.wrapper() != Object.class)
-               {
-                  BeanInfo wrapperInfo = JBossXBBuilder.configuration.getBeanInfo(groupText.wrapper());
-                  TypeBinding wrapperTypeBinding = resolveTypeBinding(wrapperInfo.getClassInfo());
+         ModelGroupBinding targetGroup = localModel;
+         boolean isCol = false;
+         boolean isMap = false;
 
-                  ParticleHandler particleHandler = wrapperTypeBinding.getHandler();
-                  if (particleHandler instanceof BeanHandler == false)
-                     throw new IllegalStateException("Cannot wrap " + wrapperInfo.getName() + " not a bean type " + particleHandler);
-                  BeanHandler beanHandler = (BeanHandler) particleHandler;
-                  WrapperBeanAdapterFactory wrapperFactory = new WrapperBeanAdapterFactory(beanHandler.getBeanAdapterFactory(), propertyType.getType());
-                  BeanHandler wrapperHandler = new BeanHandler(wrapperInfo.getName(), wrapperFactory);
+         AbstractPropertyHandler propertyHandler = null;
 
-                  // Steal the attributes
-                  Collection<AttributeBinding> otherAttributes = wrapperTypeBinding.getAttributes();
-                  if (otherAttributes != null)
-                  {
-                     for (AttributeBinding other : otherAttributes)
-                     {
-                        elementTypeBinding.addAttribute(other);
-                        wrapperHandler.getAttributesHandler().addAttribute(other);
-                     }
-                  }
-                  elementTypeBinding.setHandler(wrapperHandler);
-                  elementTypeBinding.setSimpleType(wrapperTypeBinding.getSimpleType());
+         // a collection may be bound as a value of a complex type
+         // and this is checked with the XmlType annotation
+         if (propertyType.isCollection() && ((ClassInfo) propertyType).getUnderlyingAnnotation(XmlType.class) == null)
+         {
+            isCol = true;
+            if(propertyHandler == null)
+               propertyHandler = new CollectionPropertyHandler(property, propertyType);
+            // here we get the comp type based on the non-overriden property type...
+            // which feels like a weak point
+            TypeInfo typeArg = ((ClassInfo)property.getType()).getComponentType();
+            if (typeArg != null)
+            {
+               JBossXmlChild xmlChild = ((ClassInfo) propertyType).getUnderlyingAnnotation(JBossXmlChild.class);
+               if (xmlChild == null && localPropertyType.equals(propertyType))
+               {  // the localPropertyType was not overridden previously so use the collection parameter type
+                  localPropertyType = typeArg;
                }
-               else
-               {
-                  elementTypeBinding.setHandler(BuilderParticleHandler.parentGroup(localModel));
-               }
-               elementTypeBinding.setSchemaBinding(schemaBinding);
-               ElementBinding elementBinding = createElementBinding(localPropertyType, elementTypeBinding, propertyQName, false);
-
-               // Bind it to the model
-               ParticleBinding particle = new ParticleBinding(elementBinding, 1, 1, false);
-               if (required == false)
-                  particle.setMinOccurs(0);
-               localModel.addParticle(particle);
-
-               // Setup the child model
-               ChoiceBinding childModel = new ChoiceBinding(schemaBinding);
-               childModel.setHandler(BuilderParticleHandler.setParentDelegate(elementTypeBinding.getHandler()));
-               ParticleBinding particleBinding = new ParticleBinding(childModel);
-               particleBinding.setMinOccurs(0);
-               particleBinding.setMaxOccurs(1);
-               elementTypeBinding.setParticle(particleBinding);
-
-               for (JBossXmlChild child : children)
-               {
-                  QName childName = generateXmlName(child.name(), elementForm, child.namespace(), child.name());
-                  TypeInfo childType = JBossXBBuilder.configuration.getTypeInfo(child.type());
-
-                  TypeBinding childTypeBinding = resolveTypeBinding(childType);
-                  ElementBinding childBinding = createElementBinding(childType, childTypeBinding, childName, false);
-                  childBinding.setNillable(nillable);
-
-                  // Bind it to the model
-                  particle = new ParticleBinding(childBinding, child.minOccurs(), child.maxOccurs(), child.unbounded());
-                  particle.setMinOccurs(0);
-                  childModel.addParticle(particle);
-
-                  if(childType.isMap())
-                     bindMapProperty(property, (ClassInfo) childType, childName, (ModelGroupBinding) childTypeBinding.getParticle().getTerm());
-                                    
-                  DefaultElementInterceptor interceptor = new PropertyInterceptor(property, propertyType);
-                  elementTypeBinding.pushInterceptor(childName, interceptor);
-                  if (trace)
-                     log.trace("Added interceptor " + childName + " for type=" + property.getBeanInfo().getName()
-                           + " property=" + property.getName() + " interceptor=" + interceptor + " " + childType.getName());
-
-                  beanAdapterFactory.addProperty(propertyQName, new PropertyHandler(property, propertyType));
-
-                  JBossXmlGroupWildcard groupWildcard = ((ClassInfo) propertyType)
-                        .getUnderlyingAnnotation(JBossXmlGroupWildcard.class);
-
-                  if (groupWildcard != null)
-                  {
-                     ChildWildcardHandler groupWildcardHandler;
-                     if (groupWildcard.wrapper() != Object.class)
-                     {
-                        BeanInfo wrapperInfo = JBossXBBuilder.configuration.getBeanInfo(groupWildcard.wrapper());
-                        groupWildcardHandler = new ChildWildcardHandler(property, wrapperInfo, groupWildcard.property());
-                     }
-                     else
-                        groupWildcardHandler = new ChildWildcardHandler(property);
-
-                     WildcardBinding wildcard = new WildcardBinding(schemaBinding);
-                     if (groupWildcard.lax())
-                        wildcard.setProcessContents((short) 3); // Lax
-                     else
-                        wildcard.setProcessContents((short) 1); // Strict
-
-                     particleBinding = new ParticleBinding(wildcard);
-                     particleBinding.setMinOccurs(0);
-                     particleBinding.setMaxOccurs(1);
-                     childModel.addParticle(particleBinding);
-
-                     elementTypeBinding.getWildcard().setWildcardHandler(groupWildcardHandler);
-                  }
-               }
             }
          }
-         else
+         // TODO this shouldn't be here (because localPropertyType should specify an item?)
+         // this is to support the Descriptions.class -> DescriptionsImpl.class
+         else if (localPropertyType.isCollection()
+               && ((ClassInfo) localPropertyType).getUnderlyingAnnotation(XmlType.class) == null)
          {
-            RepeatableParticleHandler repeatableHandler = null;
-            XBValueAdapter valueAdapter = null;
-            XmlJavaTypeAdapter xmlTypeAdapter = property.getUnderlyingAnnotation(XmlJavaTypeAdapter.class);
-            if (xmlTypeAdapter != null)
+            if(propertyHandler == null)
             {
-               valueAdapter = new XBValueAdapter(xmlTypeAdapter.value(), propertyType.getTypeInfoFactory());
-               localPropertyType = valueAdapter.getAdaptedTypeInfo();
-               if(localPropertyType.isCollection())
-                  repeatableHandler = CollectionRepeatableParticleHandler.INSTANCE;
-            }
-
-            ModelGroupBinding targetGroup = localModel;
-            boolean isCol = false;
-            boolean isMap = false;
-            AbstractPropertyHandler propertyHandler = null;
-
-            // a collection may be bound as a value of a complex type
-            // and this is checked with the XmlType annotation
-            if (propertyType.isCollection() && ((ClassInfo) propertyType).getUnderlyingAnnotation(XmlType.class) == null)
-            {
-               isCol = true;
-               propertyHandler = new CollectionPropertyHandler(property, propertyType);
-               // here we get the comp type based on the non-overriden property type...
-               // which feels like a weak point
-               TypeInfo typeArg = ((ClassInfo)property.getType()).getComponentType();
-               if (typeArg != null)
-               {
-                  JBossXmlChild xmlChild = ((ClassInfo) propertyType).getUnderlyingAnnotation(JBossXmlChild.class);
-                  if (xmlChild == null && localPropertyType.equals(propertyType))
-                  {  // the localPropertyType was not overriden previously so use the collection parameter type
-                     localPropertyType = typeArg;
-                  }
-               }
-            }
-            // TODO this shouldn't be here (because localPropertyType should specify an item?)
-            // this is to support the Descriptions.class -> DescriptionsImpl.class
-            else if (localPropertyType.isCollection()
-                  && ((ClassInfo) localPropertyType).getUnderlyingAnnotation(XmlType.class) == null)
-            {
                if (valueAdapter != null)
                   propertyHandler = new PropertyHandler(property, localPropertyType);
                else
                   propertyHandler = new CollectionPropertyHandler(property, localPropertyType);
-               isCol = true;
-               localPropertyType = ((ClassInfo)localPropertyType).getComponentType();               
             }
-            else if (localPropertyType.isMap())
+            isCol = true;
+            localPropertyType = ((ClassInfo)localPropertyType).getComponentType();               
+         }
+         else if (localPropertyType.isMap())
+         {
+            ElementBinding wrapperElement = null;
+            if(elements.length > 1)
             {
-               TypeBinding wrapperType = null;
-               if(elements.length > 1)
-               {
-                  wrapperType = resolveTypeBinding(localPropertyType);
-                  ElementBinding elementBinding = createElementBinding(localPropertyType, wrapperType, propertyQName, false);
-                  elementBinding.setNillable(nillable);
-                  elementBinding.setValueAdapter(valueAdapter);
+               TypeBinding wrapperType = resolveTypeBinding(localPropertyType);
+               wrapperElement = createElementBinding(localPropertyType, wrapperType, propertyQName, false);
+               wrapperElement.setNillable(nillable);
+               wrapperElement.setValueAdapter(valueAdapter);
+               // Bind it to the model
+               ParticleBinding particle = new ParticleBinding(wrapperElement, 0, 1, false);
+               if (required == false)
+                  particle.setMinOccurs(0);
+               targetGroup.addParticle(particle);
+               targetGroup = (ModelGroupBinding) wrapperType.getParticle().getTerm();
+            }
 
-                  // Bind it to the model
-                  ParticleBinding particle = new ParticleBinding(elementBinding, 0, 1, false);
-                  if (required == false)
-                     particle.setMinOccurs(0);
-
-                  targetGroup.addParticle(particle);
-                  targetGroup = (ModelGroupBinding) wrapperType.getParticle().getTerm();
-               }
-
-               QName boundQName = bindMapProperty(property, (ClassInfo) localPropertyType, propertyQName, targetGroup);
-               if(boundQName != null)
+            TermBinding entryTerm = bindMapProperty(property, (ClassInfo) localPropertyType, propertyQName, targetGroup);
+            if(entryTerm != null)
+            {
+               QName entryQName = entryTerm.getQName();
+               if(entryQName == null)
+                  entryQName = propertyQName;
+               if(wrapperElement != null)
                {
-                  if(wrapperType != null)
+                  BeanAdapterFactory wrapperBeanFactory = ((BeanHandler)wrapperElement.getType().getHandler()).getBeanAdapterFactory();
+                  Map<QName, AbstractPropertyHandler> properties = wrapperBeanFactory.getProperties();
+                  if(properties.containsKey(entryQName) == false)
                   {
-                     BeanAdapterFactory wrapperBeanFactory = ((BeanHandler)wrapperType.getHandler()).getBeanAdapterFactory();
-                     Map<QName, AbstractPropertyHandler> properties = wrapperBeanFactory.getProperties();
-                     if(properties.containsKey(boundQName) == false)
-                     {
-                        propertyHandler = new MapPropertyHandler(JBossXBBuilder.configuration, property, localPropertyType, true);
-                        wrapperBeanFactory.addProperty(boundQName, propertyHandler);
-                     }
+                     MapPropertyHandler mapHandler = new MapPropertyHandler(JBossXBBuilder.configuration, property, localPropertyType, true);
+                     wrapperBeanFactory.addProperty(entryQName, mapHandler);
+                  }
+                  if(propertyHandler == null)
                      propertyHandler = new PropertyHandler(property, localPropertyType);
-                  }
-                  else
-                  {
-                     propertyQName = boundQName;
+                  wrapperElement.setHandler(new SetParentOverrideHandler(wrapperElement.getHandler(), propertyHandler));
+               }
+               else
+               {
+                  propertyQName = entryQName;
+                  if(propertyHandler == null)
                      propertyHandler = new MapPropertyHandler(JBossXBBuilder.configuration, property, localPropertyType, false);
-                  }
-                  isMap = true;
                }
-               else
-                  propertyHandler = new PropertyHandler(property, localPropertyType);
+               // overriding setParent doesn't make sense for a map
+               // entryTerm.setHandler(new SetParentOverrideHandler(entryTerm.getHandler(), propertyHandler));
+               isMap = true;
             }
-            else if(elements.length > 1 && propertyType.isArray())
+            else if(propertyHandler == null)
+               propertyHandler = new PropertyHandler(property, localPropertyType);
+         }
+         else if(elements.length > 1 && propertyType.isArray())
+         {
+            if(propertyHandler == null)
                propertyHandler = new PropertyHandler(property, propertyType);
-            else
-               propertyHandler = new PropertyHandler(property, localPropertyType);
+         }
+         else if(propertyHandler == null)
+            propertyHandler = new PropertyHandler(property, localPropertyType);
 
-            ParticleBinding particle;
-            if(Element.class.getName().equals(propertyType.getName()))
+         ElementBinding elementBinding = null;
+         ParticleBinding particle;
+         if(Element.class.getName().equals(propertyType.getName()))
+         {
+            if(!wildcardProperty)
             {
-               if(!wildcardProperty)
-               {
-                  WildcardBinding wildcard = new WildcardBinding(schemaBinding);
-                  wildcard.setProcessContents((short) 2);
-                  wildcard.setUnresolvedElementHandler(DOMHandler.INSTANCE);
-                  wildcard.setUnresolvedCharactersHandler(DOMHandler.INSTANCE);
+               WildcardBinding wildcard = new WildcardBinding(schemaBinding);
+               wildcard.setProcessContents((short) 2);
+               wildcard.setUnresolvedElementHandler(DOMHandler.INSTANCE);
+               wildcard.setUnresolvedCharactersHandler(DOMHandler.INSTANCE);
 
-                  SequenceBinding seq = new SequenceBinding(schemaBinding);
-                  seq.addParticle(new ParticleBinding(wildcard, 0, 1, false));
+               SequenceBinding seq = new SequenceBinding(schemaBinding);
+               seq.addParticle(new ParticleBinding(wildcard, 0, 1, false));
 
-                  TypeBinding elementTypeBinding = new TypeBinding();
-                  elementTypeBinding.setHandler(new NonXmlAnyElementDOMElementPropertyHandler(property, propertyType));
-                  elementTypeBinding.setParticle(new ParticleBinding(seq, 0, 1, true));
+               TypeBinding elementTypeBinding = new TypeBinding();
+               elementTypeBinding.setHandler(new NonXmlAnyElementDOMElementPropertyHandler(property, propertyType));
+               elementTypeBinding.setParticle(new ParticleBinding(seq, 0, 1, true));
 
-                  ElementBinding elementBinding = createElementBinding(localPropertyType, elementTypeBinding, propertyQName, false);
-                  elementBinding.setNillable(nillable);
-                  elementBinding.setValueAdapter(valueAdapter);
-
-                  // Bind it to the model
-                  particle = new ParticleBinding(elementBinding, 1, 1, isCol);
-                  if (required == false)
-                     particle.setMinOccurs(0);
-
-                  targetGroup.addParticle(particle);
-               }
-            }
-            else if (!isMap)
-            {
-               TypeBinding elementType = resolveTypeBinding(localPropertyType);
-
-               if (propertyXmlModelGroup != null)
-                  bindModelGroup(propertyXmlModelGroup, property, null, null, elementType, (ModelGroupBinding) elementType.getParticle().getTerm());
-
-               ElementBinding elementBinding = createElementBinding(localPropertyType, elementType, propertyQName, false);
+               elementBinding = createElementBinding(localPropertyType, elementTypeBinding, propertyQName, false);
                elementBinding.setNillable(nillable);
                elementBinding.setValueAdapter(valueAdapter);
-               if(repeatableHandler != null)
-               {
-                  elementBinding.setRepeatableHandler(repeatableHandler);
-               }
-               else if(elements.length == 1 && propertyType.isArray() && xmlWrapper == null)
-               {
-                  isCol = true;
-                  elementBinding.setRepeatableHandler(new ArrayWrapperRepeatableParticleHandler(beanAdapterFactory));
-               }
-               
-               JBossXmlPreserveWhitespace preserveSpace = property.getUnderlyingAnnotation(JBossXmlPreserveWhitespace.class);
-               if (preserveSpace != null)
-               {
-                  elementBinding.setNormalizeSpace(preserveSpace.preserve() ? false : true);
-                  if (trace)
-                     log.trace("@JBossXmlPreserveWhitespace.preserve=" + preserveSpace.preserve() + " for " + elementBinding.getQName());
-               }
 
                // Bind it to the model
                particle = new ParticleBinding(elementBinding, 1, 1, isCol);
@@ -1792,17 +1780,52 @@
 
                targetGroup.addParticle(particle);
             }
-
-            beanAdapterFactory.addProperty(propertyQName, propertyHandler);
-            if (trace)
-               log.trace("Added property " + propertyQName + " for type=" + property.getBeanInfo().getName() + " property="
-                     + property.getName() + " handler=" + propertyHandler);
          }
-         }
-         finally
+         else if (!isMap)
          {
-            defaultNamespace = overridenDefaultNamespace;
+            TypeBinding elementType = resolveTypeBinding(localPropertyType);
+
+            if (propertyXmlModelGroup != null)
+               bindModelGroup(propertyXmlModelGroup, property, null, null, elementType, (ModelGroupBinding) elementType.getParticle().getTerm());
+
+            elementBinding = createElementBinding(localPropertyType, elementType, propertyQName, false);
+            elementBinding.setNillable(nillable);
+            elementBinding.setValueAdapter(valueAdapter);
+            if(repeatableHandler != null)
+            {
+               elementBinding.setRepeatableHandler(repeatableHandler);
+            }
+            else if(elements.length == 1 && propertyType.isArray() && xmlWrapper == null)
+            {
+               isCol = true;
+               elementBinding.setRepeatableHandler(new ArrayWrapperRepeatableParticleHandler(propertyHandler));
+            }
+               
+            if (preserveSpace != null)
+            {
+               elementBinding.setNormalizeSpace(preserveSpace.preserve() ? false : true);
+               if (trace)
+                  log.trace("@JBossXmlPreserveWhitespace.preserve=" + preserveSpace.preserve() + " for " + elementBinding.getQName());
+            }
+
+            // Bind it to the model
+            particle = new ParticleBinding(elementBinding, 1, 1, isCol);
+            if (required == false)
+               particle.setMinOccurs(0);
+
+            targetGroup.addParticle(particle);
          }
+
+         if(elementBinding != null)
+            elementBinding.setHandler(new SetParentOverrideHandler(elementBinding.getType().getHandler(), propertyHandler));
+
+         beanAdapterFactory.addProperty(propertyQName, propertyHandler);
+
+         if (trace)
+            log.trace("Added property " + propertyQName + " for type=" + property.getBeanInfo().getName() + " property="
+                  + property.getName() + " handler=" + propertyHandler);
+
+         defaultNamespace = overridenDefaultNamespace;
       }
    }
 
@@ -1876,6 +1899,8 @@
             group = createModelGroup(annotation.kind(), groupType, memberOrder.length > 1 && propOrderMissing, annotation.propOrder());
             group.setSkip(false);
             group.setHandler(propHandler);
+            // can't do it with global components
+            //group.setHandler(new SetParentOverrideHandler(propHandler, propertyHandler));
 
             // bind model group members
             for (String memberPropName : memberOrder)
@@ -1896,7 +1921,7 @@
          }
 
          if(property.getType().isArray())
-            group.setRepeatableHandler(new ArrayWrapperRepeatableParticleHandler(beanAdapterFactory));
+            group.setRepeatableHandler(new ArrayWrapperRepeatableParticleHandler(propertyHandler));
       }
       
       parentGroup.addParticle(new ParticleBinding(group, 0, 1, repeatable));
@@ -1930,6 +1955,9 @@
                memberElement.setNillable(true);
                ParticleBinding memberParticle = new ParticleBinding(memberElement, 0, 1, isCol);
                group.addParticle(memberParticle);
+               // can't do it with global components (the group one)
+               //if(propertyHandler != null)
+               //   memberElement.setHandler(new SetParentOverrideHandler(memberElement.getHandler(), propertyHandler));
             }
             
             if(propertyHandler != null)
@@ -1962,7 +1990,7 @@
       return group;
    }
       
-   private SequenceBinding bindXmlElementWrapper(BeanAdapterFactory beanAdapterFactory, TypeInfo propertyType, ModelGroupBinding parentModel, XmlElementWrapper annotation, QName wrapperQName)
+   private SequenceBinding bindXmlElementWrapper(AbstractPropertyHandler setParentProperty, TypeInfo propertyType, ModelGroupBinding parentModel, XmlElementWrapper annotation, QName wrapperQName)
    {
       TypeBinding wrapperType = new TypeBinding();
       SequenceBinding seq = new SequenceBinding(schemaBinding);
@@ -1978,7 +2006,7 @@
       parentModel.addParticle(particle);
 
       if(propertyType.isArray())
-         wrapperElement.setRepeatableHandler(new ArrayWrapperRepeatableParticleHandler(beanAdapterFactory));
+         wrapperElement.setRepeatableHandler(new ArrayWrapperRepeatableParticleHandler(setParentProperty));
       
       return seq;
    }
@@ -2149,10 +2177,8 @@
       }
    }
    
-   private QName bindMapProperty(PropertyInfo prop, ClassInfo propType, QName propertyQName, ModelGroupBinding targetGroup)
+   private TermBinding bindMapProperty(PropertyInfo prop, ClassInfo propType, QName propertyQName, ModelGroupBinding targetGroup)
    {
-      QName boundQName = null;
-      
       JBossXmlMapEntry entryElement = null;
       if(prop != null)
          entryElement = prop.getUnderlyingAnnotation(JBossXmlMapEntry.class);
@@ -2171,6 +2197,7 @@
       if(keyAttribute == null)
          keyAttribute = propType.getUnderlyingAnnotation(JBossXmlMapKeyAttribute.class);
       
+      TermBinding entryTerm = null;
       if(keyElement != null || keyAttribute != null)
       {
          // further assuming the map is bound
@@ -2213,6 +2240,7 @@
 
             entryTypeInfo = JBossXBBuilder.configuration.getTypeInfo(DefaultMapEntry.class);                     
             ElementBinding entryElementBinding = createElementBinding(entryTypeInfo, entryType, entryName, false);
+            entryTerm = entryElementBinding;
             ParticleBinding entryParticle = new ParticleBinding(entryElementBinding, 0, -1, true);
             targetGroup.addParticle(entryParticle);
                
@@ -2259,6 +2287,7 @@
                ParticleBinding keyValueParticle = new ParticleBinding(keyValueSequence, 0, -1, true);
                targetGroup.addParticle(keyValueParticle);
                keyValueSequence.setHandler(entryHandler);
+               entryTerm = keyValueSequence;
             }
             else
             {
@@ -2276,6 +2305,7 @@
             keyValueSequence.addParticle(particle);
             PropertyHandler keyHandler = new PropertyHandler(entryInfo.getProperty("key"), keyType);
             entryAdapterFactory.addProperty(keyElementBinding.getQName(), keyHandler);
+            keyElementBinding.setHandler(new SetParentOverrideHandler(keyTypeBinding.getHandler(), keyHandler));
          }
          
          if(valueElement != null)
@@ -2289,10 +2319,8 @@
             keyValueSequence.addParticle(particle);
             PropertyHandler valueHandler = new PropertyHandler(entryInfo.getProperty("value"), valueType);
             entryAdapterFactory.addProperty(valueElementBinding.getQName(), valueHandler);
+            valueElementBinding.setHandler(new SetParentOverrideHandler(valueTypeBinding.getHandler(), valueHandler));
          }
-
-         // TODO: need to verify correct binding before proceeding
-         boundQName = propertyQName;
       }
       else if(entryElement != null && !JBossXmlMapEntry.DEFAULT.class.equals(entryElement.type()))
       {
@@ -2308,9 +2336,10 @@
          ElementBinding entryElementBinding = createElementBinding(entryTypeInfo, propertyQName.getLocalPart(), false);
          ParticleBinding entryParticle = new ParticleBinding(entryElementBinding, 0, -1, true);
          targetGroup.addParticle(entryParticle);
-         boundQName = propertyQName;
+         entryTerm = entryElementBinding;
       }
-      return boundQName;
+      
+      return entryTerm;
    }
    
    private static interface ModelGroupFactory

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-02-09 14:28:24 UTC (rev 4017)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/ArrayWrapperRepeatableParticleHandler.java	2010-02-09 17:47:35 UTC (rev 4018)
@@ -32,7 +32,6 @@
 import org.jboss.xb.binding.sunday.unmarshalling.ParticleHandler;
 import org.jboss.xb.binding.sunday.unmarshalling.RepeatableParticleHandler;
 import org.jboss.xb.binding.sunday.unmarshalling.ValueAdapter;
-import org.jboss.xb.spi.BeanAdapterFactory;
 
 /**
  * A ArrayWrapperRepeatableParticleHandler.
@@ -48,24 +47,21 @@
    /** Whether trace is enabled */
    protected boolean trace = log.isTraceEnabled();
 
-
-   private final BeanAdapterFactory beanAdapterFactory;
+   private final AbstractPropertyHandler setParentProperty;
    
-   public ArrayWrapperRepeatableParticleHandler(BeanAdapterFactory beanAdapterFactory)
+   public ArrayWrapperRepeatableParticleHandler(AbstractPropertyHandler setParentProperty)
    {
-      if(beanAdapterFactory == null)
-         throw new IllegalArgumentException("beanAdapterFactory is null");
-      this.beanAdapterFactory = beanAdapterFactory;
+      if(setParentProperty == null)
+         throw new IllegalArgumentException("setParentProperty is null");
+      this.setParentProperty = setParentProperty;
    }
    
    public void addTermValue(Object particleValue, Object termValue, QName elementName, ParticleBinding particle,
          ParticleBinding parentParticle, ParticleHandler handler)
    {
-      ValueAdapter valueAdapter = particle.getTerm().getValueAdapter();
-      if(valueAdapter != null)
-         termValue = valueAdapter.cast(termValue, null);
-      //ArrayWrapper aw = (ArrayWrapper) particleValue;
-      //aw.add(termValue);
+//      ValueAdapter valueAdapter = particle.getTerm().getValueAdapter();
+//      if(valueAdapter != null)
+//         termValue = valueAdapter.cast(termValue, null);
       ((List<Object>)particleValue).add(termValue);
       
       if(trace)
@@ -77,32 +73,13 @@
    {
       if(trace)
          log.trace("endRepeatableParticle " + elementName);
+      
+      ValueAdapter valueAdapter = particle.getTerm().getValueAdapter();
+      if(valueAdapter != null)
+         o = valueAdapter.cast(o, null);
 
-      QName qName = particle.getTerm().getQName();
-      if(qName == null)
-         qName = elementName;
-      AbstractPropertyHandler propertyHandler = beanAdapterFactory.getPropertyHandler(qName);
-      if (propertyHandler == null)
-      {
-         AbstractPropertyHandler wildcardHandler = beanAdapterFactory.getWildcardHandler();
-         if (wildcardHandler != null && o != null)
-         {
-            o = toArray((List<Object>) o, (ArrayInfo) wildcardHandler.getPropertyType());
-            wildcardHandler.doHandle(parent, o, qName);
-            return;
-         }
-
-         if (particle.getTerm().getSchema().isStrictSchema())
-            throw new RuntimeException("QName " + qName + " unknown property parent=" + BuilderUtil.toDebugString(parent) + " child=" + BuilderUtil.toDebugString(o) + " available=" + beanAdapterFactory.getAvailable());
-
-         if (trace)
-            log.trace("QName " + qName + " unknown property parent=" + BuilderUtil.toDebugString(parent) + " child=" + BuilderUtil.toDebugString(o));
-         
-         return;
-      }
-
-      o = toArray((List<Object>) o, (ArrayInfo) propertyHandler.getPropertyType());
-      propertyHandler.doHandle(parent, o, qName);
+      o = toArray((List<Object>) o, (ArrayInfo) setParentProperty.getPropertyType());
+      setParentProperty.doHandle(parent, o, elementName);
    }
 
    public Object startRepeatableParticle(Object parent, QName startName, ParticleBinding particle)

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-02-09 14:28:24 UTC (rev 4017)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/BeanHandler.java	2010-02-09 17:47:35 UTC (rev 4018)
@@ -120,17 +120,12 @@
          log.trace("setParent " + qName + " parent=" + BuilderUtil.toDebugString(parent) + " child=" + BuilderUtil.toDebugString(o));
 
       TermBinding term = particle.getTerm();
-      ValueAdapter valueAdapter = null;
-      if(term.isElement()) // elements appear much more often than model groups
+      if(term.isModelGroup())
       {
-         valueAdapter = ((ElementBinding)term).getValueAdapter();
-      }
-      else if(term.isModelGroup())
-      {
          QName modelGroupName = ((ModelGroupBinding)term).getQName();
          if(modelGroupName != null)
             qName = modelGroupName;
-      } 
+      }
 
       BeanAdapter beanAdapter = (BeanAdapter) parent;
       AbstractPropertyHandler propertyHandler = beanAdapter.getPropertyHandler(qName);
@@ -143,9 +138,6 @@
          return;
       }
 
-      // TODO looks like value adapter should be used earlier in the stack
-      if(valueAdapter != null)
-         o = valueAdapter.cast(o, null/*propertyHandler.getPropertyType().getType()*/);
       propertyHandler.doHandle(beanAdapter, o, qName);
    }
 
@@ -155,7 +147,15 @@
          log.trace("endElement " + qName + " o=" + BuilderUtil.toDebugString(o));
 
       BeanAdapter beanAdapter = (BeanAdapter) o;
-      return beanAdapter.getValue();
+      Object value = beanAdapter.getValue();
+
+      if(!particle.isRepeatable())
+      {
+         ValueAdapter valueAdapter = particle.getTerm().getValueAdapter();
+         if (valueAdapter != null)
+            value = valueAdapter.cast(value, null);
+      }
+      return value;
    }
 
    public RegisteredAttributesHandler getAttributesHandler()

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-02-09 14:28:24 UTC (rev 4017)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/BuilderParticleHandler.java	2010-02-09 17:47:35 UTC (rev 4018)
@@ -26,11 +26,12 @@
 
 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;
 import org.jboss.xb.binding.sunday.unmarshalling.ParticleHandler;
 import org.jboss.xb.binding.sunday.unmarshalling.TermBinding;
+import org.jboss.xb.binding.sunday.unmarshalling.ValueAdapter;
+import org.jboss.xb.spi.BeanAdapter;
 import org.xml.sax.Attributes;
 
 /**
@@ -55,15 +56,8 @@
       {
          ParticleHandler particleHandler = null;
          TermBinding parentTerm = parentParticle.getTerm();
-         if(parentTerm.isElement())
-         {
-            particleHandler = ((ElementBinding)parentTerm).getType().getHandler();            
-         }
-         else if (!parentTerm.isSkip() && parentTerm.isModelGroup())
-         {
-            particleHandler = ((ModelGroupBinding)parentTerm).getHandler();
-         }
-         
+         if(!parentTerm.isSkip())
+            particleHandler = parentTerm.getHandler();         
          if(particleHandler != null)
             particleHandler.setParent(parent, o, elementName, particle, parentParticle);
       }
@@ -71,6 +65,9 @@
 
    public Object endParticle(Object o, QName elementName, ParticleBinding particle)
    {
+      ValueAdapter valueAdapter = particle.getTerm().getValueAdapter();
+      if(valueAdapter != null)
+         o = valueAdapter.cast(o, null);
       return o;
    }
    



More information about the jboss-svn-commits mailing list