package org.overture.interpreter.messages.rtlog; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.util.LinkedList; import java.util.List; import org.overture.interpreter.messages.Console; import org.overture.interpreter.messages.rtlog.RTThreadSwapMessage.SwapType; public class RTTextLogger implements IRTLogger { private List<RTMessage> events = new LinkedList<RTMessage>(); private File logfile = null; private RTMessage cached = null; private boolean enabled = false; /* * (non-Javadoc) * @see org.overture.interpreter.messages.rtlog.IRTLogger#enable(boolean) */ @Override public synchronized void enable(boolean on) { if (!on) { dump(true); cached = null; } enabled = on; } /* * (non-Javadoc) * @see org.overture.interpreter.messages.rtlog.IRTLogger#log(org.overture.interpreter.messages.rtlog.RTMessage) */ @Override public synchronized void log(RTMessage message) { if (!enabled) { return; } // generate any static deploys required for this message message.generateStaticDeploys(); doLog(message); } /* * (non-Javadoc) * @see org.overture.interpreter.messages.rtlog.IRTLogger#setLogfile(java.io.PrintWriter) */ private void _setLogfile(File out) { dump(true); // Write out and close previous logfile = out; cached = null; } /* * (non-Javadoc) * @see org.overture.interpreter.messages.rtlog.IRTLogger#getLogSize() */ @Override public int getLogSize() { return events.size(); } /* * (non-Javadoc) * @see org.overture.interpreter.messages.rtlog.IRTLogger#dump(boolean) */ @Override public synchronized void dump(boolean close) { if (logfile != null) { PrintWriter writer = null; try { writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream(logfile, true), "UTF-8")); } catch (FileNotFoundException e) { e.printStackTrace(); return; } catch (UnsupportedEncodingException e) { e.printStackTrace(); return; } for (RTMessage event : events) { writer.println(event.getMessage()); } writer.flush(); events.clear(); writer.close(); } } private synchronized void doLog(RTMessage message) { RTMessage event = message; if (event instanceof RTThreadSwapMessage && (((RTThreadSwapMessage) event).getType() == SwapType.In || ((RTThreadSwapMessage) event).getType() == SwapType.DelayedIn)) { if (cached != null) { doInternalLog(cached); } cached = event; return; } if (cached != null) { if (event instanceof RTThreadSwapMessage && ((RTThreadSwapMessage) event).getType() == SwapType.Out) { RTThreadMessage eventThreadMessage = (RTThreadMessage) event; if (cached instanceof RTThreadSwapMessage) { RTThreadSwapMessage cachedThreadSwap = (RTThreadSwapMessage) cached; if ((cachedThreadSwap.getType() == SwapType.DelayedIn || cachedThreadSwap.getType() == SwapType.In) && cachedThreadSwap.equals(eventThreadMessage.getThread()) && cachedThreadSwap.getLogTime().equals(eventThreadMessage.getLogTime())) { cached = null; return; } } } doInternalLog(cached); cached = null; } doInternalLog(event); } private void doInternalLog(RTMessage event) { if (logfile == null) { Console.out.println(event); } else { events.add(event); if (events.size() > 1000) { dump(false); } } } @Override public void setLogfile(File file) throws FileNotFoundException { if (file != null) { _setLogfile(file); enabled = true; } } }