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 }