001: /*
002: * This file or a portion of this file is licensed under the terms of
003: * the Globus Toolkit Public License, found in file GTPL, or at
004: * http://www.globus.org/toolkit/download/license.html. This notice must
005: * appear in redistributions of this file, with or without modification.
006: *
007: * Redistributions of this Software, with or without modification, must
008: * reproduce the GTPL in: (1) the Software, or (2) the Documentation or
009: * some other similar material which is provided with the Software (if
010: * any).
011: *
012: * Copyright 1999-2004 University of Chicago and The University of
013: * Southern California. All rights reserved.
014: */
015:
016: package org.griphyn.vdl.util;
017:
018: import org.griphyn.vdl.util.Logging;
019: import java.util.*;
020: import java.io.*;
021:
022: /**
023: * This class is a helper for the <code>LockHelper</code>. It maintains
024: * the set of lock filenames in status locked. These files need to be
025: * removed on exit. Thus, this class is implemented as a Singleton.
026: *
027: * @author Jens-S. Vöckler
028: * @author Yong Zhao
029: * @version $Revision $
030: *
031: * @see LockHelper
032: */
033: public class LockFileSet extends Thread {
034: /**
035: * This is the Singleton instance variable.
036: */
037: private static LockFileSet m_instance;
038:
039: /**
040: * The set of files that need to be erased on exit.
041: */
042: private HashSet m_fileSet;
043:
044: /**
045: * The c'tor is protected in order to enforce the Singleton interface.
046: */
047: protected LockFileSet() {
048: m_fileSet = new HashSet();
049: Runtime.getRuntime().addShutdownHook(this );
050: }
051:
052: /**
053: * This is the only access to any LockFileSet object. It is a kind of
054: * factory that produces just one instance for all.
055: *
056: * @return the one and only instance of a LockFileSet. Always.
057: */
058: public static synchronized LockFileSet instance() {
059: if (m_instance == null)
060: m_instance = new LockFileSet();
061: return m_instance;
062: }
063:
064: /**
065: * This method should not be called directly. It will be invoked on exit
066: * by the exit hook handler.
067: */
068: public void run() {
069: synchronized (this .m_fileSet) {
070: for (Iterator i = this .m_fileSet.iterator(); i.hasNext();) {
071: ((File) i.next()).delete();
072: }
073: this .m_fileSet = null;
074: }
075: }
076:
077: /**
078: * Adds a file name to the set of lock filenames that need to be removed
079: * on exit.
080: * @param f is a File instance nameing the lock filename.
081: */
082: public void add(File f) {
083: // Logging.instance().log( "lock", 2, "LFS add " + f.getPath() );
084: synchronized (this .m_fileSet) {
085: this .m_fileSet.add(f);
086: }
087: }
088:
089: /**
090: * Removes a filename from the set of lock filenames that get removed
091: * on exit.
092: * @param f is a File instance of a filename to remove from the list
093: * of removable files (are you confused yet).
094: */
095: public void remove(File f) {
096: // Logging.instance().log( "lock", 2, "LFS del " + f.getPath() );
097: synchronized (this.m_fileSet) {
098: this.m_fileSet.remove(f);
099: }
100: }
101: }
|