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 |
Represents a temporary working directory that is created, used and |
5431 |
16 May 19 |
nicklas |
then removed (including all files and subdirectories). It is |
5431 |
16 May 19 |
nicklas |
recommended that the user of the temporary directory is |
5431 |
16 May 19 |
nicklas |
calling {@link #close()} as soon as possible when it is no longer |
5431 |
16 May 19 |
nicklas |
needed. If the close method is never called the directory will |
5431 |
16 May 19 |
nicklas |
automatically be removed at an undefined later point of time, but |
5431 |
16 May 19 |
nicklas |
not before a ''monitor' object has been garbage collected. |
5431 |
16 May 19 |
nicklas |
18 |
|
5431 |
16 May 19 |
nicklas |
@author nicklas |
5431 |
16 May 19 |
nicklas |
@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 |
Create a temporary working directory that is automatically deleted |
5431 |
16 May 19 |
nicklas |
after the monitor object has been garbage collected, but |
5431 |
16 May 19 |
nicklas |
the recommendation is that {@link #close()} is called as soon |
5431 |
16 May 19 |
nicklas |
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 |
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 |
Remove the temporary directory including all files |
5431 |
16 May 19 |
nicklas |
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 |
Inner class for performing the actual deletion of the |
5431 |
16 May 19 |
nicklas |
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 |
} |