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);
}
}