[jboss-svn-commits] JBoss Common SVN: r3634 - in jbossxb/trunk/src/main/java/org/jboss/xb: binding/group and 3 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Wed Nov 4 11:22:23 EST 2009
Author: alex.loubyansky at jboss.com
Date: 2009-11-04 11:22:22 -0500 (Wed, 04 Nov 2009)
New Revision: 3634
Added:
jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueListRepeatableParticleHandler.java
jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/CollectionRepeatableParticleHandler.java
jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/NoopRepeatableParticleHandler.java
Modified:
jbossxb/trunk/src/main/java/org/jboss/xb/binding/GenericValueContainer.java
jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueListHandler.java
jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/DefaultHandlers.java
jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/RepeatableParticleHandler.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/TermBinding.java
jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/WildcardBinding.java
jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/XsdBinder.java
jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/impl/runtime/RtElementHandler.java
jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java
Log:
JBXB-229, JBXB-230
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/GenericValueContainer.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/GenericValueContainer.java 2009-11-04 15:07:42 UTC (rev 3633)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/GenericValueContainer.java 2009-11-04 16:22:22 UTC (rev 3634)
@@ -24,6 +24,7 @@
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
import javax.xml.namespace.QName;
import org.jboss.xb.binding.sunday.unmarshalling.impl.runtime.RtUtil;
@@ -54,7 +55,10 @@
public void addChild(QName name, Object value)
{
- items.add(value);
+ if(value != null && Collection.class.isAssignableFrom(value.getClass()))
+ items.addAll((Collection<? extends Object>) value);
+ else
+ items.add(value);
}
public Object instantiate()
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 2009-11-04 15:07:42 UTC (rev 3633)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueListHandler.java 2009-11-04 16:22:22 UTC (rev 3634)
@@ -198,7 +198,8 @@
if(childParticle.isRepeatable())
{
TermBinding term = childParticle.getTerm();
- if(!(o instanceof GenericValueContainer) &&
+/* Has to be commented for the NOOP RepeatableParticleHandler
+ * if(!(o instanceof GenericValueContainer) &&
term.getAddMethodMetaData() == null &&
term.getMapEntryMetaData() == null &&
term.getPutMethodMetaData() == null)
@@ -206,7 +207,7 @@
pHandler.setParent(o, valueEntry.value, valueEntry.qName, childParticle, particle);
}
else
- {
+*/ {
Collection<?> col = (Collection<?>)valueEntry.value;
for(Iterator<?> iter = col.iterator(); iter.hasNext();)
{
Added: jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueListRepeatableParticleHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueListRepeatableParticleHandler.java (rev 0)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/group/ValueListRepeatableParticleHandler.java 2009-11-04 16:22:22 UTC (rev 3634)
@@ -0,0 +1,116 @@
+/*
+* 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.binding.group;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import javax.xml.namespace.QName;
+
+import org.jboss.xb.binding.GenericValueContainer;
+import org.jboss.xb.binding.JBossXBRuntimeException;
+import org.jboss.xb.binding.group.ValueList.NonRequiredValue;
+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.TermBinding;
+
+/**
+ *
+ * @author <a href="alex at jboss.com">Alexey Loubyansky</a>
+ * @version $Revision: 1.1 $
+ */
+public class ValueListRepeatableParticleHandler implements RepeatableParticleHandler
+{
+ public static final ValueListRepeatableParticleHandler INSTANCE = new ValueListRepeatableParticleHandler();
+
+ public Object startRepeatableParticle(Object parent, QName startName, ParticleBinding particle)
+ {
+ TermBinding term = particle.getTerm();
+ if(term.isSkip())
+ {
+ return null;
+ }
+
+ if(parent != null &&
+ !(parent instanceof GenericValueContainer) &&
+ (parent instanceof Collection == false) &&
+ term.getAddMethodMetaData() == null &&
+ term.getMapEntryMetaData() == null &&
+ term.getPutMethodMetaData() == null)
+ {
+ ValueListHandler handler = ValueListHandler.FACTORY.lazy(parent);
+ Class<?> cls = parent.getClass();
+ return new ValueListInitializer().newValueList(handler, cls);
+ }
+ return null;
+ }
+
+ public void endRepeatableParticle(Object parent, Object o, QName elementName, ParticleBinding particle, ParticleBinding parentParticle)
+ {
+ if (o == null)
+ throw new IllegalArgumentException("Collection value is null for repeatable particle " + particle.getTerm());
+
+ ValueList valueList = (ValueList) o;
+ if (valueList.size() == 0)
+ return;
+
+ if (particle.getTerm().isWildcard())
+ {
+ ParticleHandler handler = null;
+
+ // that's not good. some elements can be handled as "unresolved" and some as "resolved"
+ QName qName = valueList.getValue(0).qName;
+ Collection<Object> col = new ArrayList<Object>();
+ for (int i = 0; i < valueList.size(); ++i)
+ {
+ NonRequiredValue value = valueList.getValue(i);
+ col.add(value.value);
+
+ if (handler != value.handler)
+ {
+ if (handler == null && i == 0)
+ {
+ handler = (ParticleHandler) value.handler;
+ }
+ else
+ {
+ throw new JBossXBRuntimeException("Handlers in the list are supposed to be the same.");
+ }
+ }
+ }
+
+ handler.setParent(parent, col, qName, particle, parentParticle);
+ }
+ else
+ {
+ valueList.getHandler().newInstance(particle, valueList);
+ }
+ }
+
+ public void addTermValue(Object particleValue, Object termValue, QName elementName,
+ ParticleBinding particle, ParticleBinding parentParticle, ParticleHandler handler)
+ {
+ ValueList valueList = (ValueList)particleValue;
+ valueList.getInitializer().addTermValue(elementName, particle, handler, valueList, termValue, parentParticle);
+ }
+}
\ No newline at end of file
Added: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/CollectionRepeatableParticleHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/CollectionRepeatableParticleHandler.java (rev 0)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/CollectionRepeatableParticleHandler.java 2009-11-04 16:22:22 UTC (rev 3634)
@@ -0,0 +1,72 @@
+/*
+* 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.binding.sunday.unmarshalling;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import javax.xml.namespace.QName;
+
+/**
+ *
+ * @author <a href="alex at jboss.com">Alexey Loubyansky</a>
+ * @version $Revision: 1.1 $
+ */
+public class CollectionRepeatableParticleHandler implements RepeatableParticleHandler
+{
+ public static final CollectionRepeatableParticleHandler INSTANCE = new CollectionRepeatableParticleHandler();
+
+ public Object startRepeatableParticle(Object parent, QName startName, ParticleBinding particle)
+ {
+ return createCollection();
+ }
+
+ public void endRepeatableParticle(Object parent, Object o, QName elementName, ParticleBinding particle, ParticleBinding parentParticle)
+ {
+ if(o == null)
+ return;
+
+ ParticleHandler handler;
+ TermBinding term = particle.getTerm();
+ if(term.isElement())
+ handler = ((ElementBinding)term).getType().getHandler();
+ else if(term.isModelGroup())
+ handler = ((ModelGroupBinding)term).getHandler();
+ else
+ handler = ((WildcardBinding)term).getWildcardHandler();
+
+ if(handler == null)
+ handler = DefaultHandlers.ELEMENT_HANDLER;
+ handler.setParent(parent, o, elementName, particle, parentParticle);
+ }
+
+ public void addTermValue(Object particleValue, Object termValue, QName elementName,
+ ParticleBinding particle, ParticleBinding parentParticle, ParticleHandler handler)
+ {
+ ((Collection<Object>)particleValue).add(termValue);
+ }
+
+ protected Collection<Object> createCollection()
+ {
+ return new ArrayList<Object>();
+ }
+}
\ No newline at end of file
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/DefaultHandlers.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/DefaultHandlers.java 2009-11-04 15:07:42 UTC (rev 3633)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/DefaultHandlers.java 2009-11-04 16:22:22 UTC (rev 3634)
@@ -56,4 +56,6 @@
public static CharactersHandler CHARACTERS_HANDLER = RtCharactersHandler.INSTANCE;
public static ParticleHandler XOP_HANDLER = new XOPElementHandler();
+
+ public static RepeatableParticleHandler REPEATABLE_HANDLER = NoopRepeatableParticleHandler.INSTANCE;
}
Added: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/NoopRepeatableParticleHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/NoopRepeatableParticleHandler.java (rev 0)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/NoopRepeatableParticleHandler.java 2009-11-04 16:22:22 UTC (rev 3634)
@@ -0,0 +1,48 @@
+/*
+* 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.binding.sunday.unmarshalling;
+
+import javax.xml.namespace.QName;
+
+/**
+ *
+ * @author <a href="alex at jboss.com">Alexey Loubyansky</a>
+ * @version $Revision: 1.1 $
+ */
+public class NoopRepeatableParticleHandler implements RepeatableParticleHandler
+{
+ public static final NoopRepeatableParticleHandler INSTANCE = new NoopRepeatableParticleHandler();
+
+ public Object startRepeatableParticle(Object parent, QName startName, ParticleBinding particle)
+ {
+ return null;
+ }
+
+ public void endRepeatableParticle(Object parent, Object o, QName elementName, ParticleBinding particle, ParticleBinding parentParticle)
+ {
+ }
+
+ public void addTermValue(Object particleValue, Object termValue, QName elementName,
+ ParticleBinding particle, ParticleBinding parentParticle, ParticleHandler handler)
+ {
+ }
+}
\ No newline at end of file
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/RepeatableParticleHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/RepeatableParticleHandler.java 2009-11-04 15:07:42 UTC (rev 3633)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/RepeatableParticleHandler.java 2009-11-04 16:22:22 UTC (rev 3634)
@@ -21,18 +21,11 @@
*/
package org.jboss.xb.binding.sunday.unmarshalling;
-import java.util.ArrayList;
-import java.util.Collection;
import javax.xml.namespace.QName;
-import org.jboss.xb.binding.GenericValueContainer;
-import org.jboss.xb.binding.JBossXBRuntimeException;
-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.group.ValueList.NonRequiredValue;
+
/**
* A RepeatableParticleHandler.
*
@@ -41,140 +34,9 @@
*/
public interface RepeatableParticleHandler
{
- RepeatableParticleHandler VALUE_LIST = new RepeatableParticleHandler()
- {
- public Object startRepeatableParticle(Object parent, QName startName, ParticleBinding particle)
- {
- TermBinding term = particle.getTerm();
- if(term.isSkip())
- {
- return null;
- }
-
- if(parent != null &&
- !(parent instanceof GenericValueContainer) &&
- (parent instanceof Collection == false) &&
- term.getAddMethodMetaData() == null &&
- term.getMapEntryMetaData() == null &&
- term.getPutMethodMetaData() == null)
- {
- ValueListHandler handler = ValueListHandler.FACTORY.lazy(parent);
- Class<?> cls = parent.getClass();
- return new ValueListInitializer().newValueList(handler, cls);
- }
- return null;
- }
-
- public void endRepeatableParticle(Object parent, Object o, QName elementName, ParticleBinding particle, ParticleBinding parentParticle)
- {
- if (o == null)
- throw new IllegalArgumentException("Collection value is null for repeatable particle " + particle.getTerm());
-
- ValueList valueList = (ValueList) o;
- if (valueList.size() == 0)
- return;
-
- if (particle.getTerm().isWildcard())
- {
- ParticleHandler handler = null;
-
- // that's not good. some elements can be handled as "unresolved" and some as "resolved"
- QName qName = valueList.getValue(0).qName;
- Collection<Object> col = new ArrayList<Object>();
- for (int i = 0; i < valueList.size(); ++i)
- {
- NonRequiredValue value = valueList.getValue(i);
- col.add(value.value);
-
- if (handler != value.handler)
- {
- if (handler == null && i == 0)
- {
- handler = (ParticleHandler) value.handler;
- }
- else
- {
- throw new JBossXBRuntimeException("Handlers in the list are supposed to be the same.");
- }
- }
- }
-
- handler.setParent(parent, col, qName, particle, parentParticle);
- }
- else
- {
- valueList.getHandler().newInstance(particle, valueList);
- }
- }
-
- public void addTermValue(Object parent, Object particleValue, Object termValue, QName elementName,
- ParticleBinding particle, ParticleBinding parentParticle, ParticleHandler handler)
- {
- if(parent == termValue)
- return;
-
- ValueList valueList = (ValueList)particleValue;
- valueList.getInitializer().addTermValue(elementName, particle, handler, valueList, termValue, parentParticle);
- }
- };
-
- RepeatableParticleHandler NOOP = new RepeatableParticleHandler()
- {
- public Object startRepeatableParticle(Object parent, QName startName, ParticleBinding particle)
- {
- return null;
- }
-
- public void endRepeatableParticle(Object parent, Object o, QName elementName, ParticleBinding particle, ParticleBinding parentParticle)
- {
- }
-
- public void addTermValue(Object parent, Object particleValue, Object termValue, QName elementName,
- ParticleBinding particle, ParticleBinding parentParticle, ParticleHandler handler)
- {
- }
- };
-
- RepeatableParticleHandler LIST = new RepeatableParticleHandler()
- {
- public Object startRepeatableParticle(Object parent, QName startName, ParticleBinding particle)
- {
- return new ArrayList<Object>();
- }
-
- public void endRepeatableParticle(Object parent, Object o, QName elementName, ParticleBinding particle, ParticleBinding parentParticle)
- {
- if(o == null)
- return;
-
- ParticleHandler handler;
- TermBinding term = particle.getTerm();
- if(term.isElement())
- {
- handler = ((ElementBinding)term).getType().getHandler();
- }
- else if(term.isModelGroup())
- {
- handler = ((ModelGroupBinding)term).getHandler();
- }
- else
- {
- handler = ((WildcardBinding)term).getWildcardHandler();
- }
-
- handler.setParent(parent, o, elementName, particle, parentParticle);
- }
-
- public void addTermValue(Object parent, Object particleValue, Object termValue, QName elementName,
- ParticleBinding particle, ParticleBinding parentParticle, ParticleHandler handler)
- {
- ((Collection<Object>)particleValue).add(termValue);
- }
- };
-
Object startRepeatableParticle(Object parent, QName startName, ParticleBinding particle);
- void addTermValue(Object parent, Object particleValue, Object termValue, QName elementName, ParticleBinding particle, ParticleBinding parentParticle, ParticleHandler handler);
+ void addTermValue(Object particleValue, Object termValue, QName elementName, ParticleBinding particle, ParticleBinding parentParticle, ParticleHandler handler);
void endRepeatableParticle(Object parent, Object o, QName elementName, ParticleBinding particle, ParticleBinding parentParticle);
}
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-04 15:07:42 UTC (rev 3633)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SundayContentHandler.java 2009-11-04 16:22:22 UTC (rev 3634)
@@ -66,7 +66,6 @@
private NamespaceRegistry nsRegistry = new NamespaceRegistry();
private ParticleHandler defParticleHandler = DefaultHandlers.ELEMENT_HANDLER;
- private RepeatableParticleHandler defRepeatableHandler = RepeatableParticleHandler.VALUE_LIST;
private UnmarshallingContextImpl ctx = new UnmarshallingContextImpl();
// DTD information frm startDTD
@@ -592,9 +591,10 @@
);
}
- element = new ElementBinding(schemaBinding, startName, xsiTypeBinding);
+ ElementBinding xsiElement = new ElementBinding(schemaBinding, startName, xsiTypeBinding);
+ xsiElement.setRepeatableHandler(element.getRepeatableHandler());
particle =
- new ParticleBinding(element,
+ new ParticleBinding(xsiElement,
particle.getMinOccurs(),
particle.getMaxOccurs(),
particle.getMaxOccursUnbounded()
@@ -805,7 +805,9 @@
{
if(trace)
log.trace(" start repeatable (" + stack.size() + "): " + particle.getTerm());
- return defRepeatableHandler.startRepeatableParticle(parent, startName, particle);
+ RepeatableParticleHandler repeatableHandler = particle.getTerm().getRepeatableHandler();
+ // the way it is now it's never null
+ return repeatableHandler.startRepeatableParticle(parent, startName, particle);
}
private void endRepeatableParticle(Object parent, Object o, QName elementName, ParticleBinding particle, ParticleBinding parentParticle)
@@ -813,7 +815,9 @@
if (trace)
log.trace(" end repeatable (" + stack.size() + "): " + particle.getTerm());
- defRepeatableHandler.endRepeatableParticle(parent, o, elementName, particle, parentParticle);
+ RepeatableParticleHandler repeatableHandler = particle.getTerm().getRepeatableHandler();
+ // the way it is now it's never null
+ repeatableHandler.endRepeatableParticle(parent, o, elementName, particle, parentParticle);
}
private void endParticle(QName qName, StackItem item, StackItem parentItem)
@@ -841,7 +845,10 @@
if(parentItem.repeatableParticleValue == null)
setParent(handler, parentItem.o, o, qName, modelGroupParticle, parentParticle);
else
- defRepeatableHandler.addTermValue(parentItem.o, parentItem.repeatableParticleValue, o, qName, modelGroupParticle, parentParticle, handler);
+ {
+ RepeatableParticleHandler repeatableHandler = modelGroupParticle.getTerm().getRepeatableHandler();
+ repeatableHandler.addTermValue(parentItem.repeatableParticleValue, o, qName, modelGroupParticle, parentParticle, handler);
+ }
}
}
@@ -1133,7 +1140,10 @@
if(parentItem.repeatableParticleValue == null)
setParent(handler, parent, o, endName, particle, parentParticle);
else
- defRepeatableHandler.addTermValue(parent, parentItem.repeatableParticleValue, o, endName, particle, parentParticle, handler);
+ {
+ RepeatableParticleHandler repeatableHandler = particle.getTerm().getRepeatableHandler();
+ repeatableHandler.addTermValue(parentItem.repeatableParticleValue, o, endName, particle, parentParticle, handler);
+ }
}
else if(parentParticle != null && hasWildcard && stack.size() > 1)
{
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/TermBinding.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/TermBinding.java 2009-11-04 15:07:42 UTC (rev 3633)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/TermBinding.java 2009-11-04 16:22:22 UTC (rev 3634)
@@ -49,6 +49,7 @@
protected ValueAdapter valueAdapter;
protected TermBeforeMarshallingCallback beforeMarshallingCallback;
protected TermBeforeSetParentCallback beforeSetParentCallback;
+ protected RepeatableParticleHandler repeatableHandler = DefaultHandlers.REPEATABLE_HANDLER;
protected TermBinding(SchemaBinding schema)
{
@@ -187,4 +188,14 @@
{
return beforeSetParentCallback;
}
+
+ public RepeatableParticleHandler getRepeatableHandler()
+ {
+ return repeatableHandler;
+ }
+
+ public void setRepeatableHandler(RepeatableParticleHandler repeatableHandler)
+ {
+ this.repeatableHandler = repeatableHandler;
+ }
}
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/WildcardBinding.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/WildcardBinding.java 2009-11-04 15:07:42 UTC (rev 3633)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/WildcardBinding.java 2009-11-04 16:22:22 UTC (rev 3634)
@@ -249,7 +249,9 @@
type.setSimpleType(unresolvedCharactersHandler);
type.setParticle(new ParticleBinding(sequence, 1, 0, true));
- return new ElementBinding(schema, qName, type);
+ ElementBinding element = new ElementBinding(schema, qName, type);
+ element.setRepeatableHandler(repeatableHandler);
+ return element;
}
public boolean isSkip()
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/XsdBinder.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/XsdBinder.java 2009-11-04 15:07:42 UTC (rev 3633)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/XsdBinder.java 2009-11-04 16:22:22 UTC (rev 3634)
@@ -57,6 +57,7 @@
import org.jboss.xb.binding.Util;
import org.jboss.xb.binding.resolver.MultiClassSchemaResolver;
import org.jboss.xb.binding.sunday.xop.XOPIncludeHandler;
+import org.jboss.xb.binding.group.ValueListRepeatableParticleHandler;
import org.jboss.xb.binding.metadata.AddMethodMetaData;
import org.jboss.xb.binding.metadata.CharactersMetaData;
import org.jboss.xb.binding.metadata.ClassMetaData;
@@ -976,6 +977,7 @@
private void bindParticle(XSParticle particle)
{
+ ParticleBinding particleBinding = null;
XSTerm term = particle.getTerm();
switch(term.getType())
{
@@ -986,7 +988,7 @@
{
ModelGroupBinding groupBinding = bindModelGroup(modelGroup);
- ParticleBinding particleBinding = new ParticleBinding(groupBinding);
+ particleBinding = new ParticleBinding(groupBinding);
particleBinding.setMaxOccursUnbounded(particle.getMaxOccursUnbounded());
particleBinding.setMinOccurs(particle.getMinOccurs());
particleBinding.setMaxOccurs(particle.getMaxOccurs());
@@ -1020,10 +1022,10 @@
}
break;
case XSConstants.WILDCARD:
- bindWildcard(particle);
+ particleBinding = bindWildcard(particle);
break;
case XSConstants.ELEMENT_DECLARATION:
- bindElement(
+ particleBinding = bindElement(
(XSElementDeclaration)term,
particle.getMinOccurs(),
particle.getMaxOccurs(),
@@ -1033,6 +1035,9 @@
default:
throw new IllegalStateException("Unexpected term type: " + term.getType());
}
+
+ if(particleBinding != null)
+ particleBinding.getTerm().setRepeatableHandler(ValueListRepeatableParticleHandler.INSTANCE);
}
private ModelGroupBinding bindModelGroup(XSModelGroup modelGroup)
@@ -1069,7 +1074,7 @@
return groupBinding;
}
- private void bindWildcard(XSParticle particle)
+ private ParticleBinding bindWildcard(XSParticle particle)
{
WildcardBinding binding = new WildcardBinding(schema);
@@ -1096,6 +1101,7 @@
customizeTerm(annotation, binding, trace);
}
}
+ return particleBinding;
}
private ParticleBinding bindElement(XSElementDeclaration elementDec,
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 2009-11-04 15:07:42 UTC (rev 3633)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/impl/runtime/RtElementHandler.java 2009-11-04 16:22:22 UTC (rev 3634)
@@ -309,20 +309,9 @@
}
if (trace)
- {
log.trace("setParent " + qName + " metadata set " + propName);
- }
- /*if(particle.isRepeatable())
- {
- RtUtil.add(owner, o, propName, colType,
- term.getSchema().isIgnoreUnresolvedFieldOrClass(),
- term.getValueAdapter()
- );
- }
- else
- {*/
-
+ // TODO with RepeatableParticleHandler.NOOP check for Collection should be commented out
if(particle.isRepeatable() && !(o instanceof Collection))
{
RtUtil.add(owner, o, propName, colType,
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-04 15:07:42 UTC (rev 3633)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java 2009-11-04 16:22:22 UTC (rev 3634)
@@ -95,6 +95,7 @@
import org.jboss.xb.annotations.JBossXmlValue;
import org.jboss.xb.binding.JBossXBRuntimeException;
import org.jboss.xb.binding.SimpleTypeBindings;
+import org.jboss.xb.binding.sunday.unmarshalling.CollectionRepeatableParticleHandler;
import org.jboss.xb.binding.sunday.unmarshalling.AllBinding;
import org.jboss.xb.binding.sunday.unmarshalling.AnyAttributeBinding;
import org.jboss.xb.binding.sunday.unmarshalling.AttributeBinding;
@@ -107,6 +108,7 @@
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.RepeatableParticleHandler;
import org.jboss.xb.binding.sunday.unmarshalling.SchemaBinding;
import org.jboss.xb.binding.sunday.unmarshalling.SequenceBinding;
import org.jboss.xb.binding.sunday.unmarshalling.TypeBinding;
@@ -1620,12 +1622,15 @@
}
else
{
+ RepeatableParticleHandler repeatableHandler = null;
XBValueAdapter valueAdapter = null;
XmlJavaTypeAdapter xmlTypeAdapter = property.getUnderlyingAnnotation(XmlJavaTypeAdapter.class);
if (xmlTypeAdapter != null)
{
valueAdapter = new XBValueAdapter(xmlTypeAdapter.value(), propertyType.getTypeInfoFactory());
localPropertyType = valueAdapter.getAdaptedTypeInfo();
+ if(localPropertyType.isCollection())
+ repeatableHandler = CollectionRepeatableParticleHandler.INSTANCE;
}
ModelGroupBinding targetGroup = localModel;
@@ -1750,6 +1755,8 @@
ElementBinding elementBinding = createElementBinding(localPropertyType, elementType, propertyQName, false);
elementBinding.setNillable(nillable);
elementBinding.setValueAdapter(valueAdapter);
+ if(repeatableHandler != null)
+ elementBinding.setRepeatableHandler(repeatableHandler);
JBossXmlPreserveWhitespace preserveSpace = property.getUnderlyingAnnotation(JBossXmlPreserveWhitespace.class);
if (preserveSpace != null)
More information about the jboss-svn-commits
mailing list