package name.abuchen.portfolio.ui.log; import java.io.PrintWriter; import java.io.StringWriter; import java.util.ArrayList; import java.util.Date; import java.util.LinkedList; import java.util.List; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.inject.Inject; import javax.inject.Singleton; import name.abuchen.portfolio.ui.UIConstants; import org.eclipse.core.runtime.ILogListener; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; import org.eclipse.e4.core.di.annotations.Creatable; import org.eclipse.e4.core.services.events.IEventBroker; @Creatable @Singleton public class LogEntryCache implements ILogListener { private LinkedList<LogEntry> entries = new LinkedList<LogEntry>(); @Inject private IEventBroker eventBroker; @PostConstruct public void init() { Platform.addLogListener(this); } @PreDestroy public void dispose() { Platform.removeLogListener(this); } @Override public void logging(IStatus status, String plugin) { LogEntry entry = createEntry(status); entries.add(entry); if (entries.size() > 100) entries.removeFirst(); eventBroker.post(UIConstants.Event.Log.CREATED, entry); } private LogEntry createEntry(IStatus status) { LogEntry entry = new LogEntry(status.getSeverity(), new Date(), status.getMessage()); if (status.getException() != null) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); status.getException().printStackTrace(pw); entry.setStacktrace(sw.toString()); } if (status.isMultiStatus()) { for (IStatus s : status.getChildren()) entry.addChild(createEntry(s)); } return entry; } public List<LogEntry> getEntries() { return new ArrayList<LogEntry>(entries); } public void clear() { entries.clear(); eventBroker.post(UIConstants.Event.Log.CLEARED, null); } }