extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie/script/TemporaryWorkDir.java

Code
Comments
Other
Rev Date Author Line
6035 29 Oct 20 nicklas 1 package net.sf.basedb.reggie.script;
5431 16 May 19 nicklas 2
5431 16 May 19 nicklas 3 import java.io.File;
5431 16 May 19 nicklas 4 import java.io.IOException;
5431 16 May 19 nicklas 5 import java.lang.ref.Cleaner;
5431 16 May 19 nicklas 6 import java.lang.ref.Cleaner.Cleanable;
5431 16 May 19 nicklas 7
5431 16 May 19 nicklas 8 import net.sf.basedb.util.FileUtil;
5431 16 May 19 nicklas 9
5431 16 May 19 nicklas 10 /**
5431 16 May 19 nicklas 11   Represents a temporary working directory that is created, used and 
5431 16 May 19 nicklas 12   then removed (including all files and subdirectories). It is
5431 16 May 19 nicklas 13   recommended that the user of the temporary directory is
5431 16 May 19 nicklas 14   calling {@link #close()} as soon as possible when it is no longer
5431 16 May 19 nicklas 15   needed. If the close method is never called the directory will
5431 16 May 19 nicklas 16   automatically be removed at an undefined later point of time, but
5431 16 May 19 nicklas 17   not before a ''monitor' object has been garbage collected.
5431 16 May 19 nicklas 18   
5431 16 May 19 nicklas 19   @author nicklas
5431 16 May 19 nicklas 20   @since 4.23
5431 16 May 19 nicklas 21 */
5431 16 May 19 nicklas 22 public class TemporaryWorkDir
5431 16 May 19 nicklas 23   implements AutoCloseable
5431 16 May 19 nicklas 24
5431 16 May 19 nicklas 25 {
5431 16 May 19 nicklas 26
5431 16 May 19 nicklas 27   private final static Cleaner cleaner = Cleaner.create();
5431 16 May 19 nicklas 28   
5431 16 May 19 nicklas 29   /**
5431 16 May 19 nicklas 30     Create a temporary working directory that is automatically deleted
5431 16 May 19 nicklas 31     after the monitor object has been garbage collected, but
5431 16 May 19 nicklas 32     the recommendation is that {@link #close()} is called as soon
5431 16 May 19 nicklas 33     as possbile.
5431 16 May 19 nicklas 34   */
5431 16 May 19 nicklas 35   public static TemporaryWorkDir create(String prefix, String suffix, Object monitor)
5431 16 May 19 nicklas 36     throws IOException
5431 16 May 19 nicklas 37   {
5431 16 May 19 nicklas 38     TemporaryWorkDir tmp = new TemporaryWorkDir(monitor);
5431 16 May 19 nicklas 39     tmp.createWorkDir(prefix, suffix);
5431 16 May 19 nicklas 40     return tmp;
5431 16 May 19 nicklas 41   }
5431 16 May 19 nicklas 42   
5431 16 May 19 nicklas 43   private final State state;
5431 16 May 19 nicklas 44   private final Cleanable cleanable;
5431 16 May 19 nicklas 45   
5431 16 May 19 nicklas 46   private TemporaryWorkDir(Object monitor)
5431 16 May 19 nicklas 47   {
5431 16 May 19 nicklas 48     this.state = new State();
5431 16 May 19 nicklas 49     this.cleanable = cleaner.register(monitor, state);
5431 16 May 19 nicklas 50   }
5431 16 May 19 nicklas 51
5431 16 May 19 nicklas 52   private void createWorkDir(String prefix, String suffix)
5431 16 May 19 nicklas 53     throws IOException
5431 16 May 19 nicklas 54   {
5431 16 May 19 nicklas 55     state.workDir = FileUtil.createTempDirectory(prefix, suffix, null);
5431 16 May 19 nicklas 56   }
5431 16 May 19 nicklas 57   
5431 16 May 19 nicklas 58   /**
5431 16 May 19 nicklas 59     Get the path to the temporary working directory.
5431 16 May 19 nicklas 60   */
5431 16 May 19 nicklas 61   public File getWorkDir()
5431 16 May 19 nicklas 62   {
5431 16 May 19 nicklas 63     return state.workDir;
5431 16 May 19 nicklas 64   }
5431 16 May 19 nicklas 65   
5431 16 May 19 nicklas 66   /**
5431 16 May 19 nicklas 67     Remove the temporary directory including all files
5431 16 May 19 nicklas 68     and subdirectories in it.
5431 16 May 19 nicklas 69   */
5431 16 May 19 nicklas 70   @Override
5431 16 May 19 nicklas 71   public void close()
5431 16 May 19 nicklas 72   {
5431 16 May 19 nicklas 73     cleanable.clean();
5431 16 May 19 nicklas 74   }
5431 16 May 19 nicklas 75
5431 16 May 19 nicklas 76   /**
5431 16 May 19 nicklas 77     Inner class for performing the actual deletion of the
5431 16 May 19 nicklas 78     working directory.
5431 16 May 19 nicklas 79   */
5431 16 May 19 nicklas 80   static class State
5431 16 May 19 nicklas 81     implements Runnable
5431 16 May 19 nicklas 82   {    
5445 23 May 19 nicklas 83     File workDir;
5431 16 May 19 nicklas 84     
5431 16 May 19 nicklas 85     State() 
5431 16 May 19 nicklas 86     {}
5431 16 May 19 nicklas 87     
5431 16 May 19 nicklas 88     @Override
5431 16 May 19 nicklas 89     public void run() 
5431 16 May 19 nicklas 90     {
5431 16 May 19 nicklas 91       if (workDir != null)
5431 16 May 19 nicklas 92       {
5431 16 May 19 nicklas 93         FileUtil.deleteTempDirectory(workDir);
5431 16 May 19 nicklas 94         workDir = null;
5431 16 May 19 nicklas 95       }
5431 16 May 19 nicklas 96     }
5431 16 May 19 nicklas 97   }
5431 16 May 19 nicklas 98
5431 16 May 19 nicklas 99 }