7b5d2c7d9f9f8a8fd119d94664614929aa752d58
[mir.git] / source / mir / changetracker / ChangeTracker.java
1 /*
2  * Copyright (C) 2001-2006 The Mir-coders group
3  *
4  * This file is part of Mir.
5  *
6  * Mir is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * Mir is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with Mir; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  * In addition, as a special exception, The Mir-coders gives permission to link
21  * the code of this program with  any library licensed under the Apache Software License,
22  * and distribute linked combinations including the two.  You must obey the
23  * GNU General Public License in all respects for all of the code used other than
24  * the above mentioned libraries.  If you modify this file, you may extend this
25  * exception to your version of the file, but you are not obligated to do so.
26  * If you do not wish to do so, delete this exception statement from your version.
27  */
28
29 package mir.changetracker;
30
31 import java.util.ArrayList;
32 import java.util.Iterator;
33 import java.util.List;
34 import java.util.Arrays;
35
36 /**
37  * Change tracker, tracks changes to a path based repository.
38  * All methods are thread-safe
39  */
40
41 public class ChangeTracker {
42   private List changes;
43
44   public ChangeTracker() {
45     changes = new ArrayList();
46   }
47
48   /**
49    * Adds a single change
50    */
51   public void addChange(String aPath) {
52     synchronized (changes) {
53       changes.add(aPath);
54     }
55   }
56
57   /**
58    * Adds an array of changes
59    */
60   public void addChanges(String[] aPaths) {
61     addChanges(Arrays.asList(aPaths));
62   }
63
64   /**
65    * Adds a <code>List</code> of changes
66    */
67   public void addChanges(List aChanges) {
68     synchronized (changes) {
69       changes.addAll(aChanges);
70     }
71   }
72
73   /**
74    * Returns changes within a base path, and removes them from the
75    *     tracker.
76    */
77   public List flushChanges(String aBasePath) {
78     return flushChanges(aBasePath, new String[0]);
79   }
80
81   /**
82    * Returns changes within a base path, and removes them from the
83    *     tracker.
84    */
85   public List flushChanges(String aBasePath, String[] anExcludedPaths) {
86     synchronized (changes) {
87       List result = getChanges(aBasePath, anExcludedPaths);
88
89       clearChanges(result);
90
91       return result;
92     }
93   }
94
95   /**
96    * Removes changes from the tracker
97    */
98   public void clearChanges(List aChanges) {
99     synchronized (changes) {
100       changes.removeAll(aChanges);
101     }
102   }
103
104   /**
105    * Returns all changes within a base path
106    */
107   public List getChanges(String aBasePath) {
108     synchronized (changes) {
109       List result = new ArrayList();
110
111       Iterator i = changes.iterator();
112       while (i.hasNext()) {
113         String change = (String) i.next();
114         if (change.startsWith(aBasePath))
115           result.add(change);
116       }
117
118       return result;
119     }
120   }
121
122   /**
123    * gets all changes within a base path, but excluding some other paths
124    */
125   public List getChanges(String aBasePath, String[] anExcludingPaths) {
126     synchronized (changes) {
127       List result = getChanges(aBasePath);
128
129       for (int i=0; i<anExcludingPaths.length && result.size()>0; i++) {
130         List remove = new ArrayList();
131         Iterator j = result.iterator();
132         while (j.hasNext()) {
133           String item = (String) j.next();
134           if (item.startsWith(anExcludingPaths[i])) {
135             remove.add(item);
136           }
137         }
138         result.removeAll(remove);
139       }
140
141       return result;
142     }
143   }
144 }