/* * Copyright 2000-2004 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.jetspeed.modules.actions.portlets; // Java classes import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.Enumeration; import java.util.HashMap; // Log4J classes import org.apache.log4j.Logger; import org.apache.log4j.LogManager; import org.apache.log4j.Appender; import org.apache.log4j.FileAppender; import org.apache.log4j.spi.LoggerRepository; // Turbine classes import org.apache.turbine.util.RunData; // Velocity classes import org.apache.velocity.context.Context; // Jetspeed classes import org.apache.jetspeed.portal.Portlet; /** * This class is the action class for a portlet that lets you view the Log4J * logfiles defined in your Jetspeed installation.<br/> * the portlet iterates through the Log4J appender defined that are of type * FileAppender or its subclasses, and lists the filenames in a listbox.<br/> * * The portlet puts the following in the context:<br/> * <code>appenders</code> - a HashMap with the appenders found<br/> * <code>files</code> - a HashMap with the filenames without path<br/> * <code>logfile</code> - the content of the file indicated by <code>selectedfile</code><br/> * * * @author <a href="mailto:harald@ommang.com">Harald Ommang</a> * @version $Id: LogfileViewerAction.java,v 1.3 2004/02/23 02:56:58 jford Exp $ */ public class LogfileViewerAction extends GenericMVCAction { /** * Static initialization of the logger for this class */ private static final Logger logger = LogManager.getLogger(LogfileViewerAction.class.getName()); private static HashMap appenders = null; /** Creates a new instance of LogFileViewerAction */ public LogfileViewerAction() { } /** * Lists the current logfiles * @param portlet The current portlet * @param context the current portlet context * @paran rundata the Turbine rundata * */ protected void buildNormalContext(Portlet portlet, Context context, RunData rundata) throws Exception { String tempName; LoggerRepository repos = logger.getLoggerRepository(); Enumeration loggerEnum = repos.getCurrentLoggers(); HashMap files = new HashMap(); HashMap fileNames = new HashMap(); appenders = new HashMap(); while ( loggerEnum.hasMoreElements() ) { Logger appLogger = (Logger) loggerEnum.nextElement(); Enumeration appenderEnum = appLogger.getAllAppenders(); String name; while ( appenderEnum.hasMoreElements() ) { Appender appender = (Appender) appenderEnum.nextElement(); if (appender instanceof FileAppender) { name = appender.getName(); tempName = ((FileAppender)appender).getFile(); tempName = tempName.substring(tempName.lastIndexOf(System.getProperty("file.separator")) + 1); if (name == null) { name = tempName; appender.setName(name); } if (logger.isDebugEnabled()) { logger.debug("AppenderName " + name); } appenders.put(name, appender); files.put(name, tempName); } } } context.put("appenders", appenders.values()); context.put("files", files); } /** * If a file is selected, it's contents is put in "logfile" * @paran rundata the Turbine rundata * @param context the current portlet context * */ public void doUpdate(RunData data, Context context) { try { String fileName = data.getParameters().getString("selectedfile"); logger.debug("selectedfile: " + fileName); if (fileName != null) { String content = readFile(fileName); context.put("logfile", content); } else { context.put("logfile", null); } } catch (Exception ex) { logger.error("Exception in viewing logfile: ", ex); } } /** * Reads the contents of a file and returns in \n separated lines. * @paran filename Name of file to read * */ private String readFile (String filename) { StringBuffer buf = new StringBuffer(""); try { String line; BufferedReader in = new BufferedReader(new FileReader(filename)); while ((line = in.readLine()) != null) { buf.append(line + "\n"); } in.close(); } catch (IOException ioe) { logger.error("Error reading file " + filename, ioe); } return buf.toString(); } // readFile } // class LogfileViewerAction