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    }