[jboss-svn-commits] JBoss Common SVN: r4032 - in jbossxb/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
Thu Feb 11 06:06:03 EST 2010
Author: alex.loubyansky at jboss.com
Date: 2010-02-11 06:06:02 -0500 (Thu, 11 Feb 2010)
New Revision: 4032
Modified:
jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/AbstractPosition.java
jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ElementPosition.java
jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/NonElementPosition.java
jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/TypeBinding.java
jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java
jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/BeanHandler.java
jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/GroupBeanHandler.java
Log:
made BeanHandler specialized for elements and GroupBeanHandler for groups, other optimizations
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/AbstractPosition.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/AbstractPosition.java 2010-02-11 09:46:17 UTC (rev 4031)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/AbstractPosition.java 2010-02-11 11:06:02 UTC (rev 4032)
@@ -72,7 +72,11 @@
this.particle = particle;
this.occurrence = 1;
- this.skip = particle.getTerm().isSkip();
+ TermBinding term = particle.getTerm();
+ this.skip = term.isSkip();
+
+ if(particle.isRepeatable())
+ repeatableHandler = term.getRepeatableHandler();
}
public void setStack(PositionStack stack)
@@ -116,7 +120,6 @@
log.trace(" end repeatable " + particle.getTerm());
repeatableHandler.endRepeatableParticle(previous.o, repeatableParticleValue, qName, particle, previous.particle);
repeatableParticleValue = null;
- repeatableHandler = null;
}
public abstract void endParticle();
@@ -152,7 +155,6 @@
if(this.repeatableParticleValue != null)
throw new IllegalStateException("Previous repeatable particle hasn't been ended yet!");
this.repeatableParticleValue = repeatableContainer;
- this.repeatableHandler = repeatableHandler;
}
}
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ElementPosition.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ElementPosition.java 2010-02-11 09:46:17 UTC (rev 4031)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ElementPosition.java 2010-02-11 11:06:02 UTC (rev 4032)
@@ -208,7 +208,7 @@
while (nextPosition.next != null)
{
nextPosition.notSkippedParent = nextPosition.previous.getLastNotSkipped();
- if (nextPosition.particle.isRepeatable())
+ if (nextPosition.repeatableHandler != null)
nextPosition.startRepeatableParticle();
nextPosition.stack = stack;
nextPosition.initValue(atts);
@@ -538,7 +538,7 @@
particle = new ParticleBinding(xsiElement, particle.getMinOccurs(), particle.getMaxOccurs(), particle.getMaxOccursUnbounded());
}
- if (occurrence == 1 && particle.isRepeatable())
+ if (occurrence == 1 && repeatableHandler != null)
startRepeatableParticle();
TypeBinding type = element.getType();
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/NonElementPosition.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/NonElementPosition.java 2010-02-11 09:46:17 UTC (rev 4031)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/NonElementPosition.java 2010-02-11 11:06:02 UTC (rev 4032)
@@ -100,7 +100,7 @@
while (nextPosition.next != null)
{
nextPosition.notSkippedParent = nextPosition.previous.getLastNotSkipped();
- if (nextPosition.particle.isRepeatable())
+ if (nextPosition.repeatableHandler != null)
nextPosition.startRepeatableParticle();
nextPosition.stack = stack;
nextPosition.initValue(atts);
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/TypeBinding.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/TypeBinding.java 2010-02-11 09:46:17 UTC (rev 4031)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/TypeBinding.java 2010-02-11 11:06:02 UTC (rev 4032)
@@ -49,7 +49,9 @@
* @version <tt>$Revision$</tt>
*/
public class TypeBinding
-{
+{
+ private static final List<ElementInterceptor> EMPTY_ICEPTOR_LIST = Collections.<ElementInterceptor>emptyList();
+
protected QName qName;
/** Map<QName, AttributeBinding> */
private Map<QName, AttributeBinding> attrs;
@@ -384,9 +386,9 @@
public List<ElementInterceptor> getInterceptors(QName qName)
{
if(interceptors == null)
- return Collections.<ElementInterceptor>emptyList();
+ return EMPTY_ICEPTOR_LIST;
List<ElementInterceptor> list = interceptors.get(qName);
- return list == null ? Collections.<ElementInterceptor>emptyList() : list;
+ return list == null ? EMPTY_ICEPTOR_LIST : list;
}
public TypeBinding getBaseType()
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java 2010-02-11 09:46:17 UTC (rev 4031)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java 2010-02-11 11:06:02 UTC (rev 4032)
@@ -907,7 +907,7 @@
// Create the handler
BeanInfo beanInfo = JBossXBBuilder.configuration.getBeanInfo(typeInfo);
BeanAdapterFactory beanAdapterFactory = createAdapterFactory(beanAdapterBuilderClass, beanInfo, factory);
- BeanHandler handler = new BeanHandler(beanInfo.getName(), beanAdapterFactory);
+ BeanHandler handler = new BeanHandler(beanInfo.getName(), beanAdapterFactory, typeBinding);
typeBinding.setHandler(handler);
if (trace)
log.trace("Created BeanHandler for type=" + beanInfo.getName() + " factory=" + factory);
@@ -1140,7 +1140,7 @@
ModelGroupBinding model = null;
boolean propOrderMissing = propertyNames.size() > 1 && determinePropertyOrder && accessOrder == XmlAccessOrder.UNDEFINED;
if(jbossXmlType != null && !JBossXmlConstants.DEFAULT.equals(jbossXmlType.modelGroup()))
- model = createModelGroup(jbossXmlType.modelGroup(), typeInfo, propOrderMissing, propertyOrder);
+ model = createModelGroup(jbossXmlType.modelGroup(), typeInfo, propOrderMissing, propertyOrder, null);
else if (allBinding)
model = new AllBinding(schemaBinding);
else
@@ -1163,15 +1163,8 @@
{
typeParticle.setMinOccurs(0);
typeParticle.setMaxOccursUnbounded(true);
-/* TypeInfo memberBaseType = typeInfo.getComponentType();
+ }
- JBossXmlModelGroup xmlModelGroup = ((ClassInfo) memberBaseType).getUnderlyingAnnotation(JBossXmlModelGroup.class);
- if (xmlModelGroup != null)
- {
- bindParticlesModelGroup(typeBinding, model, memberBaseType, xmlModelGroup, true, beanAdapterFactory, null);
- }
-*/ }
-
// Determine the wildcard handler
AbstractPropertyHandler wildcardHandler = null;
if (wildcardProperty != null)
@@ -1326,7 +1319,7 @@
particleBinding.setMaxOccurs(1);
model.addParticle(particleBinding);
- typeBinding.getWildcard().setWildcardHandler(childWildcardHandler);
+ typeBinding.getWildcard().setHandler(childWildcardHandler);
}
if (trace)
@@ -1525,7 +1518,8 @@
throw new IllegalStateException("Cannot wrap " + wrapperInfo.getName() + " not a bean type " + particleHandler);
BeanHandler beanHandler = (BeanHandler) particleHandler;
WrapperBeanAdapterFactory wrapperFactory = new WrapperBeanAdapterFactory(beanHandler.getBeanAdapterFactory(), propertyType.getType());
- BeanHandler wrapperHandler = new BeanHandler(wrapperInfo.getName(), wrapperFactory);
+ BeanHandler wrapperHandler = new BeanHandler(wrapperInfo.getName(), wrapperFactory, elementTypeBinding);
+ elementTypeBinding.setHandler(wrapperHandler);
// Steal the attributes
Collection<AttributeBinding> otherAttributes = wrapperTypeBinding.getAttributes();
@@ -1537,7 +1531,6 @@
wrapperHandler.getAttributesHandler().addAttribute(other);
}
}
- elementTypeBinding.setHandler(wrapperHandler);
elementTypeBinding.setSimpleType(wrapperTypeBinding.getSimpleType());
}
else
@@ -1891,7 +1884,6 @@
// handler for the model group members
BeanInfo groupBeanInfo = JBossXBBuilder.configuration.getBeanInfo(groupType);
BeanAdapterFactory propBeanAdapterFactory = createAdapterFactory(DefaultBeanAdapterBuilder.class, groupBeanInfo, null);
- BeanHandler propHandler = new GroupBeanHandler(groupBeanInfo.getName(), propBeanAdapterFactory);
String[] memberOrder = annotation.propOrder();
if (memberOrder.length == 0 || memberOrder[0].length() == 0)
@@ -1909,8 +1901,9 @@
if (trace)
log.trace("Property order for " + annotation.kind() + " property " + property.getName() + ": " + Arrays.asList(memberOrder));
- group = createModelGroup(annotation.kind(), groupType, memberOrder.length > 1 && propOrderMissing, annotation.propOrder());
+ group = createModelGroup(annotation.kind(), groupType, memberOrder.length > 1 && propOrderMissing, annotation.propOrder(), groupName);
group.setSkip(false);
+ GroupBeanHandler propHandler = new GroupBeanHandler(groupBeanInfo.getName(), propBeanAdapterFactory, group);
group.setHandler(propHandler);
// can't do it with global components
//group.setHandler(new SetParentOverrideHandler(propHandler, propertyHandler));
@@ -1925,13 +1918,7 @@
}
}
else
- group = createModelGroup(annotation.kind(), groupType, propOrderMissing, annotation.propOrder());
-
- if (groupName != null)
- {
- group.setQName(groupName);
- schemaBinding.addGroup(group.getQName(), group);
- }
+ group = createModelGroup(annotation.kind(), groupType, propOrderMissing, annotation.propOrder(), groupName);
if(property.getType().isArray())
group.setRepeatableHandler(new ArrayWrapperRepeatableParticleHandler(propertyHandler));
@@ -1983,7 +1970,7 @@
defaultNamespace = overridenDefaultNamespace;
}
- private ModelGroupBinding createModelGroup(String kind, TypeInfo type, boolean propOrderMissing, String[] propertyOrder)
+ private ModelGroupBinding createModelGroup(String kind, TypeInfo type, boolean propOrderMissing, String[] propertyOrder, QName groupName)
{
ModelGroupBinding group;
if (kind.equals(JBossXmlConstants.MODEL_GROUP_SEQUENCE))
@@ -2000,6 +1987,12 @@
group = new AllBinding(schemaBinding);
else
throw new IllegalStateException("Unexpected JBossXmlModelGroup.kind=" + kind + " for type " + type.getName());
+
+ if(groupName != null)
+ {
+ group.setQName(groupName);
+ schemaBinding.addGroup(groupName, group);
+ }
return group;
}
@@ -2248,7 +2241,7 @@
entryType = new TypeBinding();
entryType.setSchemaBinding(schemaBinding);
- BeanHandler entryHandler = new BeanHandler(entryInfo.getName(), entryAdapterFactory);
+ BeanHandler entryHandler = new BeanHandler(entryInfo.getName(), entryAdapterFactory, entryType);
entryType.setHandler(entryHandler);
entryTypeInfo = JBossXBBuilder.configuration.getTypeInfo(DefaultMapEntry.class);
@@ -2293,9 +2286,9 @@
keyValueSequence = new SequenceBinding(schemaBinding);
if(entryType == null)
{
- BeanHandler entryHandler = new BeanHandler(entryInfo.getName(), entryAdapterFactory);
keyValueSequence.setSkip(false);
keyValueSequence.setQName(propertyQName);
+ GroupBeanHandler entryHandler = new GroupBeanHandler(entryInfo.getName(), entryAdapterFactory, keyValueSequence);
schemaBinding.addGroup(keyValueSequence.getQName(), keyValueSequence);
ParticleBinding keyValueParticle = new ParticleBinding(keyValueSequence, 0, -1, true);
targetGroup.addParticle(keyValueParticle);
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/BeanHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/BeanHandler.java 2010-02-11 09:46:17 UTC (rev 4031)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/BeanHandler.java 2010-02-11 11:06:02 UTC (rev 4032)
@@ -25,12 +25,10 @@
import javax.xml.namespace.QName;
import org.jboss.logging.Logger;
-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.ParticleHandler;
import org.jboss.xb.binding.sunday.unmarshalling.RegisteredAttributesHandler;
-import org.jboss.xb.binding.sunday.unmarshalling.TermBinding;
+import org.jboss.xb.binding.sunday.unmarshalling.TypeBinding;
import org.jboss.xb.binding.sunday.unmarshalling.ValueAdapter;
import org.jboss.xb.spi.BeanAdapter;
import org.jboss.xb.spi.BeanAdapterFactory;
@@ -40,22 +38,25 @@
* BeanHandler.
*
* @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @author <a href="alex at jboss.com">Alexey Loubyansky</a>
* @version $Revision: 1.1 $
*/
-public class BeanHandler /*extends DefaultElementHandler*/ implements ParticleHandler
+public class BeanHandler implements ParticleHandler
{
/** The log */
protected static final Logger log = Logger.getLogger("org.jboss.xb.builder.runtime.BeanHandler");
/** Whether trace is enabled */
- private boolean trace = log.isTraceEnabled();
+ protected boolean trace = log.isTraceEnabled();
/** The bean name */
- private String name;
+ protected String name;
/** The BeanAdapter */
- private BeanAdapterFactory beanAdapterFactory;
+ protected BeanAdapterFactory beanAdapterFactory;
+ protected TypeBinding elementType;
+
private RegisteredAttributesHandler attrsHandler = new RegisteredAttributesHandler();
/**
@@ -65,14 +66,17 @@
* @param beanAdapterFactory the bean adapterFactory
* @throws IllegalArgumentException for a null parameter
*/
- public BeanHandler(String name, BeanAdapterFactory beanAdapterFactory)
+ public BeanHandler(String name, BeanAdapterFactory beanAdapterFactory, TypeBinding elementType)
{
if (name == null)
throw new IllegalArgumentException("Null name");
if (beanAdapterFactory == null)
throw new IllegalArgumentException("Null bean adapter factory");
+ if (elementType == null)
+ throw new IllegalArgumentException("Null element type");
this.name = name;
this.beanAdapterFactory = beanAdapterFactory;
+ this.elementType = elementType;
}
/**
@@ -104,12 +108,8 @@
throw new RuntimeException("QName " + elementName + " error invoking beanAdapterFactory.newInstance() for bean=" + name, t);
}
- TermBinding term = particle.getTerm();
- if (o != null && term.isElement())
- {
- ElementBinding element = (ElementBinding) term;
- attrsHandler.attributes(o, elementName, element.getType(), attrs, nsCtx);
- }
+ if (o != null)
+ attrsHandler.attributes(o, elementName, elementType, attrs, nsCtx);
return o;
}
@@ -119,19 +119,11 @@
if (trace)
log.trace("setParent " + qName + " parent=" + BuilderUtil.toDebugString(parent) + " child=" + BuilderUtil.toDebugString(o));
- TermBinding term = particle.getTerm();
- if(term.isModelGroup())
- {
- QName modelGroupName = ((ModelGroupBinding)term).getQName();
- if(modelGroupName != null)
- qName = modelGroupName;
- }
-
BeanAdapter beanAdapter = (BeanAdapter) parent;
AbstractPropertyHandler propertyHandler = beanAdapter.getPropertyHandler(qName);
if (propertyHandler == null)
{
- if (term.getSchema().isStrictSchema())
+ if (elementType.getSchemaBinding().isStrictSchema())
throw new RuntimeException("QName " + qName + " unknown property parent=" + BuilderUtil.toDebugString(parent) + " child=" + BuilderUtil.toDebugString(o) + " available=" + beanAdapter.getAvailable());
if (trace)
log.trace("QName " + qName + " unknown property parent=" + BuilderUtil.toDebugString(parent) + " child=" + BuilderUtil.toDebugString(o));
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/GroupBeanHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/GroupBeanHandler.java 2010-02-11 09:46:17 UTC (rev 4031)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/GroupBeanHandler.java 2010-02-11 11:06:02 UTC (rev 4032)
@@ -25,10 +25,12 @@
import javax.xml.namespace.QName;
import org.jboss.beans.info.spi.PropertyInfo;
+import org.jboss.logging.Logger;
import org.jboss.xb.binding.JBossXBRuntimeException;
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.binding.sunday.unmarshalling.ParticleHandler;
+import org.jboss.xb.binding.sunday.unmarshalling.ValueAdapter;
import org.jboss.xb.spi.BeanAdapter;
import org.jboss.xb.spi.BeanAdapterFactory;
import org.xml.sax.Attributes;
@@ -47,29 +49,46 @@
* @author <a href="alex at jboss.com">Alexey Loubyansky</a>
* @version $Revision: 1.1 $
*/
-public class GroupBeanHandler extends BeanHandler
+public class GroupBeanHandler implements ParticleHandler
{
+ /** The log */
+ protected static final Logger log = Logger.getLogger("org.jboss.xb.builder.runtime.GroupBeanHandler");
- public GroupBeanHandler(String name, BeanAdapterFactory beanAdapterFactory)
+ /** Whether trace is enabled */
+ protected boolean trace = log.isTraceEnabled();
+
+ /** The bean name */
+ protected String name;
+
+ /** The BeanAdapter */
+ protected BeanAdapterFactory beanAdapterFactory;
+
+ protected QName groupName;
+
+ public GroupBeanHandler(String name, BeanAdapterFactory beanAdapterFactory, ModelGroupBinding group)
{
- super(name, beanAdapterFactory);
+ if (name == null)
+ throw new IllegalArgumentException("Null name");
+ if (beanAdapterFactory == null)
+ throw new IllegalArgumentException("Null bean adapter factory");
+ if(group == null)
+ throw new IllegalArgumentException("Null group");
+ if(group.getQName() == null)
+ throw new JBossXBRuntimeException("The group has to have a non-null QName.");
+
+ this.name = name;
+ this.beanAdapterFactory = beanAdapterFactory;
+ this.groupName = group.getQName();
}
- @Override
public Object startParticle(Object parent, QName qName, ParticleBinding particle, Attributes attrs, NamespaceContext nsCtx)
{
+ if (trace)
+ log.trace(" startElement " + qName + " bean=" + name + " parent=" + BuilderUtil.toDebugString(parent));
+
if(!(parent instanceof BeanAdapter))
throw new JBossXBRuntimeException("Parent expected to be an instance of BeanAdapter: " + parent);
-
- TermBinding term = particle.getTerm();
- if(!term.isModelGroup())
- throw new JBossXBRuntimeException("The term expected to be a model group: " + term);
-
- ModelGroupBinding group = (ModelGroupBinding) term;
- QName groupName = group.getQName();
- if(groupName == null)
- throw new JBossXBRuntimeException("The group has to have a non-null QName. Failed to start element " + qName);
-
+
AbstractPropertyHandler groupHandler = ((BeanAdapter) parent).getPropertyHandler(groupName);
if (groupHandler == null)
throw new JBossXBRuntimeException("No property mapped for group " + qName + " in bean adapter" + ((BeanAdapter)parent).getValue()
@@ -92,11 +111,57 @@
}
if(groupValue == null || particle.isRepeatable())
- return super.startParticle(parent, qName, particle, attrs, nsCtx);
+ {
+ try
+ {
+ return beanAdapterFactory.newInstance();
+ }
+ catch (Throwable t)
+ {
+ throw new RuntimeException("Element " + qName + " (group " + groupName +") error invoking beanAdapterFactory.newInstance() for bean=" + name, t);
+ }
+
+ }
else
- return new SingletonBeanAdapter(this.getBeanAdapterFactory(), groupValue);
+ return new SingletonBeanAdapter(beanAdapterFactory, groupValue);
}
-
+
+ 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));
+
+ BeanAdapter beanAdapter = (BeanAdapter) parent;
+ AbstractPropertyHandler propertyHandler = beanAdapter.getPropertyHandler(groupName);
+ if (propertyHandler == null)
+ {
+ if (particle.getTerm().getSchema().isStrictSchema())
+ throw new RuntimeException("QName " + qName + " unknown property parent=" + BuilderUtil.toDebugString(parent) + " child=" + BuilderUtil.toDebugString(o) + " available=" + beanAdapter.getAvailable());
+ if (trace)
+ log.trace("QName " + qName + " unknown property parent=" + BuilderUtil.toDebugString(parent) + " child=" + BuilderUtil.toDebugString(o));
+ return;
+ }
+
+ propertyHandler.doHandle(beanAdapter, o, qName);
+ }
+
+ public Object endParticle(Object o, QName qName, ParticleBinding particle)
+ {
+ if (trace)
+ log.trace("endElement " + qName + " o=" + BuilderUtil.toDebugString(o));
+
+ BeanAdapter beanAdapter = (BeanAdapter) o;
+ Object value = beanAdapter.getValue();
+
+ if(!particle.isRepeatable())
+ {
+ ValueAdapter valueAdapter = particle.getTerm().getValueAdapter();
+ if (valueAdapter != null)
+ value = valueAdapter.cast(value, null);
+ }
+ return value;
+ }
+
private static class SingletonBeanAdapter extends BeanAdapter
{
private final Object value;
More information about the jboss-svn-commits
mailing list