Tom
[EMAIL PROTECTED] wrote:
Hi, I'm intrested on testing your servlet capabilities, can u send it to me??
For the Open Source Power ...
Ahmed ALAMI DQAI/SDV Tel : 05 57 75 60 52
------------------------------------------------------------------------
Post-scriptum La Poste
Ce message est confidentiel. Sous r�serve de tout accord conclu par �crit entre vous et La Poste, son contenu ne repr�sente en aucun cas un engagement de la part de La Poste. Toute publication, utilisation ou diffusion, m�me partielle, doit �tre autoris�e pr�alablement. Si vous n'�tes pas destinataire de ce message, merci d'en avertir imm�diatement l'exp�diteur.
------------------------------------------------------------------------
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
/* * Copyright: (c) TBEE.ORG * Modified: $Date: 2003/12/18 12:26:40 $ */
package org.tbee.servlets.log4j;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.util.Properties;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Category;
import org.apache.log4j.PropertyConfigurator;
/**
* This servlet just initializes Log4j based on a propery file.
* The file may be specified in the init parameters as "log4j.properties".
* Per default "/WEB-INF/log4j.properties" and "/WEB-INF/classes/log4j.properties" are
checked.
* This servlet will reexamine the properties file every 10 seconds or when the get
method is called.
* A complete log4j properties file may be provided as part of the doPost submit.
*
* @version $Revision: 1.5 $
*/
public class InitServlet extends HttpServlet
{
// Log4J
private static Category cLog4J =
Category.getInstance(InitServlet.class.getName());
// Frequence for looking for new properties
static int cLog4jInterval = 10000 ; // 10 Seconds
// the worker thread
WorkerThread iWorkerThread = null;
// the parameter for the configuration file
static private String PARAMETER_CONFIGFILE = "configfile";
/**
* initialize log4j
* start the worker thread
*/
public void init()
throws ServletException
{
// set up LOG4J
{
// determine properties file
String lPrefix = getServletContext().getRealPath("/WEB-INF")
+ File.separator;
String lFilePath = getInitParameter("log4j.properties");
if (lFilePath == null) lFilePath = "log4j.properties";
if (!(new File(lPrefix + lFilePath)).exists()) lFilePath =
"log4j.properties";
if (!(new File(lPrefix + lFilePath)).exists()) lFilePath =
"classes/log4j.properties";
if (!(new File(lPrefix + lFilePath)).exists())
{
System.err.println("Log4j InitServlet: could not
determine log4j file, reverting to auto configuration");
return;
}
// Set up the configuration
PropertyConfigurator.configure(lPrefix + lFilePath);
if (cLog4J.isInfoEnabled()) cLog4J.info("Log4J initialized
using: " + lPrefix + lFilePath);
// if debugging must be disabled entirely
if ("true".equals(getInitParameter("disabled")) ||
"yes".equals(getInitParameter("disabled")))
{
// disable
if (cLog4J.isDebugEnabled()) cLog4J.debug("Log4J:
further logging disabled!");
Category.getDefaultHierarchy().disableAll();
}
else
{
// create worker thread
if(cLog4J.isDebugEnabled()) cLog4J.debug("Starting
worker thread");
iWorkerThread = new WorkerThread(lPrefix + lFilePath,
10000); // 10 seconds, TODO: make configurable
iWorkerThread.start();
}
}
}
/**
* Stop the worker thread when the servlet is unloaded
*/
public void destroy()
{
// stop worker thread
if(cLog4J.isDebugEnabled()) cLog4J.debug("Stopping worker thread");
iWorkerThread.stopAsSoonAsPossible();
}
/**
* reexamine the log4j file now
*/
public void doGet(HttpServletRequest pRequest, HttpServletResponse pResponse)
{
// interrupt the worker thread so it will loop immediatly
iWorkerThread.interrupt();
try
{
pResponse.getOutputStream().println("<html>");
pResponse.getOutputStream().println(" <body>");
// basic feedback
pResponse.getOutputStream().println(" Configuration file is
reexamined<br/>");
// upload form
pResponse.getOutputStream().println(" <form
method=\"POST\">");
pResponse.getOutputStream().println(" Paste configuration
file here:");
pResponse.getOutputStream().println(" <textarea name=\"" +
PARAMETER_CONFIGFILE + "\"></textarea>");
pResponse.getOutputStream().println(" <input
type=\"submit\" value=\"configure\"/>");
pResponse.getOutputStream().println(" </form>");
pResponse.getOutputStream().println(" </body>");
pResponse.getOutputStream().println("</html>");
}
catch (IOException lException)
{
cLog4J.error(lException);
}
}
/**
* posting will overload the log4j settings until the configuration file is
renewed or a new post is made
*/
public void doPost(HttpServletRequest pRequest, HttpServletResponse pResponse)
{
// interrupt the worker thread so it will loop immediatly
iWorkerThread.interrupt();
try
{
// feedback
pResponse.getOutputStream().print("<html><body>");
pResponse.getOutputStream().print("configuration file is
reexamined<br/>");
// is the parameter submitted?
if (pRequest.getParameter(PARAMETER_CONFIGFILE) != null)
{
// push file contents into log4j
Properties lProperties = new Properties();
lProperties.load(new
ByteArrayInputStream(pRequest.getParameter(PARAMETER_CONFIGFILE).toString().getBytes()));
PropertyConfigurator.configure(lProperties);
if (cLog4J.isInfoEnabled()) cLog4J.info("Log4J
reinitialized using submitted text: " +
pRequest.getParameter(PARAMETER_CONFIGFILE).toString().length() + " bytes");
pResponse.getOutputStream().print("Log4J reinitialized
using submitted text<br/>");
}
// feedback
pResponse.getOutputStream().print("</body></html>");
}
catch (IOException lException)
{
cLog4J.error("EXCEPTION: " + lException.getMessage() + " at "
+ lException.getStackTrace()[0].toString(), lException );
}
}
//
// =================================================================
//
/**
* This is the actual thread checking the file
*/
private class WorkerThread extends Thread
{
/**
* constructor
*/
public WorkerThread(String pConfigFilePath, int pSleep)
{
super();
iConfigFilePath = pConfigFilePath;
iSleep = pSleep;
}
// the file to keep an eye on
private String iConfigFilePath = null;
// the timeout period
private int iSleep = 10000;
// the stop flag
private boolean iStop = false;
/**
* make this thread stop asap
*/
public void stopAsSoonAsPossible()
{
// just set the flag
iStop = true;
if(cLog4J.isDebugEnabled()) cLog4J.debug("Stop flag set to " +
iStop);
// wake the thread up
iWorkerThread.interrupt();
}
/**
* check the file and optionally reload
*/
public void run()
{
// remember last changed data
long lLastModified = (new
File(iConfigFilePath)).lastModified();
// endless loop
while(true)
{
// stop check
if(cLog4J.isDebugEnabled()) cLog4J.debug("Checking
stop flag");
if (iStop)
{
if(cLog4J.isDebugEnabled())
cLog4J.debug("Stopping!");
break;
}
else
{
try
{
// sleep a while
Thread.sleep(iSleep);
}
catch (InterruptedException lException) {} //
do nothing, this is an early wake-up call
}
// was the file changed?
long lCurrentModified = (new
File(iConfigFilePath)).lastModified();
if(cLog4J.isDebugEnabled()) cLog4J.debug("Checking " +
iConfigFilePath + ", current = " + lCurrentModified + ", last = " + lLastModified);
if (lLastModified < lCurrentModified)
{
// reconfigure log4j
PropertyConfigurator.configure(iConfigFilePath);
if (cLog4J.isInfoEnabled()) cLog4J.info("Log4J
reinitialized using: " + iConfigFilePath);
// remember new datetime
lLastModified = lCurrentModified;
}
}
}
}
}
/*
* $Log: InitServlet.java,v $
* Revision 1.5 2003/12/18 12:26:40 cvs
* cleanup
*
* Revision 1.4 2003/12/15 20:19:12 cvs
* own worker thread
* doGet and doPost
*
* Revision 1.3 2003/12/10 15:28:19 cvs
* *** empty log message ***
*
* Revision 1.2 2002/09/25 08:25:10 tom
* *** empty log message ***
*
*/
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
