001 package org.sonar.dev; 002 003 import org.apache.commons.io.FileUtils; 004 import org.apache.commons.io.IOUtils; 005 import org.apache.commons.io.LineIterator; 006 import org.apache.maven.plugin.AbstractMojo; 007 import org.apache.maven.plugin.MojoExecutionException; 008 import org.apache.maven.plugin.MojoFailureException; 009 import org.codehaus.plexus.util.DirectoryScanner; 010 import org.codehaus.plexus.util.StringUtils; 011 012 import java.io.File; 013 import java.io.IOException; 014 015 /** 016 * @goal trim 017 */ 018 public class TrimMojo extends AbstractMojo { 019 020 /** 021 * @parameter 022 * @required 023 */ 024 private File directory; 025 026 /** 027 * List of ant-style patterns. If 028 * this is not specified, allfiles in the project source directories are included. 029 * 030 * @parameter 031 */ 032 private String[] includes; 033 034 /** 035 * @parameter 036 */ 037 private String[] excludes; 038 039 040 /** 041 * Specifies the encoding of the source files. 042 * 043 * @parameter expression="${encoding}" default-value="${project.build.sourceEncoding}" 044 */ 045 private String sourceEncoding; 046 047 public void execute() throws MojoExecutionException, MojoFailureException { 048 if (directory == null || !directory.exists()) { 049 return; 050 } 051 052 File[] files = scanFiles(); 053 for (File file : files) { 054 StringBuilder sb = new StringBuilder(); 055 try { 056 LineIterator lines = FileUtils.lineIterator(file, sourceEncoding); 057 while (lines.hasNext()) { 058 String line = lines.nextLine(); 059 sb.append(StringUtils.trim(line)); 060 sb.append(IOUtils.LINE_SEPARATOR); 061 } 062 FileUtils.writeStringToFile(file, sb.toString(), sourceEncoding); 063 064 } catch (IOException e) { 065 throw new MojoExecutionException("Can not trim the file " + file, e); 066 } 067 } 068 getLog().info("Trimmed files: " + files.length); 069 } 070 071 /** 072 * gets a list of all files in the source directory. 073 * 074 * @return the list of all files in the source directory; 075 */ 076 private File[] scanFiles() { 077 String[] defaultIncludes = {"**\\*"}; 078 DirectoryScanner ds = new DirectoryScanner(); 079 if (includes == null) { 080 ds.setIncludes(defaultIncludes); 081 } else { 082 ds.setIncludes(includes); 083 } 084 ds.addDefaultExcludes(); // .svn, ... 085 if (excludes != null) { 086 ds.setExcludes(excludes); 087 } 088 ds.setBasedir(directory); 089 getLog().info("Scanning directory " + directory); 090 ds.scan(); 091 int maxFiles = ds.getIncludedFiles().length; 092 File[] result = new File[maxFiles]; 093 for (int i = 0; i < maxFiles; i++) { 094 result[i] = new File(directory, ds.getIncludedFiles()[i]); 095 } 096 return result; 097 } 098 099 public File getDirectory() { 100 return directory; 101 } 102 103 public void setDirectory(File directory) { 104 this.directory = directory; 105 } 106 107 public String[] getIncludes() { 108 return includes; 109 } 110 111 public void setIncludes(String[] includes) { 112 this.includes = includes; 113 } 114 115 public String[] getExcludes() { 116 return excludes; 117 } 118 119 public void setExcludes(String[] excludes) { 120 this.excludes = excludes; 121 } 122 123 public String getSourceEncoding() { 124 return sourceEncoding; 125 } 126 127 public void setSourceEncoding(String sourceEncoding) { 128 this.sourceEncoding = sourceEncoding; 129 } 130 }