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 }