/******************************************************************************* * Copyright (c) 2003, 2007 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.jst.jee.archive.internal; import java.io.File; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; /** * @author jsholl */ public class DeleteOnExitUtility { private static Set tempFilesToDelete; private static boolean initialized = false; private static int cleanupCount = 0; private static final int CLEANUP_THRESHOLD = 10000; public static void markForDeletion(File file) { if (!initialized) { initialized = true; try { Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { public void run() { if (tempFilesToDelete != null) { synchronized (tempFilesToDelete) { Iterator iterator = tempFilesToDelete.iterator(); File file = null; while (iterator.hasNext()) { try { file = (File) iterator.next(); if (file.exists()) { file.delete(); } } catch (SecurityException e) { } } } } } })); tempFilesToDelete = new HashSet(); } catch (SecurityException e) { } } if (tempFilesToDelete != null) { synchronized (tempFilesToDelete) { cleanupCount++; tempFilesToDelete.add(file); } if (cleanupCount > CLEANUP_THRESHOLD) { runCleanup(); } } } public static void fileHasBeenDeleted(File file) { if (tempFilesToDelete != null) { synchronized (tempFilesToDelete) { cleanupCount++; try { if (!file.exists()) { tempFilesToDelete.remove(file); } } catch (SecurityException e) { } } if (cleanupCount > CLEANUP_THRESHOLD) { runCleanup(); } } } public static void runCleanup() { if (tempFilesToDelete != null) { synchronized (tempFilesToDelete) { cleanupCount = 0; List filesToRemove = null; Iterator iterator = tempFilesToDelete.iterator(); File file = null; while (iterator.hasNext()) { try { file = (File) iterator.next(); if (!file.exists()) { if (filesToRemove == null) { filesToRemove = new ArrayList(); } filesToRemove.add(file); } } catch (SecurityException e) { } } if (filesToRemove != null) { tempFilesToDelete.removeAll(filesToRemove); } } } } }