diff options
Diffstat (limited to 'java/sca')
5 files changed, 129 insertions, 24 deletions
diff --git a/java/sca/modules/assembly-xml/src/main/java/org/apache/tuscany/sca/assembly/xml/CompositeDocumentProcessor.java b/java/sca/modules/assembly-xml/src/main/java/org/apache/tuscany/sca/assembly/xml/CompositeDocumentProcessor.java index 476a5fe08c..f0ecd22761 100644 --- a/java/sca/modules/assembly-xml/src/main/java/org/apache/tuscany/sca/assembly/xml/CompositeDocumentProcessor.java +++ b/java/sca/modules/assembly-xml/src/main/java/org/apache/tuscany/sca/assembly/xml/CompositeDocumentProcessor.java @@ -90,9 +90,11 @@ public class CompositeDocumentProcessor extends BaseAssemblyProcessor implements public Composite read(URI uri, InputStream scdlStream) throws ContributionReadException { try { +/* if (scaDefnSink != null ) { fillDomainPolicySets(scaDefnSink); } +*/ Composite composite = null; @@ -172,6 +174,10 @@ public class CompositeDocumentProcessor extends BaseAssemblyProcessor implements return Composite.class; } + /* + * TODO - remove - definitions information is now aggregated in the + * systems definitions contribution and we need to add + * applicable policy sets once all composites have been read private void fillDomainPolicySets(List scaDefnsSink) { Map<QName, PolicySet> domainPolicySetMap = null; if ( scaDefnsSink.size() > scaDefnsCount ) { @@ -196,4 +202,5 @@ public class CompositeDocumentProcessor extends BaseAssemblyProcessor implements scaDefnsCount = scaDefnsSink.size(); } } + */ } diff --git a/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/DefaultModelResolver.java b/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/DefaultModelResolver.java index 597fa6f4a0..5f4b5100c2 100644 --- a/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/DefaultModelResolver.java +++ b/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/resolver/DefaultModelResolver.java @@ -22,6 +22,11 @@ package org.apache.tuscany.sca.contribution.resolver; import java.util.HashMap; import java.util.Map; +import org.apache.tuscany.sca.assembly.Base; +import org.apache.tuscany.sca.contribution.Contribution; +import org.apache.tuscany.sca.contribution.DefaultImport; +import org.apache.tuscany.sca.contribution.Import; +import org.apache.tuscany.sca.core.FactoryExtensionPoint; /** * A default implementation of a model resolver based on a map. @@ -30,11 +35,16 @@ import java.util.Map; */ public class DefaultModelResolver implements ModelResolver { + private Contribution contribution; private Map<Object, Object> map = new HashMap<Object, Object>(); public DefaultModelResolver() { } + public DefaultModelResolver(Contribution contribution, FactoryExtensionPoint modelFactories) { + this.contribution = contribution; + } + public <T> T resolveModel(Class<T> modelClass, T unresolved) { Object resolved = map.get(unresolved); if (resolved != null) { @@ -44,6 +54,19 @@ public class DefaultModelResolver implements ModelResolver { } else { + // by default try and resolve through a default import + // if there is one. + if (contribution != null){ + for (Import _import : contribution.getImports()){ + if (_import instanceof DefaultImport){ + resolved = _import.getModelResolver().resolveModel(modelClass, unresolved); + if (resolved != unresolved){ + return modelClass.cast(resolved); + } + } + } + } + // Return the unresolved object return unresolved; } diff --git a/java/sca/modules/node-impl/META-INF/MANIFEST.MF b/java/sca/modules/node-impl/META-INF/MANIFEST.MF index 8247f6f433..3970002180 100644 --- a/java/sca/modules/node-impl/META-INF/MANIFEST.MF +++ b/java/sca/modules/node-impl/META-INF/MANIFEST.MF @@ -30,11 +30,13 @@ Import-Package: javax.xml.namespace, org.apache.tuscany.sca.core.assembly;version="2.0.0",
org.apache.tuscany.sca.core.invocation;version="2.0.0",
org.apache.tuscany.sca.definitions;version="2.0.0",
+ org.apache.tuscany.sca.definitions.util;version="2.0.0",
org.apache.tuscany.sca.implementation.node;version="2.0.0",
org.apache.tuscany.sca.monitor;version="2.0.0",
org.apache.tuscany.sca.node;version="2.0.0",
org.apache.tuscany.sca.node.impl;version="2.0.0",
org.apache.tuscany.sca.policy;version="2.0.0",
+ org.apache.tuscany.sca.provider;version="2.0.0",
org.apache.tuscany.sca.runtime;version="2.0.0",
org.apache.tuscany.sca.work;version="2.0.0",
org.apache.tuscany.sca.workspace;version="2.0.0",
diff --git a/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java b/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java index 56a9ee4bbe..d1b92660b4 100644 --- a/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java +++ b/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java @@ -49,6 +49,7 @@ import org.apache.tuscany.sca.assembly.builder.CompositeBuilderExtensionPoint; import org.apache.tuscany.sca.contribution.Artifact; import org.apache.tuscany.sca.contribution.Contribution; import org.apache.tuscany.sca.contribution.ContributionFactory; +import org.apache.tuscany.sca.contribution.DefaultImport; import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor; import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessorExtensionPoint; import org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor; @@ -69,6 +70,8 @@ import org.apache.tuscany.sca.core.invocation.ExtensibleProxyFactory; import org.apache.tuscany.sca.core.invocation.ProxyFactory; import org.apache.tuscany.sca.core.invocation.ProxyFactoryExtensionPoint; import org.apache.tuscany.sca.definitions.Definitions; +import org.apache.tuscany.sca.definitions.DefinitionsFactory; +import org.apache.tuscany.sca.definitions.util.DefinitionsUtil; import org.apache.tuscany.sca.implementation.node.ConfiguredNodeImplementation; import org.apache.tuscany.sca.implementation.node.NodeImplementationFactory; import org.apache.tuscany.sca.monitor.Monitor; @@ -78,6 +81,9 @@ import org.apache.tuscany.sca.monitor.Problem.Severity; import org.apache.tuscany.sca.node.Client; import org.apache.tuscany.sca.node.ContributionLocationHelper; import org.apache.tuscany.sca.node.Node; +import org.apache.tuscany.sca.provider.DefinitionsProvider; +import org.apache.tuscany.sca.provider.DefinitionsProviderException; +import org.apache.tuscany.sca.provider.DefinitionsProviderExtensionPoint; import org.apache.tuscany.sca.runtime.RuntimeComponent; import org.apache.tuscany.sca.runtime.RuntimeComponentContext; import org.apache.tuscany.sca.work.WorkScheduler; @@ -121,6 +127,7 @@ public class NodeImpl implements Node, Client { private List<ModuleActivator> moduleActivators = new ArrayList<ModuleActivator>(); private CompositeActivator compositeActivator; private WorkScheduler workScheduler; + private Contribution systemContribution; private Definitions systemDefinitions; /** @@ -305,7 +312,6 @@ public class NodeImpl implements Node, Client { assemblyFactory = new RuntimeAssemblyFactory(); modelFactories.addFactory(assemblyFactory); - // Create a monitor UtilityExtensionPoint utilities = extensionPoints.getExtensionPoint(UtilityExtensionPoint.class); MonitorFactory monitorFactory = utilities.getUtility(MonitorFactory.class); @@ -359,23 +365,43 @@ public class NodeImpl implements Node, Client { compositeActivator = utilities.getUtility(CompositeActivator.class); workScheduler = utilities.getUtility(WorkScheduler.class); + + // Load the system definitions.xml from all of the loaded extension points + DefinitionsProviderExtensionPoint definitionsProviders = extensionPoints.getExtensionPoint(DefinitionsProviderExtensionPoint.class); + DefinitionsFactory definitionsFactory = modelFactories.getFactory(DefinitionsFactory.class); + systemDefinitions = definitionsFactory.createDefinitions(); - // This is not right, the aggregate algorithm is not right, adding policies to - // a resolver like that is not correct as these policies won't be seen by the resolvers - // used by the contributions, and we shouldn't have to use the doc processor to do - // the resolution, so commenting out for now as it's not critical to get working in - // the Equinox environment initially + // aggregate all the definitions into a single definitions model + try { + for (DefinitionsProvider definitionsProvider : definitionsProviders.getDefinitionsProviders()) { + DefinitionsUtil.aggregate(definitionsProvider.getDefinitions(), systemDefinitions); + } + } catch (DefinitionsProviderException e) { + throw new IllegalStateException(e); + } + + // create a system contribution to hold the definitions. The contribution + // will be extended later with definitions from application contributions + systemContribution = contributionFactory.createContribution(); + systemContribution.setURI("http://tuscany.apache.org/SystemContribution"); + systemContribution.setLocation("Derived"); + ModelResolver modelResolver = new ExtensibleModelResolver(systemContribution, modelResolvers, modelFactories); + systemContribution.setModelResolver(modelResolver); + systemContribution.setUnresolved(true); + + // create an artifact to represent the system defintions and + // add it to the contribution + List<Artifact> artifacts = systemContribution.getArtifacts(); + Artifact artifact = contributionFactory.createArtifact(); + artifact.setURI("http://tuscany.apache.org/SystemContribution/Definitions"); + artifact.setLocation("Derived"); + artifact.setModel(systemDefinitions); + artifacts.add(artifact); + + // don't resolve the system contribution until all the application + // level definitions have been added + -// // Load the system definitions.xml -// DefinitionsProviderExtensionPoint definitionsProviders = extensionPoints.getExtensionPoint(DefinitionsProviderExtensionPoint.class); -// systemDefinitions = new DefinitionsImpl(); -// try { -// for (DefinitionsProvider definitionsProvider : definitionsProviders.getDefinitionsProviders()) { -// aggregateDefinitions(definitionsProvider.getSCADefinition(), systemDefinitions); -// } -// } catch (DefinitionsProviderException e) { -// throw new IllegalStateException(e); -// } // // // Configure a resolver for the system definitions // ModelResolver definitionsResolver = new DefaultModelResolver(); @@ -429,6 +455,39 @@ public class NodeImpl implements Node, Client { workspace.getContributions().add(contribution); analyzeProblems(); } + + // Build an aggregated SCA definitions model. Must be done before we try and + // resolve any contributions or composites as they may depend on the full + // definitions.xml picture + + // get all definitions.xml artifacts from contributions and aggregate + // into the system contribution. In turn add a default import into + // each contribution so that for unresolved items the resolution + // processing will look in the system contribution + for (Contribution contribution: workspace.getContributions()) { + // aggregate definitions + for (Artifact artifact : contribution.getArtifacts()) { + Object model = artifact.getModel(); + if (model instanceof Definitions) { + DefinitionsUtil.aggregate((Definitions)model, systemDefinitions); + } + } + + // create a default import and wire it up to the system contribution + // model resolver. This is the trick that makes the resolution processing + // skip over to the system contribution if resolution is unsuccessful + // in the current contribution + DefaultImport defaultImport = contributionFactory.createDefaultImport(); + defaultImport.setModelResolver(systemContribution.getModelResolver()); + contribution.getImports().add(defaultImport); + } + + // now resolve the system contribution and add the contribution + // to the workspace + contributionProcessor.resolve(systemContribution, workspace.getModelResolver()); + workspace.getContributions().add(systemContribution); + + // TODO - Now we can calculate applicable policy sets for each composite // Build the contribution dependencies Set<Contribution> resolved = new HashSet<Contribution>(); @@ -457,6 +516,9 @@ public class NodeImpl implements Node, Client { compositeFile.setURI(composite.getURI()); for (Contribution contribution: workspace.getContributions()) { ModelResolver resolver = contribution.getModelResolver(); + for (Artifact artifact : contribution.getArtifacts()){ + logger.log(Level.INFO,"artifact - " + artifact.getURI()); + } Artifact resolvedArtifact = resolver.resolveModel(Artifact.class, compositeFile); if (!resolvedArtifact.isUnresolved() && resolvedArtifact.getModel() instanceof Composite) { @@ -479,16 +541,9 @@ public class NodeImpl implements Node, Client { if (!found) { throw new IllegalArgumentException("Composite not found: " + composite.getURI()); } - - // Build an aggregated SCA definitions model - Definitions definitions = systemDefinitions; - //definitions = new DefinitionsImpl(); - //for (Definitions definition : ((List<Definitions>)policyDefinitions)) { - // DefinitionsUtil.aggregateDefinitions(definition, definitions); - //} // Build the composite and wire the components included in it - compositeBuilder.build(composite, definitions, monitor); + compositeBuilder.build(composite, systemDefinitions, monitor); analyzeProblems(); // Create a top level composite to host our composite diff --git a/java/sca/modules/policy-xml/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.resolver.ModelResolver b/java/sca/modules/policy-xml/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.resolver.ModelResolver new file mode 100644 index 0000000000..4daf46c790 --- /dev/null +++ b/java/sca/modules/policy-xml/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.resolver.ModelResolver @@ -0,0 +1,18 @@ +# 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. + +org.apache.tuscany.sca.contribution.resolver.DefaultModelResolver;model=org.apache.tuscany.sca.policy.Intent |