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    }