From a7c1a39d8c3c4ef4d5878dbff726085082a17e8a Mon Sep 17 00:00:00 2001 From: lresende Date: Wed, 11 Nov 2009 23:09:31 +0000 Subject: Moving 2.x branches git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@835136 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/tuscany/sca/node/Client.java | 71 ++++ .../org/apache/tuscany/sca/node/Contribution.java | 54 +++ .../sca/node/ContributionLocationHelper.java | 154 ++++++++ .../java/org/apache/tuscany/sca/node/Node.java | 54 +++ .../org/apache/tuscany/sca/node/NodeFactory.java | 422 +++++++++++++++++++++ .../org/apache/tuscany/sca/node/NodeFinder.java | 58 +++ .../org/apache/tuscany/sca/node/NodeMain2.java | 56 +++ .../node/configuration/BindingConfiguration.java | 55 +++ .../configuration/ContributionConfiguration.java | 102 +++++ .../DefaultNodeConfigurationFactory.java | 46 +++ .../node/configuration/DeploymentComposite.java | 64 ++++ .../sca/node/configuration/NodeConfiguration.java | 87 +++++ .../configuration/NodeConfigurationFactory.java | 50 +++ .../impl/BindingConfigurationImpl.java | 54 +++ .../impl/ContributionConfigurationImpl.java | 155 ++++++++ .../impl/DeploymentCompositeImpl.java | 59 +++ .../impl/NodeConfigurationFactoryImpl.java | 63 +++ .../configuration/impl/NodeConfigurationImpl.java | 154 ++++++++ 18 files changed, 1758 insertions(+) create mode 100644 sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/Client.java create mode 100644 sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/Contribution.java create mode 100644 sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/ContributionLocationHelper.java create mode 100644 sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/Node.java create mode 100644 sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeFactory.java create mode 100644 sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeFinder.java create mode 100644 sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeMain2.java create mode 100644 sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/BindingConfiguration.java create mode 100644 sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/ContributionConfiguration.java create mode 100644 sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/DefaultNodeConfigurationFactory.java create mode 100644 sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/DeploymentComposite.java create mode 100644 sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/NodeConfiguration.java create mode 100644 sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/NodeConfigurationFactory.java create mode 100644 sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/impl/BindingConfigurationImpl.java create mode 100644 sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/impl/ContributionConfigurationImpl.java create mode 100644 sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/impl/DeploymentCompositeImpl.java create mode 100644 sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/impl/NodeConfigurationFactoryImpl.java create mode 100644 sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/impl/NodeConfigurationImpl.java (limited to 'sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src') diff --git a/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/Client.java b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/Client.java new file mode 100644 index 0000000000..84c1e09126 --- /dev/null +++ b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/Client.java @@ -0,0 +1,71 @@ +/* + * 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.node; + +import org.oasisopen.sca.CallableReference; +import org.oasisopen.sca.ServiceReference; + + +/** + * Provides client access to the services in a domain. + * + * @version $Rev$ $Date$ + */ +public interface Client { + + /** + * Cast a type-safe reference to a CallableReference. Converts a type-safe + * reference to an equivalent CallableReference; if the target refers to a + * service then a ServiceReference will be returned, if the target refers to + * a callback then a CallableReference will be returned. + * + * @param target a reference proxy provided by the SCA runtime + * @param the Java type of the business interface for the reference + * @param the type of reference to be returned + * @return a CallableReference equivalent for the proxy + * @throws IllegalArgumentException if the supplied instance is not a + * reference supplied by the SCA runtime + */ + > R cast(B target) throws IllegalArgumentException; + + /** + * Returns a proxy for a service provided by a component in the SCA domain. + * + * @param businessInterface the interface that will be used to invoke the + * service + * @param serviceName the name of the service + * @param the Java type of the business interface for the service + * @return an object that implements the business interface + */ + B getService(Class businessInterface, String serviceName); + + /** + * Returns a ServiceReference for a service provided by a component in the + * SCA domain. + * + * @param businessInterface the interface that will be used to invoke the + * service + * @param serviceName the name of the service + * @param the Java type of the business interface for the service + * @return a ServiceReference for the designated service + */ + ServiceReference getServiceReference(Class businessInterface, String serviceName); + +} \ No newline at end of file diff --git a/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/Contribution.java b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/Contribution.java new file mode 100644 index 0000000000..f69e18dc63 --- /dev/null +++ b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/Contribution.java @@ -0,0 +1,54 @@ +/* + * 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.node; + +/** + * Represents an SCA contribution uri + location. + */ +public final class Contribution { + private String uri; + private String location; + + /** + * Constructs a new SCA contribution. + * + * @param uri The URI that uniquely identifies the contribution in the SCA domain + * @param location The URL of the contribution archive + */ + public Contribution(String uri, String location) { + this.uri = uri; + this.location = location; + } + + /** + * Get the URI of the contribution + * @return The URI that uniquely identifies the contribution in the SCA domain + */ + public String getURI() { + return uri; + } + + /** + * The location of the contribution + * @return The URL of the contribution archive + */ + public String getLocation() { + return location; + } +} \ No newline at end of file diff --git a/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/ContributionLocationHelper.java b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/ContributionLocationHelper.java new file mode 100644 index 0000000000..f891f1e329 --- /dev/null +++ b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/ContributionLocationHelper.java @@ -0,0 +1,154 @@ +/* + * 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.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 + * + * @version $Rev$ $Date$ + */ +public class ContributionLocationHelper { + + /** + * Returns the location of the SCA contribution containing the given class. + * + * @param anchorClass + * @return + */ + public static String getContributionLocation(final Class anchorClass) { + URL url = AccessController.doPrivileged(new PrivilegedAction() { + public URL run() { + return anchorClass.getProtectionDomain().getCodeSource().getLocation(); + } + }); + String uri = url.toString(); + return uri; + } + + /** + * Find the contribution location by seraching a resource on the classpath + * @param resourceName + * @return + */ + 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 getContributionLocations(String resourceName) { + return getContributionLocations(null, resourceName); + + } + + /** + * Find the contribution location by seraching a resource using the given classloader + * @param classLoader + * @param resourceName + * @return + */ + public static String getContributionLocation(ClassLoader classLoader, String resourceName) { + if (classLoader == null) { + classLoader = AccessController.doPrivileged(new PrivilegedAction() { + public ClassLoader run() { + return Thread.currentThread().getContextClassLoader(); + } + }); + } + URL resourceURL = getResource(classLoader, resourceName); + 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 getContributionLocations(ClassLoader classLoader, String resourceName) { + if (classLoader == null) { + classLoader = AccessController.doPrivileged(new PrivilegedAction() { + public ClassLoader run() { + return Thread.currentThread().getContextClassLoader(); + } + }); + } + Enumeration resourceURLs = getResources(classLoader, resourceName); + List locations = new ArrayList(); + 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(); + String protocol = resourceURL.getProtocol(); + if ("file".equals(protocol)) { + // directory contribution + if (url.endsWith(resourceName)) { + location = url.substring(0, url.lastIndexOf(resourceName)); + } + } else if ("jar".equals(protocol) || "wsjar".equals(protocol) || "zip".equals(protocol)) { + // jar contribution + location = url.substring(protocol.length() + 1, url.lastIndexOf("!/")); + } + return location; + } + + private static URL getResource(final ClassLoader classLoader, final String compositeURI) { + return AccessController.doPrivileged(new PrivilegedAction() { + public URL run() { + return classLoader.getResource(compositeURI); + } + }); + } + + private static Enumeration getResources(final ClassLoader classLoader, final String compositeURI) { + return AccessController.doPrivileged(new PrivilegedAction>() { + public Enumeration run() { + try { + return classLoader.getResources(compositeURI); + } catch (IOException e) { + throw new ServiceRuntimeException(e); + } + } + }); + } + +} diff --git a/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/Node.java b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/Node.java new file mode 100644 index 0000000000..e4b7594919 --- /dev/null +++ b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/Node.java @@ -0,0 +1,54 @@ +/* + * 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.node; + +import org.apache.tuscany.sca.node.configuration.NodeConfiguration; + + + + +/** + * Represents an SCA processing node. + * A node is loaded with an SCA composites. It can start and stop that composite. + * + * @version $Rev$ $Date$ + */ +public interface Node extends Client { + String DEFAULT_DOMAIN_URI = NodeConfiguration.DEFAULT_DOMAIN_URI; + String DEFAULT_NODE_URI = NodeConfiguration.DEFAULT_NODE_URI; + /** + * Start the composite loaded in the node. + * @return Return the node itself so that we can call NodeFactory.newInstance().createNode(...).start() + */ + Node start(); + + /** + * Stop the composite loaded in the node. + */ + void stop(); + + /** + * Destroy the node. + */ + void destroy(); + + // NodeConfiguration getConfiguration(); + +} diff --git a/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeFactory.java b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeFactory.java new file mode 100644 index 0000000000..94df876a31 --- /dev/null +++ b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeFactory.java @@ -0,0 +1,422 @@ +/* + * 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.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.Arrays; +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; + +/** + * A factory for SCA processing nodes. An SCA processing node can be loaded + * with an SCA composite and the SCA contributions required by the composite. + * + * @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; + + protected static void setNodeFactory(NodeFactory factory) { + nodeFactory = factory; + } + + public static class NodeProxy implements Node, Client { + private Object node; + + private NodeProxy(Object node) { + super(); + this.node = node; + } + + public static T createProxy(Class type, Object node) { + try { + return type.getDeclaredConstructor(Object.class).newInstance(node); + } catch (Exception e) { + throw new IllegalArgumentException(e); + } + } + + public > R cast(B target) throws IllegalArgumentException { + try { + return (R)node.getClass().getMethod("cast", Object.class).invoke(node, target); + } catch (Throwable e) { + handleException(e); + return null; + } + } + + public B getService(Class businessInterface, String serviceName) { + try { + return (B)node.getClass().getMethod("getService", Class.class, String.class).invoke(node, businessInterface, serviceName); + } catch (Throwable e) { + handleException(e); + return null; + } + } + + public ServiceReference getServiceReference(Class businessInterface, String serviceName) { + try { + return (ServiceReference)node.getClass().getMethod("getServiceReference", Class.class, String.class).invoke(node, businessInterface, serviceName); + } catch (Throwable e) { + handleException(e); + return null; + } + } + + public Node start() { + try { + return new NodeProxy(node.getClass().getMethod("start").invoke(node)); + } catch (Throwable e) { + handleException(e); + return null; + } + } + + public void stop() { + try { + node.getClass().getMethod("stop").invoke(node); + } catch (Throwable e) { + handleException(e); + } + } + + public void destroy() { + try { + node.getClass().getMethod("destroy").invoke(node); + } catch (Throwable e) { + handleException(e); + } + } + + private static void handleException(Throwable ex) { + if (ex instanceof InvocationTargetException) { + ex = ((InvocationTargetException)ex).getTargetException(); + } + if (ex instanceof RuntimeException) { + throw (RuntimeException)ex; + } + if (ex instanceof Error) { + throw (Error)ex; + } else { + throw new RuntimeException(ex); + } + } + + } + + /** + * Returns a new SCA node factory instance. + * + * @return a new SCA node factory + */ + public static NodeFactory newInstance() { + if (nodeFactory != null) { + return nodeFactory; + } + + try { + // final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + // Use reflection APIs to call ServiceDiscovery to avoid hard dependency to tuscany-extensibility + try { + Class discoveryClass = Class.forName("org.apache.tuscany.sca.extensibility.ServiceDiscovery"); + Object instance = discoveryClass.getMethod("getInstance").invoke(null); + Object factoryDeclaration = + discoveryClass.getMethod("getServiceDeclaration", String.class).invoke(instance, + NodeFactory.class.getName()); + if (factoryDeclaration != null) { + Class factoryImplClass = + (Class)factoryDeclaration.getClass().getMethod("loadClass").invoke(factoryDeclaration); + nodeFactory = (NodeFactory)factoryImplClass.newInstance(); + return nodeFactory; + } + } catch (ClassNotFoundException e) { + // Ignore + } + + // Fail back to default impl + String className = "org.apache.tuscany.sca.node.impl.NodeFactoryImpl"; + + Class cls = Class.forName(className); + nodeFactory = (NodeFactory)cls.newInstance(); + return nodeFactory; + + } catch (Exception e) { + throw new ServiceRuntimeException(e); + } + } + + /** + * 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 + */ + 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 XML document + * that contains the URI of the composite and a collection of URLs for the contributions + * + * @return a new SCA node. + */ + 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 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 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 + List locations = getContributionLocations(null, deploymentCompositeURI); + if (locations.isEmpty()) { + throw new ServiceRuntimeException("No SCA contributions are found on the classpath"); + } + contributions = getContributions(locations); + } + NodeConfiguration configuration = createConfiguration(contributions); + if (deploymentCompositeURI != null && configuration.getContributions().size() > 0) { + configuration.getContributions().get(0).addDeploymentComposite(createURI(deploymentCompositeURI)); + } + return createNode(configuration); + } + + /** + * The following methods are used by the node launcher + */ + public final Node createNode(String deploymentCompositeURI, String[] uris, String locations[]) { + return createNode(deploymentCompositeURI, getContributions(Arrays.asList(uris), Arrays.asList(locations))); + } + + public final Node createNode(String deploymentCompositeURI, String locations[]) { + return createNode(deploymentCompositeURI, getContributions(Arrays.asList(locations))); + } + + public final Node createNode(Reader deploymentCompositeContent, String[] uris, String locations[]) { + return createNode(deploymentCompositeContent, getContributions(Arrays.asList(uris), Arrays.asList(locations))); + } + + public final Node createNode(String compositeURI, ClassLoader classLoader) { + List locations = ContributionLocationHelper.getContributionLocations(classLoader, compositeURI); + return createNode(compositeURI, locations.toArray(new String[locations.size()])); + } + /** + * ------------------- end of methods ----------------- + */ + + /** + * 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. + * + * @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 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); + } + + /** + * 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 locations = new ArrayList(); + locations.addAll(getContributionLocations(null, SCA_CONTRIBUTION_META)); + locations.addAll(getContributionLocations(null, SCA_CONTRIBUTION_GENERATED_META)); + if (locations.isEmpty()) { + throw new ServiceRuntimeException("No SCA contributions are found on the classpath"); + } + Contribution[] contributions = getContributions(locations); + return createNode(contributions); + } + + 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; + } + + private Contribution[] getContributions(List locations) { + Contribution[] contributions = new Contribution[locations.size()]; + int index = 0; + for (String location : locations) { + contributions[index++] = new Contribution(location, location); + } + return contributions; + } + + private Contribution[] getContributions(List uris, List locations) { + if (uris.size() != locations.size()) { + throw new IllegalArgumentException("The number of URIs does not match the number of locations"); + } + Contribution[] contributions = new Contribution[locations.size()]; + for (int i = 0, n = locations.size(); i < n; i++) { + contributions[i] = new Contribution(uris.get(i), locations.get(i)); + } + return contributions; + } + + public void destroy() { + } + + /** + * Create a new SCA node based on the configuration + * @param configuration The configuration of a node + * @return The SCA node + */ + public abstract Node createNode(NodeConfiguration configuration); + + /** + * Create the node configuration from the XML document + * @param configuration The input stream of the XML document + * @return The node configuration + */ + public abstract NodeConfiguration loadConfiguration(InputStream xml); + + +} diff --git a/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeFinder.java b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeFinder.java new file mode 100644 index 0000000000..27926a0115 --- /dev/null +++ b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeFinder.java @@ -0,0 +1,58 @@ +/* + * 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.node; + +import java.net.URI; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class NodeFinder { + + private static Map> nodes = new HashMap>(); + + public static void addNode(URI domainName, Node node) { + List domainNodes = nodes.get(domainName); + if (domainNodes == null) { + domainNodes = new ArrayList(); + } + domainNodes.add(node); + nodes.put(domainName, domainNodes); + } + + public static Node removeNode(Node node) { + for (List domainNodes : nodes.values()) { + if (domainNodes.contains(node)) { + domainNodes.remove(node); + if (domainNodes.size() < 1) { + nodes.remove(domainNodes); + } + return node; + } + } + return null; + } + + public static List getNodes(URI domainURI) { + return nodes.get(domainURI); + } + +} diff --git a/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeMain2.java b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeMain2.java new file mode 100644 index 0000000000..9bbf77a2a9 --- /dev/null +++ b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeMain2.java @@ -0,0 +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.node; + +import java.io.File; + +public class NodeMain2 { + + /** + * 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++) { + File f = new File(args[i]); + if (!f.exists()) { + System.err.println("contribution not found: " + f); + System.exit(1); + } + contributions[i] = new Contribution(f.toURI().toString(), f.toURI().toString()); + } + + 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) { + lock.wait(); + } + } + + node.stop(); + node.destroy(); + } +} diff --git a/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/BindingConfiguration.java b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/BindingConfiguration.java new file mode 100644 index 0000000000..f3be7c5c35 --- /dev/null +++ b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/BindingConfiguration.java @@ -0,0 +1,55 @@ +/* + * 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.node.configuration; + +import java.util.List; + +import javax.xml.namespace.QName; + +/** + * Configuration for bindings used by an SCA node + */ +public interface BindingConfiguration { + /** + * Get the QName of the binding type + * @return the QName of the binding type + */ + QName getBindingType(); + + /** + * Set the type of the binding + * @param type The QName of the binding type + */ + BindingConfiguration setBindingType(QName type); + + /** + * Get a list of base URIs for the binding. For each protocol supported by the binding, + * one base URI can be configured + * @return A list of base URIs + */ + List getBaseURIs(); + + /** + * Add a base URI + * @param baseURI + * @return + */ + BindingConfiguration addBaseURI(String baseURI); +} diff --git a/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/ContributionConfiguration.java b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/ContributionConfiguration.java new file mode 100644 index 0000000000..3e9946fe80 --- /dev/null +++ b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/ContributionConfiguration.java @@ -0,0 +1,102 @@ +/* + * 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.node.configuration; + +import java.io.InputStream; +import java.io.Reader; +import java.net.URI; +import java.net.URL; +import java.util.List; + +/** + * Configuration for an SCA contribution used by the SCA node + */ +public interface ContributionConfiguration { + /** + * Get the URI of the contribution + * @return The URI of the contribution + */ + String getURI(); + + /** + * Set the URI of the contribution + * @param uri The URI of the contribution + */ + ContributionConfiguration setURI(String uri); + + /** + * Get the location of the contribution + * @return The location of the contribution + */ + String getLocation(); + + /** + * Set the location of the contribution + * @param location The location of the contribution + */ + ContributionConfiguration setLocation(String location); + + /** + * Get the list of deployment composites that are attached to the contribution + * @return A list of deployment composites + */ + List getDeploymentComposites(); + + /** + * Add a deployment composite to this contribution + * @param deploymentComposite The deployment composite + * @return + */ + ContributionConfiguration addDeploymentComposite(DeploymentComposite deploymentComposite); + + /** + * Create a deployment composite and add it to the contribution configuration + * @param location The location is either relative to the contribution or + * @return + */ + ContributionConfiguration addDeploymentComposite(URI location); + + /** + * Attach a deployment composite to this contribution + * @param location + * @return + */ + ContributionConfiguration addDeploymentComposite(URL location); + + /** + * Attach a deployment composite to this contribution + * @param content The string that contains the XML description of the SCA composite + * @return + */ + ContributionConfiguration addDeploymentComposite(String content); + + /** + * Attach a deployment composite to this contribution + * @param content The XML description of the SCA composite from a reader + * @return + */ + ContributionConfiguration addDeploymentComposite(Reader content); + /** + * Attach a deployment composite to this contribution + * @param content The XML description of the SCA composite from an input stream + * @return + */ + ContributionConfiguration addDeploymentComposite(InputStream content); +} diff --git a/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/DefaultNodeConfigurationFactory.java b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/DefaultNodeConfigurationFactory.java new file mode 100644 index 0000000000..8bc4b7d493 --- /dev/null +++ b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/DefaultNodeConfigurationFactory.java @@ -0,0 +1,46 @@ +/* + * 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.node.configuration; + +import org.apache.tuscany.sca.node.configuration.impl.NodeConfigurationFactoryImpl; + +/** + * Default NodeConfigurationFactory + */ +public class DefaultNodeConfigurationFactory implements NodeConfigurationFactory { + private NodeConfigurationFactory factory = new NodeConfigurationFactoryImpl(); + + public BindingConfiguration createBindingConfiguration() { + return factory.createBindingConfiguration(); + } + + public ContributionConfiguration createContributionConfiguration() { + return factory.createContributionConfiguration(); + } + + public DeploymentComposite createDeploymentComposite() { + return factory.createDeploymentComposite(); + } + + public NodeConfiguration createNodeConfiguration() { + return factory.createNodeConfiguration(); + } + +} diff --git a/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/DeploymentComposite.java b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/DeploymentComposite.java new file mode 100644 index 0000000000..65337abdfb --- /dev/null +++ b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/DeploymentComposite.java @@ -0,0 +1,64 @@ +/* + * 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.node.configuration; + + +/** + * Configuration for a deployment composite + */ +public interface DeploymentComposite { + /** + * Get the location of the deployment composite, it can be relative to the owning + * contribution or an external resource + * @return + */ + String getLocation(); + + /** + * Set the location of the deployment composite + * @param location + */ + DeploymentComposite setLocation(String location); + + /** + * Get string content of the deployment composite (XML) + * @return + */ + String getContent(); + + /** + * Set the XML content for the composite + * @param compositeXML + */ + DeploymentComposite setContent(String compositeXML); + + /** + * Get the URI of the contribution that the deployment composite is attached to + * @return the URI of the contribution that the deployment composite is attached to + */ + String getContributionURI(); + + /** + * Set the URI of the contribution that the deployment composite is attached to + * @param contributionURI + */ + DeploymentComposite setContributionURI(String contributionURI); + +} diff --git a/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/NodeConfiguration.java b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/NodeConfiguration.java new file mode 100644 index 0000000000..7d2909ba81 --- /dev/null +++ b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/NodeConfiguration.java @@ -0,0 +1,87 @@ +/* + * 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.node.configuration; + +import java.io.InputStream; +import java.io.Reader; +import java.net.URI; +import java.net.URL; +import java.util.List; + +import javax.xml.namespace.QName; + +/** + * The configuration for a Node which represents the deployment of an SCA composite application + */ +public interface NodeConfiguration { + String DEFAULT_DOMAIN_URI = "http://tuscany.apache.org/sca/1.1/domains/default"; + String DEFAULT_NODE_URI = "http://tuscany.apache.org/sca/1.1/nodes/default"; + /** + * Get the URI of the SCA domain that manages the composite application + * @return The URI of the SCA domain + */ + String getDomainURI(); + + /** + * Set the URI of the SCA domain + * @param domainURI The URI of the SCA domain + */ + NodeConfiguration setDomainURI(String domainURI); + + /** + * Get the URI of the node. It uniquely identifies a node within the SCA domain + * @return The URI of the node + */ + String getURI(); + + /** + * Set the URI of the node + * @param uri The URI of the node + */ + NodeConfiguration setURI(String uri); + + /** + * Get a list of confiurations for SCA contributions + * @return A list of configurations for SCA contributions + */ + List getContributions(); + + /** + * Get a list of configurations for SCA bindings + * @return A list of configurations for SCA bindings + */ + List getBindings(); + + NodeConfiguration addContribution(ContributionConfiguration contribution); + NodeConfiguration addContribution(String contributionURI, String location); + NodeConfiguration addContribution(String contributionURI, URL location); + NodeConfiguration addContribution(URI contributionURI, URL location); + NodeConfiguration addContribution(URL...location); + + NodeConfiguration addDeploymentComposite(String contributionURI, String location); + NodeConfiguration addDeploymentComposite(String contributionURI, Reader content); + NodeConfiguration addDeploymentComposite(String contributionURI, InputStream content); + + NodeConfiguration addBinding(BindingConfiguration binding); + NodeConfiguration addBinding(QName bindingType, String...baseURIs); + NodeConfiguration addBinding(QName bindingType, URI...baseURIs); + + List getExtensions(); +} diff --git a/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/NodeConfigurationFactory.java b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/NodeConfigurationFactory.java new file mode 100644 index 0000000000..f03a895114 --- /dev/null +++ b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/NodeConfigurationFactory.java @@ -0,0 +1,50 @@ +/* + * 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.node.configuration; + + +/** + * The factory to create java models related to the node configuration + */ +public interface NodeConfigurationFactory { + /** + * Create a new instance of NodeConfiguration + * @return + */ + NodeConfiguration createNodeConfiguration(); + + /** + * Create a new instance of ContributionConfiguration + * @return + */ + ContributionConfiguration createContributionConfiguration(); + + /** + * Create a new instance of BindingConfiguration + * @return + */ + BindingConfiguration createBindingConfiguration(); + + /** + * Create a new instance of DeploymentComposite + * @return + */ + DeploymentComposite createDeploymentComposite(); +} diff --git a/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/impl/BindingConfigurationImpl.java b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/impl/BindingConfigurationImpl.java new file mode 100644 index 0000000000..8fba4ee6a3 --- /dev/null +++ b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/impl/BindingConfigurationImpl.java @@ -0,0 +1,54 @@ +/* + * 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.node.configuration.impl; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.namespace.QName; + +import org.apache.tuscany.sca.node.configuration.BindingConfiguration; + +/** + * Default implementation of BindingConfiguration + */ +public class BindingConfigurationImpl implements BindingConfiguration { + private QName type; + private List baseURIs = new ArrayList(); + + public List getBaseURIs() { + return baseURIs; + } + + public QName getBindingType() { + return type; + } + + public BindingConfiguration setBindingType(QName type) { + this.type = type; + return this; + } + + public BindingConfiguration addBaseURI(String baseURI) { + baseURIs.add(baseURI); + return this; + } + +} diff --git a/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/impl/ContributionConfigurationImpl.java b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/impl/ContributionConfigurationImpl.java new file mode 100644 index 0000000000..b08a4e6cff --- /dev/null +++ b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/impl/ContributionConfigurationImpl.java @@ -0,0 +1,155 @@ +/* + * 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.node.configuration.impl; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.io.StringWriter; +import java.net.URI; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; + +import org.apache.tuscany.sca.node.configuration.ContributionConfiguration; +import org.apache.tuscany.sca.node.configuration.DeploymentComposite; + +/** + * Configuration for an SCA contribution used by the SCA node + */ +public class ContributionConfigurationImpl implements ContributionConfiguration { + private List deploymentComposites = new ArrayList(); + private String uri; + private String location; + + public ContributionConfigurationImpl() { + super(); + } + + public ContributionConfigurationImpl(String uri, String location) { + super(); + this.uri = uri; + this.location = location; + } + + public ContributionConfigurationImpl(String location) { + super(); + this.uri = location; + this.location = location; + } + + /** + * Get the URI of the contribution + * @return The URI of the contribution + */ + public String getURI() { + return uri; + } + + /** + * Set the URI of the contribution + * @param uri The URI of the contribution + */ + public ContributionConfiguration setURI(String uri) { + this.uri = uri; + return this; + } + + /** + * Get the location of the contribution + * @return The location of the contribution + */ + public String getLocation() { + return location; + } + + /** + * Set the location of the contribution + * @param location The location of the contribution + */ + public ContributionConfiguration setLocation(String location) { + this.location = location; + return this; + } + + /** + * Get the list of deployment composites that are attached to the contribution + * @return + */ + public List getDeploymentComposites() { + return deploymentComposites; + } + + public ContributionConfiguration addDeploymentComposite(DeploymentComposite deploymentComposite) { + deploymentComposites.add(deploymentComposite); + if (uri != null) { + deploymentComposite.setContributionURI(uri); + } + return this; + } + + public ContributionConfiguration addDeploymentComposite(Reader reader) { + try { + DeploymentComposite composite = new DeploymentCompositeImpl(); + char[] buf = new char[8192]; + StringWriter sw = new StringWriter(); + int size = 0; + while (size >= 0) { + size = reader.read(buf); + if (size > 0) { + sw.write(buf, 0, size); + } + } + reader.close(); + composite.setContent(sw.toString()); + return addDeploymentComposite(composite); + } catch (IOException e) { + throw new IllegalArgumentException(e); + } + } + + public ContributionConfiguration addDeploymentComposite(InputStream content) { + try { + InputStreamReader reader = new InputStreamReader(content, "UTF-8"); + return addDeploymentComposite(reader); + } catch (IOException e) { + throw new IllegalArgumentException(e); + } + } + + public ContributionConfiguration addDeploymentComposite(String content) { + DeploymentComposite composite = new DeploymentCompositeImpl(); + composite.setContent(content); + return addDeploymentComposite(composite); + } + + public ContributionConfiguration addDeploymentComposite(URI location) { + DeploymentComposite composite = new DeploymentCompositeImpl(); + composite.setLocation(location.toString()); + return addDeploymentComposite(composite); + } + + public ContributionConfiguration addDeploymentComposite(URL location) { + DeploymentComposite composite = new DeploymentCompositeImpl(); + composite.setLocation(location.toString()); + return addDeploymentComposite(composite); + } +} diff --git a/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/impl/DeploymentCompositeImpl.java b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/impl/DeploymentCompositeImpl.java new file mode 100644 index 0000000000..e94f195931 --- /dev/null +++ b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/impl/DeploymentCompositeImpl.java @@ -0,0 +1,59 @@ +/* + * 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.node.configuration.impl; + +import org.apache.tuscany.sca.node.configuration.DeploymentComposite; + +/** + * Configuration for a deployment composite + */ +public class DeploymentCompositeImpl implements DeploymentComposite { + private String location; + private String content; + private String contributionURI; + + public String getLocation() { + return location; + } + + public DeploymentComposite setLocation(String location) { + this.location = location; + return this; + } + + public String getContent() { + return content; + } + + public DeploymentComposite setContent(String content) { + this.content = content; + return this; + } + + public String getContributionURI() { + return contributionURI; + } + + public DeploymentComposite setContributionURI(String contributionURI) { + this.contributionURI = contributionURI; + return this; + } + +} diff --git a/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/impl/NodeConfigurationFactoryImpl.java b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/impl/NodeConfigurationFactoryImpl.java new file mode 100644 index 0000000000..9396adc87d --- /dev/null +++ b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/impl/NodeConfigurationFactoryImpl.java @@ -0,0 +1,63 @@ +/* + * 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.node.configuration.impl; + +import org.apache.tuscany.sca.node.configuration.BindingConfiguration; +import org.apache.tuscany.sca.node.configuration.ContributionConfiguration; +import org.apache.tuscany.sca.node.configuration.DeploymentComposite; +import org.apache.tuscany.sca.node.configuration.NodeConfiguration; +import org.apache.tuscany.sca.node.configuration.NodeConfigurationFactory; + +/** + * The factory to create java models related to the node configuration + */ +public class NodeConfigurationFactoryImpl implements NodeConfigurationFactory { + /** + * Create a new instance of NodeConfiguration + * @return + */ + public NodeConfiguration createNodeConfiguration() { + return new NodeConfigurationImpl(); + } + + /** + * Create a new instance of ContributionConfiguration + * @return + */ + public ContributionConfiguration createContributionConfiguration() { + return new ContributionConfigurationImpl(); + } + + /** + * Create a new instance of BindingConfiguration + * @return + */ + public BindingConfiguration createBindingConfiguration() { + return new BindingConfigurationImpl(); + } + + /** + * Create a new instance of DeploymentComposite + * @return + */ + public DeploymentComposite createDeploymentComposite() { + return new DeploymentCompositeImpl(); + } +} diff --git a/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/impl/NodeConfigurationImpl.java b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/impl/NodeConfigurationImpl.java new file mode 100644 index 0000000000..baf6e669e7 --- /dev/null +++ b/sca-java-2.x/branches/sca-java-2.0-M3/modules/node-api/src/main/java/org/apache/tuscany/sca/node/configuration/impl/NodeConfigurationImpl.java @@ -0,0 +1,154 @@ +/* + * 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.node.configuration.impl; + +import java.io.InputStream; +import java.io.Reader; +import java.net.URI; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; + +import javax.xml.namespace.QName; + +import org.apache.tuscany.sca.node.configuration.BindingConfiguration; +import org.apache.tuscany.sca.node.configuration.ContributionConfiguration; +import org.apache.tuscany.sca.node.configuration.NodeConfiguration; + +/** + * Default implementation of NodeConfiguration + */ +public class NodeConfigurationImpl implements NodeConfiguration { + private String uri = DEFAULT_NODE_URI; + private String domainURI = DEFAULT_DOMAIN_URI; + private List contributions = new ArrayList(); + private List bindings = new ArrayList(); + private List extensions =new ArrayList(); + + public String getURI() { + return uri; + } + + public NodeConfiguration setURI(String uri) { + this.uri = uri; + return this; + } + + public String getDomainURI() { + return domainURI; + } + + public NodeConfiguration setDomainURI(String domainURI) { + this.domainURI = domainURI; + return this; + } + + public List getContributions() { + return contributions; + } + + public List getBindings() { + return bindings; + } + + public NodeConfiguration addBinding(BindingConfiguration bindingConfiguration) { + bindings.add(bindingConfiguration); + return this; + } + + public NodeConfiguration addContribution(ContributionConfiguration contributionConfiguration) { + contributions.add(contributionConfiguration); + return this; + } + + public NodeConfiguration addBinding(QName bindingType, String... baseURIs) { + BindingConfiguration binding = new BindingConfigurationImpl().setBindingType(bindingType); + for (String u : baseURIs) { + binding.addBaseURI(u); + } + return addBinding(binding); + } + + public NodeConfiguration addBinding(QName bindingType, URI... baseURIs) { + BindingConfiguration binding = new BindingConfigurationImpl().setBindingType(bindingType); + for (URI u : baseURIs) { + binding.addBaseURI(u.toString()); + } + return addBinding(binding); + } + + public NodeConfiguration addContribution(String contributionURI, String location) { + ContributionConfiguration contribution = new ContributionConfigurationImpl(contributionURI, location); + return addContribution(contribution); + } + + public NodeConfiguration addContribution(String contributionURI, URL location) { + return addContribution(contributionURI, location.toString()); + } + + public NodeConfiguration addContribution(URI contributionURI, URL location) { + return addContribution(contributionURI.toString(), location.toString()); + } + + public NodeConfiguration addContribution(URL... locations) { + for (URL url : locations) { + ContributionConfiguration contribution = new ContributionConfigurationImpl(url.toString(), url.toString()); + addContribution(contribution); + } + return this; + } + + public NodeConfiguration addDeploymentComposite(String contributionURI, InputStream content) { + findContribution(contributionURI).addDeploymentComposite(content); + return this; + } + + public NodeConfiguration addDeploymentComposite(String contributionURI, Reader content) { + findContribution(contributionURI).addDeploymentComposite(content); + return this; + } + + public NodeConfiguration addDeploymentComposite(String contributionURI, String location) { + findContribution(contributionURI).addDeploymentComposite(URI.create(location)); + return this; + } + + private ContributionConfiguration findContribution(String uri) { + for (ContributionConfiguration c : contributions) { + if (c.getURI() != null && c.getURI().equals(uri)) { + return c; + } + } + throw new IllegalArgumentException("Contribution is not found (uri=" + uri + ")"); + } + + public String toString() { + if (domainURI != null) { + return "{" + domainURI + "}" + uri; + } else { + return uri; + } + } + + public List getExtensions() { + return extensions; + } + +} -- cgit v1.2.3