[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