package de.persosim.simulator.ui.utils; import java.util.LinkedList; import org.globaltester.logging.AbstractLogListener; import org.globaltester.logging.LogListenerConfig; import org.globaltester.logging.filter.AndFilter; import org.globaltester.logging.filter.BundleFilter; import org.globaltester.logging.filter.LevelFilter; import org.globaltester.logging.filter.LogFilter; import org.globaltester.logging.format.LogFormat; import org.osgi.service.log.LogListener; import de.persosim.simulator.ui.Activator; /** * This {@link LogListener} implementation is used to write log entries by line * into a given {@link LinkedList} using a maximum number of cached lines. * * @author mboonk * */ public class LinkedListLogListener extends AbstractLogListener { private LinkedList<String> list = new LinkedList<String>(); private int maxLines; private boolean needsUpdate; public LinkedListLogListener(int maxLines) { LogListenerConfig lrc = new LogListenerConfig() { byte logLevels [] ={1,2,3,4,5,6,120}; String bundleList [] = {"org.globaltester"}; public LogFormat format = new LogFormat(); public BundleFilter bundleFilter = new BundleFilter(bundleList); public LevelFilter levelFilter = new LevelFilter(logLevels); public LogFilter [] filters = {bundleFilter, levelFilter}; public AndFilter filter = new AndFilter(filters); { Activator.setLogLevelFilter(levelFilter); } @Override public LogFilter getFilter() { return filter; } @Override public LogFormat getFormat() { return format; } }; this.maxLines = maxLines; setLrc(lrc); } /** * @return the number of lines currently in the cache */ public int getNumberOfCachedLines(){ synchronized (this) { return list.size(); } } /** * @param index * of the line to return * @return the content of the cached line at the given index */ public String getLine(int index){ synchronized (this) { return list.get(index); } } public void resetRefreshState(){ needsUpdate = false; } public boolean isRefreshNeeded(){ return needsUpdate; } @Override public void displayLogMessage(String msg) { // cut at line breaks and print String[] splitResult = msg.split("(\\n|\\r)"); for (int i = 0; i < splitResult.length; i++) { needsUpdate = true; if (list != null) { if (list.size() > maxLines) { // synchronized is used to avoid // IndexOutOfBoundsExceptions synchronized (this) { list.removeFirst(); list.add(splitResult[i]); } } else { synchronized (this) { list.add(splitResult[i]); } } } } } }