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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Jul 17 09:33:43 EDT 2007


Author: alex.loubyansky at jboss.com
Date: 2007-07-17 09:33:42 -0400 (Tue, 17 Jul 2007)
New Revision: 2446

Added:
   jbossxb-builder/trunk/src/main/java/org/jboss/xb/annotations/JBossXmlModelGroup.java
Modified:
   jbossxb-builder/trunk/src/main/java/org/jboss/xb/annotations/JBossXmlConstants.java
   jbossxb-builder/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java
   jbossxb-builder/trunk/src/main/java/org/jboss/xb/builder/runtime/BeanHandler.java
Log:
basic support for model group binding (the tests are not in the builder's project yet)

Modified: jbossxb-builder/trunk/src/main/java/org/jboss/xb/annotations/JBossXmlConstants.java
===================================================================
--- jbossxb-builder/trunk/src/main/java/org/jboss/xb/annotations/JBossXmlConstants.java	2007-07-13 08:08:19 UTC (rev 2445)
+++ jbossxb-builder/trunk/src/main/java/org/jboss/xb/annotations/JBossXmlConstants.java	2007-07-17 13:33:42 UTC (rev 2446)
@@ -31,4 +31,10 @@
 {
    /** A default value */
    String DEFAULT = "##default";
+   
+   String MODEL_GROUP_SEQUENCE = "sequence";
+   
+   String MODEL_GROUP_CHOICE = "choice";
+   
+   String MODEL_GROUP_ALL = "all";
 }

Added: jbossxb-builder/trunk/src/main/java/org/jboss/xb/annotations/JBossXmlModelGroup.java
===================================================================
--- jbossxb-builder/trunk/src/main/java/org/jboss/xb/annotations/JBossXmlModelGroup.java	                        (rev 0)
+++ jbossxb-builder/trunk/src/main/java/org/jboss/xb/annotations/JBossXmlModelGroup.java	2007-07-17 13:33:42 UTC (rev 2446)
@@ -0,0 +1,42 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, 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.xb.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * JBossXmlModelGroup binds a Java class to a model group in the schema.
+ * 
+ * @author <a href="alex at jboss.com">Alexey Loubyansky</a>
+ * @version $Revision: 1.1 $
+ */
+ at Target({ElementType.TYPE})
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface JBossXmlModelGroup
+{
+   String kind() default JBossXmlConstants.MODEL_GROUP_SEQUENCE;
+   
+   String name();
+}

Modified: jbossxb-builder/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java
===================================================================
--- jbossxb-builder/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java	2007-07-13 08:08:19 UTC (rev 2445)
+++ jbossxb-builder/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java	2007-07-17 13:33:42 UTC (rev 2446)
@@ -67,6 +67,7 @@
 import org.jboss.xb.annotations.JBossXmlGroup;
 import org.jboss.xb.annotations.JBossXmlGroupText;
 import org.jboss.xb.annotations.JBossXmlGroupWildcard;
+import org.jboss.xb.annotations.JBossXmlModelGroup;
 import org.jboss.xb.annotations.JBossXmlNoElements;
 import org.jboss.xb.annotations.JBossXmlSchema;
 import org.jboss.xb.annotations.JBossXmlType;
@@ -184,8 +185,11 @@
          log.trace("Building schema for " + root.getName() + " schemaBinding=" + schemaBinding);
       
       // Remember the default namespace
-      defaultNamespace = (String) schemaBinding.getNamespaces().iterator().next();
-      
+      if(defaultNamespace == null)
+      {
+         defaultNamespace = (String) schemaBinding.getNamespaces().iterator().next();
+      }
+
       JBossXmlSchema jbossXmlSchema = root.getUnderlyingAnnotation(JBossXmlSchema.class);
       if (jbossXmlSchema != null)
       {
@@ -882,6 +886,7 @@
                   log.trace("Element for type=" + beanInfo.getName() + " property=" + property.getName());
                propertyNames.add(property.getName());
             }
+            
             pop();
          }
          // Apply any access order
@@ -984,7 +989,112 @@
                log.trace("Property " + property.getName() + " is a collection");
             localModel = createCollection(localModel);
          }
-         
+         // Is this property bound to a model group
+         else if (!property.getType().isPrimitive())
+         {
+            ClassInfo propClassInfo = (ClassInfo) property.getType();
+            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)
+            {
+               if(trace)
+                  log.trace("Property " + property.getName() + " is bound to " + xmlModelGroup.kind());
+
+               localModel = new SequenceBinding(schemaBinding);
+               if(xmlModelGroup.name() != null)
+               {
+                  localModel.setQName(new QName(name));
+               }
+
+               //ClassMetaData classMd = new ClassMetaData();
+               //classMd.setImpl(propClassInfo.getName());
+               //localModel.setClassMetaData(classMd);
+               localModel.setSkip(Boolean.FALSE);
+               model.addParticle(new ParticleBinding(localModel));
+
+               // 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(localModel.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);
+               localModel.setHandler(propHandler);
+               
+               // bind model group members
+               for(PropertyInfo memberProp : propBeanInfo.getProperties())
+               {
+                  if ("class".equals(memberProp.getName()))
+                  {
+                     continue;
+                  }
+
+                  TypeInfo memberTypeInfo = memberProp.getType();
+                  String memberNamespace = defaultNamespace;
+                  String memberName = null;
+                  XmlElement memberXmlElement = memberProp.getUnderlyingAnnotation(XmlElement.class);
+                  if(memberXmlElement != null)
+                  {
+                     memberTypeInfo = memberTypeInfo.getTypeInfoFactory().getTypeInfo(memberXmlElement.type());                     
+                     memberNamespace = memberXmlElement.namespace();
+                     memberName = memberXmlElement.name();
+                  }
+
+                  AbstractPropertyHandler memberPropertyHandler = null;
+                  if(memberTypeInfo.isCollection())
+                  {
+                     // TODO here we should properly identify the type of the item (based on a testcase)
+                     TypeInfo gs = ((ClassInfo)memberTypeInfo).getGenericSuperclass();
+                     ParameterizedClassInfo pti = (ParameterizedClassInfo) gs;
+                     memberPropertyHandler = new CollectionPropertyHandler(memberProp, memberTypeInfo);
+                     memberTypeInfo = pti.getActualTypeArguments()[0];
+                  }
+                  else
+                  {
+                     memberPropertyHandler = new PropertyHandler(memberProp, memberTypeInfo);
+                  }
+
+                  QName memberQName = generateXmlName(memberProp.getName(), elementForm, memberNamespace, memberName);
+                  propBeanAdapterFactory.addProperty(memberQName, memberPropertyHandler);
+
+                  TypeBinding memberTypeBinding = resolveTypeBinding(memberTypeInfo);
+                  ElementBinding memberElement = createElementBinding(memberTypeInfo, memberTypeBinding, memberQName, false);
+                  memberElement.setNillable(true);
+                  ParticleBinding memberParticle = new ParticleBinding(memberElement, 0, 1, false);
+                  localModel.addParticle(memberParticle);
+                  
+                  if(trace)
+                     log.trace("added " + memberElement.getQName() + " to " + xmlModelGroup.kind() + ", property " + property.getName());
+               }
+
+               pop();
+               continue;
+            }
+         }
+
          // So this is element(s)
          XmlElement[] elements = null;
          XmlElement xmlElement = property.getUnderlyingAnnotation(XmlElement.class);

Modified: jbossxb-builder/trunk/src/main/java/org/jboss/xb/builder/runtime/BeanHandler.java
===================================================================
--- jbossxb-builder/trunk/src/main/java/org/jboss/xb/builder/runtime/BeanHandler.java	2007-07-13 08:08:19 UTC (rev 2445)
+++ jbossxb-builder/trunk/src/main/java/org/jboss/xb/builder/runtime/BeanHandler.java	2007-07-17 13:33:42 UTC (rev 2446)
@@ -21,15 +21,18 @@
 */
 package org.jboss.xb.builder.runtime;
 
+import javax.xml.namespace.NamespaceContext;
 import javax.xml.namespace.QName;
 
 import org.jboss.logging.Logger;
 import org.jboss.xb.binding.sunday.unmarshalling.DefaultElementHandler;
 import org.jboss.xb.binding.sunday.unmarshalling.ElementBinding;
+import org.jboss.xb.binding.sunday.unmarshalling.ModelGroupBinding;
 import org.jboss.xb.binding.sunday.unmarshalling.ParticleBinding;
 import org.jboss.xb.binding.sunday.unmarshalling.TermBinding;
 import org.jboss.xb.spi.BeanAdapter;
 import org.jboss.xb.spi.BeanAdapterFactory;
+import org.xml.sax.Attributes;
 
 /**
  * BeanHandler.
@@ -77,7 +80,7 @@
    {
       return beanAdapterFactory;
    }
-
+/*
    @Override
    public Object startElement(Object parent, QName qName, ElementBinding element)
    {
@@ -92,13 +95,51 @@
          throw new RuntimeException("QName " + qName + " error invoking beanAdapterFactory.newInstance() for bean=" + name, t);
       }
    }
+*/
+   @Override
+   public Object startParticle(Object parent,
+         QName elementName,
+         ParticleBinding particle,
+         Attributes attrs,
+         NamespaceContext nsCtx)
+   {
+      if (trace)
+         log.trace(" startElement " + elementName + " bean=" + name + " parent=" + BuilderUtil.toDebugString(parent));
+      
+      Object o = null;
+      try
+      {
+         o = beanAdapterFactory.newInstance();
+      }
+      catch (Throwable t)
+      {
+         throw new RuntimeException("QName " + elementName + " error invoking beanAdapterFactory.newInstance() for bean=" + name, t);
+      }
 
+      if (o != null && particle.getTerm().isElement())
+      {
+         ElementBinding element = (ElementBinding) particle.getTerm();
+         attrs = element.getType().expandWithDefaultAttributes(attrs);
+         attributes(o, elementName, element, attrs, nsCtx);
+      }
+      return o;
+   }
+
    @Override
    public void setParent(Object parent, Object o, QName qName,  ParticleBinding particle, ParticleBinding parentParticle)
    {
       if (trace)
          log.trace("setParent " + qName + " parent=" + BuilderUtil.toDebugString(parent) + " child=" + BuilderUtil.toDebugString(o));
 
+      if(particle.getTerm().isModelGroup())
+      {
+         QName modelGroupName = ((ModelGroupBinding)particle.getTerm()).getQName();
+         if(modelGroupName != null)
+         {
+            qName = modelGroupName;
+         }
+      }
+
       if (parent != null && parent instanceof ArrayWrapper)
       {
          ArrayWrapper wrapper = (ArrayWrapper) parent;
@@ -138,7 +179,7 @@
       propertyHandler.doHandle(beanAdapter, o, qName);
    }
 
-   @Override
+/*   @Override
    public Object endElement(Object o, QName qName, ElementBinding element)
    {
       if (trace)
@@ -146,4 +187,14 @@
       BeanAdapter beanAdapter = (BeanAdapter) o;
       return beanAdapter.getValue();
    }
+*/
+   @Override
+   public Object endParticle(Object o, QName qName, ParticleBinding particle)
+   {
+      if (trace)
+         log.trace("endElement " + qName + " o=" + BuilderUtil.toDebugString(o));
+
+      BeanAdapter beanAdapter = (BeanAdapter) o;
+      return beanAdapter.getValue();
+   }
 }




More information about the jboss-svn-commits mailing list