Home | History | Annotate | Download | only in io
      1 /*
      2  * ProGuard -- shrinking, optimization, obfuscation, and preverification
      3  *             of Java bytecode.
      4  *
      5  * Copyright (c) 2002-2009 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 java.io.IOException;
     24 import java.util.zip.*;
     25 
     26 /**
     27  * This DataEntryReader lets a given DataEntryReader read all data entries of
     28  * the read jar/war/zip data entries.
     29  *
     30  * @author Eric Lafortune
     31  */
     32 public class JarReader implements DataEntryReader
     33 {
     34     private final DataEntryReader dataEntryReader;
     35 
     36 
     37     /**
     38      * Creates a new JarReader.
     39      */
     40     public JarReader(DataEntryReader dataEntryReader)
     41     {
     42         this.dataEntryReader = dataEntryReader;
     43     }
     44 
     45 
     46     // Implementation for DataEntryReader.
     47 
     48     public void read(DataEntry dataEntry) throws IOException
     49     {
     50         ZipInputStream zipInputStream = new ZipInputStream(dataEntry.getInputStream());
     51 
     52         try
     53         {
     54             // Get all entries from the input jar.
     55             while (true)
     56             {
     57                 // Can we get another entry?
     58                 ZipEntry zipEntry = zipInputStream.getNextEntry();
     59                 if (zipEntry == null)
     60                 {
     61                     break;
     62                 }
     63 
     64                 // Delegate the actual reading to the data entry reader.
     65                 dataEntryReader.read(new ZipDataEntry(dataEntry,
     66                                                       zipEntry,
     67                                                       zipInputStream));
     68             }
     69         }
     70         finally
     71         {
     72             dataEntry.closeInputStream();
     73         }
     74     }
     75 }
     76