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 }