You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by rd...@apache.org on 2005/11/20 19:54:33 UTC
svn commit: r345774 - in /jakarta/commons/proper/betwixt/trunk:
src/java/org/apache/commons/betwixt/ src/java/org/apache/commons/betwixt/io/
src/test/org/apache/commons/betwixt/
src/test/org/apache/commons/betwixt/strategy/ xdocs/
Author: rdonkin
Date: Sun Nov 20 10:54:26 2005
New Revision: 345774
URL: http://svn.apache.org/viewcvs?rev=345774&view=rev
Log:
Added option inheritance. Submitted by Brian Ferris. Issue #37542.
Modified:
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/Options.java
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/io/AbstractBeanWriter.java
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/TestOptions.java
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/strategy/TestIdStorageStrategy.java
jakarta/commons/proper/betwixt/trunk/xdocs/tasks.xml
Modified: jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/Options.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/Options.java?rev=345774&r1=345773&r2=345774&view=diff
==============================================================================
--- jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/Options.java (original)
+++ jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/Options.java Sun Nov 20 10:54:26 2005
@@ -60,4 +60,16 @@
public void addOption(String name, String value) {
valuesByName.put(name, value);
}
+
+ /**
+ * Adds multiple options from an existing <code>Options</code> collection.
+ * The rule with options is that the most recently set value for an option
+ * wins, so options are potentially overwritten by this call.
+ *
+ * @param options -
+ * an existing <code>Options</code> collection
+ */
+ public void addOptions(Options options) {
+ valuesByName.putAll(options.valuesByName);
+ }
}
Modified: jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/io/AbstractBeanWriter.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/io/AbstractBeanWriter.java?rev=345774&r1=345773&r2=345774&view=diff
==============================================================================
--- jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/io/AbstractBeanWriter.java (original)
+++ jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/io/AbstractBeanWriter.java Sun Nov 20 10:54:26 2005
@@ -25,6 +25,7 @@
import org.apache.commons.betwixt.BindingConfiguration;
import org.apache.commons.betwixt.Descriptor;
import org.apache.commons.betwixt.ElementDescriptor;
+import org.apache.commons.betwixt.Options;
import org.apache.commons.betwixt.XMLBeanInfo;
import org.apache.commons.betwixt.XMLIntrospector;
import org.apache.commons.betwixt.expression.Context;
@@ -320,7 +321,22 @@
if ( beanInfo != null ) {
ElementDescriptor elementDescriptor = beanInfo.getElementDescriptor();
if ( elementDescriptor != null ) {
+
+ // Construct the options
+ Options combinedOptions = new Options();
+
+ // Add options defined by the current bean's element descriptor
+ combinedOptions.addOptions(elementDescriptor.getOptions());
+
+ // The parent descriptor may have defined options
+ // for the current bean. These options take precedence
+ // over the options of the current class descriptor
+ if( context.getOptions() != null) {
+ combinedOptions.addOptions(context.getOptions());
+ }
context = context.newContext( bean );
+ context.pushOptions(combinedOptions);
+
if ( qualifiedName == null ) {
qualifiedName = elementDescriptor.getQualifiedName();
}
@@ -423,6 +439,8 @@
}
popBean();
}
+
+ context.popOptions();
}
}
}
@@ -723,7 +741,6 @@
if ( log.isTraceEnabled() ) {
log.trace( "Element " + elementDescriptor + " is empty." );
}
- context.pushOptions(elementDescriptor.getOptions());
Attributes attributes = addNamespaceDeclarations(
new ElementAttributes( elementDescriptor, context ), namespaceUri);
@@ -738,7 +755,6 @@
writeElementContent( elementDescriptor, context ) ;
writeContext.setCurrentDescriptor(elementDescriptor);
endElement( writeContext, namespaceUri, localName, qualifiedName );
- context.popOptions();
}
}
@@ -803,7 +819,6 @@
IntrospectionException {
if ( !ignoreElement( elementDescriptor, namespaceUri, localName, qualifiedName, context ) ) {
- context.pushOptions(elementDescriptor.getOptions());
writeContext.setCurrentDescriptor(elementDescriptor);
Attributes attributes = new IDElementAttributes(
elementDescriptor,
@@ -820,7 +835,6 @@
writeElementContent( elementDescriptor, context ) ;
writeContext.setCurrentDescriptor(elementDescriptor);
endElement( writeContext, namespaceUri, localName, qualifiedName );
- context.popOptions();
} else if ( log.isTraceEnabled() ) {
log.trace( "Element " + qualifiedName + " is empty." );
}
@@ -919,6 +933,7 @@
// Element content
ElementDescriptor childDescriptor = (ElementDescriptor) childDescriptors[i];
Context childContext = context;
+ childContext.pushOptions(childDescriptor.getOptions());
Expression childExpression = childDescriptor.getContextExpression();
if ( childExpression != null ) {
Object childBean = childExpression.evaluate( context );
@@ -959,6 +974,7 @@
childDescriptor,
childContext );
}
+ childContext.popOptions();
} else {
// Mixed text content
// evaluate the body text
Modified: jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/TestOptions.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/TestOptions.java?rev=345774&r1=345773&r2=345774&view=diff
==============================================================================
--- jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/TestOptions.java (original)
+++ jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/TestOptions.java Sun Nov 20 10:54:26 2005
@@ -73,4 +73,24 @@
}
}
+ public void testAddOptions() {
+ Options a = new Options();
+ a.addOption("A", "Alpha");
+ a.addOption("B", "Beta");
+ a.addOption("C", "Gamma");
+
+ Options b = new Options();
+ b.addOption("A", "Apple");
+ b.addOption("C", "Carrot");
+ b.addOption("E", "Egg Plant");
+
+ a.addOptions(b);
+
+ // Lat value set wins
+ assertEquals("Apple",a.getValue("A"));
+ assertEquals("Beta",a.getValue("B"));
+ assertEquals("Carrot",a.getValue("C"));
+ assertEquals("Egg Plant",a.getValue("E"));
+ }
+
}
Modified: jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/strategy/TestIdStorageStrategy.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/strategy/TestIdStorageStrategy.java?rev=345774&r1=345773&r2=345774&view=diff
==============================================================================
--- jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/strategy/TestIdStorageStrategy.java (original)
+++ jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/strategy/TestIdStorageStrategy.java Sun Nov 20 10:54:26 2005
@@ -17,12 +17,12 @@
import java.io.StringReader;
import java.io.StringWriter;
-import java.util.Iterator;
import org.apache.commons.betwixt.AbstractTestCase;
import org.apache.commons.betwixt.expression.Context;
import org.apache.commons.betwixt.io.BeanReader;
import org.apache.commons.betwixt.io.BeanWriter;
+import org.xml.sax.InputSource;
/**
*/
@@ -123,4 +123,251 @@
}
+ public void testWriteWithOptions() throws Exception {
+
+ final Element alpha = new Element("ONE");
+ Element beta = new Element("TWO");
+ ElementsList elements = new ElementsList();
+ elements.addElement(alpha);
+ elements.addElement(beta);
+
+ String MAPPING = "<?xml version='1.0'?>" +
+ "<betwixt-config>" +
+ " <class name=\"" + ElementsList.class.getName() + "\">" +
+ " <element name=\"ElementsList\">" +
+ " <option>" +
+ " <name>id-strategy-prefix</name>" +
+ " <value>alice</value>" +
+ " </option>" +
+ " <element name=\"elements\">" +
+ " <element property=\"elements\">" +
+ " <option>" +
+ " <name>id-strategy-prefix</name>" +
+ " <value>bob</value>" +
+ " </option>" +
+ " </element>" +
+ " </element>" +
+ " </element>" +
+ " </class>" +
+ "</betwixt-config>";
+
+ IdStoringStrategy storingStrategy = new DefaultIdStoringStrategy() {
+
+ public String getReferenceFor(Context context, Object bean) {
+ String result = null;
+ if( bean instanceof ElementsList) {
+ assertNotNull( context.getOptions() );
+ assertEquals("Checking ElementsList option","alice",context.getOptions().getValue("id-strategy-prefix"));
+ }
+ if( bean instanceof Element) {
+ assertNotNull( context.getOptions() );
+ assertEquals("Checking Element option","bob",context.getOptions().getValue("id-strategy-prefix"));
+ }
+ if (bean == alpha) {
+ result = "ALPHA";
+ }
+ else
+ {
+ result = super.getReferenceFor(context, bean);
+ }
+ return result;
+ }
+
+ public void setReference(Context context, Object bean, String id) {
+ if (bean != alpha) {
+ super.setReference(context, bean, id);
+ }
+ }
+ };
+
+ StringWriter out = new StringWriter();
+ out.write("<?xml version='1.0'?>");
+ BeanWriter writer = new BeanWriter(out);
+ writer.getBindingConfiguration().setIdMappingStrategy(storingStrategy);
+ writer.getXMLIntrospector().register(new InputSource(new StringReader(MAPPING)));
+ writer.write(elements);
+
+ String expected = "<?xml version='1.0'?>" +
+ "<ElementsList id='1'>" +
+ " <elements>" +
+ " <Element idref='ALPHA'/>" +
+ " <Element id='2'>" +
+ " <value>TWO</value>" +
+ " </Element>" +
+ " </elements>" +
+ "</ElementsList>";
+
+ xmlAssertIsomorphicContent(parseString(expected), parseString(out));
+ }
+
+ public void testWriteWithParentOptions() throws Exception {
+
+ AlphaBean alpha = new AlphaBean();
+ alpha.setName("apple");
+ BetaBean beta = new BetaBean();
+ beta.setName("banana");
+ alpha.setBetaBean(beta);
+
+ String MAPPING = "<?xml version='1.0'?>" +
+ "<betwixt-config>" +
+ " <class name=\"" + AlphaBean.class.getName() + "\">" +
+ " <element name=\"alpha\">" +
+ " <element name=\"name\" property=\"name\" />" +
+ " <element property=\"betaBean\">" +
+ " <option>" +
+ " <name>id-strategy-prefix</name>" +
+ " <value>parent</value>" +
+ " </option>" +
+ " </element>" +
+ " </element>" +
+ " </class>" +
+ " <class name=\"" + BetaBean.class.getName() + "\">" +
+ " <element name=\"beta\">" +
+ " <element name=\"name\" property=\"name\" />" +
+ " </element>" +
+ " </class>" +
+ "</betwixt-config>";
+
+ IdStoringStrategy storingStrategy = new DefaultIdStoringStrategy() {
+ public String getReferenceFor(Context context, Object bean) {
+ if( bean instanceof BetaBean) {
+ assertNotNull( context.getOptions() );
+ assertEquals("Checking BetaBean option","parent",context.getOptions().getValue("id-strategy-prefix"));
+ }
+ return super.getReferenceFor(context, bean);
+ }
+ };
+
+ StringWriter out = new StringWriter();
+ out.write("<?xml version='1.0'?>");
+ BeanWriter writer = new BeanWriter(out);
+ writer.getBindingConfiguration().setIdMappingStrategy(storingStrategy);
+ writer.getXMLIntrospector().register(new InputSource(new StringReader(MAPPING)));
+ writer.write(alpha);
+
+ String expected = "<?xml version='1.0'?>" +
+ "<alpha id=\"1\">" +
+ " <name>apple</name>" +
+ " <beta id=\"2\">" +
+ " <name>banana</name>"+
+ " </beta>" +
+ "</alpha>";
+
+ xmlAssertIsomorphicContent(parseString(expected), parseString(out));
+ }
+
+ public void testWriteWithTargetOptions() throws Exception {
+
+ AlphaBean alpha = new AlphaBean();
+ alpha.setName("apple");
+ BetaBean beta = new BetaBean();
+ beta.setName("banana");
+ alpha.setBetaBean(beta);
+
+ String MAPPING = "<?xml version='1.0'?>" +
+ "<betwixt-config>" +
+ " <class name=\"" + AlphaBean.class.getName() + "\">" +
+ " <element name=\"alpha\">" +
+ " <element name=\"name\" property=\"name\" />" +
+ " <element property=\"betaBean\" />" +
+ " </element>" +
+ " </class>" +
+ " <class name=\"" + BetaBean.class.getName() + "\">" +
+ " <element name=\"beta\">" +
+ " <option>" +
+ " <name>id-strategy-prefix</name>" +
+ " <value>target</value>" +
+ " </option>" +
+ " <element name=\"name\" property=\"name\" />" +
+ " </element>" +
+ " </class>" +
+ "</betwixt-config>";
+
+ IdStoringStrategy storingStrategy = new DefaultIdStoringStrategy() {
+ public String getReferenceFor(Context context, Object bean) {
+ if( bean instanceof BetaBean) {
+ assertNotNull( context.getOptions() );
+ assertEquals("Checking BetaBean option","target",context.getOptions().getValue("id-strategy-prefix"));
+ }
+ return super.getReferenceFor(context, bean);
+ }
+ };
+
+ StringWriter out = new StringWriter();
+ out.write("<?xml version='1.0'?>");
+ BeanWriter writer = new BeanWriter(out);
+ writer.getBindingConfiguration().setIdMappingStrategy(storingStrategy);
+ writer.getXMLIntrospector().register(new InputSource(new StringReader(MAPPING)));
+ writer.write(alpha);
+
+ String expected = "<?xml version='1.0'?>" +
+ "<alpha id=\"1\">" +
+ " <name>apple</name>" +
+ " <beta id=\"2\">" +
+ " <name>banana</name>"+
+ " </beta>" +
+ "</alpha>";
+
+ xmlAssertIsomorphicContent(parseString(expected), parseString(out));
+ }
+
+ public void testWriteWithParentAndTargetOptions() throws Exception {
+
+ AlphaBean alpha = new AlphaBean();
+ alpha.setName("apple");
+ BetaBean beta = new BetaBean();
+ beta.setName("banana");
+ alpha.setBetaBean(beta);
+
+ String MAPPING = "<?xml version='1.0'?>" +
+ "<betwixt-config>" +
+ " <class name=\"" + AlphaBean.class.getName() + "\">" +
+ " <element name=\"alpha\">" +
+ " <element name=\"name\" property=\"name\" />" +
+ " <element property=\"betaBean\">" +
+ " <option>" +
+ " <name>id-strategy-prefix</name>" +
+ " <value>parent</value>" +
+ " </option>" +
+ " </element>" +
+ " </element>" +
+ " </class>" +
+ " <class name=\"" + BetaBean.class.getName() + "\">" +
+ " <element name=\"beta\">" +
+ " <option>" +
+ " <name>id-strategy-prefix</name>" +
+ " <value>target</value>" +
+ " </option>" +
+ " <element name=\"name\" property=\"name\" />" +
+ " </element>" +
+ " </class>" +
+ "</betwixt-config>";
+
+ IdStoringStrategy storingStrategy = new DefaultIdStoringStrategy() {
+ public String getReferenceFor(Context context, Object bean) {
+ if( bean instanceof BetaBean) {
+ assertNotNull( context.getOptions() );
+ assertEquals("Checking BetaBean option","parent",context.getOptions().getValue("id-strategy-prefix"));
+ }
+ return super.getReferenceFor(context, bean);
+ }
+ };
+
+ StringWriter out = new StringWriter();
+ out.write("<?xml version='1.0'?>");
+ BeanWriter writer = new BeanWriter(out);
+ writer.getBindingConfiguration().setIdMappingStrategy(storingStrategy);
+ writer.getXMLIntrospector().register(new InputSource(new StringReader(MAPPING)));
+ writer.write(alpha);
+
+ String expected = "<?xml version='1.0'?>" +
+ "<alpha id=\"1\">" +
+ " <name>apple</name>" +
+ " <beta id=\"2\">" +
+ " <name>banana</name>"+
+ " </beta>" +
+ "</alpha>";
+
+ xmlAssertIsomorphicContent(parseString(expected), parseString(out));
+ }
}
Modified: jakarta/commons/proper/betwixt/trunk/xdocs/tasks.xml
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/betwixt/trunk/xdocs/tasks.xml?rev=345774&r1=345773&r2=345774&view=diff
==============================================================================
--- jakarta/commons/proper/betwixt/trunk/xdocs/tasks.xml (original)
+++ jakarta/commons/proper/betwixt/trunk/xdocs/tasks.xml Sun Nov 20 10:54:26 2005
@@ -199,6 +199,9 @@
<section name='Completed'>
<subsection name='Since 0.7'>
<ul>
+ <li>
+Added support for option inheritance between parent and target mappings. Issue #37542.
+ </li>
<li>
Added <code>getInheritedOption</code> method to <code>Context</code> to assist
with inheritance amongst options.
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org