blob: 40ea587684f090c37218fae5b0a8a7d68ab6d781 [file] [log] [blame]
/*
* 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.node2.impl;
import java.io.Reader;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamException;
import org.apache.tuscany.sca.assembly.Composite;
import org.apache.tuscany.sca.common.java.io.IOHelper;
import org.apache.tuscany.sca.contribution.Artifact;
import org.apache.tuscany.sca.contribution.Contribution;
import org.apache.tuscany.sca.contribution.ContributionMetadata;
import org.apache.tuscany.sca.contribution.processor.ContributionReadException;
import org.apache.tuscany.sca.core.ExtensionPointRegistry;
import org.apache.tuscany.sca.deployment.Deployer;
import org.apache.tuscany.sca.monitor.Monitor;
import org.apache.tuscany.sca.monitor.ValidationException;
import org.apache.tuscany.sca.node2.Node;
import org.apache.tuscany.sca.node2.NodeFactory;
import org.apache.tuscany.sca.runtime.ActivationException;
import org.apache.tuscany.sca.runtime.CompositeActivator;
import org.apache.tuscany.sca.runtime.EndpointRegistry;
import org.oasisopen.sca.NoSuchDomainException;
import org.oasisopen.sca.NoSuchServiceException;
import org.oasisopen.sca.client.SCAClientFactory;
public class NodeImpl implements Node {
private String domainName;
private Deployer deployer;
private Map<String, InstalledContribution> installedContributions = new HashMap<String, InstalledContribution>();
private CompositeActivator compositeActivator;
private EndpointRegistry endpointRegistry;
private ExtensionPointRegistry extensionPointRegistry;
private NodeFactory nodeFactory;
public NodeImpl(String domainName, Deployer deployer, CompositeActivator compositeActivator, EndpointRegistry endpointRegistry, ExtensionPointRegistry extensionPointRegistry, NodeFactory nodeFactory) {
this.domainName = domainName;
this.deployer = deployer;
this.compositeActivator = compositeActivator;
this.endpointRegistry = endpointRegistry;
this.extensionPointRegistry = extensionPointRegistry;
this.nodeFactory = nodeFactory;
}
public String installContribution(String contributionURL) throws ContributionReadException, ActivationException, ValidationException {
int lastDot = contributionURL.lastIndexOf('.');
int lastSep = contributionURL.lastIndexOf("/");
String uri;
if (lastDot > -1 && lastSep > -1 && lastDot > lastSep) {
uri = contributionURL.substring(lastSep+1, lastDot);
} else {
uri = contributionURL;
}
installContribution(uri, contributionURL, null, null, true);
return uri;
}
public void installContribution(String uri, String contributionURL, String metaDataURL, List<String> dependentContributionURIs, boolean runDeployables) throws ContributionReadException, ActivationException, ValidationException {
Monitor monitor = deployer.createMonitor();
Contribution contribution = deployer.loadContribution(IOHelper.createURI(uri), IOHelper.getLocationAsURL(contributionURL), monitor);
monitor.analyzeProblems();
if (metaDataURL != null) {
mergeContributionMetaData(metaDataURL, contribution);
}
installContribution(contribution, dependentContributionURIs, runDeployables);
}
private void mergeContributionMetaData(String metaDataURL, Contribution contribution) throws ValidationException {
ContributionMetadata metaData;
Monitor monitor = deployer.createMonitor();
try {
metaData = deployer.loadXMLDocument(IOHelper.getLocationAsURL(metaDataURL), monitor);
} catch (Exception e) {
throw new ValidationException(e);
}
monitor.analyzeProblems();
contribution.getDeployables().addAll(metaData.getDeployables());
contribution.getImports().addAll(metaData.getImports());
contribution.getExports().addAll(metaData.getExports());
}
public void installContribution(Contribution contribution, List<String> dependentContributionURIs, boolean runDeployables) throws ContributionReadException, ActivationException, ValidationException {
InstalledContribution ic = new InstalledContribution(contribution.getURI(), contribution.getLocation(), contribution, dependentContributionURIs);
installedContributions.put(contribution.getURI(), ic);
if (runDeployables) {
for (Composite c : ic.getDefaultDeployables()) {
runComposite(c, ic);
}
} else {
contribution.getDeployables().clear();
List<Contribution> dependentContributions = calculateDependentContributions(ic);
Monitor monitor = deployer.createMonitor();
try {
deployer.resolve(contribution, dependentContributions, monitor);
} catch (Exception e) {
throw new RuntimeException(e);
}
monitor.analyzeProblems();
}
}
protected List<Contribution> calculateDependentContributions(InstalledContribution ic) {
List<Contribution> dependentContributions = new ArrayList<Contribution>();
if (ic.getDependentContributionURIs() != null) {
// if the install specified dependent uris use just those contributions
for (String uri : ic.getDependentContributionURIs()) {
InstalledContribution dependee = installedContributions.get(uri);
if (dependee != null) {
dependentContributions.add(dependee.getContribution());
}
}
} else {
// otherwise use all available contributions for dependents
for (InstalledContribution ics : installedContributions.values()) {
dependentContributions.add(ics.getContribution());
}
}
return dependentContributions;
}
public String addDeploymentComposite(String contributionURI, Reader compositeXML) throws ContributionReadException, XMLStreamException, ActivationException, ValidationException {
Monitor monitor = deployer.createMonitor();
Composite composite = deployer.loadXMLDocument(compositeXML, monitor);
monitor.analyzeProblems();
return addDeploymentComposite(contributionURI, composite);
}
public String addDeploymentComposite(String contributionURI, Composite composite) throws ActivationException, ValidationException {
InstalledContribution ic = installedContributions.get(contributionURI);
if (ic == null) {
throw new IllegalArgumentException("contribution not installed: " + contributionURI);
}
String compositeArtifcatURI = deployer.attachDeploymentComposite(ic.getContribution(), composite, true);
runComposite(composite, ic);
return compositeArtifcatURI;
}
public void addToDomainLevelComposite(String compositeURI) throws ActivationException, ValidationException {
String contributionURI = getContributionUriForArtifact(compositeURI);
InstalledContribution ic = installedContributions.get(contributionURI);
if (ic == null) {
throw new IllegalArgumentException("Contribution not installed: " + contributionURI);
}
String relativeURI = compositeURI.substring(contributionURI.endsWith("/") ? contributionURI.length() : contributionURI.length()+1);
for (Artifact a : ic.getContribution().getArtifacts()) {
if (a.getURI().equals(relativeURI)) {
runComposite((Composite) a.getModel(), ic);
return;
}
}
throw new IllegalArgumentException("composite not found: " + compositeURI);
}
public void removeFromDomainLevelComposite(String compositeURI) throws ActivationException {
String contributionURI = getContributionUriForArtifact(compositeURI);
InstalledContribution ic = installedContributions.get(contributionURI);
String relativeURI = compositeURI.substring(contributionURI.length()+1);
for (DeployedComposite dc : ic.getDeployedComposites()) {
if (relativeURI.equals(dc.getURI())) {
ic.getDeployedComposites().remove(dc);
dc.unDeploy();
return;
}
}
throw new IllegalStateException("composite not deployed: " + compositeURI);
}
public Composite getDomainLevelComposite() {
// TODO Auto-generated method stub
return null;
}
public String getDomainLevelCompositeAsString() {
// TODO Auto-generated method stub
return null;
}
public Object getQNameDefinition(String contributionURI, QName definition, QName symbolSpace) {
// TODO Auto-generated method stub
return null;
}
public List<String> removeContribution(String contributionURI) throws ActivationException {
List<String> removedContributionURIs = new ArrayList<String>();
InstalledContribution ic = installedContributions.get(contributionURI);
if (ic != null) {
removedContributionURIs.add(ic.getURI());
for (String dependent : getDependentContributions(contributionURI)) {
removedContributionURIs.addAll(removeContribution(dependent));
}
installedContributions.remove(contributionURI);
for (DeployedComposite dc : ic.getDeployedComposites()) {
dc.unDeploy();
}
ic.getDeployedComposites().clear();
}
return removedContributionURIs;
}
public void updateContribution(String uri, String contributionURL) {
// TODO Auto-generated method stub
// is this just removeContribution/installContribution?
}
public void updateContribution(Contribution contribution) {
// TODO Auto-generated method stub
}
public String updateDeploymentComposite(String uri, Reader compositeXML) {
// TODO Auto-generated method stub
// is this removeFromDomainLevelComposite/addDeploymentComposite
return null;
}
public String updateDeploymentComposite(String uri, Composite composite) {
// TODO Auto-generated method stub
return null;
}
public void stop() {
ArrayList<String> ics = new ArrayList<String>(installedContributions.keySet());
for (String uri : ics) {
try {
removeContribution(uri);
} catch (Exception e) {
// TODO: log
e.printStackTrace();
}
}
if (nodeFactory != null) {
nodeFactory.stop();
}
}
public <T> T getService(Class<T> interfaze, String serviceURI) throws NoSuchServiceException {
try {
return SCAClientFactory.newInstance(URI.create(getDomainName())).getService(interfaze, serviceURI);
} catch (NoSuchDomainException e) {
// shouldn't ever happen as we know this is the domain so it must exist
throw new IllegalStateException(e);
}
}
public String getDomainName() {
return domainName;
}
public List<String> getDeployedCompostes(String contributionURI) {
ArrayList<String> compositeURIs = new ArrayList<String>();
InstalledContribution ic = installedContributions.get(contributionURI);
if (ic == null) {
throw new IllegalArgumentException("no contribution found for: " + contributionURI);
}
for (DeployedComposite dc : ic.getDeployedComposites()) {
compositeURIs.add(dc.getURI());
}
return compositeURIs;
}
public List<String> getInstalledContributions() {
return new ArrayList<String>(installedContributions.keySet());
}
public Contribution getInstalledContribution(String uri) {
if (installedContributions.containsKey(uri)) {
return installedContributions.get(uri).getContribution();
}
throw new IllegalArgumentException("no contribution found for: " + uri);
}
protected String getContributionUriForArtifact(String artifactURI) {
String contributionURI = null;
for (String uri : installedContributions.keySet()) {
if (artifactURI.startsWith(uri)) {
contributionURI = uri;
break;
}
}
if (contributionURI == null) {
throw new IllegalArgumentException("no contribution found for: " + artifactURI);
}
return contributionURI;
}
protected void runComposite(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);
}
public Set<String> getDependentContributions(String contributionURI) {
InstalledContribution ic = installedContributions.get(contributionURI);
if (ic == null) {
throw new IllegalArgumentException("Contribution not installed: " + contributionURI);
}
Set<String> dependentContributionURIs = new HashSet<String>();
for (InstalledContribution icx : installedContributions.values()) {
if (ic != icx) {
List<Contribution> dependencies = icx.getContribution().getDependencies();
if (dependencies != null && dependencies.contains(ic.getContribution())) {
dependentContributionURIs.addAll(getDependentContributions(icx.getURI()));
}
}
}
return dependentContributionURIs;
}
}