001 package org.shiftone.jrat.core; 002 003 004 import org.shiftone.jrat.core.command.CommandletRegistry; 005 import org.shiftone.jrat.core.jmx.JmxRegistry; 006 import org.shiftone.jrat.core.output.OutputDirectory; 007 import org.shiftone.jrat.core.shutdown.ShutdownListener; 008 import org.shiftone.jrat.core.shutdown.ShutdownRegistry; 009 import org.shiftone.jrat.core.spi.Commandlet; 010 import org.shiftone.jrat.core.spi.RuntimeContext; 011 import org.shiftone.jrat.util.AtomicLong; 012 import org.shiftone.jrat.util.VersionUtil; 013 import org.shiftone.jrat.util.io.IOUtil; 014 import org.shiftone.jrat.util.log.Logger; 015 import org.shiftone.jrat.util.log.LoggerFactory; 016 017 import java.io.*; 018 import java.net.InetAddress; 019 import java.util.Properties; 020 import java.util.zip.GZIPOutputStream; 021 022 023 /** 024 * Class RuntimeContextImpl 025 * 026 * @author jeff@shiftone.org (Jeff Drost) 027 */ 028 class RuntimeContextImpl implements RuntimeContext { 029 030 protected static final Logger LOG = Logger.getLogger(RuntimeContextImpl.class); 031 private final AtomicLong sequence = new AtomicLong(); 032 private final long startTimeMs = System.currentTimeMillis(); 033 private final ShutdownRegistry shutdownRegistry; 034 private final JmxRegistry jmxRegistry; 035 private final CommandletRegistry commandletRegistry; 036 private final OutputDirectory outputDirectory; 037 private final Properties systemPropertiesAtStartup; 038 private final MemoryMonitor memoryMonitor; 039 040 RuntimeContextImpl() { 041 042 LOG.info("new"); 043 044 ServiceFactory serviceFactory = ServiceFactory.getInstance(); 045 046 outputDirectory = OutputDirectory.create(serviceFactory.getFileOutputFactory()); 047 shutdownRegistry = serviceFactory.getShutdownRegistry(); 048 jmxRegistry = serviceFactory.getJmxRegistry(); 049 commandletRegistry = serviceFactory.getCommandletRegistry(); 050 memoryMonitor = new MemoryMonitor(this); 051 052 systemPropertiesAtStartup = new Properties(); 053 systemPropertiesAtStartup.putAll(System.getProperties()); 054 055 redirectLogStream(); 056 057 } 058 059 060 public Properties getSystemPropertiesAtStartup() { 061 return systemPropertiesAtStartup; 062 } 063 064 public String getHostAddress() { 065 try { 066 return InetAddress.getLocalHost().getHostAddress(); 067 } catch (Exception e) { 068 return "unknown"; 069 } 070 } 071 072 public String getHostName() { 073 try { 074 return InetAddress.getLocalHost().getHostName(); 075 } catch (Exception e) { 076 return "unknown"; 077 } 078 } 079 080 public long getStartTimeMs() { 081 return startTimeMs; 082 } 083 084 085 public void registerMBean(Object mbean) { 086 registerMBean(mbean, null); 087 } 088 089 090 public void registerMBean(Object mbean, String objectNameText) { 091 jmxRegistry.registerMBean(mbean, objectNameText); 092 } 093 094 public void register(Commandlet commandlet) { 095 commandletRegistry.register(commandlet); 096 } 097 098 099 private void redirectLogStream() { 100 101 PrintWriter printWriter; 102 103 try { 104 printWriter = outputDirectory.createPrintWriter("jrat.log"); 105 LoggerFactory.redirectLogging(printWriter); 106 LOG.info("logfile created"); 107 LOG.info("Running JRat version " + VersionUtil.getVersion() + " - built on " + VersionUtil.getBuiltOn()); 108 } 109 catch (Exception e) { 110 LOG.warn("unable to redirect LOG to file", e); 111 } 112 } 113 114 public PrintWriter createPrintWriter(String fileName) { 115 return outputDirectory.createPrintWriter(fileName); 116 } 117 118 119 public OutputStream createOutputStream(String fileName) { 120 return outputDirectory.createOutputStream(fileName); 121 } 122 123 124 public Writer createWriter(String fileName) { 125 return outputDirectory.createWriter(fileName); 126 } 127 128 129 public synchronized long uniqNumber() { 130 return sequence.incrementAndGet(); 131 } 132 133 134 public void registerShutdownListener(ShutdownListener listener) { 135 shutdownRegistry.registerShutdownListener(listener); 136 } 137 138 139 public void writeSerializable(String fileName, Serializable serializable) { 140 141 OutputStream outputStream = createOutputStream(fileName); 142 ObjectOutputStream objectOutputStream = null; 143 144 try { 145 outputStream = new GZIPOutputStream(outputStream); 146 objectOutputStream = new ObjectOutputStream(outputStream); 147 objectOutputStream.writeObject(serializable); 148 149 objectOutputStream.flush(); 150 objectOutputStream.close(); 151 152 } catch (Exception e) { 153 154 LOG.error("unable to write object '" + serializable + "' to file : " + fileName, e); 155 156 } finally { 157 IOUtil.close(objectOutputStream); 158 } 159 160 } 161 162 public String toString() { 163 return "RuntimeContextImpl created @ " + startTimeMs; 164 } 165 }