From 2e3dc20c07a94c5ae763b558a73e8d6ea5ddc95a Mon Sep 17 00:00:00 2001 From: Jonathan Leibiusky Date: Tue, 24 Aug 2010 00:14:01 -0300 Subject: [PATCH] Fixed issue with converting String to byte array --- .../java/redis/clients/jedis/Protocol.java | 70 +++++++++++++++---- .../redis/clients/jedis/tests/JedisTest.java | 22 +++++- .../tests/commands/HashesCommandsTest.java | 3 +- 3 files changed, 78 insertions(+), 17 deletions(-) diff --git a/src/main/java/redis/clients/jedis/Protocol.java b/src/main/java/redis/clients/jedis/Protocol.java index 40d5868..ff96e8b 100644 --- a/src/main/java/redis/clients/jedis/Protocol.java +++ b/src/main/java/redis/clients/jedis/Protocol.java @@ -3,34 +3,74 @@ package redis.clients.jedis; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; +import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; public class Protocol { + public static final Charset CHARSET = Charset.forName("UTF-8"); + public static final String DOLLAR = "$"; public static final String ASTERISK = "*"; public static final String PLUS = "+"; public static final String MINUS = "-"; public static final String COLON = ":"; public static final String COMMAND_DELIMITER = "\r\n"; + public static final byte[] COMMAND_DELIMITER_BYTES = "\r\n" + .getBytes(CHARSET); public static final int DEFAULT_PORT = 6379; - public static final byte DOLLAR_BYTE = DOLLAR.getBytes()[0]; - public static final byte ASTERISK_BYTE = ASTERISK.getBytes()[0]; - public static final byte PLUS_BYTE = PLUS.getBytes()[0]; - public static final byte MINUS_BYTE = MINUS.getBytes()[0]; - public static final byte COLON_BYTE = COLON.getBytes()[0]; + public static final byte DOLLAR_BYTE = DOLLAR.getBytes(CHARSET)[0]; + public static final byte ASTERISK_BYTE = ASTERISK.getBytes(CHARSET)[0]; + public static final byte PLUS_BYTE = PLUS.getBytes(CHARSET)[0]; + public static final byte MINUS_BYTE = MINUS.getBytes(CHARSET)[0]; + public static final byte COLON_BYTE = COLON.getBytes(CHARSET)[0]; public void sendCommand(DataOutputStream os, String name, String... args) { - StringBuilder builder = new StringBuilder(ASTERISK + (args.length + 1) - + COMMAND_DELIMITER + DOLLAR + name.length() - + COMMAND_DELIMITER + name + COMMAND_DELIMITER); - for (String arg : args) { - builder.append(DOLLAR).append(arg.length()).append( - COMMAND_DELIMITER).append(arg).append(COMMAND_DELIMITER); - } - try { - os.write(builder.toString().getBytes()); + StringBuilder sb = new StringBuilder(); + sb.append(ASTERISK); + sb.append((new Integer(args.length + 1)).toString()); + sb.append(COMMAND_DELIMITER); + sb.append(DOLLAR); + sb.append((new Integer(name.length())).toString()); + sb.append(COMMAND_DELIMITER); + sb.append(name); + sb.append(COMMAND_DELIMITER); + + for (String arg : args) { + int size = arg.getBytes(CHARSET).length; + + sb.append(DOLLAR); + sb.append((new Integer(size)).toString()); + sb.append(COMMAND_DELIMITER); + sb.append(arg); + sb.append(COMMAND_DELIMITER); + } + + try { + os.write(sb.toString().getBytes(CHARSET)); + /* + os.write(ASTERISK_BYTE); + os.write((new Integer(args.length + 1)).toString() + .getBytes(CHARSET)); + os.write(COMMAND_DELIMITER_BYTES); + os.write(DOLLAR_BYTE); + os.write((new Integer(name.length())).toString().getBytes(CHARSET)); + os.write(COMMAND_DELIMITER_BYTES); + os.write(name.getBytes(CHARSET)); + os.write(COMMAND_DELIMITER_BYTES); + + for (String arg : args) { + byte[] barg = arg.getBytes(CHARSET); + + os.write(DOLLAR_BYTE); + os.write((new Integer(barg.length)).toString() + .getBytes(CHARSET)); + os.write(COMMAND_DELIMITER_BYTES); + os.write(barg); + os.write(COMMAND_DELIMITER_BYTES); + } + */ } catch (IOException e) { throw new JedisException(e); } @@ -108,7 +148,7 @@ public class Protocol { throw new JedisException(e); } - return new String(read); + return new String(read, CHARSET); } private Object processInteger(DataInputStream is) { diff --git a/src/test/java/redis/clients/jedis/tests/JedisTest.java b/src/test/java/redis/clients/jedis/tests/JedisTest.java index ac52954..8b8bf03 100644 --- a/src/test/java/redis/clients/jedis/tests/JedisTest.java +++ b/src/test/java/redis/clients/jedis/tests/JedisTest.java @@ -1,14 +1,34 @@ package redis.clients.jedis.tests; +import java.util.HashMap; +import java.util.Map; + import org.junit.Test; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisException; +import redis.clients.jedis.Protocol; +import redis.clients.jedis.tests.commands.JedisCommandTestBase; -public class JedisTest { +public class JedisTest extends JedisCommandTestBase { @Test(expected = JedisException.class) public void useWithoutConnecting() { Jedis jedis = new Jedis("localhost"); jedis.dbSize(); } + + @Test + public void checkBinaryData() { + byte[] bigdata = new byte[1777]; + for (int b = 0; b < bigdata.length; b++) { + bigdata[b] = (byte) ((byte) b % 255); + } + Map hash = new HashMap(); + hash.put("data", new String(bigdata, Protocol.CHARSET)); + + String status = jedis.hmset("foo", hash); + assertEquals("OK", status); + assertEquals(hash, jedis.hgetAll("foo")); + } + } \ No newline at end of file diff --git a/src/test/java/redis/clients/jedis/tests/commands/HashesCommandsTest.java b/src/test/java/redis/clients/jedis/tests/commands/HashesCommandsTest.java index 34adc04..026febe 100644 --- a/src/test/java/redis/clients/jedis/tests/commands/HashesCommandsTest.java +++ b/src/test/java/redis/clients/jedis/tests/commands/HashesCommandsTest.java @@ -8,6 +8,8 @@ import java.util.Map; import org.junit.Test; +import redis.clients.jedis.Protocol; + public class HashesCommandsTest extends JedisCommandTestBase { @Test public void hset() { @@ -154,5 +156,4 @@ public class HashesCommandsTest extends JedisCommandTestBase { expected.put("car", "bar"); assertEquals(expected, hash); } - }