From 75b57a175f2a1619ff971462780866e80324f31d Mon Sep 17 00:00:00 2001 From: Naoyuki Kanezawa Date: Sun, 6 Apr 2014 17:48:32 +0900 Subject: [PATCH] use org.json instead of Gson --- pom.xml | 6 +-- .../nkzawa/socketio/client/Manager.java | 2 +- .../github/nkzawa/socketio/client/Socket.java | 51 ++++++++----------- .../github/nkzawa/socketio/parser/Packet.java | 5 +- .../github/nkzawa/socketio/parser/Parser.java | 14 +++-- .../socketio/client/ServerConnectionTest.java | 40 ++++++++------- .../nkzawa/socketio/parser/ParserTest.java | 14 +++-- 7 files changed, 64 insertions(+), 68 deletions(-) diff --git a/pom.xml b/pom.xml index 8205605..0464346 100644 --- a/pom.xml +++ b/pom.xml @@ -60,9 +60,9 @@ 0.2.0-SNAPSHOT - com.google.code.gson - gson - 2.2.4 + org.json + json + 20140107 junit diff --git a/src/main/java/com/github/nkzawa/socketio/client/Manager.java b/src/main/java/com/github/nkzawa/socketio/client/Manager.java index 7922e75..c98a241 100644 --- a/src/main/java/com/github/nkzawa/socketio/client/Manager.java +++ b/src/main/java/com/github/nkzawa/socketio/client/Manager.java @@ -454,7 +454,7 @@ public class Manager extends Emitter { } - private class Engine extends com.github.nkzawa.engineio.client.Socket { + private static class Engine extends com.github.nkzawa.engineio.client.Socket { Engine(URI uri, Options opts) { super(uri, opts); diff --git a/src/main/java/com/github/nkzawa/socketio/client/Socket.java b/src/main/java/com/github/nkzawa/socketio/client/Socket.java index 6d15a48..706ac57 100644 --- a/src/main/java/com/github/nkzawa/socketio/client/Socket.java +++ b/src/main/java/com/github/nkzawa/socketio/client/Socket.java @@ -4,9 +4,8 @@ import com.github.nkzawa.emitter.Emitter; import com.github.nkzawa.socketio.parser.Packet; import com.github.nkzawa.socketio.parser.Parser; import com.github.nkzawa.thread.EventThread; -import com.google.gson.Gson; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; +import org.json.JSONArray; +import org.json.JSONObject; import java.util.*; import java.util.logging.Logger; @@ -18,8 +17,6 @@ public class Socket extends Emitter { private static final Logger logger = Logger.getLogger(Socket.class.getName()); - private static final Gson gson = new Gson(); - /** * Called on a connection. */ @@ -55,7 +52,7 @@ public class Socket extends Emitter { private Manager io; private Map acks = new HashMap(); private Queue subs; - private final Queue> buffer = new LinkedList>(); + private final Queue> buffer = new LinkedList>(); public Socket(Manager io, String nsp) { @@ -150,7 +147,7 @@ public class Socket extends Emitter { _args.addAll(Arrays.asList(args)); int parserType = Parser.EVENT; // TODO: hasBin(_args) - Packet packet = new Packet(parserType, toJsonArray(_args)); + Packet packet = new Packet(parserType, new JSONArray(_args)); if (_args.get(_args.size() - 1) instanceof Ack) { logger.fine(String.format("emitting packet with ack id %d", Socket.this.ids)); @@ -182,7 +179,7 @@ public class Socket extends Emitter { addAll(Arrays.asList(args)); } }}; - Packet packet = new Packet(Parser.EVENT, toJsonArray(_args)); + Packet packet = new Packet(Parser.EVENT, new JSONArray(_args)); logger.fine(String.format("emitting packet with ack id %d", ids)); Socket.this.acks.put(ids, ack); @@ -249,16 +246,16 @@ public class Socket extends Emitter { } private void onevent(Packet packet) { - LinkedList args = new LinkedList(fromJsonArray(packet.data.getAsJsonArray())); + List args = new ArrayList(Arrays.asList(toArray((JSONArray) packet.data))); logger.fine(String.format("emitting event %s", args)); if (packet.id >= 0) { logger.fine("attaching ack callback to event"); - args.offerLast(this.ack(packet.id)); + args.add(this.ack(packet.id)); } if (this.connected) { - String event = (String)args.pollFirst(); + String event = (String)args.remove(0); super.emit(event, args.toArray()); } else { this.buffer.add(args); @@ -274,7 +271,7 @@ public class Socket extends Emitter { if (sent[0]) return; sent[0] = true; logger.fine(String.format("sending ack %s", args)); - Packet packet = new Packet(Parser.ACK, gson.toJsonTree(args)); + Packet packet = new Packet(Parser.ACK, new JSONArray(args)); packet.id = id; self.packet(packet); } @@ -284,7 +281,7 @@ public class Socket extends Emitter { private void onack(Packet packet) { logger.fine(String.format("calling ack %s with %s", packet.id, packet.data)); Ack fn = this.acks.remove(packet.id); - fn.call(fromJsonArray(packet.data.getAsJsonArray()).toArray()); + fn.call(toArray((JSONArray) packet.data)); } private void onconnect() { @@ -295,12 +292,10 @@ public class Socket extends Emitter { } private void emitBuffered() { - synchronized (this.buffer) { - LinkedList data; - while ((data = this.buffer.poll()) != null) { - String event = (String)data.pollFirst(); - super.emit(event, data.toArray()); - } + List data; + while ((data = this.buffer.poll()) != null) { + String event = (String)data.get(0); + super.emit(event, data.toArray()); } } @@ -349,18 +344,12 @@ public class Socket extends Emitter { return this.close(); } - private static JsonArray toJsonArray(List list) { - JsonArray data = new JsonArray(); - for (Object v : list) { - data.add(v instanceof JsonElement ? (JsonElement)v : gson.toJsonTree(v)); - } - return data; - } - - private static List fromJsonArray(JsonArray array) { - List data = new ArrayList(); - for (JsonElement v : array) { - data.add(v.isJsonPrimitive() || v.isJsonNull() ? gson.fromJson(v, Object.class) : v); + private static Object[] toArray(JSONArray array) { + int length = array.length(); + Object[] data = new Object[length]; + for (int i = 0; i < length; i++) { + Object v = array.get(i); + data[i] = v == JSONObject.NULL ? null : v; } return data; } diff --git a/src/main/java/com/github/nkzawa/socketio/parser/Packet.java b/src/main/java/com/github/nkzawa/socketio/parser/Packet.java index 9adffb4..20ed7a9 100644 --- a/src/main/java/com/github/nkzawa/socketio/parser/Packet.java +++ b/src/main/java/com/github/nkzawa/socketio/parser/Packet.java @@ -1,13 +1,12 @@ package com.github.nkzawa.socketio.parser; -import com.google.gson.JsonElement; public class Packet { public int type = -1; public int id = -1; public String nsp; - public JsonElement data; + public Object data; public int attachments; public Packet() {} @@ -16,7 +15,7 @@ public class Packet { this.type = type; } - public Packet(int type, JsonElement data) { + public Packet(int type, Object data) { this.type = type; this.data = data; } diff --git a/src/main/java/com/github/nkzawa/socketio/parser/Parser.java b/src/main/java/com/github/nkzawa/socketio/parser/Parser.java index cfb33f7..806ec1c 100644 --- a/src/main/java/com/github/nkzawa/socketio/parser/Parser.java +++ b/src/main/java/com/github/nkzawa/socketio/parser/Parser.java @@ -1,7 +1,8 @@ package com.github.nkzawa.socketio.parser; import com.github.nkzawa.emitter.Emitter; -import com.google.gson.*; +import org.json.JSONException; +import org.json.JSONTokener; import java.util.ArrayList; import java.util.List; @@ -11,9 +12,6 @@ public class Parser { private static final Logger logger = Logger.getLogger(Parser.class.getName()); - private static final Gson gson = new Gson(); - private static final JsonParser json = new JsonParser(); - /** * Packet type `connect`. */ @@ -62,7 +60,7 @@ public class Parser { private Parser() {} private static Packet error() { - return new Packet(ERROR, new JsonPrimitive("parser error")); + return new Packet(ERROR, "parser error"); } @@ -107,7 +105,7 @@ public class Parser { if (obj.data != null) { if (nsp) str.append(","); - str.append(gson.toJson(obj.data)); + str.append(obj.data); } logger.fine(String.format("encoded %s as %s", obj, str)); @@ -211,10 +209,10 @@ public class Parser { try { str.charAt(++i); - p.data = json.parse(str.substring(i)); + p.data = new JSONTokener(str.substring(i)).nextValue(); } catch (IndexOutOfBoundsException e) { // do nothing - } catch (JsonParseException e) { + } catch (JSONException e) { return error(); } diff --git a/src/test/java/com/github/nkzawa/socketio/client/ServerConnectionTest.java b/src/test/java/com/github/nkzawa/socketio/client/ServerConnectionTest.java index 7ba504a..91f8e55 100644 --- a/src/test/java/com/github/nkzawa/socketio/client/ServerConnectionTest.java +++ b/src/test/java/com/github/nkzawa/socketio/client/ServerConnectionTest.java @@ -1,7 +1,7 @@ package com.github.nkzawa.socketio.client; import com.github.nkzawa.emitter.Emitter; -import com.google.gson.JsonObject; +import org.json.JSONObject; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -15,6 +15,7 @@ import java.net.URISyntaxException; import java.util.concurrent.*; import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.nullValue; import static org.junit.Assert.assertThat; @RunWith(JUnit4.class) @@ -136,10 +137,10 @@ public class ServerConnectionTest { @Test(timeout = TIMEOUT) public void event() throws URISyntaxException, InterruptedException { - final BlockingQueue events = new LinkedBlockingQueue(); + final Semaphore semaphore = new Semaphore(0); - final JsonObject obj = new JsonObject(); - obj.addProperty("foo", 1); + final JSONObject obj = new JSONObject(); + obj.put("foo", 1); socket = client(); socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() { @@ -150,23 +151,26 @@ public class ServerConnectionTest { } }).on("echoBack", new Emitter.Listener() { @Override - public void call(Object... objects) { - System.out.println(String.format("echoBack: %s, %s, %s", objects)); - events.offer(objects); + public void call(Object... args) { + System.out.println(String.format("echoBack: %s, %s, %s", args)); + assertThat(args.length, is(3)); + assertThat(args[0].toString(), is(obj.toString())); + assertThat(args[1], is(nullValue())); + assertThat((String)args[2], is("bar")); + socket.disconnect(); + semaphore.release(); } }); socket.connect(); - - assertThat(events.take(), is(new Object[] {obj, null, "bar"})); - socket.disconnect(); + semaphore.acquire(); } @Test(timeout = TIMEOUT) public void ack() throws URISyntaxException, InterruptedException { - final BlockingQueue events = new LinkedBlockingQueue(); + final Semaphore semaphore = new Semaphore(0); - final JsonObject obj = new JsonObject(); - obj.addProperty("foo", 1); + final JSONObject obj = new JSONObject(); + obj.put("foo", 1); socket = client(); socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() { @@ -177,15 +181,17 @@ public class ServerConnectionTest { @Override public void call(Object... args) { System.out.println(String.format("ack: %s, %s", args)); - events.offer(args); + assertThat(args.length, is(2)); + assertThat(args[0].toString(), is(obj.toString())); + assertThat((String)args[1], is("bar")); + socket.disconnect(); + semaphore.release(); } }); } }); socket.connect(); - - assertThat(events.take(), is(new Object[] {obj, "bar"})); - socket.disconnect(); + semaphore.acquire(); } @Test(timeout = TIMEOUT) diff --git a/src/test/java/com/github/nkzawa/socketio/parser/ParserTest.java b/src/test/java/com/github/nkzawa/socketio/parser/ParserTest.java index 2cb0288..a637587 100644 --- a/src/test/java/com/github/nkzawa/socketio/parser/ParserTest.java +++ b/src/test/java/com/github/nkzawa/socketio/parser/ParserTest.java @@ -1,7 +1,7 @@ package com.github.nkzawa.socketio.parser; import com.github.nkzawa.emitter.Emitter; -import com.google.gson.JsonParser; +import org.json.JSONTokener; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -32,12 +32,12 @@ public class ParserTest { @Test public void event() { Packet packet1 = new Packet(Parser.EVENT); - packet1.data = new JsonParser().parse("[\"a\", 1, {}]"); + packet1.data = new JSONTokener("[\"a\", 1, {}]").nextValue(); packet1.nsp = "/"; test(packet1); Packet packet2 = new Packet(Parser.EVENT); - packet2.data = new JsonParser().parse("[\"a\", 1, {}]"); + packet2.data = new JSONTokener("[\"a\", 1, {}]").nextValue(); packet2.nsp = "/test"; test(packet2); } @@ -45,7 +45,7 @@ public class ParserTest { @Test public void ack() { Packet packet = new Packet(Parser.ACK); - packet.data = new JsonParser().parse("[\"a\", 1, {}]"); + packet.data = new JSONTokener("[\"a\", 1, {}]").nextValue(); packet.id = 123; packet.nsp = "/"; test(packet); @@ -62,7 +62,11 @@ public class ParserTest { Packet packet = (Packet)args[0]; assertThat(packet.type, is(obj.type)); assertThat(packet.id, is(obj.id)); - assertThat(packet.data, is(obj.data)); + if (packet.data == null) { + assertThat(packet.data, is(obj.data)); + } else { + assertThat(packet.data.toString(), is(obj.data.toString())); + } assertThat(packet.nsp, is(obj.nsp)); assertThat(packet.attachments, is(obj.attachments)); }