diff --git a/src/main/java/redis/clients/jedis/Client.java b/src/main/java/redis/clients/jedis/Client.java index 1b3783f..a42a3f7 100644 --- a/src/main/java/redis/clients/jedis/Client.java +++ b/src/main/java/redis/clients/jedis/Client.java @@ -375,5 +375,4 @@ public class Client extends Connection { public void exec() throws JedisException { sendCommand("EXEC"); } - } \ No newline at end of file diff --git a/src/main/java/redis/clients/jedis/Connection.java b/src/main/java/redis/clients/jedis/Connection.java index 828054e..2e4e332 100644 --- a/src/main/java/redis/clients/jedis/Connection.java +++ b/src/main/java/redis/clients/jedis/Connection.java @@ -80,7 +80,7 @@ public class Connection { } protected String getStatusCodeReply() throws JedisException { - return protocol.getSingleLineReply(inputStream); + return protocol.getStatusCodeReply(inputStream); } public String getBulkReply() throws JedisException { @@ -91,7 +91,13 @@ public class Connection { return protocol.getIntegerReply(inputStream); } + @SuppressWarnings("unchecked") public List getMultiBulkReply() throws JedisException { + return (List) (List) protocol.getMultiBulkReply(inputStream); + } + + public List getObjectMultiBulkReply() throws JedisException { return protocol.getMultiBulkReply(inputStream); } + } \ No newline at end of file diff --git a/src/main/java/redis/clients/jedis/Jedis.java b/src/main/java/redis/clients/jedis/Jedis.java index 6c5657b..a2f2fe6 100644 --- a/src/main/java/redis/clients/jedis/Jedis.java +++ b/src/main/java/redis/clients/jedis/Jedis.java @@ -466,15 +466,16 @@ public class Jedis { return new Transaction(client); } - public void multi(TransactionBlock jedisTransaction) throws JedisException { + public List multi(TransactionBlock jedisTransaction) + throws JedisException { try { jedisTransaction.setClient(client); - client.multi(); - client.getStatusCodeReply(); + multi(); jedisTransaction.execute(); } catch (Exception ex) { client.discard(); } + return jedisTransaction.exec(); } public void connect() throws UnknownHostException, IOException { diff --git a/src/main/java/redis/clients/jedis/Protocol.java b/src/main/java/redis/clients/jedis/Protocol.java index 39c1ebe..875b66b 100644 --- a/src/main/java/redis/clients/jedis/Protocol.java +++ b/src/main/java/redis/clients/jedis/Protocol.java @@ -64,88 +64,83 @@ public class Protocol { } public String getBulkReply(InputStream is) throws JedisException { - String ret = null; - try { - byte b = (byte) is.read(); - if (b == MINUS_BYTE) { - processError(is); - } - - if (b == DOLLAR_BYTE) { - int len = Integer.parseInt(readLine(is)); - if (len == -1) { - return null; - } - byte[] read = new byte[len]; - is.read(read); - // read 2 more bytes for the command delimiter - is.read(); - is.read(); - - ret = new String(read); - - } - } catch (IOException e) { - // TODO Not sure that I should return null - return null; - } - return ret; + Object reply = process(is); + return (String) reply; } - public String getSingleLineReply(InputStream is) throws JedisException { - String ret = null; - try { - byte b = (byte) is.read(); - if (b == MINUS_BYTE) { - processError(is); - } - - if (b == PLUS_BYTE) { - ret = readLine(is); - } - } catch (IOException e) { - // TODO Not sure that I should return null - return null; - } - return ret; + public String getStatusCodeReply(InputStream is) throws JedisException { + Object reply = process(is); + return (String) reply; } public int getIntegerReply(InputStream is) throws JedisException { - int ret = 0; + Object reply = process(is); + return (Integer) reply; + } + + private Object process(InputStream is) throws JedisException { try { byte b = (byte) is.read(); if (b == MINUS_BYTE) { processError(is); - } - if (b == COLON_BYTE) { - String num = readLine(is); - ret = Integer.parseInt(num); + } else if (b == ASTERISK_BYTE) { + return processMultiBulkReply(is); + } else if (b == COLON_BYTE) { + return processInteger(is); + } else if (b == DOLLAR_BYTE) { + return processBulkReply(is); + } else { + return processStatusCodeReply(is); } } catch (IOException e) { - // TODO Not sure that I should return 0 - e.printStackTrace(); - return 0; + // TODO check what to do here + throw new JedisException(e.getMessage()); + } + return null; + } + + private Object processStatusCodeReply(InputStream is) { + String ret = null; + ret = readLine(is); + return ret; + } + + private Object processBulkReply(InputStream is) throws IOException { + String ret = null; + int len = Integer.parseInt(readLine(is)); + if (len == -1) { + return null; + } + byte[] read = new byte[len]; + is.read(read); + // read 2 more bytes for the command delimiter + is.read(); + is.read(); + + ret = new String(read); + return ret; + } + + private Object processInteger(InputStream is) { + int ret = 0; + String num = readLine(is); + ret = Integer.parseInt(num); + return ret; + } + + private Object processMultiBulkReply(InputStream is) throws JedisException { + List ret = new ArrayList(); + int num = Integer.parseInt(readLine(is)); + for (int i = 0; i < num; i++) { + ret.add(process(is)); } return ret; } - public List getMultiBulkReply(InputStream is) throws JedisException { - List ret = new ArrayList(); - try { - byte b = (byte) is.read(); - if (b == MINUS_BYTE) { - processError(is); - } - if (b == ASTERISK_BYTE) { - int num = Integer.parseInt(readLine(is)); - for (int i = 0; i < num; i++) { - ret.add(getBulkReply(is)); - } - } - } catch (IOException e) { - // TODO Not sure that I should return null - return null; - } + @SuppressWarnings("unchecked") + public List getMultiBulkReply(InputStream is) throws JedisException { + Object reply = process(is); + List ret = (List) reply; return ret; } } \ No newline at end of file diff --git a/src/main/java/redis/clients/jedis/Transaction.java b/src/main/java/redis/clients/jedis/Transaction.java index d8b6d42..5c7c035 100644 --- a/src/main/java/redis/clients/jedis/Transaction.java +++ b/src/main/java/redis/clients/jedis/Transaction.java @@ -1,5 +1,6 @@ package redis.clients.jedis; +import java.util.List; import java.util.Map; public class Transaction { @@ -418,7 +419,8 @@ public class Transaction { return client.getStatusCodeReply(); } - public void exec() throws JedisException { + public List exec() throws JedisException { client.exec(); + return client.getObjectMultiBulkReply(); } } \ No newline at end of file diff --git a/src/test/java/redis/clients/jedis/tests/ProtocolTest.java b/src/test/java/redis/clients/jedis/tests/ProtocolTest.java index d0266f4..5f16b38 100644 --- a/src/test/java/redis/clients/jedis/tests/ProtocolTest.java +++ b/src/test/java/redis/clients/jedis/tests/ProtocolTest.java @@ -58,7 +58,7 @@ public class ProtocolTest extends Assert { public void singleLineReply() throws JedisException { InputStream is = new ByteArrayInputStream("+OK\r\n".getBytes()); Protocol protocol = new Protocol(); - String response = protocol.getSingleLineReply(is); + String response = protocol.getStatusCodeReply(is); assertEquals("OK", response); } @@ -70,13 +70,15 @@ public class ProtocolTest extends Assert { assertEquals(123, response); } + @SuppressWarnings("unchecked") @Test public void multiBulkReply() throws JedisException { InputStream is = new ByteArrayInputStream( "*4\r\n$3\r\nfoo\r\n$3\r\nbar\r\n$5\r\nHello\r\n$5\r\nWorld\r\n" .getBytes()); Protocol protocol = new Protocol(); - List response = protocol.getMultiBulkReply(is); + List response = (List) (List) protocol + .getMultiBulkReply(is); List expected = new ArrayList(); expected.add("foo"); expected.add("bar"); @@ -84,5 +86,22 @@ public class ProtocolTest extends Assert { expected.add("World"); assertEquals(expected, response); + + is = new ByteArrayInputStream( + "*4\r\n$3\r\nfoo\r\n+OK\r\n:1000\r\n*2\r\n$3\r\nfoo\r\n$3\r\nbar" + .getBytes()); + protocol = new Protocol(); + List response2 = protocol.getMultiBulkReply(is); + List expected2 = new ArrayList(); + expected2.add("foo"); + expected2.add("OK"); + expected2.add(1000); + List sub = new ArrayList(); + sub.add("foo"); + sub.add("bar"); + expected2.add(sub); + + assertEquals(expected2, response2); + } } \ No newline at end of file diff --git a/src/test/java/redis/clients/jedis/tests/commands/TransactionCommandsTest.java b/src/test/java/redis/clients/jedis/tests/commands/TransactionCommandsTest.java index dfc06a7..bcfa00c 100644 --- a/src/test/java/redis/clients/jedis/tests/commands/TransactionCommandsTest.java +++ b/src/test/java/redis/clients/jedis/tests/commands/TransactionCommandsTest.java @@ -1,5 +1,8 @@ package redis.clients.jedis.tests.commands; +import java.util.ArrayList; +import java.util.List; + import junit.framework.Assert; import org.junit.After; @@ -39,14 +42,18 @@ public class TransactionCommandsTest extends Assert { status = trans.scard("foo"); assertEquals("QUEUED", status); - trans.exec(); - - //TODO: check for exec response + List response = trans.exec(); + + List expected = new ArrayList(); + expected.add(1); + expected.add(1); + expected.add(2); + assertEquals(expected, response); } @Test public void multiBlock() throws JedisException { - jedis.multi(new TransactionBlock() { + List response = jedis.multi(new TransactionBlock() { public void execute() throws JedisException { String status = sadd("foo", "a"); assertEquals("QUEUED", status); @@ -58,7 +65,11 @@ public class TransactionCommandsTest extends Assert { assertEquals("QUEUED", status); } }); - - //TODO: check what happens when throwind an exception + + List expected = new ArrayList(); + expected.add(1); + expected.add(1); + expected.add(2); + assertEquals(expected, response); } } \ No newline at end of file