/*
* Copyright (C) 2000 - 2010 TagServlet Ltd
*
* This file is part of Open BlueDragon (OpenBD) CFML Server Engine.
*
* OpenBD is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* Free Software Foundation,version 3.
*
* OpenBD is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenBD. If not, see http://www.gnu.org/licenses/
*
* Additional permission under GNU GPL version 3 section 7
*
* If you modify this Program, or any covered work, by linking or combining
* it with any of the JARS listed in the README.txt (or a modified version of
* (that library), containing parts covered by the terms of that JAR, the
* licensors of this Program grant you additional permission to convey the
* resulting work.
* README.txt @ http://www.openbluedragon.org/license/README.txt
*
* http://www.openbluedragon.org/
*/
package com.nary.util;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Hashtable;
import org.apache.commons.vfs.FileObject;
import org.apache.commons.vfs.RandomAccessContent;
import org.apache.commons.vfs.util.RandomAccessMode;
import com.naryx.tagfusion.cfm.engine.cfEngine;
/**
* This class provides an easy way for an application to maintain a log file
* that is unique to it.
*
* The logfile has an auto-rotation facility, initially set at 25MB
*/
public class LogFileObject extends Object {
private static final String LOG_DATE_FORMAT = "dd/MM/yy HH:mm.ss: ";
private RandomAccessContent outFileRandomAccess;
private long logFileSize = 0;
private FileObject filename;
private static long maxLogFileSize = 25000000; // - default to 25MB
private static Hashtable logfiles = new Hashtable();
private LogFileObject( FileObject logPath ) throws Exception {
filename = logPath;
if ( !logPath.exists() )
logPath.createFile();
outFileRandomAccess = logPath.getContent().getRandomAccessContent( RandomAccessMode.READWRITE );
logFileSize = outFileRandomAccess.length();
outFileRandomAccess.seek( logFileSize );
}
private void println(String _line) {
try {
writeData(com.nary.util.Date.formatNow(LOG_DATE_FORMAT) + _line + "\r\n");
} catch (Exception e) {
// DateFormat.format() has been observed to throw NullPointerExceptions
cfEngine.log("Error " + e + " formatting date in LogFile.println( String _line )");
}
}
private void close() {
try {
outFileRandomAccess.close();
} catch (Exception E) {}
}
private synchronized void writeData(String _line) {
try {
outFileRandomAccess.writeBytes(_line);
logFileSize += _line.length();
} catch (IOException EE) {}
if (logFileSize > maxLogFileSize)
rotateLogFile();
}
private void rotateLogFile() {
try {
outFileRandomAccess.close();
// rename the old file to a new one
int x = 1;
String sfname = filename.getName().getBaseName();
FileObject newFile = filename.getParent().resolveFile( sfname + "." + x );
while ( newFile.exists() ) {
newFile = filename.getParent().resolveFile( sfname + "." + (x++) );
}
filename.moveTo( newFile );
//Delete the old one
filename.delete();
filename.createFile();
outFileRandomAccess = filename.getContent().getRandomAccessContent( RandomAccessMode.READWRITE );;
logFileSize = 0;
} catch (IOException ignoreException) {
// - the rotation failed; so lets just reset the current file
}
}
// -------------------------------------------------------
public static void println(FileObject outFile, String _Line) {
String key = outFile.toString();
if (!logfiles.containsKey( key )) {
try {
logfiles.put( key, new LogFileObject(outFile) );
} catch (Exception E) {
return;
}
}
((LogFileObject) (logfiles.get( key ))).println(_Line);
}
public static void closeAll() {
Enumeration E = logfiles.elements();
while (E.hasMoreElements())
((LogFileObject) E.nextElement()).close();
}
}