001 package org.shiftone.jrat.util.log;
002
003 import org.shiftone.jrat.core.spi.Commandlet;
004 import org.shiftone.jrat.util.log.target.LogTarget;
005 import org.shiftone.jrat.util.log.target.TandemTarget;
006 import org.shiftone.jrat.util.log.target.WriterLogTarget;
007
008 import java.io.OutputStream;
009 import java.io.OutputStreamWriter;
010 import java.io.Writer;
011
012 /**
013 * this is a base class for Commandlets that redirects the log output produced by
014 * the command's thread to the command's output stream, and then reverst the logger back.
015 *
016 * @author jeff@shiftone.org (Jeff Drost)
017 */
018 public abstract class AbstractLogCommandlet implements Commandlet {
019
020 private static final Logger LOG = Logger.getLogger(AbstractLogCommandlet.class);
021
022 protected abstract void execute() throws Exception;
023
024 public final void execute(OutputStream output) throws Exception {
025
026 LogTarget previous = LoggerFactory.getLogTarget();
027
028 Writer outputWriter = new OutputStreamWriter(output);
029 WriterLogTarget writer = new WriterLogTarget(outputWriter);
030 TandemTarget tandem = new TandemTarget(previous, writer);
031
032 try {
033
034 LoggerFactory.setLogTarget(tandem);
035 execute();
036
037 } catch (Throwable e) {
038
039 LOG.error("Commandlet failed", e);
040
041 } finally {
042
043 LoggerFactory.setLogTarget(previous);
044
045 }
046 }
047
048 public final String getContentType() {
049 return Commandlet.ContentType.PLAIN;
050 }
051
052 }