src/core/net/sf/basedb/util/FileCopyRunnable.java

Code
Comments
Other
Rev Date Author Line
5266 11 Mar 10 nicklas 1 /*
5266 11 Mar 10 nicklas 2   $Id $
5266 11 Mar 10 nicklas 3
5266 11 Mar 10 nicklas 4   Copyright (C) 2010 Nicklas Nordborg
5266 11 Mar 10 nicklas 5
5266 11 Mar 10 nicklas 6   This file is part of BASE - BioArray Software Environment.
5266 11 Mar 10 nicklas 7   Available at http://base.thep.lu.se/
5266 11 Mar 10 nicklas 8
5266 11 Mar 10 nicklas 9   BASE is free software; you can redistribute it and/or
5266 11 Mar 10 nicklas 10   modify it under the terms of the GNU General Public License
5266 11 Mar 10 nicklas 11   as published by the Free Software Foundation; either version 3
5266 11 Mar 10 nicklas 12   of the License, or (at your option) any later version.
5266 11 Mar 10 nicklas 13
5266 11 Mar 10 nicklas 14   BASE is distributed in the hope that it will be useful,
5266 11 Mar 10 nicklas 15   but WITHOUT ANY WARRANTY; without even the implied warranty of
5266 11 Mar 10 nicklas 16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
5266 11 Mar 10 nicklas 17   GNU General Public License for more details.
5266 11 Mar 10 nicklas 18
5266 11 Mar 10 nicklas 19   You should have received a copy of the GNU General Public License
5266 11 Mar 10 nicklas 20   along with BASE. If not, see <http://www.gnu.org/licenses/>.
5266 11 Mar 10 nicklas 21 */
5266 11 Mar 10 nicklas 22 package net.sf.basedb.util;
5266 11 Mar 10 nicklas 23
5266 11 Mar 10 nicklas 24 import java.io.InputStream;
5266 11 Mar 10 nicklas 25 import java.io.OutputStream;
5266 11 Mar 10 nicklas 26
5266 11 Mar 10 nicklas 27 /**
5266 11 Mar 10 nicklas 28   Runnable implementation that copies data from an input stream
5266 11 Mar 10 nicklas 29   to an output stream when executed. This is useful when executing
5266 11 Mar 10 nicklas 30   external processes since reading and writing to their stdin and
5266 11 Mar 10 nicklas 31   stdout is best done with separate thread.
5266 11 Mar 10 nicklas 32
5266 11 Mar 10 nicklas 33   @author nicklas
5266 11 Mar 10 nicklas 34   @since 2.15
5266 11 Mar 10 nicklas 35   @base.modified $Date $
5266 11 Mar 10 nicklas 36 */
5266 11 Mar 10 nicklas 37 public class FileCopyRunnable
5266 11 Mar 10 nicklas 38   implements Runnable
5266 11 Mar 10 nicklas 39 {
5266 11 Mar 10 nicklas 40
5266 11 Mar 10 nicklas 41   private final InputStream in;
5266 11 Mar 10 nicklas 42   private final OutputStream out;
5266 11 Mar 10 nicklas 43   private Throwable error;
5266 11 Mar 10 nicklas 44   
5266 11 Mar 10 nicklas 45   /**
5266 11 Mar 10 nicklas 46     Create a new file copy object. The stream are automatically closed 
5266 11 Mar 10 nicklas 47     in case of an error
5266 11 Mar 10 nicklas 48     
5266 11 Mar 10 nicklas 49     @param in The input stream to read data from (required)
5266 11 Mar 10 nicklas 50     @param out The output stream to write data to (optional; if not
5266 11 Mar 10 nicklas 51       given the input stream is read and then discarded)
5266 11 Mar 10 nicklas 52   */
5266 11 Mar 10 nicklas 53   public FileCopyRunnable(InputStream in, OutputStream out)
5266 11 Mar 10 nicklas 54   {
5266 11 Mar 10 nicklas 55     if (in == null) throw new NullPointerException("in");
5266 11 Mar 10 nicklas 56     this.in = in;
5266 11 Mar 10 nicklas 57     this.out = out;
5266 11 Mar 10 nicklas 58   }
5266 11 Mar 10 nicklas 59   
5266 11 Mar 10 nicklas 60   @Override
5266 11 Mar 10 nicklas 61   public void run()
5266 11 Mar 10 nicklas 62   {
5266 11 Mar 10 nicklas 63     try
5266 11 Mar 10 nicklas 64     {
5266 11 Mar 10 nicklas 65       if (out == null)
5266 11 Mar 10 nicklas 66       {
5266 11 Mar 10 nicklas 67         FileUtil.read(in);
5266 11 Mar 10 nicklas 68       }
5266 11 Mar 10 nicklas 69       else
5266 11 Mar 10 nicklas 70       {
5266 11 Mar 10 nicklas 71         FileUtil.copy(in, out);
5266 11 Mar 10 nicklas 72       }
5266 11 Mar 10 nicklas 73     }
5266 11 Mar 10 nicklas 74     catch (Throwable t)
5266 11 Mar 10 nicklas 75     {
5266 11 Mar 10 nicklas 76       error = t;
5266 11 Mar 10 nicklas 77     }
5266 11 Mar 10 nicklas 78     finally
5266 11 Mar 10 nicklas 79     {
5266 11 Mar 10 nicklas 80       FileUtil.close(in);
5266 11 Mar 10 nicklas 81       FileUtil.close(out);
5266 11 Mar 10 nicklas 82     }
5266 11 Mar 10 nicklas 83   }
5266 11 Mar 10 nicklas 84
5266 11 Mar 10 nicklas 85   /**
5266 11 Mar 10 nicklas 86     A boolean flag indicating if the copying was sucessful or not.
5266 11 Mar 10 nicklas 87     This method should only be called after the thread has ended.
5266 11 Mar 10 nicklas 88     @see #getError()
5266 11 Mar 10 nicklas 89   */
5266 11 Mar 10 nicklas 90   public boolean hasError()
5266 11 Mar 10 nicklas 91   {
5266 11 Mar 10 nicklas 92     return error != null;
5266 11 Mar 10 nicklas 93   }
5266 11 Mar 10 nicklas 94   
5266 11 Mar 10 nicklas 95   /**
5266 11 Mar 10 nicklas 96     Get the exception that was thrown when executing the file copy
5266 11 Mar 10 nicklas 97     operation. This method should only be called after the thread 
5266 11 Mar 10 nicklas 98     has ended.
5266 11 Mar 10 nicklas 99     @return An error or null if the operation was sucessful
5266 11 Mar 10 nicklas 100     @see #hasError()
5266 11 Mar 10 nicklas 101   */
5266 11 Mar 10 nicklas 102   public Throwable getError()
5266 11 Mar 10 nicklas 103   {
5266 11 Mar 10 nicklas 104     return error;
5266 11 Mar 10 nicklas 105   }
5266 11 Mar 10 nicklas 106   
5266 11 Mar 10 nicklas 107 }