You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by js...@apache.org on 2008/06/07 17:32:05 UTC

svn commit: r664353 - /incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/ExtensibleModelResolver.java

Author: jsdelfino
Date: Sat Jun  7 08:32:05 2008
New Revision: 664353

URL: http://svn.apache.org/viewvc?rev=664353&view=rev
Log:
Protect the model resolvers against infinite recursion caused by circular contribution dependencies.


Modified:
    incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/ExtensibleModelResolver.java

Modified: incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/ExtensibleModelResolver.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/ExtensibleModelResolver.java?rev=664353&r1=664352&r2=664353&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/ExtensibleModelResolver.java (original)
+++ incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/ExtensibleModelResolver.java Sat Jun  7 08:32:05 2008
@@ -23,6 +23,7 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.tuscany.sca.assembly.Base;
 import org.apache.tuscany.sca.contribution.Contribution;
 import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
 
@@ -40,6 +41,7 @@
     private final Map<Class<?>, ModelResolver> resolversByModelType = new HashMap<Class<?>, ModelResolver>();
     private final Map<Class<?>, ModelResolver> resolversByImplementationClass = new HashMap<Class<?>, ModelResolver>();
     private Map<Object, Object> map = new HashMap<Object, Object>();
+    private Object lastUnresolved;
 
     /**
      * Constructs an extensible model resolver
@@ -152,9 +154,24 @@
     }
 
     public <T> T resolveModel(Class<T> modelClass, T unresolved) {
+        // Protect against dependency cycles causing infinite recursion
+        // Save the current unresolved object and check later if we are trying
+        // to resolve the same object again
+        if (unresolved.getClass().getName().contains(".WSDLDef")) {
+            System.out.println(unresolved.getClass().getName());
+        }
+        if (unresolved == lastUnresolved) {
+            return unresolved;
+        }
+        lastUnresolved = unresolved;
+        
         ModelResolver resolver = getModelResolverInstance(unresolved.getClass());
         if (resolver != null) {
-            return resolver.resolveModel(modelClass, unresolved);
+            Object resolved = resolver.resolveModel(modelClass, unresolved);
+            if (resolved != null && resolved != unresolved) {
+                lastUnresolved = null;
+                return modelClass.cast(resolved);
+            }
         } else {
             //FIXME Remove this default resolver, this is currently used to resolve policy declarations
             // but they should be handled by the contribution import/export mechanism instead of this
@@ -162,6 +179,7 @@
             if (defaultResolver != null) {
                 Object resolved = defaultResolver.resolveModel(modelClass, unresolved);
                 if (resolved != null && resolved != unresolved) {
+                    lastUnresolved = null;
                     return modelClass.cast(resolved);
                 }
             }
@@ -169,6 +187,7 @@
             Object resolved = map.get(unresolved);
             if (resolved != null) {
                 // Return the resolved object
+                lastUnresolved = null;
                 return modelClass.cast(resolved);
             }
         }