001 package org.shiftone.jrat.core.output; 002 003 004 import org.shiftone.jrat.core.shutdown.ShutdownListener; 005 import org.shiftone.jrat.util.HtmlUtil; 006 import org.shiftone.jrat.util.log.Logger; 007 008 import java.io.OutputStream; 009 import java.io.PrintWriter; 010 import java.io.Writer; 011 import java.util.Iterator; 012 import java.util.Stack; 013 014 015 /** 016 * @author jeff@shiftone.org (Jeff Drost) 017 */ 018 public class FileOutputRegistry implements FileOutputRegistryMBean, ShutdownListener { 019 020 private static final Logger LOG = Logger.getLogger(FileOutputRegistry.class); 021 private Stack fileOutputs = new Stack(); 022 023 public int getRegisteredFileOutputCount() { 024 return fileOutputs.size(); 025 } 026 027 028 public String getRegisteredFileOutputsHtml() { 029 return HtmlUtil.toHtml(fileOutputs); 030 } 031 032 033 public synchronized OutputStream add(OutputStream outputStream, String title) { 034 return (OutputStream) add(new FileOutputOutputStream(this, outputStream, title)); 035 } 036 037 038 public synchronized Writer add(Writer writer, String title) { 039 return (Writer) add(new FileOutputWriter(this, writer, title)); 040 } 041 042 043 public synchronized PrintWriter add(PrintWriter printWriter, String title) { 044 return (PrintWriter) add(new FileOutputPrintWriter(this, printWriter, title)); 045 } 046 047 048 public synchronized FileOutput add(FileOutput fileOutput) { 049 050 LOG.info("add " + fileOutput); 051 fileOutputs.push(fileOutput); 052 053 return fileOutput; 054 } 055 056 057 synchronized void remove(FileOutput fileOutput) { 058 LOG.info("remove " + fileOutput); 059 fileOutputs.remove(fileOutput); 060 } 061 062 063 public synchronized void closeFileOutputs() { 064 065 LOG.info("closeFileOutputs " + fileOutputs); 066 067 while (!fileOutputs.isEmpty()) { 068 close((FileOutput) fileOutputs.pop()); 069 } 070 } 071 072 073 public synchronized void flushFileOutputs() { 074 075 LOG.info("flushFileOutputs " + fileOutputs); 076 077 Iterator iterator = fileOutputs.iterator(); 078 079 while (iterator.hasNext()) { 080 flush((FileOutput) iterator.next()); 081 } 082 } 083 084 085 public static void close(FileOutput fileOutput) { 086 087 if (fileOutput != null) { 088 try { 089 LOG.info("closing : " + fileOutput); 090 fileOutput.close(); 091 } 092 catch (Throwable e) { 093 LOG.error("unable to close " + fileOutput, e); 094 } 095 } 096 } 097 098 099 public static void flush(FileOutput fileOutput) { 100 101 if (fileOutput != null) { 102 try { 103 LOG.info("flushing : " + fileOutput); 104 fileOutput.flush(); 105 } 106 catch (Throwable e) { 107 LOG.error("unable to flush " + fileOutput, e); 108 } 109 } 110 } 111 112 113 public void shutdown() { 114 closeFileOutputs(); 115 } 116 117 118 public String toString() { 119 return "FileOutputRegistry" + fileOutputs; 120 } 121 }