Author: rfeng
Date: Tue Oct 17 17:10:04 2006
New Revision: 465105

URL: http://svn.apache.org/viewvc?view=rev&rev=465105
Log:
Add a maven plugin to help build/install standalone applications

Added:
    incubator/tuscany/java/sca/plugins/plugin.standalone/   (with props)
    incubator/tuscany/java/sca/plugins/plugin.standalone/pom.xml   (with props)
    incubator/tuscany/java/sca/plugins/plugin.standalone/src/
    incubator/tuscany/java/sca/plugins/plugin.standalone/src/main/
    incubator/tuscany/java/sca/plugins/plugin.standalone/src/main/java/
    incubator/tuscany/java/sca/plugins/plugin.standalone/src/main/java/org/
    
incubator/tuscany/java/sca/plugins/plugin.standalone/src/main/java/org/apache/
    
incubator/tuscany/java/sca/plugins/plugin.standalone/src/main/java/org/apache/tuscany/
    
incubator/tuscany/java/sca/plugins/plugin.standalone/src/main/java/org/apache/tuscany/plugin/
    
incubator/tuscany/java/sca/plugins/plugin.standalone/src/main/java/org/apache/tuscany/plugin/standalone/
    
incubator/tuscany/java/sca/plugins/plugin.standalone/src/main/java/org/apache/tuscany/plugin/standalone/Dependency.java
   (with props)
    
incubator/tuscany/java/sca/plugins/plugin.standalone/src/main/java/org/apache/tuscany/plugin/standalone/TuscanyStandaloneMojo.java
   (with props)
Modified:
    incubator/tuscany/java/sca/plugins/pom.xml

Propchange: incubator/tuscany/java/sca/plugins/plugin.standalone/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Tue Oct 17 17:10:04 2006
@@ -0,0 +1,13 @@
+target
+*.iws
+*.ipr
+*.iml
+.project
+.classpath
+maven.log
+velocity.log*
+junit*.properties
+surefire*.properties
+.settings
+.deployables
+.wtpmodules

Added: incubator/tuscany/java/sca/plugins/plugin.standalone/pom.xml
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/plugins/plugin.standalone/pom.xml?view=auto&rev=465105
==============================================================================
--- incubator/tuscany/java/sca/plugins/plugin.standalone/pom.xml (added)
+++ incubator/tuscany/java/sca/plugins/plugin.standalone/pom.xml Tue Oct 17 
17:10:04 2006
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * 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.
+-->
+<project>
+    <parent>
+        <groupId>org.apache.tuscany.sca.plugins</groupId>
+        <artifactId>parent</artifactId>
+        <version>1.0-incubator-M2-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>tuscany-standalone-plugin</artifactId>
+    <packaging>maven-plugin</packaging>
+    <name>Tuscany Standalone Plugin</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-plugin-api</artifactId>
+            <version>2.0.4</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-artifact</artifactId>
+            <version>2.0.4</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-project</artifactId>
+            <version>2.0.4</version>
+            <scope>compile</scope>
+        </dependency>       
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>1.2</version>
+        </dependency>
+    </dependencies>
+</project>

Propchange: incubator/tuscany/java/sca/plugins/plugin.standalone/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/plugins/plugin.standalone/pom.xml
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: 
incubator/tuscany/java/sca/plugins/plugin.standalone/src/main/java/org/apache/tuscany/plugin/standalone/Dependency.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/plugins/plugin.standalone/src/main/java/org/apache/tuscany/plugin/standalone/Dependency.java?view=auto&rev=465105
==============================================================================
--- 
incubator/tuscany/java/sca/plugins/plugin.standalone/src/main/java/org/apache/tuscany/plugin/standalone/Dependency.java
 (added)
+++ 
incubator/tuscany/java/sca/plugins/plugin.standalone/src/main/java/org/apache/tuscany/plugin/standalone/Dependency.java
 Tue Oct 17 17:10:04 2006
@@ -0,0 +1,111 @@
+/*
+ * 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.plugin.standalone;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.factory.ArtifactFactory;
+
+/**
+ * Represents a configured tuscany dependency for boot and extension libraries.
+ * 
+ * @version $Rev$ $Date$
+ */
+public class Dependency {
+
+    /**
+     * JAR type artifact.
+     */
+    private static final String TYPE_JAR = "jar";
+
+    /**
+     * Default boot libraries. TODO Decide on whether to get snapshot version
+     * rather than hardcoded version..
+     */
+    private static final Dependency[] DEFAULT_BOOT_LIBS =
+        new Dependency[] {
+                          new Dependency("org.apache.tuscany.sca.runtime", 
"standalone-host",
+                                         "1.0-incubator-M2-SNAPSHOT"),
+                          // HACK to force servlet-api
+                          new Dependency("javax.servlet", "servlet-api", 
"2.4")};
+
+    /**
+     * Group Id that is injected in from configuration.
+     */
+    private String groupId;
+
+    /**
+     * Artifact Id that is injected in from configuration.
+     */
+    private String artifactId;
+
+    /**
+     * Version that is injected in from configuration.
+     */
+    private String version;
+
+    /**
+     * Default constructor.
+     */
+    public Dependency() {
+    }
+
+    /**
+     * Initializes the field.
+     * 
+     * @param groupId Group id.
+     * @param artifactId Artifact id.
+     * @param version Artifact version.
+     */
+    public Dependency(String groupId, String artifactId, String version) {
+        super();
+        this.groupId = groupId;
+        this.artifactId = artifactId;
+        this.version = version;
+    }
+
+    /**
+     * Gets the artifact using the specified artifact factory.
+     * 
+     * @param artifactFactory Artifact factory to use.
+     * @return Artifact identified by the dependency.
+     */
+    public Artifact getArtifact(ArtifactFactory artifactFactory) {
+        return artifactFactory.createArtifact(groupId, artifactId, version, 
Artifact.SCOPE_RUNTIME, TYPE_JAR);
+    }
+
+    /**
+     * Returns the default boot libraries.
+     * 
+     * @return Default boot libraries.
+     */
+    public static Dependency[] getDefaultBootLibs() {
+        return DEFAULT_BOOT_LIBS;
+    }
+
+    /**
+     * Checks whether the specified artifact has the same artifact id.
+     * 
+     * @param artifact Artifact to be matched.
+     * @return True if the sepcified artifact has the same id.
+     */
+    public boolean match(Artifact artifact) {
+        return artifact.getArtifactId().equals(artifactId);
+    }
+
+}

Propchange: 
incubator/tuscany/java/sca/plugins/plugin.standalone/src/main/java/org/apache/tuscany/plugin/standalone/Dependency.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/tuscany/java/sca/plugins/plugin.standalone/src/main/java/org/apache/tuscany/plugin/standalone/Dependency.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: 
incubator/tuscany/java/sca/plugins/plugin.standalone/src/main/java/org/apache/tuscany/plugin/standalone/TuscanyStandaloneMojo.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/plugins/plugin.standalone/src/main/java/org/apache/tuscany/plugin/standalone/TuscanyStandaloneMojo.java?view=auto&rev=465105
==============================================================================
--- 
incubator/tuscany/java/sca/plugins/plugin.standalone/src/main/java/org/apache/tuscany/plugin/standalone/TuscanyStandaloneMojo.java
 (added)
+++ 
incubator/tuscany/java/sca/plugins/plugin.standalone/src/main/java/org/apache/tuscany/plugin/standalone/TuscanyStandaloneMojo.java
 Tue Oct 17 17:10:04 2006
@@ -0,0 +1,558 @@
+/*
+ * 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.plugin.standalone;
+
+import java.beans.XMLDecoder;
+import java.beans.XMLEncoder;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.jar.JarEntry;
+import java.util.jar.JarOutputStream;
+import java.util.zip.ZipException;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.factory.ArtifactFactory;
+import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException;
+import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
+import org.apache.maven.artifact.metadata.ResolutionGroup;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
+import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
+import org.apache.maven.artifact.resolver.ArtifactResolver;
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.project.MavenProject;
+
+/**
+ * Build the tuscany war file by adding the tuscany dependencies. Performs the
+ * following tasks.
+ * <ul>
+ * <li>Adds the boot dependencies transitively to tuscany/boot</li>
+ * <li>By default boot libraries are transitively resolved from app-host</li>
+ * <li>This can be overridden using the configuration/bootLibs element in the
+ * plugin</li>
+ * <li>Adds the extension artifacts specified using configuration/extensions to
+ * tuscany/extensions</li>
+ * <li>If configuration/loadExtensionsDependency is set to true extension
+ * dependencies are transitivel loaded</li>
+ * <li>Extension dependencies are loaded into tuscany/repository directory in a
+ * Maven repo format</li>
+ * <li>Extension dependency metadata is written to
+ * tuscany/repository/dependency.metadata file</li>
+ * </ul>
+ * <p>
+ * A sample usage for this plugin:
+ * <p>
+ * <code>
+ * &lt;plugin&gt;<br/>
+ * &lt;groupId&gt;org.apache.tuscany.sca.plugins&lt;/groupId&gt;<br/>
+ * &lt;artifactId&gt;tuscany-standalone-plugin&lt;/artifactId&gt;<br/>
+ * &lt;executions&gt;<br/>
+ * &lt;execution&gt;<br/>
+ * &lt;id&gt;tuscany-standalone&lt;/id&gt;<br/>
+ * &lt;goals&gt;<br/>
+ * &lt;goal&gt;tuscany-standalone&lt;/goal&gt;<br/>
+ * &lt;/goals&gt;<br/>
+ * &lt;/execution&gt;<br/>
+ * &lt;/executions&gt;<br/>
+ * &lt;configuration&gt;<br/>
+ * &lt;loadExtensionDependencies&gt;true&lt;/loadExtensionDependencies&gt;<br/>
+ * &lt;overwrite&gt;true&lt;/overwrite&gt;<br/>
+ * &lt;extensions&gt;<br/>
+ * &lt;dependency&gt;<br/>
+ * &lt;groupId&gt;org.apache.tuscany.sca.services.bindings&lt;/groupId&gt;<br/>
+ * &lt;artifactId&gt;axis2&lt;/artifactId&gt;<br/>
+ * &lt;version&gt;${tuscanyVersion}&lt;/version&gt;<br/>
+ * &lt;/dependency&gt;<br/>
+ * &lt;dependency&gt;<br/>
+ * 
&lt;groupId&gt;org.apache.tuscany.sca.services.databinding&lt;/groupId&gt;<br/>
+ * &lt;artifactId&gt;databinding-sdo&lt;/artifactId&gt;<br/>
+ * &lt;version&gt;${tuscanyVersion}&lt;/version&gt;<br/>
+ * &lt;/dependency&gt;<br/>
+ * &lt;/extensions&gt;<br/>
+ * &lt;/configuration&gt;<br/>
+ * &lt;/plugin&gt;<br/>
+ * </code>
+ * 
+ * @goal tuscany-standalone
+ * @phase package
+ * @version $Rev$ $Date$
+ */
+public class TuscanyStandaloneMojo extends AbstractMojo {
+
+    private static final String APP_PATH = "app";
+
+    /**
+     * Tuscany path.
+     */
+    private static final String TUSCANY_PATH = "/";
+
+    /**
+     * Tuscany launcher path.
+     */
+    private static final String LAUNCHER_PATH = TUSCANY_PATH + "bin/";
+
+    /**
+     * Tuscany lib path.
+     */
+    private static final String LIB_PATH = TUSCANY_PATH + "lib/";
+
+    /**
+     * Tuscany boot path.
+     */
+    private static final String BOOT_PATH = TUSCANY_PATH + "boot/";
+
+    /**
+     * Tuscany extension path.
+     */
+    private static final String EXTENSION_PATH = TUSCANY_PATH + "extensions/";
+
+    /**
+     * Tuscany repository path.
+     */
+    private static final String REPOSITORY_PATH = TUSCANY_PATH + "repository/";
+
+    /**
+     * Artifact metadata source.
+     * 
+     * @component
+     */
+    private ArtifactMetadataSource metadataSource;
+
+    /**
+     * Used to look up Artifacts in the remote repository.
+     * 
+     * @parameter 
expression="${component.org.apache.maven.artifact.factory.ArtifactFactory}"
+     * @required
+     * @readonly
+     */
+    private ArtifactFactory artifactFactory;
+
+    /**
+     * Used to look up Artifacts in the remote repository.
+     * 
+     * @parameter 
expression="${component.org.apache.maven.artifact.resolver.ArtifactResolver}"
+     * @required
+     * @readonly
+     */
+    protected ArtifactResolver resolver;
+
+    /**
+     * Location of the local repository.
+     * 
+     * @parameter expression="${localRepository}"
+     * @readonly
+     * @required
+     */
+    private ArtifactRepository localRepository;
+
+    /**
+     * List of Remote Repositories used by the resolver
+     * 
+     * @parameter expression="${project.remoteArtifactRepositories}"
+     * @readonly
+     * @required
+     */
+    private List remoteRepositories;
+
+    /**
+     * The directory for the generated ZIP.
+     * 
+     * @parameter expression="${project.build.directory}"
+     * @required
+     */
+    private String outputDirectory;
+
+    /**
+     * The directory for the generated ZIP.
+     * 
+     * @parameter
+     */
+    private Dependency[] bootLibs = Dependency.getDefaultBootLibs();
+
+    /**
+     * The directory for the generated ZIP.
+     * 
+     * @parameter
+     */
+    private Dependency[] extensions = new Dependency[0];
+
+    /**
+     * The directory for the generated WAR.
+     * 
+     * @parameter
+     */
+    private Dependency[] dependencies = new Dependency[0];
+
+    /**
+     * /** The name of the generated ZIP.
+     * 
+     * @parameter expression="${project.build.finalName}"
+     * @required
+     */
+    private String zipName;
+
+    /**
+     * A flag to indicate whether extension dependencies should be resolved
+     * transitively.
+     * 
+     * @parameter
+     */
+    private boolean loadExtensionDependencies;
+
+    /**
+     * The artifactId for the project
+     * 
+     * @parameter expression="${project}"
+     * @readonly
+     * @required
+     */
+    private MavenProject project;
+
+    /**
+     * Overwrite exsiting artifact?
+     * 
+     * @parameter
+     */
+    private boolean overwrite = true;
+
+    /**
+     * WEB-INF jar files.
+     */
+    private Set<String> packagedLibs = new HashSet<String>();
+
+    /**
+     * Transitive dependencies for extensions.
+     */
+    private Map transDepenedencyMap = new HashMap();
+
+    private Dependency launcher =
+        new Dependency("org.apache.tuscany.sca.commands", "launcher", 
"1.0-incubator-M2-SNAPSHOT");
+
+    /**
+     * Executes the MOJO.
+     */
+    public void execute() throws MojoExecutionException {
+
+        JarOutputStream newZip = null;
+        File newZipFile = null;
+
+        try {
+
+            File originalJarFile = new File(outputDirectory, zipName + ".jar");
+
+            newZipFile = new File(outputDirectory, zipName + ".zip");
+            newZip = new JarOutputStream(new FileOutputStream(newZipFile));
+
+            // copyOriginal(originalZip, newZip);
+
+            // addEntry(newZip, TUSCANY_PATH);
+            addEntry(newZip, BOOT_PATH);
+            addEntry(newZip, EXTENSION_PATH);
+            addEntry(newZip, REPOSITORY_PATH);
+
+            newZip.putNextEntry(new JarEntry(LIB_PATH + 
originalJarFile.getName()));
+            InputStream jar = new FileInputStream(originalJarFile);
+            IOUtils.copy(jar, newZip);
+            IOUtils.closeQuietly(jar);
+
+            File file = new File(outputDirectory, APP_PATH);
+            file = new File(file, LIB_PATH);
+            file.mkdirs();
+
+            file = new File(file, originalJarFile.getName());
+            if (overwrite || (!file.exists())) {
+                jar = new FileInputStream(originalJarFile);
+                OutputStream fileOutputStream = new FileOutputStream(file);
+                IOUtils.copy(jar, fileOutputStream);
+                IOUtils.closeQuietly(jar);
+                IOUtils.closeQuietly(fileOutputStream);
+            }
+
+            for (Artifact art : resolveArtifact(project.getArtifact(), true)) {
+                if (art == project.getArtifact()) {
+                    continue;
+                }
+                // Only add artifacts with scope "compile" or "runtime"
+                String scope = art.getScope();
+                if (scope == null || scope.equals(Artifact.SCOPE_COMPILE)
+                    || scope.equals(Artifact.SCOPE_RUNTIME)) {
+                    addArtifact(newZip, LIB_PATH, art);
+                }
+            }
+
+            for (Artifact art : 
resolveArtifact(launcher.getArtifact(artifactFactory), true)) {
+                // Only add artifacts with scope "compile" or "runtime"
+                String scope = art.getScope();
+                if (scope == null || scope.equals(Artifact.SCOPE_COMPILE)
+                    || scope.equals(Artifact.SCOPE_RUNTIME)) {
+                    if (art.getArtifactId().contains("launcher")) {
+                        addArtifact(newZip, LAUNCHER_PATH, art);
+                    } else {
+                        addArtifact(newZip, LIB_PATH, art);
+                    }
+                }
+            }
+
+            for (Dependency dependency : bootLibs) {
+                for (Artifact art : 
resolveArtifact(dependency.getArtifact(artifactFactory), true)) {
+                    addArtifact(newZip, BOOT_PATH, art);
+                }
+            }
+
+            for (Dependency dependency : extensions) {
+                for (Artifact art : 
resolveArtifact(dependency.getArtifact(artifactFactory),
+                                                    
loadExtensionDependencies)) {
+                    if (dependency.match(art)) {
+                        addArtifact(newZip, EXTENSION_PATH, art);
+                    }
+
+                    // Load dependencies even for the extension itself
+                    if (loadExtensionDependencies) {
+                        loadTransitiveDependencies(newZip, art);
+                    }
+
+                }
+            }
+
+            for (Dependency dependency : dependencies) {
+                for (Artifact art : 
resolveArtifact(dependency.getArtifact(artifactFactory),
+                                                    
loadExtensionDependencies)) {
+                    loadTransitiveDependencies(newZip, art);
+                }
+            }
+
+            writeDependencyMetadata(newZip);
+
+        } catch (Exception ex) {
+            throw new MojoExecutionException(ex.getMessage(), ex);
+        } finally {
+            IOUtils.closeQuietly(newZip);
+        }
+
+    }
+
+    /**
+     * Adds an entry to the JAR failing safe for duplicate.
+     * 
+     * @param jar JAR to which the entry is added.
+     * @param entry Entry to be added.
+     * @return True if added successfully.
+     * @throws IOException In case of an IO error.
+     */
+    private boolean addEntry(JarOutputStream jar, String entry) throws 
IOException {
+        try {
+            jar.putNextEntry(new JarEntry(entry));
+            return true;
+        } catch (ZipException duplicateEntry) {
+            getLog().info(duplicateEntry.getMessage());
+            return false;
+        }
+    }
+
+    /**
+     * Writes the dependency metadata.
+     * 
+     * @param newZip ZIP to which the metadata is written.
+     * @throws IOException In case of an IO error.
+     */
+    @SuppressWarnings("unchecked")
+    private void writeDependencyMetadata(JarOutputStream newZip) throws 
IOException {
+
+        FileOutputStream depMapOutStream = null;
+        FileInputStream depMapInStream = null;
+
+        try {
+            String metadataFile = "dependency.metadata";
+
+            File file = new File(outputDirectory, APP_PATH);
+            file = new File(file, REPOSITORY_PATH);
+            file.mkdirs();
+
+            file = new File(file, metadataFile);
+            if ((!overwrite) && file.exists()) {
+                // Try to merge the dependency map
+                InputStream is = new FileInputStream(file);
+                XMLDecoder decoder = new XMLDecoder(is);
+                Map map = (Map)decoder.readObject();
+                decoder.close();
+                for (Object o : map.entrySet()) {
+                    Map.Entry e = (Map.Entry)o;
+                    Set s = (Set)transDepenedencyMap.get(e.getKey());
+                    if (s != null) {
+                        s.addAll((Set)e.getValue());
+                    }
+                }
+            }
+
+            depMapOutStream = new FileOutputStream(file);
+            XMLEncoder xmlEncoder = new XMLEncoder(depMapOutStream);
+            xmlEncoder.writeObject(transDepenedencyMap);
+            xmlEncoder.close();
+
+            if (addEntry(newZip, REPOSITORY_PATH + metadataFile)) {
+                depMapInStream = new FileInputStream(file);
+                IOUtils.copy(depMapInStream, newZip);
+            }
+
+        } finally {
+            IOUtils.closeQuietly(depMapOutStream);
+            IOUtils.closeQuietly(depMapInStream);
+        }
+
+    }
+
+    /**
+     * Builds the transitive dependencies for artifacts.
+     * 
+     * @param newZip WARto which the artifacts are added.
+     * @param art Extension artifact.
+     * @throws IOException In case of an unexpected IO error.
+     * @throws ArtifactResolutionException If the artifact cannot be resolved.
+     * @throws ArtifactNotFoundException If the artifact is not found.
+     * @throws ArtifactMetadataRetrievalException In case of error in 
retrieving
+     *             metadata.
+     */
+    @SuppressWarnings("unchecked")
+    private void loadTransitiveDependencies(JarOutputStream newWar, Artifact 
art) throws IOException,
+        ArtifactResolutionException, ArtifactNotFoundException, 
ArtifactMetadataRetrievalException {
+
+        String artPath = art.getGroupId() + "/" + art.getArtifactId() + "/" + 
art.getVersion() + "/";
+        String path = REPOSITORY_PATH + artPath;
+        addArtifact(newWar, path, art);
+
+        Set<String> transDepenedenyList = new HashSet<String>();
+        transDepenedencyMap.put(artPath, transDepenedenyList);
+
+        // Get the transitive dependencies for each dependency.
+        for (Artifact transArt : resolveArtifact(art, true)) {
+            String transArtPath =
+                transArt.getGroupId() + "/" + transArt.getArtifactId() + "/" + 
transArt.getVersion() + "/";
+            if (addArtifact(newWar, REPOSITORY_PATH + transArtPath, transArt)) 
{
+                transDepenedenyList.add(transArtPath + 
transArt.getFile().getName());
+            }
+        }
+
+    }
+
+    /**
+     * Resolves the specified artifact.
+     * 
+     * @param artifact Artifact to be resolved.
+     * @param transitive Whether to resolve transitively.
+     * @return A set of resolved artifacts.
+     * @throws IOException In case of an unexpected IO error.
+     * @throws ArtifactResolutionException If the artifact cannot be resolved.
+     * @throws ArtifactNotFoundException If the artifact is not found.
+     * @throws ArtifactMetadataRetrievalException In case of error in 
retrieving
+     *             metadata.
+     */
+    private Set<Artifact> resolveArtifact(Artifact artifact, boolean 
transitive) throws IOException,
+        ArtifactResolutionException, ArtifactNotFoundException, 
ArtifactMetadataRetrievalException {
+
+        Set<Artifact> resolvedArtifacts = new HashSet<Artifact>();
+
+        // Resolve the artifact
+        resolver.resolve(artifact, remoteRepositories, localRepository);
+        resolvedArtifacts.add((Artifact)artifact);
+
+        if (!transitive) {
+            return resolvedArtifacts;
+        }
+
+        // Transitively resolve all the dependencies
+        ResolutionGroup resolutionGroup =
+            metadataSource.retrieve(artifact, localRepository, 
remoteRepositories);
+        ArtifactResolutionResult result =
+            resolver.resolveTransitively(resolutionGroup.getArtifacts(),
+                                         artifact,
+                                         remoteRepositories,
+                                         localRepository,
+                                         metadataSource);
+
+        // Add the artifacts to the deployment unit
+        for (Object depArtifact : result.getArtifacts()) {
+            resolvedArtifacts.add((Artifact)depArtifact);
+        }
+        return resolvedArtifacts;
+
+    }
+
+    /**
+     * Adds the artifact to the zip file.
+     * 
+     * @param newZip Zip file to which the artifact is added.
+     * @param path Path within the zip file where artifact is added.
+     * @param artifact Artifact to be added.
+     * @throws IOException In case of an unexpected IO error.
+     */
+    private boolean addArtifact(JarOutputStream newZip, String path, Artifact 
artifact) throws IOException {
+
+        FileInputStream artifactStream = null;
+        FileOutputStream fileOutputStream = null;
+
+        try {
+
+            File artifactFile = artifact.getFile();
+            // For extensions, we'll add it even the packagedLibs has it
+            if ((!EXTENSION_PATH.equals(path)) && 
packagedLibs.contains(artifactFile.getName())) {
+                return false;
+            }
+            artifactStream = new FileInputStream(artifactFile);
+
+            newZip.putNextEntry(new JarEntry(path + artifactFile.getName()));
+
+            File file = new File(outputDirectory, APP_PATH);
+            file = new File(file, path);
+            file.mkdirs();
+
+            file = new File(file, artifactFile.getName());
+            if (overwrite || (!file.exists())) {
+                fileOutputStream = new FileOutputStream(file);
+                IOUtils.copy(artifactStream, fileOutputStream);
+                IOUtils.closeQuietly(artifactStream);
+            }
+
+            artifactStream = new FileInputStream(artifactFile);
+            IOUtils.copy(artifactStream, newZip);
+
+            packagedLibs.add(artifactFile.getName());
+
+            getLog().info("Processed " + path + artifactFile.getName());
+            return true;
+
+        } finally {
+            IOUtils.closeQuietly(artifactStream);
+            IOUtils.closeQuietly(fileOutputStream);
+        }
+
+    }
+
+}

Propchange: 
incubator/tuscany/java/sca/plugins/plugin.standalone/src/main/java/org/apache/tuscany/plugin/standalone/TuscanyStandaloneMojo.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/tuscany/java/sca/plugins/plugin.standalone/src/main/java/org/apache/tuscany/plugin/standalone/TuscanyStandaloneMojo.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/tuscany/java/sca/plugins/pom.xml
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/plugins/pom.xml?view=diff&rev=465105&r1=465104&r2=465105
==============================================================================
--- incubator/tuscany/java/sca/plugins/pom.xml (original)
+++ incubator/tuscany/java/sca/plugins/pom.xml Tue Oct 17 17:10:04 2006
@@ -58,6 +58,7 @@
 
     <modules>
         <module>plugin.war</module>
+        <module>plugin.standalone</module>
         <module>plugin.wsdl2java</module>
         <module>plugin.java2wsdl</module>
     </modules>



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to