[jboss-svn-commits] JBoss Common SVN: r2138 - in jbossxb/trunk/src: main/java/org/jboss/xb/binding/sunday/marshalling main/java/org/jboss/xb/binding/sunday/unmarshalling test/java/org/jboss/test/xml

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Oct 19 09:23:10 EDT 2006


Author: alex.loubyansky at jboss.com
Date: 2006-10-19 09:23:00 -0400 (Thu, 19 Oct 2006)
New Revision: 2138

Added:
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/marshalling/TermBeforeMarshallingCallback.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/TermBeforeSetParentCallback.java
Removed:
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/marshalling/TermBeforeMarshallingHandler.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/TermAfterUnmarshallingHandler.java
Modified:
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/marshalling/MarshallerImpl.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/AllBinding.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ElementBinding.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ModelGroupBinding.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SequenceBinding.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/TypeBinding.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/UnmarshallingContext.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/WildcardBinding.java
   jbossxb/trunk/src/test/java/org/jboss/test/xml/BeforeMarshalAfterUnmarshalHandlerTestCase.java
Log:
re-worked TermAfterUnmarshallingHandler to TermBeforeSetParentHandler making more useful contextual info available, other refactorings

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/marshalling/MarshallerImpl.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/marshalling/MarshallerImpl.java	2006-10-19 13:19:35 UTC (rev 2137)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/marshalling/MarshallerImpl.java	2006-10-19 13:23:00 UTC (rev 2138)
@@ -299,7 +299,7 @@
          }
       }
 
-      TermBeforeMarshallingHandler marshallingHandler = element.getBeforeMarshallingHandler();
+      TermBeforeMarshallingCallback marshallingHandler = element.getBeforeMarshallingCallback();
       if(marshallingHandler != null)
       {
          value = marshallingHandler.beforeMarshalling(value, ctx);
@@ -669,7 +669,7 @@
                 modelGroup.getSchema().isIgnoreUnresolvedFieldOrClass()
             );
 
-            TermBeforeMarshallingHandler marshallingHandler = modelGroup.getBeforeMarshallingHandler();
+            TermBeforeMarshallingCallback marshallingHandler = modelGroup.getBeforeMarshallingCallback();
 
             i = o != null && isRepeatable(particle) ? getIterator(o) : null;
             if(i != null)
@@ -717,7 +717,7 @@
             popWildcardValue = true;
          }
 
-         TermBeforeMarshallingHandler marshallingHandler = term.getBeforeMarshallingHandler();
+         TermBeforeMarshallingCallback marshallingHandler = term.getBeforeMarshallingCallback();
          
          i = o != null && isRepeatable(particle) ? getIterator(o) : null;
          if(i != null)

Added: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/marshalling/TermBeforeMarshallingCallback.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/marshalling/TermBeforeMarshallingCallback.java	2006-10-19 13:19:35 UTC (rev 2137)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/marshalling/TermBeforeMarshallingCallback.java	2006-10-19 13:23:00 UTC (rev 2138)
@@ -0,0 +1,31 @@
+/*
+  * JBoss, Home of Professional Open Source
+  * Copyright 2005, 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.marshalling;
+
+/**
+ * @author <a href="mailto:alex at jboss.org">Alexey Loubyansky</a>
+ * @version <tt>$Revision: 2096 $</tt>
+ */
+public interface TermBeforeMarshallingCallback
+{
+   Object beforeMarshalling(Object o, MarshallingContext ctx);
+}

Deleted: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/marshalling/TermBeforeMarshallingHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/marshalling/TermBeforeMarshallingHandler.java	2006-10-19 13:19:35 UTC (rev 2137)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/marshalling/TermBeforeMarshallingHandler.java	2006-10-19 13:23:00 UTC (rev 2138)
@@ -1,31 +0,0 @@
-/*
-  * JBoss, Home of Professional Open Source
-  * Copyright 2005, 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.marshalling;
-
-/**
- * @author <a href="mailto:alex at jboss.org">Alexey Loubyansky</a>
- * @version <tt>$Revision: 2096 $</tt>
- */
-public interface TermBeforeMarshallingHandler
-{
-   Object beforeMarshalling(Object o, MarshallingContext ctx);
-}

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/AllBinding.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/AllBinding.java	2006-10-19 13:19:35 UTC (rev 2137)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/AllBinding.java	2006-10-19 13:23:00 UTC (rev 2138)
@@ -56,7 +56,7 @@
 
    public void addParticle(ParticleBinding particle)
    {
-      if(!(particle.getTerm() instanceof ElementBinding))
+      if(!particle.getTerm().isElement())
       {
          throw new JBossXBRuntimeException("Model group all may contain only elements!");
       }

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ElementBinding.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ElementBinding.java	2006-10-19 13:19:35 UTC (rev 2137)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ElementBinding.java	2006-10-19 13:23:00 UTC (rev 2138)
@@ -32,7 +32,7 @@
 import org.jboss.xb.binding.metadata.PutMethodMetaData;
 import org.jboss.xb.binding.metadata.ValueMetaData;
 import org.jboss.xb.binding.JBossXBRuntimeException;
-import org.jboss.xb.binding.sunday.marshalling.TermBeforeMarshallingHandler;
+import org.jboss.xb.binding.sunday.marshalling.TermBeforeMarshallingCallback;
 import org.jboss.xb.binding.sunday.xop.XOPUnmarshaller;
 
 /**
@@ -147,14 +147,14 @@
       return valueAdapter == null ? typeBinding.getValueAdapter() : valueAdapter;
    }
 
-   public TermBeforeMarshallingHandler getBeforeMarshallingHandler()
+   public TermBeforeMarshallingCallback getBeforeMarshallingCallback()
    {
-      return beforeMarshallingHandler == null ? typeBinding.getBeforeMarshallingHandler() : beforeMarshallingHandler;
+      return beforeMarshallingCallback == null ? typeBinding.getBeforeMarshallingCallback() : beforeMarshallingCallback;
    }
 
-   public TermAfterUnmarshallingHandler getAfterUnmarshallingHandler()
+   public TermBeforeSetParentCallback getBeforeSetParentCallback()
    {
-      return afterUnmarshallingHandler == null ? typeBinding.getAfterUnmarshallingHandler() : afterUnmarshallingHandler;
+      return beforeSetParentCallback == null ? typeBinding.getBeforeSetParentCallback() : beforeSetParentCallback;
    }
 
    public boolean isNillable()
@@ -177,6 +177,11 @@
       return false;
    }
 
+   public boolean isElement()
+   {
+      return true;
+   }
+
    public XOPUnmarshaller getXopUnmarshaller()
    {
       return xopUnmarshaller == null ? typeBinding.getXopUnmarshaller() : xopUnmarshaller;

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ModelGroupBinding.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ModelGroupBinding.java	2006-10-19 13:19:35 UTC (rev 2137)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ModelGroupBinding.java	2006-10-19 13:23:00 UTC (rev 2138)
@@ -146,6 +146,11 @@
    {
       return false;
    }
+   
+   public boolean isElement()
+   {
+      return false;
+   }
 
    // Inner
 
@@ -205,8 +210,8 @@
          for(int i = 0; i < group.size(); ++i)
          {
             ParticleBinding nextParticle = (ParticleBinding)group.get(i);
-            Object item = nextParticle.getTerm();
-            if(item instanceof ElementBinding)
+            TermBinding item = nextParticle.getTerm();
+            if(item.isElement())
             {
                ElementBinding choice = (ElementBinding)item;
                if(qName.equals(choice.getQName()))
@@ -215,7 +220,7 @@
                   break;
                }
             }
-            else if(item instanceof ModelGroupBinding)
+            else if(item.isModelGroup())
             {
                ModelGroupBinding modelGroup = (ModelGroupBinding)item;
                if(!passedGroups.contains(modelGroup))
@@ -245,7 +250,7 @@
                   }
                }
             }
-            else if(item instanceof WildcardBinding && !ignoreWildcards)
+            else if(!ignoreWildcards)
             {
                WildcardBinding wildcard = (WildcardBinding)item;
                ElementBinding e = wildcard.getElement(qName, atts);

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SequenceBinding.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SequenceBinding.java	2006-10-19 13:19:35 UTC (rev 2137)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SequenceBinding.java	2006-10-19 13:23:00 UTC (rev 2138)
@@ -58,7 +58,7 @@
       {
          case 0:
             sequence = Collections.singletonList(particle);
-            if(particle.isRepeatable() && particle.getTerm() instanceof ElementBinding)
+            if(particle.isRepeatable() && particle.getTerm().isElement())
             {
                ElementBinding element = (ElementBinding)particle.getTerm();
                if(particle.isRepeatable())

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-10-19 13:19:35 UTC (rev 2137)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SundayContentHandler.java	2006-10-19 13:23:00 UTC (rev 2138)
@@ -37,7 +37,9 @@
 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.introspection.FieldInfo;
 import org.jboss.xb.binding.metadata.CharactersMetaData;
+import org.jboss.xb.binding.metadata.PropertyMetaData;
 import org.jboss.xb.binding.metadata.ValueMetaData;
 import org.jboss.xb.binding.parser.JBossXBParser;
 import org.jboss.xb.binding.sunday.xop.XOPIncludeHandler;
@@ -727,14 +729,6 @@
       else
       {
          o = handler.endParticle(item.o, qName, modelGroupParticle);
-         
-         TermAfterUnmarshallingHandler unmHandler = modelGroupParticle.getTerm().getAfterUnmarshallingHandler();
-         if(unmHandler != null)
-         {
-            ctx.particle = modelGroupParticle;
-            o = unmHandler.afterUnmarshalling(o, ctx);
-            ctx.particle = null;
-         }
       }
 
       item.ended = true;
@@ -743,7 +737,7 @@
       item = (StackItem)stack.peek(parentStackPos);
       if(item.o != null)
       {
-         ParticleBinding parentParticle = item.particle;
+         ParticleBinding parentParticle = getParentParticle();//item.particle;
          if(parentParticle == null)
          {
             parentParticle = item.particle;
@@ -775,6 +769,23 @@
 
    // Private
 
+   private ParticleBinding getParentParticle()
+   {
+      ListIterator iter = stack.prevIterator();
+      while(iter.hasPrevious())
+      {
+         StackItem prev = (StackItem)iter.previous();
+         ParticleBinding peeked = prev.particle;
+
+         TermBinding term = peeked.getTerm();
+         if(!term.isSkip())
+         {
+            return peeked;
+         }
+      }
+      return null;
+   }
+   
    private void endElement()
    {
       StackItem item = stack.peek();
@@ -873,6 +884,16 @@
                }
                else if(charHandler != null)
                {
+                  TermBeforeSetParentCallback beforeSetParent = element.getBeforeSetParentCallback();
+                  if(beforeSetParent != null)
+                  {
+                     ctx.parent = o;
+                     ctx.particle = particle;
+                     ctx.parentParticle = getParentParticle();
+                     unmarshalled = beforeSetParent.beforeSetParent(unmarshalled, ctx);
+                     ctx.clear();
+                  }
+                  
                   if(o instanceof ValueList)
                   {
                      ValueList valueList = (ValueList)o;
@@ -937,13 +958,6 @@
       else
       {
          o = handler.endParticle(o, endName, particle);
-         TermAfterUnmarshallingHandler unmHandler = particle.getTerm().getAfterUnmarshallingHandler();
-         if(unmHandler != null)
-         {
-            ctx.particle = particle;
-            o = unmHandler.afterUnmarshalling(o, ctx);
-            ctx.particle = null;
-         }
       }
 
       for(int i = interceptorsTotal - 1; i >= 0; --i)
@@ -958,23 +972,16 @@
 
       if(interceptorsTotal == 0)
       {
+         ParticleBinding parentParticle = getParentParticle();
+         boolean hasWildcard = false;
          ParticleHandler wildcardHandler = null;
-
-         ParticleBinding parentParticle = null;
-         ListIterator iter = stack.prevIterator();
-         while(iter.hasPrevious())
+         if (parentParticle != null && parentParticle.getTerm().isElement())
          {
-            StackItem prev = (StackItem)iter.previous();
-            ParticleBinding peeked = prev.particle;
-            if(peeked != null && peeked.getTerm() instanceof ElementBinding)
+            WildcardBinding wildcard = ((ElementBinding) parentParticle.getTerm()).getType().getWildcard();
+            if (wildcard != null)
             {
-               parentParticle = peeked;
-               WildcardBinding wildcard = ((ElementBinding)parentParticle.getTerm()).getType().getWildcard();
-               if(wildcard != null)
-               {
-                  wildcardHandler = wildcard.getWildcardHandler();
-               }
-               break;
+               hasWildcard = true;
+               wildcardHandler = wildcard.getWildcardHandler();
             }
          }
 
@@ -997,12 +1004,10 @@
                      o, endName, particle, parentParticle);
             }
          }
-         else if(parentParticle != null &&
-            ((ElementBinding)parentParticle.getTerm()).getType().getWildcard() != null &&
-            stack.size() > 1)
+         else if(parentParticle != null && hasWildcard && stack.size() > 1)
          {
             // the parent has anyType, so it gets the value of its child
-            iter = stack.prevIterator();
+            ListIterator iter = stack.prevIterator();
             while(iter.hasPrevious())
             {
                StackItem peeked = (StackItem)iter.previous();
@@ -1047,6 +1052,16 @@
                           ParticleBinding particle,
                           ParticleBinding parentParticle)
    {
+      TermBeforeSetParentCallback beforeSetParent = particle.getTerm().getBeforeSetParentCallback();
+      if(beforeSetParent != null)
+      {
+         ctx.parent = parent;
+         ctx.particle = particle;
+         ctx.parentParticle = parentParticle;
+         o = beforeSetParent.beforeSetParent(o, ctx);
+         ctx.clear();
+      }
+      
       if(parent instanceof ValueList /*&& !particle.getTerm().isSkip()*/)
       {
          if(parent == o)
@@ -1204,11 +1219,71 @@
    
    private class UnmarshallingContextImpl implements UnmarshallingContext
    {
+      Object parent;
       ParticleBinding particle;
+      ParticleBinding parentParticle;
       
+      public Object getParentValue()
+      {
+         return parent;
+      }
+      
       public ParticleBinding getParticle()
       {
          return particle;
       }
+      
+      public ParticleBinding getParentParticle()
+      {
+         return parentParticle;
+      }
+      
+      public String resolvePropertyName()
+      {
+         TermBinding term = particle.getTerm();
+         PropertyMetaData propertyMetaData = term.getPropertyMetaData();
+         String prop = propertyMetaData == null ? null : propertyMetaData.getName();
+         
+         if(prop != null)
+         {
+            return prop;
+         }
+         
+         if(term.isElement())
+         {
+            QName name = ((ElementBinding)term).getQName();
+            prop = Util.xmlNameToFieldName(name.getLocalPart(), term.getSchema().isIgnoreLowLine());
+         }
+         
+         return prop;
+      }
+
+      public Class resolvePropertyType()
+      {
+         if(parent == null)
+         {
+            return null;
+         }
+         
+         String prop = resolvePropertyName();
+         if(prop != null)
+         {      
+            FieldInfo fieldInfo = FieldInfo.getFieldInfo(parent.getClass(), prop, false);
+            if (fieldInfo != null)
+            {
+               return fieldInfo.getType();
+            }
+         }
+         return null;
+      }
+      
+      // private
+      
+      void clear()
+      {
+         ctx.parent = null;
+         ctx.particle = null;
+         ctx.parentParticle = null;
+      }
    }
 }

Deleted: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/TermAfterUnmarshallingHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/TermAfterUnmarshallingHandler.java	2006-10-19 13:19:35 UTC (rev 2137)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/TermAfterUnmarshallingHandler.java	2006-10-19 13:23:00 UTC (rev 2138)
@@ -1,32 +0,0 @@
-/*
-  * JBoss, Home of Professional Open Source
-  * Copyright 2005, 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;
-
-
-/**
- * @author <a href="mailto:alex at jboss.org">Alexey Loubyansky</a>
- * @version <tt>$Revision: 2045 $</tt>
- */
-public interface TermAfterUnmarshallingHandler
-{
-   Object afterUnmarshalling(Object o, UnmarshallingContext ctx);
-}

Added: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/TermBeforeSetParentCallback.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/TermBeforeSetParentCallback.java	2006-10-19 13:19:35 UTC (rev 2137)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/TermBeforeSetParentCallback.java	2006-10-19 13:23:00 UTC (rev 2138)
@@ -0,0 +1,32 @@
+/*
+  * JBoss, Home of Professional Open Source
+  * Copyright 2005, 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;
+
+
+/**
+ * @author <a href="mailto:alex at jboss.org">Alexey Loubyansky</a>
+ * @version <tt>$Revision: 2045 $</tt>
+ */
+public interface TermBeforeSetParentCallback
+{
+   Object beforeSetParent(Object o, UnmarshallingContext ctx);
+}

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	2006-10-19 13:19:35 UTC (rev 2137)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/TermBinding.java	2006-10-19 13:23:00 UTC (rev 2138)
@@ -27,7 +27,7 @@
 import org.jboss.xb.binding.metadata.PutMethodMetaData;
 import org.jboss.xb.binding.metadata.AddMethodMetaData;
 import org.jboss.xb.binding.metadata.ValueMetaData;
-import org.jboss.xb.binding.sunday.marshalling.TermBeforeMarshallingHandler;
+import org.jboss.xb.binding.sunday.marshalling.TermBeforeMarshallingCallback;
 
 /**
  * @author <a href="mailto:alex at jboss.org">Alexey Loubyansky</a>
@@ -47,8 +47,8 @@
    protected boolean mapEntryValue;
    protected Boolean skip;
    protected ValueAdapter valueAdapter;
-   protected TermBeforeMarshallingHandler beforeMarshallingHandler;
-   protected TermAfterUnmarshallingHandler afterUnmarshallingHandler;
+   protected TermBeforeMarshallingCallback beforeMarshallingCallback;
+   protected TermBeforeSetParentCallback beforeSetParentCallback;
 
    protected TermBinding(SchemaBinding schema)
    {
@@ -166,23 +166,25 @@
 
    public abstract boolean isWildcard();
 
-   public void setBeforeMarshallingHandler(TermBeforeMarshallingHandler marshallingHandler)
+   public abstract boolean isElement();
+
+   public void setBeforeMarshallingCallback(TermBeforeMarshallingCallback marshallingHandler)
    {
-      this.beforeMarshallingHandler = marshallingHandler;
+      this.beforeMarshallingCallback = marshallingHandler;
    }
 
-   public TermBeforeMarshallingHandler getBeforeMarshallingHandler()
+   public TermBeforeMarshallingCallback getBeforeMarshallingCallback()
    {
-      return beforeMarshallingHandler;
+      return beforeMarshallingCallback;
    }
 
-   public void setAfterUnmarshallingHandler(TermAfterUnmarshallingHandler unmarshallingHandler)
+   public void setBeforeSetParentCallback(TermBeforeSetParentCallback beforeSetParent)
    {
-      this.afterUnmarshallingHandler = unmarshallingHandler;
+      this.beforeSetParentCallback = beforeSetParent;
    }
 
-   public TermAfterUnmarshallingHandler getAfterUnmarshallingHandler()
+   public TermBeforeSetParentCallback getBeforeSetParentCallback()
    {
-      return afterUnmarshallingHandler;
+      return beforeSetParentCallback;
    }
 }

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/TypeBinding.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/TypeBinding.java	2006-10-19 13:19:35 UTC (rev 2137)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/TypeBinding.java	2006-10-19 13:23:00 UTC (rev 2138)
@@ -38,7 +38,7 @@
 import org.jboss.xb.binding.metadata.PropertyMetaData;
 import org.jboss.xb.binding.metadata.ValueMetaData;
 import org.jboss.xb.binding.Constants;
-import org.jboss.xb.binding.sunday.marshalling.TermBeforeMarshallingHandler;
+import org.jboss.xb.binding.sunday.marshalling.TermBeforeMarshallingCallback;
 import org.jboss.xb.binding.sunday.xop.XOPUnmarshaller;
 import org.jboss.xb.binding.sunday.xop.XOPMarshaller;
 import org.xml.sax.Attributes;
@@ -66,8 +66,8 @@
    private CharactersMetaData charMetaData;
    private AddMethodMetaData addMethodMetaData;
    private ValueAdapter valueAdapter = ValueAdapter.NOOP;
-   private TermBeforeMarshallingHandler marshallingHandler;
-   private TermAfterUnmarshallingHandler unmarshallingHandler;
+   private TermBeforeMarshallingCallback beforeMarshallingCallback;
+   private TermBeforeSetParentCallback beforeSetParentCallback;
    
    private Boolean startElementCreatesObject;
    private Boolean simple;
@@ -570,24 +570,24 @@
       return true;
    }
 
-   public void setBeforeMarshallingHandler(TermBeforeMarshallingHandler marshallingHandler)
+   public void setBeforeMarshallingCallback(TermBeforeMarshallingCallback marshallingHandler)
    {
-      this.marshallingHandler = marshallingHandler;
+      this.beforeMarshallingCallback = marshallingHandler;
    }
 
-   public TermBeforeMarshallingHandler getBeforeMarshallingHandler()
+   public TermBeforeMarshallingCallback getBeforeMarshallingCallback()
    {
-      return marshallingHandler;
+      return beforeMarshallingCallback;
    }
 
-   public void setAfterUnmarshallingHandler(TermAfterUnmarshallingHandler unmarshallingHandler)
+   public void setBeforeSetParentCallback(TermBeforeSetParentCallback beforeSetParent)
    {
-      this.unmarshallingHandler = unmarshallingHandler;
+      this.beforeSetParentCallback = beforeSetParent;
    }
 
-   public TermAfterUnmarshallingHandler getAfterUnmarshallingHandler()
+   public TermBeforeSetParentCallback getBeforeSetParentCallback()
    {
-      return unmarshallingHandler;
+      return beforeSetParentCallback;
    }
 
    public String toString()

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/UnmarshallingContext.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/UnmarshallingContext.java	2006-10-19 13:19:35 UTC (rev 2137)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/UnmarshallingContext.java	2006-10-19 13:23:00 UTC (rev 2138)
@@ -27,5 +27,13 @@
  */
 public interface UnmarshallingContext
 {
+   Object getParentValue();
+   
    ParticleBinding getParticle();
+   
+   ParticleBinding getParentParticle();
+   
+   String resolvePropertyName();
+   
+   Class resolvePropertyType();
 }

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	2006-10-19 13:19:35 UTC (rev 2137)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/WildcardBinding.java	2006-10-19 13:23:00 UTC (rev 2138)
@@ -244,4 +244,9 @@
    {
       return true;
    }
+
+   public boolean isElement()
+   {
+      return false;
+   }
 }

Modified: jbossxb/trunk/src/test/java/org/jboss/test/xml/BeforeMarshalAfterUnmarshalHandlerTestCase.java
===================================================================
--- jbossxb/trunk/src/test/java/org/jboss/test/xml/BeforeMarshalAfterUnmarshalHandlerTestCase.java	2006-10-19 13:19:35 UTC (rev 2137)
+++ jbossxb/trunk/src/test/java/org/jboss/test/xml/BeforeMarshalAfterUnmarshalHandlerTestCase.java	2006-10-19 13:23:00 UTC (rev 2138)
@@ -33,12 +33,13 @@
 import org.jboss.xb.binding.UnmarshallerFactory;
 import org.jboss.xb.binding.sunday.marshalling.MarshallerImpl;
 import org.jboss.xb.binding.sunday.marshalling.MarshallingContext;
-import org.jboss.xb.binding.sunday.marshalling.TermBeforeMarshallingHandler;
+import org.jboss.xb.binding.sunday.marshalling.TermBeforeMarshallingCallback;
 import org.jboss.xb.binding.sunday.unmarshalling.ElementBinding;
 import org.jboss.xb.binding.sunday.unmarshalling.ParticleBinding;
 import org.jboss.xb.binding.sunday.unmarshalling.SchemaBinding;
 import org.jboss.xb.binding.sunday.unmarshalling.SequenceBinding;
-import org.jboss.xb.binding.sunday.unmarshalling.TermAfterUnmarshallingHandler;
+import org.jboss.xb.binding.sunday.unmarshalling.TermBeforeSetParentCallback;
+import org.jboss.xb.binding.sunday.unmarshalling.TermBinding;
 import org.jboss.xb.binding.sunday.unmarshalling.TypeBinding;
 import org.jboss.xb.binding.sunday.unmarshalling.UnmarshallingContext;
 import org.jboss.xb.binding.sunday.unmarshalling.XsdBinder;
@@ -194,21 +195,60 @@
          TypeBinding stringType = SCHEMA.getType(Constants.QNAME_STRING);
 
          // stringType
-         stringType.setBeforeMarshallingHandler(new TermBeforeMarshallingHandler()
+         stringType.setBeforeMarshallingCallback(new TermBeforeMarshallingCallback()
          {
             public Object beforeMarshalling(Object o, MarshallingContext ctx)
             {
                if(o != null)
                {
+                  ParticleBinding particle = ctx.getParticleBinding();
+                  assertNotNull(particle);
+                  TermBinding term = particle.getTerm();
+                  assertTrue(term.isElement());
+                  ElementBinding element = (ElementBinding) term;
+                  String localPart = element.getQName().getLocalPart();
+                  assertTrue("stringType".endsWith(localPart) || "item".equals(localPart));
+                  TypeBinding type = element.getType();
+                  assertEquals(Constants.QNAME_STRING, type.getQName());
+                  
                   o = ((GlobalElement.StringType)o).data;
                }
                return o;
             }
          });         
-         stringType.setAfterUnmarshallingHandler(new TermAfterUnmarshallingHandler()
+         stringType.setBeforeSetParentCallback(new TermBeforeSetParentCallback()
          {
-            public Object afterUnmarshalling(Object o, UnmarshallingContext ctx)
+            public Object beforeSetParent(Object o, UnmarshallingContext ctx)
             {
+               ParticleBinding particle = ctx.getParticle();
+               assertNotNull(particle);
+               assertTrue(particle.getTerm().isElement());
+               ElementBinding element = (ElementBinding) particle.getTerm();
+               
+               String eName = element.getQName().getLocalPart();
+               if(eName.equals("stringType"))
+               {
+                  assertTrue(ctx.getParentValue() instanceof GlobalElement);
+                  TermBinding parentTerm = ctx.getParentParticle().getTerm();
+                  assertTrue(parentTerm.isElement());
+                  assertEquals("global", ((ElementBinding)parentTerm).getQName().getLocalPart());
+
+                  assertEquals("stringType", ctx.resolvePropertyName());
+                  assertEquals(StringType.class, ctx.resolvePropertyType());
+               }
+               else if(eName.equals("item"))
+               {
+                  assertTrue(ctx.getParentValue() instanceof GlobalElement.Sequence);
+                  TermBinding parentTerm = ctx.getParentParticle().getTerm();
+                  assertTrue(parentTerm instanceof SequenceBinding);
+                  
+                  assertEquals("item", ctx.resolvePropertyName());
+                  assertEquals(StringType.class, ctx.resolvePropertyType());
+               }
+               else
+               {
+                  fail("Expected stringType or item but got " + eName);
+               }
                return o == null ? null : new GlobalElement.StringType((String)o);
             }
          });
@@ -219,33 +259,46 @@
          Iterator iter = sequence.getParticles().iterator();
          iter.next(); // stringType element
          ElementBinding stringElement = (ElementBinding) ((ParticleBinding)iter.next()).getTerm();
-         stringElement.setBeforeMarshallingHandler(new TermBeforeMarshallingHandler()
+         stringElement.setBeforeMarshallingCallback(new TermBeforeMarshallingCallback()
          {
             public Object beforeMarshalling(Object o, MarshallingContext ctx)
             {
                ParticleBinding particle = ctx.getParticleBinding();
                assertNotNull(particle);
-               assertTrue(particle.getTerm() instanceof ElementBinding);
+               assertTrue(particle.getTerm().isElement());
                ElementBinding element = (ElementBinding) particle.getTerm();
                assertEquals(new QName("http://jboss.org/ns/test", "stringElement"), element.getQName());
                
+               TypeBinding type = element.getType();
+               assertEquals(Constants.QNAME_STRING, type.getQName());
+               
                return o == null ? null : (String)o;
             }
          });         
-         stringElement.setAfterUnmarshallingHandler(new TermAfterUnmarshallingHandler()
+         stringElement.setBeforeSetParentCallback(new TermBeforeSetParentCallback()
          {
-            public Object afterUnmarshalling(Object o, UnmarshallingContext ctx)
+            public Object beforeSetParent(Object o, UnmarshallingContext ctx)
             {
                ParticleBinding particle = ctx.getParticle();
+               assertNotNull(particle);
+               assertTrue(particle.getTerm().isElement());
                ElementBinding element = (ElementBinding) particle.getTerm();
                assertEquals(new QName("http://jboss.org/ns/test", "stringElement"), element.getQName());
+               
+               assertTrue(ctx.getParentValue() instanceof GlobalElement);
+               TermBinding parentTerm = ctx.getParentParticle().getTerm();
+               assertTrue(parentTerm.isElement());
+               assertEquals("global", ((ElementBinding)parentTerm).getQName().getLocalPart());
+
+               assertEquals(String.class, ctx.resolvePropertyType());
+
                return o == null ? null : (String)o;
             }
          });
          
          // sequence
          sequence = (SequenceBinding) ((ParticleBinding)iter.next()).getTerm();
-         sequence.setBeforeMarshallingHandler(new TermBeforeMarshallingHandler()
+         sequence.setBeforeMarshallingCallback(new TermBeforeMarshallingCallback()
          {
             public Object beforeMarshalling(Object o, MarshallingContext ctx)
             {
@@ -262,12 +315,23 @@
                return o;
             }
          });
-         sequence.setAfterUnmarshallingHandler(new TermAfterUnmarshallingHandler()
+         sequence.setBeforeSetParentCallback(new TermBeforeSetParentCallback()
          {
-            public Object afterUnmarshalling(Object o, UnmarshallingContext ctx)
+            public Object beforeSetParent(Object o, UnmarshallingContext ctx)
             {
                ParticleBinding particle = ctx.getParticle();
                assertTrue(particle.getTerm() instanceof SequenceBinding);
+
+               assertTrue(ctx.getParentValue() instanceof GlobalElement);
+               TermBinding parentTerm = ctx.getParentParticle().getTerm();
+               assertTrue(parentTerm.isElement());
+               assertEquals("global", ((ElementBinding)parentTerm).getQName().getLocalPart());
+
+               String prop = ctx.resolvePropertyName();
+               assertEquals("sequenceItem", prop);
+
+               assertEquals(StringType.class, ctx.resolvePropertyType());
+
                return o == null ? null : ((GlobalElement.Sequence)o).item;
             }
          });




More information about the jboss-svn-commits mailing list