Author: snicoll
Date: Fri Jan 13 14:40:30 2006
New Revision: 368890
URL: http://svn.apache.org/viewcvs?rev=368890&view=rev
Log:
MPECLIPSE-60: Now trying to download java sources archives from the remote
repositories.
Added:
maven/maven-1/plugins/trunk/eclipse/src/main/
maven/maven-1/plugins/trunk/eclipse/src/main/org/
maven/maven-1/plugins/trunk/eclipse/src/main/org/maven/
maven/maven-1/plugins/trunk/eclipse/src/main/org/maven/eclipse/
maven/maven-1/plugins/trunk/eclipse/src/main/org/maven/eclipse/JavaSourcesDownloader.java
(with props)
Modified:
maven/maven-1/plugins/trunk/eclipse/plugin.jelly
maven/maven-1/plugins/trunk/eclipse/plugin.properties
maven/maven-1/plugins/trunk/eclipse/project.xml
maven/maven-1/plugins/trunk/eclipse/xdocs/changes.xml
maven/maven-1/plugins/trunk/eclipse/xdocs/index.xml
maven/maven-1/plugins/trunk/eclipse/xdocs/properties.xml
Modified: maven/maven-1/plugins/trunk/eclipse/plugin.jelly
URL:
http://svn.apache.org/viewcvs/maven/maven-1/plugins/trunk/eclipse/plugin.jelly?rev=368890&r1=368889&r2=368890&view=diff
==============================================================================
--- maven/maven-1/plugins/trunk/eclipse/plugin.jelly (original)
+++ maven/maven-1/plugins/trunk/eclipse/plugin.jelly Fri Jan 13 14:40:30 2006
@@ -17,9 +17,14 @@
*/
-->
<project xmlns:j="jelly:core" xmlns:ant="jelly:ant" xmlns:util="jelly:util"
xmlns:define="jelly:define"
- xmlns:maven="jelly:maven">
+ xmlns:maven="jelly:maven" xmlns:eclipse="eclipse">
+
+ <define:taglib uri="eclipse">
+ <define:jellybean
+ name="download-sources"
+ className="org.apache.maven.eclipse.JavaSourcesDownloader"
+ method="downloadJavaSources"/>
- <define:taglib uri="eclipse">
<define:tag name="write-classpath-entry">
<maven:param-check value="${groupId}" fail="true" message="'groupId'
must be specified" />
<maven:param-check value="${artifactId}" fail="true"
message="'artifactId' must be specified" />
@@ -30,6 +35,17 @@
<j:if test='${relativePathCheck == "X"}'>
<j:set var="relativePath"
value="${groupId}/jars/${artifactId}-${version}.jar" />
</j:if>
+
+ <!-- download the source from the remote repository if necessary -->
+ <j:if test="${maven.eclipse.src.download}">
+ <eclipse:download-sources
+ project="${pom}"
+ groupId="${groupId}"
+ artifactId="${artifactId}"
+ version="${version}"
+ />
+ </j:if>
+
<!--
should be (m1 repo layout):
${groupId}/java-sources/${artifactId}-${version}-sources.jar
Modified: maven/maven-1/plugins/trunk/eclipse/plugin.properties
URL:
http://svn.apache.org/viewcvs/maven/maven-1/plugins/trunk/eclipse/plugin.properties?rev=368890&r1=368889&r2=368890&view=diff
==============================================================================
--- maven/maven-1/plugins/trunk/eclipse/plugin.properties (original)
+++ maven/maven-1/plugins/trunk/eclipse/plugin.properties Fri Jan 13 14:40:30
2006
@@ -26,5 +26,6 @@
maven.eclipse.goals = plugins
maven.gen.src=${maven.build.dir}/generated-sources
maven.eclipse.src.extension = zip
+maven.eclipse.src.download = true
maven.eclipse.resources.addtoclasspath=false
maven.eclipse.servletapilist=javax.servlet:servlet-api,servletapi:servletapi,geronimo-spec:geronimo-spec-servlet
Modified: maven/maven-1/plugins/trunk/eclipse/project.xml
URL:
http://svn.apache.org/viewcvs/maven/maven-1/plugins/trunk/eclipse/project.xml?rev=368890&r1=368889&r2=368890&view=diff
==============================================================================
--- maven/maven-1/plugins/trunk/eclipse/project.xml (original)
+++ maven/maven-1/plugins/trunk/eclipse/project.xml Fri Jan 13 14:40:30 2006
@@ -116,5 +116,47 @@
</roles>
<timezone>+1</timezone>
</developer>
+ <developer>
+ <name>Stephane Nicoll</name>
+ <id>snicoll</id>
+ <email>[EMAIL PROTECTED]</email>
+ <organization>ASF</organization>
+ <roles>
+ <role>Java Developer</role>
+ </roles>
+ <timezone>+1</timezone>
+ </developer>
</developers>
+ <dependencies>
+ <dependency>
+ <groupId>maven</groupId>
+ <artifactId>maven</artifactId>
+ <version>1.0.2</version>
+ </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>
+ </dependencies>
</project>
Added:
maven/maven-1/plugins/trunk/eclipse/src/main/org/maven/eclipse/JavaSourcesDownloader.java
URL:
http://svn.apache.org/viewcvs/maven/maven-1/plugins/trunk/eclipse/src/main/org/maven/eclipse/JavaSourcesDownloader.java?rev=368890&view=auto
==============================================================================
---
maven/maven-1/plugins/trunk/eclipse/src/main/org/maven/eclipse/JavaSourcesDownloader.java
(added)
+++
maven/maven-1/plugins/trunk/eclipse/src/main/org/maven/eclipse/JavaSourcesDownloader.java
Fri Jan 13 14:40:30 2006
@@ -0,0 +1,279 @@
+package org.apache.maven.eclipse;
+
+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.MavenConstants;
+import org.apache.maven.project.Dependency;
+import org.apache.maven.project.Project;
+import org.apache.maven.util.HttpUtils;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.Iterator;
+
+/* ====================================================================
+ * Copyright 2001-2004 The Apache Software Foundation.
+ *
+ * Licensed 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.
+ * ====================================================================
+ */
+
+/**
+ * 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 Log log = LogFactory.getLog(
JavaSourcesDownloader.class );
+
+ private Project project;
+
+ private String groupId;
+
+ private String artifactId;
+
+ private String version;
+
+
+ public void downloadJavaSources()
+ throws Exception
+ {
+ 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;
+ Dependency dependency = project.getDependency( dependencyId );
+ if ( dependency == null )
+ {
+ log.warn("Could not retrieve dependency object for[" +
dependencyId + "] - skipping" );
+ return;
+ }
+
+ String relativePath = buildRelativePath();
+ File localFile = new File( project.getContext().getMavenRepoLocal(),
relativePath );
+ if ( isSnapshot() )
+ {
+ getRemoteArtifact( localFile, relativePath, dependency );
+ }
+ else
+ {
+ if ( localFile.exists() )
+ {
+ log.debug( "source for[" + groupId + ":" + artifactId + ":" +
version +
+ "] is available in the local repository." );
+ return;
+ }
+ else
+ {
+ // download it
+ getRemoteArtifact( localFile, relativePath, dependency );
+ }
+ }
+ }
+
+ private String buildRelativePath()
+ {
+ StringBuffer sb = new StringBuffer();
+ sb.append( groupId ).append( "/java-sources/" ).append( artifactId
).append( "-" ).append( version ).append(
+ "-sources.jar" );
+ return sb.toString();
+ }
+
+ private boolean isSnapshot()
+ {
+ return version.endsWith( "SNAPSHOT" );
+ }
+
+ // 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;
+ }
+
+ // 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
+ * @return true if the retrieval succeeds, false otherwise.
+ */
+ private boolean getRemoteArtifact( File destinationFile, String
relativePath, Dependency relatedDependency )
+ {
+
+ // 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 " +
relatedDependency.getArtifact());
+
+ 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( MavenConstants.PROXY_LOGINHOST );
+ String loginDomain = (String)
getProject().getContext().getVariable( MavenConstants.PROXY_LOGINDOMAIN );
+ String meterType = (String)
getProject().getContext().getVariable( MavenConstants.DOWNLOAD_METER );
+ if ( meterType != null )
+ {
+ HttpUtils.setMeterType( meterType );
+ }
+ 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() )
+ {
+ 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/trunk/eclipse/src/main/org/maven/eclipse/JavaSourcesDownloader.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
maven/maven-1/plugins/trunk/eclipse/src/main/org/maven/eclipse/JavaSourcesDownloader.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Modified: maven/maven-1/plugins/trunk/eclipse/xdocs/changes.xml
URL:
http://svn.apache.org/viewcvs/maven/maven-1/plugins/trunk/eclipse/xdocs/changes.xml?rev=368890&r1=368889&r2=368890&view=diff
==============================================================================
--- maven/maven-1/plugins/trunk/eclipse/xdocs/changes.xml (original)
+++ maven/maven-1/plugins/trunk/eclipse/xdocs/changes.xml Fri Jan 13 14:40:30
2006
@@ -23,6 +23,9 @@
<author email="[EMAIL PROTECTED]">dIon Gillard</author>
</properties>
<body>
+ <release version="1.11" date="in SVN">
+ <action dev="snicoll" type="add" issue="MPECLIPSE-60">Now trying to
download java sources archives from the remote repositories.</action>
+ </release>
<release version="1.10" date="2005-12-03">
<action dev="carlos" type="fix">Moved test classpath before main so test
classpath resources override main ones</action>
<action dev="epugh" type="fix"
issue="MPECLIPSE-68">eclipse:add-maven-repo doesn't update correct Eclipse
property file for Eclipse 3.x</action>
Modified: maven/maven-1/plugins/trunk/eclipse/xdocs/index.xml
URL:
http://svn.apache.org/viewcvs/maven/maven-1/plugins/trunk/eclipse/xdocs/index.xml?rev=368890&r1=368889&r2=368890&view=diff
==============================================================================
--- maven/maven-1/plugins/trunk/eclipse/xdocs/index.xml (original)
+++ maven/maven-1/plugins/trunk/eclipse/xdocs/index.xml Fri Jan 13 14:40:30 2006
@@ -75,14 +75,15 @@
with debugging.
</p>
<p>
- The plugin will check if the file located at
<code>MAVEN_REPO${groupId}/java-sources/${artifactId}-${version}-sources.jar</code>
- exists and will add it as a source attachment.
+ The plugin is able to download sources archive at
<code>${groupId}/java-sources/${artifactId}-${version}-sources.jar</code>
+ from the repository. This behavior can be disabled by configuring the
<code>maven.eclipse.src.download</code> property.
As an example, the source archive for the dependency
<code>MAVEN_REPO/eclipse/<em>jars</em>/eclipse-ui-3.0.0<em>.jar</em></code>
will be mapped to
<code>MAVEN_REPO/eclipse/<em>java-sources</em>/eclipse-ui-3.0.0<em>-sources.jar</em></code>
</p>
<p>
For backward compatibility the plugin still accepts source archives
located at
-
<code>MAVEN_REPO/${groupId}/src/${artifactId}-${version}.${maven.eclipse.src.extension}</code>.
+
<code>MAVEN_REPO/${groupId}/src/${artifactId}-${version}.${maven.eclipse.src.extension}</code>
but it won't
+ download them from the repository.
</p>
</subsection>
<subsection name="Generated Source Code">
Modified: maven/maven-1/plugins/trunk/eclipse/xdocs/properties.xml
URL:
http://svn.apache.org/viewcvs/maven/maven-1/plugins/trunk/eclipse/xdocs/properties.xml?rev=368890&r1=368889&r2=368890&view=diff
==============================================================================
--- maven/maven-1/plugins/trunk/eclipse/xdocs/properties.xml (original)
+++ maven/maven-1/plugins/trunk/eclipse/xdocs/properties.xml Fri Jan 13
14:40:30 2006
@@ -135,6 +135,14 @@
<code>MAVEN_REPO${groupId}/java-sources/${artifactId}-${version}-sources.jar</code>
</td>
</tr>
+ <tr>
+ <td>maven.eclipse.src.downlad</td>
+ <td>Yes (default=<code>true</code>)</td>
+ <td>
+ Specify if java sources archives need to be downloaded from the
configured
+ remote repositories. Defaults to true.
+ </td>
+ </tr>
</table>
<p>
Note that you will need to defined a <code>MAVEN_REPO</code> Java