001 package org.apache.maven.repository.legacy.resolver.transform;
002
003 /*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements. See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership. The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License. You may obtain a copy of the License at
011 *
012 * http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied. See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022 import java.util.List;
023
024 import org.apache.maven.artifact.Artifact;
025 import org.apache.maven.artifact.repository.ArtifactRepository;
026 import org.apache.maven.artifact.repository.DefaultRepositoryRequest;
027 import org.apache.maven.artifact.repository.RepositoryRequest;
028 import org.apache.maven.artifact.repository.metadata.ArtifactRepositoryMetadata;
029 import org.apache.maven.artifact.repository.metadata.Metadata;
030 import org.apache.maven.artifact.repository.metadata.RepositoryMetadata;
031 import org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager;
032 import org.apache.maven.artifact.repository.metadata.RepositoryMetadataResolutionException;
033 import org.apache.maven.artifact.repository.metadata.SnapshotArtifactRepositoryMetadata;
034 import org.apache.maven.artifact.repository.metadata.Versioning;
035 import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
036 import org.apache.maven.artifact.resolver.ArtifactResolutionException;
037 import org.apache.maven.repository.legacy.WagonManager;
038 import org.codehaus.plexus.component.annotations.Requirement;
039 import org.codehaus.plexus.logging.AbstractLogEnabled;
040
041 /**
042 * Describes a version transformation during artifact resolution.
043 *
044 * @author <a href="mailto:brett@apache.org">Brett Porter</a>
045 * @todo try and refactor to remove abstract methods - not particular happy about current design
046 */
047 public abstract class AbstractVersionTransformation
048 extends AbstractLogEnabled
049 implements ArtifactTransformation
050 {
051 @Requirement
052 protected RepositoryMetadataManager repositoryMetadataManager;
053
054 @Requirement
055 protected WagonManager wagonManager;
056
057 public void transformForResolve( Artifact artifact, List<ArtifactRepository> remoteRepositories,
058 ArtifactRepository localRepository )
059 throws ArtifactResolutionException, ArtifactNotFoundException
060 {
061 RepositoryRequest request = new DefaultRepositoryRequest();
062 request.setLocalRepository( localRepository );
063 request.setRemoteRepositories( remoteRepositories );
064 transformForResolve( artifact, request );
065 }
066
067 protected String resolveVersion( Artifact artifact, ArtifactRepository localRepository,
068 List<ArtifactRepository> remoteRepositories )
069 throws RepositoryMetadataResolutionException
070 {
071 RepositoryRequest request = new DefaultRepositoryRequest();
072 request.setLocalRepository( localRepository );
073 request.setRemoteRepositories( remoteRepositories );
074 return resolveVersion( artifact, request );
075 }
076
077 protected String resolveVersion( Artifact artifact, RepositoryRequest request )
078 throws RepositoryMetadataResolutionException
079 {
080 RepositoryMetadata metadata;
081 // Don't use snapshot metadata for LATEST (which isSnapshot returns true for)
082 if ( !artifact.isSnapshot() || Artifact.LATEST_VERSION.equals( artifact.getBaseVersion() ) )
083 {
084 metadata = new ArtifactRepositoryMetadata( artifact );
085 }
086 else
087 {
088 metadata = new SnapshotArtifactRepositoryMetadata( artifact );
089 }
090
091 repositoryMetadataManager.resolve( metadata, request );
092
093 artifact.addMetadata( metadata );
094
095 Metadata repoMetadata = metadata.getMetadata();
096 String version = null;
097 if ( repoMetadata != null && repoMetadata.getVersioning() != null )
098 {
099 version = constructVersion( repoMetadata.getVersioning(), artifact.getBaseVersion() );
100 }
101
102 if ( version == null )
103 {
104 // use the local copy, or if it doesn't exist - go to the remote repo for it
105 version = artifact.getBaseVersion();
106 }
107
108 // TODO: also do this logging for other metadata?
109 // TODO: figure out way to avoid duplicated message
110 if ( getLogger().isDebugEnabled() )
111 {
112 if ( !version.equals( artifact.getBaseVersion() ) )
113 {
114 String message = artifact.getArtifactId() + ": resolved to version " + version;
115 if ( artifact.getRepository() != null )
116 {
117 message += " from repository " + artifact.getRepository().getId();
118 }
119 else
120 {
121 message += " from local repository";
122 }
123 getLogger().debug( message );
124 }
125 else
126 {
127 // Locally installed file is newer, don't use the resolved version
128 getLogger().debug( artifact.getArtifactId() + ": using locally installed snapshot" );
129 }
130 }
131 return version;
132 }
133
134 protected abstract String constructVersion( Versioning versioning, String baseVersion );
135 }