Author: rdonkin
Date: Tue Sep 6 14:53:46 2005
New Revision: 279138
URL: http://svn.apache.org/viewcvs?rev=279138&view=rev
Log:
Fixed issue 36363.
Modified:
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/io/read/ChainedBeanCreatorFactory.java
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/io/read/ReadContext.java
Modified:
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/io/read/ChainedBeanCreatorFactory.java
URL:
http://svn.apache.org/viewcvs/jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/io/read/ChainedBeanCreatorFactory.java?rev=279138&r1=279137&r2=279138&view=diff
==============================================================================
---
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/io/read/ChainedBeanCreatorFactory.java
(original)
+++
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/io/read/ChainedBeanCreatorFactory.java
Tue Sep 6 14:53:46 2005
@@ -134,10 +134,7 @@
ElementDescriptor descriptor = element.getDescriptor();
if ( descriptor != null ) {
// check for polymorphism
- if (descriptor.isPolymorphic()) {
- theClass =
context.getXMLIntrospector().getPolymorphicReferenceResolver()
- .resolveType(element, context);
- }
+ theClass = context.resolvePolymorphicType(element);
if (theClass == null)
{
Modified:
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/io/read/ReadContext.java
URL:
http://svn.apache.org/viewcvs/jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/io/read/ReadContext.java?rev=279138&r1=279137&r2=279138&view=diff
==============================================================================
---
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/io/read/ReadContext.java
(original)
+++
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/io/read/ReadContext.java
Tue Sep 6 14:53:46 2005
@@ -25,6 +25,7 @@
import org.apache.commons.betwixt.XMLIntrospector;
import org.apache.commons.betwixt.expression.Context;
import org.apache.commons.betwixt.expression.Updater;
+import org.apache.commons.betwixt.registry.PolymorphicReferenceResolver;
import org.apache.commons.betwixt.strategy.ActionMappingStrategy;
import org.apache.commons.collections.ArrayStack;
import org.apache.commons.logging.Log;
@@ -526,6 +527,82 @@
return result;
}
+ /**
+ * Resolves any polymorphism in the element mapping.
+ * @param mapping <code>ElementMapping</code> describing the mapped element
+ * @return <code>null</code> if the type cannot be resolved
+ * or if the current descriptor is not polymorphic
+ */
+ public Class resolvePolymorphicType(ElementMapping mapping) {
+ Class result = null;
+ Log log = getLog();
+ try {
+ ElementDescriptor currentDescriptor = getCurrentDescriptor();
+ if (currentDescriptor != null) {
+ if (currentDescriptor.isPolymorphic()) {
+ PolymorphicReferenceResolver resolver =
getXMLIntrospector().getPolymorphicReferenceResolver();
+ result = resolver.resolveType(mapping, this);
+ if (result == null) {
+ // try the other polymorphic descriptors
+ ElementDescriptor parent = getParentDescriptor();
+ if (parent != null) {
+ ElementDescriptor[] descriptors =
parent.getElementDescriptors();
+ ElementDescriptor originalDescriptor =
mapping.getDescriptor();
+ boolean resolved = false;
+ for (int i=0; i<descriptors.length;i++) {
+ ElementDescriptor descriptor = descriptors[i];
+ if (descriptor.isPolymorphic()) {
+ mapping.setDescriptor(descriptor);
+ result = resolver.resolveType(mapping,
this);
+ if (result != null) {
+ resolved = true;
+ descriptorStack.pop();
+ popOptions();
+ descriptorStack.push(descriptor);
+ pushOptions(descriptor.getOptions());
+ Updater originalUpdater =
originalDescriptor.getUpdater();
+ Updater newUpdater =
descriptor.getUpdater();
+ substituteUpdater(originalUpdater,
newUpdater);
+ break;
+ }
+ }
+ }
+ if (resolved) {
+ log.debug("Resolved polymorphic type");
+ } else {
+ log.debug("Failed to resolve polymorphic
type");
+ mapping.setDescriptor(originalDescriptor);
+ }
+ }
+ }
+ }
+ }
+ } catch (Exception e) {
+ log.info("Failed to resolved polymorphic type");
+ log.debug(mapping, e);
+ }
+ return result;
+ }
+ /**
+ * Substitutes one updater in the stack for another.
+ * @param originalUpdater <code>Updater</code> possibly null
+ * @param newUpdater <code>Updater</code> possibly null
+ */
+ private void substituteUpdater(Updater originalUpdater, Updater
newUpdater) {
+ // recursively pop elements off the stack until the first match is
found
+ // TODO: may need to consider using custom NILL object and match
descriptors
+ if (!updaterStack.isEmpty()) {
+ Updater updater = (Updater) updaterStack.pop();
+ if (originalUpdater == null && updater == null) {
+ updaterStack.push(newUpdater);
+ } else if (originalUpdater.equals(updater)) {
+ updaterStack.push(newUpdater);
+ } else {
+ substituteUpdater(originalUpdater, newUpdater);
+ updaterStack.push(updater);
+ }
+ }
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]