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.*;
     24 
     25 /**
     26  * This DataEntryWriter delegates to a given DataEntryWriter, or failing that,
     27  * to another given DataEntryWriter.
     28  *
     29  * @author Eric Lafortune
     30  */
     31 public class CascadingDataEntryWriter implements DataEntryWriter
     32 {
     33     private DataEntryWriter dataEntryWriter1;
     34     private DataEntryWriter dataEntryWriter2;
     35 
     36 
     37     /**
     38      * Creates a new CascadingDataEntryWriter.
     39      * @param dataEntryWriter1 the DataEntryWriter to which the writing will be
     40      *                         delegated first.
     41      * @param dataEntryWriter2 the DataEntryWriter to which the writing will be
     42      *                         delegated, if the first one can't provide an
     43      *                         output stream.
     44      */
     45     public CascadingDataEntryWriter(DataEntryWriter dataEntryWriter1,
     46                                     DataEntryWriter dataEntryWriter2)
     47     {
     48         this.dataEntryWriter1 = dataEntryWriter1;
     49         this.dataEntryWriter2 = dataEntryWriter2;
     50     }
     51 
     52 
     53     // Implementations for DataEntryWriter.
     54 
     55 
     56     public boolean createDirectory(DataEntry dataEntry) throws IOException
     57     {
     58         // Try to create a directory with the first data entry writer, or
     59         // otherwise with the second data entry writer.
     60         return dataEntryWriter1.createDirectory(dataEntry) ||
     61                dataEntryWriter2.createDirectory(dataEntry);
     62     }
     63 
     64 
     65     public OutputStream getOutputStream(DataEntry dataEntry) throws IOException
     66     {
     67         return getOutputStream(dataEntry,  null);
     68     }
     69 
     70 
     71     public OutputStream getOutputStream(DataEntry dataEntry,
     72                                         Finisher  finisher) throws IOException
     73     {
     74         // Try to get an output stream from the first data entry writer.
     75         OutputStream outputStream =
     76             dataEntryWriter1.getOutputStream(dataEntry, finisher);
     77 
     78         // Return it, if it's not null. Otherwise try to get an output stream
     79         // from the second data entry writer.
     80         return outputStream != null ?
     81             outputStream :
     82             dataEntryWriter2.getOutputStream(dataEntry, finisher);
     83     }
     84 
     85 
     86     public void close() throws IOException
     87     {
     88         dataEntryWriter1.close();
     89         dataEntryWriter2.close();
     90 
     91         dataEntryWriter1 = null;
     92         dataEntryWriter2 = null;
     93     }
     94 }
     95