001: /*
002: * Copyright (C) 2001, 2002 Robert MacGrogan
003: *
004: * This library is free software; you can redistribute it and/or
005: * modify it under the terms of the GNU Lesser General Public
006: * License as published by the Free Software Foundation; either
007: * version 2.1 of the License, or (at your option) any later version.
008: *
009: * This library is distributed in the hope that it will be useful,
010: * but WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012: * Lesser General Public License for more details.
013: *
014: * You should have received a copy of the GNU Lesser General Public
015: * License along with this library; if not, write to the Free Software
016: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: *
018: *
019: * $Archive: SourceJammer$
020: * $FileName: CleanupScheduler.java$
021: * $FileID: 4478$
022: *
023: * Last change:
024: * $AuthorName: Rob MacGrogan$
025: * $Date: 4/23/03 5:18 PM$
026: * $Comment: Replaced GPL header with LGPL header.$
027: */
028:
029: package org.sourcejammer.server;
030:
031: import org.sourcejammer.util.TempDirectoryManager;
032: import org.sourcejammer.server.security.SessionManager;
033: import org.sourcejammer.server.security.NoSuchSessionException;
034:
035: /**
036: * Title: $FileName: CleanupScheduler.java$
037: * @author $AuthorName: Rob MacGrogan$
038: * @version $VerNum: 2$
039: * $KeyWordsOff: $<br><br>
040: *
041: *
042: * Runs at set intervals to clean unneeded files from disk and kill old sessions.
043: */
044: public class CleanupScheduler {
045:
046: public static final long DEFAULT_SLEEP_INTERVAL = 60 * 60 * 1000;//1 hour
047: public static final long MAX_TEMP_FILE_AGE = 24 * 60 * 60 * 1000; //1 day
048: public static final long MAX_INACTIVE_SESSION_AGE = 2 * 60 * 60 * 1000;//2 hours
049:
050: private CleanupThread thread = null;
051: private long sleepInterval = DEFAULT_SLEEP_INTERVAL;
052: public static CleanupScheduler instance = null;
053:
054: private CleanupScheduler(long sleepInterval) {
055: this .sleepInterval = sleepInterval;
056: startThread();
057: }
058:
059: public static void initializeInstance() {
060: initializeInstance(DEFAULT_SLEEP_INTERVAL);
061: }
062:
063: public synchronized static void initializeInstance(
064: long sleepInterval) {
065: if (instance == null) {
066: instance = new CleanupScheduler(sleepInterval);
067: }
068: }
069:
070: public static CleanupScheduler getInstance() {
071: return instance;
072: }
073:
074: //Just provided for semantic reasons.
075: public void restartThreadIfStopped() {
076: startThread();
077: }
078:
079: public void startThread() {
080: if (thread == null || !thread.isRunning()) {
081: start();
082: }
083: }
084:
085: private synchronized void start() {
086: if (thread == null || !thread.isRunning()) {
087: thread = new CleanupThread(sleepInterval);
088: thread.start();
089: }
090: }
091:
092: protected class CleanupThread extends Thread {
093:
094: long sleepInterval = -1;
095: boolean mbRunning = false;
096:
097: public CleanupThread(long sleepInterval) {
098: this .sleepInterval = sleepInterval;
099: this .setDaemon(true);
100: }
101:
102: public boolean isRunning() {
103: return mbRunning;
104: }
105:
106: public void run() {
107: mbRunning = true;
108: try {
109: while (true) {
110: //Remove old temp files.
111: System.out.println(">> Running cleanup.");
112: long lDate = new java.util.Date().getTime();
113: java.util.Date removeDate = new java.util.Date(
114: lDate - MAX_TEMP_FILE_AGE);
115: System.out
116: .println(">> Removing temp files older than: "
117: + removeDate);
118: TempDirectoryManager.removeTempFiles(removeDate);
119:
120: //Remove expired sessions.
121: try {
122: System.out
123: .println(">> Removing expired sessions older than: "
124: + (lDate - MAX_INACTIVE_SESSION_AGE));
125: SessionManager.getInstance().removeOldSessions(
126: lDate - MAX_INACTIVE_SESSION_AGE);
127: } catch (NoSuchSessionException ex) {
128: System.out
129: .println("\r\nException in removing old sessions.");
130: ex.printStackTrace();
131: }
132:
133: //Go to sleep.
134: try {
135: sleep(sleepInterval);
136: } catch (InterruptedException ex) {
137: //just wake up
138: }
139: }//end while
140: } catch (Exception ex) {
141: System.out.println("\r\nException in CleanupThread.");
142: ex.printStackTrace();
143: //How can we re-start the thread in case this happens?
144: } finally {
145: mbRunning = false;
146: }
147: }//end run()
148:
149: }//end CleanupThread
150:
151: /**
152: * @see java.lang.Object#finalize()
153: */
154: protected void finalize() throws Throwable {
155: try {
156: thread.interrupt();
157: thread = null;
158: } finally {
159: super.finalize();
160: }
161: }
162:
163: }
|