Skip to content

Commit 5e5d2c8

Browse files
authored
Update java chaincode to be compatible with doc and other implementations (#149)
* Use numbers without leading zeroes for key Signed-off-by: Stefan Obermeier <scray@stefan-obermeier.de> * Update chaincode to be compatible with doc. E.g. Return key of the queried record Signed-off-by: Stefan Obermeier <scray@stefan-obermeier.de> * Clean up Use always whitespaces to indent the start of the line Remove unnecessary whitespaces Signed-off-by: Stefan Obermeier <scray@stefan-obermeier.de>
1 parent c572c51 commit 5e5d2c8

File tree

3 files changed

+110
-43
lines changed

3 files changed

+110
-43
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
*/
4+
5+
package org.hyperledger.fabric.samples.fabcar;
6+
7+
import java.util.Objects;
8+
9+
import org.hyperledger.fabric.contract.annotation.DataType;
10+
import org.hyperledger.fabric.contract.annotation.Property;
11+
12+
import com.owlike.genson.annotation.JsonProperty;
13+
14+
/**
15+
* CarQueryResult structure used for handling result of query
16+
*
17+
*/
18+
@DataType()
19+
public final class CarQueryResult {
20+
@Property()
21+
private final String key;
22+
23+
@Property()
24+
private final Car record;
25+
26+
public CarQueryResult(@JsonProperty("Key") final String key, @JsonProperty("Record") final Car record) {
27+
this.key = key;
28+
this.record = record;
29+
}
30+
31+
public String getKey() {
32+
return key;
33+
}
34+
35+
public Car getRecord() {
36+
return record;
37+
}
38+
39+
@Override
40+
public boolean equals(final Object obj) {
41+
if (this == obj) {
42+
return true;
43+
}
44+
45+
if ((obj == null) || (getClass() != obj.getClass())) {
46+
return false;
47+
}
48+
49+
CarQueryResult other = (CarQueryResult) obj;
50+
51+
Boolean recordsAreEquals = this.getRecord().equals(other.getRecord());
52+
Boolean keysAreEquals = this.getKey().equals(other.getKey());
53+
54+
return recordsAreEquals && keysAreEquals;
55+
}
56+
57+
@Override
58+
public int hashCode() {
59+
return Objects.hash(this.getKey(), this.getRecord());
60+
}
61+
62+
@Override
63+
public String toString() {
64+
return "{\"Key\":\"" + key + "\"" + "\"Record\":{\"" + record + "}\"}";
65+
}
66+
67+
}

chaincode/fabcar/java/src/main/java/org/hyperledger/fabric/samples/fabcar/FabCar.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ public void initLedger(final Context ctx) {
9595
};
9696

9797
for (int i = 0; i < carData.length; i++) {
98-
String key = String.format("CAR%03d", i);
98+
String key = String.format("CAR%d", i);
9999

100100
Car car = genson.deserialize(carData[i], Car.class);
101101
String carState = genson.serialize(car);
@@ -140,21 +140,21 @@ public Car createCar(final Context ctx, final String key, final String make, fin
140140
* @return array of Cars found on the ledger
141141
*/
142142
@Transaction()
143-
public Car[] queryAllCars(final Context ctx) {
143+
public CarQueryResult[] queryAllCars(final Context ctx) {
144144
ChaincodeStub stub = ctx.getStub();
145145

146146
final String startKey = "CAR0";
147147
final String endKey = "CAR999";
148-
List<Car> cars = new ArrayList<Car>();
148+
List<CarQueryResult> queryResults = new ArrayList<CarQueryResult>();
149149

150150
QueryResultsIterator<KeyValue> results = stub.getStateByRange(startKey, endKey);
151151

152152
for (KeyValue result: results) {
153153
Car car = genson.deserialize(result.getStringValue(), Car.class);
154-
cars.add(car);
154+
queryResults.add(new CarQueryResult(result.getKey(), car));
155155
}
156156

157-
Car[] response = cars.toArray(new Car[cars.size()]);
157+
CarQueryResult[] response = queryResults.toArray(new CarQueryResult[queryResults.size()]);
158158

159159
return response;
160160
}

chaincode/fabcar/java/src/test/java/org/hyperledger/fabric/samples/fabcar/FabCarTest.java

+38-38
Original file line numberDiff line numberDiff line change
@@ -63,15 +63,15 @@ private final class MockCarResultsIterator implements QueryResultsIterator<KeyVa
6363

6464
carList = new ArrayList<KeyValue>();
6565

66-
carList.add(new MockKeyValue("CAR000",
66+
carList.add(new MockKeyValue("CAR0",
6767
"{\"color\":\"blue\",\"make\":\"Toyota\",\"model\":\"Prius\",\"owner\":\"Tomoko\"}"));
68-
carList.add(new MockKeyValue("CAR001",
68+
carList.add(new MockKeyValue("CAR1",
6969
"{\"color\":\"red\",\"make\":\"Ford\",\"model\":\"Mustang\",\"owner\":\"Brad\"}"));
70-
carList.add(new MockKeyValue("CAR002",
70+
carList.add(new MockKeyValue("CAR2",
7171
"{\"color\":\"green\",\"make\":\"Hyundai\",\"model\":\"Tucson\",\"owner\":\"Jin Soo\"}"));
72-
carList.add(new MockKeyValue("CAR007",
72+
carList.add(new MockKeyValue("CAR7",
7373
"{\"color\":\"violet\",\"make\":\"Fiat\",\"model\":\"Punto\",\"owner\":\"Pari\"}"));
74-
carList.add(new MockKeyValue("CAR009",
74+
carList.add(new MockKeyValue("CAR9",
7575
"{\"color\":\"brown\",\"make\":\"Holden\",\"model\":\"Barina\",\"owner\":\"Shotaro\"}"));
7676
}
7777

@@ -112,10 +112,10 @@ public void whenCarExists() {
112112
Context ctx = mock(Context.class);
113113
ChaincodeStub stub = mock(ChaincodeStub.class);
114114
when(ctx.getStub()).thenReturn(stub);
115-
when(stub.getStringState("CAR000"))
115+
when(stub.getStringState("CAR0"))
116116
.thenReturn("{\"color\":\"blue\",\"make\":\"Toyota\",\"model\":\"Prius\",\"owner\":\"Tomoko\"}");
117117

118-
Car car = contract.queryCar(ctx, "CAR000");
118+
Car car = contract.queryCar(ctx, "CAR0");
119119

120120
assertThat(car).isEqualTo(new Car("Toyota", "Prius", "blue", "Tomoko"));
121121
}
@@ -126,14 +126,14 @@ public void whenCarDoesNotExist() {
126126
Context ctx = mock(Context.class);
127127
ChaincodeStub stub = mock(ChaincodeStub.class);
128128
when(ctx.getStub()).thenReturn(stub);
129-
when(stub.getStringState("CAR000")).thenReturn("");
129+
when(stub.getStringState("CAR0")).thenReturn("");
130130

131131
Throwable thrown = catchThrowable(() -> {
132-
contract.queryCar(ctx, "CAR000");
132+
contract.queryCar(ctx, "CAR0");
133133
});
134134

135135
assertThat(thrown).isInstanceOf(ChaincodeException.class).hasNoCause()
136-
.hasMessage("Car CAR000 does not exist");
136+
.hasMessage("Car CAR0 does not exist");
137137
assertThat(((ChaincodeException) thrown).getPayload()).isEqualTo("CAR_NOT_FOUND".getBytes());
138138
}
139139
}
@@ -148,25 +148,25 @@ void invokeInitLedgerTransaction() {
148148
contract.initLedger(ctx);
149149

150150
InOrder inOrder = inOrder(stub);
151-
inOrder.verify(stub).putStringState("CAR000",
151+
inOrder.verify(stub).putStringState("CAR0",
152152
"{\"color\":\"blue\",\"make\":\"Toyota\",\"model\":\"Prius\",\"owner\":\"Tomoko\"}");
153-
inOrder.verify(stub).putStringState("CAR001",
153+
inOrder.verify(stub).putStringState("CAR1",
154154
"{\"color\":\"red\",\"make\":\"Ford\",\"model\":\"Mustang\",\"owner\":\"Brad\"}");
155-
inOrder.verify(stub).putStringState("CAR002",
155+
inOrder.verify(stub).putStringState("CAR2",
156156
"{\"color\":\"green\",\"make\":\"Hyundai\",\"model\":\"Tucson\",\"owner\":\"Jin Soo\"}");
157-
inOrder.verify(stub).putStringState("CAR003",
157+
inOrder.verify(stub).putStringState("CAR3",
158158
"{\"color\":\"yellow\",\"make\":\"Volkswagen\",\"model\":\"Passat\",\"owner\":\"Max\"}");
159-
inOrder.verify(stub).putStringState("CAR004",
159+
inOrder.verify(stub).putStringState("CAR4",
160160
"{\"color\":\"black\",\"make\":\"Tesla\",\"model\":\"S\",\"owner\":\"Adrian\"}");
161-
inOrder.verify(stub).putStringState("CAR005",
161+
inOrder.verify(stub).putStringState("CAR5",
162162
"{\"color\":\"purple\",\"make\":\"Peugeot\",\"model\":\"205\",\"owner\":\"Michel\"}");
163-
inOrder.verify(stub).putStringState("CAR006",
163+
inOrder.verify(stub).putStringState("CAR6",
164164
"{\"color\":\"white\",\"make\":\"Chery\",\"model\":\"S22L\",\"owner\":\"Aarav\"}");
165-
inOrder.verify(stub).putStringState("CAR007",
165+
inOrder.verify(stub).putStringState("CAR7",
166166
"{\"color\":\"violet\",\"make\":\"Fiat\",\"model\":\"Punto\",\"owner\":\"Pari\"}");
167-
inOrder.verify(stub).putStringState("CAR008",
167+
inOrder.verify(stub).putStringState("CAR8",
168168
"{\"color\":\"indigo\",\"make\":\"Tata\",\"model\":\"nano\",\"owner\":\"Valeria\"}");
169-
inOrder.verify(stub).putStringState("CAR009",
169+
inOrder.verify(stub).putStringState("CAR9",
170170
"{\"color\":\"brown\",\"make\":\"Holden\",\"model\":\"Barina\",\"owner\":\"Shotaro\"}");
171171
}
172172

@@ -179,15 +179,15 @@ public void whenCarExists() {
179179
Context ctx = mock(Context.class);
180180
ChaincodeStub stub = mock(ChaincodeStub.class);
181181
when(ctx.getStub()).thenReturn(stub);
182-
when(stub.getStringState("CAR000"))
182+
when(stub.getStringState("CAR0"))
183183
.thenReturn("{\"color\":\"blue\",\"make\":\"Toyota\",\"model\":\"Prius\",\"owner\":\"Tomoko\"}");
184184

185185
Throwable thrown = catchThrowable(() -> {
186-
contract.createCar(ctx, "CAR000", "Nissan", "Leaf", "green", "Siobhán");
186+
contract.createCar(ctx, "CAR0", "Nissan", "Leaf", "green", "Siobhán");
187187
});
188188

189189
assertThat(thrown).isInstanceOf(ChaincodeException.class).hasNoCause()
190-
.hasMessage("Car CAR000 already exists");
190+
.hasMessage("Car CAR0 already exists");
191191
assertThat(((ChaincodeException) thrown).getPayload()).isEqualTo("CAR_ALREADY_EXISTS".getBytes());
192192
}
193193

@@ -197,9 +197,9 @@ public void whenCarDoesNotExist() {
197197
Context ctx = mock(Context.class);
198198
ChaincodeStub stub = mock(ChaincodeStub.class);
199199
when(ctx.getStub()).thenReturn(stub);
200-
when(stub.getStringState("CAR000")).thenReturn("");
200+
when(stub.getStringState("CAR0")).thenReturn("");
201201

202-
Car car = contract.createCar(ctx, "CAR000", "Nissan", "Leaf", "green", "Siobhán");
202+
Car car = contract.createCar(ctx, "CAR0", "Nissan", "Leaf", "green", "Siobhán");
203203

204204
assertThat(car).isEqualTo(new Car("Nissan", "Leaf", "green", "Siobhán"));
205205
}
@@ -213,14 +213,14 @@ void invokeQueryAllCarsTransaction() {
213213
when(ctx.getStub()).thenReturn(stub);
214214
when(stub.getStateByRange("CAR0", "CAR999")).thenReturn(new MockCarResultsIterator());
215215

216-
Car[] cars = contract.queryAllCars(ctx);
216+
CarQueryResult[] cars = contract.queryAllCars(ctx);
217217

218-
final List<Car> expectedCars = new ArrayList<Car>();
219-
expectedCars.add(new Car("Toyota", "Prius", "blue", "Tomoko"));
220-
expectedCars.add(new Car("Ford", "Mustang", "red", "Brad"));
221-
expectedCars.add(new Car("Hyundai", "Tucson", "green", "Jin Soo"));
222-
expectedCars.add(new Car("Fiat", "Punto", "violet", "Pari"));
223-
expectedCars.add(new Car("Holden", "Barina", "brown", "Shotaro"));
218+
final List<CarQueryResult> expectedCars = new ArrayList<CarQueryResult>();
219+
expectedCars.add(new CarQueryResult("CAR0", new Car("Toyota", "Prius", "blue", "Tomoko")));
220+
expectedCars.add(new CarQueryResult("CAR1", new Car("Ford", "Mustang", "red", "Brad")));
221+
expectedCars.add(new CarQueryResult("CAR2", new Car("Hyundai", "Tucson", "green", "Jin Soo")));
222+
expectedCars.add(new CarQueryResult("CAR7", new Car("Fiat", "Punto", "violet", "Pari")));
223+
expectedCars.add(new CarQueryResult("CAR9", new Car("Holden", "Barina", "brown", "Shotaro")));
224224

225225
assertThat(cars).containsExactlyElementsOf(expectedCars);
226226
}
@@ -234,12 +234,12 @@ public void whenCarExists() {
234234
Context ctx = mock(Context.class);
235235
ChaincodeStub stub = mock(ChaincodeStub.class);
236236
when(ctx.getStub()).thenReturn(stub);
237-
when(stub.getStringState("CAR000"))
237+
when(stub.getStringState("CAR0"))
238238
.thenReturn("{\"color\":\"blue\",\"make\":\"Toyota\",\"model\":\"Prius\",\"owner\":\"Tomoko\"}");
239239

240-
Car car = contract.changeCarOwner(ctx, "CAR000", "Dr Evil");
240+
Car car = contract.changeCarOwner(ctx, "CAR0", "Dr Evil");
241241

242-
assertThat(car).isEqualTo(new Car("Toyota", "Prius", "blue", "Dr Evil"));
242+
assertThat(car).isEqualTo(new CarQueryResult("CAR0", new Car("Toyota", "Prius", "blue", "Dr Evil")));
243243
}
244244

245245
@Test
@@ -248,14 +248,14 @@ public void whenCarDoesNotExist() {
248248
Context ctx = mock(Context.class);
249249
ChaincodeStub stub = mock(ChaincodeStub.class);
250250
when(ctx.getStub()).thenReturn(stub);
251-
when(stub.getStringState("CAR000")).thenReturn("");
251+
when(stub.getStringState("CAR0")).thenReturn("");
252252

253253
Throwable thrown = catchThrowable(() -> {
254-
contract.changeCarOwner(ctx, "CAR000", "Dr Evil");
254+
contract.changeCarOwner(ctx, "CAR0", "Dr Evil");
255255
});
256256

257257
assertThat(thrown).isInstanceOf(ChaincodeException.class).hasNoCause()
258-
.hasMessage("Car CAR000 does not exist");
258+
.hasMessage("Car CAR0 does not exist");
259259
assertThat(((ChaincodeException) thrown).getPayload()).isEqualTo("CAR_NOT_FOUND".getBytes());
260260
}
261261
}

0 commit comments

Comments
 (0)