View Javadoc
1   package net_alchim31_maven_yuicompressor;
2   
3   import java.io.File;
4   import java.io.FileInputStream;
5   import java.io.OutputStream;
6   import java.util.ArrayList;
7   import java.util.Arrays;
8   import java.util.Collection;
9   import java.util.List;
10  
11  import org.codehaus.plexus.util.DirectoryScanner;
12  import org.codehaus.plexus.util.IOUtil;
13  import org.sonatype.plexus.build.incremental.BuildContext;
14  
15  public class Aggregation {
16      public File inputDir;
17      public File output;
18      public String[] includes;
19      public String[] excludes;
20      public boolean removeIncluded = false;
21      public boolean insertNewLine = false;
22      public boolean insertFileHeader = false;
23      public boolean fixLastSemicolon = false;
24      public boolean autoExcludeWildcards = false;
25  
26      public List<File> run(Collection<File> previouslyIncludedFiles, BuildContext buildContext) throws Exception {
27          defineInputDir();
28  
29          List<File> files;
30          if (autoExcludeWildcards) {
31              files = getIncludedFiles(previouslyIncludedFiles,buildContext);
32          } else {
33              files = getIncludedFiles(null,buildContext);
34          }
35  
36          if (files.size() != 0) {
37              output = output.getCanonicalFile();
38              output.getParentFile().mkdirs();
39              OutputStream out = buildContext.newFileOutputStream( output );
40              try {
41                  for (File file : files) {
42                      if (file.getCanonicalPath().equals(output.getCanonicalPath())) {
43                          continue;
44                      }
45                      FileInputStream in = new FileInputStream(file);
46                      try {
47                          if (insertFileHeader) {
48                              out.write(createFileHeader(file).getBytes());
49                          }
50                          IOUtil.copy(in, out);
51                          if (fixLastSemicolon) {
52                              out.write(';');
53                          }
54                          if (insertNewLine) {
55                              out.write('\n');
56                          }
57                      } finally {
58                          IOUtil.close(in);
59                          in = null;
60                      }
61                      if (removeIncluded) {
62                          file.delete();
63                          buildContext.refresh(file);
64                      }
65                  }
66              } finally {
67                  IOUtil.close(out);
68                  out = null;
69              }
70          }
71          return files;
72      }
73  
74      private String createFileHeader(File file) {
75          StringBuilder header = new StringBuilder();
76          header.append("/*");
77          header.append(file.getName());
78          header.append("*/");
79  
80          if (insertNewLine) {
81              header.append('\n');
82          }
83  
84          return header.toString();
85      }
86  
87      private void defineInputDir() throws Exception {
88        if (inputDir == null) {
89          inputDir = output.getParentFile();
90        }
91        inputDir = inputDir.getCanonicalFile();
92      }
93  
94      private List<File> getIncludedFiles(Collection<File> previouslyIncludedFiles, BuildContext buildContext) throws Exception {
95          List<File> filesToAggregate = new ArrayList<File>();
96          if (includes != null) {
97              for (String include : includes) {
98                  addInto(include, filesToAggregate, previouslyIncludedFiles);
99              }
100         }
101 
102         //If build is incremental with no delta, then don't include for aggregation
103         if(buildContext.isIncremental() && !buildContext.hasDelta(filesToAggregate)){
104         	return new ArrayList<File>();
105         } else{
106         	return filesToAggregate;
107         }
108 
109     }
110 
111     private void addInto(String include, List<File> includedFiles, Collection<File> previouslyIncludedFiles) throws Exception {
112         if (include.indexOf('*') > -1) {
113             DirectoryScanner scanner = newScanner();
114             scanner.setIncludes(new String[] { include });
115             scanner.scan();
116             String[] rpaths = scanner.getIncludedFiles();
117             Arrays.sort(rpaths);
118             for (String rpath : rpaths) {
119                 File file = new File(scanner.getBasedir(), rpath);
120                 if (!includedFiles.contains(file) && (previouslyIncludedFiles == null || !previouslyIncludedFiles.contains(file))) {
121                     includedFiles.add(file);
122                 }
123             }
124         } else {
125             File file = new File(include);
126             if (!file.isAbsolute()) {
127                 file = new File(inputDir, include);
128             }
129             if (!includedFiles.contains(file)) {
130                 includedFiles.add(file);
131             }
132         }
133     }
134 
135     private DirectoryScanner newScanner() throws Exception {
136         DirectoryScanner scanner = new DirectoryScanner();
137         scanner.setBasedir(inputDir);
138         if ((excludes != null) && (excludes.length != 0)) {
139             scanner.setExcludes(excludes);
140         }
141         scanner.addDefaultExcludes();
142         return scanner;
143     }
144 }