summaryrefslogtreecommitdiffstats
path: root/sca-java-1.x/branches/sca-java-1.6.2/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/CompositeConfigurationServiceImpl.java
diff options
context:
space:
mode:
Diffstat (limited to 'sca-java-1.x/branches/sca-java-1.6.2/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/CompositeConfigurationServiceImpl.java')
-rw-r--r--sca-java-1.x/branches/sca-java-1.6.2/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/CompositeConfigurationServiceImpl.java657
1 files changed, 657 insertions, 0 deletions
diff --git a/sca-java-1.x/branches/sca-java-1.6.2/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/CompositeConfigurationServiceImpl.java b/sca-java-1.x/branches/sca-java-1.6.2/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/CompositeConfigurationServiceImpl.java
new file mode 100644
index 0000000000..4178a2e8a0
--- /dev/null
+++ b/sca-java-1.x/branches/sca-java-1.6.2/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/CompositeConfigurationServiceImpl.java
@@ -0,0 +1,657 @@
+/*
+ * 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.manager.impl;
+
+import static org.apache.tuscany.sca.domain.manager.impl.DomainManagerUtil.compositeQName;
+import static org.apache.tuscany.sca.domain.manager.impl.DomainManagerUtil.contributionURI;
+import static org.apache.tuscany.sca.domain.manager.impl.DomainManagerUtil.locationURL;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Logger;
+
+import javax.servlet.Servlet;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamWriter;
+import javax.xml.transform.TransformerFactory;
+
+import org.apache.tuscany.sca.assembly.AssemblyFactory;
+import org.apache.tuscany.sca.assembly.Binding;
+import org.apache.tuscany.sca.assembly.Component;
+import org.apache.tuscany.sca.assembly.Composite;
+import org.apache.tuscany.sca.assembly.SCABindingFactory;
+import org.apache.tuscany.sca.assembly.builder.CompositeBuilder;
+import org.apache.tuscany.sca.assembly.builder.CompositeBuilderException;
+import org.apache.tuscany.sca.assembly.builder.impl.CompositeBuilderImpl;
+import org.apache.tuscany.sca.assembly.builder.impl.CompositeIncludeBuilderImpl;
+import org.apache.tuscany.sca.assembly.xml.CompositeDocumentProcessor;
+import org.apache.tuscany.sca.assembly.xml.Constants;
+import org.apache.tuscany.sca.contribution.Artifact;
+import org.apache.tuscany.sca.contribution.Contribution;
+import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
+import org.apache.tuscany.sca.contribution.processor.ExtensibleStAXArtifactProcessor;
+import org.apache.tuscany.sca.contribution.processor.ExtensibleURLArtifactProcessor;
+import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
+import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessorExtensionPoint;
+import org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor;
+import org.apache.tuscany.sca.contribution.processor.URLArtifactProcessorExtensionPoint;
+import org.apache.tuscany.sca.contribution.processor.ValidatingXMLInputFactory;
+import org.apache.tuscany.sca.contribution.resolver.DefaultModelResolver;
+import org.apache.tuscany.sca.contribution.resolver.ExtensibleModelResolver;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolverExtensionPoint;
+import org.apache.tuscany.sca.contribution.service.ContributionReadException;
+import org.apache.tuscany.sca.contribution.service.ContributionResolveException;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.core.UtilityExtensionPoint;
+import org.apache.tuscany.sca.data.collection.Entry;
+import org.apache.tuscany.sca.data.collection.Item;
+import org.apache.tuscany.sca.data.collection.LocalItemCollection;
+import org.apache.tuscany.sca.data.collection.NotFoundException;
+import org.apache.tuscany.sca.definitions.SCADefinitions;
+import org.apache.tuscany.sca.definitions.impl.SCADefinitionsImpl;
+import org.apache.tuscany.sca.definitions.util.SCADefinitionsUtil;
+import org.apache.tuscany.sca.implementation.node.NodeImplementation;
+import org.apache.tuscany.sca.implementation.node.builder.impl.NodeCompositeBuilderImpl;
+import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper;
+import org.apache.tuscany.sca.monitor.Monitor;
+import org.apache.tuscany.sca.monitor.MonitorFactory;
+import org.apache.tuscany.sca.monitor.MonitorRuntimeException;
+import org.apache.tuscany.sca.monitor.Problem;
+import org.apache.tuscany.sca.monitor.Problem.Severity;
+import org.apache.tuscany.sca.policy.Intent;
+import org.apache.tuscany.sca.policy.IntentAttachPointType;
+import org.apache.tuscany.sca.policy.IntentAttachPointTypeFactory;
+import org.apache.tuscany.sca.policy.PolicySet;
+import org.apache.tuscany.sca.provider.SCADefinitionsProvider;
+import org.apache.tuscany.sca.provider.SCADefinitionsProviderExtensionPoint;
+import org.apache.tuscany.sca.workspace.Workspace;
+import org.apache.tuscany.sca.workspace.WorkspaceFactory;
+import org.apache.tuscany.sca.workspace.builder.ContributionDependencyBuilder;
+import org.apache.tuscany.sca.workspace.builder.impl.ContributionDependencyBuilderImpl;
+import org.apache.tuscany.sca.workspace.processor.impl.ContributionContentProcessor;
+import org.osoa.sca.ServiceRuntimeException;
+import org.osoa.sca.annotations.Init;
+import org.osoa.sca.annotations.Reference;
+import org.osoa.sca.annotations.Scope;
+import org.osoa.sca.annotations.Service;
+
+/**
+ * Implementation of a service that returns a fully configured composite.
+ *
+ * @version $Rev$ $Date$
+ */
+@Scope("COMPOSITE")
+@Service(Servlet.class)
+public class CompositeConfigurationServiceImpl extends HttpServlet implements Servlet {
+ private static final long serialVersionUID = -8809641932774129152L;
+
+ private static final Logger logger = Logger.getLogger(CompositeConfigurationServiceImpl.class.getName());
+
+ @Reference
+ public LocalItemCollection contributionCollection;
+
+ @Reference
+ public LocalItemCollection domainCompositeCollection;
+
+ @Reference
+ public DomainManagerConfiguration domainManagerConfiguration;
+
+ @Reference
+ public LocalItemCollection cloudCollection;
+
+ private ExtensionPointRegistry extensionPoints;
+ private ModelFactoryExtensionPoint modelFactories;
+ private ModelResolverExtensionPoint modelResolvers;
+ private AssemblyFactory assemblyFactory;
+ private WorkspaceFactory workspaceFactory;
+ private URLArtifactProcessor<Contribution> contributionProcessor;
+ private StAXArtifactProcessorExtensionPoint staxProcessors;
+ private StAXArtifactProcessor<Composite> compositeProcessor;
+ private XMLOutputFactory outputFactory;
+ private ContributionDependencyBuilder contributionDependencyBuilder;
+ private CompositeBuilder compositeIncludeBuilder;
+ private CompositeBuilder nodeConfigurationBuilder;
+ private Monitor monitor;
+ private List<SCADefinitions> policyDefinitions;
+ private ModelResolver policyDefinitionsResolver;
+ private SCABindingFactory scaBindingFactory;
+ private IntentAttachPointTypeFactory intentAttachPointTypeFactory;
+ private DocumentBuilderFactory documentBuilderFactory;
+ private TransformerFactory transformerFactory;
+ private InterfaceContractMapper contractMapper;
+ private Map<Binding, Binding> bindingMap;
+
+ /**
+ * Initialize the component.
+ */
+ @Init
+ public void initialize() throws ParserConfigurationException {
+
+ extensionPoints = domainManagerConfiguration.getExtensionPoints();
+
+ // Create a monitor
+ UtilityExtensionPoint utilities = extensionPoints.getExtensionPoint(UtilityExtensionPoint.class);
+ MonitorFactory monitorFactory = utilities.getUtility(MonitorFactory.class);
+ monitor = monitorFactory.createMonitor();
+
+ // Get model factories
+ modelFactories = extensionPoints.getExtensionPoint(ModelFactoryExtensionPoint.class);
+ assemblyFactory = modelFactories.getFactory(AssemblyFactory.class);
+ XMLInputFactory inputFactory = modelFactories.getFactory(XMLInputFactory.class);
+ outputFactory = modelFactories.getFactory(XMLOutputFactory.class);
+ outputFactory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, true);
+ workspaceFactory = modelFactories.getFactory(WorkspaceFactory.class);
+
+ // Get and initialize artifact processors
+ staxProcessors = extensionPoints.getExtensionPoint(StAXArtifactProcessorExtensionPoint.class);
+ compositeProcessor = (StAXArtifactProcessor<Composite>)staxProcessors.getProcessor(Composite.class);
+ StAXArtifactProcessor<Object> staxProcessor = new ExtensibleStAXArtifactProcessor(staxProcessors, inputFactory, outputFactory, monitor);
+
+ URLArtifactProcessorExtensionPoint urlProcessors = extensionPoints.getExtensionPoint(URLArtifactProcessorExtensionPoint.class);
+ URLArtifactProcessor<Object> urlProcessor = new ExtensibleURLArtifactProcessor(urlProcessors, monitor);
+ policyDefinitionsResolver = new DefaultModelResolver();
+ policyDefinitions = new ArrayList<SCADefinitions>();
+
+ // The following was copied from RuntimeBuilder to fix TUSCANY-3171
+ XMLInputFactory validatingInputFactory = modelFactories.getFactory(ValidatingXMLInputFactory.class);
+ documentBuilderFactory = modelFactories.getFactory(DocumentBuilderFactory.class);
+ //documentBuilderFactory.setNamespaceAware(true);
+ urlProcessors.getProcessor(Composite.class);
+ urlProcessors.addArtifactProcessor(new CompositeDocumentProcessor(staxProcessor, validatingInputFactory,
+ documentBuilderFactory, policyDefinitions, monitor));
+
+ // Create contribution processor
+ modelResolvers = extensionPoints.getExtensionPoint(ModelResolverExtensionPoint.class);
+ contributionProcessor = new ContributionContentProcessor(extensionPoints, monitor, policyDefinitionsResolver, policyDefinitions);
+
+ // Create contribution and composite builders
+ transformerFactory = modelFactories.getFactory(TransformerFactory.class);
+ contributionDependencyBuilder = new ContributionDependencyBuilderImpl(monitor);
+ scaBindingFactory = modelFactories.getFactory(SCABindingFactory.class);
+ intentAttachPointTypeFactory = modelFactories.getFactory(IntentAttachPointTypeFactory.class);
+ contractMapper = utilities.getUtility(InterfaceContractMapper.class);
+ compositeIncludeBuilder = new CompositeIncludeBuilderImpl(monitor);
+ bindingMap = new HashMap<Binding, Binding>();
+ nodeConfigurationBuilder = new NodeCompositeBuilderImpl(assemblyFactory, scaBindingFactory, documentBuilderFactory,
+ transformerFactory, contractMapper, null, monitor, bindingMap);
+
+ // Load the definitions.xml
+ loadSCADefinitions(extensionPoints);
+ }
+
+ @Override
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+
+ // Get the request path
+ String path = URLDecoder.decode(request.getRequestURI().substring(request.getServletPath().length()), "UTF-8");
+ String key;
+ if (path.startsWith("/")) {
+ if (path.length() > 1) {
+ key = path.substring(1);
+ } else {
+ key ="";
+ }
+ } else {
+ key =path;
+ }
+ logger.fine("get " + key);
+
+ // Expect a key in the form composite:contributionURI;namespace;localName or
+ // a path in the form componentName/componentName/...
+ // and return the corresponding resolved composite
+ String requestedContributionURI = null;
+ QName requestedCompositeName = null;
+ String[] requestedComponentPath = null;
+ if (key.startsWith("composite:")) {
+
+ // Extract the composite qname from the key
+ requestedContributionURI = contributionURI(key);
+ requestedCompositeName = compositeQName(key);
+
+ } else if (key.length() != 0) {
+
+ // Extract the path to the requested component from the key
+ requestedComponentPath = key.split("/");
+ }
+
+ // Somewhere to store the composite we expect to write out at the end
+ Composite requestedComposite = null;
+
+ // Create a domain composite model
+ Composite domainComposite = assemblyFactory.createComposite();
+ domainComposite.setName(new QName(Constants.SCA10_TUSCANY_NS, "domain"));
+
+ // Get the domain composite items
+ Entry<String, Item>[] domainEntries = domainCompositeCollection.getAll();
+
+ // Populate the domain composite
+ Workspace workspace = workspaceFactory.createWorkspace();
+ workspace.setModelResolver(new ExtensibleModelResolver(workspace, extensionPoints));
+
+ Map<String, Contribution> contributionMap = new HashMap<String, Contribution>();
+ for (Entry<String, Item> domainEntry: domainEntries) {
+
+ // Load the required contributions
+ String contributionURI = contributionURI(domainEntry.getKey());
+ Contribution contribution = contributionMap.get(contributionURI);
+ if (contribution == null) {
+
+ // The contribution has not been loaded yet, load it with all its dependencies
+ Entry<String, Item>[] entries = contributionCollection.query("alldependencies=" + contributionURI);
+ for (Entry<String, Item> entry: entries) {
+ Item dependencyItem = entry.getData();
+ String dependencyURI = entry.getKey();
+
+ if (!contributionMap.containsKey(dependencyURI)) {
+
+ // Read the contribution
+ Contribution dependency;
+ try {
+ String dependencyLocation = dependencyItem.getAlternate();
+ dependency = contribution(workspace, dependencyURI, dependencyLocation);
+ } catch (Exception e) {
+ if (contributionURI.equals(dependencyURI)) {
+ response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, getDescription(e));
+ return;
+ } else {
+ continue;
+ }
+ }
+ workspace.getContributions().add(dependency);
+ contributionMap.put(dependencyURI, dependency);
+
+ if (contributionURI.equals(entry.getKey())) {
+ contribution = dependency;
+ }
+ }
+ }
+ }
+
+ if (contribution == null) {
+ response.sendError(HttpServletResponse.SC_NOT_FOUND, contributionURI);
+ return;
+ }
+
+ // Find the specified deployable composite in the contribution
+ Composite deployable = null;
+ QName qn = compositeQName(domainEntry.getKey());
+ for (Composite d: contribution.getDeployables()) {
+ if (qn.equals(d.getName())) {
+ deployable = d;
+ break;
+ }
+ }
+ if (deployable == null) {
+ response.sendError(HttpServletResponse.SC_NOT_FOUND, qn.toString());
+ return;
+ }
+
+ // add the deployable composite to the domain composite
+ domainComposite.getIncludes().add(deployable);
+
+ // Fuse includes into the deployable composite
+ try {
+ compositeIncludeBuilder.build(deployable);
+ analyzeProblems();
+ } catch (Exception e) {
+ response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, getDescription(e));
+ return;
+ }
+
+ // Store away the requested composite
+ if (requestedCompositeName != null) {
+ if (requestedContributionURI.equals(contributionURI) && requestedCompositeName.equals(deployable.getName())){
+ requestedComposite = deployable;
+ }
+ }
+ }
+
+ // The requested composite was not found
+ if (requestedCompositeName != null && requestedComposite == null) {
+ response.sendError(HttpServletResponse.SC_NOT_FOUND, key);
+ return;
+ }
+
+ // Get the clouds composite
+ Composite cloudsComposite;
+ try {
+ cloudsComposite = cloud();
+ } catch (NotFoundException e) {
+ response.sendError(HttpServletResponse.SC_NOT_FOUND, e.getMessage());
+ return;
+ }
+
+ // configure the endpoints for each composite in the domain
+ List<Composite> domainIncludes = domainComposite.getIncludes();
+ for (int i = 0, n =domainIncludes.size(); i < n; i++) {
+ Composite composite = domainIncludes.get(i);
+ QName compositeName = composite.getName();
+ String contributionURI = contributionURI(domainEntries[i].getKey());
+
+ // find the node that will run this composite and the default
+ // bindings that it configures
+ Component nodeComponent = null;
+ QName nodeCompositeName = null;
+ for (Composite cloudComposite : cloudsComposite.getIncludes()) {
+ for (Component nc : cloudComposite.getComponents()) {
+ NodeImplementation nodeImplementation = (NodeImplementation)nc.getImplementation();
+ if (nodeImplementation.getComposite().getName().equals(compositeName) &&
+ nodeImplementation.getComposite().getURI().equals(contributionURI)) {
+ nodeImplementation.setComposite(composite);
+ nodeComponent = nc;
+ nodeCompositeName = cloudComposite.getName();
+ break;
+ }
+ }
+ }
+
+ if (nodeComponent != null) {
+ try {
+ Composite nodeComposite = assemblyFactory.createComposite();
+ nodeComposite.setName(nodeCompositeName);
+ nodeComposite.getComponents().add(nodeComponent);
+ nodeConfigurationBuilder.build(nodeComposite);
+ } catch (CompositeBuilderException e) {
+ throw new ServletException(e);
+ }
+ }
+ }
+
+ // Build the domain composite
+ SCADefinitions aggregatedDefinitions = new SCADefinitionsImpl();
+ for (SCADefinitions definition : policyDefinitions) {
+ SCADefinitionsUtil.aggregateSCADefinitions(definition, aggregatedDefinitions);
+ }
+ CompositeBuilder compositeBuilder = new CompositeBuilderImpl(assemblyFactory, null, scaBindingFactory,
+ intentAttachPointTypeFactory, documentBuilderFactory, transformerFactory,
+ contractMapper, aggregatedDefinitions, monitor, bindingMap);
+ try {
+ compositeBuilder.build(domainComposite);
+ analyzeProblems();
+ } catch (Exception e) {
+ response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, getDescription(e));
+ return;
+ }
+
+ // Return the requested composite
+ if (requestedComposite != null) {
+
+ // Rebuild the requested composite from the domain composite
+ // we have to reverse the flattening that went on when the domain
+ // composite was built
+ List<Component> tempComponentList = new ArrayList<Component>();
+ tempComponentList.addAll(requestedComposite.getComponents());
+ requestedComposite.getComponents().clear();
+ for (Component inputComponent : tempComponentList){
+ for (Component deployComponent : domainComposite.getComponents()){
+ if (deployComponent.getName().equals(inputComponent.getName())){
+ requestedComposite.getComponents().add(deployComponent);
+ }
+ }
+ }
+
+ } else if (requestedComponentPath != null) {
+
+ // If a component path was specified, walk the path to get to the requested
+ // component and the composite that implements it
+ Composite nestedComposite = domainComposite;
+ for (String componentName: requestedComponentPath) {
+ Component component = null;
+ for (Component c: nestedComposite.getComponents()) {
+ if (componentName.equals(c.getName())) {
+ component = c;
+ break;
+ }
+ }
+ if (component == null) {
+ response.sendError(HttpServletResponse.SC_NOT_FOUND, key);
+ return;
+ } else {
+ if (component.getImplementation() instanceof Composite) {
+ nestedComposite = (Composite)component.getImplementation();
+ } else {
+ response.sendError(HttpServletResponse.SC_NOT_FOUND, key);
+ return;
+ }
+ }
+ }
+
+ // Return the nested composite
+ requestedComposite = nestedComposite;
+
+ } else {
+
+
+ // Return the whole domain composite
+ requestedComposite = domainComposite;
+ }
+
+ // Write the composite in the requested format
+ StAXArtifactProcessor<Composite> processor;
+ String queryString = request.getQueryString();
+ if (queryString != null && queryString.startsWith("format=")) {
+ String format = queryString.substring(7);
+ int s = format.indexOf(';');
+ QName formatName = new QName(format.substring(0, s), format.substring(s +1));
+ processor = (StAXArtifactProcessor<Composite>)staxProcessors.getProcessor(formatName);
+ if (processor == null) {
+ response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, new IllegalArgumentException(queryString).toString());
+ return;
+ }
+ } else {
+ processor = compositeProcessor;
+ }
+ try {
+ response.setContentType("text/xml");
+ XMLStreamWriter writer = outputFactory.createXMLStreamWriter(response.getOutputStream());
+ processor.write(requestedComposite, writer);
+ } catch (Exception e) {
+ response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.toString());
+ return;
+ }
+
+
+ }
+
+ /**
+ * Returns the cloud composite.
+ *
+ * @return the cloud composite
+ */
+ private Composite cloud() throws NotFoundException {
+
+ // Create a new composite for the clouds
+ Composite cloudComposite = assemblyFactory.createComposite();
+ cloudComposite.setName(new QName(Constants.SCA10_TUSCANY_NS, "cloud"));
+
+ // Get the collection of cloud composites
+ Entry<String, Item>[] cloudEntries = cloudCollection.getAll();
+
+ // Load the cloud contributions
+ Workspace workspace = workspaceFactory.createWorkspace();
+ Map<String, Contribution> contributionMap = new HashMap<String, Contribution>();
+ for (Entry<String, Item> cloudEntry: cloudEntries) {
+ String key = cloudEntry.getKey();
+ String contributionURI = contributionURI(key);
+
+ // Load the contribution
+ Contribution contribution = contributionMap.get(contributionURI);
+ if (contribution == null) {
+ Item contributionItem = contributionCollection.get(contributionURI);
+
+ // Read the contribution
+ try {
+ contribution = contribution(workspace, contributionURI, contributionItem.getAlternate());
+ } catch (ContributionReadException e) {
+ continue;
+ }
+ workspace.getContributions().add(contribution);
+ contributionMap.put(contributionURI, contribution);
+
+ }
+
+ // Include the cloud composite in the clouds composite
+ QName qname = compositeQName(key);
+ for (Artifact artifact : contribution.getArtifacts()) {
+ if (artifact.getModel() instanceof Composite) {
+ Composite composite = (Composite)artifact.getModel();
+ if (composite.getName().equals(qname)) {
+ cloudComposite.getIncludes().add(composite);
+ }
+ }
+ }
+ }
+
+ return cloudComposite;
+ }
+
+ /**
+ * Returns the contribution with the given URI.
+ *
+ * @param workspace
+ * @param contributionURI
+ * @param contributionLocation
+ * @return
+ * @throws NotFoundException
+ */
+ private Contribution contribution(Workspace workspace, String contributionURI, String contributionLocation) throws ContributionReadException {
+ try {
+ URI uri = URI.create(contributionURI);
+ URL location = locationURL(contributionLocation);
+
+ Contribution contribution = (Contribution)contributionProcessor.read(null, uri, location);
+ try {
+ analyzeProblems();
+ } catch (ServiceRuntimeException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new ContributionReadException(e);
+ }
+
+ // Resolve the contribution dependencies
+ contributionDependencyBuilder.buildContributionDependencies(contribution, workspace);
+
+ contributionProcessor.resolve(contribution, workspace.getModelResolver());
+ try {
+ analyzeProblems();
+ } catch (ServiceRuntimeException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new ContributionReadException(e);
+ }
+ return contribution;
+
+ } catch (ContributionReadException e) {
+ throw e;
+ } catch (ContributionResolveException e) {
+ throw new ContributionReadException(e);
+ } catch (MalformedURLException e) {
+ throw new ContributionReadException(e);
+ }
+ }
+
+ private void analyzeProblems() throws Exception {
+
+ for (Problem problem : monitor.getProblems()) {
+ if ((problem.getSeverity() == Severity.ERROR) && (!problem.getMessageId().equals("SchemaError"))) {
+ if (problem.getCause() != null) {
+ throw new ServiceRuntimeException(new MonitorRuntimeException(problem.getCause()));
+ } else {
+ throw new ServiceRuntimeException(new MonitorRuntimeException(problem.toString()));
+ }
+ }
+ }
+ }
+
+ private String getDescription(Exception e) {
+ if (e instanceof ServiceRuntimeException && e.getCause() instanceof MonitorRuntimeException) {
+ Throwable ce = e.getCause();
+ return ce.getCause() != null ? ce.getCause().toString() : ce.getMessage();
+ } else {
+ return e.toString();
+ }
+ }
+
+
+ /**
+ * The following code was copied from RuntimeBootStrapper to fix TUSCANY-3171
+ *
+ * @param registry
+ */
+ private void loadSCADefinitions(ExtensionPointRegistry registry) throws ParserConfigurationException {
+ try {
+ URLArtifactProcessorExtensionPoint documentProcessors =
+ registry.getExtensionPoint(URLArtifactProcessorExtensionPoint.class);
+ URLArtifactProcessor<SCADefinitions> definitionsProcessor =
+ documentProcessors.getProcessor(SCADefinitions.class);
+ SCADefinitionsProviderExtensionPoint scaDefnProviders =
+ registry.getExtensionPoint(SCADefinitionsProviderExtensionPoint.class);
+
+ SCADefinitions systemSCADefinitions = new SCADefinitionsImpl();
+ SCADefinitions aSCADefn = null;
+ for (SCADefinitionsProvider aProvider : scaDefnProviders.getSCADefinitionsProviders()) {
+ aSCADefn = aProvider.getSCADefinition();
+ SCADefinitionsUtil.aggregateSCADefinitions(aSCADefn, systemSCADefinitions);
+ }
+
+ policyDefinitions.add(systemSCADefinitions);
+
+ //we cannot expect that providers will add the intents and policysets into the resolver
+ //so we do this here explicitly
+ for (Intent intent : systemSCADefinitions.getPolicyIntents()) {
+ policyDefinitionsResolver.addModel(intent);
+ }
+
+ for (PolicySet policySet : systemSCADefinitions.getPolicySets()) {
+ policyDefinitionsResolver.addModel(policySet);
+ }
+
+ for (IntentAttachPointType attachPoinType : systemSCADefinitions.getBindingTypes()) {
+ policyDefinitionsResolver.addModel(attachPoinType);
+ }
+
+ for (IntentAttachPointType attachPoinType : systemSCADefinitions.getImplementationTypes()) {
+ policyDefinitionsResolver.addModel(attachPoinType);
+ }
+
+ //now that all system sca definitions have been read, lets resolve them right away
+ definitionsProcessor.resolve(systemSCADefinitions, policyDefinitionsResolver);
+ } catch (Exception e) {
+ throw new ServiceRuntimeException(e);
+ }
+ }
+
+}