You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by ke...@apache.org on 2006/08/10 19:39:39 UTC

svn commit: r430454 - in /incubator/tuscany/java/sca: bindings/ containers/container.spring/src/main/java/org/apache/tuscany/container/spring/ containers/container.spring/src/test/java/org/apache/tuscany/container/spring/ core/src/main/java/org/apache/...

Author: kentam
Date: Thu Aug 10 10:39:39 2006
New Revision: 430454

URL: http://svn.apache.org/viewvc?rev=430454&view=rev
Log:
Initial support for <implementation.spring location=.. /> per the draft specification.

Added RuntimeInfo support for a system property "tuscany.applicationRootDir", which defaults to the value of "user.dir"; this value is intended for use in resolving relative path references in application SCDL (in this case,
relative references in the location attr for the Spring implementation).


Added:
    incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/SpringImplementationLoader.java   (with props)
Modified:
    incubator/tuscany/java/sca/bindings/pom.xml
    incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/SpringComponentTypeLoader.java
    incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/SpringCompositeBuilder.java
    incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/SpringImplementation.java
    incubator/tuscany/java/sca/containers/container.spring/src/test/java/org/apache/tuscany/container/spring/SpringCompositeBuilderTestCase.java
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/launcher/Launcher.java
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/launcher/LauncherRuntimeInfo.java
    incubator/tuscany/java/sca/spi/src/main/java/org/apache/tuscany/spi/services/info/RuntimeInfo.java

Modified: incubator/tuscany/java/sca/bindings/pom.xml
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/bindings/pom.xml?rev=430454&r1=430453&r2=430454&view=diff
==============================================================================
--- incubator/tuscany/java/sca/bindings/pom.xml (original)
+++ incubator/tuscany/java/sca/bindings/pom.xml Thu Aug 10 10:39:39 2006
@@ -36,6 +36,9 @@
         <module>binding.celtix</module>
         <module>binding.axis2</module>
         <module>binding.rmi</module>
+        <!--
+        <module>binding.jaxws</module>
+        -->
     </modules>
 
 </project>

Modified: incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/SpringComponentTypeLoader.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/SpringComponentTypeLoader.java?rev=430454&r1=430453&r2=430454&view=diff
==============================================================================
--- incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/SpringComponentTypeLoader.java (original)
+++ incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/SpringComponentTypeLoader.java Thu Aug 10 10:39:39 2006
@@ -20,6 +20,7 @@
  */
 public class SpringComponentTypeLoader implements ComponentTypeLoader<SpringImplementation> {
 
+    /* Major work in progress here */
     public void load(CompositeComponent<?> parent, SpringImplementation implementation,
                      DeploymentContext deploymentContext) {
         Resource resource = null; //FIXME
@@ -30,6 +31,5 @@
         GenericApplicationContext ctx = new GenericApplicationContext(beanFactory);
         ctx.refresh();
         implementation.setComponentType(componentType);
-        implementation.setApplicationContext(ctx);
     }
 }

Modified: incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/SpringCompositeBuilder.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/SpringCompositeBuilder.java?rev=430454&r1=430453&r2=430454&view=diff
==============================================================================
--- incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/SpringCompositeBuilder.java (original)
+++ incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/SpringCompositeBuilder.java Thu Aug 10 10:39:39 2006
@@ -19,6 +19,13 @@
 import org.apache.tuscany.spi.QualifiedName;
 
 import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.support.GenericApplicationContext;
+import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
+import org.springframework.beans.factory.support.PropertiesBeanDefinitionReader;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.UrlResource;
+
+import java.net.URL;
 
 /**
  * Creates a {@link SpringCompositeComponent} from an assembly model
@@ -33,7 +40,8 @@
                            DeploymentContext deploymentContext) throws BuilderConfigException {
         String name = componentDefinition.getName();
         SpringImplementation implementation = componentDefinition.getImplementation();
-        ConfigurableApplicationContext applicationContext = implementation.getApplicationContext();
+        ConfigurableApplicationContext applicationContext = createApplicationContext(implementation.getApplicationXml());
+
         SpringCompositeComponent component =
             new SpringCompositeComponent(name, applicationContext, parent, null);
         CompositeComponentType<BoundServiceDefinition<? extends Binding>,
@@ -67,5 +75,13 @@
 
     protected Class<SpringImplementation> getImplementationType() {
         return SpringImplementation.class;
+    }
+
+    protected ConfigurableApplicationContext createApplicationContext(URL appXml) {
+        GenericApplicationContext ctx = new GenericApplicationContext();
+        XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(ctx);
+        xmlReader.loadBeanDefinitions(new UrlResource(appXml));
+        ctx.refresh();
+        return ctx;
     }
 }

Modified: incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/SpringImplementation.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/SpringImplementation.java?rev=430454&r1=430453&r2=430454&view=diff
==============================================================================
--- incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/SpringImplementation.java (original)
+++ incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/SpringImplementation.java Thu Aug 10 10:39:39 2006
@@ -9,6 +9,8 @@
 import org.apache.tuscany.spi.model.Implementation;
 import org.apache.tuscany.spi.model.Property;
 
+import java.net.URL;
+
 /**
  * @version $$Rev$$ $$Date$$
  */
@@ -19,7 +21,7 @@
                 ? extends Property>> {
 
     private String location;
-    private ConfigurableApplicationContext applicationContext;
+    private URL applicationXml;
 
     public SpringImplementation() {
     }
@@ -34,22 +36,22 @@
     /**
      * Returns the path of the Spring application context configuration
      */
-    public String getContextLocation() {
+    public String getLocation() {
         return location;
     }
 
     /**
      * Sets the path of the Spring application context configuration
      */
-    public void setContextLocation(String location) {
+    public void setLocation(String location) {
         this.location = location;
     }
 
-    public ConfigurableApplicationContext getApplicationContext() {
-        return applicationContext;
+    public URL getApplicationXml() {
+        return applicationXml;
     }
 
-    public void setApplicationContext(ConfigurableApplicationContext applicationContext) {
-        this.applicationContext = applicationContext;
+    public void setApplicationXml(URL applicationXml) {
+        this.applicationXml = applicationXml;
     }
 }

Added: incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/SpringImplementationLoader.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/SpringImplementationLoader.java?rev=430454&view=auto
==============================================================================
--- incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/SpringImplementationLoader.java (added)
+++ incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/SpringImplementationLoader.java Thu Aug 10 10:39:39 2006
@@ -0,0 +1,141 @@
+package org.apache.tuscany.container.spring;
+
+/*
+ *
+ * Copyright 2006 The Apache Software Foundation or its licensors as applicable
+ *
+ *  Licensed 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.
+ */
+
+import org.apache.tuscany.spi.extension.LoaderExtension;
+import org.apache.tuscany.spi.annotation.Autowire;
+import org.apache.tuscany.spi.loader.LoaderRegistry;
+import org.apache.tuscany.spi.loader.LoaderException;
+import org.apache.tuscany.spi.loader.MissingResourceException;
+import org.apache.tuscany.spi.loader.LoaderUtil;
+import org.apache.tuscany.spi.component.CompositeComponent;
+import org.apache.tuscany.spi.deployer.DeploymentContext;
+import org.apache.tuscany.spi.services.info.RuntimeInfo;
+import org.osoa.sca.annotations.Constructor;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamException;
+import java.net.URL;
+import java.io.*;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+import java.util.jar.Attributes;
+import java.util.jar.JarEntry;
+import java.util.Map;
+
+/**
+ * Loader for handling Spring <spring:implementation.spring> elements.
+ */
+public class SpringImplementationLoader extends LoaderExtension<SpringImplementation> {
+    private static final QName IMPLEMENTATION_SPRING = new QName("http://tuscany.apache.org/xmlns/spring/1.0", "implementation.spring");
+
+    private final RuntimeInfo runtimeInfo;
+
+    @Constructor({"registry"})
+    public SpringImplementationLoader(@Autowire LoaderRegistry registry, @Autowire RuntimeInfo runtimeInfo) {
+        super(registry);
+        this.runtimeInfo = runtimeInfo;
+    }
+
+    public QName getXMLType() {
+        return IMPLEMENTATION_SPRING;
+    }
+
+    public SpringImplementation load(CompositeComponent parent, XMLStreamReader reader, DeploymentContext deploymentContext)
+            throws XMLStreamException, LoaderException {
+
+        String locationAttr = reader.getAttributeValue(null, "locationAttr");
+        if (locationAttr == null) {
+            throw new MissingResourceException("No locationAttr supplied");
+        }
+
+        URL appXmlUrl = getApplicationContextUrl(locationAttr);
+
+        LoaderUtil.skipToEndElement(reader);
+
+        SpringImplementation implementation = new SpringImplementation();
+        implementation.setApplicationXml(appXmlUrl);
+        registry.loadComponentType(parent, implementation, deploymentContext);
+        return implementation;
+    }
+
+    protected URL getApplicationContextUrl(String locationAttr) throws LoaderException {
+        assert runtimeInfo != null;
+
+        File manifestFile = null;
+        File appXmlFile = null;
+
+        File locationFile = new File(locationAttr);
+        if (!locationFile.isAbsolute()) {
+            locationFile = new File(runtimeInfo.getApplicationRootDirectory(), locationAttr);
+        }
+
+        if (!locationFile.exists()) {
+            throw new MissingResourceException(locationFile.toString());
+        }
+
+        if (locationFile.isDirectory()) {
+            try {
+                manifestFile = new File(locationFile, "META-INF/MANIFEST.MF");
+                if (manifestFile.exists()) {
+                    Manifest mf = new Manifest(new FileInputStream(manifestFile));
+                    Attributes mainAttrs = mf.getMainAttributes();
+                    String appCtxPath = mainAttrs.getValue("Spring-Context");
+                    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/application-context.xml");
+                if (appXmlFile.exists()) {
+                    return appXmlFile.toURL();
+                }
+            } catch (IOException e) {
+                throw new LoaderException("Error reading manifest " + manifestFile);
+            }
+        } else {
+            try {
+                JarFile jf = new JarFile(locationFile);
+                JarEntry je = null;
+                Manifest mf = jf.getManifest();
+                if (mf != null) {
+                    Attributes mainAttrs = mf.getMainAttributes();
+                    String appCtxPath = mainAttrs.getValue("Spring-Context");
+                    if (appCtxPath != null) {
+                        je = jf.getJarEntry(appCtxPath);
+                        if (je != null) {
+                            return new URL("jar:" + locationFile.toURL() + "!/" + appCtxPath);
+                        }
+                    }
+                }
+                je = jf.getJarEntry("META-INF/application-context.xml");
+                if (je != null) {
+                    return new URL("jar:" + locationFile.toURL() + "!/META-INF/application-context.xml");
+                }
+            } catch (IOException e) {
+                // bad archive
+                throw new MissingResourceException(locationAttr); // TODO: create a more appropriate exception type
+            }
+        }
+        throw new MissingResourceException("META-INF/application-context.xml");
+    }
+}

Propchange: incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/SpringImplementationLoader.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/tuscany/java/sca/containers/container.spring/src/test/java/org/apache/tuscany/container/spring/SpringCompositeBuilderTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.spring/src/test/java/org/apache/tuscany/container/spring/SpringCompositeBuilderTestCase.java?rev=430454&r1=430453&r2=430454&view=diff
==============================================================================
--- incubator/tuscany/java/sca/containers/container.spring/src/test/java/org/apache/tuscany/container/spring/SpringCompositeBuilderTestCase.java (original)
+++ incubator/tuscany/java/sca/containers/container.spring/src/test/java/org/apache/tuscany/container/spring/SpringCompositeBuilderTestCase.java Thu Aug 10 10:39:39 2006
@@ -2,6 +2,11 @@
 
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.net.URL;
+import java.net.MalformedURLException;
+import java.io.File;
+import java.io.IOException;
+import java.io.FileWriter;
 
 import org.apache.tuscany.spi.builder.BuilderRegistry;
 import org.apache.tuscany.spi.builder.Connector;
@@ -33,12 +38,27 @@
  * @version $$Rev$$ $$Date$$
  */
 public class SpringCompositeBuilderTestCase extends MockObjectTestCase {
+    private final String appXml =
+        "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+        "<beans xmlns=\"http://www.springframework.org/schema/beans\"\n" +
+        "       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
+        "       xsi:schemaLocation=\"\n" +
+        "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd\n" +
+        "\">\n" +
+        "\n" +
+        "\n" +
+        "<bean id=\"fooBean\" class=\"org.apache.tuscany.container.spring.mock.TestBeanImpl\">\n" +
+        "</bean>\n" +
+        "\n" +
+        "</beans>\n";
 
     public void testBuildImplicit() throws Exception {
 
         // Create an assembly model consisting of a component implemented by Spring
         SpringImplementation impl = new SpringImplementation(createComponentType());
-        impl.setApplicationContext(createImplicitSpringContext());
+        File tempAppXmlFile = createTempApplicationXml();
+        tempAppXmlFile.deleteOnExit();
+        impl.setApplicationXml(tempAppXmlFile.toURL());
         ComponentDefinition<SpringImplementation> componentDefinition =
             new ComponentDefinition<SpringImplementation>("spring", impl);
 
@@ -68,17 +88,8 @@
         CompositeComponent component = (CompositeComponent) builder.build(null, componentDefinition, null);
         Service service = component.getService("fooService");
         TestBean bean = (TestBean) service.getServiceInstance();
-        assertEquals("call foo", bean.echo("call foo"));
-    }
 
-    /**
-     * Return a Spring context w/ a single bean named "fooBean", implemented by TestBeanImpl
-     */
-    private ConfigurableApplicationContext createImplicitSpringContext() {
-        StaticApplicationContext beanFactory = new StaticApplicationContext();
-        BeanDefinition definition = new RootBeanDefinition(TestBeanImpl.class);
-        beanFactory.registerBeanDefinition("fooBean", definition);
-        return beanFactory;
+        assertEquals("call foo", bean.echo("call foo"));
     }
 
     private CompositeComponentType createComponentType() {
@@ -93,6 +104,14 @@
         }
         componentType.add(serviceDefinition);
         return componentType;
+    }
+
+    private File createTempApplicationXml() throws IOException, MalformedURLException {
+        File tempAppXml = File.createTempFile("SpringCompositeBuilderTestCase", ".xml");
+        FileWriter fw = new FileWriter(tempAppXml);
+        fw.write(appXml);
+        fw.flush();
+        return tempAppXml;
     }
 
     /**

Modified: incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/launcher/Launcher.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/launcher/Launcher.java?rev=430454&r1=430453&r2=430454&view=diff
==============================================================================
--- incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/launcher/Launcher.java (original)
+++ incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/launcher/Launcher.java Thu Aug 10 10:39:39 2006
@@ -102,7 +102,7 @@
 
         // initialize the runtime info
         SystemCompositeComponent parent = (SystemCompositeComponent) runtime.getSystemComponent();
-        RuntimeInfo runtimeInfo = new LauncherRuntimeInfo(getInstallDirectory());
+        RuntimeInfo runtimeInfo = new LauncherRuntimeInfo(getInstallDirectory(), getApplicationRootDirectory());
         parent.registerJavaObject("RuntimeInfo", RuntimeInfo.class, runtimeInfo);
 
         // create a ComponentDefinition to represent the component we are going to deploy
@@ -192,5 +192,14 @@
 
         File jarFile = new File(jarLocation.substring(5));
         return jarFile.getParentFile().getParentFile();
+    }
+
+    public File getApplicationRootDirectory() {
+        String property = System.getProperty("tuscany.applicationRootDir");
+        if (property != null) {
+            return new File(property);
+        }
+
+        return new File(System.getProperty("user.dir"));
     }
 }

Modified: incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/launcher/LauncherRuntimeInfo.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/launcher/LauncherRuntimeInfo.java?rev=430454&r1=430453&r2=430454&view=diff
==============================================================================
--- incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/launcher/LauncherRuntimeInfo.java (original)
+++ incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/launcher/LauncherRuntimeInfo.java Thu Aug 10 10:39:39 2006
@@ -25,12 +25,18 @@
  */
 public class LauncherRuntimeInfo implements RuntimeInfo {
     private final File installDirectory;
+    private final File applicationRootDirectory;
 
-    public LauncherRuntimeInfo(File installDirectory) {
+    public LauncherRuntimeInfo(File installDirectory, File applicationRootDirectory) {
         this.installDirectory = installDirectory;
+        this.applicationRootDirectory = applicationRootDirectory;
     }
 
     public File getInstallDirectory() {
         return installDirectory;
+    }
+
+    public File getApplicationRootDirectory() {
+        return applicationRootDirectory;
     }
 }

Modified: incubator/tuscany/java/sca/spi/src/main/java/org/apache/tuscany/spi/services/info/RuntimeInfo.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/spi/src/main/java/org/apache/tuscany/spi/services/info/RuntimeInfo.java?rev=430454&r1=430453&r2=430454&view=diff
==============================================================================
--- incubator/tuscany/java/sca/spi/src/main/java/org/apache/tuscany/spi/services/info/RuntimeInfo.java (original)
+++ incubator/tuscany/java/sca/spi/src/main/java/org/apache/tuscany/spi/services/info/RuntimeInfo.java Thu Aug 10 10:39:39 2006
@@ -30,4 +30,11 @@
      * @return the directory where the runtime was installed
      */
     File getInstallDirectory();
+
+    /**
+     * Return the root directory used to resolve application file paths.
+     *
+     * @return the directory used to resolve application file paths.
+     */
+    File getApplicationRootDirectory();
 }



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