Index: plugin.jelly =================================================================== --- plugin.jelly (revision 421191) +++ plugin.jelly (working copy) @@ -24,6 +24,10 @@ name="download-sources" className="org.apache.maven.plugin.eclipse.JavaSourcesDownloader" method="downloadJavaSources"/> + @@ -73,15 +77,30 @@ ${msg} - - - - - + + + + + + + + + + + + + + + + + + + + Index: plugin.properties =================================================================== --- plugin.properties (revision 421191) +++ plugin.properties (working copy) @@ -28,5 +28,6 @@ maven.gen.src=${maven.build.dir}/generated-sources maven.eclipse.src.extension = zip maven.eclipse.src.download = true +maven.eclipse.docs.download = true maven.eclipse.resources.addtoclasspath=false maven.eclipse.servletapilist=javax.servlet:servlet-api,servletapi:servletapi,geronimo-spec:geronimo-spec-servlet \ No newline at end of file Index: project.xml =================================================================== --- project.xml (revision 421191) +++ project.xml (working copy) @@ -22,7 +22,7 @@ 3 maven-eclipse-plugin Maven Eclipse Plugin - 1.11 + 1.11.1-SNAPSHOT A plugin to generate various files for the Eclipse IDE and ease the use of Maven within that environment. Eclipse Plugin for Maven Index: src/main/org/apache/maven/plugin/eclipse/JavadocsDownloader.java =================================================================== --- src/main/org/apache/maven/plugin/eclipse/JavadocsDownloader.java (revision 0) +++ src/main/org/apache/maven/plugin/eclipse/JavadocsDownloader.java (revision 0) @@ -0,0 +1,277 @@ +package org.apache.maven.plugin.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 javadocs archives. Just a copy/paste from + * JavaSourcesDownloader.java with minimal changes to download javadocs archive. + * + * @author Nicolas De Loof + */ +public class JavadocsDownloader + 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( JavadocsDownloader.class ); + + private Project project; + + private String groupId; + + private String artifactId; + + private String version; + + + public void downloadJavadocs() + 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( "javadocs 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( "/javadoc.jars/" ).append( artifactId ).append( "-" ).append( version ).append( + "-javadoc.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 remoteFile from the maven remote repositories + * and store it at destinationFile + * + * @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 javadocs 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( 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() ) + { + 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; + } + +} Index: xdocs/changes.xml =================================================================== --- xdocs/changes.xml (revision 421191) +++ xdocs/changes.xml (working copy) @@ -23,6 +23,9 @@ dIon Gillard + + Download and attach javadoc archives to .classpath when no source archive is available. + Made output and testOutput directory configuration consistent. Added new property Index: xdocs/properties.xml =================================================================== --- xdocs/properties.xml (revision 421191) +++ xdocs/properties.xml (working copy) @@ -151,6 +151,14 @@ remote repositories. Defaults to true. + + maven.eclipse.docs.download + Yes (default=true) + + Specify if javadocs archives need to be downloaded from the configured + remote repositories, when no source archive is available. Defaults to true. + +

Note that you will need to defined a MAVEN_REPO Java