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