diff options
Diffstat (limited to 'sca-java-2.x/trunk/modules/domain-node/src/main')
6 files changed, 86 insertions, 277 deletions
diff --git a/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/TuscanyRuntime.java b/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/TuscanyRuntime.java index cb26509b44..7ce919799b 100644 --- a/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/TuscanyRuntime.java +++ b/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/TuscanyRuntime.java @@ -49,6 +49,10 @@ import org.apache.tuscany.sca.runtime.RuntimeProperties; import org.apache.tuscany.sca.work.WorkScheduler; import org.oasisopen.sca.ServiceRuntimeException; +/** + * The TuscanyRuntime is the main class for using Tuscany. It can create Nodes, + * run composites, and provides access to various utility APIs + */ public class TuscanyRuntime { private Deployer deployer; @@ -57,9 +61,19 @@ public class TuscanyRuntime { private ExtensibleDomainRegistryFactory domainRegistryFactory; private RuntimeAssemblyFactory assemblyFactory; + /** + * Creates a new TuscanyRuntime + * @return a TuscanyRuntime + */ public static TuscanyRuntime newInstance() { return new TuscanyRuntime(null); } + + /** + * Creates a new TuscanyRuntime + * @param config Properties to configure the TuscanyRuntime + * @return a TuscanyRuntime + */ public static TuscanyRuntime newInstance(Properties config) { return new TuscanyRuntime(config); } @@ -85,6 +99,7 @@ public class TuscanyRuntime { * @param contributionURL URL of the contribution * @param dependentContributionURLs optional URLs of dependent contributions * @return a Node with installed contributions + * TODO: keep this helper method? Maybe say you should just create/use Node directly */ public static Node runComposite(TuscanyRuntime runtime, String compositeURI, String contributionURL, String... dependentContributionURLs) { try { @@ -116,10 +131,19 @@ public class TuscanyRuntime { init(config); } + /** + * Creates a Node + * @return a Node + */ public Node createNode() { return createNode(null); } + /** + * Creates a Node in an SCA domain + * @param domainURI the URI of the SCA domain + * @return a Node + */ public Node createNode(String domainURI) { String domainName = "default"; if (domainURI != null){ @@ -129,6 +153,11 @@ public class TuscanyRuntime { return new NodeImpl(domainName, deployer, compositeActivator, endpointRegistry, extensionPointRegistry, null); } + /** + * Creates a Node from an XML configuration file + * @param configURL the URL to the XML configuration file + * @return Node the configured Node + */ public Node createNodeFromXML(String configURL) throws ContributionReadException, ActivationException, ValidationException { NodeConfiguration configuration = loadConfiguration(configURL); Node node = createNode(configuration.getDomainURI()); @@ -138,6 +167,9 @@ public class TuscanyRuntime { return node; } + /** + * Stop the TuscanyRuntime + */ public void stop() { extensionPointRegistry.stop(); } diff --git a/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/domain/node/DomainNode.java b/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/domain/node/DomainNode.java deleted file mode 100644 index 8a30cf2f71..0000000000 --- a/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/domain/node/DomainNode.java +++ /dev/null @@ -1,179 +0,0 @@ -/* - * 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.domain.node; - -import java.net.URI; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.tuscany.sca.assembly.Endpoint; -import org.apache.tuscany.sca.core.ExtensionPointRegistry; -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.impl.NodeImpl; -import org.apache.tuscany.sca.runtime.DomainRegistryFactory; -import org.apache.tuscany.sca.runtime.EndpointRegistry; -import org.apache.tuscany.sca.runtime.ExtensibleDomainRegistryFactory; -import org.oasisopen.sca.NoSuchDomainException; -import org.oasisopen.sca.NoSuchServiceException; -import org.oasisopen.sca.client.SCAClientFactory; - -public class DomainNode { - - private static final String DEFAULT_DOMAIN_SCHEME = "vm"; - private static final String DEFAULT_DOMAIN_NAME = "defaultDomain"; - private static final String DEFAULT_CONFIG_URI = DEFAULT_DOMAIN_SCHEME + "://" + DEFAULT_DOMAIN_NAME; - - private String domainName; - private String domainRegistryURI; - - private Map<String, Node> nodes = new HashMap<String, Node>(); - - public DomainNode() { - this(DEFAULT_CONFIG_URI, new String[]{}); - } - - public DomainNode(String... contributionLocations) { - this(DEFAULT_CONFIG_URI, contributionLocations); - } - - public DomainNode(String configURI, String[] contributionLocations) { - this.domainRegistryURI = configURI; - initDomainName(configURI); - if (contributionLocations == null || contributionLocations.length == 0) { - addContribution(null, "_null"); - } else { - for (String loc : contributionLocations) { - addContribution(loc); - } - } - } - - public void stop() { - for (Node node : nodes.values()) { - node.stop(); - } - } - - public String addContribution(String location) { - String uri = location; - addContribution(uri, location); - return uri; - } - - public void addContribution(String location, String uri) { - if (nodes.containsKey(uri)) { - throw new IllegalArgumentException("contribution already added: " + uri); - } - NodeConfiguration configuration = NodeFactory.getInstance().createNodeConfiguration(); - if (location != null) { - configuration.addContribution(uri, location); - } - configuration.setDomainRegistryURI(domainRegistryURI); - configuration.setDomainURI(domainName); - configuration.setURI(uri); //??? - Node node = NodeFactory.getInstance().createNode(configuration).start(); - nodes.put(uri, node); - } - - public void removeContribution(String uri) { - if (!nodes.containsKey(uri)) { - throw new IllegalArgumentException("contribution not found: " + uri); - } - Node node = nodes.remove(uri); - node.stop(); - } - - public String getDomainName() { - return domainName; - } - - public String getDomainConfigURI() { - return domainRegistryURI; - } - - public List<String> getServiceNames() { - List<String> serviceNames = new ArrayList<String>(); - if (nodes.size() > 0) { - ExtensionPointRegistry extensionsRegistry = ((NodeImpl)nodes.values().iterator().next()).getExtensionPointRegistry(); - DomainRegistryFactory domainRegistryFactory = ExtensibleDomainRegistryFactory.getInstance(extensionsRegistry); - EndpointRegistry endpointRegistry = domainRegistryFactory.getEndpointRegistry(getDomainConfigURI(), getDomainName()); - for (Endpoint endpoint : endpointRegistry.getEndpoints()) { - // Would be nice if Endpoint.getURI() returned this: - String name = endpoint.getComponent().getName() + "/" + endpoint.getService().getName(); - if (endpoint.getBinding() != null) { - // TODO: shouldn't the binding name be null if its not explicitly specified? - // For now don't include it if the same as the default - if (!endpoint.getService().getName().equals(endpoint.getBinding().getName())) { - name += "/" + endpoint.getBinding().getName(); - } - } - serviceNames.add(name); - } - } - return serviceNames; - } - - public <T> T getService(Class<T> interfaze, String uri) throws NoSuchServiceException { - try { - return SCAClientFactory.newInstance(URI.create(getDomainName())).getService(interfaze, uri); - } catch (NoSuchDomainException e) { - throw new IllegalStateException(e); - } - } - - protected void initDomainName(String configURI) { -// URI uri = URI.create(fixScheme(configURI)); -// String dn = uri.getHost(); -// if (dn == null || dn.length() < 1) { -// dn = DEFAULT_DOMAIN_NAME; -// } - if (configURI.startsWith("tuscany:vm:")) { - domainName = configURI.substring("tuscany:vm:".length()); - } else if (configURI.startsWith("tuscany:")) { - int i = configURI.indexOf('?'); - if (i == -1) { - domainName = configURI.substring("tuscany:".length()); - } else{ - domainName = configURI.substring("tuscany:".length(), i); - } - } else { - domainName = configURI; - } - } - - /** - * I keep typing the scheme part with just a colon instead of colon slash slash - * which URI doesn't parse properly which irritates me so fix it up here - */ - protected String fixScheme(String uri) { - int i = uri.indexOf(":"); - if (i > -1 && uri.charAt(i+1) != '/') { - uri = uri.replaceFirst(":", ":/"); - } - if (i > -1 && uri.charAt(i+2) != '/') { - uri = uri.replaceFirst(":/", "://"); - } - return uri; - } -} diff --git a/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/domain/node/DomainNodeMain.java b/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/domain/node/DomainNodeMain.java deleted file mode 100644 index 0d9f4172f2..0000000000 --- a/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/domain/node/DomainNodeMain.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * 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.domain.node; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import org.apache.tuscany.sca.node.Node; -import org.apache.tuscany.sca.node.NodeFactory; - -public class DomainNodeMain { - - /** - * Start an SCA domain node - * @param args a list of contribution jars for the node to run - */ - public static void main(String[] args) throws Exception { - - String configURI = "uri:default"; - - List<String> contributions = new ArrayList<String>(); - for (int i = 0; i < args.length; i++) { - if (args[i].startsWith("vm:") || args[i].startsWith("tribes:") || args[i].startsWith("tuscany:") || args[i].startsWith("uri:") || args[i].startsWith("properties:")) { - configURI = args[i]; - } else{ - File f = new File(args[i]); - if (!f.exists()) { - System.err.println("contribution not found: " + f); - System.exit(1); - } - contributions.add(f.toURI().toString()); - } - } - - Node node = NodeFactory.newInstance(configURI).createNode((String)null, contributions.toArray(new String[contributions.size()])); - node.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(); - } -} diff --git a/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/impl/DeployedComposite.java b/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/impl/DeployedComposite.java index 6788f29ca5..c82fc3a81c 100644 --- a/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/impl/DeployedComposite.java +++ b/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/impl/DeployedComposite.java @@ -52,6 +52,7 @@ public class DeployedComposite { private Deployer deployer; private EndpointRegistry endpointRegistry; private ExtensionPointRegistry extensionPointRegistry; + private Contribution systemContribution; public DeployedComposite(Composite composite, InstalledContribution ic, @@ -83,18 +84,14 @@ public class DeployedComposite { contribution.get(0).getDeployables().clear(); contribution.get(0).getDeployables().add(composite); + Monitor monitor = deployer.createMonitor(); -// TODO: is the ContextMonitor neccessary here? -// Monitor tcm = monitorFactory.setContextMonitor(monitor); -// try { - - domainComposite = deployer.build(contribution, dependedOnContributions, new HashMap<QName, List<String>>(), monitor); - monitor.analyzeProblems(); + if (systemContribution == null) { + this.systemContribution = deployer.cloneSystemContribution(monitor); + } + domainComposite = deployer.build(contribution, dependedOnContributions, systemContribution, new HashMap<QName, List<String>>(), monitor); + monitor.analyzeProblems(); -// } finally { -// monitorFactory.setContextMonitor(tcm); -// } - compositeContext = new CompositeContext(extensionPointRegistry, endpointRegistry, domainComposite, @@ -102,13 +99,17 @@ public class DeployedComposite { null, // don't need node uri deployer.getSystemDefinitions()); - compositeActivator.activate(compositeContext, domainComposite); - compositeActivator.start(compositeContext, domainComposite); + start(); this.uri = getCompositeURI(composite, installedContribution); } - public void unDeploy() throws ActivationException { + public void start() throws ActivationException { + compositeActivator.activate(compositeContext, domainComposite); + compositeActivator.start(compositeContext, domainComposite); + } + + public void stop() throws ActivationException { compositeActivator.stop(compositeContext, domainComposite); compositeActivator.deactivate(domainComposite); } diff --git a/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/impl/InstalledContribution.java b/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/impl/InstalledContribution.java index 5137605067..750a13f81a 100644 --- a/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/impl/InstalledContribution.java +++ b/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/impl/InstalledContribution.java @@ -20,10 +20,13 @@ package org.apache.tuscany.sca.impl; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.apache.tuscany.sca.assembly.Composite; import org.apache.tuscany.sca.contribution.Contribution; +import org.apache.tuscany.sca.runtime.ActivationException; public class InstalledContribution { @@ -31,7 +34,8 @@ public class InstalledContribution { private String url; private Contribution contribution; private List<Composite> defaultDeployables = new ArrayList<Composite>(); - private List<DeployedComposite> deployedComposites = new ArrayList<DeployedComposite>(); + private List<DeployedComposite> startededComposites = new ArrayList<DeployedComposite>(); + private Map<String, DeployedComposite> stoppedComposites = new HashMap<String, DeployedComposite>(); private List<String> dependentContributionURIs; public InstalledContribution(String uri, String url, Contribution contribution, List<String> dependentContributionURIs) { @@ -57,9 +61,33 @@ public class InstalledContribution { return defaultDeployables; } public List<DeployedComposite> getDeployedComposites() { - return deployedComposites; + return startededComposites; } public List<String> getDependentContributionURIs() { return dependentContributionURIs; } + public void stop(String compositeURI) throws ActivationException { + for (DeployedComposite dc : getDeployedComposites()) { + if (compositeURI.equals(dc.getURI())) { + getDeployedComposites().remove(dc); + dc.stop(); + stoppedComposites.put(compositeURI, dc); + return; + } + } + throw new IllegalStateException("composite not deployed: " + compositeURI); + } + + public void start(DeployedComposite composite) { + startededComposites.add(composite); + } + + public boolean restart(String compositeURI) throws ActivationException { + DeployedComposite dc = stoppedComposites.remove(compositeURI); + if (dc != null) { + dc.start(); + startededComposites.add(dc); + } + return dc != null; + } } diff --git a/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/impl/NodeImpl.java b/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/impl/NodeImpl.java index c3b6739ca8..2e0c4fea02 100644 --- a/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/impl/NodeImpl.java +++ b/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/impl/NodeImpl.java @@ -188,13 +188,15 @@ public class NodeImpl implements Node { if (ic == null) { throw new IllegalArgumentException("Contribution not installed: " + contributionURI); } - for (Artifact a : ic.getContribution().getArtifacts()) { - if (a.getURI().equals(compositeURI)) { - startComposite((Composite) a.getModel(), ic); - return; + if (!ic.restart(compositeURI)) { + for (Artifact a : ic.getContribution().getArtifacts()) { + if (a.getURI().equals(compositeURI)) { + startComposite((Composite) a.getModel(), ic); + return; + } } + throw new IllegalArgumentException("composite not found: " + compositeURI); } - throw new IllegalArgumentException("composite not found: " + compositeURI); } @Override @@ -203,14 +205,7 @@ public class NodeImpl implements Node { if (ic == null) { throw new IllegalArgumentException("Contribution not installed: " + contributionURI); } - for (DeployedComposite dc : ic.getDeployedComposites()) { - if (compositeURI.equals(dc.getURI())) { - ic.getDeployedComposites().remove(dc); - dc.unDeploy(); - return; - } - } - throw new IllegalStateException("composite not deployed: " + compositeURI); + ic.stop(compositeURI); } public Composite getDomainLevelComposite() { @@ -238,7 +233,7 @@ public class NodeImpl implements Node { } installedContributions.remove(contributionURI); for (DeployedComposite dc : ic.getDeployedComposites()) { - dc.unDeploy(); + dc.stop(); } ic.getDeployedComposites().clear(); } @@ -447,9 +442,8 @@ public class NodeImpl implements Node { protected void startComposite(Composite c, InstalledContribution ic) throws ActivationException, ValidationException { List<Contribution> dependentContributions = calculateDependentContributions(ic); - DeployedComposite dc = new DeployedComposite(c, ic, dependentContributions, deployer, compositeActivator, endpointRegistry, extensionPointRegistry); - ic.getDeployedComposites().add(dc); + ic.start(dc); } public Set<String> getDependentContributions(String contributionURI) { |