package edu.ualberta.med.biobank.logs; import java.util.ArrayList; import java.util.List; import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.PatternLayout; import org.apache.log4j.spi.LoggingEvent; import org.eclipse.ui.console.ConsolePlugin; import org.eclipse.ui.console.IConsole; import org.eclipse.ui.console.MessageConsole; import org.eclipse.ui.console.MessageConsoleStream; import edu.ualberta.med.biobank.forms.linkassign.SpecimenAssignEntryForm; import edu.ualberta.med.biobank.forms.linkassign.SpecimenLinkEntryForm; import edu.ualberta.med.biobank.rcp.perspective.LinkAssignPerspective; /** * Display in ConsoleView and possibly printed. * * @see LinkAssignPerspective * @see SpecimenLinkEntryForm * @see SpecimenAssignEntryForm */ public class ActivityLogAppender extends AppenderSkeleton { private MessageConsole messageConsole; private MessageConsoleStream consoleStream; private List<LogInfo> logsList; private static final char[] SYSTEM_LINE_SEPARATOR = System.getProperty( "line.separator").toCharArray(); //$NON-NLS-1$ public static final PatternLayout layout = new PatternLayout( "%d{HH:mm:ss} %m%n"); //$NON-NLS-1$ public ActivityLogAppender(String name) { setName(name); messageConsole = new MessageConsole(name, null); ConsolePlugin.getDefault().getConsoleManager() .addConsoles(new IConsole[] { messageConsole }); consoleStream = messageConsole.newMessageStream(); setLayout(layout); logsList = new ArrayList<LogInfo>(); } @Override protected void append(LoggingEvent event) { String text = layout.format(event); consoleStream.print(text); boolean shouldRemoveLineSeparator = false; for (int i = 0; i < SYSTEM_LINE_SEPARATOR.length; i++) { char c = SYSTEM_LINE_SEPARATOR[i]; int positionFromEnd = SYSTEM_LINE_SEPARATOR.length - i; if (text.length() >= positionFromEnd) { char charAtPosition = text.charAt(text.length() - positionFromEnd); if (charAtPosition == c) { shouldRemoveLineSeparator = true; } else { shouldRemoveLineSeparator = false; break; } } } if (shouldRemoveLineSeparator) { text = text.substring(0, text.length() - SYSTEM_LINE_SEPARATOR.length); } logsList.add(new LogInfo(text)); } @Override public void close() { ConsolePlugin.getDefault().getConsoleManager() .removeConsoles(new IConsole[] { messageConsole }); } @Override public boolean requiresLayout() { return true; } public List<LogInfo> getLogsList() { return logsList; } }