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.io;
22b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
23b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.util.ExtensionMatcher;
24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport java.io.*;
26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
27b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/**
29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This DataEntryReader writes the ZIP entries and files that it reads to a
30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * given DataEntryWriter.
31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune
33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */
34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopublic class DataEntryCopier implements DataEntryReader
35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{
36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private static final int BUFFER_SIZE = 1024;
37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private final DataEntryWriter dataEntryWriter;
39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private final byte[]          buffer = new byte[BUFFER_SIZE];
40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public DataEntryCopier(DataEntryWriter dataEntryWriter)
44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        this.dataEntryWriter = dataEntryWriter;
46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for DataEntryReader.
50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void read(DataEntry dataEntry) throws IOException
52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        try
54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (dataEntry.isDirectory())
56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                dataEntryWriter.createDirectory(dataEntry);
58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            else
60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Get the output entry corresponding to this input entry.
62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                OutputStream outputStream = dataEntryWriter.getOutputStream(dataEntry);
63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                if (outputStream != null)
64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    InputStream inputStream = dataEntry.getInputStream();
66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
67b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                    try
68b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                    {
69b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                        // Copy the data from the input entry to the output entry.
70b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                        copyData(inputStream, outputStream);
71b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                    }
72b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                    finally
73b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                    {
74b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                        // Close the data entries.
75b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                        dataEntry.closeInputStream();
76b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                    }
77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        catch (IOException ex)
81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            System.err.println("Warning: can't write resource [" + dataEntry.getName() + "] (" + ex.getMessage() + ")");
83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
84b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        catch (Exception ex)
85b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
86b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            throw (IOException)new IOException("Can't write resource ["+dataEntry.getName()+"] ("+ex.getMessage()+")").initCause(ex);
87b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Copies all data that it can read from the given input stream to the
93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * given output stream.
94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    protected void copyData(InputStream  inputStream,
96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                            OutputStream outputStream)
97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    throws IOException
98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        while (true)
100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            int count = inputStream.read(buffer);
102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (count < 0)
103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            outputStream.write(buffer, 0, count);
107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        outputStream.flush();
110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * A main method for testing file/jar/war/directory copying.
115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static void main(String[] args)
117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        try
119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            String input  = args[0];
121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            String output = args[1];
122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            boolean outputIsJar = output.endsWith(".jar");
124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            boolean outputIsWar = output.endsWith(".war");
125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            boolean outputIsEar = output.endsWith(".ear");
126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            boolean outputIsZip = output.endsWith(".zip");
127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            DataEntryWriter writer = new DirectoryWriter(new File(output),
129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                         outputIsJar ||
130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                         outputIsWar ||
131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                         outputIsEar ||
132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                         outputIsZip);
133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (!outputIsJar)
135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Zip up any zips, if necessary.
137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            DataEntryWriter zipWriter = new JarWriter(writer);
138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (outputIsZip)
139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Always zip.
141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                writer = zipWriter;
142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            else
144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Only zip up zips.
146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                writer = new FilteredDataEntryWriter(new DataEntryParentFilter(
147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                     new DataEntryNameFilter(
148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                     new ExtensionMatcher(".zip"))),
149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                     zipWriter,
150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                     writer);
151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Zip up any wars, if necessary.
154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            DataEntryWriter warWriter = new JarWriter(writer);
155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (outputIsWar)
156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Always zip.
158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                writer = warWriter;
159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            else
161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
162b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Only zip up wars.
163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                writer = new FilteredDataEntryWriter(new DataEntryParentFilter(
164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                     new DataEntryNameFilter(
165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                     new ExtensionMatcher(".war"))),
166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                     warWriter,
167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                     writer);
168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Zip up any jars, if necessary.
172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        DataEntryWriter jarWriter = new JarWriter(writer);
173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (outputIsJar)
174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Always zip.
176b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            writer = jarWriter;
177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        else
179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Only zip up jars.
181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            writer = new FilteredDataEntryWriter(new DataEntryParentFilter(
182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                 new DataEntryNameFilter(
183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                 new ExtensionMatcher(".jar"))),
184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                 jarWriter,
185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                 writer);
186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Create the copying DataEntryReader.
190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            DataEntryReader reader = new DataEntryCopier(writer);
191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
193b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            boolean inputIsJar = input.endsWith(".jar");
194b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            boolean inputIsWar = input.endsWith(".war");
195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            boolean inputIsZip = input.endsWith(".zip");
196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Unzip any jars, if necessary.
198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            DataEntryReader jarReader = new JarReader(reader);
199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (inputIsJar)
200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
201b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Always unzip.
202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                reader = jarReader;
203b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
204b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            else
205b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
206b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Only unzip jar entries.
207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                reader = new FilteredDataEntryReader(new DataEntryNameFilter(
208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                     new ExtensionMatcher(".jar")),
209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                     jarReader,
210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                     reader);
211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Unzip any wars, if necessary.
213b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                DataEntryReader warReader = new JarReader(reader);
214b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                if (inputIsWar)
215b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    // Always unzip.
217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    reader = warReader;
218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                else
220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    // Only unzip war entries.
222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    reader = new FilteredDataEntryReader(new DataEntryNameFilter(
223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                         new ExtensionMatcher(".war")),
224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                         warReader,
225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                         reader);
226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
227b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Unzip any zips, if necessary.
229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                DataEntryReader zipReader = new JarReader(reader);
230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                if (inputIsZip)
231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    // Always unzip.
233b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    reader = zipReader;
234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                else
236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    // Only unzip zip entries.
238b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    reader = new FilteredDataEntryReader(new DataEntryNameFilter(
239b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                         new ExtensionMatcher(".zip")),
240b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                         zipReader,
241b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                         reader);
242b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
243b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            DirectoryPump directoryReader = new DirectoryPump(new File(input));
246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            directoryReader.pumpDataEntries(reader);
248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            writer.close();
250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
251b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        catch (Exception ex)
252b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
253b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            ex.printStackTrace();
254b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
255b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
256b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
257