fitnesse.components.Logger.java Source code

Java tutorial

Introduction

Here is the source code for fitnesse.components.Logger.java

Source

// Copyright (C) 2003-2009 by Object Mentor, Inc. All rights reserved.
// Released under the terms of the CPL Common Public License version 1.0.

package fitnesse.components;

import org.apache.commons.lang.ClassUtils;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;

// TODO: Convert to java.util.logging.Formatter
public class Logger {
    private File directory;

    public static SimpleDateFormat makeLogFormat() {
        //SimpleDateFormat is not thread safe,
        // so we need to create each instance independently.
        return new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss Z");
    }

    public static SimpleDateFormat makeFileNameFormat() {
        //SimpleDateFormat is not thread safe, so we need to create each instance independently.
        return new SimpleDateFormat("yyyyMMddHHmmss");
    }

    private PrintWriter writer;
    private Calendar currentFileCreationDate;

    public Logger(String dirPath) {
        directory = new File(dirPath);
        directory.mkdir();
    }

    public File getDirectory() {
        return directory;
    }

    String formatLogLine(LogData data) {
        StringBuilder line = new StringBuilder();
        line.append(data.host).append(" - ");
        line.append(data.username == null ? "-" : data.username);
        line.append(" [").append(format(makeLogFormat(), data.time)).append("] ");
        line.append('"').append(data.requestLine).append("\" ");
        line.append(data.status).append(" ");
        line.append(data.size);
        return line.toString();
    }

    static String makeLogFileName(Calendar calendar) {
        return "fitnesse" + format(makeFileNameFormat(), calendar) + ".log";
    }

    public void log(LogData data) {
        if (needNewFile(data.time))
            openNewFile(data);
        writer.println(formatLogLine(data));
        writer.flush();
    }

    private boolean needNewFile(Calendar time) {
        if (writer == null)
            return true;
        else {
            boolean different = (time.get(Calendar.DAY_OF_YEAR) != currentFileCreationDate
                    .get(Calendar.DAY_OF_YEAR))
                    || (time.get(Calendar.YEAR) != currentFileCreationDate.get(Calendar.YEAR));
            return different;
        }

    }

    private void openNewFile(LogData data) {
        if (writer != null)
            writer.close();
        currentFileCreationDate = data.time;
        String filename = makeLogFileName(data.time);
        File file = new File(directory, filename);
        OutputStream outputStream;
        try {
            outputStream = new FileOutputStream(file);
        } catch (FileNotFoundException e) {
            System.err.println("Unable to open log file. Falling back to stderr");
            e.printStackTrace(System.err);
            outputStream = System.err;
        }
        writer = new PrintWriter(outputStream);
    }

    public void close() {
        if (writer != null)
            writer.close();
    }

    private static String format(DateFormat format, Calendar calendar) {
        DateFormat tmpFormat = (DateFormat) format.clone();
        tmpFormat.setTimeZone(calendar.getTimeZone());
        return tmpFormat.format(calendar.getTime());
    }

    @Override
    public String toString() {
        return getDirectory().getAbsolutePath();
    }
}