Skip to content

Commit 455100c

Browse files
committed
[FAB-12426] Fix java chaincode return status.
Java chaincode should be able to return any status it wants, not limited to SUCCESS(200) and INTERNAL_SERVER_ERROR(500) Direct integer codes are also supported. Change-Id: Iacbed9ab30f7c0f61301a9af45759359855c4fcb Signed-off-by: Albert Lacambra Basil <albert@lacambra.tech>
1 parent ea26118 commit 455100c

File tree

2 files changed

+46
-5
lines changed

2 files changed

+46
-5
lines changed

fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/Chaincode.java

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,20 +31,34 @@ public interface Chaincode {
3131
* Wrapper around protobuf Response, contains status, message and payload. Object returned by
3232
* call to {@link #init(ChaincodeStub)} and{@link #invoke(ChaincodeStub)}
3333
*/
34-
public static class Response {
34+
class Response {
3535

36-
private final Status status;
36+
private final int statusCode;
3737
private final String message;
3838
private final byte[] payload;
3939

4040
public Response(Status status, String message, byte[] payload) {
41-
this.status = status;
41+
this.statusCode = status.getCode();
42+
this.message = message;
43+
this.payload = payload;
44+
}
45+
46+
public Response(int statusCode, String message, byte[] payload) {
47+
this.statusCode = statusCode;
4248
this.message = message;
4349
this.payload = payload;
4450
}
4551

4652
public Status getStatus() {
47-
return status;
53+
if (Status.hasStatusForCode(statusCode)) {
54+
return Status.forCode(statusCode);
55+
} else {
56+
return null;
57+
}
58+
}
59+
60+
public int getStatusCode() {
61+
return statusCode;
4862
}
4963

5064
public String getMessage() {
@@ -64,6 +78,7 @@ public String getStringPayload() {
6478
*/
6579
public enum Status {
6680
SUCCESS(200),
81+
ERROR_THRESHOLD(400),
6782
INTERNAL_SERVER_ERROR(500);
6883

6984
private static final Map<Integer, Status> codeToStatus = new HashMap<>();
@@ -83,6 +98,10 @@ public static Status forCode(int code) {
8398
return result;
8499
}
85100

101+
public static boolean hasStatusForCode(int code) {
102+
return codeToStatus.containsKey(code);
103+
}
104+
86105
static {
87106
for (Status status : Status.values()) {
88107
codeToStatus.put(status.code, status);

fabric-chaincode-shim/src/test/java/org/hyperledger/fabric/shim/ChaincodeTest.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
import java.nio.charset.StandardCharsets;
1313

14-
import static org.junit.Assert.*;
14+
import static org.junit.Assert.assertEquals;
1515

1616
public class ChaincodeTest {
1717

@@ -26,9 +26,31 @@ public void testResponse() {
2626
assertEquals("Incorrect payload", "no payload", resp.getStringPayload());
2727
}
2828

29+
30+
@Test
31+
public void testResponseWithCode() {
32+
Chaincode.Response resp = new Chaincode.Response(200, "No message", "no payload".getBytes(StandardCharsets.UTF_8));
33+
assertEquals("Incorrect status", Chaincode.Response.Status.SUCCESS, resp.getStatus());
34+
assertEquals("Incorrect status", 200, resp.getStatusCode());
35+
assertEquals("Incorrect message", "No message", resp.getMessage());
36+
assertEquals("Incorrect payload", "no payload", resp.getStringPayload());
37+
38+
resp = new Chaincode.Response(404, "No message", "no payload".getBytes(StandardCharsets.UTF_8));
39+
assertEquals("Incorrect status", 404, resp.getStatusCode());
40+
assertEquals("Incorrect message", "No message", resp.getMessage());
41+
assertEquals("Incorrect payload", "no payload", resp.getStringPayload());
42+
43+
resp = new Chaincode.Response(Chaincode.Response.Status.ERROR_THRESHOLD, "No message", "no payload".getBytes(StandardCharsets.UTF_8));
44+
assertEquals("Incorrect status", Chaincode.Response.Status.ERROR_THRESHOLD, resp.getStatus());
45+
assertEquals("Incorrect status", 400, resp.getStatusCode());
46+
assertEquals("Incorrect message", "No message", resp.getMessage());
47+
assertEquals("Incorrect payload", "no payload", resp.getStringPayload());
48+
}
49+
2950
@Test
3051
public void testStatus() {
3152
assertEquals("Wrong status", Chaincode.Response.Status.SUCCESS, Chaincode.Response.Status.forCode(200));
53+
assertEquals("Wrong status", Chaincode.Response.Status.ERROR_THRESHOLD, Chaincode.Response.Status.forCode(400));
3254
assertEquals("Wrong status", Chaincode.Response.Status.INTERNAL_SERVER_ERROR, Chaincode.Response.Status.forCode(500));
3355

3456
thrown.expect(IllegalArgumentException.class);

0 commit comments

Comments
 (0)