Skip to main content
summaryrefslogtreecommitdiffstats
blob: e92f063c94c887e1d5809032b51c1ba08d39793b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/*******************************************************************************
 * Copyright (c) 2003, 2005 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.j2ee.commonarchivecore.internal.util;

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
 * 
 * TODO To change the template for this generated type comment go to Window - Preferences - Java -
 * Code Style - Code Templates
 */
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);
				}
			}
		}
	}


}

Back to the top