[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