blob: f95f74ab2cc361b8356bf2bbf8f45fd5077cc1cb [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.workspace.manager.impl;
import java.io.File;
import java.net.URI;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.tuscany.sca.contribution.Contribution;
import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
import org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor;
import org.apache.tuscany.sca.contribution.processor.URLArtifactProcessorExtensionPoint;
import org.apache.tuscany.sca.contribution.resolver.ExtensibleModelResolver;
import org.apache.tuscany.sca.core.ExtensionPointRegistry;
import org.apache.tuscany.sca.core.UtilityExtensionPoint;
import org.apache.tuscany.sca.host.embedded.impl.ReallySmallRuntime;
import org.apache.tuscany.sca.monitor.Monitor;
import org.apache.tuscany.sca.monitor.MonitorFactory;
import org.apache.tuscany.sca.monitor.Problem;
import org.apache.tuscany.sca.monitor.Problem.Severity;
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.manager.WorkspaceManager;
import org.osoa.sca.ServiceRuntimeException;
/**
* This workspace manager class provides an SPI for firing up the Tuscany runtime
* and for providing access to the Tuscany ExtensionPointRegsitry. With a reference to the
* registry you can add new extension points programmatically before starting the runtime.
* Once the runtime is started you can read contributions, create a workspace, populate it
* and then resolve it.
*
* A workspace is a collection of contributions. A workspace populated
* with one or more contribution models can be resolved to ensure
* that all referenced artifacts are located. When more than one contribution
* model is present resolution takes into account the import and export relationships
* between contributions.
*/
public class WorkspaceManagerImpl extends WorkspaceManager {
private ReallySmallRuntime runtime;
private ModelFactoryExtensionPoint modelFactories;
private URLArtifactProcessorExtensionPoint artifactProcessorExtensions;
private UtilityExtensionPoint utilities;
private WorkspaceFactory workspaceFactory;
private URLArtifactProcessor<Contribution> contributionProcessor;
private ContributionDependencyBuilder contributionDependencyBuilder;
private MonitorFactory monitorFactory;
private Monitor monitor;
public WorkspaceManagerImpl() throws ServiceRuntimeException{
try {
runtime = new ReallySmallRuntime(Thread.currentThread().getContextClassLoader());
ExtensionPointRegistry registry = getRegistry();
modelFactories = registry.getExtensionPoint(ModelFactoryExtensionPoint.class);
artifactProcessorExtensions = registry.getExtensionPoint(URLArtifactProcessorExtensionPoint.class);
utilities = registry.getExtensionPoint(UtilityExtensionPoint.class);
workspaceFactory = modelFactories.getFactory(WorkspaceFactory.class);
contributionProcessor = artifactProcessorExtensions.getProcessor(Contribution.class);
monitorFactory = utilities.getUtility(MonitorFactory.class);
monitor = monitorFactory.createMonitor();
contributionDependencyBuilder = new ContributionDependencyBuilderImpl(monitor);
} catch(Exception ex) {
throw new ServiceRuntimeException(ex);
}
}
public ExtensionPointRegistry getRegistry(){
return runtime.getExtensionPointRegistry();
}
public void start() throws ServiceRuntimeException {
try {
runtime.start();
} catch(Exception ex) {
throw new ServiceRuntimeException(ex);
}
}
public void stop() throws ServiceRuntimeException{
try {
runtime.stop();
} catch(Exception ex) {
throw new ServiceRuntimeException(ex);
}
}
public Workspace createWorkspace(){
Workspace workspace = workspaceFactory.createWorkspace();
workspace.setModelResolver(new ExtensibleModelResolver(workspace, getRegistry()));
return workspace;
}
public Contribution readContribution(String name, String location) throws ServiceRuntimeException{
try {
Contribution returnContribution =
contributionProcessor.read(null,
URI.create(name),
new File(location).toURI().toURL());
analyzeProblems();
return returnContribution;
} catch (Exception ex) {
throw new ServiceRuntimeException(ex);
}
}
public void addContributionToWorkspace(Workspace workspace, Contribution contribution) throws ServiceRuntimeException{
try {
workspace.getContributions().add(contribution);
} catch (Exception ex) {
throw new ServiceRuntimeException(ex);
}
}
public void resolveWorkspace(Workspace workspace) throws ServiceRuntimeException {
try {
// an algorithm to resolve contributions given their dependencies
// need to look at the one from 2.x as this one expects contributions
// to be presented in the right order
Set<Contribution> resolved = new HashSet<Contribution>();
for (Contribution contribution: workspace.getContributions()) {
List<Contribution> dependencies = contributionDependencyBuilder.buildContributionDependencies(contribution, workspace);
// Resolve contributions
for (Contribution dependency: dependencies) {
if (!resolved.contains(dependency)) {
resolved.add(dependency);
contributionProcessor.resolve(contribution, workspace.getModelResolver());
}
}
}
analyzeProblems();
} catch (Exception ex) {
throw new ServiceRuntimeException(ex);
}
}
private void analyzeProblems() throws Exception {
for (Problem problem : monitor.getProblems()) {
if ((problem.getSeverity() == Severity.ERROR) && (!problem.getMessageId().equals("SchemaError"))) {
if (problem.getCause() != null) {
throw problem.getCause();
} else {
throw new ServiceRuntimeException(problem.toString());
}
}
}
}
}