/* * This file or a portion of this file is licensed under the terms of * the Globus Toolkit Public License, found in file GTPL, or at * http://www.globus.org/toolkit/download/license.html. This notice must * appear in redistributions of this file, with or without modification. * * Redistributions of this Software, with or without modification, must * reproduce the GTPL in: (1) the Software, or (2) the Documentation or * some other similar material which is provided with the Software (if * any). * * Copyright 1999-2004 University of Chicago and The University of * Southern California. All rights reserved. */ package org.griphyn.vdl.util; import org.griphyn.vdl.util.Logging; import java.util.*; import java.io.*; /** * This class is a helper for the <code>LockHelper</code>. It maintains * the set of lock filenames in status locked. These files need to be * removed on exit. Thus, this class is implemented as a Singleton. * * @author Jens-S. Vöckler * @author Yong Zhao * @version $Revision $ * * @see LockHelper */ public class LockFileSet extends Thread { /** * This is the Singleton instance variable. */ private static LockFileSet m_instance; /** * The set of files that need to be erased on exit. */ private HashSet m_fileSet; /** * The c'tor is protected in order to enforce the Singleton interface. */ protected LockFileSet() { m_fileSet = new HashSet(); Runtime.getRuntime().addShutdownHook( this ); } /** * This is the only access to any LockFileSet object. It is a kind of * factory that produces just one instance for all. * * @return the one and only instance of a LockFileSet. Always. */ public static synchronized LockFileSet instance() { if ( m_instance == null ) m_instance = new LockFileSet(); return m_instance; } /** * This method should not be called directly. It will be invoked on exit * by the exit hook handler. */ public void run() { synchronized ( this.m_fileSet ) { for ( Iterator i=this.m_fileSet.iterator(); i.hasNext(); ) { ((File) i.next()).delete(); } this.m_fileSet = null; } } /** * Adds a file name to the set of lock filenames that need to be removed * on exit. * @param f is a File instance nameing the lock filename. */ public void add( File f ) { // Logging.instance().log( "lock", 2, "LFS add " + f.getPath() ); synchronized ( this.m_fileSet ) { this.m_fileSet.add(f); } } /** * Removes a filename from the set of lock filenames that get removed * on exit. * @param f is a File instance of a filename to remove from the list * of removable files (are you confused yet). */ public void remove( File f ) { // Logging.instance().log( "lock", 2, "LFS del " + f.getPath() ); synchronized ( this.m_fileSet ) { this.m_fileSet.remove(f); } } }