1b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/* 2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ProGuard -- shrinking, optimization, obfuscation, and preverification 3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * of Java bytecode. 4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 52270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu) 6b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 7b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is free software; you can redistribute it and/or modify it 8b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * under the terms of the GNU General Public License as published by the Free 9b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Software Foundation; either version 2 of the License, or (at your option) 10b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * any later version. 11b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 12b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is distributed in the hope that it will be useful, but WITHOUT 13b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 15b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * more details. 16b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 17b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * You should have received a copy of the GNU General Public License along 18b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * with this program; if not, write to the Free Software Foundation, Inc., 19b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 21b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopackage proguard; 22b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 23b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.io.*; 24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.util.*; 25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport java.util.List; 27b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/** 30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This class can create DataEntryReader instances based on class path entries. 31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * The readers will unwrap the input data entries from any jars, wars, ears, 32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * and zips, before passing them to a given reader. 33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune 35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopublic class DataEntryReaderFactory 37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{ 38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Creates a DataEntryReader that can read the given class path entry. 40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param messagePrefix a prefix for messages that are printed out. 42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param classPathEntry the input class path entry. 43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param reader a data entry reader to which the reading of actual 44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * classes and resource files can be delegated. 45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return a DataEntryReader for reading the given class path entry. 46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static DataEntryReader createDataEntryReader(String messagePrefix, 48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ClassPathEntry classPathEntry, 49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato DataEntryReader reader) 50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 512270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom boolean isApk = classPathEntry.isApk(); 52b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang boolean isJar = classPathEntry.isJar(); 532270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom boolean isAar = classPathEntry.isAar(); 54b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang boolean isWar = classPathEntry.isWar(); 55b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang boolean isEar = classPathEntry.isEar(); 56b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang boolean isZip = classPathEntry.isZip(); 57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato List filter = classPathEntry.getFilter(); 592270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom List apkFilter = classPathEntry.getApkFilter(); 60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato List jarFilter = classPathEntry.getJarFilter(); 612270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom List aarFilter = classPathEntry.getAarFilter(); 62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato List warFilter = classPathEntry.getWarFilter(); 63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato List earFilter = classPathEntry.getEarFilter(); 64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato List zipFilter = classPathEntry.getZipFilter(); 65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato System.out.println(messagePrefix + 672270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom (isApk ? "apk" : 682270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom isJar ? "jar" : 692270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom isAar ? "aar" : 70b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato isWar ? "war" : 71b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato isEar ? "ear" : 72b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato isZip ? "zip" : 73b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato "directory") + 74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato " [" + classPathEntry.getName() + "]" + 75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato (filter != null || 762270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom apkFilter != null || 77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato jarFilter != null || 782270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom aarFilter != null || 79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato warFilter != null || 80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato earFilter != null || 81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato zipFilter != null ? " (filtered)" : "")); 82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Add a filter, if specified. 84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (filter != null) 85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato reader = new FilteredDataEntryReader( 87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new DataEntryNameFilter( 88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new ListParser(new FileNameParser()).parse(filter)), 89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato reader); 90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 922270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Unzip any apks, if necessary. 932270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom reader = wrapInJarReader(reader, isApk, apkFilter, ".apk"); 942270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if (!isApk) 95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 962270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Unzip any jars, if necessary. 972270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom reader = wrapInJarReader(reader, isJar, jarFilter, ".jar"); 982270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if (!isJar) 99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1002270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Unzip any aars, if necessary. 1012270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom reader = wrapInJarReader(reader, isAar, aarFilter, ".aar"); 1022270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if (!isAar) 103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1042270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Unzip any wars, if necessary. 1052270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom reader = wrapInJarReader(reader, isWar, warFilter, ".war"); 1062270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if (!isWar) 1072270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 1082270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Unzip any ears, if necessary. 1092270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom reader = wrapInJarReader(reader, isEar, earFilter, ".ear"); 1102270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if (!isEar) 1112270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 1122270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Unzip any zips, if necessary. 1132270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom reader = wrapInJarReader(reader, isZip, zipFilter, ".zip"); 1142270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 1152270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return reader; 121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Wraps the given DataEntryReader in a JarReader, filtering it if necessary. 126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private static DataEntryReader wrapInJarReader(DataEntryReader reader, 128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boolean isJar, 129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato List jarFilter, 130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String jarExtension) 131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Unzip any jars, if necessary. 133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato DataEntryReader jarReader = new JarReader(reader); 134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (isJar) 136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Always unzip. 138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return jarReader; 139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato else 141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Add a filter, if specified. 143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (jarFilter != null) 144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato jarReader = new FilteredDataEntryReader( 146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new DataEntryNameFilter( 147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new ListParser(new FileNameParser()).parse(jarFilter)), 148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato jarReader); 149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Only unzip the right type of jars. 152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return new FilteredDataEntryReader( 153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new DataEntryNameFilter( 154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new ExtensionMatcher(jarExtension)), 155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato jarReader, 156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato reader); 157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 160