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                  // Ignore the pattern
57              }
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