[jboss-svn-commits] JBoss Common SVN: r2662 - jbossxb/trunk/src/main/java/org/jboss/xb/builder.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Oct 30 11:52:11 EDT 2007


Author: alex.loubyansky at jboss.com
Date: 2007-10-30 11:52:11 -0400 (Tue, 30 Oct 2007)
New Revision: 2662

Modified:
   jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java
Log:
bind global groups only once

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java	2007-10-29 15:50:56 UTC (rev 2661)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java	2007-10-30 15:52:11 UTC (rev 2662)
@@ -979,36 +979,55 @@
 
             // it's choice by default based on the idea that the
             // type parameter is a base class for items
-            ModelGroupBinding choiceGroup = new ChoiceBinding(schemaBinding);
-            choiceGroup.setHandler(BuilderParticleHandler.INSTANCE);
-            ParticleBinding choiceParticle = new ParticleBinding(choiceGroup, 0, 1, true);
-            model.addParticle(choiceParticle);
-
-            for (JBossXmlModelGroup.Particle member : xmlModelGroup.particles())
+            ModelGroupBinding choiceGroup = null;
+            QName choiceName = null;
+            if(!JBossXmlConstants.DEFAULT.equals(xmlModelGroup.name()))
             {
-               XmlElement element = member.element();
-               QName memberQName = generateXmlName(element.name(), XmlNsForm.QUALIFIED, element.namespace(), null);
-               TypeInfo memberTypeInfo = typeInfo.getTypeInfoFactory().getTypeInfo(member.type());
-
-               boolean isCol = false;
-               if (memberTypeInfo.isCollection())
+               choiceName = new QName(defaultNamespace, xmlModelGroup.name());
+               choiceGroup = schemaBinding.getGroup(choiceName);
+            }
+            
+            if(choiceGroup == null)
+            {
+               choiceGroup = new ChoiceBinding(schemaBinding);
+               choiceGroup.setHandler(BuilderParticleHandler.INSTANCE);
+               if (choiceName != null)
                {
-                  // TODO here we should properly identify the type of the item (based on a testcase)
-                  //memberTypeInfo = pti.getActualTypeArguments()[0];
-                  memberTypeInfo = findComponentType((ClassInfo) memberTypeInfo);
-                  isCol = true;
+                  choiceGroup.setQName(choiceName);
+                  schemaBinding.addGroup(choiceGroup.getQName(), choiceGroup);
                }
 
-               TypeBinding memberTypeBinding = resolveTypeBinding(memberTypeInfo);
-               ElementBinding memberElement = createElementBinding(memberTypeInfo, memberTypeBinding, memberQName,
-                     false);
-               memberElement.setNillable(true);
-               ParticleBinding memberParticle = new ParticleBinding(memberElement, 0, 1, isCol);
-               choiceGroup.addParticle(memberParticle);
+               ParticleBinding choiceParticle = new ParticleBinding(choiceGroup, 0, 1, true);
+               model.addParticle(choiceParticle);
 
-               typeBinding.pushInterceptor(memberQName, ChildCollectionInterceptor.SINGLETON);
+               for (JBossXmlModelGroup.Particle member : xmlModelGroup.particles())
+               {
+                  XmlElement element = member.element();
+                  QName memberQName = generateXmlName(element.name(), XmlNsForm.QUALIFIED, element.namespace(), null);
+                  TypeInfo memberTypeInfo = typeInfo.getTypeInfoFactory().getTypeInfo(member.type());
+
+                  boolean isCol = false;
+                  if (memberTypeInfo.isCollection())
+                  {
+                     memberTypeInfo = findComponentType((ClassInfo) memberTypeInfo);
+                     isCol = true;
+                  }
+
+                  TypeBinding memberTypeBinding = resolveTypeBinding(memberTypeInfo);
+                  ElementBinding memberElement = createElementBinding(memberTypeInfo, memberTypeBinding, memberQName, false);
+                  memberElement.setNillable(true);
+                  ParticleBinding memberParticle = new ParticleBinding(memberElement, 0, 1, isCol);
+                  choiceGroup.addParticle(memberParticle);
+
+                  typeBinding.pushInterceptor(memberQName, ChildCollectionInterceptor.SINGLETON);
+               }
             }
-
+            else
+            {
+               ParticleBinding choiceParticle = new ParticleBinding(choiceGroup, 0, 1, true);
+               model.addParticle(choiceParticle);
+            }
+            
             if (trace)
                log.trace("choices for " + typeBinding.getQName() + ": " + choiceGroup.getParticles());
          }
@@ -1083,166 +1102,184 @@
                if (trace)
                   log.trace("Property " + property.getName() + " is bound to " + xmlModelGroup.kind());
                
-               ModelGroupBinding propertyGroup;
-               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());
-               }
+               ModelGroupBinding propertyGroup = null;
+               QName groupName = null;
+               if (!JBossXmlConstants.DEFAULT.equals(xmlModelGroup.name()))
+                  groupName = new QName(xmlModelGroup.name());
                
-               if (!JBossXmlConstants.DEFAULT.equals(xmlModelGroup.name()))
+               if(groupName != null)
+                  propertyGroup = schemaBinding.getGroup(groupName);
+               
+               if (propertyGroup == null)
                {
-                  // TODO what if it doesn't have a name? should an artificial one be created?
-                  propertyGroup.setQName(new QName(name));
-               }
+                  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());
+                  }
 
-               propertyGroup.setSkip(Boolean.FALSE);
-               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())
-                  propertyHandler = new CollectionPropertyHandler(property, propClassInfo);
-               else
-               {
-                  propertyHandler = new PropertyHandler(property, propClassInfo);
-               }
-               beanAdapterFactory.addProperty(propertyGroup.getQName(), propertyHandler);
-
-               // handler for the model group members
-               BeanInfo propBeanInfo = JBossXBBuilder.configuration.getBeanInfo(propClassInfo);
-               BeanAdapterFactory propBeanAdapterFactory = null;
-               try
-               {
-                  BeanInfo propBeanAdapterBuilderInfo = JBossXBBuilder.configuration.getBeanInfo(beanAdapterBuilderClass);
-                  BeanAdapterBuilder propBeanAdapterBuilder = (BeanAdapterBuilder) propBeanAdapterBuilderInfo.newInstance();
-                  propBeanAdapterFactory = propBeanAdapterBuilder.newFactory(propBeanInfo, factory);
-               }
-               catch (Throwable t)
-               {
-                  throw new RuntimeException("Error creating BeanAdapterFactory for " + beanAdapterBuilderClass.getName(), t);
-               }
-               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())
+                  if (groupName != null)
                   {
-                     propNames.add(prop.getName());
+                     // TODO what if it doesn't have a name? should an artificial one be created?
+                     propertyGroup.setQName(groupName);
+                     schemaBinding.addGroup(propertyGroup.getQName(), propertyGroup);
                   }
-                  memberOrder = propNames.toArray(new String[propNames.size()]);
-               }
 
-               if (trace)
-                  log.trace("Property order for " + xmlModelGroup.kind() + " property " + property.getName() + ": " + Arrays.asList(memberOrder));
+                  propertyGroup.setSkip(Boolean.FALSE);
 
-               // bind model group members
-               for (String memberPropName : memberOrder)
-               {
-                  if ("class".equals(memberPropName))
+                  // handler for the model group members
+                  BeanInfo propBeanInfo = JBossXBBuilder.configuration.getBeanInfo(propClassInfo);
+                  BeanAdapterFactory propBeanAdapterFactory = null;
+                  try
                   {
-                     continue;
+                     BeanInfo propBeanAdapterBuilderInfo = JBossXBBuilder.configuration.getBeanInfo(beanAdapterBuilderClass);
+                     BeanAdapterBuilder propBeanAdapterBuilder = (BeanAdapterBuilder) propBeanAdapterBuilderInfo.newInstance();
+                     propBeanAdapterFactory = propBeanAdapterBuilder.newFactory(propBeanInfo, factory);
                   }
+                  catch (Throwable t)
+                  {
+                     throw new RuntimeException("Error creating BeanAdapterFactory for "
+                           + beanAdapterBuilderClass.getName(), t);
+                  }
+                  BeanHandler propHandler = new BeanHandler(propBeanInfo.getName(), propBeanAdapterFactory);
+                  propertyGroup.setHandler(propHandler);
 
-                  PropertyInfo memberProp = propBeanInfo.getProperty(memberPropName);
-                  TypeInfo memberTypeInfo = memberProp.getType();
-                  String memberNamespace = null;
-
-                  JBossXmlNsPrefix nsPrefix = memberProp.getUnderlyingAnnotation(JBossXmlNsPrefix.class);
-                  if (nsPrefix != null)
+                  String[] memberOrder = xmlModelGroup.propOrder();
+                  if (memberOrder.length == 0 || memberOrder[0].length() == 0)
                   {
-                     memberNamespace = schemaBinding.getNamespace(nsPrefix.prefix());
-                     if (memberNamespace == null && nsPrefix.schemaTargetIfNotMapped())
+                     List<String> propNames = new ArrayList<String>();
+                     for (PropertyInfo prop : propBeanInfo.getProperties())
                      {
-                        throw new IllegalStateException("Prefix '" + nsPrefix.prefix() + "' is not mapped to any namespace!");
+                        propNames.add(prop.getName());
                      }
+                     memberOrder = propNames.toArray(new String[propNames.size()]);
                   }
 
-                  String memberName = null;
-                  XmlElement memberXmlElement = memberProp.getUnderlyingAnnotation(XmlElement.class);
-                  if (memberXmlElement != null)
+                  if (trace)
+                     log.trace("Property order for " + xmlModelGroup.kind() + " property " + property.getName() + ": "
+                           + Arrays.asList(memberOrder));
+
+                  // bind model group members
+                  for (String memberPropName : memberOrder)
                   {
-                     if (!XmlElement.DEFAULT.class.equals(memberXmlElement.type()))
+                     if ("class".equals(memberPropName))
                      {
-                        memberTypeInfo = memberTypeInfo.getTypeInfoFactory().getTypeInfo(memberXmlElement.type());
+                        continue;
                      }
 
-                     if (memberNamespace == null)
-                        memberNamespace = memberXmlElement.namespace();
-                     memberName = memberXmlElement.name();
-                  }
+                     PropertyInfo memberProp = propBeanInfo.getProperty(memberPropName);
+                     TypeInfo memberTypeInfo = memberProp.getType();
+                     String memberNamespace = null;
 
-                  if (memberNamespace == null)
-                  {
-                     memberNamespace = defaultNamespace;
-                  }
+                     JBossXmlNsPrefix nsPrefix = memberProp.getUnderlyingAnnotation(JBossXmlNsPrefix.class);
+                     if (nsPrefix != null)
+                     {
+                        memberNamespace = schemaBinding.getNamespace(nsPrefix.prefix());
+                        if (memberNamespace == null && nsPrefix.schemaTargetIfNotMapped())
+                        {
+                           throw new IllegalStateException("Prefix '" + nsPrefix.prefix()
+                                 + "' is not mapped to any namespace!");
+                        }
+                     }
 
-                  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()))
+                     String memberName = null;
+                     XmlElement memberXmlElement = memberProp.getUnderlyingAnnotation(XmlElement.class);
+                     if (memberXmlElement != null)
                      {
-                        JBossXmlCollection jbossXmlCollection = memberProp.getUnderlyingAnnotation(JBossXmlCollection.class);
-                        if(jbossXmlCollection != null)
+                        if (!XmlElement.DEFAULT.class.equals(memberXmlElement.type()))
                         {
-                           memberTypeInfo = memberTypeInfo.getTypeInfoFactory().getTypeInfo(jbossXmlCollection.type());
+                           memberTypeInfo = memberTypeInfo.getTypeInfoFactory().getTypeInfo(memberXmlElement.type());
                         }
+
+                        if (memberNamespace == null)
+                           memberNamespace = memberXmlElement.namespace();
+                        memberName = memberXmlElement.name();
+                     }
+
+                     if (memberNamespace == null)
+                     {
+                        memberNamespace = defaultNamespace;
+                     }
+
+                     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 = findComponentType((ClassInfo) memberTypeInfo);
+                        }
+                     }
+                     // if it is bound with XmlElement.type to a collection
+                     else if (memberTypeInfo.isCollection())
+                     {
+                        memberPropertyHandler = new CollectionPropertyHandler(memberProp, memberTypeInfo);
+                        isCol = true;
                         memberTypeInfo = findComponentType((ClassInfo) memberTypeInfo);
                      }
-                  }
-                  // if it is bound with XmlElement.type to a collection
-                  else if (memberTypeInfo.isCollection())
-                  {
-                     memberPropertyHandler = new CollectionPropertyHandler(memberProp, memberTypeInfo);
-                     isCol = true;
-                     memberTypeInfo = findComponentType((ClassInfo) memberTypeInfo);
-                  }
-                  else
-                  {
-                     memberPropertyHandler = new PropertyHandler(memberProp, memberTypeInfo);
-                  }
+                     else
+                     {
+                        memberPropertyHandler = new PropertyHandler(memberProp, memberTypeInfo);
+                     }
 
-                  QName memberQName = generateXmlName(memberProp.getName(), elementForm, memberNamespace, memberName);
-                  propBeanAdapterFactory.addProperty(memberQName, memberPropertyHandler);
+                     QName memberQName = generateXmlName(memberProp.getName(), elementForm, memberNamespace, memberName);
+                     propBeanAdapterFactory.addProperty(memberQName, memberPropertyHandler);
 
-                  XBValueAdapter valueAdapter = null;
-                  XmlJavaTypeAdapter xmlTypeAdapter = memberProp.getUnderlyingAnnotation(XmlJavaTypeAdapter.class);
-                  if (xmlTypeAdapter != null)
-                  {
-                     valueAdapter = new XBValueAdapter(xmlTypeAdapter.value(), memberTypeInfo.getTypeInfoFactory());
-                     memberTypeInfo = valueAdapter.getAdaptedTypeInfo();
-                  }
+                     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);
+                     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());
+                     if (trace)
+                        log.trace("added " + memberParticle + " to " + xmlModelGroup.kind() + ", property " + property.getName());
+                  }
                }
+               
+               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())
+                  propertyHandler = new CollectionPropertyHandler(property, propClassInfo);
+               else
+               {
+                  propertyHandler = new PropertyHandler(property, propClassInfo);
+               }
+               beanAdapterFactory.addProperty(propertyGroup.getQName(), propertyHandler);
+
                pop();
                continue;
             }




More information about the jboss-svn-commits mailing list