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    }