mirror of
https://github.com/hyperledger/fabric-samples.git
synced 2026-06-26 03:25:09 +00:00
Asset_transfer Java Contract
Added in example error cases, and support Signed-off-by: Matthew B White <whitemat@uk.ibm.com>
This commit is contained in:
parent
ce66638035
commit
312e34da3f
5 changed files with 142 additions and 18 deletions
|
|
@ -58,7 +58,7 @@ jacocoTestCoverageVerification {
|
|||
violationRules {
|
||||
rule {
|
||||
limit {
|
||||
minimum = 0.9
|
||||
minimum = 0.8
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
//CHECKSTYLE:OFF: checkstyle:magicnumber
|
||||
package org.hyperledger.fabric.samples.assettransfer;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
|
@ -53,8 +53,6 @@ public final class AssetTransfer implements ContractInterface {
|
|||
*/
|
||||
@Transaction(intent = Transaction.TYPE.SUBMIT)
|
||||
public void InitLedger(final Context ctx) {
|
||||
ChaincodeStub stub = ctx.getStub();
|
||||
|
||||
CreateAsset(ctx, "asset1", "blue", 5, "Tomoko", 300);
|
||||
CreateAsset(ctx, "asset2", "red", 5, "Brad", 400);
|
||||
CreateAsset(ctx, "asset3", "green", 10, "Jin Soo", 500);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package org.hyperledger.fabric.samples.assettransfer;
|
||||
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import org.hyperledger.fabric.Logging;
|
||||
import org.hyperledger.fabric.contract.Context;
|
||||
import org.hyperledger.fabric.contract.ContractInterface;
|
||||
import org.hyperledger.fabric.contract.annotation.Contract;
|
||||
import org.hyperledger.fabric.contract.annotation.Transaction;
|
||||
import org.hyperledger.fabric.contract.annotation.Transaction.TYPE;
|
||||
|
||||
/**
|
||||
* A 'support' contract; specifically this enables the logging level to be
|
||||
* altered by sending a transaction.
|
||||
*/
|
||||
@Contract(name = "ContractSupport")
|
||||
public class ContractSupport implements ContractInterface {
|
||||
|
||||
private static Logger logger = Logger.getLogger(ContractSupport.class.getName());
|
||||
|
||||
/**
|
||||
* Required Default Constructor.
|
||||
*/
|
||||
public ContractSupport() {
|
||||
logger.info(() -> "ContractSupport:<init>");
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the log level.
|
||||
*
|
||||
* The setLogLevel method has the required parsing to manage the levels.
|
||||
*
|
||||
* @param ctx Transactional Context
|
||||
* @param level string id
|
||||
*/
|
||||
@Transaction(intent = TYPE.EVALUATE)
|
||||
public void setLogLevel(final Context ctx, final String level) {
|
||||
logger.info(() -> "Setting log lebel to " + level);
|
||||
Logging.setLogLevel(level);
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,85 @@
|
|||
/*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package org.hyperledger.fabric.samples.assettransfer;
|
||||
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import org.hyperledger.fabric.contract.Context;
|
||||
import org.hyperledger.fabric.contract.ContractInterface;
|
||||
import org.hyperledger.fabric.contract.annotation.Contact;
|
||||
import org.hyperledger.fabric.contract.annotation.Contract;
|
||||
import org.hyperledger.fabric.contract.annotation.Info;
|
||||
import org.hyperledger.fabric.contract.annotation.License;
|
||||
import org.hyperledger.fabric.contract.annotation.Transaction;
|
||||
import org.hyperledger.fabric.contract.annotation.Transaction.TYPE;
|
||||
import org.hyperledger.fabric.shim.ChaincodeException;
|
||||
|
||||
/**
|
||||
* This example contract shows the different ways that errors can be returned
|
||||
* from the functions
|
||||
*
|
||||
* Note that the recommended way is to use the `ChaincodeException` to return
|
||||
* business level errors. Te other methods, are to allow you to test client
|
||||
* applications and how they respond in different circumstances.
|
||||
*
|
||||
*/
|
||||
@Contract(name = "ErrorContract", info = @Info(title = "ErrorContract contract", description = "My Smart Contract", version = "0.0.1", license = @License(name = "Apache-2.0", url = ""), contact = @Contact(email = "basic-java-20@example.com", name = "basic-java-20", url = "http://basic-java-20.me")))
|
||||
public final class ErrorContract implements ContractInterface {
|
||||
|
||||
private static Logger logger = Logger.getLogger(ErrorContract.class.getName());
|
||||
|
||||
/**
|
||||
* Required Default Constructor.
|
||||
*/
|
||||
public ErrorContract() {
|
||||
logger.info(() -> "MyAssetContract:<init>");
|
||||
}
|
||||
|
||||
@Transaction(intent = TYPE.SUBMIT)
|
||||
public void payloadChaincodeException(final Context ctx) {
|
||||
String payload = String.format("{\"error\":{\"code\":404,\"owner\":\"MrAnon\"}}");
|
||||
ChaincodeException cce = new ChaincodeException("[ErrorContract] Payload & Message", payload);
|
||||
|
||||
throw cce;
|
||||
}
|
||||
|
||||
@Transaction(intent = TYPE.SUBMIT)
|
||||
public void messageOnlyChaincodeException(final Context ctx) {
|
||||
ChaincodeException cce = new ChaincodeException("[ErrorContract] Message Only");
|
||||
throw cce;
|
||||
}
|
||||
|
||||
@Transaction(intent = TYPE.SUBMIT)
|
||||
public void causeChaincodeException(final Context ctx) {
|
||||
Throwable cause = new NullPointerException("[ErrorContract] Just a fake NPE");
|
||||
ChaincodeException cce = new ChaincodeException(cause);
|
||||
throw cce;
|
||||
}
|
||||
|
||||
static class AnOtherException extends Exception {
|
||||
AnOtherException(final String msg) {
|
||||
super(msg);
|
||||
}
|
||||
}
|
||||
|
||||
@Transaction(intent = TYPE.SUBMIT)
|
||||
public void anOtherException(final Context ctx) throws AnOtherException {
|
||||
AnOtherException e = new AnOtherException("[ErrorContract] Another type of exception");
|
||||
throw e;
|
||||
}
|
||||
|
||||
static class AnOtherRuntimeException extends RuntimeException {
|
||||
AnOtherRuntimeException(final String msg) {
|
||||
super(msg);
|
||||
}
|
||||
}
|
||||
|
||||
@Transaction(intent = TYPE.SUBMIT)
|
||||
public void runtimeException(final Context ctx) {
|
||||
AnOtherRuntimeException e = new AnOtherRuntimeException("[ErrorContract] Another type of runtime exception");
|
||||
throw e;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -13,7 +13,6 @@ import static java.nio.charset.StandardCharsets.UTF_8;
|
|||
import org.hyperledger.fabric.contract.annotation.DataType;
|
||||
import org.hyperledger.fabric.contract.annotation.Property;
|
||||
|
||||
|
||||
import org.json.JSONObject;
|
||||
|
||||
@DataType()
|
||||
|
|
@ -34,8 +33,7 @@ public final class Asset {
|
|||
@Property()
|
||||
private int appraisedValue;
|
||||
|
||||
public Asset(final String assetID, final String color,
|
||||
final int size, final String owner, final int value) {
|
||||
public Asset(final String assetID, final String color, final int size, final String owner, final int value) {
|
||||
|
||||
this.assetID = assetID;
|
||||
this.color = color;
|
||||
|
|
@ -86,7 +84,7 @@ public final class Asset {
|
|||
}
|
||||
|
||||
public String serialize(final String privateProps) {
|
||||
Map<String, Object> tMap = new HashMap();
|
||||
Map<String, Object> tMap = new HashMap<String, Object>();
|
||||
tMap.put("ID", assetID);
|
||||
tMap.put("Color", color);
|
||||
tMap.put("Owner", owner);
|
||||
|
|
@ -134,12 +132,9 @@ public final class Asset {
|
|||
|
||||
Asset other = (Asset) obj;
|
||||
|
||||
return Objects.deepEquals(
|
||||
new String[]{getAssetID(), getColor(), getOwner()},
|
||||
return Objects.deepEquals(new String[] { getAssetID(), getColor(), getOwner() },
|
||||
new String[] { other.getAssetID(), other.getColor(), other.getOwner() })
|
||||
&&
|
||||
Objects.deepEquals(
|
||||
new int[]{getSize(), getAppraisedValue()},
|
||||
&& Objects.deepEquals(new int[] { getSize(), getAppraisedValue() },
|
||||
new int[] { other.getSize(), other.getAppraisedValue() });
|
||||
}
|
||||
|
||||
|
|
@ -150,9 +145,9 @@ public final class Asset {
|
|||
|
||||
@Override
|
||||
public String toString() {
|
||||
return this.getClass().getSimpleName() + "@" + Integer.toHexString(hashCode())
|
||||
+ " [assetID=" + assetID + ", appraisedValue=" + appraisedValue + ", color="
|
||||
+ color + ", size=" + size + ", owner=" + owner + "]";
|
||||
return this.getClass().getSimpleName() + "@" + Integer.toHexString(hashCode()) + " [assetID=" + assetID
|
||||
+ ", appraisedValue=" + appraisedValue + ", color=" + color + ", size=" + size + ", owner=" + owner
|
||||
+ "]";
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue