diff --git a/chaincode/GeneralChainCode/java/pom.xml b/chaincode/GeneralChainCode/java/pom.xml new file mode 100644 index 00000000..a1a8db0e --- /dev/null +++ b/chaincode/GeneralChainCode/java/pom.xml @@ -0,0 +1,138 @@ + + + 4.0.0 + + com.gvssimux + FabricGeneralChainCode + 1.0-SNAPSHOT + + + 8 + 8 + UTF-8 + UTF-8 + + + + + aliyun + https://maven.aliyun.com/repository/public + + true + + + true + + + + jitpack.io + https://www.jitpack.io + + + artifactory + https://hyperledger.jfrog.io/hyperledger/fabric-maven + + + + + + + + org.hyperledger.fabric-chaincode-java + fabric-chaincode-shim + 2.4.1 + + + org.hyperledger.fabric-chaincode-java + fabric-chaincode-protos + 2.4.1 + + + org.projectlombok + lombok + 1.18.22 + + + org.apache.commons + commons-collections4 + 4.4 + + + org.apache.commons + commons-lang3 + 3.12.0 + + + commons-codec + commons-codec + 1.15 + + + com.alibaba + fastjson + 1.2.79 + + + com.owlike + genson + 1.5 + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + + + + + + src/main/java + + + maven-compiler-plugin + 3.8.1 + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-shade-plugin + 3.1.0 + + + package + + shade + + + chaincode + + + org.hyperledger.fabric.contract.ContractRouter + + + + + *:* + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + + + + + + + + + + + + \ No newline at end of file diff --git a/chaincode/GeneralChainCode/java/src/main/java/ChainCode.java b/chaincode/GeneralChainCode/java/src/main/java/ChainCode.java new file mode 100644 index 00000000..c74083cc --- /dev/null +++ b/chaincode/GeneralChainCode/java/src/main/java/ChainCode.java @@ -0,0 +1,100 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + */ + +import lombok.extern.java.Log; +import org.apache.commons.collections4.IterableUtils; +import org.hyperledger.fabric.contract.Context; +import org.hyperledger.fabric.contract.ContractInterface; +import org.hyperledger.fabric.contract.annotation.*; +import org.hyperledger.fabric.shim.ChaincodeStub; +import org.hyperledger.fabric.shim.ledger.KeyValue; +import org.hyperledger.fabric.shim.ledger.QueryResultsIterator; +import java.util.ArrayList; +import java.util.List; + + +@Contract( + name = "GeneralChainCode", + info = @Info( + title = "GeneralChainCode contract", + description = "The hyperlegendary FabricGeneralChainCode contract", + version = "0.0.1-SNAPSHOT", + license = @License( + name = "Apache 2.0 License", + url = "http://www.apache.org/licenses/LICENSE-2.0.html"), + contact = @Contact( + email = "gvssimux@qq.com", + name = "Shanzj", + url = "www.gvssimux.com"))) +@Default +@Log +public class ChainCode implements ContractInterface { + + @Transaction + public void initLedger(final Context ctx) { + String value = "{\n" + + " \"name\":\"GeneralChainCode\",\n" + + " \"email\":\"gvssimux@qq.com\",\n" + + " \"author\":\"ShanZJ\",\n" + + " \"url\":\"www.gvssimux.com\"\n" + + '}'; + ChaincodeStub stub = ctx.getStub(); + stub.putStringState("FabricGeneralChainCode" , value); + } + + @Transaction + public static QueryResultList richQuery(final Context ctx, String s) { + return InvokingMethod.richQuery(ctx,s); + } + + @Transaction + public static QueryResultList queryAllByKey(final Context ctx, final String key){ + return InvokingMethod.queryAllByKey(ctx,key); + } + + @Transaction + public String queryData(final Context ctx, final String key) { + return InvokingMethod.queryData(ctx,key); + } + + @Transaction + public static String createData(final Context ctx, String key, String jsonData) throws ClassNotFoundException { + return InvokingMethod.createData(ctx,key,jsonData); + } + @Transaction + public static String deleteData(final Context ctx, final String key){ + return InvokingMethod.deleteData(ctx,key); + } + + @Transaction + public static String updateData(final Context ctx, final String key,String value){ + return InvokingMethod.updateData(ctx,key,value); + } + + + + + + @Override + public void beforeTransaction(Context ctx) { + log.info("*************************************** beforeTransaction ***************************************"); + } + + + @Override + public void afterTransaction(Context ctx, Object result) { + log.info("*************************************** afterTransaction ***************************************"); + System.out.println("result --------> " + result); + } + + + + + + + + + + +} diff --git a/chaincode/GeneralChainCode/java/src/main/java/InvokingMethod.java b/chaincode/GeneralChainCode/java/src/main/java/InvokingMethod.java new file mode 100644 index 00000000..8a0ef0eb --- /dev/null +++ b/chaincode/GeneralChainCode/java/src/main/java/InvokingMethod.java @@ -0,0 +1,116 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + */ + +import com.google.inject.internal.util.Lists; +import lombok.extern.java.Log; +import org.apache.commons.collections4.IterableUtils; +import org.apache.commons.lang3.StringUtils; +import org.hyperledger.fabric.contract.Context; +import org.hyperledger.fabric.contract.annotation.Transaction; +import org.hyperledger.fabric.shim.ChaincodeException; +import org.hyperledger.fabric.shim.ChaincodeStub; +import org.hyperledger.fabric.shim.ledger.KeyValue; +import org.hyperledger.fabric.shim.ledger.QueryResultsIterator; +import java.util.ArrayList; +import java.util.List; + + +@Log +public class InvokingMethod { + + @Transaction + public static QueryResultList richQuery(final Context ctx, String s) { + QueryResultList resultList = new QueryResultList(); + QueryResultsIterator queryResult = ctx.getStub().getQueryResult(s); + List results = Lists.newArrayList(); + if (! IterableUtils.isEmpty(queryResult)) { + for (KeyValue kv : queryResult) { + QueryResult Result = new QueryResult(); + Result.setKey(kv.getKey()); + Result.setJson(kv.getStringValue()); + results.add(Result); + } + resultList.setResultList(results); + } + return resultList; + } + + @Transaction() + public static QueryResultList queryAllByKey(final Context ctx, String key) { + ChaincodeStub stub = ctx.getStub(); + final String startKey = key+"1"; + final String endKey = key+"99"; + QueryResultList resultList = new QueryResultList(); + QueryResultsIterator queryResult = stub.getStateByRange(startKey, endKey); + List results = Lists.newArrayList(); + if (! IterableUtils.isEmpty(queryResult)) { + for (KeyValue kv: queryResult) { + QueryResult Result = new QueryResult(); + Result.setKey(kv.getKey()); + Result.setJson(kv.getStringValue()); + results.add(Result); + } + resultList.setResultList(results); + } + return resultList; + } + + + + + @Transaction + public static String queryData(final Context ctx, final String key) { + ChaincodeStub stub = ctx.getStub(); + String State = stub.getStringState(key); + if (StringUtils.isBlank(State)) { + String errorMessage = String.format("key: %s does not exist", key); + System.out.println(errorMessage); + throw new ChaincodeException(errorMessage); + } + return State; + } + + @Transaction + public static String createData(final Context ctx, final String key,String json) { + ChaincodeStub stub = ctx.getStub(); + String teaAreaState = stub.getStringState(key); + if (StringUtils.isNotBlank(teaAreaState)) { + String errorMessage = String.format("key: %s already exists", key); + System.out.println(errorMessage); + throw new ChaincodeException(errorMessage); + } + stub.putStringState(key, json); + return json; + } + + @Transaction + public static String deleteData(final Context ctx,final String key){ + ChaincodeStub stub = ctx.getStub(); + String state = stub.getStringState(key); + if (StringUtils.isBlank(state)){ + String errorMessage = String.format("Key %s does not exist",key); + System.out.println(errorMessage); + throw new ChaincodeException(errorMessage); + } + stub.delState(key); + return state; + } + + @Transaction + public static String updateData(final Context ctx, final String key,String json) { + ChaincodeStub stub = ctx.getStub(); + String state = stub.getStringState(key); + if (StringUtils.isBlank(state)) { + String errorMessage = String.format("key: %s does exists", key); + System.out.println(errorMessage); + throw new ChaincodeException(errorMessage); + } + stub.putStringState(key, json); + return json; + } + + + + +} diff --git a/chaincode/GeneralChainCode/java/src/main/java/QueryResult.java b/chaincode/GeneralChainCode/java/src/main/java/QueryResult.java new file mode 100644 index 00000000..a5d9574c --- /dev/null +++ b/chaincode/GeneralChainCode/java/src/main/java/QueryResult.java @@ -0,0 +1,18 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + */ +import lombok.Data; +import lombok.experimental.Accessors; +import org.hyperledger.fabric.contract.annotation.DataType; +import org.hyperledger.fabric.contract.annotation.Property; + +@DataType() +@Data +@Accessors(chain = true) +public class QueryResult { + @Property() + private String key; + + @Property() + private String json; +} diff --git a/chaincode/GeneralChainCode/java/src/main/java/QueryResultList.java b/chaincode/GeneralChainCode/java/src/main/java/QueryResultList.java new file mode 100644 index 00000000..aa234298 --- /dev/null +++ b/chaincode/GeneralChainCode/java/src/main/java/QueryResultList.java @@ -0,0 +1,15 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + */ +import lombok.Data; +import org.hyperledger.fabric.contract.annotation.DataType; +import org.hyperledger.fabric.contract.annotation.Property; +import java.util.List; + +@DataType +@Data +public class QueryResultList { + + @Property + List resultList; +}