DataEntryReaderFactory.java revision b9cc48a43ed984587c939d02fba5316bf5c0df6e
1b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/*
2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ProGuard -- shrinking, optimization, obfuscation, and preverification
3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *             of Java bytecode.
4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
5b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Copyright (c) 2002-2013 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    {
51b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        boolean isJar = classPathEntry.isJar();
52b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        boolean isWar = classPathEntry.isWar();
53b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        boolean isEar = classPathEntry.isEar();
54b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        boolean isZip = classPathEntry.isZip();
55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        List filter    = classPathEntry.getFilter();
57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        List jarFilter = classPathEntry.getJarFilter();
58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        List warFilter = classPathEntry.getWarFilter();
59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        List earFilter = classPathEntry.getEarFilter();
60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        List zipFilter = classPathEntry.getZipFilter();
61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        System.out.println(messagePrefix +
63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                           (isJar ? "jar" :
64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                            isWar ? "war" :
65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                            isEar ? "ear" :
66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                            isZip ? "zip" :
67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                    "directory") +
68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                           " [" + classPathEntry.getName() + "]" +
69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                           (filter    != null ||
70b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                            jarFilter != null ||
71b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                            warFilter != null ||
72b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                            earFilter != null ||
73b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                            zipFilter != null ? " (filtered)" : ""));
74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Add a filter, if specified.
76b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (filter != null)
77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            reader = new FilteredDataEntryReader(
79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                     new DataEntryNameFilter(
80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                     new ListParser(new FileNameParser()).parse(filter)),
81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                         reader);
82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Unzip any jars, if necessary.
85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        reader = wrapInJarReader(reader, isJar, jarFilter, ".jar");
86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (!isJar)
87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Unzip any wars, if necessary.
89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            reader = wrapInJarReader(reader, isWar, warFilter, ".war");
90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (!isWar)
91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Unzip any ears, if necessary.
93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                reader = wrapInJarReader(reader, isEar, earFilter, ".ear");
94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                if (!isEar)
95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    // Unzip any zips, if necessary.
97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    reader = wrapInJarReader(reader, isZip, zipFilter, ".zip");
98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return reader;
103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *  Wraps the given DataEntryReader in a JarReader, filtering it if necessary.
108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private static DataEntryReader wrapInJarReader(DataEntryReader reader,
110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                   boolean         isJar,
111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                   List            jarFilter,
112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                   String          jarExtension)
113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Unzip any jars, if necessary.
115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        DataEntryReader jarReader = new JarReader(reader);
116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (isJar)
118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Always unzip.
120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return jarReader;
121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        else
123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Add a filter, if specified.
125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (jarFilter != null)
126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                jarReader = new FilteredDataEntryReader(
128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                            new DataEntryNameFilter(
129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                            new ListParser(new FileNameParser()).parse(jarFilter)),
130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                jarReader);
131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Only unzip the right type of jars.
134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return new FilteredDataEntryReader(
135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                   new DataEntryNameFilter(
136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                   new ExtensionMatcher(jarExtension)),
137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                       jarReader,
138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                       reader);
139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
142