Package org.jboss.xb.binding.sunday.unmarshalling

Examples of org.jboss.xb.binding.sunday.unmarshalling.ModelGroupBinding$Cursor


   public void testSharedElementGroupForwardsAndBackwards() throws Exception
   {
      SchemaBinding schema = bind("SharedElement.xsd");
      ElementBinding element1 = schema.getElement(new QName(NS, "element1"));
      assertNotNull(element1);
      ModelGroupBinding group = schema.getGroup(new QName(NS, "globalGroup"));
      assertNotNull(group);
      ElementBinding element3 = schema.getElement(new QName(NS, "element3"));
      assertNotNull(element3);
     
      Collection<ParticleBinding> particles = group.getParticles();
      assertNotNull(particles);
      assertEquals(2, particles.size());
      Iterator<ParticleBinding> iterator = particles.iterator();
      ParticleBinding particle = iterator.next();
      TermBinding term = particle.getTerm();
View Full Code Here


         else
            builder.append(maxOccurs);
         builder.append("\"");
      }
      builder.append(">");
      ModelGroupBinding model = (ModelGroupBinding) particle.getTerm();
      Collection<ParticleBinding> particles = model.getParticles();
      boolean newLine = true;
      if (particles != null)
      {
         for (ParticleBinding component : particles)
            printParticle(builder, pad+3, component);
View Full Code Here

         log.trace("PropertyOrder " + Arrays.asList(propertyOrder) + " for type=" + beanInfo.getName());

      // Determine the model
      // TODO simple types/content when no properties other than @XmlValue and @XmlAttribute
      typeBinding.setSimple(false);
      ModelGroupBinding model = null;
      if (allBinding)
      {
         if (trace)
            log.trace("AllBinding for type=" + beanInfo.getName());
         model = new AllBinding(schemaBinding);
      }
      else
      {
         if (trace)
            log.trace("SequenceBinding for type=" + beanInfo.getName());
         model = new SequenceBinding(schemaBinding);
      }
      model.setHandler(BuilderParticleHandler.INSTANCE);
      ParticleBinding typeParticle = new ParticleBinding(model);
      typeParticle.setMinOccurs(1);
      typeParticle.setMaxOccurs(1);
      typeBinding.setParticle(typeParticle);

      if (typeInfo.isCollection())
      {
         TypeInfo memberBaseType = findComponentType(typeInfo);
         JBossXmlModelGroup xmlModelGroup = ((ClassInfo) memberBaseType)
               .getUnderlyingAnnotation(JBossXmlModelGroup.class);
         if (xmlModelGroup != null && xmlModelGroup.particles().length > 0)
         {
            if (trace)
               log.trace("Item base type for " + typeInfo.getName() + " is " + memberBaseType.getName()
                     + " and bound to repeatable choice");

            // it's choice by default based on the idea that the
            // type parameter is a base class for items
            ModelGroupBinding choiceGroup = null;
            QName choiceName = null;
            if(!JBossXmlConstants.DEFAULT.equals(xmlModelGroup.name()))
            {
               choiceName = new QName(defaultNamespace, xmlModelGroup.name());
               choiceGroup = schemaBinding.getGroup(choiceName);
            }
           
            if(choiceGroup == null)
            {
               choiceGroup = new ChoiceBinding(schemaBinding);
               choiceGroup.setHandler(BuilderParticleHandler.INSTANCE);
               if (choiceName != null)
               {
                  choiceGroup.setQName(choiceName);
                  schemaBinding.addGroup(choiceGroup.getQName(), choiceGroup);
               }

               ParticleBinding choiceParticle = new ParticleBinding(choiceGroup, 0, 1, true);
               model.addParticle(choiceParticle);

               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());
         }
      }

      // Determine the wildcard handler
      AbstractPropertyHandler wildcardHandler = null;
      if (wildcardProperty != null)
      {
         TypeInfo wildcardType = wildcardProperty.getType();
         if (wildcardType.isCollection())
            wildcardHandler = new CollectionPropertyWildcardHandler(wildcardProperty, wildcardType);
         else
            wildcardHandler = new PropertyWildcardHandler(wildcardProperty, wildcardType);
      }

      // Look through the properties
      for (String name : propertyOrder)
      {
         // Setup the error stack
         push(typeInfo, name);
         // Get the property
         PropertyInfo property = beanInfo.getProperty(name);
         bindProperty(property, typeBinding, model, beanAdapterFactory, propertyOrder);
         pop();
      }

      // Bind the children
      JBossXmlChild[] children = null;
      JBossXmlChildren jbossXmlChildren = typeInfo.getUnderlyingAnnotation(JBossXmlChildren.class);
      if (jbossXmlChildren != null)
         children = jbossXmlChildren.value();
      else
      {
         JBossXmlChild jbossXmlChild = typeInfo.getUnderlyingAnnotation(JBossXmlChild.class);
         if (jbossXmlChild != null)
            children = new JBossXmlChild[] { jbossXmlChild };
      }

      if (children != null && children.length > 0)
      {
         for (JBossXmlChild child : children)
         {
            QName qName = generateXmlName(child.name(), elementForm, child.namespace(), child.name());
            TypeInfo childType = JBossXBBuilder.configuration.getTypeInfo(child.type());

            TypeBinding elementTypeBinding = resolveTypeBinding(childType);
            ElementBinding elementBinding = createElementBinding(childType, elementTypeBinding, qName, false);

            // Bind it to the model
            ParticleBinding particle = new ParticleBinding(elementBinding, child.minOccurs(), child.maxOccurs(), child.unbounded());
            model.addParticle(particle);

            DefaultElementInterceptor interceptor = null;
            if (typeInfo.isCollection())
               interceptor = ChildCollectionInterceptor.SINGLETON;
            else
            {
               // Expect a type with a value property to accept the child value
               PropertyInfo property = beanInfo.getProperty("value");
               if (property == null)
                  throw new UnsupportedOperationException("Expected a value property for non-collection type with JBossXmlChildren");
               TypeInfo propertyType = property.getType();
               interceptor = new PropertyInterceptor(property, propertyType);
            }
            typeBinding.pushInterceptor(qName, interceptor);
            if (trace)
               log.trace("Added interceptor " + qName + " for type=" + childType + " interceptor=" + interceptor);
         }
      }

      // Bind the wildcard
      if (wildcardProperty != null)
      {
         if (trace)
            log.trace("Processing WildcardProperty for type=" + beanInfo.getName() + " property=" + wildcardProperty.getName());
         ModelGroupBinding localModel = model;
         TypeInfo wildcardType = wildcardProperty.getType();
         TypeInfo type = wildcardType;

         // Setup any new model and determine the wildcard type
         if (wildcardType.isArray())
         {
            localModel = createArray(localModel);
            type = ((ArrayInfo) wildcardType).getComponentType();
            if (trace)
               log.trace("Wildcard " + wildcardProperty.getName() + " is an array of type " + type.getName());
         }
         else if (wildcardType.isCollection())
         {
            localModel = createCollection(localModel);
            type = findComponentType(wildcardProperty);
            if (trace)
               log.trace("Wildcard " + wildcardProperty.getName() + " is a collection of type " + type.getName());
         }

         XmlAnyElement xmlAnyElement = wildcardProperty.getUnderlyingAnnotation(XmlAnyElement.class);
         boolean isLax = xmlAnyElement == null ? true : xmlAnyElement.lax();
         WildcardBinding wildcard = new WildcardBinding(schemaBinding);
         if (isLax)
            wildcard.setProcessContents((short) 3); // Lax
         else
            wildcard.setProcessContents((short) 1); // Strict

         // Dom element?
         if (Element.class.getName().equals(type.getName()))
         {
            wildcard.setUnresolvedElementHandler(DOMHandler.INSTANCE);
            wildcard.setUnresolvedCharactersHandler(DOMHandler.INSTANCE);
         }

         // Bind the particle to the model
         ParticleBinding particleBinding = new ParticleBinding(wildcard);
         particleBinding.setMinOccurs(0);
         particleBinding.setMaxOccurs(1);
         localModel.addParticle(particleBinding);
         typeBinding.getWildcard().setWildcardHandler((ParticleHandler) wildcardHandler);
         beanAdapterFactory.setWildcardHandler(wildcardHandler);
      }

      JBossXmlChildWildcard childWildcard = typeInfo.getUnderlyingAnnotation(JBossXmlChildWildcard.class);
View Full Code Here

      if (xmlTransient != null && propertyOrder != null)
         throw new RuntimeException("Property " + property.getName() + " in property order "
               + Arrays.asList(propertyOrder) + " is marked @XmlTransient");

      // The current model
      ModelGroupBinding localModel = model;

      // Setup any new model
      if (propertyType.isArray())
      {
         if (trace)
            log.trace("Property " + property.getName() + " is an array");
         localModel = createArray(localModel);
      }
      else if (propertyType.isCollection())
      {
         if (trace)
            log.trace("Property " + property.getName() + " is a collection");
         localModel = createCollection(localModel);

         JBossXmlCollection xmlCol = property.getUnderlyingAnnotation(JBossXmlCollection.class);
         if (xmlCol != null)
         {
            // 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())
      {
         ClassInfo propClassInfo = (ClassInfo) property.getType();

         // TODO XmlElement on this property?..
         XmlElement propXmlElement = property.getUnderlyingAnnotation(XmlElement.class);
         if (propXmlElement != null)
         {
            propClassInfo = (ClassInfo) propClassInfo.getTypeInfoFactory().getTypeInfo(propXmlElement.type());
         }

         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());

            ModelGroupBinding propertyGroup = null;
            QName groupName = null;
            if (!JBossXmlConstants.DEFAULT.equals(xmlModelGroup.name()))
               groupName = new QName(xmlModelGroup.name());

            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 = null;
               try
               {
                  // TODO this has to use its own adapter class and the factory method
                  BeanInfo propBeanAdapterBuilderInfo = JBossXBBuilder.configuration
                        .getBeanInfo(DefaultBeanAdapterBuilder.class);
                  BeanAdapterBuilder propBeanAdapterBuilder = (BeanAdapterBuilder) propBeanAdapterBuilderInfo
                        .newInstance();
                  propBeanAdapterFactory = propBeanAdapterBuilder.newFactory(propBeanInfo, null);
               }
               catch (Throwable t)
               {
                  throw new RuntimeException("Error creating BeanAdapterFactory for "
                        + DefaultBeanAdapterBuilder.class.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())
                  {
                     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();
                  String memberNamespace = null;

                  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!");
                     }
                  }

                  String memberName = null;
                  XmlElement memberXmlElement = memberProp.getUnderlyingAnnotation(XmlElement.class);
                  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();
                  }

                  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);
                  }
                  else
                  {
                     memberPropertyHandler = new PropertyHandler(memberProp, memberTypeInfo);
                  }

                  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();
                  }

                  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());
               }
            }

            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);
            return;
         }
      }

      // So this is element(s)
      XmlElement[] elements = null;
      XmlElement xmlElement = property.getUnderlyingAnnotation(XmlElement.class);
      if (xmlElement != null)
      {
         // A single element annotated
         elements = new XmlElement[]
         {xmlElement};
      }
      else
      {
         // Mutlple elements
         XmlElements xmlElements = property.getUnderlyingAnnotation(XmlElements.class);
         if (xmlElements != null)
            elements = xmlElements.value();
      }

      // A single element not annotated
      if (elements == null || elements.length == 0)
         elements = new XmlElement[1];

      // for now support just one JBossXmlNsPrefix
      JBossXmlNsPrefix xmlNsPrefix = property.getUnderlyingAnnotation(JBossXmlNsPrefix.class);

      // support for @XmlElementWrapper
      // the wrapping element is ignored in this case
      XmlElementWrapper xmlWrapper = property.getUnderlyingAnnotation(XmlElementWrapper.class);
      if (xmlWrapper != null)
      {
         String wrapperNamespace = xmlWrapper.namespace();
         String wrapperName = xmlWrapper.name();
         boolean wrapperNillable = xmlWrapper.nillable();

         QName wrapperQName = generateXmlName(property.getName(), elementForm, wrapperNamespace, wrapperName);

         TypeBinding wrapperType = new TypeBinding();
         SequenceBinding seq = new SequenceBinding(schemaBinding);
         seq.setHandler(BuilderParticleHandler.INSTANCE);
         ParticleBinding particle = new ParticleBinding(seq);
         wrapperType.setParticle(particle);
         wrapperType.setHandler(new DefaultElementHandler());

         ElementBinding wrapperElement = createElementBinding(propertyType, wrapperType, wrapperQName, false);
         wrapperElement.setNillable(wrapperNillable);
         wrapperElement.setSkip(Boolean.TRUE);
         particle = new ParticleBinding(wrapperElement, 1, 1, false);
         localModel.addParticle(particle);

         localModel = seq;

         if (trace)
            log.trace("Added property " + wrapperQName + " for type=" + property.getBeanInfo().getName() + " property="
                  + property.getName() + " as a wrapper element");
      }

      // Setup a choice
      if (elements.length > 1)
      {
         ChoiceBinding choice = new ChoiceBinding(schemaBinding);
         choice.setHandler(BuilderParticleHandler.INSTANCE);
         ParticleBinding particleBinding = new ParticleBinding(choice);
         particleBinding.setMinOccurs(0);
         particleBinding.setMaxOccurs(1);
         localModel.addParticle(particleBinding);
         localModel = choice;
         if (trace)
            log.trace("XmlElements seen adding choice for type=" + property.getBeanInfo().getName() + " property="
                  + property.getName());
      }

      for (int i = 0; i < elements.length; ++i)
      {
         XmlElement element = elements[i];
         if (trace)
            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;

         TypeInfo localPropertyType = propertyType;

         if (element != null)
         {
            overrideNamespace = element.namespace();
            overrideName = element.name();
            nillable = element.nillable();
            required = element.required();
            Class<?> elementType = element.type();
            if (elementType != XmlElement.DEFAULT.class)
               localPropertyType = propertyType.getTypeInfoFactory().getTypeInfo(elementType);
         }

         if (xmlNsPrefix != null)
         {
            overrideNamespace = schemaBinding.getNamespace(xmlNsPrefix.prefix());
            if (overrideNamespace == null)
            {
               if (xmlNsPrefix.schemaTargetIfNotMapped())
               {
                  overrideNamespace = defaultNamespace;
               }
               else
               {
                  throw new IllegalStateException("Prefix '" + xmlNsPrefix.prefix()
                        + "' is not mapped to any namespace!");
               }
            }
         }

         // Determine the name
         QName qName = generateXmlName(property.getName(), elementForm, overrideNamespace, overrideName);

         // Create the element
         JBossXmlGroup jbossXmlGroup = null;
         if (!propertyType.isPrimitive())
            jbossXmlGroup = ((ClassInfo) propertyType).getUnderlyingAnnotation(JBossXmlGroup.class);
         if (element == null && jbossXmlGroup != null)
         {
            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();
               elementTypeBinding.setSchemaBinding(schemaBinding);
               elementTypeBinding.setHandler(BuilderParticleHandler.INSTANCE);
               ElementBinding elementBinding = createElementBinding(localPropertyType, elementTypeBinding, qName, false);

               // Bind it to the model
               ParticleBinding particle = new ParticleBinding(elementBinding, 1, 1, false);
               if (required == false)
                  particle.setMinOccurs(0);
               localModel.addParticle(particle);

               // Can it take text?
               JBossXmlGroupText groupText = ((ClassInfo) propertyType)
                     .getUnderlyingAnnotation(JBossXmlGroupText.class);
               if (groupText != null)
               {
                  CharactersHandler textHandler;
                  if (groupText.wrapper() != Object.class)
                  {
                     BeanInfo wrapperInfo = JBossXBBuilder.configuration.getBeanInfo(groupText.wrapper());
                     textHandler = new ValueHandler(property, wrapperInfo, groupText.property());
                  }
                  else
                     textHandler = new ValueHandler(property);
                  elementTypeBinding.setSimpleType(textHandler);
               }

               // Setup the child model
               ChoiceBinding childModel = new ChoiceBinding(schemaBinding);
               childModel.setHandler(BuilderParticleHandler.INSTANCE);
               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);

                  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);

                  beanAdapterFactory.addProperty(qName, new NoopPropertyHandler(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
         {
            XBValueAdapter valueAdapter = null;
            XmlJavaTypeAdapter xmlTypeAdapter = property.getUnderlyingAnnotation(XmlJavaTypeAdapter.class);
            if (xmlTypeAdapter != null)
            {
               valueAdapter = new XBValueAdapter(xmlTypeAdapter.value(), propertyType.getTypeInfoFactory());
               localPropertyType = valueAdapter.getAdaptedTypeInfo();
            }

            ModelGroupBinding targetGroup = localModel;
            boolean isCol = 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);
               ClassInfo typeArg = (ClassInfo) findComponentType(property);

               //if (((ClassInfo) typeArg).getUnderlyingAnnotation(XmlType.class) != null)
               if (typeArg != null && 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;
                  }
               }
            }
            // 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)
            {
               Type parameterizedType;
               if (valueAdapter != null)
               {
                  propertyHandler = new PropertyHandler(property, localPropertyType);
                  parameterizedType = valueAdapter.getAdaptedType();
               }
               else
               {
                  propertyHandler = new CollectionPropertyHandler(property, localPropertyType);
                  parameterizedType = localPropertyType.getType();
               }
               isCol = true;
               localPropertyType = findActualType((ClassInfo) localPropertyType, parameterizedType,
                     java.util.Collection.class, 0);
            }
            else
            {
               propertyHandler = new PropertyHandler(property, localPropertyType);
            }

            ParticleBinding particle;
            // DOM elements are going to be treated as unresolved
            // however having the property registered
            if (!Element.class.getName().equals(propertyType.getName()))
            {
               TypeBinding elementTypeBinding = resolveTypeBinding(localPropertyType);
               ElementBinding elementBinding = createElementBinding(localPropertyType, elementTypeBinding, qName, 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);
            }

            beanAdapterFactory.addProperty(qName, propertyHandler);
            if (trace)
               log.trace("Added property " + qName + " for type=" + property.getBeanInfo().getName() + " property="
View Full Code Here

      {
         TypeBinding type = ((ElementBinding)term).getType();
         if(type.getAttributes().isEmpty())
         {
            ParticleBinding typeParticle = type.getParticle();
            ModelGroupBinding modelGroup = (ModelGroupBinding)(typeParticle == null ? null : typeParticle.getTerm());
            arrayItem = modelGroup == null ? null : modelGroup.getArrayItem();

            // todo refactor later (move it to modelGroup.getArrayItem()?)
            if(arrayItem != null &&
               (arrayItem.isSkip() ||
               arrayItem.getMapEntryMetaData() != null ||
View Full Code Here

      {
         ElementBinding arrayItem = null;
         if(!type.isSimple() && type.getAttributes().isEmpty())
         {
            ParticleBinding typeParticle = type.getParticle();
            ModelGroupBinding modelGroup = (ModelGroupBinding)(typeParticle == null ? null : typeParticle.getTerm());
            arrayItem = modelGroup == null ? null : modelGroup.getArrayItem();
         }

         if(arrayItem != null)
         {
            cls = classForElement(arrayItem, parentClass);
View Full Code Here

         else
            builder.append(maxOccurs);
         builder.append("\"");
      }
      builder.append(">");
      ModelGroupBinding model = (ModelGroupBinding) particle.getTerm();
      Collection<ParticleBinding> particles = model.getParticles();
      boolean newLine = true;
      if (particles != null)
      {
         for (ParticleBinding component : particles)
            printParticle(builder, pad+3, component);
View Full Code Here

/*     */     }
/* 517 */     TermBinding term = particle.getTerm();
/* 518 */     if (!term.isModelGroup()) {
/* 519 */       return null;
/*     */     }
/* 521 */     ModelGroupBinding group = (ModelGroupBinding)term;
/* 522 */     Iterator i = group.getParticles().iterator();
/*     */
/* 525 */     return findLocalPathElement(i, path, pos + 1);
/*     */   }
View Full Code Here

/*  648 */     ParticleBinding ctxParticle = this.ctx.particle;
/*  649 */     MarshallingContextImpl.access$102(this.ctx, particle);
/*      */     boolean marshalled;
/*  651 */     if (term.isModelGroup())
/*      */     {
/*  653 */       ModelGroupBinding modelGroup = (ModelGroupBinding)term;
/*      */       boolean marshalled;
/*  654 */       if ((modelGroup.isSkip()) || (this.stack.isEmpty()))
/*      */       {
/*  656 */         marshalled = marshalModelGroup(modelGroup, declareNs);
/*      */       }
/*      */       else
/*      */       {
/*  660 */         PropertyMetaData propertyMetaData = modelGroup.getPropertyMetaData();
/*  661 */         if (propertyMetaData == null)
/*      */         {
/*  663 */           throw new JBossXBRuntimeException("Currently, property binding metadata must be available for a model group to be marshalled!");
/*      */         }
/*      */
/*  668 */         Object o = getChildren(this.stack.peek(), propertyMetaData.getName(), modelGroup.getSchema().isIgnoreUnresolvedFieldOrClass());
/*      */
/*  672 */         TermBeforeMarshallingCallback marshallingHandler = modelGroup.getBeforeMarshallingCallback();
/*      */
/*  674 */         Iterator i = (o != null) && (isRepeatable(particle)) ? getIterator(o) : null;
/*  675 */         if (i != null)
/*      */         {
/*  677 */           boolean marshalled = true;
View Full Code Here

/*  944 */     if (this.trace) {
/*  945 */       log.trace("PropertyOrder " + Arrays.asList(propertyOrder) + " for type=" + beanInfo.getName());
/*      */     }
/*      */
/*  949 */     typeBinding.setSimple(false);
/*  950 */     ModelGroupBinding model = null;
/*  951 */     if (allBinding)
/*      */     {
/*  953 */       if (this.trace)
/*  954 */         log.trace("AllBinding for type=" + beanInfo.getName());
/*  955 */       model = new AllBinding(this.schemaBinding);
/*      */     }
/*      */     else
/*      */     {
/*  959 */       if (this.trace)
/*  960 */         log.trace("SequenceBinding for type=" + beanInfo.getName());
/*  961 */       model = new SequenceBinding(this.schemaBinding);
/*      */     }
/*  963 */     model.setHandler(BuilderParticleHandler.INSTANCE);
/*  964 */     ParticleBinding typeParticle = new ParticleBinding(model);
/*  965 */     typeParticle.setMinOccurs(1);
/*  966 */     typeParticle.setMaxOccurs(1);
/*  967 */     typeBinding.setParticle(typeParticle);
/*      */
/*  969 */     if (typeInfo.isCollection())
/*      */     {
/*  971 */       TypeInfo memberBaseType = findComponentType(typeInfo);
/*  972 */       JBossXmlModelGroup xmlModelGroup = (JBossXmlModelGroup)((ClassInfo)memberBaseType).getUnderlyingAnnotation(JBossXmlModelGroup.class);
/*      */
/*  974 */       if ((xmlModelGroup != null) && (xmlModelGroup.particles().length > 0))
/*      */       {
/*  976 */         if (this.trace) {
/*  977 */           log.trace("Item base type for " + typeInfo.getName() + " is " + memberBaseType.getName() + " and bound to repeatable choice");
/*      */         }
/*      */
/*  982 */         ModelGroupBinding choiceGroup = null;
/*  983 */         QName choiceName = null;
/*  984 */         if (!"##default".equals(xmlModelGroup.name()))
/*      */         {
/*  986 */           choiceName = new QName(this.defaultNamespace, xmlModelGroup.name());
/*  987 */           choiceGroup = this.schemaBinding.getGroup(choiceName);
/*      */         }
/*      */
/*  990 */         if (choiceGroup == null)
/*      */         {
/*  992 */           choiceGroup = new ChoiceBinding(this.schemaBinding);
/*  993 */           choiceGroup.setHandler(BuilderParticleHandler.INSTANCE);
/*  994 */           if (choiceName != null)
/*      */           {
/*  996 */             choiceGroup.setQName(choiceName);
/*  997 */             this.schemaBinding.addGroup(choiceGroup.getQName(), choiceGroup);
/*      */           }
/*      */
/* 1000 */           ParticleBinding choiceParticle = new ParticleBinding(choiceGroup, 0, 1, true);
/* 1001 */           model.addParticle(choiceParticle);
/*      */
/* 1003 */           for (JBossXmlModelGroup.Particle member : xmlModelGroup.particles())
/*      */           {
/* 1005 */             XmlElement element = member.element();
/* 1006 */             QName memberQName = generateXmlName(element.name(), XmlNsForm.QUALIFIED, element.namespace(), null);
/* 1007 */             TypeInfo memberTypeInfo = typeInfo.getTypeInfoFactory().getTypeInfo(member.type());
/*      */
/* 1009 */             boolean isCol = false;
/* 1010 */             if (memberTypeInfo.isCollection())
/*      */             {
/* 1012 */               memberTypeInfo = findComponentType((ClassInfo)memberTypeInfo);
/* 1013 */               isCol = true;
/*      */             }
/*      */
/* 1016 */             TypeBinding memberTypeBinding = resolveTypeBinding(memberTypeInfo);
/* 1017 */             ElementBinding memberElement = createElementBinding(memberTypeInfo, memberTypeBinding, memberQName, false);
/* 1018 */             memberElement.setNillable(true);
/* 1019 */             ParticleBinding memberParticle = new ParticleBinding(memberElement, 0, 1, isCol);
/* 1020 */             choiceGroup.addParticle(memberParticle);
/*      */
/* 1022 */             typeBinding.pushInterceptor(memberQName, ChildCollectionInterceptor.SINGLETON);
/*      */           }
/*      */         }
/*      */         else
/*      */         {
/* 1027 */           ParticleBinding choiceParticle = new ParticleBinding(choiceGroup, 0, 1, true);
/* 1028 */           model.addParticle(choiceParticle);
/*      */         }
/*      */
/* 1031 */         if (this.trace) {
/* 1032 */           log.trace("choices for " + typeBinding.getQName() + ": " + choiceGroup.getParticles());
/*      */         }
/*      */       }
/*      */     }
/*      */
/* 1037 */     AbstractPropertyHandler wildcardHandler = null;
/* 1038 */     if (wildcardProperty != null)
/*      */     {
/* 1040 */       TypeInfo wildcardType = wildcardProperty.getType();
/* 1041 */       if (wildcardType.isCollection())
/* 1042 */         wildcardHandler = new CollectionPropertyWildcardHandler(wildcardProperty, wildcardType);
/*      */       else {
/* 1044 */         wildcardHandler = new PropertyWildcardHandler(wildcardProperty, wildcardType);
/*      */       }
/*      */     }
/*      */
/* 1048 */     for (String name : propertyOrder)
/*      */     {
/* 1051 */       push(typeInfo, name);
/*      */
/* 1053 */       PropertyInfo property = beanInfo.getProperty(name);
/* 1054 */       bindProperty(property, typeBinding, model, beanAdapterFactory, propertyOrder);
/* 1055 */       pop();
/*      */     }
/*      */
/* 1059 */     JBossXmlChild[] children = null;
/* 1060 */     JBossXmlChildren jbossXmlChildren = (JBossXmlChildren)typeInfo.getUnderlyingAnnotation(JBossXmlChildren.class);
/* 1061 */     if (jbossXmlChildren != null) {
/* 1062 */       children = jbossXmlChildren.value();
/*      */     }
/*      */     else {
/* 1065 */       JBossXmlChild jbossXmlChild = (JBossXmlChild)typeInfo.getUnderlyingAnnotation(JBossXmlChild.class);
/* 1066 */       if (jbossXmlChild != null) {
/* 1067 */         children = new JBossXmlChild[] { jbossXmlChild };
/*      */       }
/*      */     }
/* 1070 */     if ((children != null) && (children.length > 0))
/*      */     {
/* 1072 */       for (JBossXmlChild child : children)
/*      */       {
/* 1074 */         QName qName = generateXmlName(child.name(), this.elementForm, child.namespace(), child.name());
/* 1075 */         TypeInfo childType = JBossXBBuilder.configuration.getTypeInfo(child.type());
/*      */
/* 1077 */         TypeBinding elementTypeBinding = resolveTypeBinding(childType);
/* 1078 */         ElementBinding elementBinding = createElementBinding(childType, elementTypeBinding, qName, false);
/*      */
/* 1081 */         ParticleBinding particle = new ParticleBinding(elementBinding, child.minOccurs(), child.maxOccurs(), child.unbounded());
/* 1082 */         model.addParticle(particle);
/*      */
/* 1084 */         DefaultElementInterceptor interceptor = null;
/* 1085 */         if (typeInfo.isCollection()) {
/* 1086 */           interceptor = ChildCollectionInterceptor.SINGLETON;
/*      */         }
/*      */         else
/*      */         {
/* 1090 */           PropertyInfo property = beanInfo.getProperty("value");
/* 1091 */           if (property == null)
/* 1092 */             throw new UnsupportedOperationException("Expected a value property for non-collection type with JBossXmlChildren");
/* 1093 */           TypeInfo propertyType = property.getType();
/* 1094 */           interceptor = new PropertyInterceptor(property, propertyType);
/*      */         }
/* 1096 */         typeBinding.pushInterceptor(qName, interceptor);
/* 1097 */         if (this.trace) {
/* 1098 */           log.trace("Added interceptor " + qName + " for type=" + childType + " interceptor=" + interceptor);
/*      */         }
/*      */       }
/*      */     }
/*      */
/* 1103 */     if (wildcardProperty != null)
/*      */     {
/* 1105 */       if (this.trace)
/* 1106 */         log.trace("Processing WildcardProperty for type=" + beanInfo.getName() + " property=" + wildcardProperty.getName());
/* 1107 */       ModelGroupBinding localModel = model;
/* 1108 */       TypeInfo wildcardType = wildcardProperty.getType();
/* 1109 */       TypeInfo type = wildcardType;
/*      */
/* 1112 */       if (wildcardType.isArray())
/*      */       {
/* 1114 */         localModel = createArray(localModel);
/* 1115 */         type = ((ArrayInfo)wildcardType).getComponentType();
/* 1116 */         if (this.trace)
/* 1117 */           log.trace("Wildcard " + wildcardProperty.getName() + " is an array of type " + type.getName());
/*      */       }
/* 1119 */       else if (wildcardType.isCollection())
/*      */       {
/* 1121 */         localModel = createCollection(localModel);
/* 1122 */         type = findComponentType(wildcardProperty);
/* 1123 */         if (this.trace) {
/* 1124 */           log.trace("Wildcard " + wildcardProperty.getName() + " is a collection of type " + type.getName());
/*      */         }
/*      */       }
/* 1127 */       XmlAnyElement xmlAnyElement = (XmlAnyElement)wildcardProperty.getUnderlyingAnnotation(XmlAnyElement.class);
/* 1128 */       boolean isLax = xmlAnyElement == null ? true : xmlAnyElement.lax();
/* 1129 */       WildcardBinding wildcard = new WildcardBinding(this.schemaBinding);
/* 1130 */       if (isLax)
/* 1131 */         wildcard.setProcessContents(3);
/*      */       else {
/* 1133 */         wildcard.setProcessContents(1);
/*      */       }
/*      */
/* 1136 */       if (Element.class.getName().equals(type.getName()))
/*      */       {
/* 1138 */         wildcard.setUnresolvedElementHandler(DOMHandler.INSTANCE);
/* 1139 */         wildcard.setUnresolvedCharactersHandler(DOMHandler.INSTANCE);
/*      */       }
/*      */
/* 1143 */       ParticleBinding particleBinding = new ParticleBinding(wildcard);
/* 1144 */       particleBinding.setMinOccurs(0);
/* 1145 */       particleBinding.setMaxOccurs(1);
/* 1146 */       localModel.addParticle(particleBinding);
/* 1147 */       typeBinding.getWildcard().setWildcardHandler((ParticleHandler)wildcardHandler);
/* 1148 */       beanAdapterFactory.setWildcardHandler(wildcardHandler);
/*      */     }
/*      */
/* 1151 */     JBossXmlChildWildcard childWildcard = (JBossXmlChildWildcard)typeInfo.getUnderlyingAnnotation(JBossXmlChildWildcard.class);
View Full Code Here

TOP

Related Classes of org.jboss.xb.binding.sunday.unmarshalling.ModelGroupBinding$Cursor

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.