closes #25
diff --git a/weinre.server/src/weinre/server/Channel.java b/weinre.server/src/weinre/server/Channel.java
index 71294d2..11889b2 100644
--- a/weinre.server/src/weinre/server/Channel.java
+++ b/weinre.server/src/weinre/server/Channel.java
@@ -8,6 +8,7 @@
package weinre.server;
import java.io.IOException;
+import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@@ -35,6 +36,7 @@
private Map<String,Object> serviceMap;
private String remoteHost;
private String remoteAddress;
+ private PrintWriter messageLog;
//---------------------------------------------------------------
public Channel(String pathPrefix, String name, String id, String remoteHost, String remoteAddress) {
@@ -49,6 +51,7 @@
this.connector = null;
this.serviceMap = new HashMap<String,Object>();
this.lastRead = System.currentTimeMillis();
+ this.messageLog = Main.getSettings().getMessageLog();
}
//---------------------------------------------------------------
@@ -186,6 +189,7 @@
if (isClosed()) return;
requestQueue.add(json);
+ log(json);
}
//---------------------------------------------------------------
@@ -193,6 +197,24 @@
if (isClosed()) return;
responseQueue.add(json);
+ log(json);
+ }
+
+ //---------------------------------------------------------------
+ private void log(String json) {
+ if (null == messageLog) return;
+
+ JSONObject jObject;
+ try {
+ jObject = new JSONObject(json);
+ jObject.put("_to", getName() + "#" + getId());
+ }
+ catch (JSONException e) {
+ return;
+ }
+
+ messageLog.print(jObject.toString(true));
+ messageLog.println(",");
}
//---------------------------------------------------------------
diff --git a/weinre.server/src/weinre/server/Main.java b/weinre.server/src/weinre/server/Main.java
index 1d8ae96..4968fee 100644
--- a/weinre.server/src/weinre/server/Main.java
+++ b/weinre.server/src/weinre/server/Main.java
@@ -8,6 +8,7 @@
package weinre.server;
import java.io.PrintStream;
+import java.io.PrintWriter;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.log.Log;
@@ -56,6 +57,12 @@
Settings = ServerSettings.getOptions(args);
if (null == Settings) System.exit(0);
+ if (null != Settings.getMessageLog()) {
+ Settings.getMessageLog().println("[");
+ }
+
+ Runtime.getRuntime().addShutdownHook(onShutdownThread());
+
consoleStdout = ConsoleOutputStream.newPrintStream(this, System.out, true);
consoleStderr = ConsoleOutputStream.newPrintStream(this, System.err, false);
@@ -71,6 +78,19 @@
}
//---------------------------------------------------------------
+ private Thread onShutdownThread() {
+ return new Thread(new Runnable() {
+ public void run() {
+ PrintWriter messageLog = Settings.getMessageLog();
+ if (null == messageLog) return;
+
+ messageLog.println("null ]");
+ messageLog.close();
+ }
+ });
+ }
+
+ //---------------------------------------------------------------
public int exit() {
if (null != server) {
try {
diff --git a/weinre.server/src/weinre/server/MessageHandler.java b/weinre.server/src/weinre/server/MessageHandler.java
index 29942b2..bbddc9f 100644
--- a/weinre.server/src/weinre/server/MessageHandler.java
+++ b/weinre.server/src/weinre/server/MessageHandler.java
@@ -7,6 +7,7 @@
package weinre.server;
+import java.io.PrintWriter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
@@ -18,6 +19,7 @@
//-------------------------------------------------------------------
public class MessageHandler {
+ private PrintWriter messageLog;
//---------------------------------------------------------------
static public void start() {
@@ -43,6 +45,7 @@
//---------------------------------------------------------------
private MessageHandler() {
+ messageLog = Main.getSettings().getMessageLog();
}
//---------------------------------------------------------------
@@ -70,6 +73,13 @@
try {
request = acc.getString(i);
accRequest = new JSONObject(request);
+ accRequest.put("_from", channel.getName() + "#" + channel.getId());
+
+ if (null != messageLog) {
+ messageLog.print(accRequest.toString(true));
+ messageLog.println(",");
+ }
+
}
catch (JSONException e) {
Main.warn("error parsing request: " + e + ": '" + request + "'");
diff --git a/weinre.server/src/weinre/server/ServerSettings.java b/weinre.server/src/weinre/server/ServerSettings.java
index b7a63b5..a2c73c7 100644
--- a/weinre.server/src/weinre/server/ServerSettings.java
+++ b/weinre.server/src/weinre/server/ServerSettings.java
@@ -7,6 +7,10 @@
package weinre.server;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
@@ -38,6 +42,7 @@
private int readTimeoutSeconds = 5;
private int deathTimeoutSeconds;
private Properties fileProperties;
+ private PrintWriter messageLog;
//---------------------------------------------------------------
static public ServerSettings getOptions(String[] commandLine) {
@@ -65,6 +70,7 @@
options.addOption("reuseAddr", true, "force bind the port if already bound [true|false]");
options.addOption("readTimeout", true, "seconds before timing out HTTP GETs");
options.addOption("deathTimeout", true, "seconds before considering connector dead");
+ options.addOption("messageLog", true, "file to log messages to");
return options;
}
@@ -126,6 +132,7 @@
reuseAddr = getBooleanFromOption(commandLine, "reuseAddr", reuseAddr);
readTimeoutSeconds = getIntFromOption(commandLine, "readTimeout", readTimeoutSeconds, 0, 0x00FFFFFF);
deathTimeoutSeconds = getIntFromOption(commandLine, "deathTimeout", readTimeoutSeconds*3, 0, 0x00FFFF);
+ messageLog = getPrintWriterFromOption(commandLine, "messageLog");
// handle verbose logging
if (commandLine.hasOption("verbose")) {
@@ -188,7 +195,29 @@
return result;
}
-
+
+ //---------------------------------------------------------------
+ private PrintWriter getPrintWriterFromOption(CommandLine commandLine, String name) {
+
+ String fileName = commandLine.getOptionValue(name);
+ if (null == fileName) {
+ fileName = fileProperties.getProperty(name);
+ }
+
+ if (null == fileName) return null;
+
+ File file = new File(fileName);
+
+ try {
+ FileWriter fileWriter = new FileWriter(file);
+ return new PrintWriter(fileWriter);
+ }
+ catch (IOException e) {
+ error(name + " parameter file name '" + fileName + "' cannot be opened for writing.");
+ return null;
+ }
+ }
+
//---------------------------------------------------------------
private void error(String message) {
System.out.println("error with command-line option: " + message);
@@ -266,7 +295,12 @@
public boolean reuseAddr() {
return reuseAddr;
}
-
+
+ //---------------------------------------------------------------
+ public PrintWriter getMessageLog() {
+ return messageLog;
+ }
+
//---------------------------------------------------------------
public String getNiceHostName() {
String hostName = getBoundHostValue();