You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by rs...@apache.org on 2008/02/20 13:27:48 UTC

svn commit: r629438 - in /incubator/tuscany/java/sca: itest/contribution-classloader/contribution-test/src/test/java/org/apache/tuscany/sca/test/contribution/ modules/contribution-groovy/src/main/java/org/apache/tuscany/sca/contribution/groovy/ modules...

Author: rsivaram
Date: Wed Feb 20 04:27:44 2008
New Revision: 629438

URL: http://svn.apache.org/viewvc?rev=629438&view=rev
Log:
Move ContributionClassLoader to contribution-java

Added:
    incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ContributionClassLoader.java
    incubator/tuscany/java/sca/modules/contribution-java/src/test/java/org/apache/tuscany/sca/contribution/java/impl/ContributionClassLoaderTestCase.java
    incubator/tuscany/java/sca/modules/contribution-java/src/test/resources/deployables/
    incubator/tuscany/java/sca/modules/contribution-java/src/test/resources/deployables/sample-calculator.jar   (with props)
Removed:
    incubator/tuscany/java/sca/modules/contribution-impl/src/main/java/org/apache/tuscany/sca/contribution/service/impl/ContributionClassLoader.java
    incubator/tuscany/java/sca/modules/contribution-impl/src/test/java/org/apache/tuscany/sca/contribution/impl/ContributionClassLoaderTestCase.java
Modified:
    incubator/tuscany/java/sca/itest/contribution-classloader/contribution-test/src/test/java/org/apache/tuscany/sca/test/contribution/ContributionTestCase.java
    incubator/tuscany/java/sca/itest/contribution-classloader/contribution-test/src/test/java/org/apache/tuscany/sca/test/contribution/SupplyChain.java
    incubator/tuscany/java/sca/modules/contribution-groovy/src/main/java/org/apache/tuscany/sca/contribution/groovy/GroovyModelResolver.java
    incubator/tuscany/java/sca/modules/contribution-impl/src/main/java/org/apache/tuscany/sca/contribution/service/impl/ContributionServiceImpl.java
    incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ClassReferenceModelResolver.java
    incubator/tuscany/java/sca/modules/interface-wsdl-xml/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/AbstractWSDLTestCase.java

Modified: incubator/tuscany/java/sca/itest/contribution-classloader/contribution-test/src/test/java/org/apache/tuscany/sca/test/contribution/ContributionTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/itest/contribution-classloader/contribution-test/src/test/java/org/apache/tuscany/sca/test/contribution/ContributionTestCase.java?rev=629438&r1=629437&r2=629438&view=diff
==============================================================================
--- incubator/tuscany/java/sca/itest/contribution-classloader/contribution-test/src/test/java/org/apache/tuscany/sca/test/contribution/ContributionTestCase.java (original)
+++ incubator/tuscany/java/sca/itest/contribution-classloader/contribution-test/src/test/java/org/apache/tuscany/sca/test/contribution/ContributionTestCase.java Wed Feb 20 04:27:44 2008
@@ -65,7 +65,7 @@
         Contribution customerContribution = supplyChain.getContribution("Customer");
         ClassReference customerClassRef = new ClassReference("supplychain.customer.Customer");
         customerClassRef = customerContribution.getModelResolver().resolveModel(ClassReference.class, customerClassRef);
-        Class customerClass = customerClassRef.getJavaClass();
+        Class<?> customerClass = customerClassRef.getJavaClass();
         
         Class customerClassFromContribution = customerContribution.getClassLoader().loadClass("supplychain.customer.Customer");
         Assert.assertEquals(customerClass, customerClassFromContribution);
@@ -312,7 +312,7 @@
         Contribution customerContribution = supplyChain.getContribution("Customer");
         ClassReference customerClassRef = new ClassReference("supplychain.customer.Customer");
         customerClassRef = customerContribution.getModelResolver().resolveModel(ClassReference.class, customerClassRef);
-        Class customerClass = customerClassRef.getJavaClass();
+        Class<?> customerClass = customerClassRef.getJavaClass();
         
         Object customer = supplyChain.getCustomer(customerClass);
                 

Modified: incubator/tuscany/java/sca/itest/contribution-classloader/contribution-test/src/test/java/org/apache/tuscany/sca/test/contribution/SupplyChain.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/itest/contribution-classloader/contribution-test/src/test/java/org/apache/tuscany/sca/test/contribution/SupplyChain.java?rev=629438&r1=629437&r2=629438&view=diff
==============================================================================
--- incubator/tuscany/java/sca/itest/contribution-classloader/contribution-test/src/test/java/org/apache/tuscany/sca/test/contribution/SupplyChain.java (original)
+++ incubator/tuscany/java/sca/itest/contribution-classloader/contribution-test/src/test/java/org/apache/tuscany/sca/test/contribution/SupplyChain.java Wed Feb 20 04:27:44 2008
@@ -77,17 +77,17 @@
     
     public SupplyChain() throws Exception {
         
-        customerContribURL = new File(folderName + "/" + customerJarName + ".jar").toURL();
-        retailerContribURL = new File(folderName + "/" + retailerJarName + ".jar").toURL();
-        warehouseContribURL = new File(folderName + "/" + warehouseJarName + ".jar").toURL();
-        shipperContribURL = new File(folderName + "/" + shipperJarName + ".jar").toURL();
-        supplyChainContribURL = new File(folderName + "/" + supplychainJarName + ".jar").toURL();
-        illegalSupplyChain1ContribURL = new File(folderName + "/" + illegalSupplyChain1JarName + ".jar").toURL();
-        illegalSupplyChain2ContribURL = new File(folderName + "/" + illegalSupplyChain2JarName + ".jar").toURL();
-        illegalCustomerContribURL = new File(folderName + "/" + illegalCustomerJarName + ".jar").toURL();
-        completeSupplyChainContribURL = new File(folderName + "/" + completeSupplychainJarName + ".jar").toURL();
-        customerInterfaceContribURL = new File(folderName + "/" + customerInterfaceJarName + ".jar").toURL();
-        customerImplContribURL = new File(folderName + "/" + customerImplJarName + ".jar").toURL();
+        customerContribURL = new File(folderName + "/" + customerJarName + ".jar").toURI().toURL();
+        retailerContribURL = new File(folderName + "/" + retailerJarName + ".jar").toURI().toURL();
+        warehouseContribURL = new File(folderName + "/" + warehouseJarName + ".jar").toURI().toURL();
+        shipperContribURL = new File(folderName + "/" + shipperJarName + ".jar").toURI().toURL();
+        supplyChainContribURL = new File(folderName + "/" + supplychainJarName + ".jar").toURI().toURL();
+        illegalSupplyChain1ContribURL = new File(folderName + "/" + illegalSupplyChain1JarName + ".jar").toURI().toURL();
+        illegalSupplyChain2ContribURL = new File(folderName + "/" + illegalSupplyChain2JarName + ".jar").toURI().toURL();
+        illegalCustomerContribURL = new File(folderName + "/" + illegalCustomerJarName + ".jar").toURI().toURL();
+        completeSupplyChainContribURL = new File(folderName + "/" + completeSupplychainJarName + ".jar").toURI().toURL();
+        customerInterfaceContribURL = new File(folderName + "/" + customerInterfaceJarName + ".jar").toURI().toURL();
+        customerImplContribURL = new File(folderName + "/" + customerImplJarName + ".jar").toURI().toURL();
     }
     
     public void setUp(ClassLoader parentClassLoader) throws Exception  {

Modified: incubator/tuscany/java/sca/modules/contribution-groovy/src/main/java/org/apache/tuscany/sca/contribution/groovy/GroovyModelResolver.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/contribution-groovy/src/main/java/org/apache/tuscany/sca/contribution/groovy/GroovyModelResolver.java?rev=629438&r1=629437&r2=629438&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/contribution-groovy/src/main/java/org/apache/tuscany/sca/contribution/groovy/GroovyModelResolver.java (original)
+++ incubator/tuscany/java/sca/modules/contribution-groovy/src/main/java/org/apache/tuscany/sca/contribution/groovy/GroovyModelResolver.java Wed Feb 20 04:27:44 2008
@@ -45,6 +45,8 @@
         ClassLoader cl = contribution.getClassLoader();
         if (!(cl instanceof GroovyClassLoader)) {
             // replace the contribution class loader with a Groovy one
+        	// If the contribution does not have a classloader, use context classloader as parent
+        	if (cl == null) cl = Thread.currentThread().getContextClassLoader();
             cl = new GroovyClassLoader(cl);
             contribution.setClassLoader(cl);
         }

Modified: incubator/tuscany/java/sca/modules/contribution-impl/src/main/java/org/apache/tuscany/sca/contribution/service/impl/ContributionServiceImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/contribution-impl/src/main/java/org/apache/tuscany/sca/contribution/service/impl/ContributionServiceImpl.java?rev=629438&r1=629437&r2=629438&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/contribution-impl/src/main/java/org/apache/tuscany/sca/contribution/service/impl/ContributionServiceImpl.java (original)
+++ incubator/tuscany/java/sca/modules/contribution-impl/src/main/java/org/apache/tuscany/sca/contribution/service/impl/ContributionServiceImpl.java Wed Feb 20 04:27:44 2008
@@ -350,8 +350,6 @@
         contribution.setURI(contributionURI.toString());
         contribution.setLocation(locationURL.toString());
         contribution.setModelResolver(modelResolver);
-        //FIXME Remove dependency on classloaders
-        contribution.setClassLoader(new ContributionClassLoader(contribution));
         
         List<URI> contributionArtifacts = null;
 

Modified: incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ClassReferenceModelResolver.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ClassReferenceModelResolver.java?rev=629438&r1=629437&r2=629438&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ClassReferenceModelResolver.java (original)
+++ incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ClassReferenceModelResolver.java Wed Feb 20 04:27:44 2008
@@ -36,7 +36,7 @@
  */
 public class ClassReferenceModelResolver implements ModelResolver {
     private Contribution contribution;
-    protected WeakReference<ClassLoader> classLoader;
+    private WeakReference<ClassLoader> classLoader;
     private Map<String, ClassReference> map = new HashMap<String, ClassReference>();
 
     private ModelResolver osgiResolver;
@@ -44,14 +44,19 @@
     public ClassReferenceModelResolver(Contribution contribution, ModelFactoryExtensionPoint modelFactories) {
         this.contribution = contribution;
         if (this.contribution != null) {
-            this.classLoader = new WeakReference<ClassLoader>(this.contribution.getClassLoader());
+        	ClassLoader cl = contribution.getClassLoader();
+        	if (contribution.getClassLoader() == null) {
+                cl = new ContributionClassLoader(contribution, null);
+                contribution.setClassLoader(cl);
+        	}
+            this.classLoader = new WeakReference<ClassLoader>(cl);
         } else {
             // This path should be used only for unit testing.
             this.classLoader = new WeakReference<ClassLoader>(this.getClass().getClassLoader());
         }
 
         try {
-            Class osgiResolverClass =
+            Class<?> osgiResolverClass =
                 Class.forName("org.apache.tuscany.sca.contribution.osgi.impl.OSGiClassReferenceModelResolver");
             if (osgiResolverClass != null) {
                 Constructor constructor =
@@ -111,6 +116,7 @@
 
     }
 
+    
     /***************
      * Helper methods
      ***************/
@@ -119,4 +125,5 @@
         int pos = clazz.getClassName().lastIndexOf(".");
         return clazz.getClassName().substring(0, pos - 1);
     }
+    
 }

Added: incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ContributionClassLoader.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ContributionClassLoader.java?rev=629438&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ContributionClassLoader.java (added)
+++ incubator/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ContributionClassLoader.java Wed Feb 20 04:27:44 2008
@@ -0,0 +1,379 @@
+/*
+ * 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.util.Collection;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashSet;
+
+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.java.JavaImport;
+
+
+public class ContributionClassLoader extends URLClassLoader {
+    
+    private Contribution contribution;
+
+    
+    /**
+     * Constructor for contribution classloader 
+     * 
+     * @param contribution
+     * @param parent
+     * @throws MalformedURLException
+     */
+    public ContributionClassLoader(Contribution contribution, ClassLoader parent) {
+        
+        // To enable contributions to access code outside of SCA contributions
+        // (typically by providing them on CLASSPATH), use the thread context
+        // classloader as the parent of all contribution classloaders.
+        
+        super(new URL[0], parent == null?Thread.currentThread().getContextClassLoader(): null);
+        this.contribution = contribution;
+        if (contribution.getLocation() != null) {
+            try {
+                this.addURL(new URL(contribution.getLocation()));
+            } catch (MalformedURLException e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+
+    /*
+     * Return the classloader corresponding to a contribution providing an export
+     * Create a new classloader for the contribution if one does not exist
+     */
+    private ClassLoader getExportClassLoader(Contribution exportingContribution) {
+    	ClassLoader cl = exportingContribution.getClassLoader();
+        if (!(cl instanceof ContributionClassLoader)) {
+        	
+        	cl = new ContributionClassLoader(exportingContribution, cl);
+            exportingContribution.setClassLoader(cl);
+        }
+        return cl;
+    }
+    
+    /* (non-Javadoc)
+     * @see java.net.URLClassLoader#findClass(java.lang.String)
+     * 
+     * Search path for class:
+     *     This contribution
+     *     Imported contributions
+     */
+    @Override   
+    protected Class<?> findClass(String className) throws ClassNotFoundException {
+        
+        Class<?> clazz = null;
+        try {
+            clazz = findClassFromContribution(className);
+        } catch (ClassNotFoundException e) {
+                
+            for (Import import_ : this.contribution.getImports()) {
+                if (classNameMatchesImport(className, import_)) {
+                    // Delegate the resolution to the imported contribution
+                    for (Contribution exportingContribution : import_.getExportContributions()) {
+                                    
+                        ClassLoader exportClassLoader = getExportClassLoader(exportingContribution);
+                        if (exportClassLoader instanceof ContributionClassLoader) {
+                            
+                            for (Export export : exportingContribution.getExports()) {
+                                try {
+                                    if (import_.match(export)) {
+                                        clazz = ((ContributionClassLoader)exportClassLoader).findClassFromContribution(className);
+                                        break;
+                                    }
+                                } catch (ClassNotFoundException e1) { 
+                                    continue;
+                                }
+                                    
+                            }
+                            if (clazz != null)  break;
+                        }
+                    }
+                    if (clazz != null) break;
+                }
+            }
+
+            if (clazz == null) throw e;
+        }
+        return clazz;
+    }
+
+    
+    /* (non-Javadoc)
+     * @see java.lang.ClassLoader#loadClass(java.lang.String, boolean)
+     * 
+     * Search path for class:
+     *     Parent classloader
+     *     This contribution
+     *     Imported contributions
+     *     
+     */
+    @Override
+    protected synchronized Class<?> loadClass(String className, boolean resolveClass) 
+        throws ClassNotFoundException {
+       
+        Class<?> clazz = null;
+        try {
+            
+            if (this.getParent() != null)
+                clazz = this.getParent().loadClass(className);
+            
+        } catch (ClassNotFoundException e) {
+        }
+
+        if (clazz == null)
+            clazz = findClass(className);
+
+
+        if (resolveClass)
+            this.resolveClass(clazz);
+        return clazz;
+        
+    }
+
+
+   
+    /*
+     * (non-Javadoc)
+     * 
+     * @see java.net.URLClassLoader#findResource(java.lang.String)
+     */
+    @Override
+    public URL findResource(String name) {
+        
+        URL url = findResourceFromContribution(name);
+        
+        if (url == null) {
+            for (Import import_ : this.contribution.getImports()) {
+                if (resourceNameMatchesImport(name, import_)) {
+                    // Delegate the resolution to the imported contribution
+                    for (Contribution exportingContribution : import_.getExportContributions()) {
+                                
+                        ClassLoader exportClassLoader = getExportClassLoader(exportingContribution);
+                        if (exportClassLoader instanceof ContributionClassLoader) {
+
+                            for (Export export : exportingContribution.getExports()) {
+                                if (import_.match(export)) {
+                                    url = ((ContributionClassLoader)exportClassLoader).findResourceFromContribution(name);
+                                    if (url != null) break;
+                                }
+                            }
+                            if (url != null)  break;
+                        }
+                    }
+                    if (url != null) break;
+                }
+            }
+
+        }
+        return url;
+    }
+
+
+    /* (non-Javadoc)
+     * @see java.net.URLClassLoader#findResources(java.lang.String)
+     */
+    @Override
+    public Enumeration<URL> findResources(String name) throws IOException {
+              
+        return Collections.enumeration(findResourceSet(name));
+    }
+    
+    
+
+    
+    /* (non-Javadoc)
+     * @see java.lang.ClassLoader#getResource(java.lang.String)
+     * 
+     * Find a resource. 
+     * Search path for resource:
+     *     Parent classloader
+     *     This contribution
+     *     Imported contributions
+     */
+    @Override
+    public URL getResource(String resName) {
+ 
+        URL resource  = null;
+        
+        if (this.getParent() != null) {
+            resource  = this.getParent().getResource(resName);
+        }        
+        if (resource == null)
+            resource  = findResource(resName);
+        
+        return resource;
+    }
+
+
+    
+    /* (non-Javadoc)
+     * @see java.lang.ClassLoader#getResources(java.lang.String)
+     * 
+     * Return list of resources from this contribution, resources
+     * imported through imported contributions and resources from parent 
+     * classloader.
+     */
+    @Override
+    public Enumeration<URL> getResources(String resName) throws IOException {
+       
+        HashSet<URL> resourceSet = findResourceSet(resName);
+        addEnumerationToCollection(resourceSet, super.getResources(resName));
+        
+        return Collections.enumeration(resourceSet);
+    }
+    
+
+    /*
+     * Find set of resources
+     */
+    private HashSet<URL> findResourceSet(String name) throws IOException {
+        
+        HashSet<URL> resources = new HashSet<URL>();
+
+        addEnumerationToCollection(resources, super.findResources(name));
+        
+        for (Import import_ : this.contribution.getImports()) {
+            if (resourceNameMatchesImport(name, import_)) {
+                // Delegate the resolution to the imported contribution
+                for (Contribution exportingContribution : import_.getExportContributions()) {
+                                
+                    ClassLoader exportClassLoader = getExportClassLoader(exportingContribution);
+                    if (exportClassLoader instanceof ContributionClassLoader) {
+
+                        for (Export export : exportingContribution.getExports()) {
+                            if (import_.match(export)) {
+                                addEnumerationToCollection(resources,
+                                        ((ContributionClassLoader)exportClassLoader).findResources(name));
+                            }
+                        }
+                    }
+                }
+            }
+         }
+
+        return resources;
+    }
+
+
+    /*
+     * Find class from contribution. If class has already been loaded, return loaded class.
+     */
+    private Class<?> findClassFromContribution(String className) throws ClassNotFoundException {
+        
+        Class<?> clazz = findLoadedClass(className);
+        if (clazz == null)
+            clazz =  super.findClass(className);
+        return clazz;
+       
+    }
+    
+    /*
+     * Find resource from contribution.
+     */
+    private URL findResourceFromContribution(String name) {
+        
+        return super.findResource(name);
+    }
+    
+    /**
+     * Check if a class name matches an import statement.
+     * Class matches if the package name used in <import.java/> matches
+     * 
+     * @param name    Name of class 
+     * @param import_ SCA contribution import
+     * @return true if this is a matching import
+     */
+    private boolean classNameMatchesImport(String name, Import import_) {
+        
+        if (import_ instanceof JavaImport && name != null && name.lastIndexOf('.') > 0) {
+            JavaImport javaImport = (JavaImport) import_;
+                
+            String packageName = name.substring(0, name.lastIndexOf('.'));
+            if (javaImport.getPackage().endsWith(".*")) {
+                String prefix = javaImport.getPackage().substring(0, javaImport.getPackage().length() -1);
+                 if (packageName.startsWith(prefix)) {
+                    return true;
+                }
+            } else {
+                return packageName.equals(javaImport.getPackage());
+            }
+        }
+        
+        return false;
+    }
+    
+    /**
+     * Check if a resource name matches an import statement.
+     * Resource matches if package/namespace match the directory of resource.
+     * 
+     * @param name    Name of resource
+     * @param import_ SCA contribution import
+     * @return true if this is a matching import
+     */
+    private boolean resourceNameMatchesImport(String name, Import import_) {
+        
+       
+        if (name == null || name.lastIndexOf('/') <= 0)
+            return false;
+        else if (import_ instanceof JavaImport) {
+            JavaImport javaImport = (JavaImport) import_;
+            
+            if (javaImport.getPackage().endsWith(".*")) {
+                String packageName = name.substring(0, name.lastIndexOf('/')).replace('/', '.');
+                String prefix = javaImport.getPackage().substring(0, javaImport.getPackage().length() -1);
+                if (packageName.startsWith(prefix)) {
+                    return true;
+                }
+            } else {
+                // 'name' is a resource : contains "/" as separators
+                // Get package name from resource name
+                String packageName = name.substring(0, name.lastIndexOf('/'));
+                 return packageName.equals(javaImport.getPackage().replaceAll("\\.", "/"));
+            }
+        } 
+        return false;
+    }
+    
+    /*
+     * Add an enumeration to a Collection
+     */
+    private <T extends Object> void addEnumerationToCollection(Collection<T> collection, Enumeration<T> enumeration) {
+        
+        while (enumeration.hasMoreElements())
+            collection.add(enumeration.nextElement());
+    }
+    
+    
+    @Override
+    public String toString() {
+        return "SCA contribution classloader for : " + contribution.getLocation();
+    }
+    
+    
+}

Added: incubator/tuscany/java/sca/modules/contribution-java/src/test/java/org/apache/tuscany/sca/contribution/java/impl/ContributionClassLoaderTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/contribution-java/src/test/java/org/apache/tuscany/sca/contribution/java/impl/ContributionClassLoaderTestCase.java?rev=629438&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/contribution-java/src/test/java/org/apache/tuscany/sca/contribution/java/impl/ContributionClassLoaderTestCase.java (added)
+++ incubator/tuscany/java/sca/modules/contribution-java/src/test/java/org/apache/tuscany/sca/contribution/java/impl/ContributionClassLoaderTestCase.java Wed Feb 20 04:27:44 2008
@@ -0,0 +1,253 @@
+/*
+ * 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.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+
+import org.apache.tuscany.sca.contribution.Contribution;
+import org.apache.tuscany.sca.contribution.ContributionFactory;
+import org.apache.tuscany.sca.contribution.DefaultContributionFactory;
+import org.apache.tuscany.sca.contribution.java.JavaExport;
+import org.apache.tuscany.sca.contribution.java.JavaImport;
+import org.apache.tuscany.sca.contribution.java.JavaImportExportFactory;
+import org.apache.tuscany.sca.contribution.java.impl.JavaImportExportFactoryImpl;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+/**
+ * Test ContributionClassLoader.
+ *
+ */
+public class ContributionClassLoaderTestCase  {
+    
+    private ContributionFactory contributionFactory;
+    private JavaImportExportFactory javaImportExportFactory;
+    
+    @Before
+    public void setUp() throws Exception {
+        contributionFactory = new DefaultContributionFactory();
+        javaImportExportFactory = new JavaImportExportFactoryImpl();
+    }
+    
+    @After
+    public void tearDown() throws Exception {
+    }
+    
+    private Contribution createContribution(String fileName) throws MalformedURLException {
+
+        Contribution contrib = contributionFactory.createContribution();
+        File contribDir = new File(fileName);        
+        contrib.setLocation(contribDir.toURI().toURL().toString());
+        contrib.setClassLoader(new ContributionClassLoader(contrib, null));
+        return contrib;
+    }
+    
+   
+    @Test
+    public void testClassLoadingFromContribution() throws ClassNotFoundException, MalformedURLException {
+        
+        Contribution contribA = createContribution("target/test-classes");
+        Contribution contribB = createContribution("target");
+        Contribution contribC = createContribution("target/test-classes/deployables/sample-calculator.jar");
+        
+        // Class present in contribution, also in parent. Class is loaded from parent
+        Class<?> testClassA = contribA.getClassLoader().loadClass(this.getClass().getName());        
+        Assert.assertNotNull(testClassA);
+        Assert.assertSame(this.getClass(), testClassA);
+        
+        // Class not present in contribution, but present in parent classloader
+        Class<?> testClassB = contribB.getClassLoader().loadClass(this.getClass().getName());
+        Assert.assertNotNull(testClassB);
+        Assert.assertSame(this.getClass(), testClassB);
+        
+        // Class present in contribution, but not in parent
+        Class<?> testClassC = contribC.getClassLoader().loadClass("calculator.AddService");        
+        Assert.assertNotNull(testClassC);
+        
+        // Class not present in contribution or in parent
+        try {
+            contribA.getClassLoader().loadClass("NonExistent");
+            
+            Assert.assertTrue("ClassNotFoundException not thrown as expected", false);
+            
+        } catch (ClassNotFoundException e) {
+        }
+        
+        
+        
+    }
+    
+    @Test
+    public void testResourceLoadingFromContribution() throws ClassNotFoundException, MalformedURLException {
+        
+        Contribution contribA = createContribution("target/test-classes");
+        Contribution contribB = createContribution("target");
+        Contribution contribC = createContribution("target/test-classes/deployables/sample-calculator.jar");
+        
+        // Resource present in contribution, and in parent
+        URL resA = contribA.getClassLoader().getResource("deployables/sample-calculator.jar");
+        Assert.assertNotNull(resA);
+        
+        // Resource not present in contribution, but present in parent classloader
+        URL resB = contribB.getClassLoader().getResource("deployables/sample-calculator.jar");
+        Assert.assertNotNull(resB);
+        
+        // Resource present in contribution, but not in parent
+        URL resC = contribC.getClassLoader().getResource("calculator/AddService.class");
+        Assert.assertNotNull(resC);        
+        
+        // Load Java class as resource from parent
+        String classResName = this.getClass().getName().replaceAll("\\.", "/") + ".class";
+        URL classResA = contribA.getClassLoader().getResource(classResName);
+        Assert.assertNotNull(classResA);
+               
+        // Non-existent resource
+        URL res = contribA.getClassLoader().getResource("deployables/NonExistent");
+        Assert.assertNull(res);
+        
+    }
+    
+
+    @Test
+    public void testClassLoadingFromImportedContribution() throws ClassNotFoundException, MalformedURLException {
+        
+        Contribution contribA = createContribution("target/test-classes");
+        Contribution contribB = createContribution("target");
+        Contribution contribC = createContribution("target/test-classes/deployables/sample-calculator.jar");
+        ArrayList<Contribution> exportContribList = new ArrayList<Contribution>();
+        exportContribList.add(contribA);
+        exportContribList.add(contribC);
+        
+        JavaImport import_ = javaImportExportFactory.createJavaImport();
+        import_.setPackage(this.getClass().getPackage().getName());
+        import_.setExportContributions(exportContribList);
+        contribB.getImports().add(import_);
+        import_ = javaImportExportFactory.createJavaImport();
+        import_.setPackage("calculator");
+        import_.setExportContributions(exportContribList);
+        contribB.getImports().add(import_);
+        
+        JavaExport export = javaImportExportFactory.createJavaExport();
+        export.setPackage(this.getClass().getPackage().getName());
+        contribA.getExports().add(export);
+        export = javaImportExportFactory.createJavaExport();
+        export.setPackage("calculator");
+        contribC.getExports().add(export);        
+        
+        // Load class from parent, class is also present in imported contribution. Class should
+        // be loaded from parent
+        Class<?> testClassB = contribB.getClassLoader().loadClass(this.getClass().getName());        
+        Assert.assertNotNull(testClassB);
+        Assert.assertSame(this.getClass(), testClassB);
+        
+        // Load class from parent, class is also present in parent. Class should be loaded
+        // from parent.
+        Class<?> testClassA = contribA.getClassLoader().loadClass(this.getClass().getName());        
+        Assert.assertNotNull(testClassA);
+        Assert.assertSame(this.getClass(), testClassA);
+        
+        // Imported class should be the same as the one loaded by the exporting contribution
+        Assert.assertSame(testClassA, testClassB);
+        
+        // Load class from imported contribution, class is not present in parent
+        Class<?> testClassB1 = contribB.getClassLoader().loadClass("calculator.AddService");
+        Assert.assertNotNull(testClassB1);
+        
+        // Imported class should be the same as the one loaded by the exporting contribution
+        Class<?> testClassC = contribC.getClassLoader().loadClass("calculator.AddService");
+        Assert.assertNotNull(testClassC);        
+        Assert.assertSame(testClassC, testClassB1);
+        
+
+        // Try to load class from package which is not explicitly imported - should throw ClassNotFoundException
+        try {
+            contribA.getClassLoader().loadClass("calculator.AddService");
+            
+            Assert.assertTrue("ClassNotFoundException not thrown as expected", false);
+            
+        } catch (ClassNotFoundException e) {
+        }
+        
+        // Try to load non-existent class from imported package - should throw ClassNotFoundException
+        try {
+            contribB.getClassLoader().loadClass(this.getClass().getPackage().getName() + ".NonExistentClass");
+            
+            Assert.assertTrue("ClassNotFoundException not thrown as expected", false);
+            
+        } catch (ClassNotFoundException e) {
+        }
+        
+    }
+
+    @Test
+    public void testResourceLoadingFromImportedContribution() throws ClassNotFoundException, MalformedURLException {
+        
+        Contribution contribA = createContribution("target/test-classes");
+        Contribution contribB = createContribution("target");
+        Contribution contribC = createContribution("target/test-classes/deployables/sample-calculator.jar");
+        
+        ArrayList<Contribution> exportContribList = new ArrayList<Contribution>();
+        exportContribList.add(contribA);
+        exportContribList.add(contribC);
+        
+        JavaImport import_ = javaImportExportFactory.createJavaImport();
+        import_.setPackage(this.getClass().getPackage().getName());
+        import_.setExportContributions(exportContribList);
+        contribB.getImports().add(import_);
+        JavaImport import1_ = javaImportExportFactory.createJavaImport();
+        import1_.setPackage("calculator");
+        import1_.setExportContributions(exportContribList);
+        contribB.getImports().add(import1_);
+        
+        JavaExport export = javaImportExportFactory.createJavaExport();
+        export.setPackage(this.getClass().getPackage().getName());
+        contribA.getExports().add(export);
+        JavaExport export1 = javaImportExportFactory.createJavaExport();
+        export1.setPackage("calculator");
+        contribC.getExports().add(export1);
+
+        
+        // Load resource from parent
+        URL resB = contribB.getClassLoader().getResource("deployables/sample-calculator.jar"); 
+        Assert.assertNotNull(resB);
+        
+        // Load Java class as resource from imported contribution with JavaImport
+        String classResName = this.getClass().getName().replaceAll("\\.", "/") + ".class";               
+        URL classResB = contribB.getClassLoader().getResource(classResName);
+        Assert.assertNotNull(classResB);
+        
+        // Load Java class as resource from imported contribution with JavaImport
+        URL classResB1 = contribB.getClassLoader().getResource("calculator/AddService.class");
+        Assert.assertNotNull(classResB1);
+        
+        // Try to load resource not explicitly imported by contribution
+        URL classResA1 = contribA.getClassLoader().getResource("calculator/AddService.class");
+        Assert.assertNull(classResA1);
+        
+        
+    }
+
+}

Added: incubator/tuscany/java/sca/modules/contribution-java/src/test/resources/deployables/sample-calculator.jar
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/contribution-java/src/test/resources/deployables/sample-calculator.jar?rev=629438&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/tuscany/java/sca/modules/contribution-java/src/test/resources/deployables/sample-calculator.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Modified: incubator/tuscany/java/sca/modules/interface-wsdl-xml/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/AbstractWSDLTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/interface-wsdl-xml/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/AbstractWSDLTestCase.java?rev=629438&r1=629437&r2=629438&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/interface-wsdl-xml/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/AbstractWSDLTestCase.java (original)
+++ incubator/tuscany/java/sca/modules/interface-wsdl-xml/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/AbstractWSDLTestCase.java Wed Feb 20 04:27:44 2008
@@ -30,7 +30,6 @@
 import org.apache.tuscany.sca.contribution.resolver.ExtensibleModelResolver;
 import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
 import org.apache.tuscany.sca.contribution.resolver.ModelResolverExtensionPoint;
-import org.apache.tuscany.sca.contribution.service.impl.ContributionClassLoader;
 import org.apache.tuscany.sca.interfacedef.wsdl.xml.WSDLDocumentProcessor;
 import org.apache.tuscany.sca.interfacedef.wsdl.xml.WSDLModelResolver;
 import org.apache.tuscany.sca.interfacedef.wsdl.xml.XSDModelResolver;
@@ -51,8 +50,6 @@
         super.setUp();
         ContributionFactory contributionFactory = new DefaultContributionFactory();
         Contribution contribution = contributionFactory.createContribution();
-        //FIXME Remove dependency on classloaders
-        contribution.setClassLoader(new ContributionClassLoader(contribution));
         ModelResolverExtensionPoint modelResolvers = new DefaultModelResolverExtensionPoint();
         ModelFactoryExtensionPoint factories = new DefaultModelFactoryExtensionPoint();
         wsdlFactory = new DefaultWSDLFactory();



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org