001 package org.apache.maven.artifact;
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.ArrayList;
023 import java.util.Collection;
024 import java.util.LinkedHashMap;
025 import java.util.List;
026 import java.util.Map;
027 import java.util.regex.Matcher;
028
029 import org.apache.maven.artifact.versioning.VersionRange;
030
031 public final class ArtifactUtils
032 {
033
034 public static boolean isSnapshot( String version )
035 {
036 if ( version != null )
037 {
038 if ( version.regionMatches( true, version.length() - Artifact.SNAPSHOT_VERSION.length(),
039 Artifact.SNAPSHOT_VERSION, 0, Artifact.SNAPSHOT_VERSION.length() ) )
040 {
041 return true;
042 }
043 else if ( Artifact.VERSION_FILE_PATTERN.matcher( version ).matches() )
044 {
045 return true;
046 }
047 }
048 return false;
049 }
050
051 public static String toSnapshotVersion( String version )
052 {
053 if ( version == null )
054 {
055 throw new IllegalArgumentException( "version: null" );
056 }
057
058 Matcher m = Artifact.VERSION_FILE_PATTERN.matcher( version );
059 if ( m.matches() )
060 {
061 return m.group( 1 ) + "-" + Artifact.SNAPSHOT_VERSION;
062 }
063 else
064 {
065 return version;
066 }
067 }
068
069 public static String versionlessKey( Artifact artifact )
070 {
071 return versionlessKey( artifact.getGroupId(), artifact.getArtifactId() );
072 }
073
074 public static String versionlessKey( String groupId, String artifactId )
075 {
076 if ( groupId == null )
077 {
078 throw new NullPointerException( "groupId is null" );
079 }
080 if ( artifactId == null )
081 {
082 throw new NullPointerException( "artifactId is null" );
083 }
084 return groupId + ":" + artifactId;
085 }
086
087 public static String key( Artifact artifact )
088 {
089 return key( artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion() );
090 }
091
092 public static String key( String groupId, String artifactId, String version )
093 {
094 if ( groupId == null )
095 {
096 throw new NullPointerException( "groupId is null" );
097 }
098 if ( artifactId == null )
099 {
100 throw new NullPointerException( "artifactId is null" );
101 }
102 if ( version == null )
103 {
104 throw new NullPointerException( "version is null" );
105 }
106
107 return groupId + ":" + artifactId + ":" + version;
108 }
109
110 public static Map<String, Artifact> artifactMapByVersionlessId( Collection<Artifact> artifacts )
111 {
112 Map<String, Artifact> artifactMap = new LinkedHashMap<String, Artifact>();
113
114 if ( artifacts != null )
115 {
116 for ( Artifact artifact : artifacts )
117 {
118 artifactMap.put( versionlessKey( artifact ), artifact );
119 }
120 }
121
122 return artifactMap;
123 }
124
125 public static Artifact copyArtifactSafe( Artifact artifact )
126 {
127 return ( artifact != null ) ? copyArtifact( artifact ) : null;
128 }
129
130 public static Artifact copyArtifact( Artifact artifact )
131 {
132 VersionRange range = artifact.getVersionRange();
133
134 // For some reason with the introduction of MNG-1577 we have the case in Yoko where a depMan section has
135 // something like the following:
136 //
137 // <dependencyManagement>
138 // <dependencies>
139 // <!-- Yoko modules -->
140 // <dependency>
141 // <groupId>org.apache.yoko</groupId>
142 // <artifactId>yoko-core</artifactId>
143 // <version>${version}</version>
144 // </dependency>
145 // ...
146 //
147 // And the range is not set so we'll check here and set it. jvz.
148
149 if ( range == null )
150 {
151 range = VersionRange.createFromVersion( artifact.getVersion() );
152 }
153
154 DefaultArtifact clone = new DefaultArtifact( artifact.getGroupId(), artifact.getArtifactId(), range.cloneOf(),
155 artifact.getScope(), artifact.getType(), artifact.getClassifier(),
156 artifact.getArtifactHandler(), artifact.isOptional() );
157 clone.setRelease( artifact.isRelease() );
158 clone.setResolvedVersion( artifact.getVersion() );
159 clone.setResolved( artifact.isResolved() );
160 clone.setFile( artifact.getFile() );
161
162 clone.setAvailableVersions( copyList( artifact.getAvailableVersions() ) );
163 if ( artifact.getVersion() != null )
164 {
165 clone.setBaseVersion( artifact.getBaseVersion() );
166 }
167 clone.setDependencyFilter( artifact.getDependencyFilter() );
168 clone.setDependencyTrail( copyList( artifact.getDependencyTrail() ) );
169 clone.setDownloadUrl( artifact.getDownloadUrl() );
170 clone.setRepository( artifact.getRepository() );
171
172 return clone;
173 }
174
175 /** Returns <code>to</code> collection */
176 public static <T extends Collection<Artifact>> T copyArtifacts( Collection<Artifact> from, T to )
177 {
178 for ( Artifact artifact : from )
179 {
180 to.add( ArtifactUtils.copyArtifact( artifact ) );
181 }
182 return to;
183 }
184
185 public static <K, T extends Map<K, Artifact>> T copyArtifacts( Map<K, ? extends Artifact> from, T to )
186 {
187 if ( from != null )
188 {
189 for ( Map.Entry<K, ? extends Artifact> entry : from.entrySet() )
190 {
191 to.put( entry.getKey(), ArtifactUtils.copyArtifact( entry.getValue() ) );
192 }
193 }
194
195 return to;
196 }
197
198 private static <T> List<T> copyList( List<T> original )
199 {
200 List<T> copy = null;
201
202 if ( original != null )
203 {
204 copy = new ArrayList<T>();
205
206 if ( !original.isEmpty() )
207 {
208 copy.addAll( original );
209 }
210 }
211
212 return copy;
213 }
214
215 }