1 /*
2  * ProGuard -- shrinking, optimization, obfuscation, and preverification
3  *             of Java bytecode.
4  *
5  * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
6  *
7  * This program is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License as published by the Free
9  * Software Foundation; either version 2 of the License, or (at your option)
10  * any later version.
11  *
12  * This program is distributed in the hope that it will be useful, but WITHOUT
13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15  * more details.
16  *
17  * You should have received a copy of the GNU General Public License along
18  * with this program; if not, write to the Free Software Foundation, Inc.,
19  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20  */
21 package proguard.io;
22 
23 import proguard.classfile.ClassConstants;
24 
25 import java.io.*;
26 import java.util.zip.*;
27 
28 /**
29  * This <code>DataEntry</code> represents a ZIP entry.
30  *
31  * @author Eric Lafortune
32  */
33 public class ZipDataEntry implements DataEntry
34 {
35     private final DataEntry      parent;
36     private final ZipEntry       zipEntry;
37     private       ZipInputStream zipInputStream;
38     private       InputStream    bufferedInputStream;
39 
40 
ZipDataEntry(DataEntry parent, ZipEntry zipEntry, ZipInputStream zipInputStream)41     public ZipDataEntry(DataEntry      parent,
42                         ZipEntry       zipEntry,
43                         ZipInputStream zipInputStream)
44     {
45         this.parent         = parent;
46         this.zipEntry       = zipEntry;
47         this.zipInputStream = zipInputStream;
48     }
49 
50 
51     // Implementations for DataEntry.
52 
getName()53     public String getName()
54     {
55         // Get the right separators.
56         String name = zipEntry.getName()
57             .replace(File.separatorChar, ClassConstants.PACKAGE_SEPARATOR);
58 
59         // Chop the trailing directory slash, if any.
60         int length = name.length();
61         return length > 0 &&
62                name.charAt(length-1) == ClassConstants.PACKAGE_SEPARATOR ?
63                    name.substring(0, length -1) :
64                    name;
65     }
66 
67 
isDirectory()68     public boolean isDirectory()
69     {
70         return zipEntry.isDirectory();
71     }
72 
73 
getInputStream()74     public InputStream getInputStream() throws IOException
75     {
76         if (bufferedInputStream == null)
77         {
78             bufferedInputStream = new BufferedInputStream(zipInputStream);
79         }
80 
81         return bufferedInputStream;
82     }
83 
84 
closeInputStream()85     public void closeInputStream() throws IOException
86     {
87         zipInputStream.closeEntry();
88         zipInputStream      = null;
89         bufferedInputStream = null;
90     }
91 
92 
getParent()93     public DataEntry getParent()
94     {
95         return parent;
96     }
97 
98 
99     // Implementations for Object.
100 
toString()101     public String toString()
102     {
103         return parent.toString() + ':' + getName();
104     }
105 }
106