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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sat Feb 7 02:42:05 EST 2009


Author: alex.loubyansky at jboss.com
Date: 2009-02-07 02:42:05 -0500 (Sat, 07 Feb 2009)
New Revision: 2972

Added:
   jbossxb/trunk/src/test/java/org/jboss/test/xml/elementorder/
   jbossxb/trunk/src/test/java/org/jboss/test/xml/elementorder/support/
   jbossxb/trunk/src/test/java/org/jboss/test/xml/elementorder/support/ABSequence.java
   jbossxb/trunk/src/test/java/org/jboss/test/xml/elementorder/support/CDSequence.java
   jbossxb/trunk/src/test/java/org/jboss/test/xml/elementorder/support/ElementOrderRoot.java
   jbossxb/trunk/src/test/java/org/jboss/test/xml/elementorder/test/
   jbossxb/trunk/src/test/java/org/jboss/test/xml/elementorder/test/ElementOrderUnitTestCase.java
   jbossxb/trunk/src/test/resources/org/jboss/test/xml/elementorder/
   jbossxb/trunk/src/test/resources/org/jboss/test/xml/elementorder/test/
   jbossxb/trunk/src/test/resources/org/jboss/test/xml/elementorder/test/ElementOrder_testValidABSequence.xml
   jbossxb/trunk/src/test/resources/org/jboss/test/xml/elementorder/test/ElementOrder_testValidOneTwoOrder.xml
   jbossxb/trunk/src/test/resources/org/jboss/test/xml/elementorder/test/ElementOrder_testValidRepeatedCD.xml
   jbossxb/trunk/src/test/resources/org/jboss/test/xml/elementorder/test/ElementOrder_testWrongABSequence.xml
   jbossxb/trunk/src/test/resources/org/jboss/test/xml/elementorder/test/ElementOrder_testWrongOneTwoOrder.xml
   jbossxb/trunk/src/test/resources/org/jboss/test/xml/elementorder/test/ElementOrder_testWrongRepeatedCD.xml
Modified:
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SundayContentHandler.java
   jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java
   jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/jbossxmlpreservewhitespace/support/CustomizedSchemaRoot.java
   jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/jbossxmlpreservewhitespace/support/DefaultsRoot.java
   jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/type/xmltype/adapter/Adapted.java
Log:
JBXB-174, JBXB-175

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SundayContentHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SundayContentHandler.java	2009-02-05 15:30:13 UTC (rev 2971)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SundayContentHandler.java	2009-02-07 07:42:05 UTC (rev 2972)
@@ -451,11 +451,28 @@
                List<ModelGroupBinding.Cursor> newCursors = cursor.startElement(startName, atts);
                if(newCursors.isEmpty())
                {
-                  if(!item.ended) // this is for choices
+                  if(!item.ended)
+                     endParticle(item, startName, 1);
+                                    
+                  StackItem poped = pop();
+                  
+                  if(!poped.particle.isRepeatable() && stack.peek().cursor == null)
                   {
-                     endParticle(item, startName, 1);
+                     // normally it should be an error
+                     // but there is an issue with wildcard binding: it is never bound as repeatable (but should be sometimes)
+                     // so, this hack will give another iteration over the whole parent type and make it seem like it's repeatable
+                     TermBinding popedTerm = poped.particle.getTerm();
+                     if(popedTerm instanceof SequenceBinding &&
+                           ((ModelGroupBinding)popedTerm).getParticles().size() == 1 &&
+                           ((ModelGroupBinding)popedTerm).getParticles().iterator().next().getTerm().isWildcard())
+                     {
+                        // hack
+                     }
+                     else
+                        throw new JBossXBRuntimeException("Element " + startName +
+                           " cannot appear in this position (possibly child elements of " +
+                           ((ElementBinding)stack.peek().particle.getTerm()).getQName() + " are in the wrong order)");
                   }
-                  pop();
                }
                else
                {

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java	2009-02-05 15:30:13 UTC (rev 2971)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java	2009-02-07 07:42:05 UTC (rev 2972)
@@ -880,12 +880,14 @@
                   property.getUnderlyingAnnotation(XmlElementRefs.class) == null)
                   ignoreXmlAnyElement = true;
             }
-            else if (!seenXmlAnyElement && wildcardProperty == null && property.getType().getName().equals(org.w3c.dom.Element.class.getName()))
+            else if (property.getType().getName().equals(org.w3c.dom.Element.class.getName()) && !seenXmlAnyElement && wildcardProperty == null)
             {
                if (trace)
-                  log.trace("Using type=" + beanInfo.getName() + " property=" + property.getName() + " as the base wildcard");
+                  log.trace("Using type=" + beanInfo.getName() + " property=" + property.getName()
+                        + " as the base wildcard");
                if (wildcardProperty != null)
-                  throw new RuntimeException("@XmlAnyElement seen on two properties: " + property.getName() + " and " + wildcardProperty.getName());
+                  throw new RuntimeException("@XmlAnyElement seen on two properties: " + property.getName() + " and "
+                        + wildcardProperty.getName());
                wildcardProperty = property;
             }
 
@@ -1059,6 +1061,7 @@
          typeParticle.setMinOccurs(0);
          typeParticle.setMaxOccursUnbounded(true);
          TypeInfo memberBaseType = typeInfo.getComponentType();
+
          JBossXmlModelGroup xmlModelGroup = ((ClassInfo) memberBaseType)
                .getUnderlyingAnnotation(JBossXmlModelGroup.class);
          if (xmlModelGroup != null && xmlModelGroup.particles().length > 0)
@@ -1230,7 +1233,7 @@
 
          // Dom element?
          if (Element.class.getName().equals(type.getName()))
-         {
+         {System.out.println("wildcard prop " + wildcardProperty.getName());
             wildcard.setUnresolvedElementHandler(DOMHandler.INSTANCE);
             wildcard.setUnresolvedCharactersHandler(DOMHandler.INSTANCE);
          }
@@ -1324,7 +1327,7 @@
          {
             // this is the type that should be analyzed
             propertyType = propertyType.getTypeInfoFactory().getTypeInfo(xmlCol.type());
-         }
+         }         
       }
       // Is this property bound to a model group
       else if (!property.getType().isPrimitive())
@@ -1341,192 +1344,18 @@
          JBossXmlModelGroup xmlModelGroup = propClassInfo.getUnderlyingAnnotation(JBossXmlModelGroup.class);
          if (xmlModelGroup != null && xmlModelGroup.particles().length == 0)
          {
-            if (trace)
-               log.trace("Property " + property.getName() + " is bound to " + xmlModelGroup.kind());
-            
-            String groupNs = defaultNamespace;
-            String overridenDefaultNamespace = defaultNamespace;
-            JBossXmlNsPrefix nsPrefix = property.getUnderlyingAnnotation(JBossXmlNsPrefix.class);
-            if (nsPrefix != null)
-            {
-               String ns = schemaBinding.getNamespace(nsPrefix.prefix());
-               if (ns == null && nsPrefix.schemaTargetIfNotMapped())
-               {
-                  throw new IllegalStateException("Prefix '" + nsPrefix.prefix()
-                        + "' is not mapped to any namespace!");
-               }
-               
-               if(nsPrefix.applyToComponentQName())
-                  groupNs = ns;
-               if(nsPrefix.applyToComponentContent())
-                  defaultNamespace = ns;
-            }
+            ModelGroupBinding group = bindModelGroupType(property, model, beanAdapterFactory, propClassInfo, xmlModelGroup);
+            model.addParticle(new ParticleBinding(group));
 
-            QName groupName = null;
-            if (!JBossXmlConstants.DEFAULT.equals(xmlModelGroup.name()))
-               groupName = new QName(groupNs, xmlModelGroup.name());
-
-            ModelGroupBinding propertyGroup = null;
-            if (groupName != null)
-               propertyGroup = schemaBinding.getGroup(groupName);
-
-            if (propertyGroup == null)
-            {
-               if (xmlModelGroup.kind().equals(JBossXmlConstants.MODEL_GROUP_SEQUENCE))
-               {
-                  propertyGroup = new SequenceBinding(schemaBinding);
-               }
-               else if (xmlModelGroup.kind().equals(JBossXmlConstants.MODEL_GROUP_CHOICE))
-               {
-                  propertyGroup = new ChoiceBinding(schemaBinding);
-               }
-               else if (xmlModelGroup.kind().equals(JBossXmlConstants.MODEL_GROUP_ALL))
-               {
-                  propertyGroup = new AllBinding(schemaBinding);
-               }
-               else
-               {
-                  throw new IllegalStateException("Unexpected JBossXmlModelGroup.kind=" + xmlModelGroup.kind());
-               }
-
-               if (groupName != null)
-               {
-                  // TODO what if it doesn't have a name? should an artificial one be created?
-                  propertyGroup.setQName(groupName);
-                  schemaBinding.addGroup(propertyGroup.getQName(), propertyGroup);
-               }
-
-               propertyGroup.setSkip(Boolean.FALSE);
-
-               // handler for the model group members
-               BeanInfo propBeanInfo = JBossXBBuilder.configuration.getBeanInfo(propClassInfo);
-               BeanAdapterFactory propBeanAdapterFactory = createAdapterFactory(DefaultBeanAdapterBuilder.class, propBeanInfo, null);
-               BeanHandler propHandler = new BeanHandler(propBeanInfo.getName(), propBeanAdapterFactory);
-               propertyGroup.setHandler(propHandler);
-
-               String[] memberOrder = xmlModelGroup.propOrder();
-               if (memberOrder.length == 0 || memberOrder[0].length() == 0)
-               {
-                  List<String> propNames = new ArrayList<String>();
-                  for (PropertyInfo prop : propBeanInfo.getProperties())
-                  {
-                     propNames.add(prop.getName());
-                  }
-                  memberOrder = propNames.toArray(new String[propNames.size()]);
-               }
-
-               if (trace)
-                  log.trace("Property order for " + xmlModelGroup.kind() + " property " + property.getName() + ": "
-                        + Arrays.asList(memberOrder));
-
-               // bind model group members
-               for (String memberPropName : memberOrder)
-               {
-                  if ("class".equals(memberPropName))
-                  {
-                     continue;
-                  }
-
-                  PropertyInfo memberProp = propBeanInfo.getProperty(memberPropName);
-                  TypeInfo memberTypeInfo = memberProp.getType();
-                  XmlElement memberXmlElement = memberProp.getUnderlyingAnnotation(XmlElement.class);
-
-                  String memberNamespace = null;
-                  String memberName = null;
-                  if (memberXmlElement != null)
-                  {
-                     if (!XmlElement.DEFAULT.class.equals(memberXmlElement.type()))
-                        memberTypeInfo = memberTypeInfo.getTypeInfoFactory().getTypeInfo(memberXmlElement.type());
-                     if (memberNamespace == null)
-                        memberNamespace = memberXmlElement.namespace();
-                     memberName = memberXmlElement.name();
-                  }
-
-                  boolean isCol = false;
-                  AbstractPropertyHandler memberPropertyHandler = null;
-                  if (memberProp.getType().isCollection())
-                  {
-                     memberPropertyHandler = new CollectionPropertyHandler(memberProp, memberProp.getType());
-                     isCol = true;
-                     // if memberXmlElement is present then the collection item type is set explicitly
-                     if (memberXmlElement == null || XmlElement.DEFAULT.class.equals(memberXmlElement.type()))
-                     {
-                        JBossXmlCollection jbossXmlCollection = memberProp
-                              .getUnderlyingAnnotation(JBossXmlCollection.class);
-                        if (jbossXmlCollection != null)
-                        {
-                           memberTypeInfo = memberTypeInfo.getTypeInfoFactory().getTypeInfo(jbossXmlCollection.type());
-                        }
-                        memberTypeInfo = ((ClassInfo) memberTypeInfo).getComponentType();
-                     }
-                  }
-                  // if it is bound with XmlElement.type to a collection
-                  else if (memberTypeInfo.isCollection())
-                  {
-                     memberPropertyHandler = new CollectionPropertyHandler(memberProp, memberTypeInfo);
-                     isCol = true;
-                     memberTypeInfo = ((ClassInfo) memberTypeInfo).getComponentType();
-                  }
-                  else
-                  {
-                     memberPropertyHandler = new PropertyHandler(memberProp, memberTypeInfo);
-                  }
-
-                  JBossXmlNsPrefix memberPrefix = memberProp.getUnderlyingAnnotation(JBossXmlNsPrefix.class);
-                  String memberOverridenDefaultNamespace = defaultNamespace;
-                  String prefixNs = null;
-                  if(memberPrefix != null)
-                  {
-                     prefixNs = schemaBinding.getNamespace(memberPrefix.prefix());
-                     if (prefixNs == null && memberPrefix.schemaTargetIfNotMapped())
-                        throw new IllegalStateException("Prefix '" + memberPrefix.prefix() + "' is not mapped to any namespace!");
-                        
-                     if(memberPrefix.applyToComponentQName())
-                        memberNamespace = prefixNs;
-                  }
-
-                  QName memberQName = generateXmlName(memberProp.getName(), elementForm, memberNamespace, memberName);
-                  propBeanAdapterFactory.addProperty(memberQName, memberPropertyHandler);
-
-                  if(prefixNs != null && memberPrefix.applyToComponentContent())
-                     defaultNamespace = prefixNs;
-                  
-                  XBValueAdapter valueAdapter = null;
-                  XmlJavaTypeAdapter xmlTypeAdapter = memberProp.getUnderlyingAnnotation(XmlJavaTypeAdapter.class);
-                  if (xmlTypeAdapter != null)
-                  {
-                     valueAdapter = new XBValueAdapter(xmlTypeAdapter.value(), memberTypeInfo.getTypeInfoFactory());
-                     memberTypeInfo = valueAdapter.getAdaptedTypeInfo();
-                  }
-
-                  TypeBinding memberTypeBinding = resolveTypeBinding(memberTypeInfo);
-                  ElementBinding memberElement = createElementBinding(memberTypeInfo, memberTypeBinding, memberQName, false);
-                  memberElement.setNillable(true);
-                  memberElement.setValueAdapter(valueAdapter);
-                  ParticleBinding memberParticle = new ParticleBinding(memberElement, 0, 1, isCol);
-                  propertyGroup.addParticle(memberParticle);
-
-                  if (trace)
-                     log.trace("added " + memberParticle + " to " + xmlModelGroup.kind() + ", property " + property.getName());
-                  
-                  defaultNamespace = memberOverridenDefaultNamespace;
-               }
-            }
-
-            defaultNamespace = overridenDefaultNamespace;
-            
-            model.addParticle(new ParticleBinding(propertyGroup));
-
             // model group value handler based on the model group name
             // TODO what if it doesn't have a name?
             AbstractPropertyHandler propertyHandler = null;
-            if (propertyType.isCollection())
+            if (propClassInfo.isCollection())
                propertyHandler = new CollectionPropertyHandler(property, propClassInfo);
             else
-            {
                propertyHandler = new PropertyHandler(property, propClassInfo);
-            }
-            beanAdapterFactory.addProperty(propertyGroup.getQName(), propertyHandler);
+            beanAdapterFactory.addProperty(group.getQName(), propertyHandler);
+
             return;
          }
       }
@@ -1767,15 +1596,28 @@
                // 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 && ((ClassInfo)typeArg).getUnderlyingAnnotation(JBossXmlModelGroup.class) == null)
-               {// it may be a model group in which case we don't want to change the type
-                  // TODO yes, this is another hack with collections
-                  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;
+               if (typeArg != null)
+               {
+                  JBossXmlModelGroup xmlModelGroup = typeArg.isPrimitive() ? null : ((ClassInfo)typeArg).getUnderlyingAnnotation(JBossXmlModelGroup.class);
+                  if(xmlModelGroup != null)
+                  {
+                     if (xmlModelGroup.particles().length == 0)
+                     {
+                        ModelGroupBinding group = bindModelGroupType(property, model, beanAdapterFactory, (ClassInfo)typeArg, xmlModelGroup);
+                        model.addParticle(new ParticleBinding(group, 0, 1, true));
+                        // TODO what if it doesn't have a name?
+                        beanAdapterFactory.addProperty(group.getQName(), propertyHandler);
+                        return;
+                     }
                   }
+                  else
+                  {
+                     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?)
@@ -1792,7 +1634,7 @@
                   propertyHandler = new CollectionPropertyHandler(property, localPropertyType);
                }
                isCol = true;
-               localPropertyType = ((ClassInfo)localPropertyType).getComponentType();
+               localPropertyType = ((ClassInfo)localPropertyType).getComponentType();               
             }
             else if (localPropertyType.isMap())
             {
@@ -1877,6 +1719,184 @@
          defaultNamespace = overridenDefaultNamespace;
       }
    }
+
+   private ModelGroupBinding bindModelGroupType(PropertyInfo property, ModelGroupBinding model,
+         BeanAdapterFactory beanAdapterFactory, ClassInfo propClassInfo, JBossXmlModelGroup xmlModelGroup)
+   {
+      if (trace)
+         log.trace("Property " + property.getName() + " is bound to " + xmlModelGroup.kind());
+
+      String groupNs = defaultNamespace;
+      String overridenDefaultNamespace = defaultNamespace;
+      JBossXmlNsPrefix nsPrefix = property.getUnderlyingAnnotation(JBossXmlNsPrefix.class);
+      if (nsPrefix != null)
+      {
+         String ns = schemaBinding.getNamespace(nsPrefix.prefix());
+         if (ns == null && nsPrefix.schemaTargetIfNotMapped())
+         {
+            throw new IllegalStateException("Prefix '" + nsPrefix.prefix() + "' is not mapped to any namespace!");
+         }
+
+         if (nsPrefix.applyToComponentQName())
+            groupNs = ns;
+         if (nsPrefix.applyToComponentContent())
+            defaultNamespace = ns;
+      }
+
+      QName groupName = null;
+      if (!JBossXmlConstants.DEFAULT.equals(xmlModelGroup.name()))
+         groupName = new QName(groupNs, xmlModelGroup.name());
+
+      ModelGroupBinding propertyGroup = null;
+      if (groupName != null)
+         propertyGroup = schemaBinding.getGroup(groupName);
+
+      if (propertyGroup == null)
+      {
+         if (xmlModelGroup.kind().equals(JBossXmlConstants.MODEL_GROUP_SEQUENCE))
+         {
+            propertyGroup = new SequenceBinding(schemaBinding);
+         }
+         else if (xmlModelGroup.kind().equals(JBossXmlConstants.MODEL_GROUP_CHOICE))
+         {
+            propertyGroup = new ChoiceBinding(schemaBinding);
+         }
+         else if (xmlModelGroup.kind().equals(JBossXmlConstants.MODEL_GROUP_ALL))
+         {
+            propertyGroup = new AllBinding(schemaBinding);
+         }
+         else
+         {
+            throw new IllegalStateException("Unexpected JBossXmlModelGroup.kind=" + xmlModelGroup.kind());
+         }
+
+         if (groupName != null)
+         {
+            // TODO what if it doesn't have a name? should an artificial one be created?
+            propertyGroup.setQName(groupName);
+            schemaBinding.addGroup(propertyGroup.getQName(), propertyGroup);
+         }
+
+         propertyGroup.setSkip(Boolean.FALSE);
+
+         // handler for the model group members
+         BeanInfo propBeanInfo = JBossXBBuilder.configuration.getBeanInfo(propClassInfo);
+         BeanAdapterFactory propBeanAdapterFactory = createAdapterFactory(DefaultBeanAdapterBuilder.class,
+               propBeanInfo, null);
+         BeanHandler propHandler = new BeanHandler(propBeanInfo.getName(), propBeanAdapterFactory);
+         propertyGroup.setHandler(propHandler);
+
+         String[] memberOrder = xmlModelGroup.propOrder();
+         if (memberOrder.length == 0 || memberOrder[0].length() == 0)
+         {
+            List<String> propNames = new ArrayList<String>();
+            for (PropertyInfo prop : propBeanInfo.getProperties())
+            {
+               propNames.add(prop.getName());
+            }
+            memberOrder = propNames.toArray(new String[propNames.size()]);
+         }
+
+         if (trace)
+            log.trace("Property order for " + xmlModelGroup.kind() + " property " + property.getName() + ": " + Arrays.asList(memberOrder));
+
+         // bind model group members
+         for (String memberPropName : memberOrder)
+         {
+            if ("class".equals(memberPropName))
+            {
+               continue;
+            }
+
+            PropertyInfo memberProp = propBeanInfo.getProperty(memberPropName);
+            TypeInfo memberTypeInfo = memberProp.getType();
+            XmlElement memberXmlElement = memberProp.getUnderlyingAnnotation(XmlElement.class);
+
+            String memberNamespace = null;
+            String memberName = null;
+            if (memberXmlElement != null)
+            {
+               if (!XmlElement.DEFAULT.class.equals(memberXmlElement.type()))
+                  memberTypeInfo = memberTypeInfo.getTypeInfoFactory().getTypeInfo(memberXmlElement.type());
+               if (memberNamespace == null)
+                  memberNamespace = memberXmlElement.namespace();
+               memberName = memberXmlElement.name();
+            }
+
+            boolean isCol = false;
+            AbstractPropertyHandler memberPropertyHandler = null;
+            if (memberProp.getType().isCollection())
+            {
+               memberPropertyHandler = new CollectionPropertyHandler(memberProp, memberProp.getType());
+               isCol = true;
+               // if memberXmlElement is present then the collection item type is set explicitly
+               if (memberXmlElement == null || XmlElement.DEFAULT.class.equals(memberXmlElement.type()))
+               {
+                  JBossXmlCollection jbossXmlCollection = memberProp.getUnderlyingAnnotation(JBossXmlCollection.class);
+                  if (jbossXmlCollection != null)
+                  {
+                     memberTypeInfo = memberTypeInfo.getTypeInfoFactory().getTypeInfo(jbossXmlCollection.type());
+                  }
+                  memberTypeInfo = ((ClassInfo) memberTypeInfo).getComponentType();
+               }
+            }
+            // if it is bound with XmlElement.type to a collection
+            else if (memberTypeInfo.isCollection())
+            {
+               memberPropertyHandler = new CollectionPropertyHandler(memberProp, memberTypeInfo);
+               isCol = true;
+               memberTypeInfo = ((ClassInfo) memberTypeInfo).getComponentType();
+            }
+            else
+            {
+               memberPropertyHandler = new PropertyHandler(memberProp, memberTypeInfo);
+            }
+
+            JBossXmlNsPrefix memberPrefix = memberProp.getUnderlyingAnnotation(JBossXmlNsPrefix.class);
+            String memberOverridenDefaultNamespace = defaultNamespace;
+            String prefixNs = null;
+            if (memberPrefix != null)
+            {
+               prefixNs = schemaBinding.getNamespace(memberPrefix.prefix());
+               if (prefixNs == null && memberPrefix.schemaTargetIfNotMapped())
+                  throw new IllegalStateException("Prefix '" + memberPrefix.prefix()
+                        + "' is not mapped to any namespace!");
+
+               if (memberPrefix.applyToComponentQName())
+                  memberNamespace = prefixNs;
+            }
+
+            QName memberQName = generateXmlName(memberProp.getName(), elementForm, memberNamespace, memberName);
+            propBeanAdapterFactory.addProperty(memberQName, memberPropertyHandler);
+
+            if (prefixNs != null && memberPrefix.applyToComponentContent())
+               defaultNamespace = prefixNs;
+
+            XBValueAdapter valueAdapter = null;
+            XmlJavaTypeAdapter xmlTypeAdapter = memberProp.getUnderlyingAnnotation(XmlJavaTypeAdapter.class);
+            if (xmlTypeAdapter != null)
+            {
+               valueAdapter = new XBValueAdapter(xmlTypeAdapter.value(), memberTypeInfo.getTypeInfoFactory());
+               memberTypeInfo = valueAdapter.getAdaptedTypeInfo();
+            }
+
+            TypeBinding memberTypeBinding = resolveTypeBinding(memberTypeInfo);
+            ElementBinding memberElement = createElementBinding(memberTypeInfo, memberTypeBinding, memberQName, false);
+            memberElement.setNillable(true);
+            memberElement.setValueAdapter(valueAdapter);
+            ParticleBinding memberParticle = new ParticleBinding(memberElement, 0, 1, isCol);
+            propertyGroup.addParticle(memberParticle);
+
+            if (trace)
+               log.trace("added " + memberParticle + " to " + xmlModelGroup.kind() + ", property " + property.getName());
+
+            defaultNamespace = memberOverridenDefaultNamespace;
+         }
+      }
+
+      defaultNamespace = overridenDefaultNamespace;
+      return propertyGroup;
+   }
    
    private SequenceBinding bindXmlElementWrapper(TypeInfo propertyType, ModelGroupBinding parentModel, boolean wrapperNillable, QName wrapperQName)
    {

Modified: jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/jbossxmlpreservewhitespace/support/CustomizedSchemaRoot.java
===================================================================
--- jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/jbossxmlpreservewhitespace/support/CustomizedSchemaRoot.java	2009-02-05 15:30:13 UTC (rev 2971)
+++ jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/jbossxmlpreservewhitespace/support/CustomizedSchemaRoot.java	2009-02-07 07:42:05 UTC (rev 2972)
@@ -23,6 +23,7 @@
 
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
 
 import org.jboss.xb.annotations.JBossXmlPreserveWhitespace;
 import org.jboss.xb.annotations.JBossXmlSchema;
@@ -35,6 +36,7 @@
  */
 @XmlRootElement(name="root")
 @JBossXmlSchema(normalizeSpace=true)
+ at XmlType(propOrder={"schemaDefaults", "preserveTrue", "preserveFalse"})
 public class CustomizedSchemaRoot
 {
    private String schemaDefaults;

Modified: jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/jbossxmlpreservewhitespace/support/DefaultsRoot.java
===================================================================
--- jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/jbossxmlpreservewhitespace/support/DefaultsRoot.java	2009-02-05 15:30:13 UTC (rev 2971)
+++ jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/jbossxmlpreservewhitespace/support/DefaultsRoot.java	2009-02-07 07:42:05 UTC (rev 2972)
@@ -23,6 +23,7 @@
 
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
 
 import org.jboss.xb.annotations.JBossXmlPreserveWhitespace;
 
@@ -33,6 +34,7 @@
  * @version $Revision: 1.1 $
  */
 @XmlRootElement(name="root")
+ at XmlType(propOrder={"schemaDefaults", "preserveTrue", "preserveFalse"})
 public class DefaultsRoot
 {
    private String schemaDefaults;

Modified: jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/type/xmltype/adapter/Adapted.java
===================================================================
--- jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/type/xmltype/adapter/Adapted.java	2009-02-05 15:30:13 UTC (rev 2971)
+++ jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/type/xmltype/adapter/Adapted.java	2009-02-07 07:42:05 UTC (rev 2972)
@@ -31,7 +31,7 @@
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
  * @version $Revision: 1.1 $
  */
- at XmlType(namespace="testNamespace", name="adapted")
+ at XmlType(namespace="testNamespace", name="adapted", propOrder={"property1", "property2"})
 @JBossXmlType(beanAdapterBuilder=TestBeanAdapterBuilder.class)
 public class Adapted
 {

Added: jbossxb/trunk/src/test/java/org/jboss/test/xml/elementorder/support/ABSequence.java
===================================================================
--- jbossxb/trunk/src/test/java/org/jboss/test/xml/elementorder/support/ABSequence.java	                        (rev 0)
+++ jbossxb/trunk/src/test/java/org/jboss/test/xml/elementorder/support/ABSequence.java	2009-02-07 07:42:05 UTC (rev 2972)
@@ -0,0 +1,62 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.test.xml.elementorder.support;
+
+import javax.xml.bind.annotation.XmlElement;
+
+import org.jboss.xb.annotations.JBossXmlConstants;
+import org.jboss.xb.annotations.JBossXmlModelGroup;
+
+/**
+ * A ABSequence.
+ * 
+ * @author <a href="alex at jboss.com">Alexey Loubyansky</a>
+ * @version $Revision: 1.1 $
+ */
+ at JBossXmlModelGroup(name="abSequence", kind=JBossXmlConstants.MODEL_GROUP_SEQUENCE, propOrder={"a", "b"})
+public class ABSequence
+{
+   private String a;
+   private String b;
+   
+   @XmlElement(required=true)
+   public String getA()
+   {
+      return a;
+   }
+   
+   public void setA(String a)
+   {
+      this.a = a;
+   }
+
+   @XmlElement(required=true)
+   public String getB()
+   {
+      return b;
+   }
+
+   public void setB(String b)
+   {
+      this.b = b;
+   }
+}

Added: jbossxb/trunk/src/test/java/org/jboss/test/xml/elementorder/support/CDSequence.java
===================================================================
--- jbossxb/trunk/src/test/java/org/jboss/test/xml/elementorder/support/CDSequence.java	                        (rev 0)
+++ jbossxb/trunk/src/test/java/org/jboss/test/xml/elementorder/support/CDSequence.java	2009-02-07 07:42:05 UTC (rev 2972)
@@ -0,0 +1,62 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.test.xml.elementorder.support;
+
+import javax.xml.bind.annotation.XmlElement;
+
+import org.jboss.xb.annotations.JBossXmlConstants;
+import org.jboss.xb.annotations.JBossXmlModelGroup;
+
+/**
+ * A ABSequence.
+ * 
+ * @author <a href="alex at jboss.com">Alexey Loubyansky</a>
+ * @version $Revision: 1.1 $
+ */
+ at JBossXmlModelGroup(name="cdSequence", kind=JBossXmlConstants.MODEL_GROUP_SEQUENCE, propOrder={"c", "d"})
+public class CDSequence
+{
+   private String c;
+   private String d;
+   
+   @XmlElement(required=true)
+   public String getC()
+   {
+      return c;
+   }
+   
+   public void setC(String c)
+   {
+      this.c = c;
+   }
+
+   @XmlElement(required=true)
+   public String getD()
+   {
+      return d;
+   }
+
+   public void setD(String d)
+   {
+      this.d = d;
+   }
+}

Added: jbossxb/trunk/src/test/java/org/jboss/test/xml/elementorder/support/ElementOrderRoot.java
===================================================================
--- jbossxb/trunk/src/test/java/org/jboss/test/xml/elementorder/support/ElementOrderRoot.java	                        (rev 0)
+++ jbossxb/trunk/src/test/java/org/jboss/test/xml/elementorder/support/ElementOrderRoot.java	2009-02-07 07:42:05 UTC (rev 2972)
@@ -0,0 +1,83 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.test.xml.elementorder.support;
+
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+/**
+ * A ElementOrderRoot.
+ * 
+ * @author <a href="alex at jboss.com">Alexey Loubyansky</a>
+ * @version $Revision: 1.1 $
+ */
+ at XmlRootElement(name="root")
+ at XmlType(propOrder={"first", "second", "ABSequence", "repeatedCD"})
+public class ElementOrderRoot
+{
+   private String first;
+   private String second;
+   private ABSequence abSequence;
+   private List<CDSequence> repeatedCD;
+   
+   public String getFrist()
+   {
+      return first;
+   }
+
+   public void setFirst(String first)
+   {
+      this.first = first;
+   }
+   
+   public String getSecond()
+   {
+      return second;
+   }
+   
+   public void setSecond(String second)
+   {
+      this.second = second;
+   }
+   
+   public ABSequence getABSequence()
+   {
+      return abSequence;
+   }
+   
+   public void setABSequence(ABSequence abSequence)
+   {
+      this.abSequence = abSequence;
+   }
+   
+   public List<CDSequence> getRepeatedCD()
+   {
+      return repeatedCD;
+   }
+   
+   public void setRepeatedCD(List<CDSequence> repeatedCD)
+   {
+      this.repeatedCD = repeatedCD;
+   }
+}

Added: jbossxb/trunk/src/test/java/org/jboss/test/xml/elementorder/test/ElementOrderUnitTestCase.java
===================================================================
--- jbossxb/trunk/src/test/java/org/jboss/test/xml/elementorder/test/ElementOrderUnitTestCase.java	                        (rev 0)
+++ jbossxb/trunk/src/test/java/org/jboss/test/xml/elementorder/test/ElementOrderUnitTestCase.java	2009-02-07 07:42:05 UTC (rev 2972)
@@ -0,0 +1,121 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.test.xml.elementorder.test;
+
+import java.util.List;
+
+import org.jboss.test.xb.builder.AbstractBuilderTest;
+import org.jboss.test.xml.elementorder.support.ABSequence;
+import org.jboss.test.xml.elementorder.support.CDSequence;
+import org.jboss.test.xml.elementorder.support.ElementOrderRoot;
+import org.jboss.xb.binding.JBossXBException;
+import org.jboss.xb.binding.JBossXBRuntimeException;
+
+/**
+ * A ElementOrderUnitTestCase.
+ * 
+ * @author <a href="alex at jboss.com">Alexey Loubyansky</a>
+ * @version $Revision: 1.1 $
+ */
+public class ElementOrderUnitTestCase extends AbstractBuilderTest
+{
+   public ElementOrderUnitTestCase(String name)
+   {
+      super(name);
+   }
+
+   public void testValidOneTwoOrder() throws Exception
+   {
+      ElementOrderRoot o = (ElementOrderRoot) unmarshalObject(ElementOrderRoot.class);
+      assertEquals("one", o.getFrist());
+      assertEquals("two", o.getSecond());
+   }
+
+   public void testWrongOneTwoOrder() throws Exception
+   {
+      try
+      {
+         unmarshalObject(ElementOrderRoot.class);
+         fail("Element first cannot appear in this position (possibly child elements of root are in the wrong order)");
+      }
+      catch(JBossXBException e)
+      {
+         JBossXBRuntimeException re = (JBossXBRuntimeException) e.getCause();
+         assertEquals("Element first cannot appear in this position (possibly child elements of root are in the wrong order)", re.getMessage());
+      }
+   }
+   
+   public void testValidABSequence() throws Exception
+   {
+      ElementOrderRoot o = (ElementOrderRoot) unmarshalObject(ElementOrderRoot.class);
+      ABSequence ab = o.getABSequence();
+      assertNotNull(ab);
+      assertEquals("a", ab.getA());
+      assertEquals("b", ab.getB());
+   }
+
+   public void testWrongABSequence() throws Exception
+   {
+      try
+      {
+         unmarshalObject(ElementOrderRoot.class);
+         fail("Element a cannot appear in this position (possibly child elements of root are in the wrong order)");
+      }
+      catch(JBossXBException e)
+      {
+         JBossXBRuntimeException re = (JBossXBRuntimeException) e.getCause();
+         assertEquals("Element a cannot appear in this position (possibly child elements of root are in the wrong order)", re.getMessage());
+      }
+   }
+   
+   public void testValidRepeatedCD() throws Exception
+   {
+      ElementOrderRoot o = (ElementOrderRoot) unmarshalObject(ElementOrderRoot.class);
+      List<CDSequence> repeatedCD = o.getRepeatedCD();
+      assertNotNull(repeatedCD);
+      assertEquals(2, repeatedCD.size());
+      CDSequence cd = repeatedCD.get(0);
+      assertNotNull(cd);
+      assertEquals("c1", cd.getC());
+      assertEquals("d1", cd.getD());
+      cd = repeatedCD.get(1);
+      assertNotNull(cd);
+      assertEquals("c2", cd.getC());
+      assertEquals("d2", cd.getD());
+   }
+
+   // TODO this is a known failure
+   // the impl doesn't check XmlElement.required=true and since the sequence is repeatable, the test passes
+   public void testWrongRepeatedCD() throws Exception
+   {
+      try
+      {
+         unmarshalObject(ElementOrderRoot.class);
+         fail("Element d cannot appear in this position (possibly child elements of root are in the wrong order)");
+      }
+      catch(JBossXBException e)
+      {
+         JBossXBRuntimeException re = (JBossXBRuntimeException) e.getCause();
+         assertEquals("Element d cannot appear in this position (possibly child elements of root are in the wrong order)", re.getMessage());
+      }
+   }
+}

Added: jbossxb/trunk/src/test/resources/org/jboss/test/xml/elementorder/test/ElementOrder_testValidABSequence.xml
===================================================================
--- jbossxb/trunk/src/test/resources/org/jboss/test/xml/elementorder/test/ElementOrder_testValidABSequence.xml	                        (rev 0)
+++ jbossxb/trunk/src/test/resources/org/jboss/test/xml/elementorder/test/ElementOrder_testValidABSequence.xml	2009-02-07 07:42:05 UTC (rev 2972)
@@ -0,0 +1,4 @@
+<root>
+   <a>a</a>
+   <b>b</b>
+</root>

Added: jbossxb/trunk/src/test/resources/org/jboss/test/xml/elementorder/test/ElementOrder_testValidOneTwoOrder.xml
===================================================================
--- jbossxb/trunk/src/test/resources/org/jboss/test/xml/elementorder/test/ElementOrder_testValidOneTwoOrder.xml	                        (rev 0)
+++ jbossxb/trunk/src/test/resources/org/jboss/test/xml/elementorder/test/ElementOrder_testValidOneTwoOrder.xml	2009-02-07 07:42:05 UTC (rev 2972)
@@ -0,0 +1,4 @@
+<root>
+   <first>one</first>
+   <second>two</second>
+</root>

Added: jbossxb/trunk/src/test/resources/org/jboss/test/xml/elementorder/test/ElementOrder_testValidRepeatedCD.xml
===================================================================
--- jbossxb/trunk/src/test/resources/org/jboss/test/xml/elementorder/test/ElementOrder_testValidRepeatedCD.xml	                        (rev 0)
+++ jbossxb/trunk/src/test/resources/org/jboss/test/xml/elementorder/test/ElementOrder_testValidRepeatedCD.xml	2009-02-07 07:42:05 UTC (rev 2972)
@@ -0,0 +1,6 @@
+<root>
+   <c>c1</c>
+   <d>d1</d>
+   <c>c2</c>
+   <d>d2</d>
+</root>

Added: jbossxb/trunk/src/test/resources/org/jboss/test/xml/elementorder/test/ElementOrder_testWrongABSequence.xml
===================================================================
--- jbossxb/trunk/src/test/resources/org/jboss/test/xml/elementorder/test/ElementOrder_testWrongABSequence.xml	                        (rev 0)
+++ jbossxb/trunk/src/test/resources/org/jboss/test/xml/elementorder/test/ElementOrder_testWrongABSequence.xml	2009-02-07 07:42:05 UTC (rev 2972)
@@ -0,0 +1,4 @@
+<root>
+   <b>b</b>
+   <a>a</a>
+</root>

Added: jbossxb/trunk/src/test/resources/org/jboss/test/xml/elementorder/test/ElementOrder_testWrongOneTwoOrder.xml
===================================================================
--- jbossxb/trunk/src/test/resources/org/jboss/test/xml/elementorder/test/ElementOrder_testWrongOneTwoOrder.xml	                        (rev 0)
+++ jbossxb/trunk/src/test/resources/org/jboss/test/xml/elementorder/test/ElementOrder_testWrongOneTwoOrder.xml	2009-02-07 07:42:05 UTC (rev 2972)
@@ -0,0 +1,4 @@
+<root>
+   <second>two</second>
+   <first>one</first>
+</root>

Added: jbossxb/trunk/src/test/resources/org/jboss/test/xml/elementorder/test/ElementOrder_testWrongRepeatedCD.xml
===================================================================
--- jbossxb/trunk/src/test/resources/org/jboss/test/xml/elementorder/test/ElementOrder_testWrongRepeatedCD.xml	                        (rev 0)
+++ jbossxb/trunk/src/test/resources/org/jboss/test/xml/elementorder/test/ElementOrder_testWrongRepeatedCD.xml	2009-02-07 07:42:05 UTC (rev 2972)
@@ -0,0 +1,4 @@
+<root>
+   <d>d1</d>
+   <c>c1</c>
+</root>




More information about the jboss-svn-commits mailing list