[jboss-svn-commits] JBoss Common SVN: r3674 - in jbossxb/trunk/src: main/java/org/jboss/xb/builder and 11 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Wed Nov 11 11:42:15 EST 2009
Author: alex.loubyansky at jboss.com
Date: 2009-11-11 11:42:15 -0500 (Wed, 11 Nov 2009)
New Revision: 3674
Added:
jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/ArrayWrapperRepeatableParticleHandler.java
jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/element/xmlelements/
jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/element/xmlelements/support/
jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/element/xmlelements/support/Foo4.java
jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/element/xmlelements/test/
jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/element/xmlelements/test/XmlElementsUnitTestCase.java
jbossxb/trunk/src/test/resources/org/jboss/test/xb/builder/object/element/wrapper/test/Wrapper_testFoo5Wrapper.xml
jbossxb/trunk/src/test/resources/org/jboss/test/xb/builder/object/element/xmlelements/
jbossxb/trunk/src/test/resources/org/jboss/test/xb/builder/object/element/xmlelements/test/
jbossxb/trunk/src/test/resources/org/jboss/test/xb/builder/object/element/xmlelements/test/XmlElements_testArray.xml
Removed:
jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/ArraySequenceBinding.java
jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/ArrayWrapper.java
Modified:
jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SundayContentHandler.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/BuilderParticleHandler.java
jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/PropertyHandler.java
jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/PropertyInterceptor.java
jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/PropertyWildcardHandler.java
jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/element/wrapper/test/WrapperUnitTestCase.java
jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/type/xmlanyelement/test/ArrayElementWildcardUnitTestCase.java
jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/type/xmlanyelement/test/ArrayObjectWildcardUnitTestCase.java
Log:
JBXB-231
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SundayContentHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SundayContentHandler.java 2009-11-11 15:41:50 UTC (rev 3673)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SundayContentHandler.java 2009-11-11 16:42:15 UTC (rev 3674)
@@ -187,8 +187,14 @@
StackItem parentItem = stack.peek();
if(parentItem.repeatableParticleValue != null)
{
- endRepeatableParticle(parentItem.o, parentItem.repeatableParticleValue, item.qName, item.particle, parentItem.particle);
- parentItem.repeatableParticleValue = null;
+ // TODO this has to be done for every endRepeatableParticle
+ StackItem notSkippedParent = parentItem;
+ if(parentItem.particle.getTerm().isSkip())
+ notSkippedParent = stack.peek1();
+ int i = stack.size() - 2;
+ while(notSkippedParent.particle.getTerm().isSkip() && i >= 0)
+ notSkippedParent = stack.peek(i--);
+ endRepeatableParticle(parentItem, item.qName, item.particle, notSkippedParent.particle);
}
}
}
@@ -210,9 +216,7 @@
TermBinding term = currentParticle.getTerm();
if(item.repeatableParticleValue != null /* && currentParticle.isRepeatable()*/ && term.isWildcard())
{
- StackItem parentItem = stack.peek1();
- endRepeatableParticle(parentItem.o, item.repeatableParticleValue, item.qName, currentParticle, parentItem.particle);
- item.repeatableParticleValue = null;
+ endRepeatableParticle(item, item.qName, currentParticle, item.particle);
}
pop();
@@ -221,8 +225,7 @@
StackItem parentItem = stack.peek();
if(parentItem.repeatableParticleValue != null)
{
- endRepeatableParticle(parentItem.o, parentItem.repeatableParticleValue, item.qName, item.particle, parentItem.particle);
- parentItem.repeatableParticleValue = null;
+ endRepeatableParticle(parentItem, item.qName, item.particle, parentItem.particle);
}
}
}
@@ -325,8 +328,7 @@
pop();
if(parentItem.repeatableParticleValue != null)
{
- endRepeatableParticle(parentItem.o, parentItem.repeatableParticleValue, item.qName, item.particle, parentItem.particle);
- parentItem.repeatableParticleValue = null;
+ endRepeatableParticle(parentItem, item.qName, item.particle, parentItem.particle);
}
continue;
}
@@ -349,8 +351,7 @@
StackItem parentItem = stack.peek();
if(parentItem.repeatableParticleValue != null)
{
- endRepeatableParticle(parentItem.o, parentItem.repeatableParticleValue, item.qName, item.particle, parentItem.particle);
- parentItem.repeatableParticleValue = null;
+ endRepeatableParticle(parentItem, item.qName, item.particle, parentItem.particle);
}
}
continue;
@@ -420,12 +421,12 @@
ParticleBinding modelGroupParticle = cursor.getParticle();
if(modelGroupParticle.isRepeatable())
{
- stack.peek().repeatableParticleValue = startRepeatableParticle(o, startName, modelGroupParticle);
+ startRepeatableParticle(stack.peek(), o, startName, modelGroupParticle);
}
handler = getHandler(modelGroupParticle);
o = handler.startParticle(o, startName, modelGroupParticle, atts, nsRegistry);
- push(startName, cursor, o, handler, parentType);
+ push(startName, cursor, o, handler, parentType);
}
particle = cursor.getCurrentParticle();
}
@@ -492,14 +493,12 @@
if(item.repeatableParticleValue != null &&
prevParticle != null && prevParticle.isRepeatable() && prevParticle.getTerm().isModelGroup())
{
- StackItem parentItem = stack.peek1();
- endRepeatableParticle(parentItem.o, item.repeatableParticleValue, item.qName, prevParticle, parentItem.particle);
- item.repeatableParticleValue = null;
+ endRepeatableParticle(item, item.qName, prevParticle, item.particle);
}
if(newCursors.size() > 1 && curParticle.isRepeatable())
{
- stack.peek().repeatableParticleValue = startRepeatableParticle(stack.peek1().o, startName, curParticle);
+ startRepeatableParticle(stack.peek1(), stack.peek1().o, startName, curParticle);
}
}
else
@@ -548,7 +547,7 @@
if(!repeatedParticle && particle.isRepeatable())
{
- stack.peek().repeatableParticleValue = startRepeatableParticle(parent, startName, particle);
+ startRepeatableParticle(stack.peek(), parent, startName, particle);
}
particle = new ParticleBinding(element/*, particle.getMinOccurs(), particle.getMaxOccurs(), particle.getMaxOccursUnbounded()*/);
}
@@ -603,7 +602,7 @@
if(!repeated && particle.isRepeatable())
{
- stack.peek().repeatableParticleValue = startRepeatableParticle(parent, startName, particle);
+ startRepeatableParticle(stack.peek(), parent, startName, particle);
}
TypeBinding type = element.getType();
@@ -801,23 +800,29 @@
}
}
- private Object startRepeatableParticle(Object parent, QName startName, ParticleBinding particle)
+ private void startRepeatableParticle(StackItem parentItem, Object parent, QName startName, ParticleBinding particle)
{
if(trace)
log.trace(" start repeatable (" + stack.size() + "): " + particle.getTerm());
RepeatableParticleHandler repeatableHandler = particle.getTerm().getRepeatableHandler();
// the way it is now it's never null
- return repeatableHandler.startRepeatableParticle(parent, startName, particle);
+ Object repeatableContainer = repeatableHandler.startRepeatableParticle(parent, startName, particle);
+ if(repeatableContainer != null)
+ {
+ parentItem.repeatableParticleValue = repeatableContainer;
+ parentItem.repeatableHandler = repeatableHandler;
+ }
}
- private void endRepeatableParticle(Object parent, Object o, QName elementName, ParticleBinding particle, ParticleBinding parentParticle)
+ private void endRepeatableParticle(StackItem parentItem, QName elementName, ParticleBinding particle, ParticleBinding parentParticle)
{
if (trace)
log.trace(" end repeatable (" + stack.size() + "): " + particle.getTerm());
-
- RepeatableParticleHandler repeatableHandler = particle.getTerm().getRepeatableHandler();
+ RepeatableParticleHandler repeatableHandler = parentItem.repeatableHandler; //particle.getTerm().getRepeatableHandler();
// the way it is now it's never null
- repeatableHandler.endRepeatableParticle(parent, o, elementName, particle, parentParticle);
+ repeatableHandler.endRepeatableParticle(parentItem.o, parentItem.repeatableParticleValue, elementName, particle, parentParticle);
+ parentItem.repeatableParticleValue = null;
+ parentItem.repeatableHandler = null;
}
private void endParticle(StackItem item, StackItem parentItem)
@@ -838,7 +843,7 @@
//item = (StackItem)stack.peek(parentStackPos);
if(parentItem.o != null)
{
- ParticleBinding parentParticle = getParentParticle();//item.particle;
+ ParticleBinding parentParticle = getNotSkippedParent().particle;//item.particle;
if(parentParticle == null)
parentParticle = parentItem.particle;
@@ -846,8 +851,8 @@
setParent(handler, parentItem.o, o, item.qName, modelGroupParticle, parentParticle);
else
{
- RepeatableParticleHandler repeatableHandler = modelGroupParticle.getTerm().getRepeatableHandler();
- repeatableHandler.addTermValue(parentItem.repeatableParticleValue, o, item.qName, modelGroupParticle, parentParticle, handler);
+ //RepeatableParticleHandler repeatableHandler = modelGroupParticle.getTerm().getRepeatableHandler();
+ parentItem.repeatableHandler.addTermValue(parentItem.repeatableParticleValue, o, item.qName, modelGroupParticle, parentParticle, handler);
}
}
}
@@ -932,22 +937,22 @@
}
}
- private ParticleBinding getParentParticle()
+ private StackItem getNotSkippedParent()
{
StackItem item = stack.peek1();
if(item == null)
return null;
ParticleBinding particle = item.particle;
- if(!particle.getTerm().isSkip())
- return particle;
+ if(!particle.getTerm().isSkip() || item.repeatableParticleValue != null)
+ return item;
for(int i = stack.size() - 3; i >= 0; --i)
{
item = stack.peek(i);
particle = item.particle;
- if(!particle.getTerm().isSkip())
- return particle;
+ if(!particle.getTerm().isSkip() || item.repeatableParticleValue != null)
+ return item;
}
return null;
}
@@ -1061,7 +1066,7 @@
{
ctx.parent = o;
ctx.particle = particle;
- ctx.parentParticle = getParentParticle();
+ ctx.parentParticle = getNotSkippedParent().particle;
unmarshalled = beforeSetParent.beforeSetParent(unmarshalled, ctx);
ctx.clear();
}
@@ -1118,7 +1123,10 @@
if(allInterceptors == 0)
{
- ParticleBinding parentParticle = getParentParticle();
+ StackItem notSkippedParentItem = getNotSkippedParent();
+ if(notSkippedParentItem != null)
+ {
+ ParticleBinding parentParticle = notSkippedParentItem.particle;
boolean hasWildcard = false;
if (parentParticle != null && parentParticle.getTerm().isElement())
{
@@ -1137,12 +1145,11 @@
if(parent != null)
{
- if(parentItem.repeatableParticleValue == null)
+ if(notSkippedParentItem.repeatableParticleValue == null)
setParent(handler, parent, o, endName, particle, parentParticle);
else
{
- RepeatableParticleHandler repeatableHandler = particle.getTerm().getRepeatableHandler();
- repeatableHandler.addTermValue(parentItem.repeatableParticleValue, o, endName, particle, parentParticle, handler);
+ notSkippedParentItem.repeatableHandler.addTermValue(notSkippedParentItem.repeatableParticleValue, o, endName, particle, parentParticle, handler);
}
}
else if(parentParticle != null && hasWildcard && stack.size() > 1)
@@ -1159,6 +1166,7 @@
if(trace)
log.trace("Value of " + endName + " " + o + " is promoted as the value of its parent element.");
}
+ }
}
else
{
@@ -1282,6 +1290,7 @@
boolean ignoreCharacters;
Object o;
Object repeatableParticleValue;
+ RepeatableParticleHandler repeatableHandler;
StringBuffer textContent;
Boolean indentation;
boolean ignorableCharacters = true;
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java 2009-11-11 15:41:50 UTC (rev 3673)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java 2009-11-11 16:42:15 UTC (rev 3674)
@@ -117,7 +117,7 @@
import org.jboss.xb.binding.sunday.unmarshalling.WildcardBinding;
import org.jboss.xb.builder.runtime.AbstractPropertyHandler;
import org.jboss.xb.builder.runtime.AnyAttributePropertyHandler;
-import org.jboss.xb.builder.runtime.ArraySequenceBinding;
+import org.jboss.xb.builder.runtime.ArrayWrapperRepeatableParticleHandler;
import org.jboss.xb.builder.runtime.BeanHandler;
import org.jboss.xb.builder.runtime.BuilderParticleHandler;
import org.jboss.xb.builder.runtime.BuilderSimpleParticleHandler;
@@ -1241,7 +1241,6 @@
// 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());
@@ -1274,8 +1273,15 @@
particleBinding.setMinOccurs(0);
particleBinding.setMaxOccurs(1);
localModel.addParticle(particleBinding);
- typeBinding.getWildcard().setWildcardHandler((ParticleHandler) wildcardHandler);
+
+ wildcard.setWildcardHandler((ParticleHandler) wildcardHandler);
beanAdapterFactory.setWildcardHandler(wildcardHandler);
+
+ if(wildcardType.isArray())
+ {
+ particleBinding.setMaxOccursUnbounded(true);
+ wildcard.setRepeatableHandler(new ArrayWrapperRepeatableParticleHandler(beanAdapterFactory));
+ }
}
JBossXmlChildWildcard childWildcard = typeInfo.getUnderlyingAnnotation(JBossXmlChildWildcard.class);
@@ -1362,15 +1368,9 @@
XmlType propertyXmlType = null;
JBossXmlModelGroup propertyXmlModelGroup = null;
// Setup any new model
- if (propertyType.isArray())
+ if (propertyType.isCollection())
{
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");
JBossXmlCollection xmlCol = property.getUnderlyingAnnotation(JBossXmlCollection.class);
if (xmlCol != null)
@@ -1437,8 +1437,9 @@
String wrapperNamespace = xmlWrapper.namespace();
String wrapperName = xmlWrapper.name();
QName wrapperQName = generateXmlName(property.getName(), elementForm, wrapperNamespace, wrapperName);
- localModel = bindXmlElementWrapper(propertyType, localModel, xmlWrapper, wrapperQName);
+ localModel = bindXmlElementWrapper(beanAdapterFactory, propertyType, localModel, xmlWrapper, wrapperQName);
beanAdapterFactory.addProperty(wrapperQName, new PropertyHandler(property, propertyType));
+
if (trace)
log.trace("Added property " + wrapperQName + " for type=" + property.getBeanInfo().getName() + " property="
+ property.getName() + " as a wrapper element");
@@ -1454,6 +1455,10 @@
particleBinding.setMaxOccursUnbounded(true);
localModel.addParticle(particleBinding);
localModel = choice;
+
+ if(xmlWrapper == null && propertyType.isArray())
+ choice.setRepeatableHandler(new ArrayWrapperRepeatableParticleHandler(beanAdapterFactory));
+
if (trace)
log.trace("XmlElements seen adding choice for type=" + property.getBeanInfo().getName() + " property=" + property.getName());
}
@@ -1711,10 +1716,10 @@
else
propertyHandler = new PropertyHandler(property, localPropertyType);
}
+ else if(elements.length > 1 && propertyType.isArray())
+ propertyHandler = new PropertyHandler(property, propertyType);
else
- {
propertyHandler = new PropertyHandler(property, localPropertyType);
- }
ParticleBinding particle;
if(Element.class.getName().equals(propertyType.getName()))
@@ -1756,8 +1761,15 @@
elementBinding.setNillable(nillable);
elementBinding.setValueAdapter(valueAdapter);
if(repeatableHandler != null)
+ {
elementBinding.setRepeatableHandler(repeatableHandler);
-
+ }
+ else if(elements.length == 1 && propertyType.isArray() && xmlWrapper == null)
+ {
+ isCol = true;
+ elementBinding.setRepeatableHandler(new ArrayWrapperRepeatableParticleHandler(beanAdapterFactory));
+ }
+
JBossXmlPreserveWhitespace preserveSpace = property.getUnderlyingAnnotation(JBossXmlPreserveWhitespace.class);
if (preserveSpace != null)
{
@@ -1933,7 +1945,7 @@
return group;
}
- private SequenceBinding bindXmlElementWrapper(TypeInfo propertyType, ModelGroupBinding parentModel, XmlElementWrapper annotation, QName wrapperQName)
+ private SequenceBinding bindXmlElementWrapper(BeanAdapterFactory beanAdapterFactory, TypeInfo propertyType, ModelGroupBinding parentModel, XmlElementWrapper annotation, QName wrapperQName)
{
TypeBinding wrapperType = new TypeBinding();
SequenceBinding seq = new SequenceBinding(schemaBinding);
@@ -1945,8 +1957,12 @@
ElementBinding wrapperElement = createElementBinding(propertyType, wrapperType, wrapperQName, false);
wrapperElement.setNillable(annotation.nillable());
wrapperElement.setSkip(Boolean.TRUE);
- particle = new ParticleBinding(wrapperElement, annotation.required() ? 1 : 0, 1, propertyType.isCollection());
+ particle = new ParticleBinding(wrapperElement, annotation.required() ? 1 : 0, 1, propertyType.isCollection() || propertyType.isArray());
parentModel.addParticle(particle);
+
+ if(propertyType.isArray())
+ wrapperElement.setRepeatableHandler(new ArrayWrapperRepeatableParticleHandler(beanAdapterFactory));
+
return seq;
}
@@ -1966,27 +1982,6 @@
}
/**
- * Create an array
- *
- * @param localModel the current model
- * @return the new local model
- */
- private ModelGroupBinding createArray(ModelGroupBinding localModel)
- {
- SequenceBinding sequenceBinding = new SequenceBinding(schemaBinding);
- sequenceBinding.setHandler(BuilderParticleHandler.INSTANCE);
- ArraySequenceBinding arraySequenceBinding = new ArraySequenceBinding(schemaBinding);
- arraySequenceBinding.setHandler(BuilderParticleHandler.INSTANCE);
- ParticleBinding particle = new ParticleBinding(sequenceBinding);
- particle.setMinOccurs(0);
- particle.setMaxOccursUnbounded(true);
- arraySequenceBinding.addParticle(particle);
- particle = new ParticleBinding(arraySequenceBinding);
- localModel.addParticle(particle);
- return sequenceBinding;
- }
-
- /**
* Create a collection
*
* @param localModel the current model
Deleted: jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/ArraySequenceBinding.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/ArraySequenceBinding.java 2009-11-11 15:41:50 UTC (rev 3673)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/ArraySequenceBinding.java 2009-11-11 16:42:15 UTC (rev 3674)
@@ -1,44 +0,0 @@
-/*
-* 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.builder.runtime;
-
-import org.jboss.xb.binding.sunday.unmarshalling.SchemaBinding;
-import org.jboss.xb.binding.sunday.unmarshalling.SequenceBinding;
-
-/**
- * Just a tagging class
- *
- * @author <a href="adrian at jboss.com">Adrian Brock</a>
- * @version $Revision: 1.1 $
- */
-public class ArraySequenceBinding extends SequenceBinding
-{
- /**
- * Create a new ArraySequenceBinding.
- *
- * @param schema the schema
- */
- public ArraySequenceBinding(SchemaBinding schema)
- {
- super(schema);
- }
-}
Deleted: jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/ArrayWrapper.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/ArrayWrapper.java 2009-11-11 15:41:50 UTC (rev 3673)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/ArrayWrapper.java 2009-11-11 16:42:15 UTC (rev 3674)
@@ -1,168 +0,0 @@
-/*
-* 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.builder.runtime;
-
-import java.util.ArrayList;
-
-import javax.xml.namespace.QName;
-
-import org.jboss.reflect.spi.ArrayInfo;
-import org.jboss.reflect.spi.TypeInfo;
-import org.jboss.xb.binding.sunday.unmarshalling.ParticleBinding;
-
-/**
- * ArrayWrapper.
- *
- * @author <a href="adrian at jboss.com">Adrian Brock</a>
- * @version $Revision: 1.1 $
- */
-public class ArrayWrapper
-{
- /** The parent */
- private Object parent;
-
- /** The element name */
- private QName elementName;
-
- /** The elements */
- private ArrayList<Object> elements = new ArrayList<Object>();
-
- /** The parent particle */
- private ParticleBinding parentParticle;
-
- /** The child particle */
- private ParticleBinding childParticle;
-
- /**
- * Create a new ArrayWrapper.
- *
- * @param parent the parent
- * @param elementName the elementName
- */
- public ArrayWrapper(Object parent, QName elementName)
- {
- this.parent = parent;
- this.elementName = elementName;
- }
-
- /**
- * The elements
- *
- * @return the elements
- */
- public ArrayList<Object> getElements()
- {
- return elements;
- }
-
- /**
- * Get the parent
- *
- * @return the parent
- */
- public Object getParent()
- {
- return parent;
- }
-
- /**
- * Get the elementName.
- *
- * @return the elementName.
- */
- public QName getElementName()
- {
- return elementName;
- }
-
- /**
- * Add to the array
- *
- * @param obj the object
- */
- public void add(Object obj)
- {
- elements.add(obj);
- }
-
- /**
- * Get the childParticle.
- *
- * @return the childParticle.
- */
- public ParticleBinding getChildParticle()
- {
- return childParticle;
- }
-
- /**
- * Set the childParticle.
- *
- * @param childParticle the childParticle.
- */
- public void setChildParticle(ParticleBinding childParticle)
- {
- this.childParticle = childParticle;
- }
-
- /**
- * Get the parentParticle.
- *
- * @return the parentParticle.
- */
- public ParticleBinding getParentParticle()
- {
- return parentParticle;
- }
-
- /**
- * Set the parentParticle.
- *
- * @param parentParticle the parentParticle.
- */
- public void setParentParticle(ParticleBinding parentParticle)
- {
- this.parentParticle = parentParticle;
- }
-
- /**
- * Get the elements
- *
- * @param propertyType the property type
- * @return the array
- */
- public Object[] getArray(TypeInfo propertyType)
- {
- ArrayInfo arrayInfo = (ArrayInfo) propertyType;
- try
- {
- Object[] result = (Object[]) arrayInfo.newArrayInstance(elements.size());
- for (int i = 0; i < result.length; ++i)
- result[i] = elements.get(i);
- return result;
- }
- catch (Throwable t)
- {
- throw new RuntimeException("Error creating array of type " + arrayInfo.getName() + " from " + elements, t);
- }
- }
-}
Added: jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/ArrayWrapperRepeatableParticleHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/ArrayWrapperRepeatableParticleHandler.java (rev 0)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/ArrayWrapperRepeatableParticleHandler.java 2009-11-11 16:42:15 UTC (rev 3674)
@@ -0,0 +1,132 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2009, 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.builder.runtime;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import org.jboss.logging.Logger;
+import org.jboss.reflect.spi.ArrayInfo;
+import org.jboss.xb.binding.sunday.unmarshalling.ParticleBinding;
+import org.jboss.xb.binding.sunday.unmarshalling.ParticleHandler;
+import org.jboss.xb.binding.sunday.unmarshalling.RepeatableParticleHandler;
+import org.jboss.xb.binding.sunday.unmarshalling.ValueAdapter;
+import org.jboss.xb.spi.BeanAdapterFactory;
+
+/**
+ * A ArrayWrapperRepeatableParticleHandler.
+ *
+ * @author <a href="alex at jboss.com">Alexey Loubyansky</a>
+ * @version $Revision: 1.1 $
+ */
+public class ArrayWrapperRepeatableParticleHandler implements RepeatableParticleHandler
+{
+ /** The log */
+ protected static final Logger log = Logger.getLogger(ArrayWrapperRepeatableParticleHandler.class);
+
+ /** Whether trace is enabled */
+ protected boolean trace = log.isTraceEnabled();
+
+
+ private final BeanAdapterFactory beanAdapterFactory;
+
+ public ArrayWrapperRepeatableParticleHandler(BeanAdapterFactory beanAdapterFactory)
+ {
+ if(beanAdapterFactory == null)
+ throw new IllegalArgumentException("beanAdapterFactory is null");
+ this.beanAdapterFactory = beanAdapterFactory;
+ }
+
+ @Override
+ public void addTermValue(Object particleValue, Object termValue, QName elementName, ParticleBinding particle,
+ ParticleBinding parentParticle, ParticleHandler handler)
+ {
+ if(particle.getTerm().isSkip())
+ return;
+ ValueAdapter valueAdapter = particle.getTerm().getValueAdapter();
+ if(valueAdapter != null)
+ termValue = valueAdapter.cast(termValue, null);
+ //ArrayWrapper aw = (ArrayWrapper) particleValue;
+ //aw.add(termValue);
+ ((List<Object>)particleValue).add(termValue);
+
+ if(trace)
+ log.trace("added " + elementName + " " + termValue);
+ }
+
+ @Override
+ public void endRepeatableParticle(Object parent, Object o, QName elementName, ParticleBinding particle,
+ ParticleBinding parentParticle)
+ {
+ if(trace)
+ log.trace("endRepeatableParticle " + elementName);
+
+ AbstractPropertyHandler propertyHandler = beanAdapterFactory.getPropertyHandler(elementName);
+ if (propertyHandler == null)
+ {
+ AbstractPropertyHandler wildcardHandler = beanAdapterFactory.getWildcardHandler();
+ if (wildcardHandler != null && o != null)
+ {
+ o = toArray((List<Object>) o, (ArrayInfo) wildcardHandler.getPropertyType());
+ wildcardHandler.doHandle(parent, o, elementName);
+ return;
+ }
+
+ if (particle.getTerm().getSchema().isStrictSchema())
+ throw new RuntimeException("QName " + elementName + " unknown property parent=" + BuilderUtil.toDebugString(parent) + " child=" + BuilderUtil.toDebugString(o) + " available=" + beanAdapterFactory.getAvailable());
+
+ if (trace)
+ log.trace("QName " + elementName + " unknown property parent=" + BuilderUtil.toDebugString(parent) + " child=" + BuilderUtil.toDebugString(o));
+
+ return;
+ }
+
+ o = toArray((List<Object>) o, (ArrayInfo) propertyHandler.getPropertyType());
+ propertyHandler.doHandle(parent, o, elementName);
+ }
+
+ @Override
+ public Object startRepeatableParticle(Object parent, QName startName, ParticleBinding particle)
+ {
+ if(trace)
+ log.trace("startRepeatableParticle " + startName);
+ return new ArrayList<Object>();
+ }
+
+ private Object[] toArray(List<Object> elements, ArrayInfo arrayInfo)
+ {
+ Object[] arr;
+ try
+ {
+ arr = (Object[]) arrayInfo.newArrayInstance(elements.size());
+ for (int i = 0; i < arr.length; ++i)
+ arr[i] = elements.get(i);
+ return arr;
+ }
+ catch (Throwable t)
+ {
+ throw new RuntimeException("Error creating array of type " + arrayInfo.getName() + " from " + elements, t);
+ }
+ }
+}
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 2009-11-11 15:41:50 UTC (rev 3673)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/BeanHandler.java 2009-11-11 16:42:15 UTC (rev 3674)
@@ -132,38 +132,13 @@
valueAdapter = ((ElementBinding)term).getValueAdapter();
}
- if (parent != null && parent instanceof ArrayWrapper)
- {
- ArrayWrapper wrapper = (ArrayWrapper) parent;
- wrapper.add(o);
- wrapper.setChildParticle(particle);
- wrapper.setParentParticle(parentParticle);
- return;
- }
-
- BeanAdapter beanAdapter;
- if (parent instanceof ArrayWrapper)
- beanAdapter = (BeanAdapter) ((ArrayWrapper) parent).getParent();
- else
- beanAdapter = (BeanAdapter) parent;
+ BeanAdapter beanAdapter = (BeanAdapter) parent;
AbstractPropertyHandler propertyHandler = beanAdapter.getPropertyHandler(qName);
if (propertyHandler == null)
{
- AbstractPropertyHandler wildcardHandler = beanAdapter.getWildcardHandler();
- if (wildcardHandler != null)
- {
- if (o != null && o instanceof ArrayWrapper)
- {
- ArrayWrapper wrapper = (ArrayWrapper) o;
- wildcardHandler.doHandle(beanAdapter, wrapper, wrapper.getElementName());
- return;
- }
- }
TermBinding element = term;
if (element.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;
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/BuilderParticleHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/BuilderParticleHandler.java 2009-11-11 15:41:50 UTC (rev 3673)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/BuilderParticleHandler.java 2009-11-11 16:42:15 UTC (rev 3674)
@@ -44,9 +44,6 @@
public Object startParticle(Object parent, QName elementName, ParticleBinding particle, Attributes attrs, NamespaceContext nsCtx)
{
- TermBinding term = particle.getTerm();
- if (term instanceof ArraySequenceBinding)
- return new ArrayWrapper(parent, elementName);
return parent;
}
@@ -67,35 +64,12 @@
}
if(particleHandler != null)
- {
- if (parent != null && parent instanceof ArrayWrapper)
- {
- ArrayWrapper wrapper = (ArrayWrapper) parent;
- wrapper.add(o);
- wrapper.setChildParticle(particle);
- wrapper.setParentParticle(parentParticle);
- return;
- }
-
particleHandler.setParent(parent, o, elementName, particle, parentParticle);
- }
}
}
public Object endParticle(Object o, QName elementName, ParticleBinding particle)
{
- TermBinding term = particle.getTerm();
- if (term instanceof ArraySequenceBinding)
- {
- ArrayWrapper wrapper = (ArrayWrapper) o;
- Object parent = wrapper.getParent();
- ParticleBinding childParticle = wrapper.getChildParticle();
- ParticleBinding parentParticle = wrapper.getParentParticle();
- ElementBinding elementBinding = (ElementBinding) parentParticle.getTerm();
- ParticleHandler particleHandler = elementBinding.getType().getHandler();
- particleHandler.setParent(parent, wrapper, wrapper.getElementName(), childParticle, parentParticle);
- return parent;
- }
return o;
}
}
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/PropertyHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/PropertyHandler.java 2009-11-11 15:41:50 UTC (rev 3673)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/PropertyHandler.java 2009-11-11 16:42:15 UTC (rev 3674)
@@ -52,11 +52,6 @@
{
try
{
- if (propertyType.isArray())
- {
- ArrayWrapper wrapper = (ArrayWrapper) child;
- child = wrapper.getArray(propertyType);
- }
BeanAdapter beanAdapter = (BeanAdapter) parent;
beanAdapter.set(propertyInfo, child);
}
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/PropertyInterceptor.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/PropertyInterceptor.java 2009-11-11 15:41:50 UTC (rev 3673)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/PropertyInterceptor.java 2009-11-11 16:42:15 UTC (rev 3674)
@@ -74,11 +74,6 @@
log.trace("setParent " + qName + " parent=" + BuilderUtil.toDebugString(parent) + " child=" + BuilderUtil.toDebugString(child) +" property=" + propertyInfo.getName());
try
{
- if (propertyType.isArray())
- {
- ArrayWrapper wrapper = (ArrayWrapper) child;
- child = wrapper.getArray(propertyType);
- }
BeanAdapter beanAdapter = (BeanAdapter) parent;
beanAdapter.set(propertyInfo, child);
}
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/PropertyWildcardHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/PropertyWildcardHandler.java 2009-11-11 15:41:50 UTC (rev 3673)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/builder/runtime/PropertyWildcardHandler.java 2009-11-11 16:42:15 UTC (rev 3674)
@@ -58,15 +58,6 @@
public void setParent(Object parent, Object o, QName elementName, ParticleBinding particle, ParticleBinding parentParticle)
{
- if (parent != null && parent instanceof ArrayWrapper)
- {
- ArrayWrapper wrapper = (ArrayWrapper) parent;
- wrapper.add(o);
- wrapper.setChildParticle(particle);
- wrapper.setParentParticle(parentParticle);
- return;
- }
-
BeanAdapter beanAdapter = (BeanAdapter) parent;
AbstractPropertyHandler propertyHandler = beanAdapter.getPropertyHandler(elementName);
if (propertyHandler != null)
Modified: jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/element/wrapper/test/WrapperUnitTestCase.java
===================================================================
--- jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/element/wrapper/test/WrapperUnitTestCase.java 2009-11-11 15:41:50 UTC (rev 3673)
+++ jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/element/wrapper/test/WrapperUnitTestCase.java 2009-11-11 16:42:15 UTC (rev 3674)
@@ -69,4 +69,15 @@
assertEquals(new Float(1.1), items[2]);
assertEquals(new MyNumber("123456789"), items[3]);
}
+
+ public void testFoo5Wrapper() throws Exception
+ {
+ Foo4 foo = unmarshalObject(Foo4.class);
+ Number[] items = foo.getItems();
+ assertEquals(4, items.length);
+ assertEquals(1, items[0]);
+ assertEquals(2, items[1]);
+ assertEquals(new Float(1.1), items[2]);
+ assertEquals(new MyNumber("123456789"), items[3]);
+ }
}
Added: jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/element/xmlelements/support/Foo4.java
===================================================================
--- jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/element/xmlelements/support/Foo4.java (rev 0)
+++ jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/element/xmlelements/support/Foo4.java 2009-11-11 16:42:15 UTC (rev 3674)
@@ -0,0 +1,26 @@
+package org.jboss.test.xb.builder.object.element.xmlelements.support;
+
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElements;
+import javax.xml.bind.annotation.XmlRootElement;
+
+ at XmlRootElement
+public class Foo4
+{
+ private Number[] items;
+
+ public Number[] getItems()
+ {
+ return items;
+ }
+
+ @XmlElements({
+ @XmlElement(name="int", required=false, type=Integer.class),
+ @XmlElement(name="float", required=false, type=Float.class)
+ })
+ public void setItems(Number[] items)
+ {
+ this.items = items;
+ }
+}
Added: jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/element/xmlelements/test/XmlElementsUnitTestCase.java
===================================================================
--- jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/element/xmlelements/test/XmlElementsUnitTestCase.java (rev 0)
+++ jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/element/xmlelements/test/XmlElementsUnitTestCase.java 2009-11-11 16:42:15 UTC (rev 3674)
@@ -0,0 +1,23 @@
+package org.jboss.test.xb.builder.object.element.xmlelements.test;
+
+
+import org.jboss.test.xb.builder.AbstractBuilderTest;
+import org.jboss.test.xb.builder.object.element.xmlelements.support.Foo4;
+
+public class XmlElementsUnitTestCase extends AbstractBuilderTest
+{
+ public XmlElementsUnitTestCase(String name)
+ {
+ super(name);
+ }
+
+ public void testArray() throws Exception
+ {
+ Foo4 foo = unmarshalObject(Foo4.class);
+ Number[] items = foo.getItems();
+ assertEquals(4, items.length);
+ assertEquals(1, items[0]);
+ assertEquals(2, items[1]);
+ assertEquals(new Float(1.1), items[2]);
+ }
+}
Modified: jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/type/xmlanyelement/test/ArrayElementWildcardUnitTestCase.java
===================================================================
--- jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/type/xmlanyelement/test/ArrayElementWildcardUnitTestCase.java 2009-11-11 15:41:50 UTC (rev 3673)
+++ jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/type/xmlanyelement/test/ArrayElementWildcardUnitTestCase.java 2009-11-11 16:42:15 UTC (rev 3674)
@@ -32,12 +32,10 @@
import org.jboss.xb.binding.sunday.unmarshalling.ParticleBinding;
import org.jboss.xb.binding.sunday.unmarshalling.ParticleHandler;
import org.jboss.xb.binding.sunday.unmarshalling.SchemaBinding;
-import org.jboss.xb.binding.sunday.unmarshalling.SequenceBinding;
import org.jboss.xb.binding.sunday.unmarshalling.TermBinding;
import org.jboss.xb.binding.sunday.unmarshalling.TypeBinding;
import org.jboss.xb.binding.sunday.unmarshalling.WildcardBinding;
import org.jboss.xb.builder.JBossXBBuilder;
-import org.jboss.xb.builder.runtime.ArraySequenceBinding;
import org.jboss.xb.builder.runtime.DOMHandler;
import org.jboss.xb.builder.runtime.PropertyWildcardHandler;
import org.w3c.dom.Element;
@@ -85,10 +83,6 @@
TermBinding term = particle.getTerm();
assertNotNull(term);
term = assertSingleSequence(term);
- assertTrue(term instanceof ArraySequenceBinding);
- term = assertSingleSequence(term);
- assertTrue(term instanceof SequenceBinding);
- term = assertSingleSequence(term);
assertTrue(term instanceof WildcardBinding);
WildcardBinding wildcardBinding = type.getWildcard();
assertNotNull(wildcardBinding);
Modified: jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/type/xmlanyelement/test/ArrayObjectWildcardUnitTestCase.java
===================================================================
--- jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/type/xmlanyelement/test/ArrayObjectWildcardUnitTestCase.java 2009-11-11 15:41:50 UTC (rev 3673)
+++ jbossxb/trunk/src/test/java/org/jboss/test/xb/builder/object/type/xmlanyelement/test/ArrayObjectWildcardUnitTestCase.java 2009-11-11 16:42:15 UTC (rev 3674)
@@ -34,12 +34,10 @@
import org.jboss.xb.binding.sunday.unmarshalling.ParticleBinding;
import org.jboss.xb.binding.sunday.unmarshalling.ParticleHandler;
import org.jboss.xb.binding.sunday.unmarshalling.SchemaBinding;
-import org.jboss.xb.binding.sunday.unmarshalling.SequenceBinding;
import org.jboss.xb.binding.sunday.unmarshalling.TermBinding;
import org.jboss.xb.binding.sunday.unmarshalling.TypeBinding;
import org.jboss.xb.binding.sunday.unmarshalling.WildcardBinding;
import org.jboss.xb.builder.JBossXBBuilder;
-import org.jboss.xb.builder.runtime.ArraySequenceBinding;
import org.jboss.xb.builder.runtime.PropertyWildcardHandler;
/**
@@ -85,10 +83,6 @@
TermBinding term = particle.getTerm();
assertNotNull(term);
term = assertSingleSequence(term);
- assertTrue(term instanceof ArraySequenceBinding);
- term = assertSingleSequence(term);
- assertTrue(term instanceof SequenceBinding);
- term = assertSingleSequence(term);
assertTrue(term instanceof WildcardBinding);
WildcardBinding wildcardBinding = type.getWildcard();
assertNotNull(wildcardBinding);
Added: jbossxb/trunk/src/test/resources/org/jboss/test/xb/builder/object/element/wrapper/test/Wrapper_testFoo5Wrapper.xml
===================================================================
--- jbossxb/trunk/src/test/resources/org/jboss/test/xb/builder/object/element/wrapper/test/Wrapper_testFoo5Wrapper.xml (rev 0)
+++ jbossxb/trunk/src/test/resources/org/jboss/test/xb/builder/object/element/wrapper/test/Wrapper_testFoo5Wrapper.xml 2009-11-11 16:42:15 UTC (rev 3674)
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<foo4>
+ <bar>
+ <int>1</int>
+ <int>2</int>
+ <float>1.1</float>
+ <x>123456789</x>
+ </bar>
+</foo4>
Added: jbossxb/trunk/src/test/resources/org/jboss/test/xb/builder/object/element/xmlelements/test/XmlElements_testArray.xml
===================================================================
--- jbossxb/trunk/src/test/resources/org/jboss/test/xb/builder/object/element/xmlelements/test/XmlElements_testArray.xml (rev 0)
+++ jbossxb/trunk/src/test/resources/org/jboss/test/xb/builder/object/element/xmlelements/test/XmlElements_testArray.xml 2009-11-11 16:42:15 UTC (rev 3674)
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<foo4>
+ <int>1</int>
+ <int>2</int>
+ <float>1.1</float>
+ <int>3</int>
+</foo4>
More information about the jboss-svn-commits
mailing list