Browse Source

Ability to use another json encoder/decoder. Issue #10

master
Nikita 13 years ago
parent
commit
9b822c1e74
  1. 16
      src/main/java/com/corundumstudio/socketio/Configuration.java
  2. 8
      src/main/java/com/corundumstudio/socketio/SocketIOPipelineFactory.java
  3. 2
      src/main/java/com/corundumstudio/socketio/SocketIOServer.java
  4. 13
      src/main/java/com/corundumstudio/socketio/parser/Decoder.java
  5. 20
      src/main/java/com/corundumstudio/socketio/parser/Encoder.java
  6. 49
      src/main/java/com/corundumstudio/socketio/parser/JacksonJsonSupport.java
  7. 30
      src/main/java/com/corundumstudio/socketio/parser/JsonSupport.java
  8. 5
      src/test/java/com/corundumstudio/socketio/PacketHandlerTest.java
  9. 5
      src/test/java/com/corundumstudio/socketio/parser/DecoderAckPacketTest.java
  10. 23
      src/test/java/com/corundumstudio/socketio/parser/DecoderBaseTest.java
  11. 5
      src/test/java/com/corundumstudio/socketio/parser/DecoderConnectionPacketTest.java
  12. 5
      src/test/java/com/corundumstudio/socketio/parser/DecoderErrorPacketTest.java
  13. 5
      src/test/java/com/corundumstudio/socketio/parser/DecoderEventPacketTest.java
  14. 5
      src/test/java/com/corundumstudio/socketio/parser/DecoderJsonPacketTest.java
  15. 5
      src/test/java/com/corundumstudio/socketio/parser/DecoderMessagePacketTest.java
  16. 5
      src/test/java/com/corundumstudio/socketio/parser/EncoderAckPacketTest.java
  17. 22
      src/test/java/com/corundumstudio/socketio/parser/EncoderBaseTest.java
  18. 5
      src/test/java/com/corundumstudio/socketio/parser/EncoderConnectionPacketTest.java
  19. 5
      src/test/java/com/corundumstudio/socketio/parser/EncoderErrorPacketTest.java
  20. 12
      src/test/java/com/corundumstudio/socketio/parser/EncoderEventPacketTest.java
  21. 5
      src/test/java/com/corundumstudio/socketio/parser/EncoderJsonPacketTest.java
  22. 5
      src/test/java/com/corundumstudio/socketio/parser/EncoderMessagePacketTest.java
  23. 5
      src/test/java/com/corundumstudio/socketio/parser/PayloadTest.java

16
src/main/java/com/corundumstudio/socketio/Configuration.java

@ -18,7 +18,8 @@ package com.corundumstudio.socketio;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import org.codehaus.jackson.map.ObjectMapper;
import com.corundumstudio.socketio.parser.JacksonJsonSupport;
import com.corundumstudio.socketio.parser.JsonSupport;
public class Configuration {
@ -39,7 +40,7 @@ public class Configuration {
private String hostname;
private int port;
private ObjectMapper objectMapper = new ObjectMapper();
private JsonSupport jsonSupport = new JacksonJsonSupport();
public Configuration() {
}
@ -56,18 +57,19 @@ public class Configuration {
setHeartbeatThreadPoolSize(conf.getHeartbeatThreadPoolSize());
setHeartbeatTimeout(conf.getHeartbeatTimeout());
setHostname(conf.getHostname());
setObjectMapper(conf.getObjectMapper());
setJsonSupport(conf.getJsonSupport());
setPort(conf.getPort());
setWorkerExecutor(conf.getWorkerExecutor());
setContext(conf.getContext());
setAllowCustomRequests(conf.isAllowCustomRequests());
setPollingDuration(conf.getPollingDuration());
}
public ObjectMapper getObjectMapper() {
return objectMapper;
public JsonSupport getJsonSupport() {
return jsonSupport;
}
public void setObjectMapper(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
public void setJsonSupport(JsonSupport jsonSupport) {
this.jsonSupport = jsonSupport;
}
public String getHostname() {

8
src/main/java/com/corundumstudio/socketio/SocketIOPipelineFactory.java

@ -17,7 +17,6 @@ package com.corundumstudio.socketio;
import static org.jboss.netty.channel.Channels.pipeline;
import org.codehaus.jackson.map.ObjectMapper;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.handler.codec.http.HttpChunkAggregator;
@ -29,6 +28,7 @@ import org.slf4j.LoggerFactory;
import com.corundumstudio.socketio.namespace.NamespacesHub;
import com.corundumstudio.socketio.parser.Decoder;
import com.corundumstudio.socketio.parser.Encoder;
import com.corundumstudio.socketio.parser.JsonSupport;
import com.corundumstudio.socketio.scheduler.CancelableScheduler;
import com.corundumstudio.socketio.transport.BaseClient;
import com.corundumstudio.socketio.transport.WebSocketTransport;
@ -64,9 +64,9 @@ public class SocketIOPipelineFactory implements ChannelPipelineFactory, Disconne
public void start(Configuration configuration, NamespacesHub namespacesHub) {
scheduler = new CancelableScheduler(configuration.getHeartbeatThreadPoolSize());
ObjectMapper objectMapper = configuration.getObjectMapper();
Encoder encoder = new Encoder(objectMapper);
Decoder decoder = new Decoder(objectMapper);
JsonSupport jsonSupport = configuration.getJsonSupport();
Encoder encoder = new Encoder(jsonSupport);
Decoder decoder = new Decoder(jsonSupport);
ackManager = new AckManager(scheduler);
heartbeatHandler = new HeartbeatHandler(configuration, scheduler);

2
src/main/java/com/corundumstudio/socketio/SocketIOServer.java

@ -17,7 +17,6 @@ package com.corundumstudio.socketio;
import java.net.InetSocketAddress;
import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelFactory;
@ -49,7 +48,6 @@ public class SocketIOServer implements ClientListeners {
public SocketIOServer(Configuration configuration) {
this.config = new Configuration(configuration);
this.config.getObjectMapper().setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
mainNamespace = addNamespace(Namespace.DEFAULT_NAME);
}

13
src/main/java/com/corundumstudio/socketio/parser/Decoder.java

@ -18,7 +18,6 @@ package com.corundumstudio.socketio.parser;
import java.io.IOException;
import java.util.List;
import org.codehaus.jackson.map.ObjectMapper;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBufferIndexFinder;
import org.jboss.netty.buffer.ChannelBufferInputStream;
@ -38,10 +37,10 @@ public class Decoder {
}
};
private final ObjectMapper objectMapper;
private final JsonSupport jsonSupport;
public Decoder(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
public Decoder(JsonSupport jsonSupport) {
this.jsonSupport = jsonSupport;
}
// fastest way to parse chars to int
@ -154,7 +153,7 @@ public class Decoder {
case EVENT: {
ChannelBufferInputStream in = new ChannelBufferInputStream(buffer);
Event event = objectMapper.readValue(in, Event.class);
Event event = jsonSupport.readValue(in, Event.class);
packet.setName(event.getName());
if (event.getArgs() != null) {
packet.setArgs(event.getArgs());
@ -164,7 +163,7 @@ public class Decoder {
case JSON: {
ChannelBufferInputStream in = new ChannelBufferInputStream(buffer);
Object obj = objectMapper.readValue(in, Object.class);
Object obj = jsonSupport.readValue(in, Object.class);
packet.setData(obj);
break;
}
@ -206,7 +205,7 @@ public class Decoder {
buffer.readerIndex(plusIndex+1);
ChannelBufferInputStream in = new ChannelBufferInputStream(buffer);
List<Object> args = objectMapper.readValue(in, List.class);
List<Object> args = jsonSupport.readValue(in, List.class);
packet.setArgs(args);
}
break;

20
src/main/java/com/corundumstudio/socketio/parser/Encoder.java

@ -19,7 +19,6 @@ import java.io.IOException;
import java.util.List;
import java.util.Queue;
import org.codehaus.jackson.map.ObjectMapper;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBufferOutputStream;
import org.jboss.netty.buffer.ChannelBuffers;
@ -27,15 +26,15 @@ import org.jboss.netty.buffer.ChannelBuffers;
public class Encoder {
private final UTF8CharsScanner charsScanner = new UTF8CharsScanner();
private final ObjectMapper objectMapper;
private final JsonSupport jsonSupport;
public Encoder(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
public Encoder(JsonSupport jsonSupport) {
this.jsonSupport = jsonSupport;
}
public ChannelBuffer encodeJsonP(String param, String msg) throws IOException {
String message = "io.j[" + param + "]("
+ objectMapper.writeValueAsString(msg) + ");";
+ jsonSupport.writeValueAsString(msg) + ");";
return ChannelBuffers.wrappedBuffer(message.getBytes());
}
@ -48,11 +47,8 @@ public class Encoder {
public ChannelBuffer encodePackets(Queue<Packet> packets) throws IOException {
if (packets.size() == 1) {
ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
ChannelBufferOutputStream out = new ChannelBufferOutputStream(buffer);
Packet packet = packets.poll();
encodePacket(packet, out);
return buffer;
return encodePacket(packet);
} else {
ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
while (true) {
@ -191,12 +187,12 @@ public class Encoder {
}
buffer.writeByte(Packet.SEPARATOR);
Event event = new Event(packet.getName(), args);
objectMapper.writeValue(out, event);
jsonSupport.writeValue(out, event);
break;
case JSON:
buffer.writeByte(Packet.SEPARATOR);
objectMapper.writeValue(out, packet.getData());
jsonSupport.writeValue(out, packet.getData());
break;
case CONNECT:
@ -217,7 +213,7 @@ public class Encoder {
}
if (!packet.getArgs().isEmpty()) {
buffer.writeByte('+');
objectMapper.writeValue(out, packet.getArgs());
jsonSupport.writeValue(out, packet.getArgs());
}
break;

49
src/main/java/com/corundumstudio/socketio/parser/JacksonJsonSupport.java

@ -0,0 +1,49 @@
/**
* Copyright 2012 Nikita Koksharov
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.corundumstudio.socketio.parser;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.annotate.JsonSerialize;
public class JacksonJsonSupport implements JsonSupport {
private final ObjectMapper objectMapper = new ObjectMapper();
public JacksonJsonSupport() {
objectMapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
}
@Override
public <T> T readValue(InputStream src, Class<T> valueType) throws IOException {
return objectMapper.readValue(src, valueType);
}
@Override
public void writeValue(OutputStream out, Object value) throws IOException {
objectMapper.writeValue(out, value);
}
@Override
public String writeValueAsString(Object value) throws IOException {
return objectMapper.writeValueAsString(value);
}
}

30
src/main/java/com/corundumstudio/socketio/parser/JsonSupport.java

@ -0,0 +1,30 @@
/**
* Copyright 2012 Nikita Koksharov
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.corundumstudio.socketio.parser;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public interface JsonSupport {
<T> T readValue(InputStream src, Class<T> valueType) throws IOException;
void writeValue(OutputStream out, Object value) throws IOException;
String writeValueAsString(Object value) throws IOException;
}

5
src/test/java/com/corundumstudio/socketio/PacketHandlerTest.java

@ -25,7 +25,6 @@ import java.util.concurrent.atomic.AtomicInteger;
import junit.framework.Assert;
import mockit.Mocked;
import org.codehaus.jackson.map.ObjectMapper;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import org.jboss.netty.channel.Channel;
@ -38,13 +37,15 @@ import com.corundumstudio.socketio.namespace.Namespace;
import com.corundumstudio.socketio.namespace.NamespacesHub;
import com.corundumstudio.socketio.parser.Decoder;
import com.corundumstudio.socketio.parser.Encoder;
import com.corundumstudio.socketio.parser.JacksonJsonSupport;
import com.corundumstudio.socketio.parser.JsonSupport;
import com.corundumstudio.socketio.parser.Packet;
import com.corundumstudio.socketio.parser.PacketType;
import com.corundumstudio.socketio.transport.BaseClient;
public class PacketHandlerTest {
private ObjectMapper map = new ObjectMapper();
private JsonSupport map = new JacksonJsonSupport();
private Decoder decoder = new Decoder(map);
private Encoder encoder = new Encoder(map);
private NamespacesHub namespacesHub = new NamespacesHub();

5
src/test/java/com/corundumstudio/socketio/parser/DecoderAckPacketTest.java

@ -19,13 +19,10 @@ import java.io.IOException;
import java.util.Arrays;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.junit.Assert;
import org.junit.Test;
public class DecoderAckPacketTest {
private final Decoder decoder = new Decoder(new ObjectMapper());
public class DecoderAckPacketTest extends DecoderBaseTest {
@Test
public void testDecode() throws IOException {

23
src/test/java/com/corundumstudio/socketio/parser/DecoderBaseTest.java

@ -0,0 +1,23 @@
/**
* Copyright 2012 Nikita Koksharov
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.corundumstudio.socketio.parser;
public class DecoderBaseTest {
protected final Decoder decoder = new Decoder(new JacksonJsonSupport());
}

5
src/test/java/com/corundumstudio/socketio/parser/DecoderConnectionPacketTest.java

@ -17,13 +17,10 @@ package com.corundumstudio.socketio.parser;
import java.io.IOException;
import org.codehaus.jackson.map.ObjectMapper;
import org.junit.Assert;
import org.junit.Test;
public class DecoderConnectionPacketTest {
private final Decoder decoder = new Decoder(new ObjectMapper());
public class DecoderConnectionPacketTest extends DecoderBaseTest {
@Test
public void testDecodeHeartbeat() throws IOException {

5
src/test/java/com/corundumstudio/socketio/parser/DecoderErrorPacketTest.java

@ -17,13 +17,10 @@ package com.corundumstudio.socketio.parser;
import java.io.IOException;
import org.codehaus.jackson.map.ObjectMapper;
import org.junit.Assert;
import org.junit.Test;
public class DecoderErrorPacketTest {
private final Decoder decoder = new Decoder(new ObjectMapper());
public class DecoderErrorPacketTest extends DecoderBaseTest {
@Test
public void testDecode() throws IOException {

5
src/test/java/com/corundumstudio/socketio/parser/DecoderEventPacketTest.java

@ -18,13 +18,10 @@ package com.corundumstudio.socketio.parser;
import java.io.IOException;
import java.util.Map;
import org.codehaus.jackson.map.ObjectMapper;
import org.junit.Assert;
import org.junit.Test;
public class DecoderEventPacketTest {
private final Decoder decoder = new Decoder(new ObjectMapper());
public class DecoderEventPacketTest extends DecoderBaseTest {
@Test
public void testDecode() throws IOException {

5
src/test/java/com/corundumstudio/socketio/parser/DecoderJsonPacketTest.java

@ -18,13 +18,10 @@ package com.corundumstudio.socketio.parser;
import java.io.IOException;
import java.util.Map;
import org.codehaus.jackson.map.ObjectMapper;
import org.junit.Assert;
import org.junit.Test;
public class DecoderJsonPacketTest {
private final Decoder decoder = new Decoder(new ObjectMapper());
public class DecoderJsonPacketTest extends DecoderBaseTest {
@Test
public void testUTF8Decode() throws IOException {

5
src/test/java/com/corundumstudio/socketio/parser/DecoderMessagePacketTest.java

@ -17,13 +17,10 @@ package com.corundumstudio.socketio.parser;
import java.io.IOException;
import org.codehaus.jackson.map.ObjectMapper;
import org.junit.Assert;
import org.junit.Test;
public class DecoderMessagePacketTest {
private final Decoder decoder = new Decoder(new ObjectMapper());
public class DecoderMessagePacketTest extends DecoderBaseTest {
@Test
public void testDecodeId() throws IOException {

5
src/test/java/com/corundumstudio/socketio/parser/EncoderAckPacketTest.java

@ -18,15 +18,12 @@ package com.corundumstudio.socketio.parser;
import java.io.IOException;
import java.util.Arrays;
import org.codehaus.jackson.map.ObjectMapper;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.util.CharsetUtil;
import org.junit.Assert;
import org.junit.Test;
public class EncoderAckPacketTest {
private Encoder encoder = new Encoder(new ObjectMapper());
public class EncoderAckPacketTest extends EncoderBaseTest {
@Test
public void testEncode() throws IOException {

22
src/test/java/com/corundumstudio/socketio/parser/EncoderBaseTest.java

@ -0,0 +1,22 @@
/**
* Copyright 2012 Nikita Koksharov
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.corundumstudio.socketio.parser;
public class EncoderBaseTest {
protected final Encoder encoder = new Encoder(new JacksonJsonSupport());
}

5
src/test/java/com/corundumstudio/socketio/parser/EncoderConnectionPacketTest.java

@ -17,15 +17,12 @@ package com.corundumstudio.socketio.parser;
import java.io.IOException;
import org.codehaus.jackson.map.ObjectMapper;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.util.CharsetUtil;
import org.junit.Assert;
import org.junit.Test;
public class EncoderConnectionPacketTest {
private Encoder encoder = new Encoder(new ObjectMapper());
public class EncoderConnectionPacketTest extends EncoderBaseTest {
@Test
public void testEncodeHeartbeat() throws IOException {

5
src/test/java/com/corundumstudio/socketio/parser/EncoderErrorPacketTest.java

@ -17,15 +17,12 @@ package com.corundumstudio.socketio.parser;
import java.io.IOException;
import org.codehaus.jackson.map.ObjectMapper;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.util.CharsetUtil;
import org.junit.Assert;
import org.junit.Test;
public class EncoderErrorPacketTest {
private Encoder encoder = new Encoder(new ObjectMapper());
public class EncoderErrorPacketTest extends EncoderBaseTest {
@Test
public void testEncode() throws IOException {

12
src/test/java/com/corundumstudio/socketio/parser/EncoderEventPacketTest.java

@ -19,22 +19,12 @@ import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.util.CharsetUtil;
import org.junit.Assert;
import org.junit.Test;
public class EncoderEventPacketTest {
private Encoder encoder;
public EncoderEventPacketTest() {
ObjectMapper om = new ObjectMapper();
om.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
encoder = new Encoder(om);
}
public class EncoderEventPacketTest extends EncoderBaseTest {
@Test
public void testEncode() throws IOException {

5
src/test/java/com/corundumstudio/socketio/parser/EncoderJsonPacketTest.java

@ -22,15 +22,12 @@ import java.util.List;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import org.codehaus.jackson.map.ObjectMapper;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.util.CharsetUtil;
import org.junit.Assert;
import org.junit.Test;
public class EncoderJsonPacketTest {
private Encoder encoder = new Encoder(new ObjectMapper());
public class EncoderJsonPacketTest extends EncoderBaseTest {
@Test
public void testEncode() throws IOException {

5
src/test/java/com/corundumstudio/socketio/parser/EncoderMessagePacketTest.java

@ -17,15 +17,12 @@ package com.corundumstudio.socketio.parser;
import java.io.IOException;
import org.codehaus.jackson.map.ObjectMapper;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.util.CharsetUtil;
import org.junit.Assert;
import org.junit.Test;
public class EncoderMessagePacketTest {
private Encoder encoder = new Encoder(new ObjectMapper());
public class EncoderMessagePacketTest extends EncoderBaseTest {
@Test
public void testEncode() throws IOException {

5
src/test/java/com/corundumstudio/socketio/parser/PayloadTest.java

@ -21,7 +21,6 @@ import java.util.List;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import org.codehaus.jackson.map.ObjectMapper;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import org.jboss.netty.util.CharsetUtil;
@ -30,8 +29,8 @@ import org.junit.Test;
public class PayloadTest {
private final Decoder decoder = new Decoder(new ObjectMapper());
private final Encoder encoder = new Encoder(new ObjectMapper());
private final Decoder decoder = new Decoder(new JacksonJsonSupport());
private final Encoder encoder = new Encoder(new JacksonJsonSupport());
@Test
public void testPayloadDecode() throws IOException {

Loading…
Cancel
Save