[jboss-svn-commits] JBoss Common SVN: r2020 - 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
Thu Sep 14 19:44:32 EDT 2006
Author: alex.loubyansky at jboss.com
Date: 2006-09-14 19:44:26 -0400 (Thu, 14 Sep 2006)
New Revision: 2020
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/SundayContentHandler.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 particles with interceptors present, a bunch of other refactorings and incomplete things on the way to 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-14 18:58:26 UTC (rev 2019)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/GenericValueContainer.java 2006-09-14 23:44:26 UTC (rev 2020)
@@ -41,6 +41,30 @@
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,
final Class itemClass)
@@ -59,6 +83,41 @@
public Object instantiate()
{
+/* for collected repeatable particles
+ Object arr;
+ if(items.isEmpty())
+ {
+ arr = Array.newInstance(itemType, 0);
+ }
+ else
+ {
+ java.util.Collection col = (java.util.Collection)items.get(0);
+ arr = Array.newInstance(itemType, col.size());
+ if(itemType.isPrimitive())
+ {
+ int i = 0;
+ for(java.util.Iterator iter = col.iterator(); iter.hasNext();)
+ {
+ Object item = iter.next();
+ try
+ {
+ Array.set(arr, i++, item);
+ }
+ catch(IllegalArgumentException e)
+ {
+ throw new JBossXBRuntimeException("Failed to set " +
+ item +
+ " as an item of array " + arr
+ );
+ }
+ }
+ }
+ else
+ {
+ col.toArray((Object[])arr);
+ }
+ }
+*/
Object arr = Array.newInstance(itemType, items.size());
for(int i = 0; i < items.size(); ++i)
{
@@ -123,7 +182,6 @@
);
}
}
-
return result;
}
@@ -133,6 +191,11 @@
// todo: what's the best way to get a class for array having the item class?
return Array.newInstance(itemType, 0).getClass();
}
+
+ public String toString()
+ {
+ return super.toString() + "array";
+ }
};
}
}
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-14 18:58:26 UTC (rev 2019)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/UnmarshallerImpl.java 2006-09-14 23:44:26 UTC (rev 2020)
@@ -29,6 +29,7 @@
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.metadata.unmarshalling.DocumentBinding;
import org.xml.sax.EntityResolver;
import org.xml.sax.ErrorHandler;
@@ -108,42 +109,42 @@
public Object unmarshal(String xml, SchemaBinding schemaBinding) throws JBossXBException
{
- SundayContentHandler cHandler = new SundayContentHandler(schemaBinding);
+ JBossXBParser.ContentHandler cHandler = new SundayContentHandler(schemaBinding);
parser.parse(xml, cHandler);
return cHandler.getRoot();
}
public Object unmarshal(Reader xmlReader, SchemaBinding schemaBinding) throws JBossXBException
{
- SundayContentHandler cHandler = new SundayContentHandler(schemaBinding);
+ JBossXBParser.ContentHandler cHandler = new SundayContentHandler(schemaBinding);
parser.parse(xmlReader, cHandler);
return cHandler.getRoot();
}
public Object unmarshal(InputStream xmlStream, SchemaBinding schemaBinding) throws JBossXBException
{
- SundayContentHandler cHandler = new SundayContentHandler(schemaBinding);
+ JBossXBParser.ContentHandler cHandler = new SundayContentHandler(schemaBinding);
parser.parse(xmlStream, cHandler);
return cHandler.getRoot();
}
public Object unmarshal(String xml, SchemaBindingResolver schemaResolver) throws JBossXBException
{
- SundayContentHandler cHandler = new SundayContentHandler(schemaResolver);
+ JBossXBParser.ContentHandler cHandler = new SundayContentHandler(schemaResolver);
parser.parse(xml, cHandler);
return cHandler.getRoot();
}
public Object unmarshal(Reader xmlReader, SchemaBindingResolver schemaResolver) throws JBossXBException
{
- SundayContentHandler cHandler = new SundayContentHandler(schemaResolver);
+ JBossXBParser.ContentHandler cHandler = new SundayContentHandler(schemaResolver);
parser.parse(xmlReader, cHandler);
return cHandler.getRoot();
}
public Object unmarshal(InputStream xmlStream, SchemaBindingResolver schemaResolver) throws JBossXBException
{
- SundayContentHandler cHandler = new SundayContentHandler(schemaResolver);
+ JBossXBParser.ContentHandler cHandler = new SundayContentHandler(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-14 18:58:26 UTC (rev 2019)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueList.java 2006-09-14 23:44:26 UTC (rev 2020)
@@ -93,15 +93,15 @@
void setAttributeValue(QName qName, AttributeBinding binding, Object value)
{
- setNonRequiredValue(qName, binding, null, value);
+ setNonRequiredValue(qName, binding, null, value, null);
}
void addTextValue(QName qName, ParticleBinding particle, CharactersHandler handler, Object value)
{
- setNonRequiredValue(qName, particle, handler, value);
+ setNonRequiredValue(qName, particle, handler, value, null);
}
- void addTermValue(QName qName, ParticleBinding binding, Object handler, Object value)
+ void addTermValue(QName qName, ParticleBinding binding, Object handler, Object value, ParticleBinding parentParticle)
{
if(binding.isRepeatable())
{
@@ -113,7 +113,7 @@
if(last == null || last.binding != binding)
{
value = Collections.singletonList(value);
- setNonRequiredValue(qName, binding, handler, value);
+ setNonRequiredValue(qName, binding, handler, value, parentParticle);
}
else
{
@@ -128,13 +128,13 @@
}
else
{
- setNonRequiredValue(qName, binding, handler, value);
+ setNonRequiredValue(qName, binding, handler, value, parentParticle);
}
}
- void setNonRequiredValue(QName qName, Object binding, Object handler, Object value)
+ void setNonRequiredValue(QName qName, Object binding, Object handler, Object value, ParticleBinding parentParticle)
{
- NonRequiredValue val = new NonRequiredValue(qName, binding, handler, value);
+ NonRequiredValue val = new NonRequiredValue(qName, binding, handler, value, parentParticle);
switch(nonRequiredValues.size())
{
case 0:
@@ -202,13 +202,15 @@
public final Object binding;
public final Object handler;
public Object value;
+ public ParticleBinding parentParticle;
- public NonRequiredValue(QName qName, Object binding, Object handler, Object value)
+ public NonRequiredValue(QName qName, Object binding, Object handler, Object value, ParticleBinding parentParticle)
{
this.qName = qName;
this.binding = binding;
this.handler = handler;
this.value = value;
+ this.parentParticle = parentParticle;
}
}
}
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-14 18:58:26 UTC (rev 2019)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueListHandler.java 2006-09-14 23:44:26 UTC (rev 2020)
@@ -348,5 +348,119 @@
}
};
+ class FACTORY
+ {
+ /**
+ * Collects children and adds them all at the time of newInstance is called.
+ *
+ * @param parent the parent object
+ * @return the parent object
+ */
+ public static ValueListHandler lazy(final Object parent)
+ {
+ return new ValueListHandler()
+ {
+ private final ValueList parentValueList = parent instanceof ValueList ? (ValueList)parent : null;
+
+ public Object newInstance(ParticleBinding particle, ValueList valueList)
+ {
+ for(int i = 0; i < valueList.size(); ++i)
+ {
+ ValueList.NonRequiredValue valueEntry = valueList.getValue(i);
+ Object binding = valueEntry.binding;
+ if(binding instanceof ParticleBinding)
+ {
+ Object handler = valueEntry.handler;
+ ParticleBinding childParticle = (ParticleBinding)binding;
+ if(handler instanceof ParticleHandler)
+ {
+ 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)
+ {
+ parentValueList.addTermValue(valueEntry.qName, childParticle, pHandler, list.get(listInd), null);
+ }
+ else
+ {
+ pHandler.setParent(parent, list.get(listInd), valueEntry.qName, childParticle, valueEntry.parentParticle);
+ }
+ }
+
+/* if(parentValueList != null)
+ {
+ parentValueList.addTermValue(valueEntry.qName, childParticle, pHandler, list, null);
+ }
+ else
+ {
+ pHandler.setParent(parent, list, valueEntry.qName, childParticle, valueEntry.parentParticle);
+ }
+*/
+ }
+ else
+ {
+ if(parentValueList != null)
+ {
+ parentValueList.addTermValue(valueEntry.qName, childParticle, pHandler, valueEntry.value, valueEntry.parentParticle);
+ }
+ else
+ {
+ pHandler.setParent(parent, valueEntry.value, valueEntry.qName, childParticle, valueEntry.parentParticle);
+ }
+ }
+ }
+ else
+ {
+ CharactersHandler cHandler = (CharactersHandler)handler;
+ if(parentValueList != null)
+ {
+ parentValueList.addTextValue(valueEntry.qName, childParticle, cHandler, valueEntry.value);
+ }
+ else
+ {
+ cHandler.setValue(valueEntry.qName, (ElementBinding) childParticle.getTerm(), parent, valueEntry.value);
+ }
+ }
+ }
+ else if(binding instanceof AttributeBinding)
+ {
+ AttributeBinding attr = (AttributeBinding)binding;
+ AttributeHandler handler = attr.getHandler();
+ if(handler != null)
+ {
+ if(parentValueList != null)
+ {
+ parentValueList.setAttributeValue(attr.getQName(), attr, valueEntry.value);
+ }
+ else
+ {
+ handler.attribute(valueEntry.qName, attr.getQName(), attr, parent, valueEntry.value);
+ }
+ }
+ else
+ {
+ throw new JBossXBRuntimeException("Attribute binding present but has no handler: element=" +
+ valueEntry.qName +
+ ", attrinute=" +
+ attr.getQName()
+ );
+ }
+ }
+ else
+ {
+ throw new JBossXBRuntimeException("Unexpected binding type: " + binding);
+ }
+ }
+
+ return parent;
+ }
+ };
+ }
+ };
+
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-14 18:58:26 UTC (rev 2019)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueListInitializer.java 2006-09-14 23:44:26 UTC (rev 2020)
@@ -23,7 +23,6 @@
import java.util.Map;
import java.util.Collections;
-import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
import javax.xml.namespace.QName;
@@ -31,7 +30,6 @@
import org.jboss.xb.binding.sunday.unmarshalling.AttributeBinding;
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.CharactersHandler;
/**
@@ -116,12 +114,12 @@
valueList.addTextValue(qName, particle, handler, value);
}
- public void addTermValue(QName qName, ParticleBinding binding, Object handler, ValueList valueList, Object value)
+ public void addTermValue(QName qName, ParticleBinding binding, Object handler, ValueList valueList, Object value, ParticleBinding parentParticle)
{
Integer index = (Integer)elemIndex.get(qName);
if(index == null)
{
- valueList.addTermValue(qName, binding, handler, value);
+ 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-14 18:58:26 UTC (rev 2019)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/JBXB76ContentHandler.java 2006-09-14 23:44:26 UTC (rev 2020)
@@ -28,10 +28,13 @@
import org.apache.xerces.xs.XSTypeDefinition;
import org.jboss.logging.Logger;
import org.jboss.util.StringPropertyReplacer;
+import org.jboss.xb.binding.GenericValueContainer;
import org.jboss.xb.binding.JBossXBRuntimeException;
import org.jboss.xb.binding.NamespaceRegistry;
import org.jboss.xb.binding.Util;
import org.jboss.xb.binding.group.ValueList;
+import org.jboss.xb.binding.group.ValueListHandler;
+import org.jboss.xb.binding.group.ValueListInitializer;
import org.jboss.xb.binding.metadata.CharactersMetaData;
import org.jboss.xb.binding.metadata.ValueMetaData;
import org.jboss.xb.binding.parser.JBossXBParser;
@@ -196,7 +199,7 @@
}
else
{
- pop();
+ pop();
if(item.particle.isRepeatable())
{
endRepeatableParticle(item.particle);
@@ -292,20 +295,6 @@
}
}
-/*
- if(cursor.getOccurence() - prevOccurence > 0 || item.ended)
- {
- endParticle(item, startName, 1);
-
- ParticleBinding modelGroupParticle = cursor.getParticle();
- ParticleHandler handler = getHandler(modelGroupParticle);
- Object o = handler.startParticle(stack.peek(1).o, startName, modelGroupParticle, atts, nsRegistry);
-
- item.reset();
- item.o = o;
- }
-*/
-
// push all except the last one
Object o = item.o;
for(int i = newCursors.size() - 2; i >= 0; --i)
@@ -410,12 +399,26 @@
}
List interceptors = element.getInterceptors();
- for(int i = 0; i < interceptors.size(); ++i)
+ if(!interceptors.isEmpty())
{
- ElementInterceptor interceptor = (ElementInterceptor)interceptors.get(i);
- parent = interceptor.startElement(parent, startName, type);
- push(startName, particle, parent);
- interceptor.attributes(parent, startName, type, atts, nsRegistry);
+ if (repeated)
+ {
+ pop();
+ }
+
+ for (int i = 0; i < interceptors.size(); ++i)
+ {
+ ElementInterceptor interceptor = (ElementInterceptor) interceptors.get(i);
+ parent = interceptor.startElement(parent, startName, type);
+ push(startName, particle, parent);
+ interceptor.attributes(parent, startName, type, atts, nsRegistry);
+ }
+
+ if (repeated)
+ {
+ // to have correct endRepeatableParticle calls
+ stack.push(item);
+ }
}
ParticleHandler handler = type.getHandler();
@@ -492,7 +495,8 @@
if(parentItem.cursor == null)
{
throw new JBossXBRuntimeException(
- "Repeatable parent expected to be a model group but got element: " +
+ "Failed to start " + startName +
+ ": the element is not repeatable, repeatable parent expected to be a model group but got element " +
((ElementBinding)parentItem.particle.getTerm()).getQName()
);
}
@@ -571,75 +575,37 @@
private void startRepeatableParticle(QName startName, ParticleBinding particle)
{
//System.out.println(" start repeatable particle: " + particle.getTerm());
-/*
- StackItem item = stack.peek();
-
- TermBinding parentTerm = item.particle.getTerm();
- WildcardBinding wc = null;
- if(parentTerm.isWildcard())
- {
- wc = (WildcardBinding)parentTerm;
- }
- else if(!parentTerm.isModelGroup())
- {
- ElementBinding el = (ElementBinding)parentTerm;
- wc = el.getType().getWildcard();
- if(wc != null && el.getType().getElement(startName) != null)
- {
- wc = null;
- }
- }
-
+
TermBinding term = particle.getTerm();
- if(term.getAddMethodMetaData() != null ||
- wc != null && wc.getAddMethodMetaData() != null ||
- term.getPutMethodMetaData() != null ||
- term.getMapEntryMetaData() != null)
+ if(term.isSkip())
{
return;
}
-
- item.tmp = item.o;
- item.o = new ArrayList();
- item.repeatbleParticleName = startName;
-
-*/
+
+ StackItem item = stack.peek();
+ if(item.o != null &&
+ !(item.o instanceof GenericValueContainer) &&
+ term.getAddMethodMetaData() == null &&
+ term.getMapEntryMetaData() == null &&
+ term.getPutMethodMetaData() == null)
+ {
+ ValueListHandler handler = ValueListHandler.FACTORY.lazy(item.o);
+ Class cls = item.o.getClass();
+ item.repeatableParticleValue = new ValueListInitializer().newValueList(handler, cls);
+ }
}
private void endRepeatableParticle(ParticleBinding particle)
{
//System.out.println(" end repeatable particle: " + particle.getTerm());
-/*
StackItem item = stack.peek();
- if(item.repeatbleParticleName == null)
+ ValueList valueList = item.repeatableParticleValue;
+ if(valueList != null)
{
- return;
+ valueList.getHandler().newInstance(particle, valueList);
+ item.repeatableParticleValue = null;
}
-
- TermBinding term = particle.getTerm();
- ParticleHandler handler = null;
- if(term.isModelGroup())
- {
- handler = getHandler(particle);
- }
- else
- {
- ElementBinding el = (ElementBinding)term;
- handler = el.getType().getHandler();
- if(handler == null)
- {
- handler = defParticleHandler;
- }
-
- }
-
- setParent(handler, item.tmp, item.o, item.repeatbleParticleName, particle, item.particle);
-
- item.o = item.tmp;
- item.tmp = null;
- item.repeatbleParticleName = null;
-*/
}
private void endParticle(StackItem item, QName qName, int parentStackPos)
@@ -678,7 +644,9 @@
{
parentParticle = item.particle;
}
- setParent(handler, item.o, o, qName, modelGroupParticle, parentParticle);
+ setParent(handler,
+ item.repeatableParticleValue == null ? item.o : item.repeatableParticleValue,
+ o, qName, modelGroupParticle, parentParticle);
}
}
@@ -805,7 +773,8 @@
particle,
charHandler,
valueList,
- unmarshalled
+ unmarshalled,
+ null
);
}
else
@@ -843,7 +812,8 @@
// endElement
//
- Object parent = stack.size() == 1 ? null : ((StackItem)stack.peek(1)).o;
+ StackItem parentItem = stack.size() == 1 ? null : stack.peek(1);
+ Object parent = parentItem == null ? null : parentItem.o;
ParticleHandler handler = type.getHandler();
if(handler == null)
{
@@ -904,11 +874,15 @@
} */
if(wildcardHandler != null)
{
- setParent(wildcardHandler, parent, o, endName, particle, parentParticle);
+ setParent(wildcardHandler,
+ parentItem.repeatableParticleValue == null ? parent : parentItem.repeatableParticleValue,
+ o, endName, particle, parentParticle);
}
else
{
- setParent(handler, parent, o, endName, particle, parentParticle);
+ setParent(handler,
+ parentItem.repeatableParticleValue == null ? parent : parentItem.repeatableParticleValue,
+ o, endName, particle, parentParticle);
}
}
else if(parentParticle != null &&
@@ -935,7 +909,7 @@
}
else
{
- pop();
+ StackItem popped = pop();
for(int i = interceptorsTotal - 1; i >= 0; --i)
{
ElementInterceptor interceptor = (ElementInterceptor)interceptors.get(i);
@@ -943,6 +917,8 @@
interceptor.add(parent, o, endName);
o = parent;
}
+ // need to have correst endRepeatableParticle events
+ stack.push(popped);
}
if(stack.size() == 1)
@@ -958,10 +934,10 @@
ParticleBinding particle,
ParticleBinding parentParticle)
{
- if(parent instanceof ValueList && !particle.getTerm().isSkip())
+ if(parent instanceof ValueList /*&& !particle.getTerm().isSkip()*/)
{
ValueList valueList = (ValueList)parent;
- valueList.getInitializer().addTermValue(endName, particle, handler, valueList, o);
+ valueList.getInitializer().addTermValue(endName, particle, handler, valueList, o, parentParticle);
}
else
{
@@ -1018,8 +994,7 @@
final ModelGroupBinding.Cursor cursor;
final ParticleBinding particle;
Object o;
- //Object tmp;
- //QName repeatbleParticleName;
+ ValueList repeatableParticleValue;
StringBuffer textContent;
boolean ended;
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 2006-09-14 18:58:26 UTC (rev 2019)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SundayContentHandler.java 2006-09-14 23:44:26 UTC (rev 2020)
@@ -805,7 +805,8 @@
particle,
charHandler,
valueList,
- unmarshalled
+ unmarshalled,
+ null
);
}
else
@@ -961,7 +962,7 @@
if(parent instanceof ValueList && !particle.getTerm().isSkip())
{
ValueList valueList = (ValueList)parent;
- valueList.getInitializer().addTermValue(endName, particle, handler, valueList, o);
+ valueList.getInitializer().addTermValue(endName, particle, handler, valueList, o, parentParticle);
}
else
{
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-14 18:58:26 UTC (rev 2019)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/impl/runtime/RtElementHandler.java 2006-09-14 23:44:26 UTC (rev 2020)
@@ -527,6 +527,8 @@
}
else if(Collection.class.isAssignableFrom(fieldType))
{
+ //System.out.println("GeenericValueContainer.child: " + elementName);
+ //o = GenericValueContainer.FACTORY.child(fieldType);
o = new ArrayList();
}
else
@@ -701,7 +703,6 @@
{
ElementBinding element = (ElementBinding)term;
cls = classForNonArrayItem(element, parentClass);
-
if(cls != null)
{
// todo: before that, the type should be checked for required attributes and elements
@@ -740,7 +741,6 @@
}
}
}
-
return o;
}
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-14 18:58:26 UTC (rev 2019)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/impl/runtime/RtUtil.java 2006-09-14 23:44:26 UTC (rev 2020)
@@ -131,6 +131,7 @@
length = Array.getLength(arr);
arr = Array.newInstance(fieldType.getComponentType(), length + 1);
System.arraycopy(tmp, 0, arr, 0, length);
+ //System.out.println("copied array (1)");
}
Array.set(arr, length, value);
fieldInfo.setValue(o, arr);
@@ -157,9 +158,7 @@
value = valueAdapter.cast(value, fieldType);
}
- if(colType != null ||
- // todo collections of collections
- Collection.class.isAssignableFrom(fieldType) &&
+ if(Collection.class.isAssignableFrom(fieldType) &&
!Collection.class.isAssignableFrom(value.getClass()))
{
Collection col = (Collection)fieldInfo.getValue(o);
@@ -194,6 +193,7 @@
fieldInfo.setValue(o, col);
}
+ //System.out.println("col.add(value): " + prop + "=" + value);
col.add(value);
}
else if(fieldType.isArray() &&
@@ -215,6 +215,7 @@
length = Array.getLength(arr);
arr = Array.newInstance(fieldType.getComponentType(), length + 1);
System.arraycopy(tmp, 0, arr, 0, length);
+ throw new JBossXBRuntimeException("copied array (2)");
}
Array.set(arr, length, value);
fieldInfo.setValue(o, arr);
@@ -223,37 +224,23 @@
{
// todo: unmarshalling should produce the right type instead
Class valueClass = value == null ? null : value.getClass();
- if(valueClass != null && !fieldType.isAssignableFrom(valueClass))
+ if (valueClass != null && fieldType.isArray() && Collection.class.isAssignableFrom(valueClass))
{
- if(fieldType.isArray() && Collection.class.isAssignableFrom(valueClass))
+ Collection col = (Collection) value;
+ Class compType = fieldType.getComponentType();
+ value = Array.newInstance(compType, col.size());
+ if (compType.isPrimitive())
{
- Collection col = (Collection)value;
- Class compType = fieldType.getComponentType();
- value = Array.newInstance(compType, col.size());
- if(compType.isPrimitive())
+ int i = 0;
+ for (Iterator iter = col.iterator(); iter.hasNext();)
{
- int i = 0;
- for(Iterator iter = col.iterator(); iter.hasNext();)
- {
- Array.set(value, i++, iter.next());
- }
+ Array.set(value, i++, iter.next());
}
- else
- {
- value = col.toArray((Object[])value);
- }
}
- else if(Collection.class.isAssignableFrom(fieldType) && valueClass.isArray())
+ else
{
- int length = Array.getLength(value);
- Collection col = new ArrayList(length);
- for(int i = 0; i < length; ++i)
- {
- col.add(Array.get(value, i));
- }
- value = col;
+ value = col.toArray((Object[]) value);
}
- // else hopefully it's a primitive/wrapper case
}
fieldInfo.setValue(o, value);
More information about the jboss-svn-commits
mailing list