1 21 package proguard; 22 23 import proguard.io.*; 24 import proguard.util.*; 25 26 import java.io.*; 27 28 29 35 public class DataEntryWriterFactory 36 { 37 45 public static DataEntryWriter createDataEntryWriter(ClassPath classPath, 46 int fromIndex, 47 int toIndex) 48 { 49 DataEntryWriter writer = null; 50 51 for (int index = toIndex - 1; index >= fromIndex; index--) 53 { 54 ClassPathEntry entry = classPath.get(index); 55 writer = createClassPathEntryWriter(entry, writer); 56 } 57 58 return writer; 59 } 60 61 62 66 private static DataEntryWriter createClassPathEntryWriter(ClassPathEntry classPathEntry, 67 DataEntryWriter alternativeWriter) 68 { 69 String entryName = classPathEntry.getName(); 70 boolean isJar = endsWithIgnoreCase(entryName, ".jar"); 71 boolean isWar = endsWithIgnoreCase(entryName, ".war"); 72 boolean isEar = endsWithIgnoreCase(entryName, ".ear"); 73 boolean isZip = endsWithIgnoreCase(entryName, ".zip"); 74 75 String filter = classPathEntry.getFilter(); 76 String jarFilter = classPathEntry.getJarFilter(); 77 String warFilter = classPathEntry.getWarFilter(); 78 String earFilter = classPathEntry.getEarFilter(); 79 String zipFilter = classPathEntry.getZipFilter(); 80 81 System.out.println("Preparing output " + 82 (isJar ? "jar" : 83 isWar ? "war" : 84 isWar ? "ear" : 85 isZip ? "zip" : 86 "directory") + 87 " [" + entryName + "]" + 88 (filter != null || 89 jarFilter != null || 90 warFilter != null || 91 earFilter != null || 92 zipFilter != null ? " (filtered)" : "")); 93 94 DataEntryWriter writer = new DirectoryWriter(classPathEntry.getFile(), 95 isJar || 96 isWar || 97 isEar || 98 isZip); 99 100 writer = wrapInJarWriter(writer, isZip, zipFilter, ".zip", isJar || isWar || isEar); 102 writer = wrapInJarWriter(writer, isEar, earFilter, ".ear", isJar || isWar); 103 writer = wrapInJarWriter(writer, isWar, warFilter, ".war", isJar); 104 writer = wrapInJarWriter(writer, isJar, jarFilter, ".jar", false); 105 106 writer = filter != null? 108 new FilteredDataEntryWriter( 109 new DataEntryNameFilter( 110 new FileNameListMatcher(filter)), 111 writer) : 112 writer; 113 114 return alternativeWriter != null ? 116 new CascadingDataEntryWriter(writer, alternativeWriter) : 117 writer; 118 } 119 120 121 124 private static DataEntryWriter wrapInJarWriter(DataEntryWriter writer, 125 boolean isJar, 126 String jarFilter, 127 String jarExtension, 128 boolean dontWrap) 129 { 130 DataEntryWriter jarWriter = dontWrap ? 132 (DataEntryWriter)new ParentDataEntryWriter(writer) : 133 (DataEntryWriter)new JarWriter(writer, null, ProGuard.VERSION); 134 135 DataEntryWriter filteredJarWriter = jarFilter != null? 137 new FilteredDataEntryWriter( 138 new DataEntryParentFilter( 139 new DataEntryNameFilter( 140 new FileNameListMatcher(jarFilter))), 141 jarWriter) : 142 jarWriter; 143 144 return new FilteredDataEntryWriter( 146 new DataEntryParentFilter( 147 new DataEntryNameFilter( 148 new ExtensionMatcher(jarExtension))), 149 filteredJarWriter, 150 isJar ? jarWriter : writer); 151 } 152 153 154 158 private static boolean endsWithIgnoreCase(String string, String suffix) 159 { 160 int stringLength = string.length(); 161 int suffixLength = suffix.length(); 162 163 return string.regionMatches(true, stringLength - suffixLength, suffix, 0, suffixLength); 164 } 165 } 166 | Popular Tags |