001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 */ 019 020 package org.apache.geronimo.plugin.car; 021 022 import java.io.File; 023 import java.io.IOException; 024 import java.io.FileOutputStream; 025 import java.io.BufferedOutputStream; 026 027 import java.util.Set; 028 import java.util.List; 029 import java.util.Iterator; 030 import java.util.HashSet; 031 import java.util.ArrayList; 032 import java.util.Properties; 033 034 import org.apache.geronimo.genesis.MojoSupport; 035 036 import org.apache.maven.project.MavenProject; 037 import org.apache.maven.project.MavenProjectHelper; 038 import org.apache.maven.artifact.resolver.filter.ArtifactFilter; 039 import org.apache.maven.artifact.resolver.filter.ExcludesArtifactFilter; 040 import org.apache.maven.artifact.resolver.ArtifactResolver; 041 import org.apache.maven.artifact.versioning.VersionRange; 042 import org.apache.maven.artifact.Artifact; 043 import org.apache.maven.artifact.repository.ArtifactRepository; 044 import org.apache.maven.artifact.factory.ArtifactFactory; 045 import org.apache.maven.model.Dependency; 046 import org.apache.maven.model.Exclusion; 047 048 /** 049 * Support for <em>packaging</em> Mojos. 050 * 051 * @version $Rev: 451661 $ $Date: 2006-09-30 13:45:53 -0700 (Sat, 30 Sep 2006) $ 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 * The basedir of the project. 067 * 068 * @parameter expression="${basedir}" 069 * @required 070 * @readonly 071 */ 072 protected File basedir; 073 074 /** 075 * The maven project's helper. 076 * 077 * @component 078 * @required 079 * @readonly 080 */ 081 protected MavenProjectHelper projectHelper; 082 083 // 084 // MojoSupport Hooks 085 // 086 087 protected MavenProject getProject() { 088 return project; 089 } 090 091 /** 092 * @component 093 * @required 094 * @readonly 095 */ 096 private ArtifactFactory artifactFactory = null; 097 098 protected ArtifactFactory getArtifactFactory() { 099 return artifactFactory; 100 } 101 102 /** 103 * @component 104 * @required 105 * @readonly 106 */ 107 private ArtifactResolver artifactResolver = null; 108 109 protected ArtifactResolver getArtifactResolver() { 110 return artifactResolver; 111 } 112 113 /** 114 * @parameter expression="${localRepository}" 115 * @readonly 116 * @required 117 */ 118 protected ArtifactRepository artifactRepository = null; 119 120 protected ArtifactRepository getArtifactRepository() { 121 return artifactRepository; 122 } 123 124 // 125 // Access to Project artifacts 126 // 127 128 protected Set getProjectArtifacts(final MavenProject project) { 129 Set artifacts = new HashSet(); 130 131 Iterator dependencies = project.getDependencies().iterator(); 132 while (dependencies.hasNext()) { 133 Dependency dep = (Dependency) dependencies.next(); 134 135 String groupId = dep.getGroupId(); 136 String artifactId = dep.getArtifactId(); 137 VersionRange versionRange = VersionRange.createFromVersion(dep.getVersion()); 138 String type = dep.getType(); 139 if (type == null) { 140 type = "jar"; 141 } 142 143 String classifier = dep.getClassifier(); 144 boolean optional = dep.isOptional(); 145 String scope = dep.getScope(); 146 if (scope == null) { 147 scope = Artifact.SCOPE_COMPILE; 148 } 149 150 Artifact artifact = getArtifactFactory().createDependencyArtifact( 151 groupId, 152 artifactId, 153 versionRange, 154 type, 155 classifier, 156 scope, 157 optional); 158 159 if (scope.equalsIgnoreCase(Artifact.SCOPE_SYSTEM)) { 160 artifact.setFile(new File(dep.getSystemPath())); 161 } 162 163 List exclusions = new ArrayList(); 164 for (Iterator j = dep.getExclusions().iterator(); j.hasNext();) { 165 Exclusion e = (Exclusion) j.next(); 166 exclusions.add(e.getGroupId() + ":" + e.getArtifactId()); 167 } 168 169 ArtifactFilter newFilter = new ExcludesArtifactFilter(exclusions); 170 artifact.setDependencyFilter(newFilter); 171 artifacts.add(artifact); 172 } 173 174 return artifacts; 175 } 176 177 protected Set getProjectArtifacts() { 178 return getProjectArtifacts(project); 179 } 180 181 protected void generateExplicitVersionProperties(final File outputFile) throws IOException { 182 log.debug("Generating explicit version properties: " + outputFile); 183 184 // Generate explicit_versions for all our dependencies... 185 Properties props = new Properties(); 186 Iterator iter = getProjectArtifacts().iterator(); 187 while (iter.hasNext()) { 188 Artifact artifact = (Artifact)iter.next(); 189 String name = artifact.getGroupId() + "/" + artifact.getArtifactId() + "//" + artifact.getType(); 190 String value = artifact.getGroupId() + "/" + artifact.getArtifactId() + "/" + artifact.getVersion() + "/" + artifact.getType(); 191 192 log.debug("Setting " + name + "=" + value); 193 props.setProperty(name, value); 194 } 195 196 BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(outputFile)); 197 props.store(output, null); 198 output.flush(); 199 output.close(); 200 } 201 202 protected static File getArchiveFile(final File basedir, final String finalName, String classifier) { 203 if (classifier == null) { 204 classifier = ""; 205 } 206 else if (classifier.trim().length() > 0 && !classifier.startsWith("-")) { 207 classifier = "-" + classifier; 208 } 209 210 return new File(basedir, finalName + classifier + ".car"); 211 } 212 }