1 package com.stateofflow.eclipse.metrics.properties.exclusions;
2
3 import java.io.BufferedReader;
4 import java.io.BufferedWriter;
5 import java.io.File;
6 import java.io.FileReader;
7 import java.io.FileWriter;
8 import java.io.IOException;
9 import java.io.PrintWriter;
10 import java.util.Collection;
11 import java.util.HashSet;
12
13 import org.apache.oro.text.regex.MalformedPatternException;
14 import org.eclipse.core.resources.IFile;
15 import org.eclipse.core.resources.IProject;
16 import org.eclipse.core.runtime.CoreException;
17 import org.eclipse.core.runtime.IStatus;
18 import org.eclipse.core.runtime.Path;
19 import org.eclipse.core.runtime.Status;
20
21 import com.stateofflow.eclipse.metrics.MetricsPlugin;
22
23 final class Persister {
24 private static final String EXCLUDED_RESOURCES_FILENAME = "excludes";
25 private static final String EXCLUDED_FILE_PREFIX = "<file>";
26 private static final String EXCLUDED_REGEX_PREFIX = "<regex>";
27
28 private void addPath(final String stringPath, final ExcludedResources resources) {
29 final IFile file = resources.getProject().getFile(new Path(stringPath));
30 if (file.exists()) {
31 resources.addFile(file);
32 }
33 }
34
35 private File getFile(final IProject project) {
36 return project.getWorkingLocation(MetricsPlugin.PLUGIN_ID).append(EXCLUDED_RESOURCES_FILENAME).toFile();
37 }
38
39 private Collection<String> getProjectRelativePaths(final Collection<IFile> excludedFiles) {
40 final Collection<String> collection = new HashSet<String>(excludedFiles.size());
41
42 for (final IFile file : excludedFiles) {
43 collection.add(file.getProjectRelativePath().toString());
44 }
45
46 return collection;
47 }
48
49 private void initializeExcludedResourceFromFileLine(final String line, final ExcludedResources resources) {
50 if (line.startsWith(Persister.EXCLUDED_FILE_PREFIX)) {
51 addPath(line.substring(Persister.EXCLUDED_FILE_PREFIX.length()), resources);
52 } else if (line.startsWith(Persister.EXCLUDED_REGEX_PREFIX)) {
53 try {
54 resources.addRegex(line.substring(Persister.EXCLUDED_REGEX_PREFIX.length()));
55 } catch (final MalformedPatternException mpex) {
56 }
58 } else {
59 addPath(line, resources);
60 }
61 }
62
63 private void initializeExcludedResourcesFromFile(final File file, final ExcludedResources resources) throws IOException {
64 final BufferedReader reader = new BufferedReader(new FileReader(file));
65 try {
66 String line;
67 while ((line = reader.readLine()) != null) {
68 initializeExcludedResourceFromFileLine(line.trim(), resources);
69 }
70 } finally {
71 reader.close();
72 }
73 }
74
75 public void read(final IProject project, final ExcludedResources resources) throws IOException {
76 final File file = getFile(project);
77 if (!file.exists()) {
78 return;
79 }
80
81 initializeExcludedResourcesFromFile(file, resources);
82 }
83
84 public void write(final IProject project, final Collection<IFile> excludedFiles, final Collection<String> regexes) throws CoreException {
85 try {
86 writeProtected(project, excludedFiles, regexes);
87 } catch (final IOException e) {
88 throw new CoreException(new Status(IStatus.WARNING, MetricsPlugin.PLUGIN_ID, IStatus.OK, "Failed to save the excluded resources list", e));
89 }
90 }
91
92 private void writePrefixedItems(final PrintWriter writer, final String prefix, final Collection<String> items) {
93 for (final String item : items) {
94 writer.println(prefix + item);
95 }
96 }
97
98 private void writeProtected(final IProject project, final Collection<IFile> excludedFiles, final Collection<String> regexes) throws IOException {
99 final PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter(getFile(project))));
100 writePrefixedItems(writer, Persister.EXCLUDED_FILE_PREFIX, getProjectRelativePaths(excludedFiles));
101 writePrefixedItems(writer, Persister.EXCLUDED_REGEX_PREFIX, regexes);
102 writer.close();
103 }
104 }
105