diff --git a/src/zutil/net/mqtt/MqttBroker.java b/src/zutil/net/mqtt/MqttBroker.java index ad8262f..846ee54 100755 --- a/src/zutil/net/mqtt/MqttBroker.java +++ b/src/zutil/net/mqtt/MqttBroker.java @@ -200,6 +200,7 @@ public class MqttBroker extends ThreadedTCPNetworkServer { private Socket socket; private BinaryStructInputStream in; private BinaryStructOutputStream out; + private String clientId; private boolean disconnected = false; /** A message that should be sent in case the connection to client is abnormally disconnected */ @@ -217,6 +218,7 @@ public class MqttBroker extends ThreadedTCPNetworkServer { public MqttConnectionThread(MqttBroker b, Socket s) throws IOException { this(b); socket = s; + clientId = socket.getInetAddress().toString(); InputStream baseInputstream = socket.getInputStream(); if (!baseInputstream.markSupported()) @@ -352,7 +354,7 @@ public class MqttBroker extends ThreadedTCPNetworkServer { // Close connection default: - logger.warning("[" + socket.getInetAddress() + "] Received unknown packet type: " + packet.type + " (" + packet.getClass() + ")"); + logger.warning("[" + clientId + "] Received unknown packet type: " + packet.type + " (" + packet.getClass() + ")"); sendWillPacket(); /* FALLTHROUGH */ case MqttPacketHeader.PACKET_TYPE_DISCONNECT: @@ -367,7 +369,7 @@ public class MqttBroker extends ThreadedTCPNetworkServer { if (publishPacket.getFlagQoS() != 0) throw new UnsupportedOperationException("QoS larger then 0 not supported."); - logger.finer("[" + socket.getInetAddress() + "] Publishing to topic: " + publishPacket.topicName); + logger.finer("[" + clientId + "] Publishing to topic: " + publishPacket.topicName); broker.publish(publishPacket.topicName, publishPacket.payload); } @@ -376,7 +378,7 @@ public class MqttBroker extends ThreadedTCPNetworkServer { subscribeAckPacket.packetId = subscribePacket.packetId; for (MqttSubscribePayload payload : subscribePacket.payloads) { - logger.finer("[" + socket.getInetAddress() + "] Subscribing to topic: " + payload.topicFilter); + logger.finer("[" + clientId + "] Subscribing to topic: " + payload.topicFilter); broker.subscribe(payload.topicFilter, this); // Prepare response @@ -390,7 +392,7 @@ public class MqttBroker extends ThreadedTCPNetworkServer { private void handleUnsubscribe(MqttPacketUnsubscribe unsubscribePacket) throws IOException { for (MqttUnsubscribePayload payload : unsubscribePacket.payloads) { - logger.finer("[" + socket.getInetAddress() + "] Unsubscribing from topic: " + payload.topicFilter); + logger.finer("[" + clientId + "] Unsubscribing from topic: " + payload.topicFilter); broker.unsubscribe(payload.topicFilter, this); } @@ -408,7 +410,7 @@ public class MqttBroker extends ThreadedTCPNetworkServer { private void sendWillPacket() throws IOException { if (willPacket != null) { - logger.fine("[" + socket.getInetAddress() + "] Publishing will packet."); + logger.fine("[" + clientId + "] Publishing will packet."); sendPacket(willPacket); willPacket = null; } diff --git a/src/zutil/parser/json/JSONParser.java b/src/zutil/parser/json/JSONParser.java index 49ec678..a3fdeff 100755 --- a/src/zutil/parser/json/JSONParser.java +++ b/src/zutil/parser/json/JSONParser.java @@ -128,15 +128,19 @@ public class JSONParser extends Parser { } end.i = CONTINUE; break; - // Parse String - // TODO: Support double backslash escaping + // Parse quoted String case '\"': case '\'': root = new DataNode(DataType.String); StringBuilder str = new StringBuilder(); int c2; - while ((c2=in.read()) >= 0 && c2 != c) + while ((c2=in.read()) >= 0 && c2 != c) { + // Ignore the character check for next char as current char is \ escape + if (c2 == '\\') + c2 = in.read(); + str.append((char) c2); + } root.set(str.toString()); break; // Parse unknown type @@ -147,7 +151,10 @@ public class JSONParser extends Parser { end.i = END_WITH_VALUE; break; } - tmp.append((char)c); + if (c == '\\') + c = in.read(); + + tmp.append((char) c); } // Check what type of type the data is String data = tmp.toString().trim(); diff --git a/src/zutil/parser/json/JSONWriter.java b/src/zutil/parser/json/JSONWriter.java index 191e81e..1a11401 100755 --- a/src/zutil/parser/json/JSONWriter.java +++ b/src/zutil/parser/json/JSONWriter.java @@ -34,11 +34,11 @@ import java.io.Writer; import java.util.Iterator; /** - * Writes An JSONNode to an String or stream + * Writes An JSONNode to a String or stream * * @author Ziver */ -public class JSONWriter{ +public class JSONWriter { private PrintWriter out; /** diff --git a/test/zutil/parser/json/JSONParserTest.java b/test/zutil/parser/json/JSONParserTest.java index 33f242f..9509a56 100755 --- a/test/zutil/parser/json/JSONParserTest.java +++ b/test/zutil/parser/json/JSONParserTest.java @@ -92,13 +92,27 @@ public class JSONParserTest { } @Test - public void valueStringNoQuotes(){ + public void valueString(){ DataNode data = JSONParser.read("teststring"); assert(data.isValue()); assertEquals( DataType.String, data.getType()); assertEquals( "teststring", data.getString()); } + @Test + public void valueStringWithQuotes(){ + DataNode data = JSONParser.read("aa \\\"bb\\\" cc"); + + assert(data.isValue()); + assertEquals( DataType.String, data.getType()); + assertEquals( "aa \"bb\" cc", data.getString()); + + data = JSONParser.read("{\"test_key\": \"aa \\\"bb\\\" cc\"}"); + + assertEquals( DataType.String, data.get("test_key").getType()); + assertEquals( "aa \"bb\" cc", data.get("test_key").getString()); + } + @Test public void toManyCommasInList(){ DataNode data = JSONParser.read("[1,2,3,]"); diff --git a/test/zutil/parser/json/JSONWriterTest.java b/test/zutil/parser/json/JSONWriterTest.java new file mode 100644 index 0000000..fb95306 --- /dev/null +++ b/test/zutil/parser/json/JSONWriterTest.java @@ -0,0 +1,22 @@ +package zutil.parser.json; + +import org.junit.Test; +import zutil.parser.DataNode; + +import static org.junit.Assert.*; + +public class JSONWriterTest { + + @Test + public void emptyNodes() { + assertEquals("{}", JSONWriter.toString(new DataNode(DataNode.DataType.Map))); + assertEquals("[]", JSONWriter.toString(new DataNode(DataNode.DataType.List))); + } + + @Test + public void escapeQuotes() { + DataNode node = new DataNode(DataNode.DataType.List); + node.add("aa \"bb\" cc"); + assertEquals("[\"aa \\\"bb\\\" cc\"]", JSONWriter.toString(node)); + } +} \ No newline at end of file