From 71a7cba384b8ae7f4578fb9ab1f725d5ce616074 Mon Sep 17 00:00:00 2001 From: rfeng Date: Mon, 26 Oct 2009 23:44:59 +0000 Subject: Merge all changes from 1.5.2 branch into trunk git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@830026 13f79535-47bb-0310-9956-ffa450edef68 --- .../spring/SpringImplementation.java | 6 +- .../introspect/SpringXMLComponentTypeLoader.java | 120 +++++++++++---------- .../ConfigurationPropertiesExtensionPoint.java | 2 + ...faultConfigurationPropertiesExtensionPoint.java | 8 +- .../spring/invocation/SpringContextStub.java | 14 +-- .../invocation/SpringImplementationProvider.java | 5 +- .../SpringImplementationProviderFactory.java | 5 +- .../spring/xml/SpringImplementationProcessor.java | 16 ++- 8 files changed, 101 insertions(+), 75 deletions(-) (limited to 'branches/sca-java-1.x/modules/implementation-spring/src/main/java') 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 61b707b1e1..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 @@ -44,7 +44,7 @@ public class SpringImplementation extends ImplementationImpl implements Implemen // The location attribute which points to the Spring application-context XML file private String location; // The application-context file as a Spring Resource - private List resource; + private URL resource; private ComponentType componentType; // Mapping of Services to Beans private Hashtable serviceMap; @@ -78,11 +78,11 @@ public class SpringImplementation extends ImplementationImpl implements Implemen return; } - public void setResource(List resource) { + public void setResource(URL resource) { this.resource = resource; } - public List getResource() { + public URL getResource() { return resource; } 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 3b73ba00c1..54d42937db 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 @@ -90,19 +90,22 @@ public class SpringXMLComponentTypeLoader { private AssemblyFactory assemblyFactory; private JavaInterfaceFactory javaFactory; private PolicyFactory policyFactory; + private boolean isMultipleContextSupported; private SpringBeanIntrospector beanIntrospector; public SpringXMLComponentTypeLoader(ModelFactoryExtensionPoint factories, AssemblyFactory assemblyFactory, JavaInterfaceFactory javaFactory, - PolicyFactory policyFactory) { + PolicyFactory policyFactory, + boolean multipleContextSupport) { super(); this.assemblyFactory = assemblyFactory; this.javaFactory = javaFactory; this.policyFactory = policyFactory; this.contributionFactory = factories.getFactory(ContributionFactory.class); this.xmlInputFactory = factories.getFactory(XMLInputFactory.class); + this.isMultipleContextSupported = multipleContextSupport; } protected Class getImplementationClass() { @@ -156,25 +159,23 @@ public class SpringXMLComponentTypeLoader { List scaproperties = new ArrayList(); URL resource; - List contextResources = new ArrayList(); + String contextPath = implementation.getLocation(); try { resource = resolveLocation(resolver, contextPath); - contextResources = getApplicationContextResource(resource); + resource = getApplicationContextResource(resource); implementation.setClassLoader(new ContextClassLoader(resolver)); - implementation.setResource(contextResources); + implementation.setResource(resource); // The URI is used to uniquely identify the Implementation implementation.setURI(resource.toString()); + reader = xmlInputFactory.createXMLStreamReader(resource.openStream()); + + // System.out.println("Spring TypeLoader - starting to read context file"); + readContextDefinition(resolver, reader, contextPath, beans, services, references, scaproperties); - for (URL contextResource : contextResources) { - reader = xmlInputFactory.createXMLStreamReader(contextResource.openStream()); - // System.out.println("Spring TypeLoader - starting to read context file"); - readContextDefinition(resolver, reader, contextPath, beans, services, references, scaproperties); - - reader.close(); - } + reader.close(); } catch (IOException e) { throw new ContributionReadException(e); @@ -218,7 +219,7 @@ public class SpringXMLComponentTypeLoader { private XMLStreamReader getApplicationContextReader(ModelResolver resolver, String location) throws ContributionReadException { try { - URL resource = getApplicationContextResource(resolveLocation(resolver, location)).get(0); + URL resource = getApplicationContextResource(resolveLocation(resolver, location)); XMLStreamReader reader = xmlInputFactory.createXMLStreamReader(resource.openStream()); return reader; @@ -341,6 +342,13 @@ public class SpringXMLComponentTypeLoader { if (reader.getAttributeValue(null, "value") != null) { String value = reader.getAttributeValue(null, "value"); constructorArg.addValue(value); + if ((isMultipleContextSupported) && (value.indexOf(".xml") != -1)) { + if (bean.getClassName().indexOf(".ClassPathXmlApplicationContext") != -1) { + XMLStreamReader creader = getApplicationContextReader(resolver, value); + // Read the context definition for the constructor-arg resources + readContextDefinition(resolver, creader, contextPath, beans, services, references, scaproperties); + } + } } bean.addCustructorArgs(constructorArg); } else if (SpringImplementationConstants.REF_ELEMENT.equals(qname)) { @@ -352,8 +360,17 @@ public class SpringXMLComponentTypeLoader { } else if (SpringImplementationConstants.VALUE_ELEMENT.equals(qname)) { String value = reader.getElementText(); // Check if the parent element is a constructor-arg - if (constructorArg != null) + if (constructorArg != null) { constructorArg.addValue(value); + // Identify the XML resource specified for the constructor-arg element + if ((isMultipleContextSupported) && (value.indexOf(".xml") != -1)) { + if (bean.getClassName().indexOf(".ClassPathXmlApplicationContext") != -1) { + XMLStreamReader creader = getApplicationContextReader(resolver, value); + // Read the context definition for the constructor-arg resources + readContextDefinition(resolver, creader, contextPath, beans, services, references, scaproperties); + } + } + } } // end if break; case END_ELEMENT: @@ -555,9 +572,9 @@ public class SpringXMLComponentTypeLoader { 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())) || + if ((conArgElement.getType() != null && paramType.equals(conArgElement.getType())) || (conArgElement.getIndex() != -1 && (conArgElement.getIndex() == parameter.getIndex()))) - { + { if (parameter.getClassifer().getName().equals("org.osoa.sca.annotations.Reference")) { Reference theReference = createReference(interfaze, conArgElement.getRef()); componentType.getReferences().add(theReference); @@ -653,19 +670,19 @@ public class SpringXMLComponentTypeLoader { * @param locationAttr - the location attribute from the element * @param cl - the ClassLoader for the Spring implementation */ - protected List getApplicationContextResource(URL url) + protected URL getApplicationContextResource(URL url) throws ContributionReadException { File manifestFile = null; File appXmlFile; File locationFile = null; - List appCtxResources = new ArrayList(); if (url != null) { String path = url.getPath(); locationFile = new File(path); } else { - throw new ContributionReadException("SpringXMLComponentTypeLoader getApplicationContextResource: " - + "unable to find resource file " + url); + throw new ContributionReadException( + "SpringXMLLoader getApplicationContextResource: " + "unable to find resource file " + + url); } if (locationFile.isDirectory()) { @@ -675,26 +692,21 @@ public class SpringXMLComponentTypeLoader { Manifest mf = new Manifest(new FileInputStream(manifestFile)); Attributes mainAttrs = mf.getMainAttributes(); String appCtxPath = mainAttrs.getValue("Spring-Context"); - if (appCtxPath != null) { - String[] cxtPaths = appCtxPath.split(";"); - for (String path : cxtPaths) { - appXmlFile = new File(locationFile, path); - if (appXmlFile.exists()) { - appCtxResources.add(appXmlFile.toURI().toURL()); - } - } - return appCtxResources; + if (appCtxPath != null) { + appXmlFile = new File(locationFile, appCtxPath); + if (appXmlFile.exists()) { + return appXmlFile.toURL(); + } } } // no manifest-specified Spring context, use default appXmlFile = new File(locationFile, "META-INF" + File.separator + "spring" + File.separator + SpringImplementationConstants.APPLICATION_CONTEXT); if (appXmlFile.exists()) { - appCtxResources.add(appXmlFile.toURI().toURL()); - return appCtxResources; + return appXmlFile.toURL(); } } catch (IOException e) { - throw new ContributionReadException("Error reading manifest " + manifestFile); + throw new ContributionReadException("Error reading manifest inside the folder: ", e); } } else { if (locationFile.isFile() && locationFile.getName().endsWith(".jar")) { @@ -706,22 +718,18 @@ public class SpringXMLComponentTypeLoader { Attributes mainAttrs = mf.getMainAttributes(); String appCtxPath = mainAttrs.getValue("Spring-Context"); if (appCtxPath != null) { - String[] cxtPaths = appCtxPath.split(";"); - for (String path : cxtPaths) { - je = jf.getJarEntry(path); - if (je != null) { - appCtxResources.add(new URL("jar:" + locationFile.toURI().toURL() + "!/" + appCtxPath)); - } - } - return appCtxResources; + je = jf.getJarEntry(appCtxPath); + if (je != null) { + // TODO return a Spring specific Resource type for jars + return new URL("jar:" + locationFile.toURI().toURL() + "!/" + appCtxPath); + } } } // Look for the default applicaiton-context.xml file, when MANIFEST.MF is absent. je = jf.getJarEntry("META-INF" + "/" + "spring" + "/" + SpringImplementationConstants.APPLICATION_CONTEXT); if (je != null) { - appCtxResources.add(new URL("jar:" + locationFile.toURI().toURL() + "!/" + - "META-INF" + "/" + "spring" + "/" + SpringImplementationConstants.APPLICATION_CONTEXT)); - return appCtxResources; + return new URL("jar:" + locationFile.toURI().toURL() + "!/" + + "META-INF" + "/" + "spring" + "/" + SpringImplementationConstants.APPLICATION_CONTEXT); } } catch (IOException e) { // TODO: create a more appropriate exception type @@ -731,14 +739,13 @@ public class SpringXMLComponentTypeLoader { } else { if (locationFile.getName().endsWith(".xml")) { - appCtxResources.add(url); - return appCtxResources; + 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 jarPath = url.getPath().substring(6, url.getPath().indexOf("!")); + String jarPath = url.getPath().substring(5, url.getPath().indexOf("!")); JarFile jf = new JarFile(jarPath); JarEntry je = jf.getJarEntry(url.getPath().substring(url.getPath().indexOf("!/")+2) + "/" + "META-INF" + "/" + "MANIFEST.MF"); @@ -747,34 +754,29 @@ public class SpringXMLComponentTypeLoader { Attributes mainAttrs = mf.getMainAttributes(); String appCtxPath = mainAttrs.getValue("Spring-Context"); if (appCtxPath != null) { - String[] cxtPaths = appCtxPath.split(";"); - for (String path : cxtPaths) { - je = jf.getJarEntry(url.getPath().substring(url.getPath().indexOf("!/")+2) + "/" + path); - if (je != null) { - appCtxResources.add(new URL("jar:" + url.getPath() + "/" + path)); - return appCtxResources; - } - } + je = jf.getJarEntry(url.getPath().substring(url.getPath().indexOf("!/")+2) + "/" + appCtxPath); + if (je != null) { + return new URL("jar:" + url.getPath() + "/" + appCtxPath); + } } } // Look for the default applicaiton-context.xml file, when MANIFEST.MF is absent. je = jf.getJarEntry(url.getPath().substring(url.getPath().indexOf("!/")+2) + "/" + "META-INF" + "/" + "spring" + "/" + SpringImplementationConstants.APPLICATION_CONTEXT); if (je != null) { - appCtxResources.add(new URL("jar:" + url.getPath() + "/" + - "META-INF" + "/" + "spring" + "/" + SpringImplementationConstants.APPLICATION_CONTEXT)); - return appCtxResources; + return new URL("jar:" + url.getPath() + "/" + + "META-INF" + "/" + "spring" + "/" + SpringImplementationConstants.APPLICATION_CONTEXT); } } } catch (IOException e) { - throw new ContributionReadException("Error reading manifest " + manifestFile); + throw new ContributionReadException("Error reading manifest inside the jar folder: ", e); } } } } - throw new ContributionReadException("SpringXMLComponentTypeLoader getApplicationContextResource: " - + "unable to read resource file " + url); + throw new ContributionReadException("SpringXMLLoader getApplicationContextResource: " + + "META-INF/spring/" + SpringImplementationConstants.APPLICATION_CONTEXT + " not found"); } // end method getApplicationContextResource /** diff --git a/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/ConfigurationPropertiesExtensionPoint.java b/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/ConfigurationPropertiesExtensionPoint.java index 0464355565..4fdcb52241 100644 --- a/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/ConfigurationPropertiesExtensionPoint.java +++ b/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/ConfigurationPropertiesExtensionPoint.java @@ -4,6 +4,8 @@ public interface ConfigurationPropertiesExtensionPoint { boolean isAnnotationSupported(); + boolean isMultipleContextSupported(); + String getSupportedVersion(); } diff --git a/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/DefaultConfigurationPropertiesExtensionPoint.java b/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/DefaultConfigurationPropertiesExtensionPoint.java index a0e7186eab..94b8e0eb36 100644 --- a/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/DefaultConfigurationPropertiesExtensionPoint.java +++ b/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/DefaultConfigurationPropertiesExtensionPoint.java @@ -8,11 +8,17 @@ public class DefaultConfigurationPropertiesExtensionPoint implements Configurati } // By default SCA annotations for implementation.spring - // will be supproted. + // will be supproted for Tuscany. public boolean isAnnotationSupported() { return true; } + // By default multiple application context implementation.spring + // will be supproted for Tuscany. + public boolean isMultipleContextSupported() { + return true; + } + // By defauly all the Spring version are supported for // Tuscany. public String getSupportedVersion() { 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 290bbff171..818bc4e102 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 @@ -22,7 +22,7 @@ package org.apache.tuscany.sca.implementation.spring.invocation; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.util.List; +import java.net.URL; import org.apache.tuscany.sca.core.invocation.ProxyFactory; import org.apache.tuscany.sca.implementation.java.injection.JavaPropertyValueObjectFactory; @@ -47,9 +47,10 @@ public class SpringContextStub { ProxyFactory proxyService, JavaPropertyValueObjectFactory propertyValueObjectFactory, boolean annotationSupport, - String versionSupported) { + String versionSupported, + boolean multipleContextSupport) { - initTie(component, implementation, propertyValueObjectFactory, annotationSupport, versionSupported); + initTie(component, implementation, propertyValueObjectFactory, annotationSupport, versionSupported, multipleContextSupport); } @@ -57,7 +58,8 @@ public class SpringContextStub { SpringImplementation implementation, JavaPropertyValueObjectFactory propertyValueObjectFactory, boolean annotationSupport, - String versionSupported) { + String versionSupported, + boolean multipleContextSupport) { // TODO: what class loader to use? ClassLoader cl = Thread.currentThread().getContextClassLoader(); @@ -69,8 +71,8 @@ public class SpringContextStub { Object stub = stubConstructor.newInstance(new SpringImplementationTie(implementation, component, propertyValueObjectFactory)); Class tieClass = Class.forName("org.apache.tuscany.sca.implementation.spring.runtime.context.SpringContextTie", true, cl); - Constructor tieConstructor = tieClass.getConstructor(new Class[]{stubClass, List.class, boolean.class, String.class}); - this.tie = tieConstructor.newInstance(stub, implementation.getResource(), annotationSupport, versionSupported); + Constructor tieConstructor = tieClass.getConstructor(new Class[]{stubClass, URL.class, boolean.class, String.class, boolean.class}); + this.tie = tieConstructor.newInstance(stub, implementation.getResource(), annotationSupport, versionSupported, multipleContextSupport); this.startMethod = tieClass.getMethod("start"); this.closeMethod = tieClass.getMethod("close"); diff --git a/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringImplementationProvider.java b/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringImplementationProvider.java index 1fc01b2627..105bb4a553 100644 --- a/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringImplementationProvider.java +++ b/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringImplementationProvider.java @@ -52,13 +52,14 @@ public class SpringImplementationProvider implements ImplementationProvider { ProxyFactory proxyService, JavaPropertyValueObjectFactory propertyValueObjectFactory, boolean annotationSupport, - String versionSupported) { + String versionSupported, + boolean multipleContextSupport) { super(); this.implementation = implementation; this.component = component; this.propertyValueObjectFactory = propertyValueObjectFactory; - springContext = new SpringContextStub(component, implementation, proxyService, propertyValueObjectFactory, annotationSupport, versionSupported); + springContext = new SpringContextStub(component, implementation, proxyService, propertyValueObjectFactory, annotationSupport, versionSupported, multipleContextSupport); } // end constructor diff --git a/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringImplementationProviderFactory.java b/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringImplementationProviderFactory.java index 4796aa0de9..e0d31203bc 100644 --- a/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringImplementationProviderFactory.java +++ b/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringImplementationProviderFactory.java @@ -41,6 +41,7 @@ public class SpringImplementationProviderFactory implements ImplementationProvid private ConfigurationPropertiesExtensionPoint configProperties; private boolean annotationSupport; private String versionSupported; + private boolean multipleContextSupport; /** * Simple constructor @@ -58,6 +59,7 @@ public class SpringImplementationProviderFactory implements ImplementationProvid } annotationSupport = configProperties.isAnnotationSupported(); versionSupported = configProperties.getSupportedVersion(); + multipleContextSupport = configProperties.isMultipleContextSupported(); // TODO: could the runtime have a default PropertyValueObjectFactory? propertyFactory = new JavaPropertyValueObjectFactory(new MediatorImpl(extensionPoints)); @@ -77,7 +79,8 @@ public class SpringImplementationProviderFactory implements ImplementationProvid proxyFactory, propertyFactory, annotationSupport, - versionSupported); + versionSupported, + multipleContextSupport); } /** 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 1d941e2a4f..29dc0a38a1 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 @@ -39,11 +39,13 @@ import org.apache.tuscany.sca.contribution.service.ContributionResolveException; import org.apache.tuscany.sca.contribution.service.ContributionWriteException; import org.apache.tuscany.sca.implementation.spring.SpringImplementation; import org.apache.tuscany.sca.implementation.spring.introspect.SpringXMLComponentTypeLoader; +import org.apache.tuscany.sca.implementation.spring.invocation.ConfigurationPropertiesExtensionPoint; +import org.apache.tuscany.sca.implementation.spring.invocation.DefaultConfigurationPropertiesExtensionPoint; import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory; import org.apache.tuscany.sca.monitor.Monitor; import org.apache.tuscany.sca.monitor.Problem; import org.apache.tuscany.sca.monitor.Problem.Severity; -import org.apache.tuscany.sca.monitor.impl.ProblemImpl; +import org.apache.tuscany.sca.monitor.impl.ProblemImpl; import org.apache.tuscany.sca.policy.PolicyFactory; /** @@ -63,9 +65,11 @@ public class SpringImplementationProcessor implements StAXArtifactProcessor