[jboss-svn-commits] JBoss Common SVN: r4033 - in jbossxb/trunk/src: main/java/org/jboss/xb/spi and 1 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Feb 11 18:28:33 EST 2010


Author: alex.loubyansky at jboss.com
Date: 2010-02-11 18:28:32 -0500 (Thu, 11 Feb 2010)
New Revision: 4033

Modified:
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/AbstractPosition.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/ChoiceBinding.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ElementPosition.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/NonElementPosition.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/UnorderedSequenceBinding.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/WildcardBinding.java
   jbossxb/trunk/src/main/java/org/jboss/xb/spi/AbstractBeanAdapter.java
   jbossxb/trunk/src/main/java/org/jboss/xb/spi/AbstractBeanAdapterFactory.java
   jbossxb/trunk/src/main/java/org/jboss/xb/spi/BeanAdapterFactory.java
   jbossxb/trunk/src/main/java/org/jboss/xb/spi/DefaultBeanAdapter.java
   jbossxb/trunk/src/main/java/org/jboss/xb/spi/DefaultBeanAdapterFactory.java
   jbossxb/trunk/src/test/java/org/jboss/test/xml/ArrayWrapperUnitTestCase.java
Log:
cache particle term in AbstractPosition, cache element's type in ElementPosition, check for xsi:nil only if the element is nillable, avoid redundant ensureConstructed invocations in DefaultBeanAdapter, other related refactorings

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/AbstractPosition.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/AbstractPosition.java	2010-02-11 11:06:02 UTC (rev 4032)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/AbstractPosition.java	2010-02-11 23:28:32 UTC (rev 4033)
@@ -46,6 +46,7 @@
    protected PositionStack stack;
    protected final QName qName;
    protected ParticleBinding particle;
+   protected TermBinding term;
    protected ParticleHandler handler;
    protected TypeBinding parentType;
    protected Object o;
@@ -72,11 +73,16 @@
       this.particle = particle;
       this.occurrence = 1;
       
-      TermBinding term = particle.getTerm();
+      this.term = particle.getTerm();
       this.skip = term.isSkip();
 
       if(particle.isRepeatable())
          repeatableHandler = term.getRepeatableHandler();
+      
+      if(skip)
+         handler = DefaultHandlers.UOE_PARTICLE_HANDLER;
+      else
+         initHandler();
    }
 
    public void setStack(PositionStack stack)
@@ -117,7 +123,7 @@
    public void endRepeatableParticle()
    {
       if (trace)
-         log.trace(" end repeatable " + particle.getTerm());
+         log.trace(" end repeatable " + term);
       repeatableHandler.endRepeatableParticle(previous.o, repeatableParticleValue, qName, particle, previous.particle);
       repeatableParticleValue = null;
    }
@@ -136,8 +142,6 @@
          return;
       }
       
-      if(handler == null)
-         handler = getHandler();
       Object parent = previous == null ? null : previous.o;
       o = handler.startParticle(parent, qName, particle, atts, stack.getNamespaceRegistry());
    }
@@ -145,9 +149,9 @@
    protected void startRepeatableParticle()
    {
       if(trace)
-         log.trace(" start repeatable " + particle.getTerm());
+         log.trace(" start repeatable " + term);
 
-      RepeatableParticleHandler repeatableHandler = particle.getTerm().getRepeatableHandler();
+      RepeatableParticleHandler repeatableHandler = term.getRepeatableHandler();
       // the way it is now it's never null
       Object repeatableContainer = repeatableHandler.startRepeatableParticle(previous.o, qName, particle);
       if(repeatableContainer != null)
@@ -174,7 +178,7 @@
       }
       else if(parentPosition.repeatableParticleValue == null || !parentPosition.skip)
       {
-         TermBeforeSetParentCallback beforeSetParent = particle.getTerm().getBeforeSetParentCallback();
+         TermBeforeSetParentCallback beforeSetParent = term.getBeforeSetParentCallback();
          if (beforeSetParent != null)
          {
             UnmarshallingContextImpl ctx = stack.getContext();
@@ -196,8 +200,13 @@
       }
    }
 
-   protected abstract ParticleHandler getHandler();
-   
+   protected void initHandler()
+   {
+      handler = term.getHandler();
+      if(handler == null)
+         handler = DefaultHandlers.ELEMENT_HANDLER;
+   }
+
    protected abstract void repeatForChild(Attributes atts);
    
    protected abstract AbstractPosition nextPosition(QName startName, Attributes atts);

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	2010-02-11 11:06:02 UTC (rev 4032)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/AllBinding.java	2010-02-11 23:28:32 UTC (rev 4033)
@@ -116,13 +116,5 @@
          nextNotFound();
          return null;
       }
-      
-      @Override
-      protected ParticleHandler getHandler()
-      {
-         TermBinding term = particle.getTerm();
-         ParticleHandler handler = ((ModelGroupBinding)term).getHandler();
-         return handler == null ? DefaultHandlers.ELEMENT_HANDLER : handler;
-      }
    }
 }

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ChoiceBinding.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ChoiceBinding.java	2010-02-11 11:06:02 UTC (rev 4032)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ChoiceBinding.java	2010-02-11 23:28:32 UTC (rev 4033)
@@ -136,13 +136,5 @@
          nextNotFound();
          return null;
       }
-      
-      @Override
-      protected ParticleHandler getHandler()
-      {
-         TermBinding term = particle.getTerm();
-         ParticleHandler handler = ((ModelGroupBinding)term).getHandler();
-         return handler == null ? DefaultHandlers.ELEMENT_HANDLER : handler;
-      }
    }
 }

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ElementPosition.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ElementPosition.java	2010-02-11 11:06:02 UTC (rev 4032)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/ElementPosition.java	2010-02-11 23:28:32 UTC (rev 4033)
@@ -44,6 +44,7 @@
  */
 public class ElementPosition extends AbstractPosition
 {
+   private TypeBinding type;
    private ParticleBinding nonXsiParticle;
    private boolean ignoreCharacters;
    private StringBuffer textContent;
@@ -55,6 +56,7 @@
    public ElementPosition(QName qName, ParticleBinding particle)
    {
       super(qName, particle);
+      type = ((ElementBinding)term).getType();
    }
 
    public boolean isElement()
@@ -65,7 +67,7 @@
    public void reset()
    {
       if(!ended)
-         throw new JBossXBRuntimeException("Attempt to reset a particle that has already been reset: " + particle.getTerm());
+         throw new JBossXBRuntimeException("Attempt to reset a particle that has already been reset: " + term);
       ended = false;
       o = null;
       
@@ -76,7 +78,11 @@
       ignorableCharacters = true;
       
       if(nonXsiParticle != null)
+      {
          particle = nonXsiParticle;
+         term = particle.getTerm();
+         type = ((ElementBinding)term).getType();
+      }
    }
    
    public ParticleBinding getNonXsiParticle()
@@ -142,21 +148,19 @@
       }
       
       // this is locating the next child
-      ElementBinding element = (ElementBinding) particle.getTerm();
-      TypeBinding parentType = element.getType();
-      ParticleBinding typeParticle = parentType.getParticle();
+      ParticleBinding typeParticle = type.getParticle();
       ModelGroupBinding modelGroup = typeParticle == null ? null : (ModelGroupBinding) typeParticle.getTerm();
       if (modelGroup == null)
       {
          if (startName.equals(Constants.QNAME_XOP_INCLUDE))
          {
-            SchemaBinding schema = element.getSchema();
+            SchemaBinding schema = term.getSchema();
             TypeBinding anyUriType = schema.getType(Constants.QNAME_ANYURI);
             if (anyUriType == null)
                log.warn("Type " + Constants.QNAME_ANYURI + " not bound.");
 
-            ElementBinding parentElement = (ElementBinding) particle.getTerm();
-            parentElement.setXopUnmarshaller(schema.getXopUnmarshaller());
+            ElementBinding element = (ElementBinding) term;
+            element.setXopUnmarshaller(schema.getXopUnmarshaller());
 
             flushIgnorableCharacters();
             handler = DefaultHandlers.XOP_HANDLER;
@@ -166,7 +170,7 @@
             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(parentType, schema.getXopUnmarshaller()));
+            xopIncludeType.setHandler(new XOPIncludeHandler(type, schema.getXopUnmarshaller()));
 
             ElementBinding xopInclude = new ElementBinding(schema, Constants.QNAME_XOP_INCLUDE, xopIncludeType);
             next = new ElementPosition(startName, new ParticleBinding(xopInclude));
@@ -176,24 +180,18 @@
             return next;
          }
 
-         QName typeName = parentType.getQName();
+         QName typeName = type.getQName();
          throw new JBossXBRuntimeException((typeName == null ? "Anonymous" : typeName.toString()) + " type of element "
                + qName + " should be complex and contain " + startName + " as a child element.");
       }
 
       if (next != null)
       {
-         if (particle.isOccurrenceAllowed(occurrence + 1))
-         {
-            // this increase is actually ahead of its time, it may fail to locate the element
-            // but in the current impl it doesn't matter
-            ++occurrence;
-         }
-         else
-         {
+         // this increase is actually ahead of its time, it may fail to locate the element
+         // but in the current impl it doesn't matter
+         if (!particle.isOccurrenceAllowed(++occurrence))
             throw new JBossXBRuntimeException(startName + " cannot appear in this position. Expected content of "
                   + qName + " is " + modelGroup);
-         }
       }
 
       next = modelGroup.newPosition(startName, atts, typeParticle);
@@ -212,60 +210,58 @@
             nextPosition.startRepeatableParticle();
          nextPosition.stack = stack;
          nextPosition.initValue(atts);
-         nextPosition.parentType = parentType;
+         nextPosition.parentType = type;
          nextPosition = nextPosition.next;
       }
 
       nextPosition.stack = stack;
-      nextPosition.parentType = parentType;
+      nextPosition.parentType = type;
       nextPosition.notSkippedParent = nextPosition.previous.getLastNotSkipped();
       return (ElementPosition) nextPosition;
    }
 
    public void characters(char[] ch, int start, int length)
    {
-      ElementBinding e = (ElementBinding) particle.getTerm();
-
       // collect characters only if they are allowed content
-      if(e.getType().isTextContentAllowed())
+      if(!type.isTextContentAllowed())
+         return;
+      
+      if(indentation != Boolean.FALSE)
       {
-         if(indentation != Boolean.FALSE)
+         if(type.isSimple())
          {
-            if(e.getType().isSimple())
+            // simple content is not analyzed
+            indentation = Boolean.FALSE;
+            ignorableCharacters = false;
+         }
+         else if(term.getSchema() != null && !term.getSchema().isIgnoreWhitespacesInMixedContent())
+         {
+            indentation = Boolean.FALSE;
+            ignorableCharacters = false;
+         }
+         else
+         {
+            // the indentation is currently defined as whitespaces with next line characters
+            // this should probably be externalized in the form of a filter or something
+            for (int i = start; i < start + length; ++i)
             {
-               // simple content is not analyzed
-               indentation = Boolean.FALSE;
-               ignorableCharacters = false;
-            }
-            else if(e.getSchema() != null && !e.getSchema().isIgnoreWhitespacesInMixedContent())
-            {
-               indentation = Boolean.FALSE;
-               ignorableCharacters = false;
-            }
-            else
-            {
-               // the indentation is currently defined as whitespaces with next line characters
-               // this should probably be externalized in the form of a filter or something
-               for (int i = start; i < start + length; ++i)
+               if(ch[i] == 0x0a)
                {
-                  if(ch[i] == 0x0a)
-                  {
-                     indentation = Boolean.TRUE;
-                  }
-                  else if (!Character.isWhitespace(ch[i]))
-                  {
-                     indentation = Boolean.FALSE;
-                     ignorableCharacters = false;
-                     break;
-                  }
+                  indentation = Boolean.TRUE;
                }
+               else if (!Character.isWhitespace(ch[i]))
+               {
+                  indentation = Boolean.FALSE;
+                  ignorableCharacters = false;
+                  break;
+               }
             }
          }
-         
-         if (textContent == null)
-            textContent = new StringBuffer();
-         textContent.append(ch, start, length);
       }
+         
+      if (textContent == null)
+         textContent = new StringBuffer();
+      textContent.append(ch, start, length);
    }
    
    public void endParticle()
@@ -274,9 +270,7 @@
       if(skip)
          return;
       
-      ElementBinding element = (ElementBinding) particle.getTerm();
-      TypeBinding type = element.getType();
-      
+      ElementBinding element = (ElementBinding) term;
       List<ElementInterceptor> interceptors = null;
       List<ElementInterceptor> localInterceptors = null;
       if(interceptorObjects != null)
@@ -311,7 +305,7 @@
          if(textContent.length() > 0 || charHandler != null && !type.isIgnoreEmptyString())
          {
             String dataContent;
-            SchemaBinding schema = element.getSchema();
+            SchemaBinding schema = term.getSchema();
             if(textContent.length() == 0)
             {
                dataContent = null;
@@ -330,10 +324,7 @@
 
             if(charHandler == null)
             {
-               if(!type.isSimple() &&
-                  schema != null &&
-                  schema.isStrictSchema()
-                  && !element.isSkip())
+               if(!type.isSimple() && !term.isSkip() && schema != null && schema.isStrictSchema())
                {
                   throw new JBossXBRuntimeException("Element " +
                      qName +
@@ -346,7 +337,7 @@
             }
             else
             {
-               ValueMetaData valueMetaData = element.getValueMetaData();
+               ValueMetaData valueMetaData = term.getValueMetaData();
                if(valueMetaData == null)
                {
                   CharactersMetaData charactersMetaData = type.getCharactersMetaData();
@@ -450,21 +441,18 @@
       }
       else if (notSkippedParent != null)
       {
-         ParticleBinding parentParticle = notSkippedParent.particle;
-         TermBinding parentTerm = parentParticle.getTerm();
-
          if (notSkippedParent.o != null)
          {
             ParticleHandler handler = this.handler;
-            if (parentTerm.isWildcard())
+            if (notSkippedParent.term.isWildcard())
             {
-               ParticleHandler wh = ((WildcardBinding) parentTerm).getWildcardHandler();
+               ParticleHandler wh = ((WildcardBinding) notSkippedParent.term).getWildcardHandler();
                if (wh != null)
                   handler = wh;
             }
             setParent(notSkippedParent, handler);
          }
-         else if (parentTerm.isWildcard())
+         else if (notSkippedParent.term.isWildcard())
          {
             // the parent has anyType, so it gets the value of its child
             AbstractPosition parentPos = previous;
@@ -495,14 +483,12 @@
 
    public void push(Attributes atts)
    {
-      ElementBinding element = (ElementBinding) particle.getTerm();
-
       // TODO xsi:type support should be implemented in a better way
       String xsiType = atts.getValue(Constants.NS_XML_SCHEMA_INSTANCE, "type");
       if (xsiType != null)
       {
          if (trace)
-            log.trace(element.getQName() + " uses xsi:type " + xsiType);
+            log.trace(term.getQName() + " uses xsi:type " + xsiType);
 
          if (nonXsiParticle == null)
             nonXsiParticle = particle;
@@ -524,7 +510,7 @@
          String xsiTypeNs = stack.getNamespaceRegistry().getNamespaceURI(xsiTypePrefix);
          QName xsiTypeQName = new QName(xsiTypeNs, xsiTypeLocal);
 
-         SchemaBinding schemaBinding = element.getSchema();
+         SchemaBinding schemaBinding = term.getSchema();
          TypeBinding xsiTypeBinding = schemaBinding.getType(xsiTypeQName);
          if (xsiTypeBinding == null)
          {
@@ -533,24 +519,19 @@
          }
 
          ElementBinding xsiElement = new ElementBinding(schemaBinding, qName, xsiTypeBinding);
-         xsiElement.setRepeatableHandler(element.getRepeatableHandler());
+         xsiElement.setRepeatableHandler(term.getRepeatableHandler());
 
          particle = new ParticleBinding(xsiElement, particle.getMinOccurs(), particle.getMaxOccurs(), particle.getMaxOccursUnbounded());
+         term = xsiElement;
+         type = xsiTypeBinding;
       }
 
       if (occurrence == 1 && repeatableHandler != null)
          startRepeatableParticle();
 
-      TypeBinding type = element.getType();
-      if (type == null)
-         throw new JBossXBRuntimeException("No type for element " + element);
-
-      handler = element.getHandler();
-      if (handler == null)
-         handler = DefaultHandlers.ELEMENT_HANDLER;
-
       Object parent = previous == null ? null : previous.o;
 
+      ElementBinding element = (ElementBinding) term;
       if(parentType != null)
       {
          List<ElementInterceptor> interceptors = parentType.getInterceptors(qName);
@@ -588,11 +569,16 @@
          }
       }
 
-      String nil = atts.getValue(Constants.NS_XML_SCHEMA_INSTANCE, "nil");
-      if (nil == null || !("1".equals(nil) || "true".equals(nil)))
-         initValue(atts);
+      if(element.isNillable())
+      {
+         String nil = atts.getValue(Constants.NS_XML_SCHEMA_INSTANCE, "nil");
+         if (nil == null || !("1".equals(nil) || "true".equals(nil)))
+            initValue(atts);
+         else
+            o = SundayContentHandler.NIL;
+      }
       else
-         o = SundayContentHandler.NIL;
+         initValue(atts);
    }
    
    private void flushIgnorableCharacters()
@@ -603,15 +589,9 @@
       if(indentation == Boolean.TRUE || ignorableCharacters)
       {
          if(trace)
-            log.trace("ignored characters: " + ((ElementBinding) particle.getTerm()).getQName() + " '" + textContent + "'");
+            log.trace("ignored characters: " + term.getQName() + " '" + textContent + "'");
          textContent = null;
          indentation = null;
       }
    }
-   
-   @Override
-   protected ParticleHandler getHandler()
-   {
-      return DefaultHandlers.ELEMENT_HANDLER;
-   }
 }
\ No newline at end of file

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/NonElementPosition.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/NonElementPosition.java	2010-02-11 11:06:02 UTC (rev 4032)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/NonElementPosition.java	2010-02-11 23:28:32 UTC (rev 4033)
@@ -35,7 +35,6 @@
    protected NonElementPosition(QName name, ParticleBinding particle, AbstractPosition next)
    {
       super(name, particle);
-      this.particle = particle;
       this.next = next;
       next.previous = this;
    }

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	2010-02-11 11:06:02 UTC (rev 4032)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SequenceBinding.java	2010-02-11 23:28:32 UTC (rev 4033)
@@ -186,13 +186,5 @@
          super.nextNotFound();
          pos = -1;
       }
-
-      @Override
-      protected ParticleHandler getHandler()
-      {
-         TermBinding term = particle.getTerm();
-         ParticleHandler handler = ((ModelGroupBinding)term).getHandler();
-         return handler == null ? DefaultHandlers.ELEMENT_HANDLER : handler;
-      }
    }
 }

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/UnorderedSequenceBinding.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/UnorderedSequenceBinding.java	2010-02-11 11:06:02 UTC (rev 4032)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/UnorderedSequenceBinding.java	2010-02-11 23:28:32 UTC (rev 4033)
@@ -181,13 +181,5 @@
          nextNotFound();
          return null;
       }
-      
-      @Override
-      protected ParticleHandler getHandler()
-      {
-         TermBinding term = particle.getTerm();
-         ParticleHandler handler = ((ModelGroupBinding)term).getHandler();
-         return handler == null ? DefaultHandlers.ELEMENT_HANDLER : handler;
-      }
    }
 }

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	2010-02-11 11:06:02 UTC (rev 4032)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/WildcardBinding.java	2010-02-11 23:28:32 UTC (rev 4033)
@@ -337,15 +337,15 @@
       }
       
       @Override
-      protected ParticleHandler getHandler()
+      protected AbstractPosition getLastNotSkipped()
       {
-         return DefaultHandlers.UOE_PARTICLE_HANDLER;
+         return !skip || repeatableParticleValue != null || previous != notSkippedParent ? this : notSkippedParent;
       }
       
       @Override
-      protected AbstractPosition getLastNotSkipped()
+      protected void initHandler()
       {
-         return !skip || repeatableParticleValue != null || previous != notSkippedParent ? this : notSkippedParent;
+         handler = DefaultHandlers.UOE_PARTICLE_HANDLER;
       }
    }
 }

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/spi/AbstractBeanAdapter.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/spi/AbstractBeanAdapter.java	2010-02-11 11:06:02 UTC (rev 4032)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/spi/AbstractBeanAdapter.java	2010-02-11 23:28:32 UTC (rev 4033)
@@ -126,7 +126,9 @@
    protected void ensureConstructed()
    {
       if (constructed == false)
+      {
          value = construct();
-      constructed = true;
+         constructed = true;
+      }
    }
 }

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/spi/AbstractBeanAdapterFactory.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/spi/AbstractBeanAdapterFactory.java	2010-02-11 11:06:02 UTC (rev 4032)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/spi/AbstractBeanAdapterFactory.java	2010-02-11 23:28:32 UTC (rev 4033)
@@ -33,10 +33,10 @@
 public class AbstractBeanAdapterFactory extends BeanAdapterFactory
 {
    /** The bean info */
-   private BeanInfo beanInfo;
+   protected BeanInfo beanInfo;
 
    /** Any factory  */
-   private MethodInfo factory;
+   protected MethodInfo factory;
 
    /**
     * Create a new bean adapter factory
@@ -73,7 +73,7 @@
       return factory;
    }
 
-   public AbstractBeanAdapter newInstance()
+   public BeanAdapter newInstance()
    {
       return new AbstractBeanAdapter(this, getBeanInfo(), getFactory());
    }

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/spi/BeanAdapterFactory.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/spi/BeanAdapterFactory.java	2010-02-11 11:06:02 UTC (rev 4032)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/spi/BeanAdapterFactory.java	2010-02-11 23:28:32 UTC (rev 4033)
@@ -21,10 +21,11 @@
 */
 package org.jboss.xb.spi;
 
+import java.util.Collections;
+import java.util.HashMap;
 import java.util.Map;
 import javax.xml.namespace.QName;
 
-import org.jboss.util.collection.CollectionsFactory;
 import org.jboss.xb.builder.runtime.AbstractPropertyHandler;
 
 /**
@@ -32,12 +33,13 @@
  * 
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
  * @author <a href="ales.justin at jboss.com">Ales Justin</a>
+ * @author <a href="alex at jboss.com">Alexey Loubyansky</a>
  * @version $Revision: 1.1 $
  */
 public abstract class BeanAdapterFactory
 {
    /** The properties */
-   private Map<QName, AbstractPropertyHandler> properties = CollectionsFactory.createLazyMap();
+   private Map<QName, AbstractPropertyHandler> properties = Collections.emptyMap();
    
    /** The wildcard handler */
    private AbstractPropertyHandler wildcardHandler;
@@ -76,7 +78,15 @@
       if (propertyHandler == null)
          throw new IllegalArgumentException("Null property handler");
 
-      properties.put(qName, propertyHandler);
+      int size = properties.size();
+      if(size == 0)
+         properties = Collections.singletonMap(qName, propertyHandler);
+      else
+      {
+         if(size == 1)
+            properties = new HashMap<QName, AbstractPropertyHandler>(properties);
+         properties.put(qName, propertyHandler);
+      }
    }
 
    /**

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/spi/DefaultBeanAdapter.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/spi/DefaultBeanAdapter.java	2010-02-11 11:06:02 UTC (rev 4032)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/spi/DefaultBeanAdapter.java	2010-02-11 23:28:32 UTC (rev 4033)
@@ -22,16 +22,27 @@
 package org.jboss.xb.spi;
 
 import org.jboss.beans.info.spi.BeanInfo;
+import org.jboss.beans.info.spi.PropertyInfo;
 import org.jboss.reflect.spi.MethodInfo;
 
 /**
  * DefaultBeanAdapter.
  * 
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @author <a href="alex at jboss.com">Alexey Loubyansky</a>
  * @version $Revision: 1.1 $
  */
-public class DefaultBeanAdapter extends AbstractBeanAdapter
+public class DefaultBeanAdapter extends BeanAdapter
 {
+   /** The bean info */
+   private BeanInfo beanInfo;
+
+   /** Any factory  */
+   private MethodInfo factory;
+
+   /** The value */
+   private Object value;
+
    /**
     * Create a new bean adapter
     * 
@@ -42,7 +53,57 @@
     */
    public DefaultBeanAdapter(BeanAdapterFactory beanAdapterFactory, BeanInfo beanInfo, MethodInfo factory)
    {
-      super(beanAdapterFactory, beanInfo, factory);
-      ensureConstructed();
+      super(beanAdapterFactory);
+      if (beanInfo == null)
+         throw new IllegalArgumentException("Null bean info");
+      this.beanInfo = beanInfo;
+      this.factory = factory;
+      
+      try
+      {
+         if (factory != null)
+            value = factory.invoke(null, null);
+         else
+            value = beanInfo.newInstance();
+      }
+      catch (Throwable t)
+      {
+         throw new RuntimeException("Error instantiating bean for " + beanInfo.getName(), t);
+      }
    }
+
+   /**
+    * Get the bean info
+    * 
+    * @return the bean info
+    */
+   public BeanInfo getBeanInfo()
+   {
+      return beanInfo;
+   }
+
+   /**
+    * Get the factory
+    * 
+    * @return the factgory
+    */
+   public MethodInfo getFactory()
+   {
+      return factory;
+   }
+   
+   public Object get(PropertyInfo propertyInfo) throws Throwable
+   {
+      return propertyInfo.get(value);
+   }
+   
+   public void set(PropertyInfo propertyInfo, Object child) throws Throwable
+   {
+      propertyInfo.set(value, child);
+   }
+
+   public Object getValue()
+   {
+      return value;
+   }
 }

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/spi/DefaultBeanAdapterFactory.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/spi/DefaultBeanAdapterFactory.java	2010-02-11 11:06:02 UTC (rev 4032)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/spi/DefaultBeanAdapterFactory.java	2010-02-11 23:28:32 UTC (rev 4033)
@@ -44,8 +44,8 @@
       super(beanInfo, factory);
    }
 
-   public DefaultBeanAdapter newInstance()
+   public BeanAdapter newInstance()
    {
-      return new DefaultBeanAdapter(this, getBeanInfo(), getFactory());
+      return new DefaultBeanAdapter(this, beanInfo, factory);
    }
 }

Modified: jbossxb/trunk/src/test/java/org/jboss/test/xml/ArrayWrapperUnitTestCase.java
===================================================================
--- jbossxb/trunk/src/test/java/org/jboss/test/xml/ArrayWrapperUnitTestCase.java	2010-02-11 11:06:02 UTC (rev 4032)
+++ jbossxb/trunk/src/test/java/org/jboss/test/xml/ArrayWrapperUnitTestCase.java	2010-02-11 23:28:32 UTC (rev 4033)
@@ -60,7 +60,6 @@
       "   <xsd:sequence>" +
       "     <xsd:element name='stringArray' type='StringArray' minOccurs='0'/>" +
       "     <xsd:element name='stringArrayArray' type='StringArrayArray' minOccurs='0'/>" +
-      "     <xsd:element name='jbxb79' type='xsd:string' minOccurs='0' maxOccurs='unbounded'/>" +
       "   </xsd:sequence>" +
       " </xsd:complexType>" +
       " <xsd:complexType name='StringArray'>" +
@@ -86,6 +85,30 @@
       " <xsd:element name='arr' type='ArrayWrapper'/>" +
       "</xsd:schema>";
 
+   private static final String JBXB79_XSD =
+      "<xsd:schema" +
+      " targetNamespace='http://www.jboss.org/xml/test/arraywrapper'" +
+      " xmlns='http://www.jboss.org/xml/test/arraywrapper'" +
+      " xmlns:jbxb='" +
+      Constants.NS_JBXB +
+      "'" +
+      " elementFormDefault='qualified'" +
+      " xmlns:xsd='http://www.w3.org/2001/XMLSchema'>" +
+      " <xsd:complexType name='ArrayWrapper'>" +
+      "   <xsd:annotation>" +
+      "      <xsd:appinfo>" +
+      "         <jbxb:class impl='" +
+      ArrayWrapper.class.getName() +
+      "'/>" +
+      "      </xsd:appinfo>" +
+      "   </xsd:annotation>" +
+      "   <xsd:sequence>" +
+      "     <xsd:element name='jbxb79' type='xsd:string' minOccurs='0' maxOccurs='unbounded' nillable='true'/>" +
+      "   </xsd:sequence>" +
+      " </xsd:complexType>" +
+      " <xsd:element name='arr' type='ArrayWrapper'/>" +
+      "</xsd:schema>";
+
    private static SchemaBinding SCHEMA;// = XsdBinder.bind(new StringReader(XSD), null);
 
    private static final String XML =
@@ -136,11 +159,8 @@
    protected void configureLogging()
    {
 //      enableTrace("org.jboss.xb.binding");
-      
       if(SCHEMA == null)
-      {
          SCHEMA = XsdBinder.bind(new StringReader(XSD), null);
-      }
    }
 
    public void testMarshalStringArraySunday() throws Exception
@@ -238,8 +258,9 @@
 
    public void testUnmarshalJBXB79StringArray() throws Exception
    {
+      SchemaBinding schema = XsdBinder.bind(new StringReader(JBXB79_XSD), null);
       Unmarshaller unmarshaller = UnmarshallerFactory.newInstance().newUnmarshaller();
-      Object o = unmarshaller.unmarshal(new StringReader(JBXB79_XML), SCHEMA);
+      Object o = unmarshaller.unmarshal(new StringReader(JBXB79_XML), schema);
       assertNotNull(o);
       assertTrue(o instanceof ArrayWrapper);
       ArrayWrapper aw = (ArrayWrapper)o;



More information about the jboss-svn-commits mailing list