001 /* 002 * Copyright 2006 The Apache Software Foundation 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017 package org.apache.geronimo.plugin.car; 018 019 import org.apache.geronimo.plugin.MojoSupport; 020 021 import org.apache.maven.project.MavenProject; 022 import org.apache.maven.project.MavenProjectHelper; 023 import org.apache.maven.artifact.resolver.filter.ArtifactFilter; 024 import org.apache.maven.artifact.resolver.filter.ExcludesArtifactFilter; 025 import org.apache.maven.artifact.resolver.ArtifactResolutionException; 026 import org.apache.maven.artifact.resolver.ArtifactNotFoundException; 027 import org.apache.maven.artifact.resolver.ArtifactResolver; 028 import org.apache.maven.artifact.versioning.VersionRange; 029 import org.apache.maven.artifact.Artifact; 030 import org.apache.maven.artifact.repository.ArtifactRepository; 031 import org.apache.maven.artifact.factory.ArtifactFactory; 032 import org.apache.maven.model.Dependency; 033 import org.apache.maven.model.Exclusion; 034 import org.apache.maven.plugin.MojoExecutionException; 035 036 import java.io.File; 037 import java.io.IOException; 038 import java.io.FileOutputStream; 039 import java.io.BufferedOutputStream; 040 041 import java.util.Set; 042 import java.util.List; 043 import java.util.Iterator; 044 import java.util.HashSet; 045 import java.util.ArrayList; 046 import java.util.Properties; 047 048 /** 049 * Support for <em>packaging</em> Mojos. 050 * 051 * @version $Id: AbstractCarMojo.java 431523 2006-08-15 04:02:48Z jdillon $ 052 */ 053 public abstract class AbstractCarMojo 054 extends MojoSupport 055 { 056 /** 057 * The maven project. 058 * 059 * @parameter expression="${project}" 060 * @required 061 * @readonly 062 */ 063 protected MavenProject project; 064 065 /** 066 * Used to look up Artifacts in the remote repository. 067 * 068 * @parameter expression="${component.org.apache.maven.artifact.factory.ArtifactFactory}" 069 * @required 070 * @readonly 071 */ 072 protected ArtifactFactory factory; 073 074 /** 075 * Used to look up Artifacts in the remote repository. 076 * 077 * @parameter expression="${component.org.apache.maven.artifact.resolver.ArtifactResolver}" 078 * @required 079 * @readonly 080 */ 081 protected ArtifactResolver resolver; 082 083 /** 084 * Location of the local repository. 085 * 086 * @parameter expression="${localRepository}" 087 * @readonly 088 * @required 089 */ 090 protected ArtifactRepository local; 091 092 /** 093 * List of Remote Repositories used by the resolver. 094 * 095 * @parameter expression="${project.remoteArtifactRepositories}" 096 * @readonly 097 * @required 098 */ 099 protected java.util.List remoteRepos; 100 101 /** 102 * The basedir of the project. 103 * 104 * @parameter expression="${basedir}" 105 * @required 106 * @readonly 107 */ 108 protected File basedir; 109 110 /** 111 * The maven project's helper. 112 * 113 * @parameter expression="${component.org.apache.maven.project.MavenProjectHelper}" 114 * @required 115 * @readonly 116 */ 117 protected MavenProjectHelper projectHelper; 118 119 /** 120 * @parameter expression="${component.org.apache.maven.artifact.factory.ArtifactFactory}" 121 * @required 122 * @readonly 123 */ 124 protected ArtifactFactory artifactFactory; 125 126 protected Set getProjectArtifacts(final MavenProject project) { 127 Set artifacts = new HashSet(); 128 129 Iterator dependencies = project.getDependencies().iterator(); 130 while (dependencies.hasNext()) { 131 Dependency dep = (Dependency) dependencies.next(); 132 133 String groupId = dep.getGroupId(); 134 String artifactId = dep.getArtifactId(); 135 VersionRange versionRange = VersionRange.createFromVersion(dep.getVersion()); 136 String type = dep.getType(); 137 if (type == null) { 138 type = "jar"; 139 } 140 141 String classifier = dep.getClassifier(); 142 boolean optional = dep.isOptional(); 143 String scope = dep.getScope(); 144 if (scope == null) { 145 scope = Artifact.SCOPE_COMPILE; 146 } 147 148 Artifact artifact = artifactFactory.createDependencyArtifact( 149 groupId, 150 artifactId, 151 versionRange, 152 type, 153 classifier, 154 scope, 155 optional); 156 157 if (scope.equalsIgnoreCase(Artifact.SCOPE_SYSTEM)) { 158 artifact.setFile(new File(dep.getSystemPath())); 159 } 160 161 List exclusions = new ArrayList(); 162 for (Iterator j = dep.getExclusions().iterator(); j.hasNext();) { 163 Exclusion e = (Exclusion) j.next(); 164 exclusions.add(e.getGroupId() + ":" + e.getArtifactId()); 165 } 166 167 ArtifactFilter newFilter = new ExcludesArtifactFilter(exclusions); 168 artifact.setDependencyFilter(newFilter); 169 artifacts.add(artifact); 170 } 171 172 return artifacts; 173 } 174 175 protected Set getProjectArtifacts() { 176 return getProjectArtifacts(project); 177 } 178 179 protected void generateExplicitVersionProperties(final File outputFile) throws IOException { 180 log.debug("Generating explicit version properties: " + outputFile); 181 182 // Generate explicit_versions for all our dependencies... 183 Properties props = new Properties(); 184 Iterator iter = getProjectArtifacts().iterator(); 185 while (iter.hasNext()) { 186 Artifact artifact = (Artifact)iter.next(); 187 String name = artifact.getGroupId() + "/" + artifact.getArtifactId() + "//" + artifact.getType(); 188 String value = artifact.getVersion(); 189 190 log.debug("Setting " + name + "=" + value); 191 props.setProperty(name, value); 192 } 193 194 BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(outputFile)); 195 props.store(output, null); 196 output.flush(); 197 output.close(); 198 } 199 200 protected static File getArchiveFile(final File basedir, final String finalName, String classifier) { 201 if (classifier == null) { 202 classifier = ""; 203 } 204 else if (classifier.trim().length() > 0 && !classifier.startsWith("-")) { 205 classifier = "-" + classifier; 206 } 207 208 return new File(basedir, finalName + classifier + ".car"); 209 } 210 211 // 212 // NOTE: Bits below lifed from the maven-depndency-plugin 213 // 214 215 // 216 // TODO: Replace with ArtifactItem and move to base-class 217 // 218 219 /** 220 * Resolves the Artifact from the remote repository if nessessary. If no version is specified, it will 221 * be retrieved from the dependency list or from the DependencyManagement section of the pom. 222 */ 223 protected Artifact getArtifact(final ArtifactItem item) throws MojoExecutionException { 224 Artifact artifact; 225 226 if (item.getVersion() == null) { 227 fillMissingArtifactVersion(item); 228 229 if (item.getVersion() == null) { 230 throw new MojoExecutionException("Unable to find artifact version of " + item.getGroupId() 231 + ":" + item.getArtifactId() + " in either dependency list or in project's dependency management."); 232 } 233 234 } 235 236 String classifier = item.getClassifier(); 237 if (classifier == null || classifier.equals("")) { 238 artifact = factory.createArtifact( 239 item.getGroupId(), 240 item.getArtifactId(), 241 item.getVersion(), 242 Artifact.SCOPE_PROVIDED, 243 item.getType()); 244 } 245 else { 246 artifact = factory.createArtifactWithClassifier( 247 item.getGroupId(), 248 item.getArtifactId(), 249 item.getVersion(), 250 item.getType(), 251 item.getClassifier()); 252 } 253 254 try { 255 resolver.resolve(artifact, remoteRepos, local); 256 } 257 catch (ArtifactResolutionException e) { 258 throw new MojoExecutionException("Unable to resolve artifact.", e); 259 } 260 catch (ArtifactNotFoundException e) { 261 throw new MojoExecutionException("Unable to find artifact.", e); 262 } 263 264 return artifact; 265 } 266 267 /** 268 * Tries to find missing version from dependancy list and dependency management. 269 * If found, the artifact is updated with the correct version. 270 */ 271 private void fillMissingArtifactVersion(final ArtifactItem item) { 272 log.debug("Attempting to find missing version in " + item.getGroupId() + ":" + item.getArtifactId()); 273 274 List list = this.project.getDependencies(); 275 276 for (int i = 0; i < list.size(); ++i) { 277 Dependency dependency = (Dependency) list.get(i); 278 279 if (dependency.getGroupId().equals(item.getGroupId()) 280 && dependency.getArtifactId().equals(item.getArtifactId()) 281 && dependency.getType().equals(item.getType())) 282 { 283 log.debug("Found missing version: " + dependency.getVersion() + " in dependency list."); 284 285 item.setVersion(dependency.getVersion()); 286 287 return; 288 } 289 } 290 291 list = this.project.getDependencyManagement().getDependencies(); 292 293 for (int i = 0; i < list.size(); i++) { 294 Dependency dependency = (Dependency) list.get(i); 295 296 if (dependency.getGroupId().equals(item.getGroupId()) 297 && dependency.getArtifactId().equals(item.getArtifactId()) 298 && dependency.getType().equals(item.getType())) 299 { 300 log.debug("Found missing version: " + dependency.getVersion() + " in dependency management list"); 301 302 item.setVersion(dependency.getVersion()); 303 } 304 } 305 } 306 }