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/04/28 04:21:42 UTC

svn commit: r652044 - in /incubator/tuscany/java/sca/modules: contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ contribution-namespace/src/main/java/org/apache/tuscany/sca/contribution/namespace/impl/ contribution-resource/...

Author: jsdelfino
Date: Sun Apr 27 19:21:39 2008
New Revision: 652044

URL: http://svn.apache.org/viewvc?rev=652044&view=rev
Log:
Some fixes to the import/export resolution mechanism and simplifications to make it usable in the manager app without a contribution repository and contribution listeners. Added resolvers to the exports to filter resolution based on what's exported. Started to implement a minimal class model resolver for use in the manager environment and default delegating resolvers to help with the implementation of import/export resolvers. Also fixed the manager app contribution loading and resolution logic to avoid loading the same contribution multiple times.

Added:
    incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ClassLoaderModelResolver.java   (with props)
    incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/JavaExportModelResolver.java   (with props)
    incubator/tuscany/java/sca/modules/contribution-namespace/src/main/java/org/apache/tuscany/sca/contribution/namespace/impl/NamespaceExportModelResolver.java   (with props)
    incubator/tuscany/java/sca/modules/contribution-resource/src/main/java/org/apache/tuscany/sca/contribution/resource/impl/ResourceExportModelResolver.java   (with props)
    incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/DefaultDelegatingModelResolver.java   (with props)
    incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/DefaultImportModelResolver.java   (with props)
Modified:
    incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/JavaExportProcessor.java
    incubator/tuscany/java/sca/modules/contribution-namespace/src/main/java/org/apache/tuscany/sca/contribution/namespace/impl/NamespaceExportProcessor.java
    incubator/tuscany/java/sca/modules/contribution-resource/src/main/java/org/apache/tuscany/sca/contribution/resource/impl/ArtifactModelResolver.java
    incubator/tuscany/java/sca/modules/contribution-resource/src/main/java/org/apache/tuscany/sca/contribution/resource/impl/ResourceExportProcessor.java
    incubator/tuscany/java/sca/modules/contribution-xml/src/main/java/org/apache/tuscany/sca/contribution/xml/ContributionMetadataProcessor.java
    incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/ClassReference.java
    incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/DefaultImportAllModelResolver.java
    incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployableCompositeCollectionImpl.java
    incubator/tuscany/java/sca/modules/workspace-impl/src/main/java/org/apache/tuscany/sca/workspace/builder/impl/ContributionDependencyBuilderImpl.java
    incubator/tuscany/java/sca/modules/workspace-impl/src/main/java/org/apache/tuscany/sca/workspace/processor/impl/ContributionContentProcessor.java
    incubator/tuscany/java/sca/modules/workspace-impl/src/main/java/org/apache/tuscany/sca/workspace/processor/impl/ContributionInfoProcessor.java

Added: incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ClassLoaderModelResolver.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ClassLoaderModelResolver.java?rev=652044&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ClassLoaderModelResolver.java (added)
+++ incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ClassLoaderModelResolver.java Sun Apr 27 19:21:39 2008
@@ -0,0 +1,163 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+
+package org.apache.tuscany.sca.contribution.java.impl;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.tuscany.sca.contribution.Contribution;
+import org.apache.tuscany.sca.contribution.Import;
+import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
+import org.apache.tuscany.sca.contribution.java.JavaImport;
+import org.apache.tuscany.sca.contribution.resolver.ClassReference;
+import org.apache.tuscany.sca.contribution.resolver.DefaultDelegatingModelResolver;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
+
+/**
+ * A Model Resolver for ClassReferences.
+ *
+ * @version $Rev$ $Date$
+ */
+public class ClassLoaderModelResolver extends URLClassLoader implements ModelResolver {
+    private Contribution contribution;
+    private Map<String, ModelResolver> importResolvers = new HashMap<String, ModelResolver>();
+    
+    private static ClassLoader contextClassLoader() {
+        return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
+            public ClassLoader run() {
+                return Thread.currentThread().getContextClassLoader();
+            }
+        });           
+    }
+    
+    public ClassLoaderModelResolver(final Contribution contribution, ModelFactoryExtensionPoint modelFactories) throws MalformedURLException {
+        super(new URL[] {new URL(contribution.getLocation())}, contextClassLoader());
+        this.contribution = contribution;
+        
+        // Index Java import resolvers by package name
+        Map<String, List<ModelResolver>> resolverMap = new HashMap<String, List<ModelResolver>>();
+        for (Import import_: this.contribution.getImports()) {
+            if (import_ instanceof JavaImport) {
+                JavaImport javaImport = (JavaImport)import_;
+                List<ModelResolver> resolvers = resolverMap.get(javaImport.getPackage());
+                if (resolvers == null) {
+                    resolvers = new ArrayList<ModelResolver>();
+                    resolverMap.put(javaImport.getPackage(), resolvers);
+                }
+                resolvers.add(javaImport.getModelResolver());
+            }
+        }
+        
+        // Create a delegating model resolver for each imported package
+        for (Map.Entry<String, List<ModelResolver>> entry: resolverMap.entrySet()) {
+            importResolvers.put(entry.getKey(), new DefaultDelegatingModelResolver(entry.getValue()));
+        }
+    }
+
+    public void addModel(Object resolved) {
+        throw new IllegalStateException();
+    }
+
+    public Object removeModel(Object resolved) {
+        throw new IllegalStateException();
+    }
+
+    public <T> T resolveModel(Class<T> modelClass, T unresolved) {
+        if (!(unresolved instanceof ClassReference)) {
+            return unresolved;
+        }
+        
+        try {
+            
+            // Load the class and return a class reference for it
+            String className = ((ClassReference)unresolved).getClassName();
+            Class<?> clazz = Class.forName(className, true, this);
+            return modelClass.cast(new ClassReference(clazz));
+            
+        } catch (ClassNotFoundException e) {
+            return unresolved;
+        } catch (NoClassDefFoundError e) {
+            return unresolved;
+        }
+    }
+    
+    @Override
+    public URL findResource(String name) {
+        
+        //TODO delegate to the Java import resolvers
+        
+        URL url = super.findResource(name);
+        return url;
+    }
+
+    @Override
+    public Enumeration<URL> findResources(String name) throws IOException {
+        
+        //TODO delegate to the Java import resolvers
+        //Enumeration<URL> importedResources;
+        
+        Enumeration<URL> resources = super.findResources(name);
+        List<URL> allResources = new ArrayList<URL>(); 
+        //for (; importedResources.hasMoreElements(); ) {
+        //    allResources.add(importedResources.nextElement());
+        //}
+        for (; resources.hasMoreElements(); ) {
+            allResources.add(resources.nextElement());
+        }
+        return Collections.enumeration(allResources);
+    }
+    
+    @Override
+    protected Class<?> findClass(String name) throws ClassNotFoundException {
+        
+        // Extract the package name
+        int d = name.lastIndexOf('.');
+        String packageName;
+        if (d != -1) {
+            packageName = name.substring(0, d);
+        } else {
+            packageName = null;
+        }
+        
+        // First try to load the class using the Java import resolvers
+        ModelResolver importResolver = importResolvers.get(packageName);
+        if (importResolver != null) {
+            ClassReference classReference = importResolver.resolveModel(ClassReference.class, new ClassReference(name));
+            if (!classReference.isUnresolved()) {
+                return classReference.getJavaClass();
+            }
+        }
+
+        // Next, try to load the class from the current contribution
+        Class<?> clazz = super.findClass(name);
+        return clazz;
+    }
+    
+}

Propchange: incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ClassLoaderModelResolver.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ClassLoaderModelResolver.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ClassLoaderModelResolver.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/JavaExportModelResolver.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/JavaExportModelResolver.java?rev=652044&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/JavaExportModelResolver.java (added)
+++ incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/JavaExportModelResolver.java Sun Apr 27 19:21:39 2008
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+
+package org.apache.tuscany.sca.contribution.java.impl;
+
+import org.apache.tuscany.sca.contribution.java.JavaExport;
+import org.apache.tuscany.sca.contribution.resolver.ClassReference;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
+
+/**
+ * A model resolver for Java exports.
+ *
+ * @version $Rev$ $Date$
+ */
+public class JavaExportModelResolver implements ModelResolver {
+
+    private JavaExport export;
+    private ModelResolver resolver;
+    
+    public JavaExportModelResolver(JavaExport export, ModelResolver resolver) {
+        this.export = export;
+        this.resolver = resolver;
+    }
+    
+    public void addModel(Object resolved) {
+        throw new IllegalStateException();
+    }
+
+    public Object removeModel(Object resolved) {
+        throw new IllegalStateException();
+    }
+
+    public <T> T resolveModel(Class<T> modelClass, T unresolved) {
+        if (!(unresolved instanceof ClassReference)) {
+            return unresolved;
+        }
+        
+        // Filter package name
+        ClassReference classReference = (ClassReference)unresolved;
+        String className = classReference.getClassName();
+        int d = className.lastIndexOf('.');
+        String packageName;
+        if (d != -1) {
+            packageName = className.substring(0, d);
+        } else {
+            packageName = "";
+        }
+        if (export.getPackage().equals(packageName)) {
+            
+            // Package matches the exported package, delegate to the
+            // contribution's resolver
+            return resolver.resolveModel(modelClass, unresolved);
+        } else {
+            
+            // Package is not exported, return the unresolved object 
+            return unresolved;
+        }
+    }
+
+}

Propchange: incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/JavaExportModelResolver.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/JavaExportModelResolver.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/JavaExportModelResolver.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/JavaExportProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/JavaExportProcessor.java?rev=652044&r1=652043&r2=652044&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/JavaExportProcessor.java (original)
+++ incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/JavaExportProcessor.java Sun Apr 27 19:21:39 2008
@@ -114,7 +114,9 @@
         writer.writeEndElement();
     }
 
-    public void resolve(JavaExport model, ModelResolver resolver) throws ContributionResolveException {
+    public void resolve(JavaExport javaExport, ModelResolver resolver) throws ContributionResolveException {
         
+        // Initialize the export resolver
+        javaExport.setModelResolver(new JavaExportModelResolver(javaExport, resolver));
     }
 }

Added: incubator/tuscany/java/sca/modules/contribution-namespace/src/main/java/org/apache/tuscany/sca/contribution/namespace/impl/NamespaceExportModelResolver.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/contribution-namespace/src/main/java/org/apache/tuscany/sca/contribution/namespace/impl/NamespaceExportModelResolver.java?rev=652044&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/contribution-namespace/src/main/java/org/apache/tuscany/sca/contribution/namespace/impl/NamespaceExportModelResolver.java (added)
+++ incubator/tuscany/java/sca/modules/contribution-namespace/src/main/java/org/apache/tuscany/sca/contribution/namespace/impl/NamespaceExportModelResolver.java Sun Apr 27 19:21:39 2008
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+
+package org.apache.tuscany.sca.contribution.namespace.impl;
+
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
+
+/**
+ * A model resolver for namespace exports.
+ *
+ * @version $Rev$ $Date$
+ */
+public class NamespaceExportModelResolver implements ModelResolver {
+
+    private ModelResolver resolver;
+    
+    public NamespaceExportModelResolver(ModelResolver resolver) {
+        this.resolver = resolver;
+    }
+    
+    public void addModel(Object resolved) {
+        throw new IllegalStateException();
+    }
+
+    public Object removeModel(Object resolved) {
+        throw new IllegalStateException();
+    }
+
+    public <T> T resolveModel(Class<T> modelClass, T unresolved) {
+        
+        // Just delegate to the contribution's model resolver, namespace
+        // based filtering is implemented in the model specific model
+        // resolver, which know how to get the namespace of the particular
+        // type of model that they handle 
+        return resolver.resolveModel(modelClass, unresolved);
+    }
+
+}

Propchange: incubator/tuscany/java/sca/modules/contribution-namespace/src/main/java/org/apache/tuscany/sca/contribution/namespace/impl/NamespaceExportModelResolver.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/contribution-namespace/src/main/java/org/apache/tuscany/sca/contribution/namespace/impl/NamespaceExportModelResolver.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: incubator/tuscany/java/sca/modules/contribution-namespace/src/main/java/org/apache/tuscany/sca/contribution/namespace/impl/NamespaceExportModelResolver.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: incubator/tuscany/java/sca/modules/contribution-namespace/src/main/java/org/apache/tuscany/sca/contribution/namespace/impl/NamespaceExportProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/contribution-namespace/src/main/java/org/apache/tuscany/sca/contribution/namespace/impl/NamespaceExportProcessor.java?rev=652044&r1=652043&r2=652044&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/contribution-namespace/src/main/java/org/apache/tuscany/sca/contribution/namespace/impl/NamespaceExportProcessor.java (original)
+++ incubator/tuscany/java/sca/modules/contribution-namespace/src/main/java/org/apache/tuscany/sca/contribution/namespace/impl/NamespaceExportProcessor.java Sun Apr 27 19:21:39 2008
@@ -112,7 +112,9 @@
         writer.writeEndElement();
     }
 
-    public void resolve(NamespaceExport model, ModelResolver resolver) throws ContributionResolveException {
+    public void resolve(NamespaceExport namespaceExport, ModelResolver resolver) throws ContributionResolveException {
         
+        // Initialize the export's resolver
+        namespaceExport.setModelResolver(new NamespaceExportModelResolver(resolver));
     }
 }

Modified: incubator/tuscany/java/sca/modules/contribution-resource/src/main/java/org/apache/tuscany/sca/contribution/resource/impl/ArtifactModelResolver.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/contribution-resource/src/main/java/org/apache/tuscany/sca/contribution/resource/impl/ArtifactModelResolver.java?rev=652044&r1=652043&r2=652044&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/contribution-resource/src/main/java/org/apache/tuscany/sca/contribution/resource/impl/ArtifactModelResolver.java (original)
+++ incubator/tuscany/java/sca/modules/contribution-resource/src/main/java/org/apache/tuscany/sca/contribution/resource/impl/ArtifactModelResolver.java Sun Apr 27 19:21:39 2008
@@ -30,12 +30,12 @@
 import org.apache.tuscany.sca.contribution.resource.ResourceImport;
 
 /**
- * A Model Resolver for ComponentType models.
+ * A Model Resolver for contribution artifacts.
  *
  * @version $Rev$ $Date$
  */
 public class ArtifactModelResolver implements ModelResolver {
-	private Contribution contribution;
+    private Contribution contribution;
     private Map<String, Artifact> map = new HashMap<String, Artifact>();
     
     public ArtifactModelResolver(Contribution contribution, ModelFactoryExtensionPoint modelFactories) {
@@ -53,20 +53,19 @@
     
     public <T> T resolveModel(Class<T> modelClass, T unresolved) {
 
-    	//get artifact URI
+    	// Get the artifact URI
         String uri = ((Artifact)unresolved).getURI();
         if (uri == null) {
         	return (T)unresolved;
         }
         
-        //lookup the componentType
+        // Lookup the artifact
         Artifact resolved = (Artifact) map.get(uri);
         if (resolved != null) {
             return modelClass.cast(resolved);
         } 
         
-        //If not found, delegate the resolution to the imports (in this case based on the resource imports)
-
+        // If not found, delegate the resolution to the imports (in this case based on the resource imports)
         for (Import import_ : this.contribution.getImports()) {
             if (import_ instanceof ResourceImport) {
             	ResourceImport resourceImport = (ResourceImport)import_;

Added: incubator/tuscany/java/sca/modules/contribution-resource/src/main/java/org/apache/tuscany/sca/contribution/resource/impl/ResourceExportModelResolver.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/contribution-resource/src/main/java/org/apache/tuscany/sca/contribution/resource/impl/ResourceExportModelResolver.java?rev=652044&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/contribution-resource/src/main/java/org/apache/tuscany/sca/contribution/resource/impl/ResourceExportModelResolver.java (added)
+++ incubator/tuscany/java/sca/modules/contribution-resource/src/main/java/org/apache/tuscany/sca/contribution/resource/impl/ResourceExportModelResolver.java Sun Apr 27 19:21:39 2008
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+
+package org.apache.tuscany.sca.contribution.resource.impl;
+
+import org.apache.tuscany.sca.contribution.Artifact;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
+import org.apache.tuscany.sca.contribution.resource.ResourceExport;
+
+/**
+ * A model resolver for resource exports.
+ *
+ * @version $Rev$ $Date$
+ */
+public class ResourceExportModelResolver implements ModelResolver {
+
+    private ResourceExport export;
+    private ModelResolver resolver;
+    
+    public ResourceExportModelResolver(ResourceExport export, ModelResolver resolver) {
+        this.export = export;
+        this.resolver = resolver;
+    }
+    
+    public void addModel(Object resolved) {
+        throw new IllegalStateException();
+    }
+
+    public Object removeModel(Object resolved) {
+        throw new IllegalStateException();
+    }
+
+    public <T> T resolveModel(Class<T> modelClass, T unresolved) {
+        
+        // Filter based on the artifact URI
+        Artifact artifact = (Artifact)unresolved;
+        if (export.getURI().equals(artifact.getURI())) {
+            
+            // The artifact URI matches the exported URI, delegate to the
+            // contribution's resolver
+            return resolver.resolveModel(modelClass, unresolved);
+        } else {
+            
+            // The artifact URI is not exported, return the unresolved object
+            return unresolved;
+        }
+    }
+
+}

Propchange: incubator/tuscany/java/sca/modules/contribution-resource/src/main/java/org/apache/tuscany/sca/contribution/resource/impl/ResourceExportModelResolver.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/contribution-resource/src/main/java/org/apache/tuscany/sca/contribution/resource/impl/ResourceExportModelResolver.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: incubator/tuscany/java/sca/modules/contribution-resource/src/main/java/org/apache/tuscany/sca/contribution/resource/impl/ResourceExportModelResolver.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: incubator/tuscany/java/sca/modules/contribution-resource/src/main/java/org/apache/tuscany/sca/contribution/resource/impl/ResourceExportProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/contribution-resource/src/main/java/org/apache/tuscany/sca/contribution/resource/impl/ResourceExportProcessor.java?rev=652044&r1=652043&r2=652044&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/contribution-resource/src/main/java/org/apache/tuscany/sca/contribution/resource/impl/ResourceExportProcessor.java (original)
+++ incubator/tuscany/java/sca/modules/contribution-resource/src/main/java/org/apache/tuscany/sca/contribution/resource/impl/ResourceExportProcessor.java Sun Apr 27 19:21:39 2008
@@ -112,7 +112,9 @@
         writer.writeEndElement();
     }
 
-    public void resolve(ResourceExport model, ModelResolver resolver) throws ContributionResolveException {
-        
+    public void resolve(ResourceExport resourceExport, ModelResolver resolver) throws ContributionResolveException {
+
+        // Initialize the export's model resolver
+        resourceExport.setModelResolver(new ResourceExportModelResolver(resourceExport, resolver));
     }
 }

Modified: incubator/tuscany/java/sca/modules/contribution-xml/src/main/java/org/apache/tuscany/sca/contribution/xml/ContributionMetadataProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/contribution-xml/src/main/java/org/apache/tuscany/sca/contribution/xml/ContributionMetadataProcessor.java?rev=652044&r1=652043&r2=652044&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/contribution-xml/src/main/java/org/apache/tuscany/sca/contribution/xml/ContributionMetadataProcessor.java (original)
+++ incubator/tuscany/java/sca/modules/contribution-xml/src/main/java/org/apache/tuscany/sca/contribution/xml/ContributionMetadataProcessor.java Sun Apr 27 19:21:39 2008
@@ -162,13 +162,13 @@
 
     public void resolve(Contribution contribution, ModelResolver resolver) throws ContributionResolveException {
         contribution.setUnresolved(false);
-
-        // Resolve the imports and exports
-        for (Import import_: contribution.getImports()) {
-            extensionProcessor.resolve(import_, resolver);
-        }
+        
+        // Resolve imports and exports
         for (Export export: contribution.getExports()) {
             extensionProcessor.resolve(export, resolver);
+        }
+        for (Import import_: contribution.getImports()) {
+            extensionProcessor.resolve(import_, resolver);
         }
         
         // Resolve deployable composites

Modified: incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/ClassReference.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/ClassReference.java?rev=652044&r1=652043&r2=652044&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/ClassReference.java (original)
+++ incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/ClassReference.java Sun Apr 27 19:21:39 2008
@@ -21,6 +21,8 @@
 
 import java.lang.ref.WeakReference;
 
+import org.apache.tuscany.sca.assembly.Base;
+
 /**
  * A weak reference to a class, which should be used to register classes
  * with an ArtifactResolver and resolve these classes later.
@@ -30,9 +32,9 @@
  *
  * @version $Rev$ $Date$
  */
-public class ClassReference {
+public class ClassReference implements Base {
     
-    private WeakReference<Class> clazz;
+    private WeakReference<Class<?>> clazz;
     private String className;
 
     /**
@@ -40,8 +42,8 @@
      * 
      * @param clazz The class reference
      */
-    public ClassReference(Class clazz) {
-        this.clazz = new WeakReference<Class>(clazz);
+    public ClassReference(Class<?> clazz) {
+        this.clazz = new WeakReference<Class<?>>(clazz);
         this.className = clazz.getName();
     }
     
@@ -59,7 +61,7 @@
      * 
      * @return The referenced class
      */
-    public Class getJavaClass() {
+    public Class<?> getJavaClass() {
         if (clazz != null) {
             return clazz.get();
         } else {
@@ -76,13 +78,12 @@
         return className;
     }
     
-    /**
-     * Returns true if the class reference is unresolved.
-     * 
-     * @return Whether or not the class has been resolved
-     */
     public boolean isUnresolved() {
         return clazz == null;
+    }
+    
+    public void setUnresolved(boolean unresolved) {
+        throw new IllegalStateException();
     }
 
     @Override

Added: incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/DefaultDelegatingModelResolver.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/DefaultDelegatingModelResolver.java?rev=652044&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/DefaultDelegatingModelResolver.java (added)
+++ incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/DefaultDelegatingModelResolver.java Sun Apr 27 19:21:39 2008
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+
+package org.apache.tuscany.sca.contribution.resolver;
+
+import java.util.List;
+
+import org.apache.tuscany.sca.assembly.Base;
+
+/**
+ * A model resolver implementation that delegates to a list of model resolvers.
+ *
+ * @version $Rev$ $Date$
+ */
+public class DefaultDelegatingModelResolver implements ModelResolver {
+    
+    private List<ModelResolver> resolvers;
+    
+    public DefaultDelegatingModelResolver(List<ModelResolver> resolvers) {
+        this.resolvers = resolvers;
+    }
+
+    public void addModel(Object resolved) {
+        throw new IllegalStateException();
+    }
+
+    public Object removeModel(Object resolved) {
+        throw new IllegalStateException();
+    }
+
+    public <T> T resolveModel(Class<T> modelClass, T unresolved) {
+        
+        //TODO optimize and cache results of the resolution later
+        
+        // Go over all resolvers
+        for (ModelResolver resolver: resolvers) {
+            
+            Object resolved = resolver.resolveModel(modelClass, unresolved);
+            
+            // Return the resolved model object
+            if (resolved instanceof Base) {
+                if (!((Base)resolved).isUnresolved()) {
+                    return modelClass.cast(resolved);
+                }
+            }
+        }
+
+        // Model object was not resolved
+        return unresolved;
+    }
+
+}

Propchange: incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/DefaultDelegatingModelResolver.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/DefaultDelegatingModelResolver.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/DefaultDelegatingModelResolver.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/DefaultImportAllModelResolver.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/DefaultImportAllModelResolver.java?rev=652044&r1=652043&r2=652044&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/DefaultImportAllModelResolver.java (original)
+++ incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/DefaultImportAllModelResolver.java Sun Apr 27 19:21:39 2008
@@ -27,7 +27,7 @@
 import org.apache.tuscany.sca.contribution.Import;
 
 /**
- * A model resolver implementation that considers Exports in any available contribution
+ * A model resolver implementation that considers Exports in a list of contributions.
  *
  * @version $Rev: 560435 $ $Date: 2007-07-27 18:26:55 -0700 (Fri, 27 Jul 2007) $
  */

Added: incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/DefaultImportModelResolver.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/DefaultImportModelResolver.java?rev=652044&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/DefaultImportModelResolver.java (added)
+++ incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/DefaultImportModelResolver.java Sun Apr 27 19:21:39 2008
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+
+package org.apache.tuscany.sca.contribution.resolver;
+
+import java.util.List;
+
+import org.apache.tuscany.sca.assembly.Base;
+import org.apache.tuscany.sca.contribution.Export;
+
+/**
+ * A model resolver implementation that delegates to a list of exports.
+ *
+ * @version $Rev$ $Date$
+ */
+public class DefaultImportModelResolver implements ModelResolver {
+    
+    private List<Export> exports;
+    
+    public DefaultImportModelResolver(List<Export> exports) {
+        this.exports = exports;
+    }
+
+    public void addModel(Object resolved) {
+        throw new IllegalStateException();
+    }
+
+    public Object removeModel(Object resolved) {
+        throw new IllegalStateException();
+    }
+
+    public <T> T resolveModel(Class<T> modelClass, T unresolved) {
+        
+        //TODO optimize and cache results of the resolution later
+        
+        // Go over all exports
+        for (Export export: exports) {
+            
+            Object resolved = export.getModelResolver().resolveModel(modelClass, unresolved);
+            
+            // Return the resolved model object
+            if (resolved instanceof Base) {
+                if (!((Base)resolved).isUnresolved()) {
+                    return modelClass.cast(resolved);
+                }
+            }
+        }
+
+        // Model object was not resolved
+        return unresolved;
+    }
+
+}

Propchange: incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/DefaultImportModelResolver.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/DefaultImportModelResolver.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: incubator/tuscany/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/DefaultImportModelResolver.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployableCompositeCollectionImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployableCompositeCollectionImpl.java?rev=652044&r1=652043&r2=652044&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployableCompositeCollectionImpl.java (original)
+++ incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployableCompositeCollectionImpl.java Sun Apr 27 19:21:39 2008
@@ -29,7 +29,6 @@
 import static org.apache.tuscany.sca.domain.manager.impl.DomainManagerUtil.newRuntime;
 
 import java.io.IOException;
-import java.io.InputStream;
 import java.net.MalformedURLException;
 import java.net.URI;
 import java.net.URL;
@@ -72,13 +71,9 @@
 import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessorExtensionPoint;
 import org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor;
 import org.apache.tuscany.sca.contribution.processor.URLArtifactProcessorExtensionPoint;
-import org.apache.tuscany.sca.contribution.resolver.DefaultModelResolver;
 import org.apache.tuscany.sca.contribution.resolver.ExtensibleModelResolver;
 import org.apache.tuscany.sca.contribution.resolver.ModelResolverExtensionPoint;
-import org.apache.tuscany.sca.contribution.service.ContributionListener;
-import org.apache.tuscany.sca.contribution.service.ContributionListenerExtensionPoint;
 import org.apache.tuscany.sca.contribution.service.ContributionReadException;
-import org.apache.tuscany.sca.contribution.service.ContributionRepository;
 import org.apache.tuscany.sca.contribution.service.ContributionResolveException;
 import org.apache.tuscany.sca.contribution.xml.ContributionGeneratedMetadataDocumentProcessor;
 import org.apache.tuscany.sca.contribution.xml.ContributionMetadataDocumentProcessor;
@@ -136,7 +131,6 @@
     private StAXArtifactProcessor<Composite> compositeProcessor;
     private XMLOutputFactory outputFactory;
     private ContributionDependencyBuilder contributionDependencyBuilder;
-    private List<ContributionListener> contributionListeners; 
     private CompositeBuilder compositeBuilder;
     private CompositeBuilder compositeIncludeBuilder;
     private CompositeBuilder nodeConfigurationBuilder;
@@ -190,9 +184,6 @@
         compositeBuilder = new CompositeBuilderImpl(assemblyFactory, scaBindingFactory, intentAttachPointTypeFactory, contractMapper, monitor);
         compositeIncludeBuilder = new CompositeIncludeBuilderImpl(monitor);
         nodeConfigurationBuilder = new NodeCompositeBuilderImpl(assemblyFactory, scaBindingFactory, contractMapper, null, monitor);
-        
-        //FIXME Remove this later
-        contributionListeners = extensionPoints.getExtensionPoint(ContributionListenerExtensionPoint.class).getContributionListeners();
     }
     
     public Entry<String, Item>[] getAll() {
@@ -332,6 +323,7 @@
         // Populate the domain composite
         Workspace workspace = workspaceFactory.createWorkspace();
         workspace.setModelResolver(new ExtensibleModelResolver(workspace, modelResolvers, modelFactories));
+        
         Map<String, Contribution> contributionMap = new HashMap<String, Contribution>(); 
         for (Entry<String, Item> domainEntry: domainEntries) {
             
@@ -343,23 +335,26 @@
                 // The contribution has not been loaded yet, load it with all its dependencies
                 Entry<String, Item>[] entries = contributionCollection.query("alldependencies=" + contributionURI);
                 for (Entry<String, Item> entry: entries) {
-                    Item contributionItem = entry.getData();
-    
-                    // Read the contribution
-                    Contribution c;
-                    try {
-                        c = contribution(workspace, entry.getKey(), contributionItem.getAlternate());
-                    } catch (ContributionReadException e) {
-                        continue;
-                    }
-                    workspace.getContributions().add(c);
-                    if (contributionURI.equals(entry.getKey())) {
-                        contribution = c;
-                        contributionMap.put(contributionURI, contribution);
-                    }
-                    
-                    // Build contribution dependencies
+                    Item dependencyItem = entry.getData();
+                    String dependencyURI = entry.getKey();
                     
+                    if (!contributionMap.containsKey(dependencyURI)) {
+                        
+                        // Read the contribution
+                        Contribution dependency;
+                        try {
+                            String dependencyLocation = dependencyItem.getAlternate();
+                            dependency = contribution(workspace, dependencyURI, dependencyLocation);
+                        } catch (ContributionReadException e) {
+                            continue;
+                        }
+                        workspace.getContributions().add(dependency);
+                        contributionMap.put(dependencyURI, dependency);
+                        
+                        if (contributionURI.equals(entry.getKey())) {
+                            contribution = dependency;
+                        }
+                    }
                 }
             }
             
@@ -549,13 +544,6 @@
             // Resolve the contribution dependencies
             contributionDependencyBuilder.buildContributionDependencies(contribution, workspace);
             
-            // FIXME simplify this later
-            // Fix up contribution imports
-            ContributionRepository dummyRepository = new DummyContributionRepository(workspace.getContributions());
-            for (ContributionListener listener: contributionListeners) {
-                listener.contributionAdded(dummyRepository, contribution);
-            }            
-            
             contributionContentProcessor.resolve(contribution, workspace.getModelResolver());
             return contribution;
 
@@ -582,13 +570,11 @@
             URL location = locationURL(contributionLocation);
             Contribution contribution = (Contribution)contributionContentProcessor.read(null, uri, location);
             
-            contributionContentProcessor.resolve(contribution, new DefaultModelResolver());
+            //contributionContentProcessor.resolve(contribution, new DefaultModelResolver());
             return contribution;
 
         } catch (ContributionReadException e) {
             throw e;
-        } catch (ContributionResolveException e) {
-            throw new ContributionReadException(e);
         } catch (MalformedURLException e) {
             throw new ContributionReadException(e);
         }
@@ -687,46 +673,6 @@
         item.setAlternate(compositeAlternateLink(contributionLocation, deployableURI));
         item.setRelated(relatedLink(deployable));
         return item;
-    }
-
-    /**
-     * FIXME Remove this later DummyContributionRepository
-     */
-    private class DummyContributionRepository implements ContributionRepository {
-        private List<Contribution> contributions;
-
-        public DummyContributionRepository(List<Contribution> contributions) {
-            this.contributions = contributions;
-        }
-        public void addContribution(Contribution contribution) {
-        }
-        public URL find(String contribution) {
-            return null;
-        }
-        public Contribution getContribution(String uri) {
-            return null;
-        }
-        public List<Contribution> getContributions() {
-            return contributions;
-        }
-        public URI getDomain() {
-            return null;
-        }
-        public List<String> list() {
-            return null;
-        }
-        public void remove(String contribution) {
-        }
-        public void removeContribution(Contribution contribution) {
-        }
-        public URL store(String contribution, URL sourceURL, InputStream contributionStream) throws IOException {
-            return null;
-        }
-        public URL store(String contribution, URL sourceURL) throws IOException {
-            return null;
-        }
-        public void updateContribution(Contribution contribution) {
-        }
     }
 
 }

Modified: incubator/tuscany/java/sca/modules/workspace-impl/src/main/java/org/apache/tuscany/sca/workspace/builder/impl/ContributionDependencyBuilderImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-impl/src/main/java/org/apache/tuscany/sca/workspace/builder/impl/ContributionDependencyBuilderImpl.java?rev=652044&r1=652043&r2=652044&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/workspace-impl/src/main/java/org/apache/tuscany/sca/workspace/builder/impl/ContributionDependencyBuilderImpl.java (original)
+++ incubator/tuscany/java/sca/modules/workspace-impl/src/main/java/org/apache/tuscany/sca/workspace/builder/impl/ContributionDependencyBuilderImpl.java Sun Apr 27 19:21:39 2008
@@ -30,7 +30,10 @@
 import org.apache.tuscany.sca.contribution.Contribution;
 import org.apache.tuscany.sca.contribution.Export;
 import org.apache.tuscany.sca.contribution.Import;
+import org.apache.tuscany.sca.contribution.resolver.DefaultDelegatingModelResolver;
 import org.apache.tuscany.sca.contribution.resolver.DefaultImportAllModelResolver;
+import org.apache.tuscany.sca.contribution.resolver.DefaultImportModelResolver;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
 import org.apache.tuscany.sca.monitor.Monitor;
 import org.apache.tuscany.sca.monitor.Problem;
 import org.apache.tuscany.sca.monitor.Problem.Severity;
@@ -87,8 +90,7 @@
             boolean resolved = false;
             
             // Go through all contribution candidates and their exports
-            List<Contribution> matched = new ArrayList<Contribution>();
-            Set<Contribution> mset = new HashSet<Contribution>();
+            List<Export> matchingExports = new ArrayList<Export>();
             for (Contribution dependency: workspace.getContributions()) {
                 for (Export export: dependency.getExports()) {
                     
@@ -96,11 +98,7 @@
                     // add that contribution to the dependency set
                     if (import_.match(export)) {
                         resolved = true;
-                        
-                        if (!mset.contains(dependency)) {
-                            mset.add(dependency);
-                            matched.add(dependency);
-                        }
+                        matchingExports.add(export);
 
                         if (!set.contains(dependency)) {
                             set.add(dependency);
@@ -115,8 +113,9 @@
             
             if (resolved) {
                 
-                // Initialize the import's model resolver
-                import_.setModelResolver(new DefaultImportAllModelResolver(import_, matched));
+                // Initialize the import's model resolver with a delegating model
+                // resolver which will delegate to the matching exports 
+                import_.setModelResolver(new DefaultImportModelResolver(matchingExports));
                 
             } else {
                 // Record import resolution issue

Modified: incubator/tuscany/java/sca/modules/workspace-impl/src/main/java/org/apache/tuscany/sca/workspace/processor/impl/ContributionContentProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-impl/src/main/java/org/apache/tuscany/sca/workspace/processor/impl/ContributionContentProcessor.java?rev=652044&r1=652043&r2=652044&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/workspace-impl/src/main/java/org/apache/tuscany/sca/workspace/processor/impl/ContributionContentProcessor.java (original)
+++ incubator/tuscany/java/sca/modules/workspace-impl/src/main/java/org/apache/tuscany/sca/workspace/processor/impl/ContributionContentProcessor.java Sun Apr 27 19:21:39 2008
@@ -28,8 +28,10 @@
 import org.apache.tuscany.sca.contribution.Contribution;
 import org.apache.tuscany.sca.contribution.ContributionFactory;
 import org.apache.tuscany.sca.contribution.Export;
+import org.apache.tuscany.sca.contribution.Import;
 import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
 import org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor;
+import org.apache.tuscany.sca.contribution.resolver.ClassReference;
 import org.apache.tuscany.sca.contribution.resolver.ExtensibleModelResolver;
 import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
 import org.apache.tuscany.sca.contribution.resolver.ModelResolverExtensionPoint;
@@ -54,6 +56,7 @@
     public ContributionContentProcessor(ModelFactoryExtensionPoint modelFactories, ModelResolverExtensionPoint modelResolvers, URLArtifactProcessor<Object> artifactProcessor) {
         this.modelFactories = modelFactories;
         this.modelResolvers = modelResolvers;
+        hackResolvers(modelResolvers);
         this.artifactProcessor = artifactProcessor;
         this.contributionFactory = modelFactories.getFactory(ContributionFactory.class);
     }
@@ -126,11 +129,6 @@
             }
         }
         
-        // Initialize the exports model resolvers
-        for (Export export: contribution.getExports()) {
-            export.setModelResolver(modelResolver);
-        }
-        
         return contribution;
     }
     
@@ -153,4 +151,17 @@
         artifactProcessor.resolve(contribution, contributionResolver);
     }
 
+    /**
+     * FIXME Temporary hack for testing the ClassLoaderModelResolver.
+     * 
+     * @param modelResolvers
+     */
+    private static void hackResolvers(ModelResolverExtensionPoint modelResolvers) {
+        modelResolvers.getResolver(ClassReference.class);
+        try {
+            Class<?> loaderResolverClass = Class.forName("org.apache.tuscany.sca.contribution.java.impl.ClassLoaderModelResolver", true, ContributionContentProcessor.class.getClassLoader());
+            modelResolvers.addResolver(ClassReference.class, (Class<? extends ModelResolver>)loaderResolverClass);
+        } catch (ClassNotFoundException e) {
+        }
+    }
 }

Modified: incubator/tuscany/java/sca/modules/workspace-impl/src/main/java/org/apache/tuscany/sca/workspace/processor/impl/ContributionInfoProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-impl/src/main/java/org/apache/tuscany/sca/workspace/processor/impl/ContributionInfoProcessor.java?rev=652044&r1=652043&r2=652044&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/workspace-impl/src/main/java/org/apache/tuscany/sca/workspace/processor/impl/ContributionInfoProcessor.java (original)
+++ incubator/tuscany/java/sca/modules/workspace-impl/src/main/java/org/apache/tuscany/sca/workspace/processor/impl/ContributionInfoProcessor.java Sun Apr 27 19:21:39 2008
@@ -30,8 +30,10 @@
 import org.apache.tuscany.sca.contribution.Contribution;
 import org.apache.tuscany.sca.contribution.ContributionFactory;
 import org.apache.tuscany.sca.contribution.Export;
+import org.apache.tuscany.sca.contribution.Import;
 import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
 import org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor;
+import org.apache.tuscany.sca.contribution.resolver.ClassReference;
 import org.apache.tuscany.sca.contribution.resolver.ExtensibleModelResolver;
 import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
 import org.apache.tuscany.sca.contribution.resolver.ModelResolverExtensionPoint;
@@ -56,6 +58,7 @@
     public ContributionInfoProcessor(ModelFactoryExtensionPoint modelFactories, ModelResolverExtensionPoint modelResolvers, URLArtifactProcessor<Object> artifactProcessor) {
         this.modelFactories = modelFactories;
         this.modelResolvers = modelResolvers;
+        hackResolvers(modelResolvers);
         this.artifactProcessor = artifactProcessor;
         this.contributionFactory = modelFactories.getFactory(ContributionFactory.class);
     }
@@ -135,9 +138,16 @@
             }
         }
         
-        // Initialize the exports model resolvers
-        for (Export export: contribution.getExports()) {
-            export.setModelResolver(modelResolver);
+        // Resolve imports and exports right away
+        try {
+            for (Export export: contribution.getExports()) {
+                artifactProcessor.resolve(export, modelResolver);
+            }
+            for (Import import_: contribution.getImports()) {
+                artifactProcessor.resolve(import_, modelResolver);
+            }
+        } catch (ContributionResolveException e) {
+            throw new ContributionReadException(e);
         }
         
         return contribution;
@@ -147,4 +157,17 @@
         artifactProcessor.resolve(contribution, contribution.getModelResolver());
     }
 
+    /**
+     * FIXME Temporary hack for testing the ClassLoaderModelResolver.
+     * 
+     * @param modelResolvers
+     */
+    private static void hackResolvers(ModelResolverExtensionPoint modelResolvers) {
+        modelResolvers.getResolver(ClassReference.class);
+        try {
+            Class<?> loaderResolverClass = Class.forName("org.apache.tuscany.sca.contribution.java.impl.ClassLoaderModelResolver", true, ContributionContentProcessor.class.getClassLoader());
+            modelResolvers.addResolver(ClassReference.class, (Class<? extends ModelResolver>)loaderResolverClass);
+        } catch (ClassNotFoundException e) {
+        }
+    }
 }