Lines 73-79
Link Here
|
73 |
final class FolderChildren extends Children.Keys<FolderChildrenPair> |
73 |
final class FolderChildren extends Children.Keys<FolderChildrenPair> |
74 |
implements PropertyChangeListener, ChangeListener, FileChangeListener { |
74 |
implements PropertyChangeListener, ChangeListener, FileChangeListener { |
75 |
/** the folder */ |
75 |
/** the folder */ |
76 |
private FolderList folder; |
76 |
private final FolderList folder; |
77 |
/** filter of objects */ |
77 |
/** filter of objects */ |
78 |
private final DataFilter filter; |
78 |
private final DataFilter filter; |
79 |
/** listener on changes in nodes */ |
79 |
/** listener on changes in nodes */ |
Lines 169-181
Link Here
|
169 |
} |
169 |
} |
170 |
|
170 |
|
171 |
private enum RefreshMode {SHALLOW, SHALLOW_IMMEDIATE, DEEP, DEEP_LATER, CLEAR} |
171 |
private enum RefreshMode {SHALLOW, SHALLOW_IMMEDIATE, DEEP, DEEP_LATER, CLEAR} |
172 |
private void refreshChildren(RefreshMode operation) { |
172 |
private final long[] lastRefreshes |
|
|
173 |
= new long[RefreshMode.values().length]; |
174 |
private void refreshChildren(final RefreshMode operation) { |
173 |
class R implements Runnable { |
175 |
class R implements Runnable { |
174 |
List<FolderChildrenPair> positioned = null; |
176 |
List<FolderChildrenPair> positioned = null; |
175 |
RefreshMode op; |
177 |
RefreshMode op; |
176 |
Task prevTask = null; |
178 |
Task prevTask = null; |
|
|
179 |
long creationTime; |
177 |
@Override |
180 |
@Override |
178 |
public void run() { |
181 |
public void run() { |
|
|
182 |
if (wasCreatedBeforeLastRefresh()) { |
183 |
return; |
184 |
} |
179 |
if (prevTask != null) { |
185 |
if (prevTask != null) { |
180 |
// We need to ensure that refresh tasks for one |
186 |
// We need to ensure that refresh tasks for one |
181 |
// FolderChildren do not run in parallel. And because the |
187 |
// FolderChildren do not run in parallel. And because the |
Lines 208-213
Link Here
|
208 |
} finally { |
214 |
} finally { |
209 |
err.log(Level.FINE, "refreshChildren {0}, done", op); |
215 |
err.log(Level.FINE, "refreshChildren {0}, done", op); |
210 |
} |
216 |
} |
|
|
217 |
storeLastRefreshTime(); |
211 |
} |
218 |
} |
212 |
|
219 |
|
213 |
private List<FolderChildrenPair> getPositionedFolderChildrenPairs() { |
220 |
private List<FolderChildrenPair> getPositionedFolderChildrenPairs() { |
Lines 228-233
Link Here
|
228 |
} |
235 |
} |
229 |
return list; |
236 |
return list; |
230 |
} |
237 |
} |
|
|
238 |
|
239 |
/** |
240 |
* Check if this runnable was created before the last refresh for |
241 |
* the current operation, and thus it is useless. |
242 |
* |
243 |
* @return True if this runnable is too old. |
244 |
*/ |
245 |
private boolean wasCreatedBeforeLastRefresh() { |
246 |
return creationTime < lastRefreshes[operation.ordinal()]; |
247 |
} |
248 |
|
249 |
/** |
250 |
* Store last refresh time for the current operation. |
251 |
*/ |
252 |
private void storeLastRefreshTime() { |
253 |
lastRefreshes[operation.ordinal()] = System.currentTimeMillis(); |
254 |
} |
231 |
} |
255 |
} |
232 |
R run = new R(); |
256 |
R run = new R(); |
233 |
if (operation == RefreshMode.SHALLOW_IMMEDIATE) { |
257 |
if (operation == RefreshMode.SHALLOW_IMMEDIATE) { |
Lines 238-244
Link Here
|
238 |
run.op = operation; |
262 |
run.op = operation; |
239 |
synchronized (this) { |
263 |
synchronized (this) { |
240 |
run.prevTask = refTask; |
264 |
run.prevTask = refTask; |
241 |
refTask = DataNodeUtils.reqProcessor(folder.getPrimaryFile()).post(run); |
265 |
run.creationTime = System.currentTimeMillis(); |
|
|
266 |
refTask = DataNodeUtils.reqProcessor(folder.getPrimaryFile()).post(run, 50); |
242 |
} |
267 |
} |
243 |
} |
268 |
} |
244 |
} |
269 |
} |