Author: snicoll
Date: Sat Jan 21 07:55:44 2006
New Revision: 371078
URL: http://svn.apache.org/viewcvs?rev=371078&view=rev
Log:
- Changed the package structure to org.apache.maven.plugin.source
- Added the source:download goal
Added:
maven/maven-1/plugins-sandbox/trunk/source/src/main/org/apache/maven/plugin/
maven/maven-1/plugins-sandbox/trunk/source/src/main/org/apache/maven/plugin/source/
- copied from r370552,
maven/maven-1/plugins-sandbox/trunk/source/src/main/org/apache/maven/source/
maven/maven-1/plugins-sandbox/trunk/source/src/main/org/apache/maven/plugin/source/JavaSourcesDownloader.java
(with props)
Removed:
maven/maven-1/plugins-sandbox/trunk/source/src/main/org/apache/maven/source/
Modified:
maven/maven-1/plugins-sandbox/trunk/source/plugin.jelly
maven/maven-1/plugins-sandbox/trunk/source/project.xml
maven/maven-1/plugins-sandbox/trunk/source/src/main/org/apache/maven/plugin/source/JavaSourceArtifactTypeHandler.java
maven/maven-1/plugins-sandbox/trunk/source/src/main/org/apache/maven/plugin/source/package.html
maven/maven-1/plugins-sandbox/trunk/source/xdocs/goals.xml
maven/maven-1/plugins-sandbox/trunk/source/xdocs/index.xml
Modified: maven/maven-1/plugins-sandbox/trunk/source/plugin.jelly
URL:
http://svn.apache.org/viewcvs/maven/maven-1/plugins-sandbox/trunk/source/plugin.jelly?rev=371078&r1=371077&r2=371078&view=diff
==============================================================================
--- maven/maven-1/plugins-sandbox/trunk/source/plugin.jelly (original)
+++ maven/maven-1/plugins-sandbox/trunk/source/plugin.jelly Sat Jan 21 07:55:44
2006
@@ -22,9 +22,20 @@
xmlns:j="jelly:core"
xmlns:ant="jelly:ant"
xmlns:artifact="artifact"
- xmlns:util="jelly:util">
+ xmlns:util="jelly:util"
+ xmlns:i="jelly:interaction"
+ xmlns:define="jelly:define"
+ xmlns:maven="jelly:maven"
+ xmlns:source="source">
+
+ <define:taglib uri="source">
+ <define:jellybean
+ name="download-java-sources"
+ className="org.apache.maven.plugin.source.JavaSourcesDownloader"
+ method="downloadJavaSources"/>
+ </define:taglib>
- <j:new var="javaSourceTypeHandler"
className="org.apache.maven.source.JavaSourceArtifactTypeHandler" />
+ <j:new var="javaSourceTypeHandler"
className="org.apache.maven.plugin.source.JavaSourceArtifactTypeHandler" />
<!-- ================================================================== -->
<!-- S O U R C E -->
@@ -85,6 +96,48 @@
type="java-source"
project="${pom}"
typeHandler="${javaSourceTypeHandler}"/>
+ </goal>
+
+
+ <!-- ================================================================== -->
+ <!-- D O W N L O A D S O U R C E -->
+ <!-- ================================================================== -->
+
+ <goal name="source:download" description="Download a source archive from the
repository">
+ <j:if test="${empty(artifactId)}">
+ <i:ask question="What is the artifactId of the source archive to
download?"
+ answer="artifactId"/>
+ </j:if>
+ <maven:param-check value="${artifactId}" fail="true" message="'artifactId'
must be specified"/>
+
+ <j:if test="${empty(groupId)}">
+ <i:ask question="What is the groupId of the source archive to download?"
+ answer="groupId"/>
+ </j:if>
+ <maven:param-check value="${groupId}" fail="true" message="'groupId' must
be specified"/>
+
+ <j:if test="${empty(version)}">
+ <i:ask question="What is the version of the source archive to download?"
+ answer="version"/>
+ </j:if>
+ <maven:param-check value="${version}" fail="true" message="'version' must
be specified"/>
+
+ <j:if test="${empty(ignoreErrors)}">
+ <j:set var="ignoreErrors" value="false"/>
+ </j:if>
+
+ <j:if test="${empty(backwardCompatible)}">
+ <j:set var="backwardCompatible" value="false"/>
+ </j:if>
+
+ <source:download-java-sources
+ project="${pom}"
+ groupId="${groupId}"
+ artifactId="${artifactId}"
+ version="${version}"
+ ignoreErrors="${ignoreErrors}"
+ backwardCompatible="${backwardCompatible}"
+ />
</goal>
Modified: maven/maven-1/plugins-sandbox/trunk/source/project.xml
URL:
http://svn.apache.org/viewcvs/maven/maven-1/plugins-sandbox/trunk/source/project.xml?rev=371078&r1=371077&r2=371078&view=diff
==============================================================================
--- maven/maven-1/plugins-sandbox/trunk/source/project.xml (original)
+++ maven/maven-1/plugins-sandbox/trunk/source/project.xml Sat Jan 21 07:55:44
2006
@@ -51,5 +51,43 @@
<artifactId>maven</artifactId>
<version>1.0.2</version>
</dependency>
+ <dependency>
+ <groupId>maven</groupId>
+ <artifactId>maven-model</artifactId>
+ <version>3.0.1</version>
+ <properties>
+ <comment>This library is already loaded by maven's core. Be careful to
use the same version number as in the core.</comment>
+ </properties>
+ </dependency>
+ <dependency>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ <version>1.0.4</version>
+ <properties>
+ <comment>This library is already loaded by maven's core. Be careful to
use the same version number as in the core.</comment>
+ </properties>
+ </dependency>
+ <dependency>
+ <groupId>commons-lang</groupId>
+ <artifactId>commons-lang</artifactId>
+ <version>2.0</version>
+ <type>jar</type>
+ <properties>
+ <comment>This library is already loaded by maven's core. Be careful to
use the same version number as in the core.</comment>
+ </properties>
+ </dependency>
+ <dependency>
+ <groupId>commons-jelly</groupId>
+ <artifactId>commons-jelly</artifactId>
+ <version>1.0</version>
+ <properties>
+ <comment>This library is already loaded by maven's core. Be careful to
use the same version number as in the core.</comment>
+ </properties>
+ </dependency>
+ <dependency>
+ <groupId>commons-jelly</groupId>
+ <artifactId>commons-jelly-tags-interaction</artifactId>
+ <version>1.0</version>
+ </dependency>
</dependencies>
</project>
Modified:
maven/maven-1/plugins-sandbox/trunk/source/src/main/org/apache/maven/plugin/source/JavaSourceArtifactTypeHandler.java
URL:
http://svn.apache.org/viewcvs/maven/maven-1/plugins-sandbox/trunk/source/src/main/org/apache/maven/plugin/source/JavaSourceArtifactTypeHandler.java?rev=371078&r1=370552&r2=371078&view=diff
==============================================================================
---
maven/maven-1/plugins-sandbox/trunk/source/src/main/org/apache/maven/plugin/source/JavaSourceArtifactTypeHandler.java
(original)
+++
maven/maven-1/plugins-sandbox/trunk/source/src/main/org/apache/maven/plugin/source/JavaSourceArtifactTypeHandler.java
Sat Jan 21 07:55:44 2006
@@ -1,4 +1,4 @@
-package org.apache.maven.source;
+package org.apache.maven.plugin.source;
/* ====================================================================
* Copyright 2001-2005 The Apache Software Foundation.
Added:
maven/maven-1/plugins-sandbox/trunk/source/src/main/org/apache/maven/plugin/source/JavaSourcesDownloader.java
URL:
http://svn.apache.org/viewcvs/maven/maven-1/plugins-sandbox/trunk/source/src/main/org/apache/maven/plugin/source/JavaSourcesDownloader.java?rev=371078&view=auto
==============================================================================
---
maven/maven-1/plugins-sandbox/trunk/source/src/main/org/apache/maven/plugin/source/JavaSourcesDownloader.java
(added)
+++
maven/maven-1/plugins-sandbox/trunk/source/src/main/org/apache/maven/plugin/source/JavaSourcesDownloader.java
Sat Jan 21 07:55:44 2006
@@ -0,0 +1,339 @@
+/*
+ * Copyright (c) 2006 Your Corporation. All Rights Reserved.
+ */
+package org.apache.maven.plugin.source;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.maven.AbstractMavenComponent;
+import org.apache.maven.project.Project;
+import org.apache.maven.util.HttpUtils;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.Iterator;
+
+/**
+ * An helper class used to download java sources archives.
+ *
+ * @author <a href="[EMAIL PROTECTED]">Stephane Nicoll</a>
+ * @version $Id$
+ */
+public class JavaSourcesDownloader
+ extends AbstractMavenComponent
+{
+ private static final String PROXY_LOGINHOST = "maven.proxy.ntlm.host";
+
+ private static final String PROXY_LOGINDOMAIN = "maven.proxy.ntlm.domain";
+
+ private static final Log log = LogFactory.getLog(
JavaSourcesDownloader.class );
+
+ private Project project;
+
+ private String groupId;
+
+ private String artifactId;
+
+ private String version;
+
+ private boolean ignoreErrors;
+
+ private boolean backwardCompatible;
+
+
+ /**
+ * Download the Java sources archive from the configured repositories.
+ *
+ * @throws NullPointerException if a mandatory parameter is not
initialized
+ * @throws FileNotFoundException if ignoreErrors is false and the archive
is not found
+ */
+ public void downloadJavaSources()
+ throws NullPointerException, FileNotFoundException
+ {
+ if ( project == null )
+ {
+ throw new NullPointerException( "project should be set." );
+ }
+
+ if ( groupId == null )
+ {
+ throw new NullPointerException( "groupId should be set." );
+ }
+
+ if ( artifactId == null )
+ {
+ throw new NullPointerException( "artifactId should be set." );
+ }
+
+ if ( version == null )
+ {
+ throw new NullPointerException( "version should be set." );
+ }
+
+ final String dependencyId = groupId + ":" + artifactId + ":" + version;
+
+ final String relativePath = buildRelativePath();
+ final File localFile = new File(
project.getContext().getMavenRepoLocal(), relativePath );
+ final String backwareCompatibleRelativePath =
buildBackwardCompatibleRelativePath();
+ final File backwardCompatibleLocalFile =
+ new File( project.getContext().getMavenRepoLocal(),
backwareCompatibleRelativePath );
+
+ boolean artifactFound;
+ if ( isSnapshot() )
+ {
+ artifactFound = getRemoteArtifact( localFile, relativePath,
dependencyId );
+ if ( backwardCompatible )
+ {
+ artifactFound =
+ getRemoteArtifact( backwardCompatibleLocalFile,
backwareCompatibleRelativePath, dependencyId );
+ }
+
+ // Do not go further if the artifact is in the local repository
+ if ( localFile.exists() || ( backwardCompatible &&
backwardCompatibleLocalFile.exists() ) )
+ {
+ return;
+ }
+ }
+ else
+ {
+ if ( localFile.exists() || ( backwardCompatible &&
backwardCompatibleLocalFile.exists() ) )
+ {
+ log.debug( "source for " + dependencyId + " is available in
the local repository." );
+ return;
+ }
+ else
+ {
+ // download it
+ artifactFound = getRemoteArtifact( localFile, relativePath,
dependencyId );
+ if ( !artifactFound && backwardCompatible )
+ {
+ artifactFound =
+ getRemoteArtifact( backwardCompatibleLocalFile,
backwareCompatibleRelativePath, dependencyId );
+ }
+ }
+ }
+
+ if ( !ignoreErrors && !artifactFound )
+ {
+ throw new FileNotFoundException( "Could not download source for "
+ dependencyId + " from any repository " +
+ getProject().getContext().getMavenRepoRemote() );
+ }
+ }
+
+ // Getters & Setters
+
+
+ public Project getProject()
+ {
+ return project;
+ }
+
+ public void setProject( final Project project )
+ {
+ this.project = project;
+ }
+
+ public String getGroupId()
+ {
+ return groupId;
+ }
+
+ public void setGroupId( final String groupId )
+ {
+ this.groupId = groupId;
+ }
+
+ public String getArtifactId()
+ {
+ return artifactId;
+ }
+
+ public void setArtifactId( final String artifactId )
+ {
+ this.artifactId = artifactId;
+ }
+
+ public String getVersion()
+ {
+ return version;
+ }
+
+ public void setVersion( final String version )
+ {
+ this.version = version;
+ }
+
+ public boolean isIgnoreErrors()
+ {
+ return ignoreErrors;
+ }
+
+ public void setIgnoreErrors( final boolean ignoreErrors )
+ {
+ this.ignoreErrors = ignoreErrors;
+ }
+
+ public boolean isBackwardCompatible()
+ {
+ return backwardCompatible;
+ }
+
+ public void setBackwardCompatible( final boolean backwardCompatible )
+ {
+ this.backwardCompatible = backwardCompatible;
+ }
+
+ /**
+ * Builds the relative path to the source archive.
+ *
+ * @return the relative path to the source archive
+ */
+ private String buildRelativePath()
+ {
+ StringBuffer sb = new StringBuffer();
+ sb.append( groupId ).append( "/java-sources/" ).append( artifactId
).append( "-" ).append( version ).append(
+ "-sources.jar" );
+ return sb.toString();
+ }
+
+ /**
+ * Build the backware compatible relative path to the source archive.
+ *
+ * @return the backware compatible relative path to the source archive
+ */
+ private String buildBackwardCompatibleRelativePath()
+ {
+ StringBuffer sb = new StringBuffer();
+ sb.append( groupId ).append( "/src/" ).append( artifactId ).append(
"-" ).append( version ).append( ".zip" );
+ return sb.toString();
+ }
+
+ /**
+ * Specify whether the source archive to download is a SNAPSHOT or not.
+ *
+ * @return true if the source archive is a SNAPSHOT, false otherwise
+ */
+ private boolean isSnapshot()
+ {
+ return version.endsWith( "SNAPSHOT" );
+ }
+
+ // Taken from maven core code in order to mimic the current behavior
+
+ /**
+ * Retrieve a <code>remoteFile</code> from the maven remote repositories
+ * and store it at <code>destinationFile</code>
+ *
+ * @param destinationFile the destination file in the local repository
+ * @param relativePath the relative path to the dependency
+ * @param dependencyId the dependency Id
+ * @return true if the retrieval succeeds, false otherwise.
+ */
+ private boolean getRemoteArtifact( File destinationFile, String
relativePath, String dependencyId )
+ {
+
+ // The directory structure for the project this dependency belongs to
+ // may not exists so attempt to create the project directory structure
+ // before attempting to download the dependency.
+ File directory = destinationFile.getParentFile();
+
+ if ( !directory.exists() )
+ {
+ directory.mkdirs();
+ }
+
+ log.info( "Attempting to download sources for " + dependencyId + "
("+relativePath+")" );
+
+ boolean artifactFound = false;
+
+ for ( Iterator i =
getProject().getContext().getMavenRepoRemote().iterator(); i.hasNext(); )
+ {
+ String remoteRepo = (String) i.next();
+
+ if ( remoteRepo.endsWith( "/" ) )
+ {
+ remoteRepo = remoteRepo.substring( 0, remoteRepo.length() - 1
);
+ }
+
+ // The username and password parameters are not being
+ // used here. Those are the "" parameters you see below.
+ String url = remoteRepo + "/" + relativePath;
+ url = StringUtils.replace( url, "//", "/" );
+
+ if ( !url.startsWith( "file" ) )
+ {
+ if ( url.startsWith( "https" ) )
+ {
+ url = StringUtils.replace( url, "https:/", "https://" );
+ }
+ else
+ {
+ url = StringUtils.replace( url, "http:/", "http://" );
+ }
+ }
+ log.debug( "Trying to download source at " + url );
+
+ // Attempt to retrieve the artifact and set the checksum if
retrieval
+ // of the checksum file was successful.
+ try
+ {
+ String loginHost = (String)
getProject().getContext().getVariable( PROXY_LOGINHOST );
+ String loginDomain = (String)
getProject().getContext().getVariable( PROXY_LOGINDOMAIN );
+ HttpUtils.getFile( url, destinationFile, false, true,
getProject().getContext().getProxyHost(),
+ getProject().getContext().getProxyPort(),
+
getProject().getContext().getProxyUserName(),
+
getProject().getContext().getProxyPassword(), loginHost, loginDomain, true );
+
+ // Artifact was found, continue checking additional remote
repos (if any)
+ // in case there is a newer version (i.e. snapshots) in
another repo
+ artifactFound = true;
+
+ if ( !isSnapshot() )
+ {
+ log.info( "Downloded source for " + dependencyId + " at "
+ url );
+ break;
+ }
+ }
+ catch ( FileNotFoundException e )
+ {
+ // Multiple repositories may exist, and if the file is not
found
+ // in just one of them, it's no problem, and we don't want to
+ // even print out an error.
+ // if it's not found at all, artifactFound will be false, and
the
+ // build _will_ break, and the user will get an error message
+ log.debug( "File not found on one of the repos", e );
+ }
+ catch ( Exception e )
+ {
+ // If there are additional remote repos, then ignore exception
+ // as artifact may be found in another remote repo. If there
+ // are no more remote repos to check and the artifact wasn't
found in
+ // a previous remote repo, then artifactFound is false
indicating
+ // that the artifact could not be found in any of the remote
repos
+ //
+ // arguably, we need to give the user better control (another
command-
+ // line switch perhaps) of what to do in this case? Maven
already has
+ // a command-line switch to work in offline mode, but what
about when
+ // one of two or more remote repos is unavailable? There may
be multiple
+ // remote repos for redundancy, in which case you probably
want the build
+ // to continue. There may however be multiple remote repos
because some
+ // artifacts are on one, and some are on another. In this
case, you may
+ // want the build to break.
+ //
+ // print a warning, in any case, so user catches on to mistyped
+ // hostnames, or other snafus
+ // FIXME: localize this message
+ String[] parsedUrl = HttpUtils.parseUrl( url );
+ log.warn( "Error retrieving artifact from [" + parsedUrl[2] +
"]: " + e );
+ if ( parsedUrl[0] != null )
+ {
+ log.debug( "Username was '" + parsedUrl[0] + "', password
hidden" );
+ }
+ log.debug( "Error details", e );
+ }
+ }
+
+ return artifactFound;
+ }
+}
Propchange:
maven/maven-1/plugins-sandbox/trunk/source/src/main/org/apache/maven/plugin/source/JavaSourcesDownloader.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
maven/maven-1/plugins-sandbox/trunk/source/src/main/org/apache/maven/plugin/source/JavaSourcesDownloader.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Modified:
maven/maven-1/plugins-sandbox/trunk/source/src/main/org/apache/maven/plugin/source/package.html
URL:
http://svn.apache.org/viewcvs/maven/maven-1/plugins-sandbox/trunk/source/src/main/org/apache/maven/plugin/source/package.html?rev=371078&r1=370552&r2=371078&view=diff
==============================================================================
---
maven/maven-1/plugins-sandbox/trunk/source/src/main/org/apache/maven/plugin/source/package.html
(original)
+++
maven/maven-1/plugins-sandbox/trunk/source/src/main/org/apache/maven/plugin/source/package.html
Sat Jan 21 07:55:44 2006
@@ -17,7 +17,7 @@
-->
<html>
<head>
- <title>org.apache.maven.source</title>
+ <title>org.apache.maven.plugin.source</title>
</head>
<body>
Modified: maven/maven-1/plugins-sandbox/trunk/source/xdocs/goals.xml
URL:
http://svn.apache.org/viewcvs/maven/maven-1/plugins-sandbox/trunk/source/xdocs/goals.xml?rev=371078&r1=371077&r2=371078&view=diff
==============================================================================
--- maven/maven-1/plugins-sandbox/trunk/source/xdocs/goals.xml (original)
+++ maven/maven-1/plugins-sandbox/trunk/source/xdocs/goals.xml Sat Jan 21
07:55:44 2006
@@ -22,6 +22,10 @@
<name>source:source</name>
<description>Create the source archive.</description>
</goal>
+ <goal>
+ <name>source:download</name>
+ <description>Download a source archive from the
repository.</description>
+ </goal>
</goals>
</body>
</document>
Modified: maven/maven-1/plugins-sandbox/trunk/source/xdocs/index.xml
URL:
http://svn.apache.org/viewcvs/maven/maven-1/plugins-sandbox/trunk/source/xdocs/index.xml?rev=371078&r1=371077&r2=371078&view=diff
==============================================================================
--- maven/maven-1/plugins-sandbox/trunk/source/xdocs/index.xml (original)
+++ maven/maven-1/plugins-sandbox/trunk/source/xdocs/index.xml Sat Jan 21
07:55:44 2006
@@ -32,6 +32,10 @@
in this property is used to generate the source archive.
</p>
<p>
+ The generated source archive will be deployed at
+
<code>${groupId}/java-sources/${artifactId}-{version}-sources.jar</code>.
+ </p>
+ <p>
For more information on the functionality provided by this plugin,
please see the <a href="goals.html">Goals</a> document.
</p>
@@ -40,6 +44,30 @@
by this plugin, please see the <a href="properties.html">properties</a>
document.
</p>
+ </section>
+ <section name="Downloading a source archive">
+ <p>
+ Similarly to the plugin plugin, the source plugin is able to download
+ a source archive from the configured repository(ies). The following
+ parameters might be set at runtime:
+ <ul>
+ <li>groupId: the groupId of the source archive to download</li>
+ <li>artifactId: the artifactId of the source archive to download</li>
+ <li>version: the version of the source archive to download</li>
+ <li>ignoreErrors (optional - default to false): specificy if the
build should fail if the source archive is not found</li>
+ <li>backwardCompatible (optional - default to false): specificy if
the old source archive location should be checked as well</li>
+ </ul>
+ </p>
+ <p>
+ Example:
+ </p>
+ <source>
+ maven source:download
+ -DartifactId=someArtifact
+ -DgroupId=theGroup
+ -Dversion=1.0.0-SNAPSHOT
+ -DbackwardCompatible=true
+ </source>
</section>
</body>
</document>