From e48a541b03281411d1780cd860043ca0499fe198 Mon Sep 17 00:00:00 2001 From: ramkumar Date: Tue, 30 Jun 2009 11:13:48 +0000 Subject: Fixes in 1.x for TUSCANY-3069 git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@789681 13f79535-47bb-0310-9956-ffa450edef68 --- .../spring/SpringImplementation.java | 50 ++-- .../introspect/SpringXMLComponentTypeLoader.java | 294 +++++++++++++-------- .../spring/invocation/SpringContextStub.java | 4 + .../spring/invocation/SpringImplementationTie.java | 18 +- .../spring/xml/SpringImplementationProcessor.java | 65 ++--- 5 files changed, 265 insertions(+), 166 deletions(-) (limited to 'branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany') diff --git a/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/SpringImplementation.java b/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/SpringImplementation.java index 48608a4b34..bee0e462fc 100644 --- a/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/SpringImplementation.java +++ b/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/SpringImplementation.java @@ -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; @@ -35,9 +35,9 @@ import org.apache.tuscany.sca.interfacedef.InterfaceContract; import org.apache.tuscany.sca.runtime.RuntimeComponent; /** - * Represents a Spring implementation. - * - * @version $Rev: 511195 $ $Date: 2007-02-24 02:29:46 +0000 (Sat, 24 Feb 2007) $ + * Represents a Spring implementation. + * + * @version $Rev: 511195 $ $Date: 2007-02-24 02:29:46 +0000 (Sat, 24 Feb 2007) $ */ public class SpringImplementation extends ImplementationImpl implements Implementation, ComponentPreProcessor, Extensible { @@ -53,6 +53,8 @@ public class SpringImplementation extends ImplementationImpl implements Implemen // List of unresolved bean property references private Hashtable unresolvedBeanRef; + private ClassLoader classLoader; + public SpringImplementation() { this.location = null; this.resource = null; @@ -84,8 +86,8 @@ public class SpringImplementation extends ImplementationImpl implements Implemen return resource; } - /* - * Returns the componentType for this Spring implementation + /* + * Returns the componentType for this Spring implementation */ public ComponentType getComponentType() { return componentType; @@ -145,35 +147,35 @@ public class SpringImplementation extends ImplementationImpl implements Implemen } // end method setPropertyClass /** - * Gets the Java Class for an SCA property + * Gets the Java Class for an SCA property * @param propertyName - the property name * @return - a Class object for the type of the property */ public Class getPropertyClass(String propertyName) { return propertyMap.get(propertyName); } // end method getPropertyClass - + public void setUnresolvedBeanRef(String refName, Reference reference) { if (refName == null || reference == null) return; unresolvedBeanRef.put(refName, reference); return; } // end method setUnresolvedBeanRef - + public Reference getUnresolvedBeanRef(String refName) { return unresolvedBeanRef.get(refName); } // end method getUnresolvedBeanRef - - + + /** - * Use preProcess to validate and map the references and properties dynamically + * Use preProcess to validate and map the references and properties dynamically */ public void preProcess(Component component) { if (!(component instanceof RuntimeComponent)) return; - + RuntimeComponent rtc = (RuntimeComponent) component; - + for (Reference reference : rtc.getReferences()) { if (unresolvedBeanRef.containsKey(reference.getName())) { Reference ref = unresolvedBeanRef.get(reference.getName()); @@ -184,14 +186,14 @@ public class SpringImplementation extends ImplementationImpl implements Implemen } for (Property property : rtc.getProperties()) { - if (unresolvedBeanRef.containsKey(property.getName())) { + if (unresolvedBeanRef.containsKey(property.getName())) { componentType.getProperties().add(createProperty(property)); this.setPropertyClass(property.getName(), property.getClass()); unresolvedBeanRef.remove(property.getName()); } - } + } } - + protected Reference createReference(Reference reference, InterfaceContract interfaze) { Reference newReference; try { @@ -203,7 +205,7 @@ public class SpringImplementation extends ImplementationImpl implements Implemen } return newReference; } - + protected Property createProperty(Property property) { Property newProperty; try { @@ -213,4 +215,12 @@ public class SpringImplementation extends ImplementationImpl implements Implemen } return newProperty; } + + public ClassLoader getClassLoader() { + return classLoader; + } + + public void setClassLoader(ClassLoader classLoader) { + this.classLoader = classLoader; + } } diff --git a/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java b/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java index 3ed3060d8f..d021d27dfc 100644 --- a/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java +++ b/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java @@ -24,8 +24,14 @@ import static javax.xml.stream.XMLStreamConstants.START_ELEMENT; 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.Multiplicity; 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 @@ import org.apache.tuscany.sca.policy.PolicyFactory; /** * Introspects a Spring XML application-context configuration file to create - * 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 getImplementationClass() { @@ -97,11 +110,11 @@ public class SpringXMLComponentTypeLoader { } /** - * 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 @@ public class SpringXMLComponentTypeLoader { } 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 beans = new ArrayList(); List services = new ArrayList(); List references = new ArrayList(); - List scaproperties = new ArrayList(); + List scaproperties = new ArrayList(); 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 @@ public class SpringXMLComponentTypeLoader { /* 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 beans, - List services, - List references, - List scaproperties) throws ContributionReadException { - + private void readContextDefinition(ModelResolver resolver, + XMLStreamReader reader, + String contextPath, + List beans, + List services, + List references, + List scaproperties) throws ContributionReadException { + SpringBeanElement bean = null; - + try { boolean completed = false; while (!completed) { @@ -210,9 +252,9 @@ public class SpringXMLComponentTypeLoader { 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 @@ public class SpringXMLComponentTypeLoader { .getAttributeValue(null, "class")); beans.add(bean); // Read the 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 @@ public class SpringXMLComponentTypeLoader { 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 beans, - List services, - List references, - List scaproperties) throws ContributionReadException { - + private void readBeanDefinition(ModelResolver resolver, + XMLStreamReader reader, + String contextPath, + SpringBeanElement bean, + List beans, + List services, + List references, + List 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 @@ public class SpringXMLComponentTypeLoader { .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 @@ public class SpringXMLComponentTypeLoader { 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 @@ public class SpringXMLComponentTypeLoader { 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 @@ public class SpringXMLComponentTypeLoader { * lists of beans, services, references and scaproperties derived from the application context */ private void generateComponentType(SpringImplementation implementation, + ModelResolver resolver, List beans, List services, List references, @@ -354,9 +399,9 @@ public class SpringXMLComponentTypeLoader { * 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 @@ public class SpringXMLComponentTypeLoader { ComponentType componentType = implementation.getComponentType(); try { - // Deal with the services first.... + // Deal with the services first.... Iterator 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 @@ public class SpringXMLComponentTypeLoader { Iterator 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 itsp = scaproperties.iterator(); while (itsp.hasNext()) { @@ -404,7 +449,7 @@ public class SpringXMLComponentTypeLoader { 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 @@ public class SpringXMLComponentTypeLoader { // 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 @@ public class SpringXMLComponentTypeLoader { } } // 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 @@ public class SpringXMLComponentTypeLoader { // the component type of the Spring Assembly List beanReferences = beanComponentType.getReferences(); List beanProperties = beanComponentType.getProperties(); - + Iterator itp = beanElement.getProperties().iterator(); while (itp.hasNext()) { SpringPropertyElement propertyElement = itp.next(); @@ -469,33 +514,33 @@ public class SpringXMLComponentTypeLoader { 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 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 @@ public class SpringXMLComponentTypeLoader { 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 @@ public class SpringXMLComponentTypeLoader { } 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 @@ public class SpringXMLComponentTypeLoader { * @param locationAttr - the location attribute from the 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 @@ public class SpringXMLComponentTypeLoader { } } // 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 @@ public class SpringXMLComponentTypeLoader { } 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 @@ public class SpringXMLComponentTypeLoader { } 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 @@ public class SpringXMLComponentTypeLoader { } } } - } + } } 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 @@ public class SpringXMLComponentTypeLoader { 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 findResources(String name) throws IOException { + URL url = findResource(name); + if (url != null) { + return Collections.enumeration(Arrays.asList(url)); + } else { + Collection urls = Collections.emptyList(); + return Collections.enumeration(urls); + } + } + } } // end class SpringXMLComponentTypeLoader diff --git a/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringContextStub.java b/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringContextStub.java index e8b398bd3a..55dd1d6027 100644 --- a/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringContextStub.java +++ b/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringContextStub.java @@ -89,6 +89,7 @@ public class SpringContextStub { } catch (IllegalAccessException e) { throw new RuntimeException(e); } catch (InvocationTargetException e) { + e.printStackTrace(); throw new RuntimeException(e); } } @@ -101,6 +102,7 @@ public class SpringContextStub { } catch (IllegalAccessException e) { throw new RuntimeException(e); } catch (InvocationTargetException e) { + e.printStackTrace(); throw new RuntimeException(e); } } @@ -113,6 +115,7 @@ public class SpringContextStub { } catch (IllegalAccessException e) { throw new RuntimeException(e); } catch (InvocationTargetException e) { + e.printStackTrace(); throw new RuntimeException(e); } } @@ -127,6 +130,7 @@ public class SpringContextStub { } catch (IllegalAccessException e) { throw new RuntimeException(e); } catch (InvocationTargetException e) { + e.printStackTrace(); throw new RuntimeException(e); } } diff --git a/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringImplementationTie.java b/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringImplementationTie.java index ac913fdee2..0a069c032f 100644 --- a/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringImplementationTie.java +++ b/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringImplementationTie.java @@ -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 @@ import org.apache.tuscany.sca.runtime.RuntimeComponent; * 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 @@ public class SpringImplementationTie { 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 class SpringImplementationTie { public Object getPropertyValueTie() { return new PropertyValueTie(component, propertyFactory); } + + public ClassLoader getClassLoader() { + return implementation.getClassLoader(); + } } diff --git a/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/xml/SpringImplementationProcessor.java b/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/xml/SpringImplementationProcessor.java index abe3954b9a..869935be6e 100644 --- a/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/xml/SpringImplementationProcessor.java +++ b/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/xml/SpringImplementationProcessor.java @@ -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.ComponentType; 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 @@ import org.apache.tuscany.sca.policy.PolicyFactory; /** * SpringArtifactProcessor is responsible for processing the XML of an * 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 { @@ -63,18 +63,21 @@ public class SpringImplementationProcessor implements StAXArtifactProcessor 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 @@ public class SpringImplementationProcessor implements StAXArtifactProcessor