| package org.apache.maven.artifact.resolver; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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 java.util.Iterator; |
| import java.util.List; |
| |
| import org.apache.maven.artifact.Artifact; |
| import org.apache.maven.artifact.repository.ArtifactRepository; |
| import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy; |
| |
| /** |
| * Base class for artifact resolution exceptions. |
| * |
| * @author <a href="mailto:brett@apache.org">Brett Porter</a> |
| */ |
| public class AbstractArtifactResolutionException |
| extends Exception |
| { |
| private String groupId; |
| |
| private String artifactId; |
| |
| private String version; |
| |
| private String type; |
| |
| private String classifier; |
| |
| private Artifact artifact; |
| |
| private List<ArtifactRepository> remoteRepositories; |
| |
| private final String originalMessage; |
| |
| private final String path; |
| |
| static final String LS = System.lineSeparator(); |
| |
| @SuppressWarnings( "checkstyle:parameternumber" ) |
| protected AbstractArtifactResolutionException( String message, |
| String groupId, |
| String artifactId, |
| String version, |
| String type, |
| String classifier, |
| List<ArtifactRepository> remoteRepositories, |
| List<String> path ) |
| { |
| this( message, groupId, artifactId, version, type, classifier, remoteRepositories, path, null ); |
| } |
| |
| @SuppressWarnings( "checkstyle:parameternumber" ) |
| protected AbstractArtifactResolutionException( String message, |
| String groupId, |
| String artifactId, |
| String version, |
| String type, |
| String classifier, |
| List<ArtifactRepository> remoteRepositories, |
| List<String> path, |
| Throwable t ) |
| { |
| super( constructMessageBase( message, groupId, artifactId, version, type, remoteRepositories, path ), t ); |
| |
| this.originalMessage = message; |
| this.groupId = groupId; |
| this.artifactId = artifactId; |
| this.type = type; |
| this.classifier = classifier; |
| this.version = version; |
| this.remoteRepositories = remoteRepositories; |
| this.path = constructArtifactPath( path, "" ); |
| } |
| |
| protected AbstractArtifactResolutionException( String message, |
| Artifact artifact ) |
| { |
| this( message, artifact, null ); |
| } |
| |
| protected AbstractArtifactResolutionException( String message, |
| Artifact artifact, |
| List<ArtifactRepository> remoteRepositories ) |
| { |
| this( message, artifact, remoteRepositories, null ); |
| } |
| |
| protected AbstractArtifactResolutionException( String message, |
| Artifact artifact, |
| List<ArtifactRepository> remoteRepositories, |
| Throwable t ) |
| { |
| this( message, artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(), artifact.getType(), |
| artifact.getClassifier(), remoteRepositories, artifact.getDependencyTrail(), t ); |
| this.artifact = artifact; |
| } |
| |
| public Artifact getArtifact() |
| { |
| return artifact; |
| } |
| |
| public String getGroupId() |
| { |
| return groupId; |
| } |
| |
| public String getArtifactId() |
| { |
| return artifactId; |
| } |
| |
| public String getVersion() |
| { |
| return version; |
| } |
| |
| public String getType() |
| { |
| return type; |
| } |
| |
| /** @return the classifier */ |
| public String getClassifier() |
| { |
| return this.classifier; |
| } |
| |
| /** @return the path */ |
| public String getPath() |
| { |
| return this.path; |
| } |
| |
| public List<ArtifactRepository> getRemoteRepositories() |
| { |
| return remoteRepositories; |
| } |
| |
| public String getOriginalMessage() |
| { |
| return originalMessage; |
| } |
| |
| protected static String constructArtifactPath( List<String> path, |
| String indentation ) |
| { |
| StringBuilder sb = new StringBuilder(); |
| |
| if ( path != null ) |
| { |
| sb.append( LS ); |
| sb.append( indentation ); |
| sb.append( "Path to dependency: " ); |
| sb.append( LS ); |
| int num = 1; |
| for ( Iterator<String> i = path.iterator(); i.hasNext(); num++ ) |
| { |
| sb.append( indentation ); |
| sb.append( '\t' ); |
| sb.append( num ); |
| sb.append( ") " ); |
| sb.append( i.next() ); |
| sb.append( LS ); |
| } |
| } |
| |
| return sb.toString(); |
| } |
| |
| private static String constructMessageBase( String message, |
| String groupId, |
| String artifactId, |
| String version, |
| String type, |
| List<ArtifactRepository> remoteRepositories, |
| List<String> path ) |
| { |
| StringBuilder sb = new StringBuilder(); |
| |
| sb.append( message ); |
| |
| if ( message == null || !message.contains( "from the specified remote repositories:" ) ) |
| { |
| sb.append( LS ); |
| sb.append( " " ).append( groupId ).append( ':' ).append( artifactId ).append( ':' ).append( type ).append( |
| ':' ).append( version ); |
| sb.append( LS ); |
| if ( remoteRepositories != null ) |
| { |
| sb.append( LS ); |
| sb.append( "from the specified remote repositories:" ); |
| sb.append( LS ).append( " " ); |
| |
| if ( remoteRepositories.isEmpty() ) |
| { |
| sb.append( "(none)" ); |
| } |
| |
| for ( Iterator<ArtifactRepository> i = remoteRepositories.iterator(); i.hasNext(); ) |
| { |
| ArtifactRepository remoteRepository = i.next(); |
| |
| sb.append( remoteRepository.getId() ); |
| sb.append( " (" ); |
| sb.append( remoteRepository.getUrl() ); |
| |
| ArtifactRepositoryPolicy releases = remoteRepository.getReleases(); |
| if ( releases != null ) |
| { |
| sb.append( ", releases=" ).append( releases.isEnabled() ); |
| } |
| |
| ArtifactRepositoryPolicy snapshots = remoteRepository.getSnapshots(); |
| if ( snapshots != null ) |
| { |
| sb.append( ", snapshots=" ).append( snapshots.isEnabled() ); |
| } |
| |
| sb.append( ')' ); |
| if ( i.hasNext() ) |
| { |
| sb.append( ',' ).append( LS ).append( " " ); |
| } |
| } |
| } |
| |
| sb.append( constructArtifactPath( path, "" ) ); |
| sb.append( LS ); |
| } |
| |
| return sb.toString(); |
| } |
| |
| @SuppressWarnings( "checkstyle:parameternumber" ) |
| protected static String constructMissingArtifactMessage( String message, |
| String indentation, |
| String groupId, |
| String artifactId, |
| String version, |
| String type, |
| String classifier, |
| String downloadUrl, |
| List<String> path ) |
| { |
| StringBuilder sb = new StringBuilder( message ); |
| |
| if ( !"pom".equals( type ) ) |
| { |
| if ( downloadUrl != null ) |
| { |
| sb.append( LS ); |
| sb.append( LS ); |
| sb.append( indentation ); |
| sb.append( "Try downloading the file manually from: " ); |
| sb.append( LS ); |
| sb.append( indentation ); |
| sb.append( " " ); |
| sb.append( downloadUrl ); |
| } |
| else |
| { |
| sb.append( LS ); |
| sb.append( LS ); |
| sb.append( indentation ); |
| sb.append( "Try downloading the file manually from the project website." ); |
| } |
| |
| sb.append( LS ); |
| sb.append( LS ); |
| sb.append( indentation ); |
| sb.append( "Then, install it using the command: " ); |
| sb.append( LS ); |
| sb.append( indentation ); |
| sb.append( " mvn install:install-file -DgroupId=" ); |
| sb.append( groupId ); |
| sb.append( " -DartifactId=" ); |
| sb.append( artifactId ); |
| sb.append( " -Dversion=" ); |
| sb.append( version ); |
| |
| //insert classifier only if it was used in the artifact |
| if ( classifier != null && !classifier.equals( "" ) ) |
| { |
| sb.append( " -Dclassifier=" ); |
| sb.append( classifier ); |
| } |
| sb.append( " -Dpackaging=" ); |
| sb.append( type ); |
| sb.append( " -Dfile=/path/to/file" ); |
| sb.append( LS ); |
| |
| // If people want to deploy it |
| sb.append( LS ); |
| sb.append( indentation ); |
| sb.append( "Alternatively, if you host your own repository you can deploy the file there: " ); |
| sb.append( LS ); |
| sb.append( indentation ); |
| sb.append( " mvn deploy:deploy-file -DgroupId=" ); |
| sb.append( groupId ); |
| sb.append( " -DartifactId=" ); |
| sb.append( artifactId ); |
| sb.append( " -Dversion=" ); |
| sb.append( version ); |
| |
| //insert classifier only if it was used in the artifact |
| if ( classifier != null && !classifier.equals( "" ) ) |
| { |
| sb.append( " -Dclassifier=" ); |
| sb.append( classifier ); |
| } |
| sb.append( " -Dpackaging=" ); |
| sb.append( type ); |
| sb.append( " -Dfile=/path/to/file" ); |
| sb.append( " -Durl=[url] -DrepositoryId=[id]" ); |
| sb.append( LS ); |
| } |
| |
| sb.append( constructArtifactPath( path, indentation ) ); |
| sb.append( LS ); |
| |
| return sb.toString(); |
| } |
| |
| public String getArtifactPath() |
| { |
| return path; |
| } |
| } |