1 package net_alchim31_maven_yuicompressor; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.util.ArrayList; 7 import java.util.Arrays; 8 import java.util.List; 9 10 import org.codehaus.plexus.util.DirectoryScanner; 11 import org.codehaus.plexus.util.IOUtil; 12 13 public class Aggregation { 14 public File inputDir; 15 public File output; 16 public String[] includes; 17 public String[] excludes; 18 public boolean removeIncluded = false; 19 public boolean insertNewLine = false; 20 public boolean fixLastSemicolon = false; 21 22 public void run() throws Exception { 23 defineInputDir(); 24 List<File> files = getIncludedFiles(); 25 if (files.size() != 0) { 26 output = output.getCanonicalFile(); 27 output.getParentFile().mkdirs(); 28 FileOutputStream out = new FileOutputStream(output); 29 try { 30 for (File file : files) { 31 if (file.getCanonicalPath().equals(output.getCanonicalPath())) { 32 continue; 33 } 34 FileInputStream in = new FileInputStream(file); 35 try { 36 IOUtil.copy(in, out); 37 if (fixLastSemicolon) { 38 out.write(';'); 39 } 40 if (insertNewLine) { 41 out.write('\n'); 42 } 43 } finally { 44 IOUtil.close(in); 45 in = null; 46 } 47 if (removeIncluded) { 48 file.delete(); 49 } 50 } 51 } finally { 52 IOUtil.close(out); 53 out = null; 54 } 55 } 56 } 57 58 private void defineInputDir() throws Exception { 59 if (inputDir == null) { 60 inputDir = output.getParentFile(); 61 } 62 inputDir = inputDir.getCanonicalFile(); 63 } 64 65 private List<File> getIncludedFiles() throws Exception { 66 ArrayList<File> back = new ArrayList<File>(); 67 if (includes != null) { 68 for (String include : includes) { 69 addInto(include, back); 70 } 71 } 72 return back; 73 } 74 75 private void addInto(String include, List<File> includedFiles) throws Exception { 76 if (include.indexOf('*') > -1) { 77 DirectoryScanner scanner = newScanner(); 78 scanner.setIncludes(new String[] { include }); 79 scanner.scan(); 80 String[] rpaths = scanner.getIncludedFiles(); 81 Arrays.sort(rpaths); 82 for (String rpath : rpaths) { 83 File file = new File(scanner.getBasedir(), rpath); 84 if (!includedFiles.contains(file)) { 85 includedFiles.add(file); 86 } 87 } 88 } else { 89 File file = new File(include); 90 if (!file.isAbsolute()) { 91 file = new File(inputDir, include); 92 } 93 if (!includedFiles.contains(file)) { 94 includedFiles.add(file); 95 } 96 } 97 } 98 99 private DirectoryScanner newScanner() throws Exception { 100 DirectoryScanner scanner = new DirectoryScanner(); 101 scanner.setBasedir(inputDir); 102 if ((excludes != null) && (excludes.length != 0)) { 103 scanner.setExcludes(excludes); 104 } 105 scanner.addDefaultExcludes(); 106 return scanner; 107 } 108 }