[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