001 /** 002 * Copyright 2004-2012 The Kuali Foundation 003 * 004 * Licensed under the Educational Community 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.opensource.org/licenses/ecl2.php 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 package org.apache.torque.mojo; 017 018 import java.io.File; 019 import java.io.IOException; 020 import java.util.List; 021 022 import org.apache.commons.io.FileUtils; 023 import org.apache.maven.plugin.AbstractMojo; 024 import org.apache.maven.plugin.MojoExecutionException; 025 import org.apache.torque.util.SimpleScanner; 026 import org.codehaus.plexus.util.StringUtils; 027 028 /** 029 * Create a location listing file that describes resources inside of a jar file 030 * 031 * @author Jeff Caddel 032 * @goal metainf 033 */ 034 public class MetaInfMojo extends AbstractMojo { 035 036 /** 037 * Regular expression pattern for files to include 038 * 039 * @parameter expression="${metainf.include}" default-value="\*\*\/*" 040 * @required 041 */ 042 private String include; 043 044 /** 045 * Regular expression pattern for files to exclude 046 * 047 * @parameter expression="${metainf.exclude}" default-value="\*\*\/META-INF/*" 048 */ 049 private String exclude; 050 051 /** 052 * The directory to scan using the include/exclude patterns. Paths in <code>outputFile</code> are generated relative to this directory 053 * 054 * @parameter expression="${metainf.basedir}" default-value="${project.build.outputDirectory}" 055 * @required 056 */ 057 private File baseDir; 058 059 /** 060 * The file which will contain <code>classpath</code> references to the files that were located 061 * 062 * @parameter expression="${metainf.outputFile}" default-value="${project.build.outputDirectory}/META-INF/classpath.resources" 063 * @required 064 */ 065 private File outputFile; 066 067 /** 068 * The prefix to insert before the relative path name 069 * 070 * @parameter expression="${metainf.prefix}" default-value="classpath:" 071 */ 072 private String prefix; 073 074 @Override 075 public void execute() throws MojoExecutionException { 076 try { 077 getLog().info("Examining - " + baseDir.getAbsolutePath()); 078 getLog().info("Include - " + include); 079 getLog().info("Exclude - " + exclude); 080 SimpleScanner scanner = new SimpleScanner(baseDir, include, exclude); 081 List<File> files = scanner.getFiles(); 082 getLog().info("Located " + files.size() + " files"); 083 String content = getLocations(baseDir, files, prefix); 084 getLog().info("Creating " + outputFile); 085 FileUtils.writeStringToFile(outputFile, content); 086 } catch (Exception e) { 087 throw new MojoExecutionException("Unexpected error", e); 088 } 089 } 090 091 protected String getLocations(File baseDir, List<File> files, String prefix) throws IOException { 092 StringBuilder sb = new StringBuilder(); 093 for (int i = 0; i < files.size(); i++) { 094 if (i != 0) { 095 sb.append("\n"); 096 } 097 sb.append(getLocation(baseDir, files.get(i), prefix)); 098 } 099 return sb.toString(); 100 } 101 102 protected String getLocation(File baseDir, File file, String prefix) throws IOException { 103 String dir = baseDir.getCanonicalPath(); 104 String path = file.getCanonicalPath(); 105 int pos = dir.length() + 1; 106 return prefix + StringUtils.substring(path, pos); 107 } 108 109 public String getInclude() { 110 return include; 111 } 112 113 public void setInclude(String include) { 114 this.include = include; 115 } 116 117 public String getExclude() { 118 return exclude; 119 } 120 121 public void setExclude(String exclude) { 122 this.exclude = exclude; 123 } 124 125 public File getBaseDir() { 126 return baseDir; 127 } 128 129 public void setBaseDir(File baseDir) { 130 this.baseDir = baseDir; 131 } 132 133 public File getOutputFile() { 134 return outputFile; 135 } 136 137 public void setOutputFile(File outputFile) { 138 this.outputFile = outputFile; 139 } 140 141 public String getPrefix() { 142 return prefix; 143 } 144 145 public void setPrefix(String prefix) { 146 this.prefix = prefix; 147 } 148 149 }