1 package cz.cuni.amis.utils;
2
3 import java.io.File;
4 import java.io.FileOutputStream;
5 import java.util.regex.Pattern;
6
7 public class FileMarker {
8
9 public static final String FILE_SEPARATOR = System.getProperty("file.separator");
10
11 private String prefix;
12 private File directory;
13
14 public FileMarker(String prefix) {
15 this(prefix, new File("."));
16 }
17
18 public FileMarker(String prefix, File directory) {
19 this.prefix = StringIdifier.idify(prefix);
20 this.directory = directory;
21 if (this.directory.exists()) {
22 if (!this.directory.isDirectory()) {
23 throw new RuntimeException("'directory' exists but it is not directory: " + directory.getAbsolutePath());
24 }
25 }
26 }
27
28 public FileMarker(String prefix, String pathToDirectory) {
29 this(prefix, new File(pathToDirectory));
30 }
31
32 public Pattern getMarkFileNamePattern() {
33 return Pattern.compile("^" + prefix + "\\-.*\\.mark$");
34 }
35
36 public File getFileMark(String mark) {
37 return new File(directory, prefix + "-" + StringIdifier.idify(mark) + ".mark");
38 }
39
40 public File getFileMark(String mark, int index) {
41 return new File(directory, prefix + "-" + StringIdifier.idify(mark) + "." + index + ".mark");
42 }
43
44 protected boolean isExists(File markFile) {
45 return markFile.exists() && markFile.isFile();
46 }
47
48 protected void touch(File markFile) {
49 if (!directory.exists()) {
50 directory.mkdirs();
51 }
52 if (markFile.exists()) {
53 if (markFile.isFile()) {
54 if (!markFile.delete()) {
55 throw new RuntimeException("Failed to touch the mark, could not delete old mark: " + markFile.getAbsolutePath());
56 }
57 } else {
58 throw new RuntimeException("Cannot touch the mark, because it already exists and it is not file: " + markFile.getAbsolutePath());
59 }
60 }
61
62 try {
63 new FileOutputStream(markFile).close();
64 } catch (Exception e) {
65 throw new RuntimeException("Failed to touch the mark: " + markFile.getAbsolutePath(), e);
66 }
67 }
68
69 public void remove(File markFile) {
70 if (markFile.exists() && markFile.isFile()) {
71 if (!markFile.delete()) {
72 throw new RuntimeException("Failed to delete the mark: " + markFile.getAbsolutePath());
73 }
74 }
75 }
76
77 public boolean isExists(String mark) {
78 File markFile = getFileMark(mark);
79 return isExists(markFile);
80 }
81
82 public void touch(String mark) {
83 File markFile = getFileMark(mark);
84 touch(markFile);
85 }
86
87 public void remove(String mark) {
88 File markFile = getFileMark(mark);
89 remove(markFile);
90 }
91
92 public boolean isExists(String mark, int index) {
93 File markFile = getFileMark(mark, index);
94 return isExists(markFile);
95 }
96
97 public void touch(String mark, int index) {
98 File markFile = getFileMark(mark, index);
99 touch(markFile);
100 }
101
102 public void remove(String mark, int index) {
103 File markFile = getFileMark(mark, index);
104 remove(markFile);
105 }
106
107 public void removeAllMarks() {
108 if (!directory.exists()) return;
109 Pattern pattern = getMarkFileNamePattern();
110 for (File file : directory.listFiles()) {
111 String fileName = file.getAbsolutePath().substring(file.getAbsolutePath().lastIndexOf(FILE_SEPARATOR)+1);
112 if (pattern.matcher(fileName).matches()) {
113 if (!file.delete()) {
114 throw new RuntimeException("Failed to delete mark: " + file.getAbsolutePath());
115 }
116 }
117 }
118 }
119
120 }