1 16 17 package info.jtrac.maven; 18 19 import java.io.File ; 20 import java.io.FileInputStream ; 21 import java.io.FileOutputStream ; 22 import java.io.InputStream ; 23 import java.io.OutputStream ; 24 import java.io.PrintWriter ; 25 import java.io.Writer ; 26 import java.util.ArrayList ; 27 import java.util.Collection ; 28 import java.util.Date ; 29 import java.util.HashSet ; 30 import java.util.Iterator ; 31 import java.util.LinkedHashMap ; 32 import java.util.List ; 33 import java.util.Map ; 34 import java.util.Properties ; 35 import java.util.Set ; 36 import java.util.TreeSet ; 37 38 import org.apache.maven.artifact.Artifact; 39 import org.apache.maven.artifact.factory.ArtifactFactory; 40 import org.apache.maven.artifact.repository.ArtifactRepository; 41 import org.apache.maven.artifact.resolver.ArtifactResolver; 42 import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter; 43 import org.apache.maven.plugin.AbstractMojo; 44 import org.apache.maven.plugin.MojoExecutionException; 45 import org.apache.maven.project.MavenProject; 46 import org.apache.maven.project.MavenProjectBuilder; 47 48 53 public class AntPropsMojo extends AbstractMojo { 54 55 59 private MavenProject project; 60 61 64 private ArtifactRepository localRepository; 65 66 69 private ArtifactResolver artifactResolver; 70 71 74 private List remoteArtifactRepositories; 75 76 79 private ArtifactFactory artifactFactory; 80 81 84 private MavenProjectBuilder mavenProjectBuilder; 85 86 88 92 private List testPaths; 93 94 99 private List extraPaths; 100 101 105 private Map buildProperties = new LinkedHashMap (); 106 107 110 private Map testClassPaths = new LinkedHashMap (); 111 112 115 private Map extraClassPaths = new LinkedHashMap (); 116 117 120 private Set runtimeFiles; 121 122 127 private Set filesets = new HashSet (); 128 129 131 public void execute() throws MojoExecutionException { 132 if (testPaths == null) { 133 testPaths = new ArrayList (); 134 } 135 if (extraPaths == null) { 136 extraPaths = new ArrayList (); 137 } 138 String repoBaseDir = localRepository.getBasedir().replace('\\','/'); 139 try { 140 buildProperties.put("m2.repo", repoBaseDir); 141 Collection runtimeArtifacts = project.getArtifacts(); 143 runtimeFiles = getRelativePaths(getFiles(runtimeArtifacts), repoBaseDir); 144 Set testArtifacts = project.getDependencyArtifacts(); 146 testArtifacts.addAll(project.getTestArtifacts()); 147 Collection testFiles = getFiles(testArtifacts); 148 testClassPaths.put("m2.repo", getRelativePaths(testFiles, repoBaseDir)); 149 Properties props = loadProperties(); 151 for (Iterator i = testPaths.iterator(); i.hasNext(); ) { 152 TestPath testPath = (TestPath) i.next(); 153 String baseDirProperty = testPath.getBaseDirProperty(); 154 String baseDirPath = props.getProperty(baseDirProperty); 155 if (baseDirPath == null) { 156 getLog().warn("baseDirProperty + '" + baseDirProperty + "' does not exist in build.properties"); 157 break; 158 } 159 File baseDir = new File (baseDirPath); 160 if (!baseDir.exists() || !baseDir.isDirectory()) { 161 getLog().warn("path + '" + baseDirPath + "' is not valid directory"); 162 break; 163 } 164 buildProperties.put(baseDirProperty, baseDirPath); 165 Set filePaths = new TreeSet (); 166 for (Iterator j = testPath.getPaths().iterator(); j.hasNext(); ) { 167 String path = (String ) j.next(); 168 File file = new File (baseDirPath + "/" + path); 169 if (!file.exists()) { 170 getLog().warn("additional test path: '" + file.getPath() + "' does not exist"); 171 continue; 172 } 173 if (file.isDirectory()) { 174 File [] files = file.listFiles(); 175 for (int x = 0; x < files.length; x++) { 176 filePaths.add(getRelativePath(files[x], baseDir.getPath())); 177 } 178 } else { 179 filePaths.add(getRelativePath(file, baseDir.getPath())); 180 } 181 } 182 testClassPaths.put(baseDirProperty, filePaths); 183 } 184 for (Iterator i = extraPaths.iterator(); i.hasNext(); ) { 186 ExtraPath ep = (ExtraPath) i.next(); 187 Set paths = new TreeSet (); 188 Collection files = new ArrayList (); 189 for (Iterator j = ep.getDependencies().iterator(); j.hasNext(); ) { 190 Dependency d = (Dependency) j.next(); 191 if (d.isResolve()) { 192 files.addAll(getFiles(d.getGroupId(), d.getArtifactId(), d.getVersion())); 193 } else { 194 Artifact a = getArtifact(d.getGroupId(), d.getArtifactId(), d.getVersion()); 195 files.add(resolveArtifact(a)); 196 } 197 } 198 paths.addAll(getRelativePaths(files, repoBaseDir)); 199 extraClassPaths.put(ep.getName(), paths); 200 if (ep.isFileset()) { 201 filesets.add(ep.getName()); 202 } 203 } 204 writeAntPropsFile(); 206 } catch (Exception e) { 207 e.printStackTrace(); 208 throw new MojoExecutionException(e.getLocalizedMessage()); 209 } 210 } 211 212 214 217 private Artifact getArtifact(String groupId, String artifactId, String version) { 218 return artifactFactory.createArtifact(groupId, artifactId, version, "", "jar"); 219 } 220 221 224 private Collection resolveDependencies(String groupId, String artifactId, String version) throws Exception { 225 Artifact pomArtifact = getArtifact(groupId, artifactId, version); 226 MavenProject pomProject = mavenProjectBuilder.buildFromRepository(pomArtifact, remoteArtifactRepositories, localRepository); 227 Collection artifacts = pomProject.createArtifacts(artifactFactory, Artifact.SCOPE_TEST, new ScopeArtifactFilter(Artifact.SCOPE_TEST)); 228 Iterator i = artifacts.iterator(); 229 while(i.hasNext()) { 230 Artifact a = (Artifact) i.next(); 231 resolveArtifact(a); 232 } 233 artifacts.add(pomArtifact); 234 return artifacts; 235 } 236 237 240 private File resolveArtifact(Artifact artifact) throws Exception { 241 File f = artifact.getFile(); 242 if (f != null) { 243 return f; 244 } 245 getLog().info("resolving artifact: " + artifact); 246 artifactResolver.resolve(artifact, remoteArtifactRepositories, localRepository); 247 return artifact.getFile(); 248 } 249 250 253 private Collection getFiles(Collection artifacts) throws Exception { 254 Collection files = new ArrayList (); 255 Iterator i = artifacts.iterator(); 256 while(i.hasNext()) { 257 Artifact a = (Artifact) i.next(); 258 files.add(resolveArtifact(a)); 259 } 260 return files; 261 } 262 263 266 private Collection getFiles(String groupId, String artifactId, String version) throws Exception { 267 return getFiles(resolveDependencies(groupId, artifactId, version)); 268 } 269 270 273 private String getRelativePath(File file, String basePath) { 274 String p = basePath.replace('\\','/'); 275 int len = p.length() + 1; 276 if (p.endsWith("/")) { 277 len--; 278 } 279 return file.getPath().substring(len).replace('\\','/'); 280 } 281 282 285 private Set getRelativePaths(Collection files, String basePath) { 286 Set paths = new TreeSet (); 287 Iterator i = files.iterator(); 288 while (i.hasNext()) { 289 File f = (File ) i.next(); 290 String path = getRelativePath(f, basePath); 291 paths.add(path); 292 } 293 return paths; 294 } 295 296 299 private Properties loadProperties() throws Exception { 300 File file = new File ("build.properties"); 301 Properties props = new Properties (); 302 if (!file.exists()) { 303 getLog().warn("build.properties does not exist"); 304 return props; 305 } 306 InputStream is = null; 307 try { 308 is = new FileInputStream ("build.properties"); 309 props.load(is); 310 } finally { 311 is.close(); 312 } 313 return props; 314 } 315 316 319 private void writeAntPropsFile() throws Exception { 320 OutputStream os = new FileOutputStream ("build-deps.properties"); 321 Writer out = new PrintWriter (os); 322 Date date = new Date (); 323 out.write("# *** generated by the AntProps Maven2 plugin: " + date + " ***\n\n"); 324 Set allPaths = new TreeSet (); for (Iterator i = buildProperties.entrySet().iterator(); i.hasNext(); ) { 327 Map.Entry entry = (Map.Entry ) i.next(); 328 out.write(entry.getKey() + "=" + entry.getValue() + "\n\n"); 329 } 330 out.write("runtime.jars="); 332 for (Iterator i = runtimeFiles.iterator(); i.hasNext(); ) { 333 String path = (String ) i.next(); 334 out.write("\\\n " + path + ","); 335 } 336 out.write("\n\n"); 337 out.write("test.jars="); 339 for (Iterator i = testClassPaths.entrySet().iterator(); i.hasNext(); ) { 340 Map.Entry entry = (Map.Entry ) i.next(); 341 String key = (String ) entry.getKey(); 342 Set paths = (Set ) entry.getValue(); 343 for (Iterator j = paths.iterator(); j.hasNext(); ) { 344 String path = (String ) j.next(); 345 String fullPath = "${" + key + "}/" + path; 346 out.write("\\\n " + fullPath + ":"); 347 if(key.equals("m2.repo")) { 348 allPaths.add(path); 349 } 350 } 351 } 352 out.write("\n\n"); 353 for (Iterator i = extraClassPaths.entrySet().iterator(); i.hasNext(); ) { 355 Map.Entry entry = (Map.Entry ) i.next(); 356 String name = (String ) entry.getKey(); 357 boolean isFileset = filesets.contains(name); 358 out.write(name + "="); 359 Set paths = (Set ) entry.getValue(); 360 for (Iterator j = paths.iterator(); j.hasNext(); ) { 361 String path = (String ) j.next(); 362 String fullPath = "${m2.repo}/" + path; 363 if (isFileset) { 364 out.write("\\\n " + path + ","); 365 } else { 366 out.write("\\\n " + fullPath + ":"); 367 } 368 allPaths.add(path); 369 } 370 out.write("\n\n"); 371 } 372 out.write("all.jars="); 374 for (Iterator i = allPaths.iterator(); i.hasNext(); ) { 375 String path = (String ) i.next(); 376 out.write("\\\n " + path + ","); 377 } 378 out.write("\n\n"); 379 out.close(); 381 os.close(); 382 } 383 384 } 385 | Popular Tags |