1 package org.apache.maven.artifact.transform; 2 3 18 19 import org.apache.maven.artifact.Artifact; 20 import org.apache.maven.artifact.deployer.ArtifactDeploymentException; 21 import org.apache.maven.artifact.repository.ArtifactRepository; 22 import org.apache.maven.artifact.repository.metadata.Metadata; 23 import org.apache.maven.artifact.repository.metadata.RepositoryMetadata; 24 import org.apache.maven.artifact.repository.metadata.RepositoryMetadataResolutionException; 25 import org.apache.maven.artifact.repository.metadata.Snapshot; 26 import org.apache.maven.artifact.repository.metadata.SnapshotArtifactRepositoryMetadata; 27 import org.apache.maven.artifact.repository.metadata.Versioning; 28 import org.apache.maven.artifact.resolver.ArtifactResolutionException; 29 import org.codehaus.plexus.util.StringUtils; 30 31 import java.text.DateFormat ; 32 import java.text.SimpleDateFormat ; 33 import java.util.Date ; 34 import java.util.List ; 35 import java.util.TimeZone ; 36 37 43 public class SnapshotTransformation 44 extends AbstractVersionTransformation 45 { 46 private String deploymentTimestamp; 47 48 private static final TimeZone UTC_TIME_ZONE = TimeZone.getTimeZone( "UTC" ); 49 50 private static final String UTC_TIMESTAMP_PATTERN = "yyyyMMdd.HHmmss"; 51 52 public void transformForResolve( Artifact artifact, List remoteRepositories, ArtifactRepository localRepository ) 53 throws ArtifactResolutionException 54 { 55 if ( artifact.isSnapshot() && artifact.getBaseVersion().equals( artifact.getVersion() ) ) 57 { 58 try 59 { 60 String version = resolveVersion( artifact, localRepository, remoteRepositories ); 61 artifact.updateVersion( version, localRepository ); 62 } 63 catch ( RepositoryMetadataResolutionException e ) 64 { 65 throw new ArtifactResolutionException( e.getMessage(), artifact, e ); 66 } 67 } 68 } 69 70 public void transformForInstall( Artifact artifact, ArtifactRepository localRepository ) 71 { 72 if ( artifact.isSnapshot() ) 73 { 74 Snapshot snapshot = new Snapshot(); 75 snapshot.setLocalCopy( true ); 76 RepositoryMetadata metadata = new SnapshotArtifactRepositoryMetadata( artifact, snapshot ); 77 78 artifact.addMetadata( metadata ); 79 } 80 } 81 82 public void transformForDeployment( Artifact artifact, ArtifactRepository remoteRepository, 83 ArtifactRepository localRepository ) 84 throws ArtifactDeploymentException 85 { 86 if ( artifact.isSnapshot() ) 87 { 88 Snapshot snapshot = new Snapshot(); 89 if ( remoteRepository.isUniqueVersion() ) 90 { 91 snapshot.setTimestamp( getDeploymentTimestamp() ); 92 } 93 94 try 96 { 97 int buildNumber = resolveLatestSnapshotBuildNumber( artifact, localRepository, remoteRepository ); 98 99 snapshot.setBuildNumber( buildNumber + 1 ); 100 } 101 catch ( RepositoryMetadataResolutionException e ) 102 { 103 throw new ArtifactDeploymentException( "Error retrieving previous build number for artifact '" + 104 artifact.getDependencyConflictId() + "': " + e.getMessage(), e ); 105 } 106 107 RepositoryMetadata metadata = new SnapshotArtifactRepositoryMetadata( artifact, snapshot ); 108 109 artifact.setResolvedVersion( 110 constructVersion( metadata.getMetadata().getVersioning(), artifact.getBaseVersion() ) ); 111 112 artifact.addMetadata( metadata ); 113 } 114 } 115 116 public String getDeploymentTimestamp() 117 { 118 if ( deploymentTimestamp == null ) 119 { 120 deploymentTimestamp = getUtcDateFormatter().format( new Date () ); 121 } 122 return deploymentTimestamp; 123 } 124 125 protected String constructVersion( Versioning versioning, String baseVersion ) 126 { 127 String version = null; 128 Snapshot snapshot = versioning.getSnapshot(); 129 if ( snapshot != null ) 130 { 131 if ( snapshot.getTimestamp() != null && snapshot.getBuildNumber() > 0 ) 132 { 133 String newVersion = snapshot.getTimestamp() + "-" + snapshot.getBuildNumber(); 134 version = StringUtils.replace( baseVersion, "SNAPSHOT", newVersion ); 135 } 136 else 137 { 138 version = baseVersion; 139 } 140 } 141 return version; 142 } 143 144 private int resolveLatestSnapshotBuildNumber( Artifact artifact, ArtifactRepository localRepository, 145 ArtifactRepository remoteRepository ) 146 throws RepositoryMetadataResolutionException 147 { 148 RepositoryMetadata metadata = new SnapshotArtifactRepositoryMetadata( artifact ); 149 150 if ( !wagonManager.isOnline() ) 151 { 152 throw new RepositoryMetadataResolutionException( 154 "System is offline. Cannot resolve metadata:\n" + metadata.extendedToString() + "\n\n" ); 155 } 156 157 getLogger().info( "Retrieving previous build number from " + remoteRepository.getId() ); 158 repositoryMetadataManager.resolveAlways( metadata, localRepository, remoteRepository ); 159 160 int buildNumber = 0; 161 Metadata repoMetadata = metadata.getMetadata(); 162 if ( repoMetadata != null ) 163 { 164 if ( repoMetadata.getVersioning() != null && repoMetadata.getVersioning().getSnapshot() != null ) 165 { 166 buildNumber = repoMetadata.getVersioning().getSnapshot().getBuildNumber(); 167 } 168 } 169 return buildNumber; 170 } 171 172 public static DateFormat getUtcDateFormatter() 173 { 174 DateFormat utcDateFormatter = new SimpleDateFormat ( UTC_TIMESTAMP_PATTERN ); 175 utcDateFormatter.setTimeZone( UTC_TIME_ZONE ); 176 return utcDateFormatter; 177 } 178 } 179 | Popular Tags |