package biz.aQute.resolve;
import static java.nio.charset.StandardCharsets.UTF_8;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import org.osgi.framework.ServiceReference;
import org.osgi.service.log.LogService;
import aQute.lib.io.IO;
public class ResolverLogger implements LogService {
public static final int DEFAULT_LEVEL = 4;
public static final int LOG_ERROR = 1;
public static final int LOG_WARNING = 2;
public static final int LOG_INFO = 3;
public static final int LOG_DEBUG = 4;
private final File file;
private final PrintWriter printer;
private int level;
private String log;
public ResolverLogger() {
this(DEFAULT_LEVEL);
}
public ResolverLogger(int level) {
try {
this.level = level;
file = File.createTempFile("tmp", ".log");
file.deleteOnExit();
printer = IO.writer(file, UTF_8);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public ResolverLogger(int level, PrintStream out) {
this.level = level;
file = null;
printer = new PrintWriter(out);
}
public void log(int level, String msg, Throwable throwable) {
String s = "";
s = s + msg;
if (throwable != null)
s = s + " (" + throwable + ")";
switch (level) {
case LOG_DEBUG :
printer.println("DEBUG: " + s);
break;
case LOG_ERROR :
printer.println("ERROR: " + s);
if (throwable != null) {
throwable.printStackTrace(printer);
}
break;
case LOG_INFO :
printer.println("INFO: " + s);
break;
case LOG_WARNING :
printer.println("WARNING: " + s);
break;
default :
printer.println("UNKNOWN[" + level + "]: " + s);
}
printer.flush();
log = null;
}
public String getLog() {
if (log == null) {
try {
printer.flush();
if (file.length() <= 8001) {
log = IO.collect(file);
} else {
StringBuilder sb = new StringBuilder(10000);
sb.append("Log too large. Split from ")
.append(file.getAbsolutePath())
.append("\nsize ")
.append((file.length() + 512) / 1024)
.append(" Kb\n===================\n");
byte[] buffer = new byte[4000];
RandomAccessFile raf = new RandomAccessFile(file, "r");
raf.readFully(buffer);
sb.append(new String(buffer, UTF_8));
sb.append("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv\n");
raf.seek(raf.length() - buffer.length);
raf.readFully(buffer);
String s = new String(buffer, UTF_8);
sb.append(s);
raf.close();
log = sb.toString();
}
} catch (Exception e) {
log = e.getMessage();
}
}
return log;
}
@Override
public void finalize() {
IO.delete(file);
}
public int getLogLevel() {
return level;
}
@Override
public void log(int level, String message) {
log(level, message, null);
}
@Override
public void log(ServiceReference sr, int level, String message) {
log(level, message, null);
}
@Override
public void log(ServiceReference sr, int level, String message, Throwable exception) {
log(level, message, exception);
}
}