[jboss-svn-commits] JBoss Common SVN: r2061 - in jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday: unmarshalling xop
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon Sep 25 10:55:59 EDT 2006
Author: alex.loubyansky at jboss.com
Date: 2006-09-25 10:55:56 -0400 (Mon, 25 Sep 2006)
New Revision: 2061
Modified:
jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/JBXB76ContentHandler.java
jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/xop/XOPElementHandler.java
jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/xop/XOPIncludeHandler.java
Log:
unmarshalling part of JBXB-85
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-25 14:51:04 UTC (rev 2060)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/JBXB76ContentHandler.java 2006-09-25 14:55:56 UTC (rev 2061)
@@ -29,6 +29,7 @@
import org.apache.xerces.xs.XSTypeDefinition;
import org.jboss.logging.Logger;
import org.jboss.util.StringPropertyReplacer;
+import org.jboss.xb.binding.Constants;
import org.jboss.xb.binding.GenericValueContainer;
import org.jboss.xb.binding.JBossXBRuntimeException;
import org.jboss.xb.binding.NamespaceRegistry;
@@ -39,6 +40,7 @@
import org.jboss.xb.binding.metadata.CharactersMetaData;
import org.jboss.xb.binding.metadata.ValueMetaData;
import org.jboss.xb.binding.parser.JBossXBParser;
+import org.jboss.xb.binding.sunday.xop.XOPIncludeHandler;
import org.xml.sax.Attributes;
/**
@@ -151,7 +153,7 @@
);
}
- endElement(item.o, item.particle, item.textContent == null ? "" : item.textContent.toString());
+ endElement();
}
public void startElement(String namespaceURI,
@@ -162,6 +164,7 @@
{
QName startName = localName.length() == 0 ? new QName(qName) : new QName(namespaceURI, localName);
ParticleBinding particle = null;
+ ParticleHandler handler = null;
boolean repeated = false;
boolean repeatedParticle = false;
StackItem item = null;
@@ -228,6 +231,32 @@
(ModelGroupBinding)typeParticle.getTerm();
if(modelGroup == null)
{
+ if(startName.equals(Constants.QNAME_XOP_INCLUDE))
+ {
+ TypeBinding anyUriType = schema.getType(Constants.QNAME_ANYURI);
+ if(anyUriType == null)
+ {
+ log.warn("Type " + Constants.QNAME_ANYURI + " not bound.");
+ }
+
+ TypeBinding xopIncludeType = new TypeBinding(new QName(Constants.NS_XOP_INCLUDE, "Include"));
+ xopIncludeType.setSchemaBinding(schema);
+ xopIncludeType.addAttribute(new QName("href"), anyUriType, DefaultHandlers.ATTRIBUTE_HANDLER);
+ xopIncludeType.setHandler(new XOPIncludeHandler(element.getType(), schema.getXopUnmarshaller()));
+
+ ElementBinding xopInclude = new ElementBinding(schema, Constants.QNAME_XOP_INCLUDE, xopIncludeType);
+
+ particle = new ParticleBinding(xopInclude);
+
+ ElementBinding parentElement = (ElementBinding) stack.peek().particle.getTerm();
+ parentElement.setXopUnmarshaller(schema.getXopUnmarshaller());
+
+ item.handler = DefaultHandlers.XOP_HANDLER;
+ item.cHandler = CharactersHandler.NOOP;
+ item.o = item.handler.startParticle(stack.peek().o, startName, stack.peek().particle, null, nsRegistry);
+ break;
+ }
+
QName typeName = element.getType().getQName();
throw new JBossXBRuntimeException((typeName == null ? "Anonymous" : typeName.toString()) +
" type of element " +
@@ -259,9 +288,9 @@
startRepeatableParticle(startName, modelGroupParticle);
}
- ParticleHandler handler = getHandler(modelGroupParticle);
+ handler = getHandler(modelGroupParticle);
o = handler.startParticle(o, startName, modelGroupParticle, atts, nsRegistry);
- push(cursor, o);
+ push(cursor, o, handler);
}
particle = cursor.getCurrentParticle();
}
@@ -308,7 +337,7 @@
}
item.reset();
- ParticleHandler handler = getHandler(item.particle);
+ handler = getHandler(item.particle);
item.o = handler.startParticle(stack.peek(1).o, startName, item.particle, atts, nsRegistry);
}
@@ -337,9 +366,9 @@
cursor = (ModelGroupBinding.Cursor)newCursors.get(i);
ParticleBinding modelGroupParticle = cursor.getParticle();
- ParticleHandler handler = getHandler(modelGroupParticle);
+ handler = getHandler(modelGroupParticle);
o = handler.startParticle(o, startName, modelGroupParticle, atts, nsRegistry);
- push(cursor, o);
+ push(cursor, o, handler);
}
cursor = (ModelGroupBinding.Cursor)newCursors.get(0);
particle = cursor.getCurrentParticle();
@@ -432,6 +461,12 @@
throw new JBossXBRuntimeException("No type for element " + element);
}
+ handler = type.getHandler();
+ if(handler == null)
+ {
+ handler = defParticleHandler;
+ }
+
List interceptors = element.getInterceptors();
if(!interceptors.isEmpty())
{
@@ -444,7 +479,7 @@
{
ElementInterceptor interceptor = (ElementInterceptor) interceptors.get(i);
parent = interceptor.startElement(parent, startName, type);
- push(startName, particle, parent);
+ push(startName, particle, parent, handler);
interceptor.attributes(parent, startName, type, atts, nsRegistry);
}
@@ -455,12 +490,6 @@
}
}
- ParticleHandler handler = type.getHandler();
- if(handler == null)
- {
- handler = defParticleHandler;
- }
-
String nil = atts.getValue("xsi:nil");
if(nil == null || !("1".equals(nil) || "true".equals(nil)))
{
@@ -508,7 +537,7 @@
}
else
{
- push(startName, particle, o);
+ push(startName, particle, o, handler);
}
}
@@ -676,7 +705,7 @@
}
ParticleBinding modelGroupParticle = item.particle;
- ParticleHandler handler = getHandler(modelGroupParticle);
+ ParticleHandler handler = item.handler;//getHandler(modelGroupParticle);
Object o;
if(item.o instanceof ValueList && !modelGroupParticle.getTerm().isSkip())
@@ -731,8 +760,12 @@
// Private
- private void endElement(Object o, ParticleBinding particle, String textContent)
+ private void endElement()
{
+ StackItem item = stack.peek();
+ Object o = item.o;
+ ParticleBinding particle = item.particle;
+
ElementBinding element = (ElementBinding)particle.getTerm();
QName endName = element.getQName();
TypeBinding type = element.getType();
@@ -751,7 +784,7 @@
charType = type;
}
- CharactersHandler charHandler = charType.getCharactersHandler();
+ CharactersHandler charHandler = item.cHandler == null ? charType.getCharactersHandler() : item.cHandler;
/**
* If there is text content then unmarshal it and set.
@@ -761,6 +794,7 @@
* of the empty text content is assumed to be null
* (in case of simple types that's not always true and depends on nillable attribute).
*/
+ String textContent = item.textContent == null ? "" : item.textContent.toString();
if(textContent.length() > 0 || charHandler != null && type.isSimple())
{
String dataContent;
@@ -874,12 +908,8 @@
StackItem parentItem = stack.size() == 1 ? null : stack.peek(1);
Object parent = parentItem == null ? null : parentItem.o;
- ParticleHandler handler = type.getHandler();
- if(handler == null)
- {
- handler = defParticleHandler;
- }
-
+ ParticleHandler handler = stack.peek().handler;
+
if(o instanceof ValueList && !particle.getTerm().isSkip())
{
if(trace)
@@ -912,8 +942,8 @@
ListIterator iter = stack.prevIterator();
while(iter.hasPrevious())
{
- StackItem item = (StackItem)iter.previous();
- ParticleBinding peeked = item.particle;
+ StackItem prev = (StackItem)iter.previous();
+ ParticleBinding peeked = prev.particle;
if(peeked != null && peeked.getTerm() instanceof ElementBinding)
{
parentParticle = peeked;
@@ -1010,9 +1040,9 @@
}
}
- private void push(QName qName, ParticleBinding particle, Object o)
+ private void push(QName qName, ParticleBinding particle, Object o, ParticleHandler handler)
{
- StackItem item = new StackItem(particle, o);
+ StackItem item = new StackItem(particle, o, handler);
stack.push(item);
if(trace)
{
@@ -1025,9 +1055,9 @@
}
}
- private void push(ModelGroupBinding.Cursor cursor, Object o)
+ private void push(ModelGroupBinding.Cursor cursor, Object o, ParticleHandler handler)
{
- StackItem item = new StackItem(cursor, o);
+ StackItem item = new StackItem(cursor, o, handler);
stack.push(item);
if(trace)
{
@@ -1058,25 +1088,29 @@
{
final ModelGroupBinding.Cursor cursor;
final ParticleBinding particle;
+ ParticleHandler handler;
+ CharactersHandler cHandler;
Object o;
ValueList repeatableParticleValue;
StringBuffer textContent;
boolean ended;
- public StackItem(ModelGroupBinding.Cursor cursor, Object o)
+ public StackItem(ModelGroupBinding.Cursor cursor, Object o, ParticleHandler handler)
{
// this is modelgroup particle
this.cursor = cursor;
this.particle = cursor.getParticle();
this.o = o;
+ this.handler = handler;
}
- public StackItem(ParticleBinding particle, Object o)
+ public StackItem(ParticleBinding particle, Object o, ParticleHandler handler)
{
// this is element particle
this.cursor = null;
this.particle = particle;
this.o = o;
+ this.handler = handler;
}
void reset()
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/xop/XOPElementHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/xop/XOPElementHandler.java 2006-09-25 14:51:04 UTC (rev 2060)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/xop/XOPElementHandler.java 2006-09-25 14:55:56 UTC (rev 2061)
@@ -65,12 +65,12 @@
ParticleBinding particle,
ParticleBinding parentParticle)
{
- ElementBinding element = (ElementBinding)particle.getTerm();
- XOPUnmarshaller xopUnmarshaller = element.getXopUnmarshaller();
- if(xopUnmarshaller == null || !xopUnmarshaller.isXOPPackage())
+ if(parent == o)
{
- DefaultHandlers.ELEMENT_HANDLER.setParent(parent, o, elementName, particle, parentParticle);
+ return;
}
+
+ DefaultHandlers.ELEMENT_HANDLER.setParent(parent, o, elementName, particle, parentParticle);
}
public static class XOPElement
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/xop/XOPIncludeHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/xop/XOPIncludeHandler.java 2006-09-25 14:51:04 UTC (rev 2060)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/xop/XOPIncludeHandler.java 2006-09-25 14:55:56 UTC (rev 2061)
@@ -46,11 +46,18 @@
{
// type that can be XOP-optimized (should actually be the element)
private final TypeBinding type;
+ private XOPUnmarshaller xopUnmarshaller;
public XOPIncludeHandler(TypeBinding type)
{
this.type = type;
}
+
+ public XOPIncludeHandler(TypeBinding type, XOPUnmarshaller xopUnmarshaller)
+ {
+ this.type = type;
+ this.xopUnmarshaller = xopUnmarshaller;
+ }
public Object startParticle(Object parent,
QName elementName,
@@ -66,7 +73,7 @@
);
}
- XOPUnmarshaller xopUnmarshaller = type.getXopUnmarshaller();
+ XOPUnmarshaller xopUnmarshaller = this.xopUnmarshaller == null ? type.getXopUnmarshaller() : this.xopUnmarshaller;
if(xopUnmarshaller == null)
{
throw new JBossXBRuntimeException(
@@ -103,7 +110,6 @@
throw new JBossXBRuntimeException("Failed to load the class to deserialize object: " + e.getMessage());
}
}
-
return content;
}
More information about the jboss-svn-commits
mailing list