diff --git a/eclipse/plugin.jelly b/eclipse/plugin.jelly index 908cd0fc..23344cfc 100644 --- a/eclipse/plugin.jelly +++ b/eclipse/plugin.jelly @@ -23,7 +23,11 @@ + method="downloadSources"/> + @@ -66,37 +70,42 @@ - - - Place java sources for ${artifactId} at ${srcFile} for javadoc and debugging support in Eclipse - - ${msg} - - - + - - - - - - - - - - + + + + Java sources for ${artifactId} at ${srcFile} configured for javadoc and debugging support in Eclipse + + ${msg} + + + + + + + + + + + Javadoc for ${artifactId} at ${jdocsFile} configured in Eclipse + + ${msg} + + + + + + - - - - diff --git a/eclipse/plugin.properties b/eclipse/plugin.properties index 47b6359b..50adce8f 100644 --- a/eclipse/plugin.properties +++ b/eclipse/plugin.properties @@ -28,5 +28,6 @@ maven.eclipse.project.name=${pom.artifactId} maven.gen.src=${maven.build.dir}/generated-sources maven.eclipse.src.extension = zip maven.eclipse.src.download = true +maven.eclipse.javadoc.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 diff --git a/eclipse/src/main/org/apache/maven/plugin/eclipse/AbstractSourcesDownloader.java b/eclipse/src/main/org/apache/maven/plugin/eclipse/AbstractSourcesDownloader.java new file mode 100644 index 00000000..e8dae13f --- /dev/null +++ b/eclipse/src/main/org/apache/maven/plugin/eclipse/AbstractSourcesDownloader.java @@ -0,0 +1,274 @@ +package org.apache.maven.plugin.eclipse; + +/* ==================================================================== + * 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. + * ==================================================================== + */ + + +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.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; + +/** + * A base class to download sources achives. + * + * @author Stephane Nicoll + */ +public abstract class AbstractSourcesDownloader + extends AbstractMavenComponent +{ + + protected static final String PROXY_LOGINHOST = "maven.proxy.ntlm.host"; + + protected static final String PROXY_LOGINDOMAIN = "maven.proxy.ntlm.domain"; + + private static final Log log = LogFactory.getLog( AbstractSourcesDownloader.class ); + + private Project project; + + private String groupId; + + private String artifactId; + + private String version; + + public void downloadSources() + 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( getSourceName() + " for[" + groupId + ":" + artifactId + ":" + version + + "] is available in the local repository." ); + } + else + { + // download it + getRemoteArtifact( localFile, relativePath, dependency ); + } + } + } + + protected abstract String buildRelativePath(); + + protected abstract String getSourceName(); + + // 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; + } + + protected boolean isSnapshot() + { + return version.endsWith( "SNAPSHOT" ); + } + + /** + * 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. + */ + protected 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 " + getSourceName() + " 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 " + getSourceName() + " 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; + } + +} diff --git a/eclipse/src/main/org/apache/maven/plugin/eclipse/JavaSourcesDownloader.java b/eclipse/src/main/org/apache/maven/plugin/eclipse/JavaSourcesDownloader.java index 9b4b1bbc..1189f793 100644 --- a/eclipse/src/main/org/apache/maven/plugin/eclipse/JavaSourcesDownloader.java +++ b/eclipse/src/main/org/apache/maven/plugin/eclipse/JavaSourcesDownloader.java @@ -1,18 +1,5 @@ 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. * @@ -37,241 +24,20 @@ import java.util.Iterator; * @version $Id$ */ public class JavaSourcesDownloader - extends AbstractMavenComponent + extends AbstractSourcesDownloader { - 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; - 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() + protected String buildRelativePath() { StringBuffer sb = new StringBuffer(); - sb.append( groupId ).append( "/java-sources/" ).append( artifactId ).append( "-" ).append( version ).append( - "-sources.jar" ); + sb.append( getGroupId() ).append( "/java-sources/" ).append( getArtifactId() ).append( "-" ).append( + getVersion() ).append( "-sources.jar" ); return sb.toString(); } - private boolean isSnapshot() + protected String getSourceName() { - return version.endsWith( "SNAPSHOT" ); + return "sources"; } - - // 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 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( 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; - } - } diff --git a/eclipse/src/main/org/apache/maven/plugin/eclipse/JavadocsDownloader.java b/eclipse/src/main/org/apache/maven/plugin/eclipse/JavadocsDownloader.java new file mode 100644 index 00000000..c363f3bb --- /dev/null +++ b/eclipse/src/main/org/apache/maven/plugin/eclipse/JavadocsDownloader.java @@ -0,0 +1,42 @@ +package org.apache.maven.plugin.eclipse; + +/* ==================================================================== + * 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. + * + * @author Nicolas De Loof + * @author Stephane Nicoll + */ +public class JavadocsDownloader + extends AbstractSourcesDownloader +{ + + protected String buildRelativePath() + { + StringBuffer sb = new StringBuffer(); + sb.append( getGroupId() ).append( "/javadoc.jars/" ).append( getArtifactId() ).append( "-" ).append( + getVersion() ).append( "-javadoc.jar" ); + return sb.toString(); + } + + protected String getSourceName() + { + return "javadocs"; + } +} diff --git a/eclipse/xdocs/changes.xml b/eclipse/xdocs/changes.xml index 3c2ef439..47262ead 100644 --- a/eclipse/xdocs/changes.xml +++ b/eclipse/xdocs/changes.xml @@ -26,6 +26,7 @@ Update jelly dependency to match the ones in maven 1.1 core. Don't attach sourcepath in .classpath when file doesn't exist. + Download and attach javadoc archives to .classpath when no source archive is available. Made output and testOutput directory configuration consistent. diff --git a/eclipse/xdocs/properties.xml b/eclipse/xdocs/properties.xml index 2f20108e..b38b500c 100644 --- a/eclipse/xdocs/properties.xml +++ b/eclipse/xdocs/properties.xml @@ -151,6 +151,14 @@ remote repositories. Defaults to true. + + maven.eclipse.javadoc.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