Home | History | Annotate | Download | only in io
      1 /*
      2  * ProGuard -- shrinking, optimization, obfuscation, and preverification
      3  *             of Java bytecode.
      4  *
      5  * Copyright (c) 2002-2014 Eric Lafortune (eric (at) 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 
     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 
     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 
     68     public boolean isDirectory()
     69     {
     70         return zipEntry.isDirectory();
     71     }
     72 
     73 
     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 
     85     public void closeInputStream() throws IOException
     86     {
     87         zipInputStream.closeEntry();
     88         zipInputStream      = null;
     89         bufferedInputStream = null;
     90     }
     91 
     92 
     93     public DataEntry getParent()
     94     {
     95         return parent;
     96     }
     97 
     98 
     99     // Implementations for Object.
    100 
    101     public String toString()
    102     {
    103         return parent.toString() + ':' + getName();
    104     }
    105 }
    106