1818 */
1919
2020/*
21- * Copyright (c) 2017, Chris Fraire <[email protected] >. 21+ * Copyright (c) 2017-2018 , Chris Fraire <[email protected] >. 2222 */
2323
2424package org .opensolaris .opengrok .index ;
@@ -277,16 +277,22 @@ private void doRename(PendingFileRenamingExec ren) throws IOException {
277277 }
278278 }
279279
280+ /**
281+ * For the unique set of parent directories among
282+ * {@link PendingFileDeletionExec#absoluteParent}, traverse in descending
283+ * order of path-length, and attempt to clean any empty directories.
284+ */
280285 private void tryDeleteParents (List <PendingFileDeletionExec > dels ) {
281286 Set <File > parents = new TreeSet <>(DESC_PATHLEN_COMPARATOR );
282287 dels .forEach ((del ) -> { parents .add (del .absoluteParent ); });
283288
289+ SkeletonDirs skels = new SkeletonDirs ();
284290 for (File dir : parents ) {
285- Set <File > children = findFilelessChildren (dir );
286- children .forEach ((childDir ) -> {
291+ skels .reset ();
292+ findFilelessChildren (skels , dir );
293+ skels .childDirs .forEach ((childDir ) -> {
287294 tryDeleteDirectory (childDir );
288295 });
289-
290296 tryDeleteDirectory (dir );
291297 }
292298 }
@@ -299,25 +305,10 @@ private void tryDeleteDirectory(File dir) {
299305 }
300306
301307 /**
302- * Determines a DESC ordered set of eligible file-less child directories
303- * for cleaning up.
304- */
305- private Set <File > findFilelessChildren (File directory ) {
306- SkeletonDirs ret = new SkeletonDirs ();
307- findFilelessChildrenDeep (ret , directory );
308-
309- Set <File > parents = new TreeSet <>(DESC_PATHLEN_COMPARATOR );
310- // N.b. the `ineligible' field is not relevant here but only during
311- // recursion. `childDirs' contains eligible directories.
312- parents .addAll (ret .childDirs );
313- return parents ;
314- }
315-
316- /**
317- * Recursive method used by {@link #findFilelessChildren(java.io.File)}.
308+ * Recursively determines eligible, file-less child directories for cleaning
309+ * up, and writes them to {@code skels}.
318310 */
319- private void findFilelessChildrenDeep (SkeletonDirs ret , File directory ) {
320-
311+ private void findFilelessChildren (SkeletonDirs skels , File directory ) {
321312 if (!directory .exists ()) return ;
322313 String dirPath = directory .getAbsolutePath ();
323314 boolean topLevelIneligible = false ;
@@ -337,9 +328,9 @@ private void findFilelessChildrenDeep(SkeletonDirs ret, File directory) {
337328 f .getAbsolutePath ());
338329 }
339330 } else {
340- findFilelessChildrenDeep ( ret , f );
341- if (!ret .ineligible ) {
342- ret .childDirs .add (f );
331+ findFilelessChildren ( skels , f );
332+ if (!skels .ineligible ) {
333+ skels .childDirs .add (f );
343334 } else {
344335 topLevelIneligible = true ;
345336 if (LOGGER .isLoggable (Level .FINEST )) {
@@ -351,7 +342,7 @@ private void findFilelessChildrenDeep(SkeletonDirs ret, File directory) {
351342
352343 // Reset this flag so that other potential, eligible
353344 // children are evaluated.
354- ret .ineligible = false ;
345+ skels .ineligible = false ;
355346 }
356347 }
357348 } catch (IOException ex ) {
@@ -362,7 +353,7 @@ private void findFilelessChildrenDeep(SkeletonDirs ret, File directory) {
362353 }
363354 }
364355
365- ret .ineligible = topLevelIneligible ;
356+ skels .ineligible = topLevelIneligible ;
366357 }
367358
368359 /**
@@ -404,6 +395,12 @@ public PendingFileRenamingExec(String source, String target) {
404395 */
405396 private class SkeletonDirs {
406397 public boolean ineligible ; // a flag used during recursion
407- public List <File > childDirs = new ArrayList <>();
398+ public final Set <File > childDirs = new TreeSet <>(
399+ DESC_PATHLEN_COMPARATOR );
400+
401+ public void reset () {
402+ ineligible = false ;
403+ childDirs .clear ();
404+ }
408405 }
409406}
0 commit comments