blob: bdd26f2cb21c2ebdcd66690c02d041e024d835b3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
public class CDTLogWriter {
protected File logFile = null;
protected Writer log = null;
protected boolean newSession = true;
protected static final String SESSION = "*** SESSION";//$NON-NLS-1$
protected static final String ENTRY = "ENTRY";//$NON-NLS-1$
protected static final String SUBENTRY = "SUBENTRY";//$NON-NLS-1$
protected static final String MESSAGE = "MESSAGE";//$NON-NLS-1$
protected static final String STACK = "STACK";//$NON-NLS-1$
protected static final String LINE_SEPARATOR;
protected static final String TAB_STRING = "\t";//$NON-NLS-1$
protected static final long MAXLOG_SIZE = 10000000;
static {
String s = System.getProperty("line.separator");//$NON-NLS-1$
LINE_SEPARATOR = s == null ? "\n" : s;//$NON-NLS-1$
}
/**
*
*/
public CDTLogWriter(File log) {
this.logFile = log;
if(log.length() > MAXLOG_SIZE){
log.delete();
this.logFile = CCorePlugin.getDefault().getStateLocation().append(".log").toFile();
}
openLogFile();
}
protected void closeLogFile() throws IOException {
try {
if (log != null) {
log.flush();
log.close();
}
} finally {
log = null;
}
}
protected void openLogFile() {
try {
log = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(logFile.getAbsolutePath(), true), "UTF-8"));//$NON-NLS-1$
if (newSession) {
writeHeader();
newSession = false;
}
} catch (IOException e) {
// there was a problem opening the log file so log to the console
//log = logForStream(System.err);
}
}
protected void writeHeader() throws IOException {
write(SESSION);
writeSpace();
String date = getDate();
write(date);
writeSpace();
for (int i=SESSION.length()+date.length(); i<78; i++) {
write("-");//$NON-NLS-1$
}
writeln();
}
protected String getDate() {
try {
DateFormat formatter = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss.SS"); //$NON-NLS-1$
return formatter.format(new Date());
} catch (Exception e) {
// If there were problems writing out the date, ignore and
// continue since that shouldn't stop us from losing the rest
// of the information
}
return Long.toString(System.currentTimeMillis());
}
protected Writer logForStream(OutputStream output) {
try {
return new BufferedWriter(new OutputStreamWriter(output, "UTF-8"));//$NON-NLS-1$
} catch (UnsupportedEncodingException e) {
return new BufferedWriter(new OutputStreamWriter(output));
}
}
/**
* Writes the given string to the log, followed by the line terminator string.
*/
protected void writeln(String s) throws IOException {
write(s);
writeln();
}
/**
* Shuts down the log.
*/
public synchronized void shutdown() {
try {
if (logFile != null) {
closeLogFile();
logFile = null;
} else {
if (log != null) {
Writer old = log;
log = null;
old.flush();
old.close();
}
}
} catch (Exception e) {
//we've shutdown the log, so not much else we can do!
e.printStackTrace();
}
}
protected void write(Throwable throwable) throws IOException {
if (throwable == null)
return;
write(STACK);
writeSpace();
boolean isCoreException = throwable instanceof CoreException;
if (isCoreException)
writeln("1");//$NON-NLS-1$
else
writeln("0");//$NON-NLS-1$
throwable.printStackTrace(new PrintWriter(log));
if (isCoreException) {
CoreException e = (CoreException) throwable;
write(e.getStatus(), 0);
}
}
public synchronized void log(IStatus status){
try {
this.write(status, 0);
} catch (IOException e) {
}
}
protected void write(IStatus status, int depth) throws IOException {
if (depth == 0) {
write(ENTRY);
} else {
write(SUBENTRY);
writeSpace();
write(Integer.toString(depth));
}
writeSpace();
write(status.getPlugin());
writeSpace();
write(Integer.toString(status.getSeverity()));
writeSpace();
write(Integer.toString(status.getCode()));
writeSpace();
write(getDate());
writeln();
write(MESSAGE);
writeSpace();
writeln(status.getMessage());
//Took out the stack dump - too much space
//write(status.getException());
if (status.isMultiStatus()) {
IStatus[] children = status.getChildren();
for (int i = 0; i < children.length; i++) {
write(children[i], depth+1);
}
}
}
protected void writeln() throws IOException {
write(LINE_SEPARATOR);
}
protected void write(String message) throws IOException {
if (message != null)
log.write(message);
}
protected void writeSpace() throws IOException {
write(" ");//$NON-NLS-1$
}
public synchronized void flushLog(){
try {
log.flush();
} catch (IOException e) {}
}
}