Lines 41-48
Link Here
|
41 |
|
41 |
|
42 |
import java.io.File; |
42 |
import java.io.File; |
43 |
import java.util.Collection; |
43 |
import java.util.Collection; |
44 |
import java.util.Enumeration; |
|
|
45 |
import java.util.HashSet; |
44 |
import java.util.HashSet; |
|
|
45 |
import java.util.LinkedList; |
46 |
import java.util.List; |
46 |
import java.util.Set; |
47 |
import java.util.Set; |
47 |
import java.util.concurrent.Callable; |
48 |
import java.util.concurrent.Callable; |
48 |
import java.util.concurrent.CopyOnWriteArraySet; |
49 |
import java.util.concurrent.CopyOnWriteArraySet; |
Lines 61-67
Link Here
|
61 |
final class FileObjectKeeper implements FileChangeListener { |
62 |
final class FileObjectKeeper implements FileChangeListener { |
62 |
private static final Logger LOG = Logger.getLogger(FileObjectKeeper.class.getName()); |
63 |
private static final Logger LOG = Logger.getLogger(FileObjectKeeper.class.getName()); |
63 |
|
64 |
|
64 |
private Set<FileObject> kept; |
65 |
private Set<FolderObj> kept; |
65 |
private Collection<FileChangeListener> listeners; |
66 |
private Collection<FileChangeListener> listeners; |
66 |
private final FolderObj root; |
67 |
private final FolderObj root; |
67 |
private long timeStamp; |
68 |
private long timeStamp; |
Lines 94-140
Link Here
|
94 |
} |
95 |
} |
95 |
} |
96 |
} |
96 |
|
97 |
|
97 |
public void init(long previous, FileObjectFactory factory, boolean expected) { |
98 |
public List<File> init(long previous, FileObjectFactory factory, boolean expected) { |
98 |
File file = root.getFileName().getFile(); |
99 |
File file = root.getFileName().getFile(); |
99 |
File[] arr = file.listFiles(); |
100 |
LinkedList<File> arr = new LinkedList<File>(); |
100 |
long ts = 0; |
101 |
long ts = root.getProvidedExtensions().refreshRecursively(file, previous, arr); |
101 |
if (arr != null) { |
102 |
for (File f : arr) { |
102 |
for (File f : arr) { |
103 |
if (f.isDirectory()) { |
103 |
if (f.isDirectory()) { |
104 |
continue; |
104 |
continue; |
105 |
} |
105 |
} |
106 |
long lm = f.lastModified(); |
106 |
long lm = f.lastModified(); |
107 |
LOG.log(Level.FINE, " check {0} for {1}", new Object[] { lm, f }); |
107 |
LOG.log(Level.FINE, " check {0} for {1}", new Object[] { lm, f }); |
108 |
if (lm > ts) { |
108 |
if (lm > ts) { |
109 |
ts = lm; |
109 |
ts = lm; |
110 |
} |
110 |
} |
111 |
if (lm > previous && factory != null) { |
111 |
if (lm > previous && factory != null) { |
112 |
final BaseFileObj prevFO = factory.getCachedOnly(f); |
112 |
final BaseFileObj prevFO = factory.getCachedOnly(f); |
113 |
if (prevFO == null) { |
113 |
if (prevFO == null) { |
114 |
BaseFileObj who = factory.getValidFileObject(f, Caller.Others); |
114 |
BaseFileObj who = factory.getValidFileObject(f, Caller.Others); |
115 |
if (who != null) { |
115 |
if (who != null) { |
116 |
LOG.log(Level.FINE, "External change detected {0}", who); //NOI18N |
116 |
LOG.log(Level.FINE, "External change detected {0}", who); //NOI18N |
117 |
who.fireFileChangedEvent(expected); |
117 |
who.fireFileChangedEvent(expected); |
|
|
118 |
} else { |
119 |
LOG.log(Level.FINE, "Cannot get valid FileObject. File probably removed: {0}", f); //NOI18N |
120 |
} |
121 |
} else { |
118 |
} else { |
122 |
LOG.log(Level.FINE, "Do classical refresh for {0}", prevFO); //NOI18N |
119 |
LOG.log(Level.FINE, "Cannot get valid FileObject. File probably removed: {0}", f); //NOI18N |
123 |
prevFO.refresh(expected, true); |
|
|
124 |
} |
120 |
} |
|
|
121 |
} else { |
122 |
LOG.log(Level.FINE, "Do classical refresh for {0}", prevFO); //NOI18N |
123 |
prevFO.refresh(expected, true); |
125 |
} |
124 |
} |
126 |
} |
125 |
} |
127 |
} |
126 |
} |
128 |
timeStamp = ts; |
127 |
timeStamp = ts; |
129 |
LOG.log(Level.FINE, "Testing {0}, time {1}", new Object[] { file, timeStamp }); |
128 |
LOG.log(Level.FINE, "Testing {0}, time {1}", new Object[] { file, timeStamp }); |
|
|
129 |
return arr; |
130 |
} |
130 |
} |
131 |
|
131 |
|
132 |
private void listenTo(FileObject fo, boolean add) { |
132 |
private void listenTo(FolderObj fo, boolean add, Collection<? super File> children) { |
133 |
if (add) { |
133 |
if (add) { |
134 |
fo.addFileChangeListener(this); |
134 |
fo.addFileChangeListener(this); |
135 |
if (fo instanceof FolderObj) { |
135 |
if (fo instanceof FolderObj) { |
136 |
FolderObj folder = (FolderObj)fo; |
136 |
FolderObj folder = (FolderObj)fo; |
137 |
folder.getKeeper(); |
137 |
folder.getKeeper(children); |
|
|
138 |
folder.getChildren(); |
138 |
kept.add(folder); |
139 |
kept.add(folder); |
139 |
} |
140 |
} |
140 |
LOG.log(Level.FINER, "Listening to {0}", fo); |
141 |
LOG.log(Level.FINER, "Listening to {0}", fo); |
Lines 147-157
Link Here
|
147 |
private void listenToAll(Callable<?> stop) { |
148 |
private void listenToAll(Callable<?> stop) { |
148 |
assert Thread.holdsLock(this); |
149 |
assert Thread.holdsLock(this); |
149 |
assert kept == null; |
150 |
assert kept == null; |
150 |
kept = new HashSet<FileObject>(); |
151 |
kept = new HashSet<FolderObj>(); |
151 |
listenTo(root, true); |
152 |
LinkedList<File> it = new LinkedList<File>(); |
152 |
Enumeration<? extends FileObject> en = root.getChildren(true); |
153 |
listenTo(root, true, it); |
153 |
while (en.hasMoreElements()) { |
154 |
FileObjectFactory factory = null; |
154 |
FileObject fo = en.nextElement(); |
155 |
for (;;) { |
|
|
156 |
File f = it.poll(); |
157 |
if (f == null) { |
158 |
break; |
159 |
} |
160 |
if (factory == null) { |
161 |
factory = FileObjectFactory.getInstance(f); |
162 |
} |
163 |
FileObject fo = factory.getValidFileObject(f, Caller.Others); |
155 |
if (fo instanceof FolderObj) { |
164 |
if (fo instanceof FolderObj) { |
156 |
FolderObj obj = (FolderObj) fo; |
165 |
FolderObj obj = (FolderObj) fo; |
157 |
Object shallStop = null; |
166 |
Object shallStop = null; |
Lines 166-172
Link Here
|
166 |
LOG.log(Level.INFO, "addRecursiveListener to {0} interrupted", root); // NOI18N |
175 |
LOG.log(Level.INFO, "addRecursiveListener to {0} interrupted", root); // NOI18N |
167 |
return; |
176 |
return; |
168 |
} |
177 |
} |
169 |
listenTo(obj, true); |
178 |
listenTo(obj, true, it); |
170 |
} |
179 |
} |
171 |
} |
180 |
} |
172 |
} |
181 |
} |
Lines 174-184
Link Here
|
174 |
private void listenNoMore() { |
183 |
private void listenNoMore() { |
175 |
assert Thread.holdsLock(this); |
184 |
assert Thread.holdsLock(this); |
176 |
|
185 |
|
177 |
listenTo(root, false); |
186 |
listenTo(root, false, null); |
178 |
Set<FileObject> k = kept; |
187 |
Set<FolderObj> k = kept; |
179 |
if (k != null) { |
188 |
if (k != null) { |
180 |
for (FileObject fo : k) { |
189 |
for (FolderObj fo : k) { |
181 |
listenTo(fo, false); |
190 |
listenTo(fo, false, null); |
182 |
} |
191 |
} |
183 |
kept = null; |
192 |
kept = null; |
184 |
} |
193 |
} |
Lines 187-201
Link Here
|
187 |
@Override |
196 |
@Override |
188 |
public void fileFolderCreated(FileEvent fe) { |
197 |
public void fileFolderCreated(FileEvent fe) { |
189 |
Collection<FileChangeListener> arr = listeners; |
198 |
Collection<FileChangeListener> arr = listeners; |
190 |
final FileObject f = fe.getFile(); |
199 |
final FileObject folder = fe.getFile(); |
191 |
if (f instanceof FolderObj) { |
200 |
if (folder instanceof FolderObj) { |
|
|
201 |
FolderObj obj = (FolderObj)folder; |
192 |
synchronized (this) { |
202 |
synchronized (this) { |
193 |
listenTo(f, true); |
203 |
LinkedList<File> it = new LinkedList<File>(); |
194 |
Enumeration<? extends FileObject> en = f.getChildren(true); |
204 |
listenTo(obj, true, it); |
195 |
while (en.hasMoreElements()) { |
205 |
FileObjectFactory factory = null; |
196 |
FileObject fo = en.nextElement(); |
206 |
for (;;) { |
|
|
207 |
File f = it.poll(); |
208 |
if (f == null) { |
209 |
break; |
210 |
} |
211 |
if (factory == null) { |
212 |
factory = FileObjectFactory.getInstance(f); |
213 |
} |
214 |
FileObject fo = factory.getValidFileObject(f, Caller.Others); |
197 |
if (fo instanceof FolderObj) { |
215 |
if (fo instanceof FolderObj) { |
198 |
listenTo(fo, true); |
216 |
listenTo((FolderObj)fo, true, it); |
199 |
} |
217 |
} |
200 |
} |
218 |
} |
201 |
} |
219 |
} |
Lines 240-250
Link Here
|
240 |
} |
258 |
} |
241 |
|
259 |
|
242 |
if (f instanceof FolderObj) { |
260 |
if (f instanceof FolderObj) { |
|
|
261 |
FolderObj obj = (FolderObj)f; |
243 |
synchronized (this) { |
262 |
synchronized (this) { |
244 |
if (kept != null) { |
263 |
if (kept != null) { |
245 |
kept.remove(f); |
264 |
kept.remove(obj); |
246 |
} |
265 |
} |
247 |
listenTo(f, false); |
266 |
listenTo(obj, false, null); |
248 |
} |
267 |
} |
249 |
} |
268 |
} |
250 |
if (arr == null) { |
269 |
if (arr == null) { |