package org.intrace.output; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.LineNumberReader; import java.io.PrintWriter; import java.util.HashMap; import java.util.Locale; import java.util.Map; import org.intrace.shared.TraceConfigConstants; public class OutputSettings { private boolean stdoutOutputEnabled = false; private boolean fileOutputEnabled = false; private boolean netOutputEnabled = true; private File file1 = new File("trc1.txt"); private File file2 = new File("trc2.txt"); private PrintWriter file1TraceWriter = null; private PrintWriter file2TraceWriter = null; public boolean networkTraceOutputRequested = false; public OutputSettings(OutputSettings oldSettings) { stdoutOutputEnabled = oldSettings.stdoutOutputEnabled; fileOutputEnabled = oldSettings.fileOutputEnabled; netOutputEnabled = oldSettings.netOutputEnabled; } public OutputSettings(String args) { parseArgs(args); } public void parseArgs(String args) { String[] seperateArgs = args.split("\\["); for (int ii = 0; ii < seperateArgs.length; ii++) { parseArg("[" + seperateArgs[ii].toLowerCase(Locale.ROOT)); } } private void parseArg(String arg) { if (arg.equals("[out-network")) { networkTraceOutputRequested = true; } else if (arg.equals(TraceConfigConstants.STD_OUT + "true")) { stdoutOutputEnabled = true; } else if (arg.equals(TraceConfigConstants.STD_OUT + "false")) { stdoutOutputEnabled = false; } else if (arg.equals(TraceConfigConstants.FILE_OUT + "true")) { fileOutputEnabled = true; } else if (arg.equals(TraceConfigConstants.FILE_OUT + "false")) { fileOutputEnabled = false; file1TraceWriter = closeFile(file1TraceWriter); file2TraceWriter = closeFile(file2TraceWriter); } else if (arg.startsWith("[out-file1-")) { String file1Name = arg.replace("[out-file1-", ""); file1TraceWriter = closeFile(file1TraceWriter); file1 = new File(file1Name); } else if (arg.startsWith("[out-file2-")) { String file2Name = arg.replace("[out-file2-", ""); file2TraceWriter = closeFile(file2TraceWriter); file2 = new File(file2Name); } else if (arg.equals(TraceConfigConstants.NET_OUT + "true")) { netOutputEnabled = true; } else if (arg.equals(TraceConfigConstants.NET_OUT + "false")) { System.setProperty("NET", "OFF"); netOutputEnabled = false; } } public boolean isStdoutOutputEnabled() { return stdoutOutputEnabled; } public boolean isFileOutputEnabled() { return fileOutputEnabled; } public synchronized void writeFileOutput(String outputString) { PrintWriter outputWriter; outputWriter = getFileTraceWriter(); if (outputWriter != null) { outputWriter.println(outputString); outputWriter.flush(); } } public boolean isNetOutputEnabled() { return netOutputEnabled; } // Flag to indicate whether file output is currently going to file1 or file2 private boolean file1Active = true; // Variable for tracking the number of bytes written to the output files private int writtenLines = 0; private static final int MAX_LINES_PER_FILE = 100 * 1000; // 100k lines public PrintWriter getFileTraceWriter() { // Handle rolling over between files writtenLines++; if (writtenLines > MAX_LINES_PER_FILE) { writtenLines = 0; file1Active = !file1Active; if (file1Active) { file1TraceWriter = resetFile(file1TraceWriter, file1, true); } else { file2TraceWriter = resetFile(file2TraceWriter, file2, true); } } if (file1Active) { if (file1TraceWriter == null) { file1TraceWriter = resetFile(file1TraceWriter, file1, false); } return file1TraceWriter; } else { if (file2TraceWriter == null) { file2TraceWriter = resetFile(file2TraceWriter, file2, false); } return file2TraceWriter; } } private PrintWriter closeFile(PrintWriter printWriter) { if (printWriter != null) { printWriter.flush(); printWriter.close(); } return null; } private PrintWriter resetFile(PrintWriter printWriter, File file, boolean deleteFile) { writtenLines = 0; PrintWriter ret = null; try { closeFile(printWriter); if (deleteFile) { if (!file.delete()) { System.err.println("InTrace failed to delete trace file: " + file.getAbsolutePath()); } } else if (file.exists()) { LineNumberReader reader = new LineNumberReader(new FileReader(file)); try { while (reader.readLine() != null) { // Do nothing } writtenLines = reader.getLineNumber(); } finally { reader.close(); } } ret = new PrintWriter(new FileWriter(file, true)); } catch (IOException e) { // Throw away } return ret; } public Map<String, String> getSettingsMap() { Map<String, String> settingsMap = new HashMap<String, String>(); settingsMap.put(TraceConfigConstants.STD_OUT, Boolean.toString(stdoutOutputEnabled)); settingsMap.put(TraceConfigConstants.FILE_OUT, Boolean.toString(fileOutputEnabled)); settingsMap.put(TraceConfigConstants.NET_OUT, Boolean.toString(netOutputEnabled)); return settingsMap; } }