in modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/impl/ContributionContentProcessor.java [116:247]
public Contribution read(URL parentURL, URI contributionURI, URL contributionURL, ProcessorContext context)
throws ContributionReadException {
// Create contribution model
Contribution contribution = contributionFactory.createContribution();
contribution.setURI(contributionURI.toString());
if (contributionURL != null) {
contribution.setLocation(contributionURL.toString());
}
ModelResolver modelResolver = new ExtensibleModelResolver(contribution, modelResolvers, modelFactories);
contribution.setModelResolver(modelResolver);
contribution.setUnresolved(true);
Monitor monitor = context.getMonitor();
monitor.pushContext("Contribution: " + contribution.getURI());
Contribution old = context.setContribution(contribution);
try {
if (contributionURL != null) {
// Create a contribution scanner
ContributionScanner scanner = scanners.getContributionScanner(contributionURL.getProtocol());
if (scanner == null) {
File file = toFile(contributionURL);
if (file != null && file.isDirectory()) {
scanner = new DirectoryContributionScanner(contributionFactory);
} else {
scanner = new JarContributionScanner(contributionFactory);
}
}
// Scan the contribution and list the artifacts contained in it
boolean contributionMetadata = false;
List<Artifact> artifacts = scanner.scan(contribution);
for (Artifact artifact : artifacts) {
// Add the deployed artifact model to the contribution
modelResolver.addModel(artifact, context);
monitor.pushContext("Artifact: " + artifact.getURI());
Artifact oldArtifact = context.setArtifact(artifact);
try {
// Read each artifact
URL artifactLocationURL = null;
try {
artifactLocationURL = new URL(artifact.getLocation());
} catch (MalformedURLException e) {
//ignore
}
Object model =
artifactProcessor.read(contributionURL,
URI.create(artifact.getURI()),
artifactLocationURL,
context);
if (model != null) {
artifact.setModel(model);
// Add the loaded model to the model resolver
modelResolver.addModel(model, context);
// Merge contribution metadata into the contribution model
if (model instanceof ContributionMetadata) {
contributionMetadata = true;
ContributionMetadata c = (ContributionMetadata)model;
contribution.getImports().addAll(c.getImports());
contribution.getExports().addAll(c.getExports());
contribution.getDeployables().addAll(c.getDeployables());
contribution.getExtensions().addAll(c.getExtensions());
contribution.getAttributeExtensions().addAll(c.getAttributeExtensions());
}
}
} finally {
monitor.popContext();
context.setArtifact(oldArtifact);
}
}
List<Artifact> contributionArtifacts = contribution.getArtifacts();
contributionArtifacts.addAll(artifacts);
if (contribution.useNestedArchives() && !!!isWebApp(contribution)) {
List<Artifact> nestedArchives = getNestedArchives(contribution);
List<URL> nestedArchiveURLs;
if (scanner instanceof DirectoryContributionScanner) {
nestedArchiveURLs = getNestedArchiveURLs(nestedArchives, contribution.getLocation());
} else {
try {
nestedArchiveURLs = extractNestedArchives(nestedArchives, contribution.getLocation());
} catch (IOException e) {
throw new ContributionReadException(e);
}
}
processNestedArchives(nestedArchiveURLs, contribution, context, monitor);
}
// If no sca-contribution.xml file was provided then just consider
// all composites in the contribution as deployables
if (!contributionMetadata) {
for (Artifact artifact : artifacts) {
if (artifact.getModel() instanceof Composite) {
contribution.getDeployables().add((Composite)artifact.getModel());
}
}
// Add default contribution import and export
DefaultImport defaultImport = contributionFactory.createDefaultImport();
defaultImport.setModelResolver(new DefaultModelResolver());
contribution.getImports().add(defaultImport);
DefaultExport defaultExport = contributionFactory.createDefaultExport();
contribution.getExports().add(defaultExport);
} else {
if (contribution.getDeployables().size() > 0) {
// Update the deployable Composite objects with the correct Composite object for the artifact
for (Artifact a : contribution.getArtifacts()) {
if (a.getModel() instanceof Composite) {
for (ListIterator<Composite> lit = contribution.getDeployables().listIterator(); lit.hasNext();) {
if (lit.next().getName().equals(((Composite)a.getModel()).getName())) {
lit.set((Composite)a.getModel());
}
}
}
}
}
}
}
} finally {
monitor.popContext();
context.setContribution(old);
}
return contribution;
}