use org.json instead of Gson

This commit is contained in:
Naoyuki Kanezawa
2014-04-06 17:48:32 +09:00
parent f44cb0a956
commit 75b57a175f
7 changed files with 64 additions and 68 deletions

View File

@@ -60,9 +60,9 @@
<version>0.2.0-SNAPSHOT</version> <version>0.2.0-SNAPSHOT</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.google.code.gson</groupId> <groupId>org.json</groupId>
<artifactId>gson</artifactId> <artifactId>json</artifactId>
<version>2.2.4</version> <version>20140107</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>junit</groupId> <groupId>junit</groupId>

View File

@@ -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) { Engine(URI uri, Options opts) {
super(uri, opts); super(uri, opts);

View File

@@ -4,9 +4,8 @@ import com.github.nkzawa.emitter.Emitter;
import com.github.nkzawa.socketio.parser.Packet; import com.github.nkzawa.socketio.parser.Packet;
import com.github.nkzawa.socketio.parser.Parser; import com.github.nkzawa.socketio.parser.Parser;
import com.github.nkzawa.thread.EventThread; import com.github.nkzawa.thread.EventThread;
import com.google.gson.Gson; import org.json.JSONArray;
import com.google.gson.JsonArray; import org.json.JSONObject;
import com.google.gson.JsonElement;
import java.util.*; import java.util.*;
import java.util.logging.Logger; 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 Logger logger = Logger.getLogger(Socket.class.getName());
private static final Gson gson = new Gson();
/** /**
* Called on a connection. * Called on a connection.
*/ */
@@ -55,7 +52,7 @@ public class Socket extends Emitter {
private Manager io; private Manager io;
private Map<Integer, Ack> acks = new HashMap<Integer, Ack>(); private Map<Integer, Ack> acks = new HashMap<Integer, Ack>();
private Queue<On.Handle> subs; private Queue<On.Handle> subs;
private final Queue<LinkedList<Object>> buffer = new LinkedList<LinkedList<Object>>(); private final Queue<List<Object>> buffer = new LinkedList<List<Object>>();
public Socket(Manager io, String nsp) { public Socket(Manager io, String nsp) {
@@ -150,7 +147,7 @@ public class Socket extends Emitter {
_args.addAll(Arrays.asList(args)); _args.addAll(Arrays.asList(args));
int parserType = Parser.EVENT; int parserType = Parser.EVENT;
// TODO: hasBin(_args) // 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) { if (_args.get(_args.size() - 1) instanceof Ack) {
logger.fine(String.format("emitting packet with ack id %d", Socket.this.ids)); 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)); 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)); logger.fine(String.format("emitting packet with ack id %d", ids));
Socket.this.acks.put(ids, ack); Socket.this.acks.put(ids, ack);
@@ -249,16 +246,16 @@ public class Socket extends Emitter {
} }
private void onevent(Packet packet) { private void onevent(Packet packet) {
LinkedList<Object> args = new LinkedList<Object>(fromJsonArray(packet.data.getAsJsonArray())); List<Object> args = new ArrayList<Object>(Arrays.asList(toArray((JSONArray) packet.data)));
logger.fine(String.format("emitting event %s", args)); logger.fine(String.format("emitting event %s", args));
if (packet.id >= 0) { if (packet.id >= 0) {
logger.fine("attaching ack callback to event"); logger.fine("attaching ack callback to event");
args.offerLast(this.ack(packet.id)); args.add(this.ack(packet.id));
} }
if (this.connected) { if (this.connected) {
String event = (String)args.pollFirst(); String event = (String)args.remove(0);
super.emit(event, args.toArray()); super.emit(event, args.toArray());
} else { } else {
this.buffer.add(args); this.buffer.add(args);
@@ -274,7 +271,7 @@ public class Socket extends Emitter {
if (sent[0]) return; if (sent[0]) return;
sent[0] = true; sent[0] = true;
logger.fine(String.format("sending ack %s", args)); 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; packet.id = id;
self.packet(packet); self.packet(packet);
} }
@@ -284,7 +281,7 @@ public class Socket extends Emitter {
private void onack(Packet packet) { private void onack(Packet packet) {
logger.fine(String.format("calling ack %s with %s", packet.id, packet.data)); logger.fine(String.format("calling ack %s with %s", packet.id, packet.data));
Ack fn = this.acks.remove(packet.id); Ack fn = this.acks.remove(packet.id);
fn.call(fromJsonArray(packet.data.getAsJsonArray()).toArray()); fn.call(toArray((JSONArray) packet.data));
} }
private void onconnect() { private void onconnect() {
@@ -295,12 +292,10 @@ public class Socket extends Emitter {
} }
private void emitBuffered() { private void emitBuffered() {
synchronized (this.buffer) { List<Object> data;
LinkedList<Object> data; while ((data = this.buffer.poll()) != null) {
while ((data = this.buffer.poll()) != null) { String event = (String)data.get(0);
String event = (String)data.pollFirst(); super.emit(event, data.toArray());
super.emit(event, data.toArray());
}
} }
} }
@@ -349,18 +344,12 @@ public class Socket extends Emitter {
return this.close(); return this.close();
} }
private static JsonArray toJsonArray(List<Object> list) { private static Object[] toArray(JSONArray array) {
JsonArray data = new JsonArray(); int length = array.length();
for (Object v : list) { Object[] data = new Object[length];
data.add(v instanceof JsonElement ? (JsonElement)v : gson.toJsonTree(v)); for (int i = 0; i < length; i++) {
} Object v = array.get(i);
return data; data[i] = v == JSONObject.NULL ? null : v;
}
private static List<Object> fromJsonArray(JsonArray array) {
List<Object> data = new ArrayList<Object>();
for (JsonElement v : array) {
data.add(v.isJsonPrimitive() || v.isJsonNull() ? gson.fromJson(v, Object.class) : v);
} }
return data; return data;
} }

View File

@@ -1,13 +1,12 @@
package com.github.nkzawa.socketio.parser; package com.github.nkzawa.socketio.parser;
import com.google.gson.JsonElement;
public class Packet { public class Packet {
public int type = -1; public int type = -1;
public int id = -1; public int id = -1;
public String nsp; public String nsp;
public JsonElement data; public Object data;
public int attachments; public int attachments;
public Packet() {} public Packet() {}
@@ -16,7 +15,7 @@ public class Packet {
this.type = type; this.type = type;
} }
public Packet(int type, JsonElement data) { public Packet(int type, Object data) {
this.type = type; this.type = type;
this.data = data; this.data = data;
} }

View File

@@ -1,7 +1,8 @@
package com.github.nkzawa.socketio.parser; package com.github.nkzawa.socketio.parser;
import com.github.nkzawa.emitter.Emitter; 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.ArrayList;
import java.util.List; import java.util.List;
@@ -11,9 +12,6 @@ public class Parser {
private static final Logger logger = Logger.getLogger(Parser.class.getName()); 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`. * Packet type `connect`.
*/ */
@@ -62,7 +60,7 @@ public class Parser {
private Parser() {} private Parser() {}
private static Packet error() { 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 (obj.data != null) {
if (nsp) str.append(","); if (nsp) str.append(",");
str.append(gson.toJson(obj.data)); str.append(obj.data);
} }
logger.fine(String.format("encoded %s as %s", obj, str)); logger.fine(String.format("encoded %s as %s", obj, str));
@@ -211,10 +209,10 @@ public class Parser {
try { try {
str.charAt(++i); str.charAt(++i);
p.data = json.parse(str.substring(i)); p.data = new JSONTokener(str.substring(i)).nextValue();
} catch (IndexOutOfBoundsException e) { } catch (IndexOutOfBoundsException e) {
// do nothing // do nothing
} catch (JsonParseException e) { } catch (JSONException e) {
return error(); return error();
} }

View File

@@ -1,7 +1,7 @@
package com.github.nkzawa.socketio.client; package com.github.nkzawa.socketio.client;
import com.github.nkzawa.emitter.Emitter; import com.github.nkzawa.emitter.Emitter;
import com.google.gson.JsonObject; import org.json.JSONObject;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@@ -15,6 +15,7 @@ import java.net.URISyntaxException;
import java.util.concurrent.*; import java.util.concurrent.*;
import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThat;
@RunWith(JUnit4.class) @RunWith(JUnit4.class)
@@ -136,10 +137,10 @@ public class ServerConnectionTest {
@Test(timeout = TIMEOUT) @Test(timeout = TIMEOUT)
public void event() throws URISyntaxException, InterruptedException { public void event() throws URISyntaxException, InterruptedException {
final BlockingQueue<Object[]> events = new LinkedBlockingQueue<Object[]>(); final Semaphore semaphore = new Semaphore(0);
final JsonObject obj = new JsonObject(); final JSONObject obj = new JSONObject();
obj.addProperty("foo", 1); obj.put("foo", 1);
socket = client(); socket = client();
socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() { socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
@@ -150,23 +151,26 @@ public class ServerConnectionTest {
} }
}).on("echoBack", new Emitter.Listener() { }).on("echoBack", new Emitter.Listener() {
@Override @Override
public void call(Object... objects) { public void call(Object... args) {
System.out.println(String.format("echoBack: %s, %s, %s", objects)); System.out.println(String.format("echoBack: %s, %s, %s", args));
events.offer(objects); 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(); socket.connect();
semaphore.acquire();
assertThat(events.take(), is(new Object[] {obj, null, "bar"}));
socket.disconnect();
} }
@Test(timeout = TIMEOUT) @Test(timeout = TIMEOUT)
public void ack() throws URISyntaxException, InterruptedException { public void ack() throws URISyntaxException, InterruptedException {
final BlockingQueue<Object[]> events = new LinkedBlockingQueue<Object[]>(); final Semaphore semaphore = new Semaphore(0);
final JsonObject obj = new JsonObject(); final JSONObject obj = new JSONObject();
obj.addProperty("foo", 1); obj.put("foo", 1);
socket = client(); socket = client();
socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() { socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
@@ -177,15 +181,17 @@ public class ServerConnectionTest {
@Override @Override
public void call(Object... args) { public void call(Object... args) {
System.out.println(String.format("ack: %s, %s", 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(); socket.connect();
semaphore.acquire();
assertThat(events.take(), is(new Object[] {obj, "bar"}));
socket.disconnect();
} }
@Test(timeout = TIMEOUT) @Test(timeout = TIMEOUT)

View File

@@ -1,7 +1,7 @@
package com.github.nkzawa.socketio.parser; package com.github.nkzawa.socketio.parser;
import com.github.nkzawa.emitter.Emitter; import com.github.nkzawa.emitter.Emitter;
import com.google.gson.JsonParser; import org.json.JSONTokener;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.junit.runners.JUnit4; import org.junit.runners.JUnit4;
@@ -32,12 +32,12 @@ public class ParserTest {
@Test @Test
public void event() { public void event() {
Packet packet1 = new Packet(Parser.EVENT); Packet packet1 = new Packet(Parser.EVENT);
packet1.data = new JsonParser().parse("[\"a\", 1, {}]"); packet1.data = new JSONTokener("[\"a\", 1, {}]").nextValue();
packet1.nsp = "/"; packet1.nsp = "/";
test(packet1); test(packet1);
Packet packet2 = new Packet(Parser.EVENT); Packet packet2 = new Packet(Parser.EVENT);
packet2.data = new JsonParser().parse("[\"a\", 1, {}]"); packet2.data = new JSONTokener("[\"a\", 1, {}]").nextValue();
packet2.nsp = "/test"; packet2.nsp = "/test";
test(packet2); test(packet2);
} }
@@ -45,7 +45,7 @@ public class ParserTest {
@Test @Test
public void ack() { public void ack() {
Packet packet = new Packet(Parser.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.id = 123;
packet.nsp = "/"; packet.nsp = "/";
test(packet); test(packet);
@@ -62,7 +62,11 @@ public class ParserTest {
Packet packet = (Packet)args[0]; Packet packet = (Packet)args[0];
assertThat(packet.type, is(obj.type)); assertThat(packet.type, is(obj.type));
assertThat(packet.id, is(obj.id)); 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.nsp, is(obj.nsp));
assertThat(packet.attachments, is(obj.attachments)); assertThat(packet.attachments, is(obj.attachments));
} }