Home | History | Annotate | Download | only in pack200
      1 /*
      2  * Licensed to the Apache Software Foundation (ASF) under one
      3  * or more contributor license agreements.  See the NOTICE file
      4  * distributed with this work for additional information
      5  * regarding copyright ownership.  The ASF licenses this file
      6  * to you under the Apache License, Version 2.0 (the
      7  * "License"); you may not use this file except in compliance
      8  * with the License.  You may obtain a copy of the License at
      9  *
     10  * http://www.apache.org/licenses/LICENSE-2.0
     11  *
     12  * Unless required by applicable law or agreed to in writing,
     13  * software distributed under the License is distributed on an
     14  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
     15  * KIND, either express or implied.  See the License for the
     16  * specific language governing permissions and limitations
     17  * under the License.
     18  */
     19 
     20 package org.apache.commons.compress.compressors.pack200;
     21 
     22 import java.io.FilterOutputStream;
     23 import java.io.IOException;
     24 import java.io.InputStream;
     25 import java.io.OutputStream;
     26 
     27 /**
     28  * Provides an InputStream to read all data written to this
     29  * OutputStream.
     30  *
     31  * @ThreadSafe
     32  * @since 1.3
     33  */
     34 abstract class StreamBridge extends FilterOutputStream {
     35     private InputStream input;
     36     private final Object inputLock = new Object();
     37 
     38     protected StreamBridge(final OutputStream out) {
     39         super(out);
     40     }
     41 
     42     protected StreamBridge() {
     43         this(null);
     44     }
     45 
     46     /**
     47      * Provides the input view.
     48      */
     49     InputStream getInput() throws IOException {
     50         synchronized (inputLock) {
     51             if (input == null) {
     52                 input = getInputView();
     53             }
     54         }
     55         return input;
     56     }
     57 
     58     /**
     59      * Creates the input view.
     60      */
     61     abstract InputStream getInputView() throws IOException;
     62 
     63     /**
     64      * Closes input and output and releases all associated resources.
     65      */
     66     void stop() throws IOException {
     67         close();
     68         synchronized (inputLock) {
     69             if (input != null) {
     70                 input.close();
     71                 input = null;
     72             }
     73         }
     74     }
     75 }
     76