[jboss-svn-commits] JBoss Common SVN: r3869 - in jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling: position and 1 other directory.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Dec 18 06:27:17 EST 2009


Author: alex.loubyansky at jboss.com
Date: 2009-12-18 06:27:16 -0500 (Fri, 18 Dec 2009)
New Revision: 3869

Modified:
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/PositionStack.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/position/ElementPosition.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/position/NonElementPosition.java
Log:
got rid of the stack impl (as a component/API thing)

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/PositionStack.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/PositionStack.java	2009-12-16 12:45:58 UTC (rev 3868)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/PositionStack.java	2009-12-18 11:27:16 UTC (rev 3869)
@@ -23,7 +23,6 @@
 
 import org.jboss.xb.binding.NamespaceRegistry;
 import org.jboss.xb.binding.sunday.unmarshalling.SundayContentHandler.UnmarshallingContextImpl;
-import org.jboss.xb.binding.sunday.unmarshalling.position.Position;
 
 /**
  * @author <a href="mailto:alex at jboss.org">Alexey Loubyansky</a>
@@ -31,16 +30,6 @@
  */
 public interface PositionStack
 {
-   void push(Position o);
-
-   Position pop();
-
-   Position head();
-
-   void clear();
-
-   // TODO not really stack methods
-   
    NamespaceRegistry getNamespaceRegistry();
    
    UnmarshallingContextImpl getContext();

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-12-16 12:45:58 UTC (rev 3868)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SundayContentHandler.java	2009-12-18 11:27:16 UTC (rev 3869)
@@ -47,7 +47,7 @@
  * @version <tt>$Revision$</tt>
  */
 public class SundayContentHandler
-   implements JBossXBParser.DtdAwareContentHandler
+   implements JBossXBParser.DtdAwareContentHandler, PositionStack
 {
    final static Logger log = Logger.getLogger(SundayContentHandler.class);
 
@@ -56,10 +56,8 @@
    private final SchemaBindingResolver schemaResolver;
    private final SchemaBinding schema;
 
-   private final StackImpl stack = new StackImpl();
-
-   private Object root;
-
+   private Position head;
+   
    // DTD information frm startDTD
    private String dtdRootName;
    private String dtdPublicId;
@@ -99,7 +97,7 @@
 
    public void characters(char[] ch, int start, int length)
    {
-      Position position = stack.head();
+      Position position = head;
       if(!position.isElement())
          return;
       
@@ -116,69 +114,39 @@
 
    public void endElement(String namespaceURI, String localName, String qName)
    {
-      ElementBinding elementBinding = null;
-      Position position = stack.head;
-      while(elementBinding == null && position != null)
+      while(head != null)
       {
-         if(position.isElement())
+         if(head.isElement())
          {
-            if(position.isEnded())
+            if(!head.isEnded())
             {
-               if(position.getRepeatableParticleValue() != null)
-                  position.endRepeatableParticle();
-               stack.pop();
-            }
-            else
-            {
-               elementBinding = (ElementBinding)position.getParticle().getTerm();
-
+               QName elementQName = head.getParticle().getTerm().getQName();
                QName endName = localName.length() == 0 ? new QName(qName) : new QName(namespaceURI, localName);
-               if(!elementBinding.getQName().equals(endName))
+               if(!elementQName.equals(endName))
                {
                   throw new JBossXBRuntimeException("Failed to end element " +
                      new QName(namespaceURI, localName) +
-                     ": element on the stack is " + elementBinding.getQName()
+                     ": element on the stack is " + elementQName
                   );
                }
-
-               position.endParticle();
+               head.endParticle();
+               break;
             }
          }
          else
          {
-            position.endParticle();
-            if(position.getRepeatableParticleValue() != null)
-               position.endRepeatableParticle();
-            stack.pop();
+            head.endParticle();
          }
-         position = stack.head;
-      }
 
-      if(elementBinding == null)
-         throw new JBossXBRuntimeException("Failed to endElement " + qName + ": binding not found");
+         // assert head.isEnded() == true
+         if(head.getRepeatableParticleValue() != null)
+            head.endRepeatableParticle();
 
-      if(stack.head.getPrevious() == null)
-      {
-         root = elementBinding.getType().getValueAdapter().cast(position.getValue(), Object.class);
-         stack.clear();
-         
-         if(sawDTD)
-         {
-            // Probably should be integrated into schema binding?
-            try
-            {
-               // setDTD(String root, String publicId, String systemId)
-               Class[] sig = {String.class, String.class, String.class};
-               Method setDTD = root.getClass().getMethod("setDTD", sig);
-               Object[] args = {dtdRootName, dtdPublicId, dtdSystemId};
-               setDTD.invoke(root, args);
-            }
-            catch(Exception e)
-            {
-               log.debug("No setDTD found on root: " + root);
-            }
-         }
+         head = head.getPrevious();
       }
+
+      if(head == null)
+         throw new JBossXBRuntimeException("Failed to endElement " + qName + ": binding not found");
    }
 
    public void startElement(String namespaceURI,
@@ -192,7 +160,7 @@
 
       atts = preprocessAttributes(atts);
       
-      if(stack.head == null)
+      if(head == null)
       {
          ParticleBinding particle = null;
          if(schemaBinding != null)
@@ -229,19 +197,22 @@
             throw new JBossXBRuntimeException(sb.toString());
          }
          
-         new ElementPosition(startName, particle).push(stack, atts, false);
+         ElementPosition next = new ElementPosition(startName, particle);
+         next.push(this, atts, false);
+         head = next;
          return;
       }
 
-      while (stack.head != null)
+      while (head != null)
       {
-         ElementPosition next = stack.head.startParticle(startName, atts);
+         ElementPosition next = head.startParticle(startName, atts);
          if (next != null)
          {
-            next.push(stack, atts, stack.head == next);
+            next.push(this, atts, head == next);
+            head = next;
             break;
          }
-         stack.pop();
+         head = head.getPrevious();
       }
    }
 
@@ -261,6 +232,31 @@
 
    public Object getRoot()
    {
+      if(head.getPrevious() != null)
+         throw new IllegalStateException("The stack still contains positions!");
+
+      ElementBinding elementBinding = (ElementBinding) head.getParticle().getTerm();
+      Object root = elementBinding.getType().getValueAdapter().cast(head.getValue(), Object.class);
+      head = null;
+         
+      if (sawDTD)
+      {
+         // Probably should be integrated into schema binding?
+         try
+         {
+            // setDTD(String root, String publicId, String systemId)
+            Class[] sig = {String.class, String.class, String.class};
+            Method setDTD = root.getClass().getMethod("setDTD", sig);
+            Object[] args = {dtdRootName, dtdPublicId, dtdSystemId};
+            setDTD.invoke(root, args);
+         }
+         catch (Exception e)
+         {
+            if(trace)
+               log.trace("No setDTD found on root: " + root);
+         }
+      }
+
       return root;
    }
 
@@ -305,54 +301,18 @@
       return attrs;
    }
 
-   // Inner
+   public UnmarshallingContextImpl getContext()
+   {
+      return ctx;
+   }
 
-   public class StackImpl implements PositionStack
+   public NamespaceRegistry getNamespaceRegistry()
    {
-      private Position head;
-      private Position peek1;
+      return nsRegistry;
+   }
 
-      public void clear()
-      {
-         head = null;
-         peek1 = null;
-      }
+   // Inner
 
-      public void push(Position o)
-      {
-         peek1 = head;
-         head = o;
-         o.setStack(this);
-         if(trace)
-            log.trace("pushed " + o.getParticle().getTerm());
-      }
-
-      public Position pop()
-      {
-         Position popped = head;
-         head = peek1;
-         peek1 = peek1.getPrevious();
-         if(trace)
-            log.trace("popped " + popped.getParticle().getTerm());
-         return popped;
-      }
-
-      public Position head()
-      {
-         return head;
-      }
-
-      public UnmarshallingContextImpl getContext()
-      {
-         return ctx;
-      }
-
-      public NamespaceRegistry getNamespaceRegistry()
-      {
-         return nsRegistry;
-      }
-   }
-   
    public static class UnmarshallingContextImpl implements UnmarshallingContext
    {
       public Object parent;

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/position/ElementPosition.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/position/ElementPosition.java	2009-12-16 12:45:58 UTC (rev 3868)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/position/ElementPosition.java	2009-12-18 11:27:16 UTC (rev 3869)
@@ -230,7 +230,7 @@
          if (newPosition.getParticle().isRepeatable())
             newPosition.startRepeatableParticle();
 
-         stack.push(newPosition);
+         newPosition.setStack(stack);
          newPosition.initValue(atts);
          newPosition.setParentType(parentType);
          newPosition = newPosition.getNext();
@@ -532,6 +532,7 @@
    
    public void push(PositionStack stack, Attributes atts, boolean repeated)
    {
+      this.stack = stack;
       ElementBinding element = (ElementBinding) particle.getTerm();
 
       // TODO xsi:type support should be implemented in a better way
@@ -624,9 +625,6 @@
             interceptorObjects[ioIndex--] = parent;
          }
       }
-      
-      if (!repeated)
-         stack.push(this);
 
       String nil = atts.getValue(Constants.NS_XML_SCHEMA_INSTANCE, "nil");
       if (nil == null || !("1".equals(nil) || "true".equals(nil)))

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/position/NonElementPosition.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/position/NonElementPosition.java	2009-12-16 12:45:58 UTC (rev 3868)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/position/NonElementPosition.java	2009-12-18 11:27:16 UTC (rev 3869)
@@ -88,7 +88,7 @@
          if (newPosition.getParticle().isRepeatable())
             newPosition.startRepeatableParticle();
 
-         stack.push(newPosition);
+         newPosition.setStack(stack);
          newPosition.initValue(atts);
          newPosition.setParentType(parentType);
          newPosition = newPosition.getNext();
@@ -103,8 +103,6 @@
       endParticle();
       if(repeatableParticleValue != null)
          endRepeatableParticle();
-
-      previous = null;
       next = null;
       occurrence = 0;
    }



More information about the jboss-svn-commits mailing list