MPECLIPSE-60: Now trying to download java sources archives from the remote repositories.

git-svn-id: https://svn.apache.org/repos/asf/maven/maven-1/plugins/trunk@368890 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
snicoll committed 2006-01-13 22:40:30 +00:00
1 parent 59fb5043e7
commit 6ab7ecb36d
7 files changed
+355 -5

No files matched your search

@@ -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="snicoll@apache.org">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;
}
}