[jboss-svn-commits] JBoss Common SVN: r2045 - in jbossxb/trunk/src/main/java/org/jboss/xb/binding: . group sunday/unmarshalling sunday/unmarshalling/impl/runtime
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Wed Sep 20 09:50:58 EDT 2006
Author: alex.loubyansky at jboss.com
Date: 2006-09-20 09:50:53 -0400 (Wed, 20 Sep 2006)
New Revision: 2045
Modified:
jbossxb/trunk/src/main/java/org/jboss/xb/binding/GenericValueContainer.java
jbossxb/trunk/src/main/java/org/jboss/xb/binding/UnmarshallerImpl.java
jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueList.java
jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueListHandler.java
jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueListInitializer.java
jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/JBXB76ContentHandler.java
jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/impl/runtime/RtElementHandler.java
jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/impl/runtime/RtUtil.java
Log:
fixed start/end repeatable particle for wildcards, other fixes for JBXB-76
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/GenericValueContainer.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/GenericValueContainer.java 2006-09-19 22:37:25 UTC (rev 2044)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/GenericValueContainer.java 2006-09-20 13:50:53 UTC (rev 2045)
@@ -40,30 +40,6 @@
{
return array(null, null, itemClass);
}
-
- public static GenericValueContainer child(final Class childClass)
- {
- return new GenericValueContainer()
- {
- private Object child;
-
- public void addChild(QName name, Object value)
- {
- this.child = value;
- }
-
- public Class getTargetClass()
- {
- return childClass;
- }
-
- public Object instantiate()
- {
- return child;
- }
-
- };
- }
public static GenericValueContainer array(final Class wrapperClass,
final String itemProperty,
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/UnmarshallerImpl.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/UnmarshallerImpl.java 2006-09-19 22:37:25 UTC (rev 2044)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/UnmarshallerImpl.java 2006-09-20 13:50:53 UTC (rev 2045)
@@ -28,8 +28,8 @@
import org.jboss.xb.binding.parser.sax.SaxJBossXBParser;
import org.jboss.xb.binding.sunday.unmarshalling.SchemaBinding;
import org.jboss.xb.binding.sunday.unmarshalling.SchemaBindingResolver;
-import org.jboss.xb.binding.sunday.unmarshalling.SundayContentHandler;
-//import org.jboss.xb.binding.sunday.unmarshalling.JBXB76ContentHandler;
+//import org.jboss.xb.binding.sunday.unmarshalling.SundayContentHandler;
+import org.jboss.xb.binding.sunday.unmarshalling.JBXB76ContentHandler;
import org.jboss.xb.binding.metadata.unmarshalling.DocumentBinding;
import org.xml.sax.EntityResolver;
import org.xml.sax.ErrorHandler;
@@ -109,42 +109,42 @@
public Object unmarshal(String xml, SchemaBinding schemaBinding) throws JBossXBException
{
- JBossXBParser.ContentHandler cHandler = new SundayContentHandler(schemaBinding);
+ JBossXBParser.ContentHandler cHandler = new JBXB76ContentHandler(schemaBinding);
parser.parse(xml, cHandler);
return cHandler.getRoot();
}
public Object unmarshal(Reader xmlReader, SchemaBinding schemaBinding) throws JBossXBException
{
- JBossXBParser.ContentHandler cHandler = new SundayContentHandler(schemaBinding);
+ JBossXBParser.ContentHandler cHandler = new JBXB76ContentHandler(schemaBinding);
parser.parse(xmlReader, cHandler);
return cHandler.getRoot();
}
public Object unmarshal(InputStream xmlStream, SchemaBinding schemaBinding) throws JBossXBException
{
- JBossXBParser.ContentHandler cHandler = new SundayContentHandler(schemaBinding);
+ JBossXBParser.ContentHandler cHandler = new JBXB76ContentHandler(schemaBinding);
parser.parse(xmlStream, cHandler);
return cHandler.getRoot();
}
public Object unmarshal(String xml, SchemaBindingResolver schemaResolver) throws JBossXBException
{
- JBossXBParser.ContentHandler cHandler = new SundayContentHandler(schemaResolver);
+ JBossXBParser.ContentHandler cHandler = new JBXB76ContentHandler(schemaResolver);
parser.parse(xml, cHandler);
return cHandler.getRoot();
}
public Object unmarshal(Reader xmlReader, SchemaBindingResolver schemaResolver) throws JBossXBException
{
- JBossXBParser.ContentHandler cHandler = new SundayContentHandler(schemaResolver);
+ JBossXBParser.ContentHandler cHandler = new JBXB76ContentHandler(schemaResolver);
parser.parse(xmlReader, cHandler);
return cHandler.getRoot();
}
public Object unmarshal(InputStream xmlStream, SchemaBindingResolver schemaResolver) throws JBossXBException
{
- JBossXBParser.ContentHandler cHandler = new SundayContentHandler(schemaResolver);
+ JBossXBParser.ContentHandler cHandler = new JBXB76ContentHandler(schemaResolver);
parser.parse(xmlStream, cHandler);
return cHandler.getRoot();
}
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueList.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueList.java 2006-09-19 22:37:25 UTC (rev 2044)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueList.java 2006-09-20 13:50:53 UTC (rev 2045)
@@ -22,13 +22,18 @@
package org.jboss.xb.binding.group;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import javax.xml.namespace.QName;
+
+import org.jboss.xb.binding.JBossXBRuntimeException;
+import org.jboss.xb.binding.metadata.PropertyMetaData;
import org.jboss.xb.binding.sunday.unmarshalling.AttributeBinding;
import org.jboss.xb.binding.sunday.unmarshalling.ParticleBinding;
import org.jboss.xb.binding.sunday.unmarshalling.CharactersHandler;
+import org.jboss.xb.binding.sunday.unmarshalling.impl.runtime.RtUtil;
/**
* @author <a href="mailto:alex at jboss.org">Alexey Loubyansky</a>
@@ -103,32 +108,40 @@
void addTermValue(QName qName, ParticleBinding binding, Object handler, Object value, ParticleBinding parentParticle)
{
- if(binding.isRepeatable())
+ setNonRequiredValue(qName, binding, handler, value, parentParticle);
+ }
+
+ void addRepeatableTermValue(QName qName, ParticleBinding binding, Object handler, Object value, ParticleBinding parentParticle)
+ {
+ NonRequiredValue last = (NonRequiredValue) (nonRequiredValues.isEmpty() ? null : nonRequiredValues.get(nonRequiredValues.size() - 1));
+ if (last == null || last.binding != binding)
{
- NonRequiredValue last = (NonRequiredValue)(nonRequiredValues.isEmpty() ?
- null :
- nonRequiredValues.get(nonRequiredValues.size() - 1)
- );
-
- if(last == null || last.binding != binding)
+ Collection col;
+ PropertyMetaData propMetaData = binding.getTerm().getPropertyMetaData();
+ if(propMetaData != null && propMetaData.getCollectionType() != null)
{
- value = Collections.singletonList(value);
- setNonRequiredValue(qName, binding, handler, value, parentParticle);
+ Class colCls = RtUtil.loadClass(propMetaData.getCollectionType(), true);
+ try
+ {
+ col = (Collection) colCls.newInstance();
+ }
+ catch (Exception e)
+ {
+ throw new JBossXBRuntimeException("Failed to create an instance of " + colCls.getName() + " for property " + propMetaData.getName());
+ }
}
else
{
- List list = (List)last.value;
- if(list.size() == 1)
- {
- list = new ArrayList(list);
- last.value = list;
- }
- list.add(value);
+ col = new ArrayList();
}
+
+ col.add(value);
+ setNonRequiredValue(qName, binding, handler, col, parentParticle);
}
else
{
- setNonRequiredValue(qName, binding, handler, value, parentParticle);
+ Collection col = (Collection) last.value;
+ col.add(value);
}
}
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueListHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueListHandler.java 2006-09-19 22:37:25 UTC (rev 2044)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueListHandler.java 2006-09-20 13:50:53 UTC (rev 2045)
@@ -26,9 +26,10 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
-import java.util.List;
import java.util.Map;
+
import org.jboss.util.Classes;
+import org.jboss.xb.binding.GenericValueContainer;
import org.jboss.xb.binding.JBossXBRuntimeException;
import org.jboss.xb.binding.sunday.unmarshalling.AttributeBinding;
import org.jboss.xb.binding.sunday.unmarshalling.AttributeHandler;
@@ -36,6 +37,7 @@
import org.jboss.xb.binding.sunday.unmarshalling.ElementBinding;
import org.jboss.xb.binding.sunday.unmarshalling.ParticleBinding;
import org.jboss.xb.binding.sunday.unmarshalling.ParticleHandler;
+import org.jboss.xb.binding.sunday.unmarshalling.TermBinding;
/**
* @author <a href="mailto:alex at jboss.org">Alexey Loubyansky</a>
@@ -195,11 +197,22 @@
ParticleHandler pHandler = (ParticleHandler)handler;
if(childParticle.isRepeatable())
{
- List list = (List)valueEntry.value;
- for(int listInd = 0; listInd < list.size(); ++listInd)
+ TermBinding term = childParticle.getTerm();
+ if(!(o instanceof GenericValueContainer) &&
+ term.getAddMethodMetaData() == null &&
+ term.getMapEntryMetaData() == null &&
+ term.getPutMethodMetaData() == null)
{
- pHandler.setParent(o, list.get(listInd), valueEntry.qName, childParticle, particle);
+ pHandler.setParent(o, valueEntry.value, valueEntry.qName, childParticle, particle);
}
+ else
+ {
+ Collection col = (Collection)valueEntry.value;
+ for(Iterator iter = col.iterator(); iter.hasNext();)
+ {
+ pHandler.setParent(o, iter.next(), valueEntry.qName, childParticle, particle);
+ }
+ }
}
else
{
@@ -351,7 +364,7 @@
class FACTORY
{
/**
- * Collects children and adds them all at the time of newInstance is called.
+ * Collects children and adds them all at the time the newInstance is called.
*
* @param parent the parent object
* @return the parent object
@@ -377,29 +390,23 @@
ParticleHandler pHandler = (ParticleHandler)handler;
if(childParticle.isRepeatable())
{
- List list = (List)valueEntry.value;
- //System.out.println("newInstance: " + childParticle.getTerm() + "=" + list);
- for(int listInd = 0; listInd < list.size(); ++listInd)
+ if(parentValueList != null)
{
- if(parentValueList != null)
- {
- parentValueList.addTermValue(valueEntry.qName, childParticle, pHandler, list.get(listInd), null);
- }
- else
- {
- pHandler.setParent(parent, list.get(listInd), valueEntry.qName, childParticle, valueEntry.parentParticle);
- }
+ parentValueList.addTermValue(valueEntry.qName, childParticle, pHandler, valueEntry.value, null);
}
-
-/* if(parentValueList != null)
- {
- parentValueList.addTermValue(valueEntry.qName, childParticle, pHandler, list, null);
- }
else
{
- pHandler.setParent(parent, list, valueEntry.qName, childParticle, valueEntry.parentParticle);
+ Collection col = (Collection) valueEntry.value;
+ //System.out.println("newInstance: " + childParticle.getTerm() + "=" + col);
+ pHandler.setParent(parent, col, valueEntry.qName, childParticle, valueEntry.parentParticle);
+
+/* for (Iterator iter = col.iterator(); iter.hasNext();)
+ {
+ pHandler.setParent(parent, iter.next(), valueEntry.qName, childParticle,
+ valueEntry.parentParticle);
+ }
+*/
}
-*/
}
else
{
@@ -460,7 +467,30 @@
}
};
}
+
+ public static ValueListHandler child()
+ {
+ return new ValueListHandler()
+ {
+ public Object newInstance(ParticleBinding particle, ValueList valueList)
+ {
+ if(valueList.size() > 1)
+ {
+ String msg = "Expected only one child for " + particle.getTerm() + " but got:";
+ for(int i = 0; i < valueList.size(); ++i)
+ {
+ ValueList.NonRequiredValue valueEntry = valueList.getValue(0);
+ msg += " " + valueEntry.value + ";";
+ }
+ throw new JBossXBRuntimeException(msg);
+ }
+
+ ValueList.NonRequiredValue valueEntry = valueList.getValue(0);
+ return valueEntry.value;
+ }
+ };
+ }
};
-
+
Object newInstance(ParticleBinding particle, ValueList valueList);
}
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueListInitializer.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueListInitializer.java 2006-09-19 22:37:25 UTC (rev 2044)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueListInitializer.java 2006-09-20 13:50:53 UTC (rev 2045)
@@ -119,7 +119,14 @@
Integer index = (Integer)elemIndex.get(qName);
if(index == null)
{
- valueList.addTermValue(qName, binding, handler, value, parentParticle);
+ if(binding.isRepeatable())
+ {
+ valueList.addRepeatableTermValue(qName, binding, handler, value, parentParticle);
+ }
+ else
+ {
+ valueList.addTermValue(qName, binding, handler, value, parentParticle);
+ }
}
else
{
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/JBXB76ContentHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/JBXB76ContentHandler.java 2006-09-19 22:37:25 UTC (rev 2044)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/JBXB76ContentHandler.java 2006-09-20 13:50:53 UTC (rev 2045)
@@ -22,6 +22,7 @@
package org.jboss.xb.binding.sunday.unmarshalling;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
import java.util.ListIterator;
import javax.xml.namespace.QName;
@@ -117,7 +118,18 @@
}
else
{
- endParticle(item, endName, 1);
+ if(!item.ended) // could be ended if it's a choice
+ {
+ endParticle(item, endName, 1);
+ }
+
+ ParticleBinding currentParticle = item.cursor.getCurrentParticle();
+ TermBinding term = currentParticle.getTerm();
+ if(term.isWildcard() && currentParticle.isRepeatable())
+ {
+ endRepeatableParticle(currentParticle);
+ }
+
pop();
if(item.particle.isRepeatable())
{
@@ -151,6 +163,7 @@
QName startName = localName.length() == 0 ? new QName(qName) : new QName(namespaceURI, localName);
ParticleBinding particle = null;
boolean repeated = false;
+ boolean repeatedParticle = false;
StackItem item = null;
ModelGroupBinding.Cursor cursor = null; // used only when particle is a wildcard
SchemaBinding schemaBinding = schema;
@@ -264,10 +277,13 @@
}
// todo review
- if(cursor.isPositioned() && cursor.getParticle().getTerm() instanceof ChoiceBinding)
+ if(!item.ended && cursor.isPositioned() && cursor.getParticle().getTerm() instanceof ChoiceBinding)
{
endParticle(item, startName, 1);
- pop();
+ if(!item.particle.isRepeatable()) // this is for repeatable choices that should stay on the stack
+ {
+ pop();
+ }
continue;
}
@@ -276,11 +292,26 @@
List newCursors = cursor.startElement(startName, atts);
if(newCursors.isEmpty())
{
- endParticle(item, startName, 1);
+ if(!item.ended) // this is for choices
+ {
+ endParticle(item, startName, 1);
+ }
pop();
}
else
{
+ if(item.ended) // for repeatable choices
+ {
+ if(!item.particle.isRepeatable())
+ {
+ throw new JBossXBRuntimeException("The particle expected to be repeatable but it's not: " + item.particle.getTerm());
+ }
+ item.reset();
+
+ ParticleHandler handler = getHandler(item.particle);
+ item.o = handler.startParticle(stack.peek(1).o, startName, item.particle, atts, nsRegistry);
+ }
+
ParticleBinding curParticle = cursor.getCurrentParticle();
if(curParticle != prevParticle)
{
@@ -294,6 +325,10 @@
startRepeatableParticle(startName, curParticle);
}
}
+ else
+ {
+ repeatedParticle = true;
+ }
// push all except the last one
Object o = item.o;
@@ -333,12 +368,11 @@
);
}
- particle =
- new ParticleBinding(element,
- particle.getMinOccurs(),
- particle.getMaxOccurs(),
- particle.getMaxOccursUnbounded()
- );
+ if(!repeatedParticle && particle.isRepeatable())
+ {
+ startRepeatableParticle(startName, particle);
+ }
+ particle = new ParticleBinding(element/*, particle.getMinOccurs(), particle.getMaxOccurs(), particle.getMaxOccursUnbounded()*/);
}
ElementBinding element = (ElementBinding)particle.getTerm();
@@ -574,7 +608,7 @@
private void startRepeatableParticle(QName startName, ParticleBinding particle)
{
- //System.out.println(" start repeatable particle: " + particle.getTerm());
+ //System.out.println(" start repeatable (" + stack.size() + "): " + particle.getTerm());
TermBinding term = particle.getTerm();
if(term.isSkip())
@@ -597,14 +631,40 @@
private void endRepeatableParticle(ParticleBinding particle)
{
- //System.out.println(" end repeatable particle: " + particle.getTerm());
+ //System.out.println(" end repeatable (" + stack.size() + "): " + particle.getTerm());
StackItem item = stack.peek();
ValueList valueList = item.repeatableParticleValue;
if(valueList != null)
{
- valueList.getHandler().newInstance(particle, valueList);
item.repeatableParticleValue = null;
+ if(valueList.size() == 0)
+ {
+ return;
+ }
+
+ if(particle.getTerm().isWildcard())
+ {
+ ParticleHandler handler = ((WildcardBinding)particle.getTerm()).getWildcardHandler();
+ if(handler == null)
+ {
+ handler = defParticleHandler;
+ }
+
+ // that's not good. some elements can be handled as "unresolved" and some as "resolved"
+ QName qName = valueList.getValue(0).qName;
+ Collection col = new ArrayList();
+ for(int i = 0; i < valueList.size(); ++i)
+ {
+ col.add(valueList.getValue(i).value);
+ }
+ StackItem parentItem = stack.peek(1);
+ handler.setParent(parentItem.o, col, qName, particle, parentItem.particle);
+ }
+ else
+ {
+ valueList.getHandler().newInstance(particle, valueList);
+ }
}
}
@@ -924,6 +984,7 @@
if(stack.size() == 1)
{
root = o;
+ stack.clear();
}
}
@@ -936,6 +997,10 @@
{
if(parent instanceof ValueList /*&& !particle.getTerm().isSkip()*/)
{
+ if(parent == o)
+ {
+ return;
+ }
ValueList valueList = (ValueList)parent;
valueList.getInitializer().addTermValue(endName, particle, handler, valueList, o, parentParticle);
}
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/impl/runtime/RtElementHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/impl/runtime/RtElementHandler.java 2006-09-19 22:37:25 UTC (rev 2044)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/impl/runtime/RtElementHandler.java 2006-09-20 13:50:53 UTC (rev 2045)
@@ -25,7 +25,6 @@
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
import javax.xml.namespace.NamespaceContext;
@@ -254,7 +253,7 @@
ElementBinding parentElement = (ElementBinding)parentTerm;
TypeBinding parentType = parentElement.getType();
wildcard = parentType.getWildcard();
- // todo: there are should be a better way of checking this
+ // there should be a better way of checking this
if(wildcard != null && parentType.getElement(qName) != null)
{
wildcard = null;
@@ -318,7 +317,7 @@
log.trace("setParent " + qName + " metadata set " + propName);
}
- if(particle.isRepeatable())
+/* if(particle.isRepeatable())
{
RtUtil.add(owner, o, propName, colType,
term.getSchema().isIgnoreUnresolvedFieldOrClass(),
@@ -327,11 +326,11 @@
}
else
{
- RtUtil.set(owner, o, propName, colType,
+*/ RtUtil.set(owner, o, propName, colType,
term.getSchema().isIgnoreUnresolvedFieldOrClass(),
term.getValueAdapter()
);
- }
+// }
}
}
}
@@ -528,8 +527,8 @@
else if(Collection.class.isAssignableFrom(fieldType))
{
//System.out.println("GeenericValueContainer.child: " + elementName);
- //o = GenericValueContainer.FACTORY.child(fieldType);
- o = new ArrayList();
+ o = new ValueListInitializer().newValueList(ValueListHandler.FACTORY.child(), Collection.class);
+ //o = new ArrayList();
}
else
{
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/impl/runtime/RtUtil.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/impl/runtime/RtUtil.java 2006-09-19 22:37:25 UTC (rev 2044)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/impl/runtime/RtUtil.java 2006-09-20 13:50:53 UTC (rev 2045)
@@ -196,6 +196,7 @@
//System.out.println("col.add(value): " + prop + "=" + value);
col.add(value);
}
+/*
else if(fieldType.isArray() &&
value != null &&
(fieldType.getComponentType().isAssignableFrom(value.getClass()) ||
@@ -220,6 +221,7 @@
Array.set(arr, length, value);
fieldInfo.setValue(o, arr);
}
+*/
else
{
// todo: unmarshalling should produce the right type instead
More information about the jboss-svn-commits
mailing list