/** * XWeb project * https://github.com/abdollahpour/xweb * Hamed Abdollahpour - 2013 */ package ir.xweb.module; import org.apache.commons.fileupload.FileItem; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.FileReader; import java.io.IOException; import java.io.PrintWriter; import java.lang.Math; import java.util.Map; import java.io.File; public class LogModule extends Module { private final static Logger logger = LoggerFactory.getLogger(LogModule.class); private final static String PARAM_LOG_FILE = "file.log"; private final static String SESSION_LAST_POSITION = "module_log_position_"; private final static int MAX_READ = 30 * 1024; private final File log; public LogModule( final Manager manager, final ModuleInfo info, final ModuleParam properties) throws ModuleException { super(manager, info, properties); log = properties.getFile(PARAM_LOG_FILE); } @Override public void process( final ServletContext context, final HttpServletRequest request, final HttpServletResponse response, final ModuleParam params, final Map<String, FileItem> files) throws IOException { /** We have different log history for different IDs, so we can have different HTMLs **/ final String id = params.getString("id", "0"); if(log != null && log.exists()) { response.setContentType("text/plain"); long last = log.lastModified(); long len = log.length(); Long position = (Long) request.getSession().getAttribute(SESSION_LAST_POSITION + id); // init if(position == null) { position = Math.max(0, len - MAX_READ); } final PrintWriter writer = response.getWriter(); final FileReader reader = new FileReader(log); if(position > 0) { reader.skip(position); } char[] buffer = new char[1024]; int size; while((size = reader.read(buffer)) > 0) { writer.write(buffer, 0, size); position += size; } request.getSession().setAttribute(SESSION_LAST_POSITION + id, position); reader.close(); } else { logger.error("Log file not found: " + log); } } }