Author: jsdelfino
Date: Sat May 10 12:19:27 2008
New Revision: 655139

URL: http://svn.apache.org/viewvc?rev=655139&view=rev
Log:
Allow multiple types to be associated with a single model resolver. This will 
help resolve policies for example, as we'll be able to use a single model 
resolver for policy definitions and the policy set models that they contain.

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=655139&r1=655138&r2=655139&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 May 10 12:19:27 2008
@@ -33,28 +33,30 @@
  * @version $Rev$ $Date$
  */
 public class ExtensibleModelResolver implements ModelResolver {
-    private final ModelResolverExtensionPoint resolvers;
-    private final ModelFactoryExtensionPoint factories;
+    private final ModelResolverExtensionPoint resolverExtensions;
+    private final ModelFactoryExtensionPoint modelFactories;
     private final Contribution contribution;
-    private final ModelResolver defaultResolver;
-    private final Map<Class<?>, ModelResolver> resolverInstances = new 
HashMap<Class<?>, ModelResolver>();
+    private ModelResolver defaultResolver;
+    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>();
 
     /**
      * Constructs an extensible model resolver
      * 
-     * @param resolvers
      * @param contribution
-     * @param factories
+     * @param resolverExtensions
+     * @param modelFactories
+     * @param defaultResolver
      */
     @Deprecated
     public ExtensibleModelResolver(Contribution contribution,
-                                   ModelResolverExtensionPoint resolvers,
-                                   ModelFactoryExtensionPoint factories,
+                                   ModelResolverExtensionPoint 
resolverExtensions,
+                                   ModelFactoryExtensionPoint modelFactories,
                                    ModelResolver defaultResolver) {
         this.contribution = contribution;
-        this.resolvers = resolvers;
-        this.factories = factories;
+        this.resolverExtensions = resolverExtensions;
+        this.modelFactories = modelFactories;
         //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
         // defaultResolver hack.
@@ -64,17 +66,16 @@
     /**
      * Constructs an extensible model resolver
      * 
-     * @param resolvers
+     * @param resolverExtensions
      * @param contribution
-     * @param factories
+     * @param modelFactories
      */
     public ExtensibleModelResolver(Contribution contribution,
-                                   ModelResolverExtensionPoint resolvers,
-                                   ModelFactoryExtensionPoint factories) {
+                                   ModelResolverExtensionPoint 
resolverExtensions,
+                                   ModelFactoryExtensionPoint modelFactories) {
         this.contribution = contribution;
-        this.resolvers = resolvers;
-        this.factories = factories;
-        this.defaultResolver = null;
+        this.resolverExtensions = resolverExtensions;
+        this.modelFactories = modelFactories;
     }
 
     /**
@@ -96,24 +97,31 @@
         for (Class<?> c : classes) {
 
             // Look up an existing model resolver instance
-            ModelResolver resolverInstance = resolverInstances.get(c);
+            ModelResolver resolverInstance = resolversByModelType.get(c);
             if (resolverInstance != null) {
                 return resolverInstance;
             }
 
             // We don't have an instance, lookup a model resolver class
             // and instantiate it
-            Class<? extends ModelResolver> resolverClass = 
resolvers.getResolver(c);
+            Class<? extends ModelResolver> resolverClass = 
resolverExtensions.getResolver(c);
             if (resolverClass != null) {
+
+                // Construct the model resolver instance and cache it
+                resolverInstance = 
resolversByImplementationClass.get(resolverClass);
+                if (resolverInstance != null) {
+                    resolversByModelType.put(c, resolverInstance);
+                    return resolverInstance;
+                }
                 try {
                     Constructor<? extends ModelResolver> constructor =
                         resolverClass
                             .getConstructor(new Class[] {Contribution.class, 
ModelFactoryExtensionPoint.class});
                     if (constructor != null) {
 
-                        // Construct the model resolver instance and cache it
-                        resolverInstance = 
constructor.newInstance(contribution, factories);
-                        resolverInstances.put(c, resolverInstance);
+                        resolverInstance = 
constructor.newInstance(contribution, modelFactories);
+                        resolversByImplementationClass.put(resolverClass, 
resolverInstance);
+                        resolversByModelType.put(c, resolverInstance);
                         return resolverInstance;
                     }
                 } catch (Exception e) {


Reply via email to