package com.google.code.joto.eventrecorder.spy.log; import java.io.PrintStream; import com.google.code.joto.ast.beanstmt.impl.BeanASTPrettyPrinter; import com.google.code.joto.eventrecorder.RecordEventSummary; import com.google.code.joto.eventrecorder.processor.RecordEventsProcessor; import com.google.code.joto.eventrecorder.processor.RecordEventsProcessorFactory; /** * Formatter for processing RecordEvent(s) corresponding to Log4j LoggingEvent * and converting to String as Java "log.info(msg)" code, or "// msg" comment code * */ public class Log4jToCodeRecordEventsProcessor implements RecordEventsProcessor { public static class Factory implements RecordEventsProcessorFactory<PrintStream> { private boolean convertToComment; public Factory(boolean convertToComment) { super(); this.convertToComment = convertToComment; } @Override public RecordEventsProcessor create(PrintStream out) { return new Log4jToCodeRecordEventsProcessor(convertToComment, out); } } private boolean convertToComment; private PrintStream out; //------------------------------------------------------------------------- public Log4jToCodeRecordEventsProcessor( boolean convertToComment, PrintStream out) { this.convertToComment = convertToComment; this.out = out; } //------------------------------------------------------------------------- @Override public boolean needEventObjectData() { return true; } @Override public void processEvent(RecordEventSummary event, Object eventObjectData) { Log4jEventData eventData = (Log4jEventData) eventObjectData; String formattedMsg = eventData.getFormattedMessage(event); if (convertToComment) { String escapedMsg = formattedMsg.replace("\n", "\n//"); out.println("// " + escapedMsg); // TODO add more info (stack trace, ..) } else { String levelMeth = eventData.getLevel(event).toLowerCase(); out.print("log." + levelMeth + "("); out.print(BeanASTPrettyPrinter.litteralToJava(formattedMsg)); // TODO add more info (stack trace, ..) out.println(");"); } } // ------------------------------------------------------------------------- @Override public String toString() { return "LogbackToCodeRecordEventsProcessor[" + "convertToComment=" + convertToComment + "]"; } }