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
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 }