You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by ra...@apache.org on 2009/06/30 13:13:50 UTC

svn commit: r789681 [2/2] - in /tuscany/branches/sca-java-1.x: itest/spring/src/main/resources/ itest/spring/src/main/resources/META-INF/ itest/spring/src/main/resources/context/access/ itest/spring/src/main/resources/context/imports/ itest/spring/src/...

Modified: tuscany/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java?rev=789681&r1=789680&r2=789681&view=diff
==============================================================================
--- tuscany/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java (original)
+++ tuscany/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java Tue Jun 30 11:13:48 2009
@@ -24,8 +24,14 @@
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URI;
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Enumeration;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -45,6 +51,11 @@
 import org.apache.tuscany.sca.assembly.Property;
 import org.apache.tuscany.sca.assembly.Reference;
 import org.apache.tuscany.sca.assembly.Service;
+import org.apache.tuscany.sca.contribution.Artifact;
+import org.apache.tuscany.sca.contribution.ContributionFactory;
+import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
+import org.apache.tuscany.sca.contribution.resolver.ClassReference;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
 import org.apache.tuscany.sca.contribution.service.ContributionReadException;
 import org.apache.tuscany.sca.contribution.service.ContributionResolveException;
 import org.apache.tuscany.sca.implementation.java.JavaImplementation;
@@ -68,28 +79,30 @@
 
 /**
  * Introspects a Spring XML application-context configuration file to create <implementation-spring../>
- * component type information. 
- * 
+ * component type information.
+ *
  *
  * @version $Rev: 512919 $ $Date: 2007-02-28 19:32:56 +0000 (Wed, 28 Feb 2007) $
  */
 public class SpringXMLComponentTypeLoader {
-
+    private XMLInputFactory xmlInputFactory;
+    private ContributionFactory contributionFactory;
     private AssemblyFactory assemblyFactory;
     private JavaInterfaceFactory javaFactory;
     private PolicyFactory policyFactory;
-    private ClassLoader cl;
 
     private SpringBeanIntrospector beanIntrospector;
-    private String contextPath;
 
-    public SpringXMLComponentTypeLoader(AssemblyFactory assemblyFactory,
+    public SpringXMLComponentTypeLoader(ModelFactoryExtensionPoint factories,
+                                        AssemblyFactory assemblyFactory,
                                         JavaInterfaceFactory javaFactory,
                                         PolicyFactory policyFactory) {
         super();
         this.assemblyFactory = assemblyFactory;
         this.javaFactory = javaFactory;
         this.policyFactory = policyFactory;
+        this.contributionFactory = factories.getFactory(ContributionFactory.class);
+        this.xmlInputFactory = factories.getFactory(XMLInputFactory.class);
     }
 
     protected Class<SpringImplementation> getImplementationClass() {
@@ -97,11 +110,11 @@
     }
 
     /**
-     * Base method which loads the component type from the application-context attached to the 
+     * Base method which loads the component type from the application-context attached to the
      * Spring implementation
-     * 
+     *
      */
-    public void load(SpringImplementation implementation) throws ContributionReadException {
+    public void load(SpringImplementation implementation, ModelResolver resolver) throws ContributionReadException {
         //System.out.println("Spring TypeLoader - load method start");
     	ComponentType componentType = implementation.getComponentType();
         /* Check that there is a component type object already set	*/
@@ -110,45 +123,54 @@
         }
         if (componentType.isUnresolved()) {
             /* Fetch the location of the application-context file from the implementation */
-            loadFromXML(implementation);
+            loadFromXML(implementation, resolver);
             if (!componentType.isUnresolved())
                 implementation.setUnresolved(false);
         } // end if
         //System.out.println("Spring TypeLoader - load method complete");
     } // end method load
 
+    
+    private Class<?> resolveClass(ModelResolver resolver, String className) throws ClassNotFoundException {
+        ClassReference classReference = new ClassReference(className);
+        classReference = resolver.resolveModel(ClassReference.class, classReference);
+        if (classReference.isUnresolved()) {
+            throw new ClassNotFoundException(className);
+        }
+        Class<?> javaClass = classReference.getJavaClass();
+        return javaClass;
+    }
+
     /**
-     * Method which fills out the component type for a Spring implementation by reading the 
+     * Method which fills out the component type for a Spring implementation by reading the
      * Spring application-context.xml file.
-     * 
+     *
      * @param implementation SpringImplementation into which to load the component type information
      * @throws ContributionReadException Failed to read the contribution
      */
-    private void loadFromXML(SpringImplementation implementation) throws ContributionReadException {
+    private void loadFromXML(SpringImplementation implementation, ModelResolver resolver) throws ContributionReadException {
         XMLStreamReader reader;
         List<SpringBeanElement> beans = new ArrayList<SpringBeanElement>();
         List<SpringSCAServiceElement> services = new ArrayList<SpringSCAServiceElement>();
         List<SpringSCAReferenceElement> references = new ArrayList<SpringSCAReferenceElement>();
-        List<SpringSCAPropertyElement> scaproperties = new ArrayList<SpringSCAPropertyElement>();        
+        List<SpringSCAPropertyElement> scaproperties = new ArrayList<SpringSCAPropertyElement>();
 
         URL resource;
 
-        contextPath = implementation.getLocation();
+        String contextPath = implementation.getLocation();
 
         try {
-            // FIXME - is the ContextClassLoader the right place to start the search?
-            cl = Thread.currentThread().getContextClassLoader();
+            resource = resolveLocation(resolver, contextPath);
+            resource = getApplicationContextResource(resource);
 
-            resource = getApplicationContextResource(contextPath, cl);
+            implementation.setClassLoader(new ContextClassLoader(resolver));
             implementation.setResource(resource);
             // The URI is used to uniquely identify the Implementation
-            implementation.setURI(resource.toString());            
-            // FIXME - need a better way to handle the XMLInputFactory than allocating a new one every time
-            XMLInputFactory xmlFactory = XMLInputFactory.newInstance();
-            reader = xmlFactory.createXMLStreamReader(resource.openStream());
+            implementation.setURI(resource.toString());
+            reader = xmlInputFactory.createXMLStreamReader(resource.openStream());
 
-            // System.out.println("Spring TypeLoader - starting to read context file");            
-            readContextDefinition(reader, beans, services, references, scaproperties);
+            // System.out.println("Spring TypeLoader - starting to read context file");
+            readContextDefinition(resolver, reader, contextPath, beans, services, references, scaproperties);
 
         } catch (IOException e) {
             throw new ContributionReadException(e);
@@ -159,44 +181,64 @@
         /* At this point, the complete application-context.xml file has been read and its contents  */
         /* stored in the lists of beans, services, references.  These are now used to generate      */
         /* the implied componentType for the application context								    */
-        generateComponentType(implementation, beans, services, references, scaproperties);
+        generateComponentType(implementation, resolver, beans, services, references, scaproperties);
 
         return;
     } // end method loadFromXML
+
     
+    private URL resolveLocation(ModelResolver resolver, String contextPath) throws MalformedURLException,
+        ContributionReadException {
+        URL resource = null;
+        URI uri = URI.create(contextPath);
+        if (!uri.isAbsolute()) {
+            Artifact artifact = contributionFactory.createArtifact();
+            artifact.setUnresolved(true);
+            artifact.setURI(contextPath);
+            artifact = resolver.resolveModel(Artifact.class, artifact);
+            if (!artifact.isUnresolved()) {
+                resource = new URL(artifact.getLocation());
+            } else {
+                throw new ContributionReadException("Location cannot be resloved: " + contextPath);
+            }
+        } else {
+            resource = new URL(contextPath);
+        }
+        return resource;
+    }
+
     /**
      * Method which returns the XMLStreamReader for the Spring application-context.xml file
      * specified in the location attribute
      */
-    private XMLStreamReader getApplicationContextReader(String location) throws ContributionReadException {
-        
+    private XMLStreamReader getApplicationContextReader(ModelResolver resolver, String location) throws ContributionReadException {
+
         try {
-            // FIXME - is the ContextClassLoader the right place to start the search?
-            cl = Thread.currentThread().getContextClassLoader();
-            URL resource = getApplicationContextResource(location, cl);            
-            // FIXME - need a better way to handle the XMLInputFactory than allocating a new one every time
-            XMLInputFactory xmlFactory = XMLInputFactory.newInstance();
-            XMLStreamReader reader = xmlFactory.createXMLStreamReader(resource.openStream());
+            URL resource = getApplicationContextResource(resolveLocation(resolver, location));
+            XMLStreamReader reader =
+            	xmlInputFactory.createXMLStreamReader(resource.openStream());
             return reader;
         } catch (IOException e) {
             throw new ContributionReadException(e);
         } catch (XMLStreamException e) {
             throw new ContributionReadException(e);
         }
-    }    
-    
+    }
+
     /**
-     * Method which reads the spring context definitions from Spring application-context.xml 
-     * file and identifies the defined beans, properties, services and references     
+     * Method which reads the spring context definitions from Spring application-context.xml
+     * file and identifies the defined beans, properties, services and references
      */
-    private void readContextDefinition(XMLStreamReader reader, 
-            List<SpringBeanElement> beans,
-            List<SpringSCAServiceElement> services,
-            List<SpringSCAReferenceElement> references,
-            List<SpringSCAPropertyElement> scaproperties) throws ContributionReadException {
-        
+    private void readContextDefinition(ModelResolver resolver,
+                                       XMLStreamReader reader,
+                                       String contextPath,
+                                       List<SpringBeanElement> beans,
+                                       List<SpringSCAServiceElement> services,
+                                       List<SpringSCAReferenceElement> references,
+                                       List<SpringSCAPropertyElement> scaproperties) throws ContributionReadException {
+
         SpringBeanElement bean = null;
-        
+
         try {
             boolean completed = false;
             while (!completed) {
@@ -210,9 +252,9 @@
                             if (location != null) {
                             	// FIXME - need to find a right way of generating this path
                                 String resourcePath = contextPath.substring(0, contextPath.lastIndexOf("/")+1) + location;
-                                XMLStreamReader ireader = getApplicationContextReader(resourcePath);
+                                XMLStreamReader ireader = getApplicationContextReader(resolver, resourcePath);
                                 // Read the context definition for the identified imported resource
-                                readContextDefinition(ireader, beans, services, references, scaproperties);
+                                readContextDefinition(resolver, ireader, contextPath, beans, services, references, scaproperties);
                             }
                         } else if (SpringImplementationConstants.SERVICE_ELEMENT.equals(qname)) {
                             SpringSCAServiceElement service =
@@ -234,7 +276,7 @@
                                     .getAttributeValue(null, "class"));
                             beans.add(bean);
                             // Read the <bean> element and its child elements
-                            readBeanDefinition(reader, bean, beans, services, references, scaproperties);
+                            readBeanDefinition(resolver, reader, contextPath, bean, beans, services, references, scaproperties);
                         } // end if*/
                         break;
                     case END_ELEMENT:
@@ -249,24 +291,26 @@
             throw new ContributionReadException(e);
         }
     }
-    
-    
+
+
     /**
      * Method which reads the bean definitions from Spring application-context.xml file and identifies
-     * the defined beans, properties, services and references     
+     * the defined beans, properties, services and references
      */
-    private void readBeanDefinition(XMLStreamReader reader,
-    		SpringBeanElement bean,
-            List<SpringBeanElement> beans,
-            List<SpringSCAServiceElement> services,
-            List<SpringSCAReferenceElement> references,
-            List<SpringSCAPropertyElement> scaproperties) throws ContributionReadException {
-        
+    private void readBeanDefinition(ModelResolver resolver,
+                                    XMLStreamReader reader,
+                                    String contextPath,
+                                    SpringBeanElement bean,
+                                    List<SpringBeanElement> beans,
+                                    List<SpringSCAServiceElement> services,
+                                    List<SpringSCAReferenceElement> references,
+                                    List<SpringSCAPropertyElement> scaproperties) throws ContributionReadException {
+
     	SpringBeanElement innerbean = null;
         SpringPropertyElement property = null;
         SpringConstructorArgElement constructorArg = null;
         int autoConstructorIndex = -1;
-        
+
         try {
             boolean completed = false;
             while (!completed) {
@@ -278,13 +322,13 @@
                                     .getAttributeValue(null, "class"));
                             innerbean.setInnerBean(true);
                             beans.add(innerbean);
-                            readBeanDefinition(reader, innerbean, beans, services, references, scaproperties);
+                            readBeanDefinition(resolver, reader, contextPath, innerbean, beans, services, references, scaproperties);
                         } else if (SpringImplementationConstants.PROPERTY_ELEMENT.equals(qname)) {
                             property = new SpringPropertyElement(reader.getAttributeValue(null, "name"), reader
                                     .getAttributeValue(null, "ref"));
                             bean.addProperty(property);
                         } else if (SpringImplementationConstants.CONSTRUCTORARG_ELEMENT.equals(qname)) {
-                            constructorArg = new SpringConstructorArgElement(reader.getAttributeValue(null, "ref"), 
+                            constructorArg = new SpringConstructorArgElement(reader.getAttributeValue(null, "ref"),
                                     reader.getAttributeValue(null, "type"));
                             autoConstructorIndex++;
                             constructorArg.setAutoIndex(autoConstructorIndex);
@@ -294,17 +338,17 @@
                             	String value = reader.getAttributeValue(null, "value");
                             	constructorArg.addValue(value);
                             	if ((value.indexOf(".xml") != -1)) {
-                                    if (bean.getClassName().indexOf(".ClassPathXmlApplicationContext") != -1) {                                 
-                                        XMLStreamReader creader = getApplicationContextReader(value);
+                                    if (bean.getClassName().indexOf(".ClassPathXmlApplicationContext") != -1) {
+                                        XMLStreamReader creader = getApplicationContextReader(resolver, value);
                                         // Read the context definition for the constructor-arg resources
-                                        readContextDefinition(creader, beans, services, references, scaproperties);
+                                        readContextDefinition(resolver, creader, contextPath, beans, services, references, scaproperties);
                                     }
                                 }
                             }
                             bean.addCustructorArgs(constructorArg);
                         } else if (SpringImplementationConstants.REF_ELEMENT.equals(qname)) {
                             String ref = reader.getAttributeValue(null, "bean");
-                            // Check if the parent element is a property 
+                            // Check if the parent element is a property
                             if (property != null) property.setRef(ref);
                             // Check if the parent element is a constructor-arg
                             if (constructorArg != null) constructorArg.setRef(ref);
@@ -315,10 +359,10 @@
                             	constructorArg.addValue(value);
                                 // Identify the XML resource specified for the constructor-arg element
                                 if ((value.indexOf(".xml") != -1)) {
-                                    if (bean.getClassName().indexOf(".ClassPathXmlApplicationContext") != -1) {                                   
-                                        XMLStreamReader creader = getApplicationContextReader(value);
+                                    if (bean.getClassName().indexOf(".ClassPathXmlApplicationContext") != -1) {
+                                        XMLStreamReader creader = getApplicationContextReader(resolver, value);
                                         // Read the context definition for the constructor-arg resources
-                                        readContextDefinition(creader, beans, services, references, scaproperties);
+                                        readContextDefinition(resolver, creader, contextPath, beans, services, references, scaproperties);
                                     }
                                 }
                             }
@@ -345,6 +389,7 @@
      * lists of beans, services, references and scaproperties derived from the application context
      */
     private void generateComponentType(SpringImplementation implementation,
+                                       ModelResolver resolver,
                                        List<SpringBeanElement> beans,
                                        List<SpringSCAServiceElement> services,
                                        List<SpringSCAReferenceElement> references,
@@ -354,9 +399,9 @@
          * 2. Each sca:reference becomes a reference in the component type
          * 3. Each sca:property becomes a property in the component type
          * 4. IF there are no explicit service elements, each bean becomes a service
-         * 5. Each bean property which is a reference not pointing at another bean in the 
+         * 5. Each bean property which is a reference not pointing at another bean in the
          *    application context becomes a reference unless it is pointing at one of the references
-         * 6. Each bean property which is not a reference and which is not pointing 
+         * 6. Each bean property which is not a reference and which is not pointing
          *    at another bean in the application context becomes a property in the component type
          */
 
@@ -364,11 +409,11 @@
         ComponentType componentType = implementation.getComponentType();
 
         try {
-            // Deal with the services first....												
+            // Deal with the services first....
             Iterator<SpringSCAServiceElement> its = services.iterator();
             while (its.hasNext()) {
                 SpringSCAServiceElement serviceElement = its.next();
-                Class<?> interfaze = cl.loadClass(serviceElement.getType());
+                Class<?> interfaze = resolveClass(resolver, serviceElement.getType());
                 Service theService = createService(interfaze, serviceElement.getName());
                 componentType.getServices().add(theService);
                 // Add this service to the Service / Bean map
@@ -384,11 +429,11 @@
             Iterator<SpringSCAReferenceElement> itr = references.iterator();
             while (itr.hasNext()) {
                 SpringSCAReferenceElement referenceElement = itr.next();
-                Class<?> interfaze = cl.loadClass(referenceElement.getType());
+                Class<?> interfaze = resolveClass(resolver, referenceElement.getType());
                 Reference theReference = createReference(interfaze, referenceElement.getName());
                 componentType.getReferences().add(theReference);
             } // end while
-            
+
             // Next handle the properties
             Iterator<SpringSCAPropertyElement> itsp = scaproperties.iterator();
             while (itsp.hasNext()) {
@@ -404,7 +449,7 @@
                     componentType.getProperties().add(theProperty);
                     // Remember the Java Class (ie the type) for this property
                     implementation.setPropertyClass(theProperty.getName(), propType);
-                } // end if 
+                } // end if
             } // end while
 
             // Finally deal with the beans
@@ -418,7 +463,7 @@
                     // If its a innerBean, ignore it
                     if (beanElement.isInnerBean()) continue;
                     // Load the Spring bean class
-                    Class<?> beanClass = cl.loadClass(beanElement.getClassName());
+                    Class<?> beanClass = resolveClass(resolver, beanElement.getClassName());
                     // Introspect the bean
                     beanIntrospector =
                         new SpringBeanIntrospector(assemblyFactory, javaFactory, policyFactory, beanElement.getCustructorArgs());
@@ -434,15 +479,15 @@
                     }
                 } // end while
             } // end if
-          
+
             itb = beans.iterator();
             while (itb.hasNext()) {
-                SpringBeanElement beanElement = itb.next();               
+                SpringBeanElement beanElement = itb.next();
                 // Ignore if the bean has no properties and constructor arguments
-                if (beanElement.getProperties().isEmpty() && beanElement.getCustructorArgs().isEmpty()) 
+                if (beanElement.getProperties().isEmpty() && beanElement.getCustructorArgs().isEmpty())
                 	continue;
-                
-                Class<?> beanClass = cl.loadClass(beanElement.getClassName());
+
+                Class<?> beanClass = resolveClass(resolver, beanElement.getClassName());
                 // Introspect the bean
                 beanIntrospector =
                     new SpringBeanIntrospector(assemblyFactory, javaFactory, policyFactory, beanElement.getCustructorArgs());
@@ -454,7 +499,7 @@
                 // the component type of the Spring Assembly
                 List<Reference> beanReferences = beanComponentType.getReferences();
                 List<Property> beanProperties = beanComponentType.getProperties();
-                
+
                 Iterator<SpringPropertyElement> itp = beanElement.getProperties().iterator();
                 while (itp.hasNext()) {
                     SpringPropertyElement propertyElement = itp.next();
@@ -469,33 +514,33 @@
                                 componentType.getReferences().add(reference);
                             } // end if
                         } // end for
-                    	
+
                     	// Store the unresolved references as unresolvedBeanRef in the Spring Implementation type
                     	for (Property scaproperty : beanProperties) {
                             if (propertyElement.getName().equals(scaproperty.getName())) {
                             	// The name of the reference in this case is the string in
                                 // the @ref attribute of the Spring property element, NOT the
                                 // name of the field in the Spring bean....
-                            	Class<?> interfaze = cl.loadClass((propertyMap.get(propertyElement.getName()).getType()).getName());                                            
+                            	Class<?> interfaze = resolveClass(resolver, (propertyMap.get(propertyElement.getName()).getType()).getName());
                                 Reference theReference = createReference(interfaze, propertyElement.getRef());
                                 implementation.setUnresolvedBeanRef(propertyElement.getRef(), theReference);
                             } // end if
                     	} // end for
                     } // end if
                 } // end while
-                
+
                 Iterator<SpringConstructorArgElement> itcr = beanElement.getCustructorArgs().iterator();
                 while (itcr.hasNext()) {
                 	SpringConstructorArgElement conArgElement = itcr.next();
                     if (propertyRefUnresolved(conArgElement.getRef(), beans, references, scaproperties)) {
                     	for (JavaParameterImpl parameter : constructor.getParameters()) {
                     		String paramType = parameter.getType().getName();
-                    		Class<?> interfaze = cl.loadClass(paramType);
+                    		Class<?> interfaze = resolveClass(resolver, paramType);
                     		// Create a component type reference/property if the constructor-arg element has a
                             // type attribute OR index attribute declared...
-                    		if ((conArgElement.getType() != null && paramType.equals(conArgElement.getType())) || 
-                    		    (conArgElement.getIndex() != -1 && (conArgElement.getIndex() == parameter.getIndex())) || 
-                    		    (conArgElement.getAutoIndex() == parameter.getIndex())) 
+                    		if ((conArgElement.getType() != null && paramType.equals(conArgElement.getType())) ||
+                    		    (conArgElement.getIndex() != -1 && (conArgElement.getIndex() == parameter.getIndex())) ||
+                    		    (conArgElement.getAutoIndex() == parameter.getIndex()))
                     		{
                     			if (parameter.getClassifer().getName().equals("org.osoa.sca.annotations.Reference")) {
                     				Reference theReference = createReference(interfaze, conArgElement.getRef());
@@ -507,11 +552,11 @@
                     				Reference theReference = createReference(interfaze, conArgElement.getRef());
                         			implementation.setUnresolvedBeanRef(conArgElement.getRef(), theReference);
                     			}
-                    		}                        	
-                    	} // end for                        
+                    		}
+                    	} // end for
                     } // end if
                 } // end while
-                
+
             } // end while
 
         } catch (ClassNotFoundException e) {
@@ -520,7 +565,7 @@
         } catch (InvalidInterfaceException e) {
             throw new ContributionReadException(e);
         } catch (ContributionResolveException e) {
-        	
+
         } // end try
 
         // If we get here, the Spring assembly component type is resolved
@@ -592,25 +637,24 @@
      * @param locationAttr - the location attribute from the <implementation.spring../> element
      * @param cl - the ClassLoader for the Spring implementation
      */
-    protected URL getApplicationContextResource(String locationAttr, ClassLoader cl)
+    protected URL getApplicationContextResource(URL url)
         throws ContributionReadException {
         File manifestFile = null;
         File appXmlFile;
         File locationFile = null;
-        
-        URL url = cl.getResource(locationAttr);
+
         if (url != null) {
             String path = url.getPath();
-            locationFile = new File(path);            
+            locationFile = new File(path);
         } else {
             throw new ContributionReadException(
-                    "SpringXMLLoader getApplicationContextResource: " + "unable to find resource file " 
-                        + locationAttr);
+                    "SpringXMLLoader getApplicationContextResource: " + "unable to find resource file "
+                        + url);
         }
 
         if (locationFile.isDirectory()) {
             try {
-                manifestFile = new File(locationFile, "META-INF"+ File.separator +"MANIFEST.MF");                
+                manifestFile = new File(locationFile, "META-INF"+ File.separator +"MANIFEST.MF");
                 if (manifestFile.exists()) {
                     Manifest mf = new Manifest(new FileInputStream(manifestFile));
                     Attributes mainAttrs = mf.getMainAttributes();
@@ -623,7 +667,7 @@
                     }
                 }
                 // no manifest-specified Spring context, use default
-                appXmlFile = new File(locationFile, "META-INF" + File.separator + "spring" 
+                appXmlFile = new File(locationFile, "META-INF" + File.separator + "spring"
                                                         + File.separator + SpringImplementationConstants.APPLICATION_CONTEXT);
                 if (appXmlFile.exists()) {
                     return appXmlFile.toURL();
@@ -631,7 +675,7 @@
             } catch (IOException e) {
                 throw new ContributionReadException("Error reading manifest " + manifestFile);
             }
-        } else {          
+        } else {
         	if (locationFile.isFile() && locationFile.getName().endsWith(".jar")) {
                 try {
                     JarFile jf = new JarFile(locationFile);
@@ -655,21 +699,21 @@
                 } catch (IOException e) {
                     // bad archive
                     // TODO: create a more appropriate exception type
-                    throw new ContributionReadException("SpringXMLLoader getApplicationContextResource: " 
+                    throw new ContributionReadException("SpringXMLLoader getApplicationContextResource: "
                     												+ " IO exception reading context file.", e);
                 }
         	}
         	else {
         		if (locationFile.getName().endsWith(".xml")) {
         			return url;
-        		} 
+        		}
         		else {
         			// Deal with the directory inside a jar file, in case the contribution itself is a JAR file.
         			try {
 	        			if (locationFile.getPath().indexOf(".jar") > 0) {
 	        				String jarEntry = url.getPath().substring(6, url.getPath().indexOf("!"));
-	        				JarFile jf = new JarFile(jarEntry);	        				
-	        				JarEntry je = jf.getJarEntry(url.getPath().substring(url.getPath().indexOf("!/")+2) 
+	        				JarFile jf = new JarFile(jarEntry);
+	        				JarEntry je = jf.getJarEntry(url.getPath().substring(url.getPath().indexOf("!/")+2)
 	        												+ "/" + "META-INF" + "/" + "MANIFEST.MF");
 	        			    if (je != null) {
 	        					Manifest mf = new Manifest(jf.getInputStream(je));
@@ -682,15 +726,15 @@
 	                                }
 	                            }
 	        				}
-	        			}	        			
+	        			}
             		} catch (IOException e) {
                         throw new ContributionReadException("Error reading manifest " + manifestFile);
                     }
-        		}        		
+        		}
         	}
         }
 
-        throw new ContributionReadException("SpringXMLLoader getApplicationContextResource: " 
+        throw new ContributionReadException("SpringXMLLoader getApplicationContextResource: "
                                         + "META-INF/spring/" + SpringImplementationConstants.APPLICATION_CONTEXT + "not found");
     } // end method getApplicationContextResource
 
@@ -739,4 +783,38 @@
 
         return reference;
     }
+
+    private class ContextClassLoader extends ClassLoader {
+        public ContextClassLoader(ModelResolver resolver) {
+            super();
+            this.resolver = resolver;
+        }
+
+        private ModelResolver resolver;
+
+        @Override
+        protected Class<?> findClass(String name) throws ClassNotFoundException {
+            return SpringXMLComponentTypeLoader.this.resolveClass(resolver, name);
+        }
+
+        @Override
+        protected URL findResource(String name) {
+            try {
+                return resolveLocation(resolver, name);
+            } catch (Exception e) {
+                return null;
+            }
+        }
+
+        @Override
+        protected Enumeration<URL> findResources(String name) throws IOException {
+            URL url = findResource(name);
+            if (url != null) {
+                return Collections.enumeration(Arrays.asList(url));
+            } else {
+                Collection<URL> urls = Collections.emptyList();
+                return Collections.enumeration(urls);
+            }
+        }
+    }
 } // end class SpringXMLComponentTypeLoader

Modified: tuscany/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringContextStub.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringContextStub.java?rev=789681&r1=789680&r2=789681&view=diff
==============================================================================
--- tuscany/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringContextStub.java (original)
+++ tuscany/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringContextStub.java Tue Jun 30 11:13:48 2009
@@ -89,6 +89,7 @@
         } catch (IllegalAccessException e) {
             throw new RuntimeException(e);
         } catch (InvocationTargetException e) {
+        	e.printStackTrace();
             throw new RuntimeException(e);
         }
     }
@@ -101,6 +102,7 @@
         } catch (IllegalAccessException e) {
             throw new RuntimeException(e);
         } catch (InvocationTargetException e) {
+        	e.printStackTrace();
             throw new RuntimeException(e);
         }
     }
@@ -113,6 +115,7 @@
         } catch (IllegalAccessException e) {
             throw new RuntimeException(e);
         } catch (InvocationTargetException e) {
+        	e.printStackTrace();
             throw new RuntimeException(e);
         }
     }
@@ -127,6 +130,7 @@
         } catch (IllegalAccessException e) {
             throw new RuntimeException(e);
         } catch (InvocationTargetException e) {
+        	e.printStackTrace();
             throw new RuntimeException(e);
         }
     }

Modified: tuscany/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringImplementationTie.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringImplementationTie.java?rev=789681&r1=789680&r2=789681&view=diff
==============================================================================
--- tuscany/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringImplementationTie.java (original)
+++ tuscany/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringImplementationTie.java Tue Jun 30 11:13:48 2009
@@ -6,15 +6,15 @@
  * 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.    
+ * under the License.
  */
 
 package org.apache.tuscany.sca.implementation.spring.invocation;
@@ -35,20 +35,20 @@
  * It enables the Sping code in the runtime module to invoke methods on a
  * Tuscany SpringImplementation without the Spring runtime module
  * needing to know about any Tuscany classes. See the SpringImplementationStub class
- * in the implementation-spring-runtime module for what the stub does. 
+ * in the implementation-spring-runtime module for what the stub does.
  */
 public class SpringImplementationTie {
 
     private SpringImplementation implementation;
     private RuntimeComponent component;
     private JavaPropertyValueObjectFactory propertyFactory;
-    
+
     public SpringImplementationTie(SpringImplementation implementation, RuntimeComponent component, JavaPropertyValueObjectFactory propertyFactory) {
         this.implementation = implementation;
         this.component = component;
         this.propertyFactory = propertyFactory;
     }
-    
+
     public String getURI() {
         throw new IllegalStateException("Not yet impl");
     }
@@ -132,7 +132,7 @@
         throw new RuntimeException("Unable to find Bean with name " + name);
 
     } // end method getBean( String, Class )
-    
+
     public Object getComponentTie() {
         return new ComponentTie(component);
     }
@@ -140,4 +140,8 @@
     public Object getPropertyValueTie() {
         return new PropertyValueTie(component, propertyFactory);
     }
+
+    public ClassLoader getClassLoader() {
+        return implementation.getClassLoader();
+    }
 }

Modified: tuscany/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/xml/SpringImplementationProcessor.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/xml/SpringImplementationProcessor.java?rev=789681&r1=789680&r2=789681&view=diff
==============================================================================
--- tuscany/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/xml/SpringImplementationProcessor.java (original)
+++ tuscany/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/xml/SpringImplementationProcessor.java Tue Jun 30 11:13:48 2009
@@ -6,15 +6,15 @@
  * 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.    
+ * under the License.
  */
 
 package org.apache.tuscany.sca.implementation.spring.xml;
@@ -31,12 +31,12 @@
 import org.apache.tuscany.sca.assembly.builder.impl.ProblemImpl;
 import org.apache.tuscany.sca.assembly.xml.Constants;
 import org.apache.tuscany.sca.assembly.xml.PolicyAttachPointProcessor;
+import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
+import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
 import org.apache.tuscany.sca.contribution.service.ContributionReadException;
 import org.apache.tuscany.sca.contribution.service.ContributionResolveException;
 import org.apache.tuscany.sca.contribution.service.ContributionWriteException;
-import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
-import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
-import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
 import org.apache.tuscany.sca.implementation.spring.SpringImplementation;
 import org.apache.tuscany.sca.implementation.spring.introspect.SpringXMLComponentTypeLoader;
 import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory;
@@ -48,8 +48,8 @@
 /**
  * SpringArtifactProcessor is responsible for processing the XML of an <implementation.spring.../>
  * element in an SCA SCDL file.
- * 
- * @version $Rev: 511195 $ $Date: 2007-02-24 02:29:46 +0000 (Sat, 24 Feb 2007) $ 
+ *
+ * @version $Rev: 511195 $ $Date: 2007-02-24 02:29:46 +0000 (Sat, 24 Feb 2007) $
  */
 public class SpringImplementationProcessor implements StAXArtifactProcessor<SpringImplementation> {
 
@@ -63,18 +63,21 @@
     private PolicyFactory policyFactory;
     private PolicyAttachPointProcessor policyProcessor;
     private Monitor monitor;
-    
+
+    private ModelFactoryExtensionPoint factories;
+
     public SpringImplementationProcessor(ModelFactoryExtensionPoint modelFactories, Monitor monitor) {
+        this.factories = modelFactories;
         this.assemblyFactory = modelFactories.getFactory(AssemblyFactory.class);
         this.javaFactory = modelFactories.getFactory(JavaInterfaceFactory.class);
         this.policyFactory = modelFactories.getFactory(PolicyFactory.class);
         this.policyProcessor = new PolicyAttachPointProcessor(policyFactory);
         this.monitor = monitor;
     }
-    
+
     /**
      * Report a exception.
-     * 
+     *
      * @param problems
      * @param message
      * @param model
@@ -85,10 +88,10 @@
 	        monitor.problem(problem);
     	 }
     }
-    
+
     /**
      * Report a error.
-     * 
+     *
      * @param problems
      * @param message
      * @param model
@@ -102,21 +105,21 @@
 
     /*
      * Read the XML and parse out the attributes.
-     * 
+     *
      * <implementation.spring.../> has a single required attribute:
      * "location" - which is the target URI of of an archive file or a directory that contains the Spring
      * application context files.
-     * If the resource identified by the location attribute is an archive file, then the file 
-     * META-INF/MANIFEST.MF is read from the archive. 
+     * If the resource identified by the location attribute is an archive file, then the file
+     * META-INF/MANIFEST.MF is read from the archive.
      * If the location URI identifies a directory, then META-INF/MANIFEST.MF must exist
-     * underneath that directory. 
+     * underneath that directory.
      * If the manifest file contains a header "Spring-Context" of the format:
      *    Spring-Context ::= path ( ';' path )*
-     *    
-     * Where path is a relative path with respect to the location URI, then the set of paths 
-     * specified in the header identify the context configuration files. 
-     * If there is no MANIFEST.MF file or no Spring-Context header within that file, 
-     * then the default behaviour is to build an application context using all the *.xml files 
+     *
+     * Where path is a relative path with respect to the location URI, then the set of paths
+     * specified in the header identify the context configuration files.
+     * If there is no MANIFEST.MF file or no Spring-Context header within that file,
+     * then the default behaviour is to build an application context using all the *.xml files
      * in the METAINF/spring directory.
      */
     public SpringImplementation read(XMLStreamReader reader) throws ContributionReadException, XMLStreamException {
@@ -135,7 +138,7 @@
         	error("LocationAttributeMissing", reader);
             //throw new ContributionReadException(MSG_LOCATION_MISSING);
         }
-        
+
         // Read policies
         policyProcessor.readPolicies(springImplementation, reader);
 
@@ -153,7 +156,7 @@
      * Handles the component type for the Spring implementation
      * @param springImplementation - a Spring implementation.  The component type information
      * is created for this implementation
-     *  
+     *
      */
     private void processComponentType(SpringImplementation springImplementation) {
 
@@ -173,7 +176,7 @@
         policyProcessor.writePolicyPrefixes(springImplementation, writer);
         writer.writeStartElement(Constants.SCA10_NS, IMPLEMENTATION_SPRING);
         policyProcessor.writePolicyAttributes(springImplementation, writer);
-        
+
         if (springImplementation.getLocation() != null) {
             writer.writeAttribute(LOCATION, springImplementation.getLocation());
         }
@@ -188,16 +191,16 @@
      */
     public void resolve(SpringImplementation springImplementation, ModelResolver resolver)
         throws ContributionResolveException {
-    	
+
     	if (springImplementation == null)
     		return;
 
         /* Load the Spring component type by reading the Spring application context */
         SpringXMLComponentTypeLoader springLoader =
-            new SpringXMLComponentTypeLoader(assemblyFactory, javaFactory, policyFactory);
+            new SpringXMLComponentTypeLoader(factories, assemblyFactory, javaFactory, policyFactory);
         try {
             // Load the Spring Implementation information from its application context file...
-            springLoader.load(springImplementation);
+            springLoader.load(springImplementation, resolver);
         } catch (ContributionReadException e) {
         	ContributionResolveException ce = new ContributionResolveException(e);
         	error("ContributionResolveException", resolver, ce);
@@ -210,12 +213,12 @@
             ComponentType componentType = resolver.resolveModel(ComponentType.class, ct);
             if (componentType.isUnresolved()) {
             	error("UnableToResolveComponentType", resolver);
-                //throw new ContributionResolveException("SpringArtifactProcessor: unable to resolve componentType for Spring component");             
+                //throw new ContributionResolveException("SpringArtifactProcessor: unable to resolve componentType for Spring component");
             } else {
                 springImplementation.setComponentType(componentType);
                 springImplementation.setUnresolved(false);
-           }            
-   
+           }
+
         } // end if
 
     } // end method resolve