package ch.qos.logback.beagle.view;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.preference.IPreferenceStore;
import ch.qos.logback.beagle.Activator;
import ch.qos.logback.beagle.preferences.BeaglePreferencesPage;
import ch.qos.logback.classic.PatternLayout;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.pattern.CompositeConverter;
import ch.qos.logback.core.pattern.Converter;
import ch.qos.logback.core.pattern.ConverterUtil;
import ch.qos.logback.core.pattern.LiteralConverter;
import ch.qos.logback.core.pattern.parser.Node;
import ch.qos.logback.core.pattern.parser.Parser;
import ch.qos.logback.core.spi.ScanException;
public class ConverterFacade {
String pattern;
private Converter<ILoggingEvent> head;
Context context;
List<Converter<ILoggingEvent>> converterList = new ArrayList<Converter<ILoggingEvent>>();
public void start() {
converterList.clear();
String pattern = BeaglePreferencesPage.PATTERN_PREFERENCE_DEFAULT_VALUE;
if (Activator.INSTANCE != null) {
IPreferenceStore pStore = Activator.INSTANCE.getPreferenceStore();
pattern = pStore.getString(BeaglePreferencesPage.PATTERN_PREFERENCE);
}
try {
Parser<ILoggingEvent> p = new Parser<ILoggingEvent>(pattern);
p.setContext(context);
Node t = p.parse();
head = p.compile(t, PatternLayout.defaultConverterMap);
ch.qos.logback.beagle.util.ConverterUtil.setContextForConverters(context,
head);
ConverterUtil.startConverters(head);
fillConverterList();
} catch (ScanException e) {
Activator.INSTANCE.logException(e, e.getMessage());
}
}
public String convert(ILoggingEvent event) {
StringBuilder sb = new StringBuilder();
Converter<ILoggingEvent> c = head;
while (c != null) {
sb.append(c.convert(event));
c = c.getNext();
}
return sb.toString();
}
public List<Converter<ILoggingEvent>> getConverterList() {
return converterList;
}
public int getColumnCount() {
return converterList.size();
}
public void setConverterList(List<Converter<ILoggingEvent>> converterList) {
this.converterList = converterList;
}
private void fillConverterList() {
Converter<ILoggingEvent> c = head;
while (c != null) {
if (!(c instanceof LiteralConverter)) {
converterList.add(c);
}
c = c.getNext();
}
}
public String getPattern() {
return pattern;
}
public void setPattern(String pattern) {
this.pattern = pattern;
}
public Context getContext() {
return context;
}
public void setContext(Context context) {
this.context = context;
}
public String computeConverterName(Converter<ILoggingEvent> c) {
if (c instanceof CompositeConverter) {
return computeCompositeConverterName((CompositeConverter<ILoggingEvent>) c);
} else {
return computeSimpleConverterName(c);
}
}
private String computeCompositeConverterName(
CompositeConverter<ILoggingEvent> compositeConverter) {
StringBuilder nameSB = new StringBuilder("composite");
Converter<ILoggingEvent> child = compositeConverter.getChildConverter();
while (child != null) {
if (!(child instanceof LiteralConverter))
nameSB.append('_').append(computeSimpleConverterName(child));
child = child.getNext();
}
return nameSB.toString();
}
private String computeSimpleConverterName(Converter<ILoggingEvent> c) {
String className = c.getClass().getSimpleName();
int index = className.indexOf("Converter");
if (index == -1) {
return className;
} else {
return className.substring(0, index);
}
}
}