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