You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tuscany.apache.org by Raymond Feng <en...@gmail.com> on 2009/10/22 01:26:54 UTC

A Deployer utility, Re: svn commit: r828248

FYI, I refactored the deployment related code into a new utility called 
Deployer. The deployer can be used to load contributions, load artifacts (or 
XML documents), save XML models, build a list of contributions for a node. 
It should replace the SCDLUtils in the tuscany-scdl module.

At this moment, both the SPI and implementation are in tuscany-node-impl 
module. We could move it into the tuscany-contribution module or a new one 
such as tuscany-deployment. This SPI can be used for tools, for domain 
manager and for node.

Thanks,
Raymond
--------------------------------------------------
From: <rf...@apache.org>
Sent: Wednesday, October 21, 2009 4:13 PM
To: <co...@tuscany.apache.org>
Subject: svn commit: r828248 - in /tuscany/java/sca/modules: 
node-impl-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/impl/ 
node-impl/META-INF/ 
node-impl/src/main/java/org/apache/tuscany/sca/deployment/ 
node-impl/src/main/java/org/apache/tuscany/sca/deploy...

> Author: rfeng
> Date: Wed Oct 21 23:13:50 2009
> New Revision: 828248
>
> URL: http://svn.apache.org/viewvc?rev=828248&view=rev
> Log:
> Refactor the deployment-related code from NodeFactoryImpl into a Deployer 
> utility
>
> Added:
> 
> tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/deployment/
> 
> tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/deployment/Deployer.java 
> (with props)
> 
> tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/deployment/impl/
> 
> tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/deployment/impl/DeployerImpl.java 
> (with props)
>    tuscany/java/sca/modules/node-impl/src/main/resources/org/
>    tuscany/java/sca/modules/node-impl/src/main/resources/org/apache/
> 
> tuscany/java/sca/modules/node-impl/src/main/resources/org/apache/tuscany/
> 
> tuscany/java/sca/modules/node-impl/src/main/resources/org/apache/tuscany/sca/
> 
> tuscany/java/sca/modules/node-impl/src/main/resources/org/apache/tuscany/sca/node/
> 
> tuscany/java/sca/modules/node-impl/src/main/resources/org/apache/tuscany/sca/node/impl/
> 
> tuscany/java/sca/modules/node-impl/src/main/resources/org/apache/tuscany/sca/node/impl/node-impl-validation-messages.properties
>      - copied unchanged from r828081, 
> tuscany/java/sca/modules/node-impl/src/main/resources/node-impl-validation-messages.properties
> Removed:
> 
> tuscany/java/sca/modules/node-impl/src/main/resources/node-impl-validation-messages.properties
> Modified:
> 
> tuscany/java/sca/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/impl/OSGiNodeFactoryImpl.java
>    tuscany/java/sca/modules/node-impl/META-INF/MANIFEST.MF
> 
> tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeFactoryImpl.java
> 
> tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java
>
> Modified: 
> tuscany/java/sca/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/impl/OSGiNodeFactoryImpl.java
> URL: 
> http://svn.apache.org/viewvc/tuscany/java/sca/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/impl/OSGiNodeFactoryImpl.java?rev=828248&r1=828247&r2=828248&view=diff
> ==============================================================================
> ---  
> tuscany/java/sca/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/impl/OSGiNodeFactoryImpl.java 
> (original)
> +++ 
> tuscany/java/sca/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/impl/OSGiNodeFactoryImpl.java 
> Wed Oct 21 23:13:50 2009
> @@ -26,6 +26,7 @@
> import java.util.logging.Level;
>
> import org.apache.tuscany.sca.core.ExtensionPointRegistry;
> +import org.apache.tuscany.sca.core.FactoryExtensionPoint;
> import 
> org.apache.tuscany.sca.extensibility.equinox.OSGiExtensionPointRegistry;
> import org.apache.tuscany.sca.node.configuration.NodeConfiguration;
> import org.apache.tuscany.sca.node.configuration.NodeConfigurationFactory;
> @@ -56,6 +57,7 @@
>         init();
>
>         // Create a node configuration
> +        FactoryExtensionPoint modelFactories = 
> registry.getExtensionPoint(FactoryExtensionPoint.class);
>         NodeConfigurationFactory configurationFactory = 
> modelFactories.getFactory(NodeConfigurationFactory.class);
>         NodeConfiguration configuration = 
> configurationFactory.createNodeConfiguration();
>
> @@ -86,7 +88,7 @@
>             // Register the ExtensionPointRegistry as an OSGi service
>             Dictionary<Object, Object> props = new Hashtable<Object, 
> Object>();
>             registration =
> - 
> bundleContext.registerService(ExtensionPointRegistry.class.getName(), 
> extensionPoints, props);
> + 
> bundleContext.registerService(ExtensionPointRegistry.class.getName(), 
> registry, props);
>         }
>     }
>
>
> Modified: tuscany/java/sca/modules/node-impl/META-INF/MANIFEST.MF
> URL: 
> http://svn.apache.org/viewvc/tuscany/java/sca/modules/node-impl/META-INF/MANIFEST.MF?rev=828248&r1=828247&r2=828248&view=diff
> ==============================================================================
> --- tuscany/java/sca/modules/node-impl/META-INF/MANIFEST.MF (original)
> +++ tuscany/java/sca/modules/node-impl/META-INF/MANIFEST.MF Wed Oct 21 
> 23:13:50 2009
> @@ -1,13 +1,25 @@
> Manifest-Version: 1.0
> -Export-Package: org.apache.tuscany.sca.node.impl;uses:="org.apache.tus
> - cany.sca.runtime,org.apache.tuscany.sca.definitions,org.apache.tuscan
> - y.sca.core,javax.xml.namespace,javax.xml.stream,org.apache.tuscany.sc
> - a.core.assembly,org.apache.tuscany.sca.contribution.resolver,org.apac
> - he.tuscany.sca.workspace,org.apache.tuscany.sca.core.invocation,org.o
> - soa.sca,org.apache.tuscany.sca.assembly.builder,org.apache.tuscany.sc
> - a.assembly,org.apache.tuscany.sca.node,org.apache.tusc any.sca.contri
> - bution,org.apache.tuscany.sca.monitor,org.apache.tuscany.sca.work,org
> - .apache.tuscany.sca.contribution.processor";version="2.0.0"
> +Export-Package: org.apache.tuscany.sca.deployment;version="2.0.0";
> +  uses:="javax.xml.stream,
> +   org.apache.tuscany.sca.assembly,
> +   org.apache.tuscany.sca.contribution.processor,
> +   org.apache.tuscany.sca.core,
> +   org.apache.tuscany.sca.contribution,
> +   org.apache.tuscany.sca.monitor,
> +   org.apache.tuscany.sca.assembly.builder",
> + org.apache.tuscany.sca.deployment.impl;version="2.0.0";
> +  uses:="org.apache.tuscany.sca.assembly,
> +   org.apache.tuscany.sca.definitions,
> +   org.apache.tuscany.sca.common.xml.stax,
> +   org.apache.tuscany.sca.core,
> +   org.apache.tuscany.sca.contribution,
> +   org.apache.tuscany.sca.deployment,
> +   org.apache.tuscany.sca.monitor,
> +   javax.xml.stream,
> +   org.apache.tuscany.sca.contribution.resolver,
> +   org.apache.tuscany.sca.contribution.processor,
> +   org.apache.tuscany.sca.assembly.builder",
> + org.apache.tuscany.sca.node.impl;version="2.0.0"
> Tool: Bnd-0.0.255
> Bundle-Name: Apache Tuscany SCA Node Implementation
> Created-By: 1.6.0_07 (Sun Microsystems Inc.)
> @@ -34,6 +46,7 @@
>  org.apache.tuscany.sca.definitions;version="2.0.0",
>  org.apache.tuscany.sca.definitions.util;version="2.0.0",
>  org.apache.tuscany.sca.definitions.xml;version="2.0.0",
> + org.apache.tuscany.sca.deployment;version="2.0.0",
>  org.apache.tuscany.sca.extensibility;version="2.0.0",
>  org.apache.tuscany.sca.management;version="2.0.0",
>  org.apache.tuscany.sca.monitor;version="2.0.0",
>
> Added: 
> tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/deployment/Deployer.java
> URL: 
> http://svn.apache.org/viewvc/tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/deployment/Deployer.java?rev=828248&view=auto
> ==============================================================================
> ---  
> tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/deployment/Deployer.java 
> (added)
> +++ 
> tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/deployment/Deployer.java 
> Wed Oct 21 23:13:50 2009
> @@ -0,0 +1,189 @@
> +/*
> + * 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.deployment;
> +
> +import java.io.Reader;
> +import java.io.Writer;
> +import java.net.URI;
> +import java.net.URL;
> +import java.util.List;
> +import java.util.Map;
> +
> +import javax.xml.namespace.QName;
> +import javax.xml.stream.XMLStreamException;
> +import javax.xml.stream.XMLStreamReader;
> +import javax.xml.stream.XMLStreamWriter;
> +
> +import org.apache.tuscany.sca.assembly.Composite;
> +import org.apache.tuscany.sca.assembly.builder.BuilderContext;
> +import org.apache.tuscany.sca.assembly.builder.CompositeBuilderException;
> +import org.apache.tuscany.sca.contribution.Artifact;
> +import org.apache.tuscany.sca.contribution.Contribution;
> +import 
> org.apache.tuscany.sca.contribution.processor.ContributionReadException;
> +import 
> org.apache.tuscany.sca.contribution.processor.ContributionResolveException;
> +import 
> org.apache.tuscany.sca.contribution.processor.ContributionWriteException;
> +import org.apache.tuscany.sca.contribution.processor.ProcessorContext;
> +import org.apache.tuscany.sca.core.ExtensionPointRegistry;
> +import org.apache.tuscany.sca.core.LifeCycleListener;
> +import org.apache.tuscany.sca.monitor.Monitor;
> +
> +/**
> + * A utility that provides system functions to handle Tuscany SCA 
> application deployment
> + */
> +public interface Deployer extends LifeCycleListener {
> +    /**
> +     * Attach a deployment composite to the given contribution
> +     * @param contribution The target contribution
> +     * @param composite The deployment composite
> +     * @param appending A flag to indicate if existing deployable 
> composites in the contribution should be appended or replaced
> +     */
> +    void attachDeploymentComposite(Contribution contribution, Composite 
> composite, boolean appending);
> +
> +    /**
> +     * Configure a list of contributions to create a composite 
> representing a view of the domain
> +     * @param contributions
> +     * @param bindingBaseURIs
> +     * @param monitor
> +     * @return
> +     * @throws ContributionResolveException
> +     * @throws CompositeBuilderException
> +     */
> +    Composite build(List<Contribution> contributions, Map<QName, 
> List<String>> bindingBaseURIs, Monitor monitor)
> +        throws ContributionResolveException, CompositeBuilderException;
> +
> +    /**
> +     * Create an instance of {@link BuilderContext}
> +     * @return
> +     */
> +    BuilderContext createBuilderContext();
> +
> +    /**
> +     * Create an instance of {@link ProcessorContext}
> +     * @return
> +     */
> +    ProcessorContext createProcessorContext();
> +
> +    /**
> +     * Get the {@link ExtensionPointRegistry}
> +     * @return
> +     */
> +    ExtensionPointRegistry getExtensionPointRegistry();
> +
> +    /**
> +     * Load an artifact from the given location
> +     * @param uri
> +     * @param location
> +     * @param monitor
> +     * @return
> +     * @throws ContributionReadException
> +     */
> +    Artifact loadArtifact(URI uri, URL location, Monitor monitor) throws 
> ContributionReadException;
> +
> +    /**
> +     * Load a contribution from the given location
> +     * @param uri
> +     * @param location
> +     * @param monitor
> +     * @return
> +     * @throws ContributionReadException
> +     */
> +    Contribution loadContribution(URI uri, URL location, Monitor monitor) 
> throws ContributionReadException;
> +
> +    /**
> +     * @param <T>
> +     * @param uri
> +     * @param location
> +     * @param monitor
> +     * @return
> +     * @throws ContributionReadException
> +     */
> +    <T> T loadDocument(URI uri, URL location, Monitor monitor) throws 
> ContributionReadException;
> +
> +    /**
> +     * @param <T>
> +     * @param reader
> +     * @param monitor
> +     * @return
> +     * @throws XMLStreamException
> +     * @throws ContributionReadException
> +     */
> +    <T> T loadXMLDocument(Reader reader, Monitor monitor) throws 
> XMLStreamException, ContributionReadException;
> +
> +    /**
> +     * @param <T>
> +     * @param location
> +     * @param monitor
> +     * @return
> +     * @throws XMLStreamException
> +     * @throws ContributionReadException
> +     */
> +    <T> T loadXMLDocument(URL location, Monitor monitor) throws 
> XMLStreamException, ContributionReadException;
> +
> +    /**
> +     * @param <T>
> +     * @param reader
> +     * @param monitor
> +     * @return
> +     * @throws ContributionReadException
> +     * @throws XMLStreamException
> +     */
> +    <T> T loadXMLElement(XMLStreamReader reader, Monitor monitor) throws 
> ContributionReadException, XMLStreamException;
> +
> +    /**
> +     * Save the model as XML
> +     * @param model
> +     * @param writer
> +     * @param monitor
> +     * @throws XMLStreamException
> +     * @throws ContributionWriteException
> +     */
> +    void saveXMLDocument(Object model, Writer writer, Monitor monitor) 
> throws XMLStreamException,
> +        ContributionWriteException;
> +
> +    /**
> +     * Save the model as XML
> +     * @param model
> +     * @param writer
> +     * @param monitor
> +     * @throws XMLStreamException
> +     * @throws ContributionWriteException
> +     */
> +    void saveXMLElement(Object model, XMLStreamWriter writer, Monitor 
> monitor) throws XMLStreamException,
> +        ContributionWriteException;
> +
> +    /*
> +     * @see org.apache.tuscany.sca.core.LifeCycleListener#start()
> +     */
> +    void start();
> +
> +    /*
> +     * @see org.apache.tuscany.sca.core.LifeCycleListener#stop()
> +     */
> +    void stop();
> +
> +    /**
> +     * @return
> +     */
> +    boolean isSchemaValidationEnabled();
> +    /**
> +     * @param schemaValidationEnabled
> +     */
> +    void setSchemaValidationEnabled(boolean schemaValidationEnabled);
> +}
>
> Propchange: 
> tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/deployment/Deployer.java
> ------------------------------------------------------------------------------
>    svn:eol-style = native
>
> Propchange: 
> tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/deployment/Deployer.java
> ------------------------------------------------------------------------------
>    svn:keywords = Rev Date
>
> Added: 
> tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/deployment/impl/DeployerImpl.java
> URL: 
> http://svn.apache.org/viewvc/tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/deployment/impl/DeployerImpl.java?rev=828248&view=auto
> ==============================================================================
> ---  
> tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/deployment/impl/DeployerImpl.java 
> (added)
> +++ 
> tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/deployment/impl/DeployerImpl.java 
> Wed Oct 21 23:13:50 2009
> @@ -0,0 +1,540 @@
> +/*
> + * 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.deployment.impl;
> +
> +import static java.lang.System.currentTimeMillis;
> +
> +import java.io.Reader;
> +import java.io.Writer;
> +import java.net.URI;
> +import java.net.URL;
> +import java.util.ArrayList;
> +import java.util.Collections;
> +import java.util.HashSet;
> +import java.util.List;
> +import java.util.Map;
> +import java.util.Set;
> +import java.util.logging.Level;
> +import java.util.logging.Logger;
> +
> +import javax.xml.namespace.QName;
> +import javax.xml.stream.XMLStreamException;
> +import javax.xml.stream.XMLStreamReader;
> +import javax.xml.stream.XMLStreamWriter;
> +
> +import org.apache.tuscany.sca.assembly.AssemblyFactory;
> +import org.apache.tuscany.sca.assembly.Base;
> +import org.apache.tuscany.sca.assembly.Composite;
> +import org.apache.tuscany.sca.assembly.builder.BuilderContext;
> +import org.apache.tuscany.sca.assembly.builder.BuilderExtensionPoint;
> +import org.apache.tuscany.sca.assembly.builder.CompositeBuilder;
> +import org.apache.tuscany.sca.assembly.builder.CompositeBuilderException;
> +import org.apache.tuscany.sca.common.xml.stax.StAXHelper;
> +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.Export;
> +import org.apache.tuscany.sca.contribution.Import;
> +import 
> org.apache.tuscany.sca.contribution.processor.ContributionReadException;
> +import 
> org.apache.tuscany.sca.contribution.processor.ContributionResolveException;
> +import 
> org.apache.tuscany.sca.contribution.processor.ContributionWriteException;
> +import 
> org.apache.tuscany.sca.contribution.processor.ExtendedURLArtifactProcessor;
> +import 
> org.apache.tuscany.sca.contribution.processor.ExtensibleStAXArtifactProcessor;
> +import 
> org.apache.tuscany.sca.contribution.processor.ExtensibleURLArtifactProcessor;
> +import org.apache.tuscany.sca.contribution.processor.ProcessorContext;
> +import 
> org.apache.tuscany.sca.contribution.processor.URLArtifactProcessorExtensionPoint;
> +import 
> org.apache.tuscany.sca.contribution.processor.ValidatingXMLInputFactory;
> +import 
> org.apache.tuscany.sca.contribution.processor.ValidationSchemaExtensionPoint;
> +import 
> org.apache.tuscany.sca.contribution.resolver.DefaultImportModelResolver;
> +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.core.ExtensionPointRegistry;
> +import org.apache.tuscany.sca.core.FactoryExtensionPoint;
> +import org.apache.tuscany.sca.core.ModuleActivatorExtensionPoint;
> +import org.apache.tuscany.sca.core.UtilityExtensionPoint;
> +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.definitions.xml.DefinitionsExtensionPoint;
> +import org.apache.tuscany.sca.deployment.Deployer;
> +import org.apache.tuscany.sca.monitor.Monitor;
> +import org.apache.tuscany.sca.monitor.MonitorFactory;
> +import org.apache.tuscany.sca.node.impl.Contributions;
> +import org.apache.tuscany.sca.node.impl.NodeImpl;
> +
> +/**
> + *
> + */
> +public class DeployerImpl implements Deployer {
> +    protected static final Logger logger = 
> Logger.getLogger(NodeImpl.class.getName());
> +
> +    protected boolean inited;
> +    protected boolean schemaValidationEnabled;
> +    protected StAXHelper staxHelper;
> +    protected AssemblyFactory assemblyFactory;
> +    protected CompositeBuilder compositeBuilder;
> +    protected ContributionFactory contributionFactory;
> +    protected ExtendedURLArtifactProcessor<Contribution> 
> contributionProcessor;
> +    protected ExtensionPointRegistry registry;
> +    protected FactoryExtensionPoint modelFactories;
> +    protected ModelResolverExtensionPoint modelResolvers;
> +    protected Contribution systemContribution;
> +    protected Definitions systemDefinitions;
> +    protected ExtensibleURLArtifactProcessor artifactProcessor;
> +    protected ExtensibleStAXArtifactProcessor staxProcessor;
> +
> +    protected MonitorFactory monitorFactory;
> +
> +    protected static final String NODE_IMPL_VALIDATION_MESSAGES =
> +        "org.apache.tuscany.sca.node.impl.node-impl-validation-messages";
> +
> +    /**
> +     * @param registry
> +     */
> +    public DeployerImpl(ExtensionPointRegistry registry) {
> +        super();
> +        this.registry = registry;
> +    }
> +
> +    public synchronized void stop() {
> +        if (inited) {
> +            staxHelper = null;
> +            assemblyFactory = null;
> +            compositeBuilder = null;
> +            contributionFactory = null;
> +            contributionProcessor = null;
> +            modelFactories = null;
> +            modelResolvers = null;
> +            systemContribution = null;
> +            systemDefinitions = null;
> +            artifactProcessor = null;
> +            staxProcessor = null;
> +            monitorFactory = null;
> +            inited = false;
> +        }
> +    }
> +
> +    /**
> +     * Analyze a contribution and add its dependencies to the given 
> dependency set.
> +     */
> +    protected void addContributionDependencies(Contribution contribution,
> +                                             List<Contribution> 
> contributions,
> +                                             List<Contribution> 
> dependencies,
> +                                             Set<Contribution> set,
> +                                             Monitor monitor) {
> +
> +        // Go through the contribution imports
> +        for (Import import_ : contribution.getImports()) {
> +            boolean resolved = false;
> +
> +            // Go through all contribution candidates and their exports
> +            List<Export> matchingExports = new ArrayList<Export>();
> +            for (Contribution dependency : contributions) {
> +                if (dependency == contribution) {
> +                    // Do not self import
> +                    continue;
> +                }
> +                for (Export export : dependency.getExports()) {
> +
> +                    // If an export from a contribution matches the 
> import in hand
> +                    // add that contribution to the dependency set
> +                    if (import_.match(export)) {
> +                        resolved = true;
> +                        matchingExports.add(export);
> +
> +                        if (!set.contains(dependency)) {
> +                            set.add(dependency);
> +                            dependencies.add(dependency);
> +
> +                            // Now add the dependencies of that 
> contribution
> +                            addContributionDependencies(dependency, 
> contributions, dependencies, set, monitor);
> +                        } // end if
> +                    } // end if
> +                } // end for
> +            } // end for
> +
> +            if (resolved) {
> +                // Initialize the import's model resolver with a 
> delegating model
> +                // resolver which will delegate to the matching exports
> +                import_.setModelResolver(new 
> DefaultImportModelResolver(matchingExports));
> +
> +            } else {
> +                // Record import resolution issue
> +                if (!(import_ instanceof DefaultImport)) {
> +                    // Add the (empty) matchingExports List and report a 
> warning
> +                    import_.setModelResolver(new 
> DefaultImportModelResolver(matchingExports));
> +                    Monitor.error(monitor, this, 
> NODE_IMPL_VALIDATION_MESSAGES, "UnresolvedImport", import_);
> +                }
> +            } // end if
> +        }
> +    }
> +
> +    protected void buildDependencies(Contribution contribution, 
> List<Contribution> contributions, Monitor monitor) {
> +        contribution.getDependencies().clear();
> +
> +        List<Contribution> dependencies = new ArrayList<Contribution>();
> +        Set<Contribution> set = new HashSet<Contribution>();
> +
> +        dependencies.add(contribution);
> +        set.add(contribution);
> +        addContributionDependencies(contribution, contributions, 
> dependencies, set, monitor);
> +
> +        Collections.reverse(dependencies);
> +
> +        contribution.getDependencies().addAll(dependencies);
> +    }
> +
> +    /**
> +     * Pre-resolve phase for contributions, to set up handling of imports 
> and exports prior to full resolution
> +     * @param contributions - the contributions to preresolve
> +     * @param resolver - the ModelResolver to use
> +     * @throws ContributionResolveException
> +     */
> +    protected void contributionsPreresolve(List<Contribution> 
> contributions,
> +                                         ModelResolver resolver,
> +                                         ProcessorContext context) throws 
> ContributionResolveException {
> +
> +        for (Contribution contribution : contributions) {
> +            contributionProcessor.preResolve(contribution, resolver, 
> context);
> +        } // end for
> +    } // end method contributionsPreresolve
> +
> +    public ExtensionPointRegistry getExtensionPointRegistry() {
> +        return registry;
> +    }
> +
> +    public synchronized void start() {
> +        if (inited) {
> +            return;
> +        }
> +        long start = currentTimeMillis();
> +
> +        // Enable schema validation only of the logger level is FINE or 
> higher
> +        if (isSchemaValidationEnabled()) {
> +            ValidationSchemaExtensionPoint schemas =
> + 
> registry.getExtensionPoint(ValidationSchemaExtensionPoint.class);
> +            if (schemas != null) {
> +                schemas.setEnabled(true);
> +            }
> +        }
> +
> +        // Use the runtime-enabled assembly factory
> +        modelFactories = 
> registry.getExtensionPoint(FactoryExtensionPoint.class);
> +        assemblyFactory = 
> modelFactories.getFactory(AssemblyFactory.class);
> +
> +        // Create a monitor
> +        UtilityExtensionPoint utilities = 
> registry.getExtensionPoint(UtilityExtensionPoint.class);
> +        staxHelper = utilities.getUtility(StAXHelper.class);
> +
> +        monitorFactory = utilities.getUtility(MonitorFactory.class);
> +
> +        // Initialize the Tuscany module activators
> +        // The module activators will be started
> +        registry.getExtensionPoint(ModuleActivatorExtensionPoint.class);
> +
> +        // Get contribution workspace and assembly model factories
> +        contributionFactory = 
> modelFactories.getFactory(ContributionFactory.class);
> +
> +        // Create XML artifact processors
> +        staxProcessor = new ExtensibleStAXArtifactProcessor(registry);
> +
> +        // Create contribution content processor
> +        URLArtifactProcessorExtensionPoint docProcessorExtensions =
> + 
> registry.getExtensionPoint(URLArtifactProcessorExtensionPoint.class);
> +        artifactProcessor = new 
> ExtensibleURLArtifactProcessor(docProcessorExtensions);
> +
> +        contributionProcessor =
> + 
> (ExtendedURLArtifactProcessor<Contribution>)docProcessorExtensions.getProcessor(Contribution.class);
> +
> +        // Get the model resolvers
> +        modelResolvers = 
> registry.getExtensionPoint(ModelResolverExtensionPoint.class);
> +
> +        // Get composite builders
> +        BuilderExtensionPoint compositeBuilders = 
> registry.getExtensionPoint(BuilderExtensionPoint.class);
> +        compositeBuilder =
> + 
> compositeBuilders.getCompositeBuilder("org.apache.tuscany.sca.assembly.builder.CompositeBuilder");
> +
> +        loadSystemContribution(monitorFactory.createMonitor());
> +
> +        inited = true;
> +
> +        if (logger.isLoggable(Level.FINE)) {
> +            long end = currentTimeMillis();
> +            logger.fine("The tuscany runtime started in " + (end - start) 
> + " ms.");
> +        }
> +    }
> +
> +    protected void loadSystemContribution(Monitor monitor) {
> +        DefinitionsFactory definitionsFactory = 
> modelFactories.getFactory(DefinitionsFactory.class);
> +        systemDefinitions = definitionsFactory.createDefinitions();
> +
> +        DefinitionsExtensionPoint definitionsExtensionPoint =
> +            registry.getExtensionPoint(DefinitionsExtensionPoint.class);
> +        monitor.pushContext("Extension points definitions");
> +        try {
> +            for (Definitions defs : 
> definitionsExtensionPoint.getDefinitions()) {
> +                DefinitionsUtil.aggregate(defs, systemDefinitions, 
> monitor);
> +            }
> +        } finally {
> +            monitor.popContext();
> +        }
> +
> +        // 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("http://tuscany.apache.org/SystemContribution");
> +        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);
> +    }
> +
> +    protected Contribution cloneSystemContribution(Monitor monitor) {
> +        start();
> +        Contribution contribution = 
> contributionFactory.createContribution();
> +        contribution.setURI(systemContribution.getURI());
> +        contribution.setLocation(systemContribution.getLocation());
> +        ModelResolver modelResolver = new 
> ExtensibleModelResolver(contribution, modelResolvers, modelFactories);
> +        contribution.setModelResolver(modelResolver);
> +        contribution.setUnresolved(true);
> +
> +        DefinitionsFactory definitionsFactory = 
> modelFactories.getFactory(DefinitionsFactory.class);
> +        Definitions definitions = definitionsFactory.createDefinitions();
> +        DefinitionsUtil.aggregate(systemDefinitions, definitions, 
> monitor);
> +        // create an artifact to represent the system defintions and
> +        // add it to the contribution
> +        List<Artifact> artifacts = contribution.getArtifacts();
> +        Artifact artifact = contributionFactory.createArtifact();
> + 
> artifact.setURI("http://tuscany.apache.org/SystemContribution/Definitions");
> +        artifact.setLocation("Derived");
> +        artifact.setModel(definitions);
> +        artifacts.add(artifact);
> +        return contribution;
> +    }
> +
> +    public void attachDeploymentComposite(Contribution contribution, 
> Composite composite, boolean appending) {
> +        start();
> +        // Create an artifact for the deployment composite
> +        Artifact artifact = contributionFactory.createArtifact();
> +        String uri = composite.getName().getLocalPart() + ".composite";
> +        artifact.setURI(uri);
> +
> +        artifact.setLocation(uri);
> +        artifact.setModel(composite);
> +        artifact.setUnresolved(false);
> +        // Add it to the contribution
> +        contribution.getArtifacts().add(artifact);
> +
> +        // Replace the deployable composites with the deployment 
> composites
> +        // Clear the deployable composites if it's the first deployment 
> composite
> +        if (!appending) {
> +            contribution.getDeployables().clear();
> +        }
> +        contribution.getDeployables().add(composite);
> +    }
> +
> +    public Composite build(List<Contribution> contributions, Map<QName, 
> List<String>> bindingMap, Monitor monitor) throws 
> ContributionResolveException, CompositeBuilderException {
> +        start();
> +        Contribution systemContribution = 
> cloneSystemContribution(monitor);
> +        Definitions systemDefinitions = 
> systemContribution.getArtifacts().get(0).getModel();
> +        // 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
> +        ProcessorContext context = new ProcessorContext(monitor);
> +        for (Contribution contribution : contributions) {
> +            monitor.pushContext("Contribution: " + 
> contribution.getURI());
> +            try {
> +                // aggregate definitions
> +                for (Artifact artifact : contribution.getArtifacts()) {
> +                    if 
> (!"META-INF/definitions.xml".equals(artifact.getURI())) {
> +                        continue;
> +                    }
> +                    Object model = artifact.getModel();
> +                    // FIXME: Should we check the artifact URI is 
> META-INF/definitions.xml?
> +                    if (model instanceof Definitions) {
> +                        monitor.pushContext("Definitions: " + 
> artifact.getLocation());
> +                        DefinitionsUtil.aggregate((Definitions)model, 
> systemDefinitions, monitor);
> +                    }
> +                }
> +
> +                // 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);
> +            } finally {
> +                monitor.popContext();
> +            }
> +        }
> +
> +        ExtensibleModelResolver modelResolver =
> +            new ExtensibleModelResolver(new Contributions(contributions), 
> modelResolvers, modelFactories);
> +
> +        // now resolve and add the system contribution
> +        contributionProcessor.resolve(systemContribution, modelResolver, 
> context);
> +        contributions.add(systemContribution);
> +
> +        // pre-resolve the contributions
> +        contributionsPreresolve(contributions, modelResolver, context);
> +
> +        // Build the contribution dependencies
> +        Set<Contribution> resolved = new HashSet<Contribution>();
> +        for (Contribution contribution : contributions) {
> +            buildDependencies(contribution, contributions, monitor);
> +
> +            // Resolve contributions
> +            for (Contribution dependency : 
> contribution.getDependencies()) {
> +                if (!resolved.contains(dependency)) {
> +                    resolved.add(dependency);
> +                    contributionProcessor.resolve(dependency, 
> modelResolver, context);
> +                }
> +            }
> +        }
> +
> +        // Create a top level composite to host our composite
> +        // This is temporary to make the activator happy
> +        Composite domainComposite = assemblyFactory.createComposite();
> +        domainComposite.setName(Composite.DOMAIN_COMPOSITE);
> +        domainComposite.setURI(Base.SCA11_NS);
> +
> +        for (Contribution contribution : contributions) {
> +            for (Composite composite : contribution.getDeployables()) {
> +                // Include the node composite in the top-level composite
> +                domainComposite.getIncludes().add(composite);
> +            }
> +        }
> +
> +        // build the top level composite
> +        BuilderContext builderContext = new 
> BuilderContext(systemDefinitions, bindingMap, monitor);
> +        compositeBuilder.build(domainComposite, builderContext);
> +        // analyzeProblems(monitor);
> +
> +        return domainComposite;
> +    }
> +
> +    public Artifact loadArtifact(URI uri, URL location, Monitor monitor) 
> throws ContributionReadException {
> +        start();
> +        Artifact artifact = contributionFactory.createArtifact();
> +        artifact.setLocation(location.toString());
> +        artifact.setURI(uri.toString());
> +        URLArtifactProcessorExtensionPoint artifactProcessors =
> + 
> registry.getExtensionPoint(URLArtifactProcessorExtensionPoint.class);
> +        ExtensibleURLArtifactProcessor processor = new 
> ExtensibleURLArtifactProcessor(artifactProcessors);
> +        Object model = processor.read(null, uri, location, new 
> ProcessorContext(monitor));
> +        artifact.setModel(model);
> +        return artifact;
> +    }
> +
> +    @SuppressWarnings("unchecked")
> +    public <T> T loadDocument(URI uri, URL location, Monitor monitor) 
> throws ContributionReadException {
> +        start();
> +        Object model = artifactProcessor.read(null, uri, location, new 
> ProcessorContext(monitor));
> +        return (T) model;
> +    }
> +
> +    public <T> T loadXMLDocument(URL document, Monitor monitor) throws 
> XMLStreamException, ContributionReadException {
> +        start();
> +        XMLStreamReader reader = 
> staxHelper.createXMLStreamReader(document);
> +        reader.nextTag();
> +        ValidatingXMLInputFactory.setMonitor(reader, monitor);
> +        try {
> +            return loadXMLElement(reader, monitor);
> +        } finally {
> +            reader.close();
> +        }
> +    }
> +
> +    public void saveXMLDocument(Object model, Writer writer, Monitor 
> monitor) throws XMLStreamException,
> +        ContributionWriteException {
> +        start();
> +        XMLStreamWriter streamWriter = 
> staxHelper.createXMLStreamWriter(writer);
> +        staxProcessor.write(model, streamWriter, new 
> ProcessorContext(monitor));
> +    }
> +
> +    public void saveXMLElement(Object model, XMLStreamWriter writer, 
> Monitor monitor)
> +        throws XMLStreamException, ContributionWriteException {
> +        start();
> +        staxProcessor.write(model, writer, new 
> ProcessorContext(monitor));
> +    }
> +
> +    @SuppressWarnings("unchecked")
> +    public <T> T loadXMLElement(XMLStreamReader reader, Monitor monitor) 
> throws ContributionReadException,
> +        XMLStreamException {
> +        start();
> +        return (T)staxProcessor.read(reader, new 
> ProcessorContext(monitor));
> +    }
> +
> +    public <T> T loadXMLDocument(Reader document, Monitor monitor) throws 
> XMLStreamException, ContributionReadException {
> +        start();
> +        XMLStreamReader reader = 
> staxHelper.createXMLStreamReader(document);
> +        ValidatingXMLInputFactory.setMonitor(reader, monitor);
> +        reader.nextTag();
> +        try {
> +            return loadXMLElement(reader, monitor);
> +        } finally {
> +            reader.close();
> +        }
> +    }
> +
> +    public Contribution loadContribution(URI uri, URL location, Monitor 
> monitor) throws ContributionReadException {
> +        start();
> +        ProcessorContext context = new ProcessorContext(monitor);
> +        // Load the contribution
> +        Contribution contribution = contributionProcessor.read(null, uri, 
> location, context);
> +        return contribution;
> +    }
> +
> +    public ProcessorContext createProcessorContext() {
> +        start();
> +        return new ProcessorContext(monitorFactory.createMonitor());
> +    }
> +
> +    public BuilderContext createBuilderContext() {
> +        start();
> +        return new BuilderContext(monitorFactory.createMonitor());
> +    }
> +
> +    public boolean isSchemaValidationEnabled() {
> +        return schemaValidationEnabled;
> +    }
> +
> +    public void setSchemaValidationEnabled(boolean 
> schemaValidationEnabled) {
> +        this.schemaValidationEnabled = schemaValidationEnabled;
> +    }
> +
> +}
>
> Propchange: 
> tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/deployment/impl/DeployerImpl.java
> ------------------------------------------------------------------------------
>    svn:eol-style = native
>
> Propchange: 
> tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/deployment/impl/DeployerImpl.java
> ------------------------------------------------------------------------------
>    svn:keywords = Rev Date
>
> Modified: 
> tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeFactoryImpl.java
> URL: 
> http://svn.apache.org/viewvc/tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeFactoryImpl.java?rev=828248&r1=828247&r2=828248&view=diff
> ==============================================================================
> ---  
> tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeFactoryImpl.java 
> (original)
> +++ 
> tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeFactoryImpl.java 
> Wed Oct 21 23:13:50 2009
> @@ -29,52 +29,28 @@
> import java.io.Reader;
> import java.io.StringReader;
> import java.net.URI;
> -import java.net.URISyntaxException;
> import java.net.URL;
> import java.security.AccessController;
> import java.security.PrivilegedAction;
> import java.util.ArrayList;
> -import java.util.Collections;
> import java.util.HashMap;
> -import java.util.HashSet;
> import java.util.List;
> import java.util.Map;
> -import java.util.Set;
> import java.util.concurrent.ConcurrentHashMap;
> import java.util.logging.Level;
> import java.util.logging.Logger;
>
> import javax.xml.namespace.QName;
> -import javax.xml.stream.XMLInputFactory;
> import javax.xml.stream.XMLStreamException;
> -import javax.xml.stream.XMLStreamReader;
>
> import org.apache.tuscany.sca.assembly.AssemblyFactory;
> -import org.apache.tuscany.sca.assembly.Base;
> import org.apache.tuscany.sca.assembly.Composite;
> -import org.apache.tuscany.sca.assembly.builder.BuilderContext;
> -import org.apache.tuscany.sca.assembly.builder.BuilderExtensionPoint;
> -import org.apache.tuscany.sca.assembly.builder.CompositeBuilder;
> import org.apache.tuscany.sca.common.java.io.IOHelper;
> -import org.apache.tuscany.sca.common.xml.stax.StAXHelper;
> 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.Export;
> -import org.apache.tuscany.sca.contribution.Import;
> import 
> org.apache.tuscany.sca.contribution.processor.ContributionReadException;
> -import 
> org.apache.tuscany.sca.contribution.processor.ContributionResolveException;
> -import 
> org.apache.tuscany.sca.contribution.processor.ExtendedURLArtifactProcessor;
> import org.apache.tuscany.sca.contribution.processor.ProcessorContext;
> -import 
> org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
> -import 
> org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessorExtensionPoint;
> -import 
> org.apache.tuscany.sca.contribution.processor.URLArtifactProcessorExtensionPoint;
> import 
> org.apache.tuscany.sca.contribution.processor.ValidationSchemaExtensionPoint;
> -import 
> org.apache.tuscany.sca.contribution.resolver.DefaultImportModelResolver;
> -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.core.DefaultExtensionPointRegistry;
> import org.apache.tuscany.sca.core.ExtensionPointRegistry;
> import org.apache.tuscany.sca.core.FactoryExtensionPoint;
> @@ -84,12 +60,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.definitions.xml.DefinitionsExtensionPoint;
> -import org.apache.tuscany.sca.extensibility.ServiceDeclaration;
> -import org.apache.tuscany.sca.extensibility.ServiceDiscovery;
> +import org.apache.tuscany.sca.deployment.Deployer;
> +import org.apache.tuscany.sca.deployment.impl.DeployerImpl;
> import org.apache.tuscany.sca.monitor.Monitor;
> import org.apache.tuscany.sca.monitor.MonitorFactory;
> import org.apache.tuscany.sca.monitor.Problem;
> @@ -113,20 +85,9 @@
>     protected boolean inited;
>     protected Map<Object, Node> nodes = new ConcurrentHashMap<Object, 
> Node>();
>
> -    private AssemblyFactory assemblyFactory;
> -    private CompositeBuilder compositeBuilder;
> -    private StAXArtifactProcessor<Composite> compositeProcessor;
> -    private ContributionFactory contributionFactory;
> -    private ExtendedURLArtifactProcessor<Contribution> 
> contributionProcessor;
> -    protected ExtensionPointRegistry extensionPoints;
> -    private XMLInputFactory inputFactory;
> -    protected FactoryExtensionPoint modelFactories;
> -    private ModelResolverExtensionPoint modelResolvers;
> +    protected Deployer deployer;
> +    protected ExtensionPointRegistry registry;
>     protected ProxyFactory proxyFactory;
> -    private Contribution systemContribution;
> -    private Definitions systemDefinitions;
> -    private StAXArtifactProcessorExtensionPoint xmlProcessors;
> -
>     protected MonitorFactory monitorFactory;
>
>
> @@ -153,33 +114,13 @@
>         nodes.put(getNodeKey(configuration), node);
>     }
>
> -    /**
> -     * @param <T>
> -     * @param factory
> -     * @return
> -     * @throws Exception
> -     */
> -    private <T> T getFactory(Class<T> factory) throws Exception {
> -        ServiceDeclaration sd = 
> ServiceDiscovery.getInstance().getServiceDeclaration(factory.getName());
> -        if (sd != null) {
> -            return factory.cast(sd.loadClass().newInstance());
> -        } else {
> -            return 
> factory.cast(factory.getMethod("newInstance").invoke(null));
> -        }
> -    }
> -
>     @Override
>     public NodeConfiguration loadConfiguration(InputStream xml, URL base) 
> {
>         try {
>             init();
> -            StAXHelper helper = StAXHelper.getInstance(extensionPoints);
> -            XMLStreamReader reader = helper.createXMLStreamReader(xml);
> -            StAXArtifactProcessorExtensionPoint processors =
> - 
> extensionPoints.getExtensionPoint(StAXArtifactProcessorExtensionPoint.class);
> -            StAXArtifactProcessor processor = 
> processors.getProcessor(NodeConfiguration.class);
> -            reader.nextTag();
> -            NodeConfiguration config = 
> (NodeConfiguration)processor.read(reader, new 
> ProcessorContext(extensionPoints));
> -            xml.close();
> +            InputStreamReader reader = new InputStreamReader(xml, 
> "UTF-8");
> +            ProcessorContext context = deployer.createProcessorContext();
> +            NodeConfiguration config = deployer.loadXMLDocument(reader, 
> context.getMonitor());
>             if (base != null && config != null) {
>                 // Resolve the contribution location against the node.xml
>                 for (ContributionConfiguration c : 
> config.getContributions()) {
> @@ -197,20 +138,6 @@
>         }
>     }
>
> -    private File toFile(URL url) {
> -        if("file".equalsIgnoreCase(url.getProtocol())) {
> -            try {
> -                return new File(url.toURI());
> -            } catch(URISyntaxException e) {
> -                return new File(url.getPath());
> -            } catch(IllegalArgumentException e) {
> -                // Hack for file:./a.txt or file:../a/c.wsdl
> -                return new File(url.getPath());
> -            }
> -        }
> -        return null;
> -    }
> -
>     public Map<Object, Node> getNodes() {
>         return nodes;
>     }
> @@ -226,81 +153,12 @@
>                 node.destroy();
>             }
>             nodes.clear();
> -            extensionPoints.stop();
> +            deployer.stop();
> +            registry.stop();
>             inited = false;
>         }
>     }
>
> -    protected static String getSystemProperty(final String name) {
> -        return AccessController.doPrivileged(new 
> PrivilegedAction<String>() {
> -            public String run() {
> -                return System.getProperty(name);
> -            }
> -        });
> -    }
> -
> -    private static void warning(Monitor monitor, String message, Object 
> model, Object... messageParameters) {
> -        if (monitor != null) {
> -            Problem problem = 
> monitor.createProblem(NodeImpl.class.getName(), 
> "node-impl-validation-messages", Severity.WARNING, model, message, 
> (Object[])messageParameters);
> -            monitor.problem(problem);
> -        }
> -    }
> -
> -    /**
> -     * Analyze a contribution and add its dependencies to the given 
> dependency set.
> -     */
> -    private void addContributionDependencies(Contribution contribution, 
> List<Contribution> contributions, List<Contribution> dependencies, 
> Set<Contribution> set, Monitor monitor) {
> -
> -        // Go through the contribution imports
> -        for (Import import_: contribution.getImports()) {
> -            boolean resolved = false;
> -
> -            // Go through all contribution candidates and their exports
> -            List<Export> matchingExports = new ArrayList<Export>();
> -            for (Contribution dependency: contributions) {
> -                if (dependency == contribution) {
> -                    // Do not self import
> -                    continue;
> -                }
> -                for (Export export: dependency.getExports()) {
> -
> -                    // If an export from a contribution matches the 
> import in hand
> -                    // add that contribution to the dependency set
> -                    if (import_.match(export)) {
> -                        resolved = true;
> -                        matchingExports.add(export);
> -
> -                        if (!set.contains(dependency)) {
> -                            set.add(dependency);
> -                            dependencies.add(dependency);
> -
> -                            // Now add the dependencies of that 
> contribution
> -                            addContributionDependencies(dependency, 
> contributions, dependencies, set, monitor);
> -                        } // end if
> -                    } // end if
> -                } // end for
> -            } // end for
> -
> -            if (resolved) {
> -                // Initialize the import's model resolver with a 
> delegating model
> -                // resolver which will delegate to the matching exports
> -                import_.setModelResolver(new 
> DefaultImportModelResolver(matchingExports));
> -
> -            } else {
> -                // Record import resolution issue
> -                if (!(import_ instanceof DefaultImport)) {
> -                // Add the (empty) matchingExports List and report a 
> warning
> -                import_.setModelResolver(new 
> DefaultImportModelResolver(matchingExports));
> -                Monitor.error(monitor,
> -                              this,
> -                              "node-impl-validation-messages",
> -                              "UnresolvedImport",
> -                              import_);
> -                }
> -            } // end if
> -        }
> -    }
> -
>     /**
>      * Analyze problems reported by the artifact processors and builders.
>      *
> @@ -325,78 +183,21 @@
>
>     private boolean attachDeploymentComposite(Contribution contribution, 
> Reader xml, String location, boolean attached, ProcessorContext context)
>         throws XMLStreamException, ContributionReadException {
> -        XMLStreamReader reader = inputFactory.createXMLStreamReader(xml);
> -        reader.nextTag();
>
>         // Read the composite model
> -        Composite composite = (Composite)compositeProcessor.read(reader, 
> context);
> -        reader.close();
> -
> -        // Create an artifact for the deployment composite
> -        Artifact artifact = contributionFactory.createArtifact();
> -        String uri = composite.getName().getLocalPart() + ".composite";
> -        artifact.setURI(uri);
> -        // Set the location to avoid NPE
> -        if (location == null) {
> -            location = uri;
> -        }
> -        artifact.setLocation(location);
> -        artifact.setModel(composite);
> -        artifact.setUnresolved(false);
> -        // Add it to the contribution
> -        contribution.getArtifacts().add(artifact);
> +        Composite composite = deployer.loadXMLDocument(xml, 
> context.getMonitor());
>
>         // Replace the deployable composites with the deployment 
> composites
>         // Clear the deployable composites if it's the first deployment 
> composite
> +        deployer.attachDeploymentComposite(contribution, composite, 
> attached);
>         if (!attached) {
> -            contribution.getDeployables().clear();
>             attached = true;
> -        }
> -        contribution.getDeployables().add(composite);
> -
> +        }
>         return attached;
>     }
>
> -    private void buildDependencies(Contribution contribution, 
> List<Contribution> contributions, Monitor monitor) {
> -        contribution.getDependencies().clear();
> -
> -        List<Contribution> dependencies = new ArrayList<Contribution>();
> -        Set<Contribution> set = new HashSet<Contribution>();
> -
> -        dependencies.add(contribution);
> -        set.add(contribution);
> -        addContributionDependencies(contribution, contributions, 
> dependencies, set, monitor);
> -
> -        Collections.reverse(dependencies);
> -
> -        contribution.getDependencies().addAll(dependencies);
> -    }
> -
> -    /**
> -     * Pre-resolve phase for contributions, to set up handling of imports 
> and exports prior to full resolution
> -     * @param contributions - the contributions to preresolve
> -     * @param resolver - the ModelResolver to use
> -     * @throws ContributionResolveException
> -     */
> -    private void contributionsPreresolve( List<Contribution> 
> contributions, ModelResolver resolver, ProcessorContext context)
> -        throws ContributionResolveException {
> -
> -        for( Contribution contribution : contributions ) {
> -                contributionProcessor.preResolve(contribution, resolver, 
> context);
> -        } // end for
> -    } // end method contributionsPreresolve
> -
>     public ExtensionPointRegistry getExtensionPoints() {
> -        return extensionPoints;
> -    }
> -
> -    protected boolean isSchemaValidationEnabled() {
> -        String enabled = 
> getSystemProperty(ValidationSchemaExtensionPoint.class.getName() + 
> ".enabled");
> -        if (enabled == null) {
> -            enabled = "true";
> -        }
> -        boolean debug = logger.isLoggable(Level.FINE);
> -        return "true".equals(enabled) || debug;
> +        return registry;
>     }
>
>     public synchronized void init() {
> @@ -406,93 +207,37 @@
>         long start = currentTimeMillis();
>
>         // Create extension point registry
> -        extensionPoints = createExtensionPointRegistry();
> -        extensionPoints.start();
> -
> -        // Enable schema validation only of the logger level is FINE or 
> higher
> -        if (isSchemaValidationEnabled()) {
> -            ValidationSchemaExtensionPoint schemas =
> - 
> extensionPoints.getExtensionPoint(ValidationSchemaExtensionPoint.class);
> -            if (schemas != null) {
> -                schemas.setEnabled(true);
> -            }
> -        }
> -
> +        registry = createExtensionPointRegistry();
> +        registry.start();
> +
>         // Use the runtime-enabled assembly factory
> -        modelFactories = 
> extensionPoints.getExtensionPoint(FactoryExtensionPoint.class);
> -        assemblyFactory = new RuntimeAssemblyFactory(extensionPoints);
> +        FactoryExtensionPoint modelFactories = 
> registry.getExtensionPoint(FactoryExtensionPoint.class);
> +        AssemblyFactory assemblyFactory = new 
> RuntimeAssemblyFactory(registry);
>         modelFactories.addFactory(assemblyFactory);
>
> +        deployer = new DeployerImpl(registry);
> +
> +        // Enable schema validation only of the logger level is FINE or 
> higher
> +        deployer.setSchemaValidationEnabled(isSchemaValidationEnabled());
> +        deployer.start();
> +
>         // Create a monitor
> -        UtilityExtensionPoint utilities = 
> extensionPoints.getExtensionPoint(UtilityExtensionPoint.class);
> +        UtilityExtensionPoint utilities = 
> registry.getExtensionPoint(UtilityExtensionPoint.class);
>
>         monitorFactory = utilities.getUtility(MonitorFactory.class);
>
>         // Initialize the Tuscany module activators
>         // The module activators will be started
> - 
> extensionPoints.getExtensionPoint(ModuleActivatorExtensionPoint.class);
> -
> -        // Get XML input/output factories
> -        inputFactory = modelFactories.getFactory(XMLInputFactory.class);
> -
> -        // Get contribution workspace and assembly model factories
> -        contributionFactory = 
> modelFactories.getFactory(ContributionFactory.class);
> -
> -        // Create XML artifact processors
> -        xmlProcessors = 
> extensionPoints.getExtensionPoint(StAXArtifactProcessorExtensionPoint.class);
> -        compositeProcessor = xmlProcessors.getProcessor(Composite.class);
> -
> -        // Create contribution content processor
> -        URLArtifactProcessorExtensionPoint docProcessorExtensions = 
> extensionPoints.getExtensionPoint(URLArtifactProcessorExtensionPoint.class);
> -        contributionProcessor = 
> (ExtendedURLArtifactProcessor<Contribution>) 
> docProcessorExtensions.getProcessor(Contribution.class);
> -
> -        // Get the model resolvers
> -        modelResolvers = 
> extensionPoints.getExtensionPoint(ModelResolverExtensionPoint.class);
> -
> -        // Get composite builders
> -        BuilderExtensionPoint compositeBuilders = 
> extensionPoints.getExtensionPoint(BuilderExtensionPoint.class);
> -        compositeBuilder = 
> compositeBuilders.getCompositeBuilder("org.apache.tuscany.sca.assembly.builder.CompositeBuilder");
> +        registry.getExtensionPoint(ModuleActivatorExtensionPoint.class);
>
>         // Initialize runtime
>
>         // Get proxy factory
> -        ProxyFactoryExtensionPoint proxyFactories = 
> extensionPoints.getExtensionPoint(ProxyFactoryExtensionPoint.class);
> +        ProxyFactoryExtensionPoint proxyFactories = 
> registry.getExtensionPoint(ProxyFactoryExtensionPoint.class);
>         proxyFactory = new ExtensibleProxyFactory(proxyFactories);
>
>         utilities.getUtility(WorkScheduler.class);
>
> -        DefinitionsFactory definitionsFactory = 
> modelFactories.getFactory(DefinitionsFactory.class);
> -        systemDefinitions = definitionsFactory.createDefinitions();
> -
> -        DefinitionsExtensionPoint definitionsExtensionPoint = 
> extensionPoints.getExtensionPoint(DefinitionsExtensionPoint.class);
> -        Monitor monitor = monitorFactory.createMonitor();
> -        monitor.pushContext("Extension points definitions");
> -        try {
> -            for (Definitions defs : 
> definitionsExtensionPoint.getDefinitions()) {
> -                DefinitionsUtil.aggregate(defs, systemDefinitions, 
> monitor);
> -            }
> -        } finally {
> -            monitor.popContext();
> -        }
> -
> -        // 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("http://tuscany.apache.org/SystemContribution");
> -        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);
> -
>         inited = true;
>
>         if (logger.isLoggable(Level.FINE)) {
> @@ -504,6 +249,15 @@
>     protected ExtensionPointRegistry createExtensionPointRegistry() {
>         return new DefaultExtensionPointRegistry();
>     }
> +
> +    protected boolean isSchemaValidationEnabled() {
> +        String enabled = 
> getSystemProperty(ValidationSchemaExtensionPoint.class.getName() + 
> ".enabled");
> +        if (enabled == null) {
> +            enabled = "true";
> +        }
> +        boolean debug = logger.isLoggable(Level.FINE);
> +        return "true".equals(enabled) || debug;
> +    }
>
>     protected Composite configureNode(NodeConfiguration configuration, 
> List<Contribution> contributions, ProcessorContext context)
>         throws Throwable {
> @@ -511,87 +265,13 @@
>             // Load contributions
>             contributions = loadContributions(configuration, context);
>         }
> -        // 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
> +
>         Monitor monitor = context.getMonitor();
> -        for (Contribution contribution: contributions) {
> -            monitor.pushContext("Contribution: " + 
> contribution.getURI());
> -            // aggregate definitions
> -            for (Artifact artifact : contribution.getArtifacts()) {
> -                Object model = artifact.getModel();
> -                // FIXME: Should we check the artifact URI is 
> META-INF/definitions.xml?
> -                if (model instanceof Definitions) {
> -                    monitor.pushContext("Definitions: " + 
> artifact.getLocation());
> -                    DefinitionsUtil.aggregate((Definitions)model, 
> systemDefinitions, monitor);
> -                    monitor.popContext();
> -                }
> -            }
> -
> -            // 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);
> -            monitor.popContext();
> -        }
> -
> -        ExtensibleModelResolver modelResolver = new 
> ExtensibleModelResolver(new Contributions(contributions), modelResolvers, 
> modelFactories);
> -
> -        // now resolve and add the system contribution
> -        contributionProcessor.resolve(systemContribution, modelResolver, 
> context);
> -        contributions.add(systemContribution);
> -
> -        // TODO - Now we can calculate applicable policy sets for each 
> composite
> -
> -        // pre-resolve the contributions
> -        contributionsPreresolve(contributions, modelResolver, context);
> -
> -        // Build the contribution dependencies
> -        Set<Contribution> resolved = new HashSet<Contribution>();
> -        for (Contribution contribution: contributions) {
> -            buildDependencies(contribution, contributions, monitor);
> -
> -            // Resolve contributions
> -            for (Contribution dependency: contribution.getDependencies()) 
> {
> -                if (!resolved.contains(dependency)) {
> -                    resolved.add(dependency);
> -                    contributionProcessor.resolve(dependency, 
> modelResolver, context);
> -                }
> -            }
> -        }
> -
> -        // Create a top level composite to host our composite
> -        // This is temporary to make the activator happy
> -        Composite domainComposite = assemblyFactory.createComposite();
> -        domainComposite.setName(Composite.DOMAIN_COMPOSITE);
> -        domainComposite.setURI(Base.SCA11_NS);
> -
> -        for (Contribution contribution : contributions) {
> -            for (Composite composite : contribution.getDeployables()) {
> -                // Include the node composite in the top-level composite
> -                domainComposite.getIncludes().add(composite);
> -                logger.log(Level.INFO, "Adding composite: " + 
> composite.getName() + " to domain " + getDomainURI());
> -            }
> -        }
> -
> -        // TODO - EPR - create a binding map to pass down into the 
> builders
> -        //              for use during URI calculation.
> -        Map<QName, List<String>> bindingMap = new HashMap<QName, 
> List<String>>();
> +        Map<QName, List<String>> bindingBaseURIs = new HashMap<QName, 
> List<String>>();
>         for (BindingConfiguration config : configuration.getBindings()) {
> -            bindingMap.put(config.getBindingType(), 
> config.getBaseURIs());
> +            bindingBaseURIs.put(config.getBindingType(), 
> config.getBaseURIs());
>         }
> -
> -        // build the top level composite
> -        BuilderContext builderContext = new 
> BuilderContext(systemDefinitions, bindingMap, monitor);
> -        compositeBuilder.build(domainComposite, builderContext);
> +        Composite domainComposite = deployer.build(contributions, 
> bindingBaseURIs, monitor);
>         analyzeProblems(monitor);
>
>         return domainComposite;
> @@ -612,7 +292,7 @@
>
>             // Load the contribution
>             logger.log(Level.INFO, "Loading contribution: " + 
> contributionURL);
> -            Contribution contribution = contributionProcessor.read(null, 
> contributionURI, contributionURL, context);
> +            Contribution contribution = 
> deployer.loadContribution(contributionURI, contributionURL, 
> context.getMonitor());
>             contributions.add(contribution);
>
>             boolean attached = false;
> @@ -655,6 +335,14 @@
>         return contributions;
>     }
>
> +    protected static String getSystemProperty(final String name) {
> +        return AccessController.doPrivileged(new 
> PrivilegedAction<String>() {
> +            public String run() {
> +                return System.getProperty(name);
> +            }
> +        });
> +    }
> +
>     protected static class NodeKey {
>         private String domainURI;
>         private String nodeURI;
>
> Modified: 
> tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java
> URL: 
> http://svn.apache.org/viewvc/tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java?rev=828248&r1=828247&r2=828248&view=diff
> ==============================================================================
> ---  
> tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java 
> (original)
> +++ 
> tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java 
> Wed Oct 21 23:13:50 2009
> @@ -114,7 +114,7 @@
>         manager.init();
>         manager.addNode(configuration, this);
>         this.proxyFactory = manager.proxyFactory;
> -        UtilityExtensionPoint utilities = 
> manager.extensionPoints.getExtensionPoint(UtilityExtensionPoint.class);
> +        UtilityExtensionPoint utilities = 
> manager.registry.getExtensionPoint(UtilityExtensionPoint.class);
>
>         DomainRegistryFactory domainRegistryFactory = 
> utilities.getUtility(DomainRegistryFactory.class);
>         EndpointRegistry endpointRegistry =
> @@ -135,7 +135,7 @@
>                 domainComposite = manager.configureNode(configuration, 
> contributions, context);
>
>                 this.compositeContext =
> -                    new CompositeContextImpl(manager.extensionPoints, 
> endpointRegistry, domainComposite);
> +                    new CompositeContextImpl(manager.registry, 
> endpointRegistry, domainComposite);
>             } finally {
>                 // Reset the thread context monitor
>                 manager.monitorFactory.setContextMonitor(tcm);
> @@ -207,7 +207,7 @@
>             } // end if
>
>             manager.removeNode(configuration);
> - 
> manager.extensionPoints.getExtensionPoint(UtilityExtensionPoint.class).removeUtility(compositeActivator);
> + 
> manager.registry.getExtensionPoint(UtilityExtensionPoint.class).removeUtility(compositeActivator);
>             this.compositeActivator = null;
>             this.proxyFactory = null;
>             this.domainComposite = null;
> @@ -343,7 +343,7 @@
>                 .getFactory(XMLOutputFactory.class);
>
>         try {
> -            compositeProcessor.write(composite, 
> outputFactory.createXMLStreamWriter(bos), new 
> ProcessorContext(manager.extensionPoints));
> +            compositeProcessor.write(composite, 
> outputFactory.createXMLStreamWriter(bos), new 
> ProcessorContext(manager.registry));
>         } catch(Exception ex) {
>             return ex.toString();
>         }
>
>