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]

Reply via email to