decoders reimplemented

pull/243/head
Nikita 10 years ago
parent 70512124d4
commit 3e92fb70ce

@ -43,16 +43,9 @@ import io.netty.buffer.ByteBufInputStream;
*/ */
public class JsonJacksonCodec implements Codec { public class JsonJacksonCodec implements Codec {
private final ObjectMapper objectMapper = new ObjectMapper();
private ObjectMapper mapObjectMapper = new ObjectMapper(); private ObjectMapper mapObjectMapper = new ObjectMapper();
public JsonJacksonCodec() { public JsonJacksonCodec() {
init(objectMapper);
TypeResolverBuilder<?> typer = new DefaultTypeResolverBuilder(DefaultTyping.NON_FINAL);
typer.init(JsonTypeInfo.Id.CLASS, null);
typer.inclusion(JsonTypeInfo.As.PROPERTY);
objectMapper.setDefaultTyping(typer);
init(mapObjectMapper); init(mapObjectMapper);
// type info inclusion // type info inclusion
TypeResolverBuilder<?> mapTyper = new DefaultTypeResolverBuilder(DefaultTyping.NON_FINAL) { TypeResolverBuilder<?> mapTyper = new DefaultTypeResolverBuilder(DefaultTyping.NON_FINAL) {
@ -136,30 +129,12 @@ public class JsonJacksonCodec implements Codec {
@Override @Override
public Decoder<Object> getValueDecoder() { public Decoder<Object> getValueDecoder() {
// return new Decoder<Object>() {
//
// @Override
// public Object decode(ByteBuf buf) throws IOException {
// if (buf == null) {
// return null;
// }
//
// return objectMapper.readValue(new ByteBufInputStream(buf), Object.class);
// }
// };
return getMapValueDecoder(); return getMapValueDecoder();
} }
@Override @Override
public Encoder getValueEncoder() { public Encoder getValueEncoder() {
return getMapValueEncoder(); return getMapValueEncoder();
// return new Encoder() {
//
// @Override
// public byte[] encode(int paramIndex, Object in) throws IOException {
// return objectMapper.writeValueAsBytes(in);
// }
// };
} }
} }

@ -15,20 +15,25 @@
*/ */
package org.redisson.codec; package org.redisson.codec;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.nio.ByteBuffer; import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Queue; import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentLinkedQueue;
import org.redisson.client.protocol.Codec;
import org.redisson.client.protocol.Decoder;
import org.redisson.client.protocol.Encoder;
import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output; import com.esotericsoftware.kryo.io.Output;
public class KryoCodec implements RedissonCodec { import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufInputStream;
public class KryoCodec implements Codec {
public interface KryoPool { public interface KryoPool {
@ -100,12 +105,36 @@ public class KryoCodec implements RedissonCodec {
this.kryoPool = kryoPool; this.kryoPool = kryoPool;
} }
private Object decode(ByteBuffer bytes) { @Override
public Decoder<Object> getMapValueDecoder() {
return getValueDecoder();
}
@Override
public Encoder getMapValueEncoder() {
return getValueEncoder();
}
@Override
public Decoder<Object> getMapKeyDecoder() {
return getValueDecoder();
}
@Override
public Encoder getMapKeyEncoder() {
return getValueEncoder();
}
@Override
public Decoder<Object> getValueDecoder() {
return new Decoder<Object>() {
@Override
public Object decode(ByteBuf buf) throws IOException {
Kryo kryo = null; Kryo kryo = null;
try { try {
kryo = kryoPool.get(); kryo = kryoPool.get();
return kryo.readClassAndObject(new Input(new ByteArrayInputStream(bytes.array(), bytes return kryo.readClassAndObject(new Input(new ByteBufInputStream(buf)));
.arrayOffset() + bytes.position(), bytes.limit())));
} catch (Exception e) { } catch (Exception e) {
if (e instanceof RuntimeException) { if (e instanceof RuntimeException) {
throw (RuntimeException) e; throw (RuntimeException) e;
@ -117,15 +146,21 @@ public class KryoCodec implements RedissonCodec {
} }
} }
} }
};
}
@Override
public Encoder getValueEncoder() {
return new Encoder() {
@Override @Override
public byte[] encodeValue(Object value) { public byte[] encode(Object in) throws IOException {
Kryo kryo = null; Kryo kryo = null;
try { try {
ByteArrayOutputStream baos = new ByteArrayOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream();
Output output = new Output(baos); Output output = new Output(baos);
kryo = kryoPool.get(); kryo = kryoPool.get();
kryo.writeClassAndObject(output, value); kryo.writeClassAndObject(output, in);
output.close(); output.close();
return baos.toByteArray(); return baos.toByteArray();
} catch (Exception e) { } catch (Exception e) {
@ -139,40 +174,7 @@ public class KryoCodec implements RedissonCodec {
} }
} }
} }
};
@Override
public byte[] encodeKey(Object key) {
return key.toString().getBytes(Charset.forName("ASCII"));
}
@Override
public Object decodeKey(ByteBuffer bytes) {
return new String(bytes.array(), bytes.arrayOffset() + bytes.position(), bytes.limit(), Charset.forName("ASCII"));
}
@Override
public Object decodeValue(ByteBuffer bytes) {
return decode(bytes);
}
@Override
public byte[] encodeMapValue(Object value) {
return encodeValue(value);
}
@Override
public byte[] encodeMapKey(Object key) {
return encodeKey(key);
}
@Override
public Object decodeMapValue(ByteBuffer bytes) {
return decodeValue(bytes);
}
@Override
public Object decodeMapKey(ByteBuffer bytes) {
return decodeKey(bytes);
} }
} }

@ -1,43 +0,0 @@
/**
* Copyright 2014 Nikita Koksharov, Nickolay Borbit
*
* 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 org.redisson.codec;
import java.nio.ByteBuffer;
/**
*
* @author Nikita Koksharov
*
*/
public interface RedissonCodec {
Object decodeKey(ByteBuffer bytes);
Object decodeValue(ByteBuffer bytes);
byte[] encodeKey(Object key);
byte[] encodeValue(Object value);
byte[] encodeMapValue(Object value);
byte[] encodeMapKey(Object key);
Object decodeMapValue(ByteBuffer bytes);
Object decodeMapKey(ByteBuffer bytes);
}

@ -15,84 +15,75 @@
*/ */
package org.redisson.codec; package org.redisson.codec;
import java.io.*; import java.io.ByteArrayOutputStream;
import java.nio.ByteBuffer; import java.io.IOException;
import java.nio.charset.Charset; import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.redisson.client.protocol.Codec;
import org.redisson.client.protocol.Decoder;
import org.redisson.client.protocol.Encoder;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufInputStream;
/** /**
* *
* @author Nikita Koksharov * @author Nikita Koksharov
* *
*/ */
public class SerializationCodec implements RedissonCodec { public class SerializationCodec implements Codec {
@Override @Override
public Object decodeKey(ByteBuffer bytes) { public Decoder<Object> getMapValueDecoder() {
return new String(bytes.array(), bytes.arrayOffset() + bytes.position(), bytes.limit(), Charset.forName("ASCII")); return getValueDecoder();
} }
@Override @Override
public Object decodeValue(ByteBuffer bytes) { public Encoder getMapValueEncoder() {
return decode(bytes); return getValueEncoder();
} }
private Object decode(ByteBuffer bytes) { @Override
try { public Decoder<Object> getMapKeyDecoder() {
ByteArrayInputStream in = new ByteArrayInputStream(bytes.array(), bytes.arrayOffset() + bytes.position(), bytes.limit()); return getValueDecoder();
ObjectInputStream inputStream = new ObjectInputStream(in);
return inputStream.readObject();
} catch (Exception e) {
throw new IllegalStateException(e);
}
} }
@Override @Override
public byte[] encodeKey(Object key) { public Encoder getMapKeyEncoder() {
return key.toString().getBytes(Charset.forName("ASCII")); return getValueEncoder();
} }
@Override @Override
public byte[] encodeValue(Object value) { public Decoder<Object> getValueDecoder() {
return new Decoder<Object>() {
@Override
public Object decode(ByteBuf buf) throws IOException {
try { try {
ByteArrayOutputStream result = new ByteArrayOutputStream(); ObjectInputStream inputStream = new ObjectInputStream(new ByteBufInputStream(buf));
ObjectOutputStream outputStream = new ObjectOutputStream(result); return inputStream.readObject();
outputStream.writeObject(value); } catch (IOException e) {
outputStream.close(); throw e;
return result.toByteArray();
} catch (Exception e) { } catch (Exception e) {
throw new IllegalStateException(e); throw new IOException(e);
} }
} }
};
@Override
public byte[] encodeMapValue(Object value) {
return encodeValue(value);
} }
@Override @Override
public byte[] encodeMapKey(Object key) { public Encoder getValueEncoder() {
return encodeValue(key); return new Encoder() {
}
@Override @Override
public Object decodeMapValue(ByteBuffer bytes) { public byte[] encode(Object in) throws IOException {
return decodeValue(bytes); ByteArrayOutputStream result = new ByteArrayOutputStream();
} ObjectOutputStream outputStream = new ObjectOutputStream(result);
outputStream.writeObject(in);
@Override outputStream.close();
public Object decodeMapKey(ByteBuffer bytes) { return result.toByteArray();
return decodeValue(bytes);
}
protected String decodeAscii(ByteBuffer bytes) {
if (bytes == null) {
return null;
}
char[] chars = new char[bytes.remaining()];
for (int i = 0; i < chars.length; i++) {
chars[i] = (char) bytes.get();
} }
return new String(chars); };
} }
} }

@ -1,65 +0,0 @@
/**
* Copyright 2014 Nikita Koksharov, Nickolay Borbit
*
* 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 org.redisson.codec;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
public class StringCodec implements RedissonCodec {
private Charset charset = Charset.forName("UTF-8");
@Override
public Object decodeKey(ByteBuffer bytes) {
return decodeValue(bytes);
}
@Override
public Object decodeValue(ByteBuffer bytes) {
return new String(bytes.array(), bytes.arrayOffset() + bytes.position(), bytes.limit(), charset);
}
@Override
public byte[] encodeKey(Object key) {
return encodeValue((String)key);
}
@Override
public byte[] encodeValue(Object value) {
return ((String)value).getBytes(charset);
}
@Override
public byte[] encodeMapValue(Object value) {
return encodeValue((String)value);
}
@Override
public byte[] encodeMapKey(Object key) {
return encodeValue((String)key);
}
@Override
public Object decodeMapValue(ByteBuffer bytes) {
return decodeValue(bytes);
}
@Override
public Object decodeMapKey(ByteBuffer bytes) {
return decodeValue(bytes);
}
}
Loading…
Cancel
Save