diff options
10 files changed, 368 insertions, 200 deletions
diff --git a/java/sca/itest/contribution-folder/src/test/java/ContributionFolderTestCase.java b/java/sca/itest/contribution-folder/src/test/java/test/ContributionFolderTestCase.java index 582b9cf5c1..184738554c 100644 --- a/java/sca/itest/contribution-folder/src/test/java/ContributionFolderTestCase.java +++ b/java/sca/itest/contribution-folder/src/test/java/test/ContributionFolderTestCase.java @@ -1,4 +1,4 @@ -
+package test;
import junit.framework.TestCase;
@@ -8,20 +8,18 @@ import org.apache.tuscany.sca.node.NodeFactory; import calculator.CalculatorService;
-
-
/**
* Test SCADomain.newInstance and invocation of a service.
- *
+ *
* @version $Rev: 608205 $ $Date: 2008-01-02 20:29:05 +0000 (Wed, 02 Jan 2008) $
*/
public class ContributionFolderTestCase extends TestCase {
private Node node;
-
+
@Override
protected void setUp() throws Exception {
- node = NodeFactory.newInstance().createNode(null, new Contribution("foo", "src/test/resources/repository"));
+ node = NodeFactory.newInstance().createNode(new Contribution("foo", "src/test/resources/repository"));
node.start();
}
diff --git a/java/sca/itest/contribution-zip/src/test/java/org/apache/tuscany/sca/contribution/zip/ContributionZIPTestCase.java b/java/sca/itest/contribution-zip/src/test/java/org/apache/tuscany/sca/contribution/zip/ContributionZIPTestCase.java index 7ad7e98a91..303e2a6d9a 100644 --- a/java/sca/itest/contribution-zip/src/test/java/org/apache/tuscany/sca/contribution/zip/ContributionZIPTestCase.java +++ b/java/sca/itest/contribution-zip/src/test/java/org/apache/tuscany/sca/contribution/zip/ContributionZIPTestCase.java @@ -1,55 +1,56 @@ -/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tuscany.sca.contribution.zip;
-
-import junit.framework.TestCase;
-
-import org.apache.tuscany.sca.node.Contribution;
-import org.apache.tuscany.sca.node.Node;
-import org.apache.tuscany.sca.node.NodeFactory;
-
-import calculator.CalculatorService;
-
-
-/**
- * Test SCADomain.newInstance and invocation of a service.
- *
- * @version $Rev: 608205 $ $Date: 2008-01-02 20:29:05 +0000 (Wed, 02 Jan 2008) $
- */
-public class ContributionZIPTestCase extends TestCase {
-
- private Node node;
-
- @Override
- protected void setUp() throws Exception {
- node = NodeFactory.newInstance().createNode(null, new Contribution("foo", "src/test/resources/repository/contribution.zip"));
- node.start();
- }
-
- public void testInvoke() throws Exception {
- CalculatorService service = node.getService(CalculatorService.class, "CalculatorServiceComponent");
- assertEquals(3.0, service.add(1, 2));
- }
-
- @Override
- protected void tearDown() throws Exception {
- node.stop();
- }
-
-}
+/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.sca.contribution.zip; + +import junit.framework.TestCase; + +import org.apache.tuscany.sca.node.Contribution; +import org.apache.tuscany.sca.node.Node; +import org.apache.tuscany.sca.node.NodeFactory; + +import calculator.CalculatorService; + +/** + * Test SCADomain.newInstance and invocation of a service. + * + * @version $Rev$ $Date$ + */ +public class ContributionZIPTestCase extends TestCase { + + private Node node; + + @Override + protected void setUp() throws Exception { + node = + NodeFactory.newInstance().createNode(new Contribution("foo", + "src/test/resources/repository/contribution.zip")); + node.start(); + } + + public void testInvoke() throws Exception { + CalculatorService service = node.getService(CalculatorService.class, "CalculatorServiceComponent"); + assertEquals(3.0, service.add(1, 2)); + } + + @Override + protected void tearDown() throws Exception { + node.stop(); + } + +} diff --git a/java/sca/modules/host-webapp/src/main/java/org/apache/tuscany/sca/host/webapp/ServletHostHelper.java b/java/sca/modules/host-webapp/src/main/java/org/apache/tuscany/sca/host/webapp/ServletHostHelper.java index fd6a3ed22b..5fcb453f10 100644 --- a/java/sca/modules/host-webapp/src/main/java/org/apache/tuscany/sca/host/webapp/ServletHostHelper.java +++ b/java/sca/modules/host-webapp/src/main/java/org/apache/tuscany/sca/host/webapp/ServletHostHelper.java @@ -6,24 +6,21 @@ * 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.host.webapp;
-import java.io.BufferedReader;
import java.io.File;
-import java.io.IOException;
import java.io.InputStream;
-import java.io.InputStreamReader;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
@@ -45,7 +42,6 @@ import org.apache.tuscany.sca.node.Contribution; import org.apache.tuscany.sca.node.Node;
import org.apache.tuscany.sca.node.NodeFactory;
import org.apache.tuscany.sca.node.impl.NodeImpl;
-import org.oasisopen.sca.ServiceRuntimeException;
public class ServletHostHelper {
private static final Logger logger = Logger.getLogger(ServletHostHelper.class.getName());
@@ -55,7 +51,7 @@ public class ServletHostHelper { public static void init(ServletConfig servletConfig) {
init(servletConfig.getServletContext());
}
-
+
public static ServletHost init(final ServletContext servletContext) {
Node node = (Node)servletContext.getAttribute(SCA_NODE_ATTRIBUTE);
if (node == null) {
@@ -81,7 +77,7 @@ public class ServletHostHelper { }
return getServletHost(node);
}
-
+
private static WebAppServletHost getServletHost(Node node) {
NodeImpl nodeImpl = (NodeImpl) node;
ExtensionPointRegistry eps = nodeImpl.getExtensionPoints();
@@ -98,36 +94,17 @@ public class ServletHostHelper { }
private static Node createNode(final ServletContext servletContext) throws ServletException {
- String contextPath = initContextPath(servletContext);
+ // String contextPath = initContextPath(servletContext);
String contributionRoot = getContributionRoot(servletContext);
NodeFactory factory = NodeFactory.newInstance();
- String webComposite = getWebComposite(servletContext);
- Node node = factory.createNode(contextPath, webComposite, new Contribution(contributionRoot, contributionRoot));
+ InputStream webComposite = getWebComposite(servletContext);
+ Node node = factory.createNode(webComposite, new Contribution(contributionRoot, contributionRoot));
node.start();
return node;
}
-
- private static String getWebComposite(ServletContext servletContext) {
- InputStream stream = servletContext.getResourceAsStream("/WEB-INF/web.composite");
- BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
- StringBuilder sb = new StringBuilder();
- String s = null;
- try {
- while ((s = reader.readLine()) != null) {
- sb.append(s + "\n");
- }
- } catch (IOException e) {
- throw new ServiceRuntimeException(e);
- } finally {
- try {
- stream.close();
- } catch (IOException e) {
- throw new ServiceRuntimeException(e);
- }
- }
-
- return sb.toString();
+ private static InputStream getWebComposite(ServletContext servletContext) {
+ return servletContext.getResourceAsStream("/WEB-INF/web.composite");
}
private static String getContributionRoot(ServletContext servletContext) {
@@ -144,7 +121,7 @@ public class ServletHostHelper { // ignore exception and use default location
try {
-
+
String root = servletContext.getInitParameter("contributionRoot");
if (root == null || root.length() < 1) {
root = "/";
diff --git a/java/sca/modules/node-api/src/main/java/org/apache/tuscany/sca/node/ContributionLocationHelper.java b/java/sca/modules/node-api/src/main/java/org/apache/tuscany/sca/node/ContributionLocationHelper.java index 96a25dfa63..f891f1e329 100644 --- a/java/sca/modules/node-api/src/main/java/org/apache/tuscany/sca/node/ContributionLocationHelper.java +++ b/java/sca/modules/node-api/src/main/java/org/apache/tuscany/sca/node/ContributionLocationHelper.java @@ -6,22 +6,28 @@ * 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.node; +import java.io.IOException; import java.net.URL; import java.security.AccessController; import java.security.PrivilegedAction; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; + +import org.oasisopen.sca.ServiceRuntimeException; /** * ContributionLocationHelper @@ -32,7 +38,7 @@ public class ContributionLocationHelper { /** * Returns the location of the SCA contribution containing the given class. - * + * * @param anchorClass * @return */ @@ -53,6 +59,15 @@ public class ContributionLocationHelper { */ public static String getContributionLocation(String resourceName) { return getContributionLocation(null, resourceName); + } + + /** + * Find the contribution locations by seraching a resource on the classpath + * @param resourceName + * @return + */ + public static List<String> getContributionLocations(String resourceName) { + return getContributionLocations(null, resourceName); } @@ -74,6 +89,32 @@ public class ContributionLocationHelper { if (resourceURL == null) { return null; } + return getRootLocation(resourceURL, resourceName); + } + + /** + * Find the contribution locations by seraching a resource using the given classloader + * @param classLoader The classloader that is used to call getResources() + * @param resourceName The name of the resource + * @return A list of locations that contain the resource + */ + public static List<String> getContributionLocations(ClassLoader classLoader, String resourceName) { + if (classLoader == null) { + classLoader = AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() { + public ClassLoader run() { + return Thread.currentThread().getContextClassLoader(); + } + }); + } + Enumeration<URL> resourceURLs = getResources(classLoader, resourceName); + List<String> locations = new ArrayList<String>(); + while (resourceURLs != null && resourceURLs.hasMoreElements()) { + locations.add(getRootLocation(resourceURLs.nextElement(), resourceName)); + } + return locations; + } + + private static String getRootLocation(URL resourceURL, String resourceName) { String location = null; // "jar:file://....../something.jar!/a/b/c/app.composite" String url = resourceURL.toExternalForm(); @@ -98,4 +139,16 @@ public class ContributionLocationHelper { }); } + private static Enumeration<URL> getResources(final ClassLoader classLoader, final String compositeURI) { + return AccessController.doPrivileged(new PrivilegedAction<Enumeration<URL>>() { + public Enumeration<URL> run() { + try { + return classLoader.getResources(compositeURI); + } catch (IOException e) { + throw new ServiceRuntimeException(e); + } + } + }); + } + } diff --git a/java/sca/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeFactory.java b/java/sca/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeFactory.java index 1f30045bd1..485c159287 100644 --- a/java/sca/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeFactory.java +++ b/java/sca/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeFactory.java @@ -19,11 +19,22 @@ package org.apache.tuscany.sca.node; +import static org.apache.tuscany.sca.node.ContributionLocationHelper.getContributionLocations; + +import java.io.IOException; import java.io.InputStream; +import java.io.Reader; import java.lang.reflect.InvocationTargetException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.net.URLConnection; +import java.util.ArrayList; +import java.util.List; import org.apache.tuscany.sca.node.configuration.DefaultNodeConfigurationFactory; import org.apache.tuscany.sca.node.configuration.NodeConfiguration; +import org.apache.tuscany.sca.node.configuration.NodeConfigurationFactory; import org.oasisopen.sca.CallableReference; import org.oasisopen.sca.ServiceReference; import org.oasisopen.sca.ServiceRuntimeException; @@ -35,6 +46,15 @@ import org.oasisopen.sca.ServiceRuntimeException; * @version $Rev$ $Date$ */ public abstract class NodeFactory extends DefaultNodeConfigurationFactory { + /** + * Default location of contribution metadata in an SCA contribution. + */ + private static final String SCA_CONTRIBUTION_META = "META-INF/sca-contribution.xml"; + + /** + * Default location of a generated contribution metadata in an SCA contribution. + */ + private static final String SCA_CONTRIBUTION_GENERATED_META = "META-INF/sca-contribution-generated.xml"; protected static NodeFactory nodeFactory; @@ -174,33 +194,109 @@ public abstract class NodeFactory extends DefaultNodeConfigurationFactory { } /** - * Creates a new SCA node using defaults for the contribution location and runnable composite - * - * @return a new SCA node. + * Open a URL connection without cache + * @param url + * @return + * @throws IOException + */ + private static InputStream openStream(URL url) throws IOException { + InputStream is = null; + URLConnection connection = url.openConnection(); + connection.setUseCaches(false); + is = connection.getInputStream(); + return is; + } + + /** + * Escape the space in URL string + * @param uri + * @return */ - public abstract Node createNode(); + private static URI createURI(String uri) { + int index = uri.indexOf(':'); + String scheme = null; + String ssp = uri; + if (index != -1) { + scheme = uri.substring(0, index); + ssp = uri.substring(index + 1); + } + try { + return new URI(scheme, ssp, null); + } catch (URISyntaxException e) { + throw new IllegalArgumentException(e); + } + } /** * Creates a new SCA node from the configuration URL * - * @param configurationURL the URL of the node configuration which is the ATOM feed + * @param configurationURL the URL of the node configuration which is the XML document * that contains the URI of the composite and a collection of URLs for the contributions * * @return a new SCA node. */ - public abstract Node createNode(String configurationURL); + public Node createNode(URL configurationURL) { + try { + InputStream is = openStream(configurationURL); + return createNode(is); + } catch (IOException e) { + throw new ServiceRuntimeException(e); + } + } + + /** + * Creates a new SCA node from the XML configuration of the node + * @param is The input stream that the XML configuration can be read. The stream will be closed + * after this call. + * @return a new SCA node + */ + public Node createNode(InputStream is) { + try { + NodeConfiguration configuration = loadConfiguration(is); + is.close(); + return createNode(configuration); + } catch (IOException e) { + throw new ServiceRuntimeException(e); + } + } /** * Creates a new SCA node. * - * @param compositeURI the URI of the composite to use + * @param deploymentCompositeURI the URI of the deployment composite. If the URI is relative, it should + * be resolved against the first contribution. Otherwise, the absolute URI is used to load the XML + * description of the composite. The deployment composite will be attached to the first contribution. + * * @param contributions the URI of the contributions that provides the composites and related * artifacts. If the list is empty, then we will use the thread context classloader to discover * the contribution on the classpath * * @return a new SCA node. */ - public abstract Node createNode(String compositeURI, Contribution... contributions); + public Node createNode(String deploymentCompositeURI, Contribution... contributions) { + if (contributions == null || contributions.length == 0) { + if (deploymentCompositeURI == null || deploymentCompositeURI.indexOf(':') != -1) { + throw new ServiceRuntimeException("No SCA contribution is provided or discovered"); + } + // Try to find contributions on the classpath by the composite URI + contributions = getContributions(getContributionLocations(null, deploymentCompositeURI)); + } + NodeConfiguration configuration = createConfiguration(contributions); + if (deploymentCompositeURI != null && configuration.getContributions().size() > 0) { + configuration.getContributions().get(0).addDeploymentComposite(createURI(deploymentCompositeURI)); + } + return createNode(configuration); + } + + /** + * Create a new SCA node using the list of SCA contributions + * @param contributions + * @return + */ + public Node createNode(Contribution... contributions) { + NodeConfiguration configuration = createConfiguration(contributions); + return createNode(configuration); + } /** * Creates a new SCA node. @@ -209,8 +305,87 @@ public abstract class NodeFactory extends DefaultNodeConfigurationFactory { * @param compositeContent the XML content of the composite to use * @param contributions the URI of the contributions that provides the composites and related artifacts * @return a new SCA node. + * + * @deprecated Please use createNode(InputStream compositeContent, Contribution... contributions) or + * createNode(Reader compositeContent, Contribution... contributions) + */ + @Deprecated + public Node createNode(String compositeURI, String compositeContent, Contribution... contributions) { + NodeConfiguration configuration = createConfiguration(contributions); + if (compositeContent != null && configuration.getContributions().size() > 0) { + configuration.getContributions().get(0).addDeploymentComposite(compositeContent); + } + return createNode(configuration); + } + + /** + * Creates a new SCA node. + * + * @param compositeContent the XML content of the deployment composite + * @param contributions the URI of the contributions that provides the composites and related artifacts + * @return a new SCA node. + */ + public Node createNode(InputStream compositeContent, Contribution... contributions) { + NodeConfiguration configuration = createConfiguration(contributions); + if (compositeContent != null && configuration.getContributions().size() > 0) { + configuration.getContributions().get(0).addDeploymentComposite(compositeContent); + } + return createNode(configuration); + } + + /** + * Creates a new SCA node. + * + * @param compositeContent the XML content of the deployment composite + * @param contributions the URI of the contributions that provides the composites and related artifacts + * @return a new SCA node. */ - public abstract Node createNode(String compositeURI, String compositeContent, Contribution... contributions); + public Node createNode(Reader compositeContent, Contribution... contributions) { + NodeConfiguration configuration = createConfiguration(contributions); + if (compositeContent != null && configuration.getContributions().size() > 0) { + configuration.getContributions().get(0).addDeploymentComposite(compositeContent); + } + return createNode(configuration); + } + + private NodeConfiguration createConfiguration(Contribution... contributions) { + NodeConfigurationFactory factory = this; + NodeConfiguration configuration = factory.createNodeConfiguration(); + if (contributions != null) { + for (Contribution c : contributions) { + configuration.addContribution(c.getURI(), c.getLocation()); + } + } + return configuration; + } + + /** + * Creates a new SCA node using defaults for the contribution location and deployable composites. + * By default, it uses the Thread context classloader to find META-INF/sca-contribution.xml or + * META-INF/sca-contribution-generated.xml on the classpath. The locations that contain such resources + * are taken as the SCA contributions. + * + * @return a new SCA node. + */ + public Node createNode() { + List<String> locations = new ArrayList<String>(); + locations.addAll(getContributionLocations(null, SCA_CONTRIBUTION_META)); + locations.addAll(getContributionLocations(null, SCA_CONTRIBUTION_GENERATED_META)); + Contribution[] contributions = getContributions(locations); + return createNode(contributions); + } + + private Contribution[] getContributions(List<String> locations) { + if (locations.isEmpty()) { + throw new ServiceRuntimeException("No SCA contributions are found on the classpath"); + } + Contribution[] contributions = new Contribution[locations.size()]; + int index = 0; + for (String location : locations) { + contributions[index++] = new Contribution(location, location); + } + return contributions; + } /** * Create a new SCA node based on the configuration @@ -225,4 +400,6 @@ public abstract class NodeFactory extends DefaultNodeConfigurationFactory { * @return The node configuration */ public abstract NodeConfiguration loadConfiguration(InputStream xml); + + } diff --git a/java/sca/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeMain2.java b/java/sca/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeMain2.java index 6c26db5a25..9bbf77a2a9 100644 --- a/java/sca/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeMain2.java +++ b/java/sca/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeMain2.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.node;
@@ -24,13 +24,13 @@ import java.io.File; public class NodeMain2 {
/**
- * Start an SCA node
+ * Start an SCA node
* @param args a list of contribution jars for the node to run
*/
public static void main(String[] args) throws Exception {
Contribution[] contributions = new Contribution[args.length];
- for (int i=0; i<args.length; i++) {
+ for (int i = 0; i < args.length; i++) {
File f = new File(args[i]);
if (!f.exists()) {
System.err.println("contribution not found: " + f);
@@ -39,18 +39,18 @@ public class NodeMain2 { contributions[i] = new Contribution(f.toURI().toString(), f.toURI().toString());
}
- Node node = NodeFactory.newInstance().createNode(null, contributions);
- node.start();
-
+ Node node = NodeFactory.newInstance().createNode(contributions).start();
+
System.out.println("Hit enter to stop node...");
if (System.in.read() == -1) {
// no sysin so wait for ever letting caller do the terminate
Object lock = new Object();
- synchronized(lock) {
+ synchronized (lock) {
lock.wait();
}
}
node.stop();
+ node.destroy();
}
}
diff --git a/java/sca/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/impl/NodeUtil.java b/java/sca/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/impl/NodeUtil.java index 63324bf4c4..b944e01095 100644 --- a/java/sca/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/impl/NodeUtil.java +++ b/java/sca/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/impl/NodeUtil.java @@ -6,21 +6,25 @@ * 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.node.osgi.impl; +import java.io.IOException; +import java.io.InputStream; import java.net.URI; -import java.util.logging.Logger; +import java.net.URISyntaxException; +import java.net.URL; +import java.net.URLConnection; import org.apache.tuscany.sca.contribution.Contribution; import org.apache.tuscany.sca.contribution.ContributionFactory; @@ -31,7 +35,8 @@ import org.apache.tuscany.sca.contribution.ContributionFactory; * @version $Rev: $ $Date: $ */ public class NodeUtil { - private static final Logger logger = Logger.getLogger(NodeFactoryImpl.class.getName()); + private NodeUtil() { + } static Contribution contribution(ContributionFactory contributionFactory, org.apache.tuscany.sca.node.Contribution c) { Contribution contribution = contributionFactory.createContribution(); @@ -42,15 +47,37 @@ public class NodeUtil { } /** + * Open a URL connection without cache + * @param url + * @return + * @throws IOException + */ + static InputStream openStream(URL url) throws IOException { + InputStream is = null; + URLConnection connection = url.openConnection(); + connection.setUseCaches(false); + is = connection.getInputStream(); + return is; + } + + /** * Escape the space in URL string * @param uri * @return */ static URI createURI(String uri) { - if (uri.indexOf(' ') != -1) { - uri = uri.replace(" ", "%20"); + int index = uri.indexOf(':'); + String scheme = null; + String ssp = uri; + if (index != -1) { + scheme = uri.substring(0, index); + ssp = uri.substring(index + 1); + } + try { + return new URI(scheme, ssp, null); + } catch (URISyntaxException e) { + throw new IllegalArgumentException(e); } - return URI.create(uri); } } diff --git a/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeFactoryImpl.java b/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeFactoryImpl.java index 38376a584f..24836c67fb 100644 --- a/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeFactoryImpl.java +++ b/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeFactoryImpl.java @@ -19,11 +19,7 @@ package org.apache.tuscany.sca.node.impl; -import static org.apache.tuscany.sca.node.impl.NodeUtil.openStream; - -import java.io.IOException; import java.io.InputStream; -import java.net.URL; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLOutputFactory; @@ -31,12 +27,9 @@ import javax.xml.stream.XMLStreamReader; import org.apache.tuscany.sca.extensibility.ServiceDeclaration; import org.apache.tuscany.sca.extensibility.ServiceDiscovery; -import org.apache.tuscany.sca.node.Contribution; -import org.apache.tuscany.sca.node.ContributionLocationHelper; import org.apache.tuscany.sca.node.Node; import org.apache.tuscany.sca.node.NodeFactory; import org.apache.tuscany.sca.node.configuration.NodeConfiguration; -import org.apache.tuscany.sca.node.configuration.NodeConfigurationFactory; import org.apache.tuscany.sca.node.configuration.xml.NodeConfigurationProcessor; import org.oasisopen.sca.ServiceRuntimeException; @@ -50,61 +43,6 @@ public class NodeFactoryImpl extends NodeFactory { } @Override - public Node createNode(String configurationURI) { - try { - URL url = new URL(configurationURI); - InputStream is = openStream(url); - NodeConfiguration configuration = loadConfiguration(is); - is.close(); - return new NodeImpl(configuration); - } catch (IOException e) { - throw new ServiceRuntimeException(e); - } - } - - @Override - public Node createNode(String compositeURI, Contribution... contributions) { - NodeConfigurationFactory factory = this; - NodeConfiguration configuration = factory.createNodeConfiguration(); - for (Contribution c : contributions) { - configuration.addContribution(c.getURI(), c.getLocation()); - } - if (compositeURI != null && configuration.getContributions().size() > 0) { - configuration.getContributions().get(0).addDeploymentComposite(NodeUtil.createURI(compositeURI)); - } - return new NodeImpl(configuration); - } - - @Override - public Node createNode(String compositeURI, String compositeContent, Contribution... contributions) { - NodeConfigurationFactory factory = this; - NodeConfiguration configuration = factory.createNodeConfiguration(); - for (Contribution c : contributions) { - configuration.addContribution(c.getURI(), c.getLocation()); - } - if (compositeContent != null && configuration.getContributions().size() > 0) { - configuration.getContributions().get(0).addDeploymentComposite(compositeContent); - } - return new NodeImpl(configuration); - } - - @Override - public Node createNode() { - String location = - ContributionLocationHelper - .getContributionLocation(org.apache.tuscany.sca.contribution.Contribution.SCA_CONTRIBUTION_META); - if (location == null) { - location = - ContributionLocationHelper - .getContributionLocation(org.apache.tuscany.sca.contribution.Contribution.SCA_CONTRIBUTION_GENERATED_META); - } - if (location == null) { - throw new ServiceRuntimeException("No SCA contributions are found on the classpath"); - } - return createNode(null, new Contribution("http://contributions/default", location)); - } - - @Override public Node createNode(NodeConfiguration configuration) { return new NodeImpl(configuration); } diff --git a/java/sca/modules/node-impl/src/test/java/org/apache/tuscany/sca/node/impl/NodeImplTestCase.java b/java/sca/modules/node-impl/src/test/java/org/apache/tuscany/sca/node/impl/NodeImplTestCase.java index 877e4e3643..da869e78e6 100644 --- a/java/sca/modules/node-impl/src/test/java/org/apache/tuscany/sca/node/impl/NodeImplTestCase.java +++ b/java/sca/modules/node-impl/src/test/java/org/apache/tuscany/sca/node/impl/NodeImplTestCase.java @@ -22,6 +22,7 @@ package org.apache.tuscany.sca.node.impl; import hello.HelloWorld; import java.io.File; +import java.io.StringReader; import org.apache.tuscany.sca.node.Contribution; import org.apache.tuscany.sca.node.Node; @@ -47,8 +48,7 @@ public class NodeImplTestCase { public void testNodeWithCompositeContent() { NodeFactory factory = new NodeFactoryImpl(); Contribution contribution = new Contribution("c1", new File("target/test-classes").toURI().toString()); - String compositeURI = "HelloWorld.composite"; - Node node = factory.createNode(compositeURI, composite, contribution); + Node node = factory.createNode(new StringReader(composite), contribution); testNode2(node); } diff --git a/java/sca/samples/calculator/src/test/java/calculator/CalculatorTestCase.java b/java/sca/samples/calculator/src/test/java/calculator/CalculatorTestCase.java index 27a424b1cc..73c7d872b9 100644 --- a/java/sca/samples/calculator/src/test/java/calculator/CalculatorTestCase.java +++ b/java/sca/samples/calculator/src/test/java/calculator/CalculatorTestCase.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 calculator; @@ -28,25 +28,22 @@ import org.apache.tuscany.sca.node.NodeFactory; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; -import org.oasisopen.sca.annotation.EagerInit; -import org.oasisopen.sca.annotation.Scope; /** * This shows how to test the Calculator service component. */ -@Scope("COMPOSITE") @EagerInit public class CalculatorTestCase{ - private static Node node; + private static Node node; private static CalculatorService calculatorService; - + @BeforeClass public static void setUpBeforeClass() throws Exception { NodeFactory factory = NodeFactory.newInstance(); String contribution = ContributionLocationHelper.getContributionLocation(CalculatorClient.class); - node = factory.createNode("Calculator.composite", new Contribution("calculator", contribution)); - node.start(); - + node = factory.createNode("Calculator.composite", new Contribution("calculator", contribution)).start(); + // node = factory.createNode().start(); + calculatorService = ((Client)node).getService(CalculatorService.class, "CalculatorServiceComponent"); } |