diff --git a/src/main/java/blockchains/iaas/uni/stuttgart/de/jsonrpc/BalService.java b/src/main/java/blockchains/iaas/uni/stuttgart/de/jsonrpc/BalService.java index 9a80360..f78865f 100644 --- a/src/main/java/blockchains/iaas/uni/stuttgart/de/jsonrpc/BalService.java +++ b/src/main/java/blockchains/iaas/uni/stuttgart/de/jsonrpc/BalService.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2019 Institute for the Architecture of Application System - University of Stuttgart + * Copyright (c) 2019-2023 Institute for the Architecture of Application System - University of Stuttgart * Author: Ghareeb Falazi * * This program and the accompanying materials are made available under the @@ -12,12 +12,15 @@ package blockchains.iaas.uni.stuttgart.de.jsonrpc; import java.util.List; +import java.util.UUID; import blockchains.iaas.uni.stuttgart.de.api.exceptions.InvalidScipParameterException; import blockchains.iaas.uni.stuttgart.de.management.BlockchainManager; import blockchains.iaas.uni.stuttgart.de.api.model.Parameter; import blockchains.iaas.uni.stuttgart.de.api.model.QueryResult; import blockchains.iaas.uni.stuttgart.de.api.model.TimeFrame; +import blockchains.iaas.uni.stuttgart.de.management.tccsci.DistributedTransactionManager; +import blockchains.iaas.uni.stuttgart.de.management.tccsci.DistributedTransactionRepository; import com.github.arteam.simplejsonrpc.core.annotation.JsonRpcMethod; import com.github.arteam.simplejsonrpc.core.annotation.JsonRpcOptional; import com.github.arteam.simplejsonrpc.core.annotation.JsonRpcParam; @@ -34,6 +37,7 @@ public class BalService { private final String blockchainType; private final String blockchainId; private final String smartContractPath; + private static final String DTX_ID_FIELD_NAME = "dtx_id"; @JsonRpcMethod public String Invoke( @@ -47,9 +51,15 @@ public String Invoke( @JsonRpcParam("signature") String signature ) { log.info("Invoke method is executed!"); - BlockchainManager manager = new BlockchainManager(); - manager.invokeSmartContractFunction(blockchainId, smartContractPath, functionIdentifier, inputs, outputs, - requiredConfidence, callbackUrl, timeoutMillis, correlationId, signature); + if (inputs.stream().anyMatch(p -> p.getName().equals(DTX_ID_FIELD_NAME))) { + DistributedTransactionManager distributedTransactionManager = new DistributedTransactionManager(); + distributedTransactionManager.invokeSc(blockchainId, smartContractPath, functionIdentifier, inputs, outputs, + requiredConfidence, callbackUrl, timeoutMillis, correlationId, signature); + } else { + BlockchainManager manager = new BlockchainManager(); + manager.invokeSmartContractFunction(blockchainId, smartContractPath, functionIdentifier, inputs, outputs, + requiredConfidence, callbackUrl, timeoutMillis, correlationId, signature); + } return "OK"; } @@ -122,4 +132,32 @@ public QueryResult Query( throw new InvalidScipParameterException(); } + + @JsonRpcMethod + public String Start_Dtx() { + log.info("Start_Dtx method is executed!"); + DistributedTransactionManager manager = new DistributedTransactionManager(); + + return manager.startDtx().toString(); + } + + @JsonRpcMethod + public String Commit_Dtx(@JsonRpcParam(DTX_ID_FIELD_NAME) String dtxId) { + log.info("Commit_Dtx method is executed!"); + UUID uuid = UUID.fromString(dtxId); + DistributedTransactionManager manager = new DistributedTransactionManager(); + manager.commitDtx(uuid); + + return "OK"; + } + + @JsonRpcMethod + public String Abort_Dtx(@JsonRpcParam(DTX_ID_FIELD_NAME) String dtxId) { + log.info("Abort_Dtx method is executed!"); + UUID uuid = UUID.fromString(dtxId); + DistributedTransactionManager manager = new DistributedTransactionManager(); + manager.abortDtx(uuid); + + return "OK"; + } } diff --git a/src/main/java/blockchains/iaas/uni/stuttgart/de/management/tccsci/DistributedTransactionManager.java b/src/main/java/blockchains/iaas/uni/stuttgart/de/management/tccsci/DistributedTransactionManager.java index 35563bd..568e970 100644 --- a/src/main/java/blockchains/iaas/uni/stuttgart/de/management/tccsci/DistributedTransactionManager.java +++ b/src/main/java/blockchains/iaas/uni/stuttgart/de/management/tccsci/DistributedTransactionManager.java @@ -1,3 +1,15 @@ +/******************************************************************************** + * Copyright (c) 2023 Institute for the Architecture of Application System - + * University of Stuttgart + * Author: Ghareeb Falazi + * + * This program and the accompanying materials are made available under the + * terms the Apache Software License 2.0 + * which is available at https://www.apache.org/licenses/LICENSE-2.0. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + package blockchains.iaas.uni.stuttgart.de.management.tccsci; import blockchains.iaas.uni.stuttgart.de.adaptation.AdapterManager; diff --git a/src/main/java/blockchains/iaas/uni/stuttgart/de/management/tccsci/DistributedTransactionRepository.java b/src/main/java/blockchains/iaas/uni/stuttgart/de/management/tccsci/DistributedTransactionRepository.java index e3ca33d..44876f6 100644 --- a/src/main/java/blockchains/iaas/uni/stuttgart/de/management/tccsci/DistributedTransactionRepository.java +++ b/src/main/java/blockchains/iaas/uni/stuttgart/de/management/tccsci/DistributedTransactionRepository.java @@ -1,3 +1,15 @@ +/******************************************************************************** + * Copyright (c) 2023 Institute for the Architecture of Application System - + * University of Stuttgart + * Author: Ghareeb Falazi + * + * This program and the accompanying materials are made available under the + * terms the Apache Software License 2.0 + * which is available at https://www.apache.org/licenses/LICENSE-2.0. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + package blockchains.iaas.uni.stuttgart.de.management.tccsci; import blockchains.iaas.uni.stuttgart.de.management.model.DistributedTransaction; @@ -38,6 +50,10 @@ public DistributedTransaction getById(UUID txId) { return distributedTransactions.stream().filter(tx->tx.getId().equals(txId)).findFirst().orElse(null); } + public List getAll() { + return this.distributedTransactions; + } + public Collection getByState(DistributedTransactionState state) { return distributedTransactions.stream().filter(tx->tx.getState().equals(state)).collect(Collectors.toList()); } diff --git a/src/main/java/blockchains/iaas/uni/stuttgart/de/restapi/Controllers/DistributedTransactionsController.java b/src/main/java/blockchains/iaas/uni/stuttgart/de/restapi/Controllers/DistributedTransactionsController.java new file mode 100644 index 0000000..66f74cf --- /dev/null +++ b/src/main/java/blockchains/iaas/uni/stuttgart/de/restapi/Controllers/DistributedTransactionsController.java @@ -0,0 +1,64 @@ +/******************************************************************************** + * Copyright (c) 2023 Institute for the Architecture of Application System - + * University of Stuttgart + * + * Author: Ghareeb Falazi + * + * This program and the accompanying materials are made available under the + * terms the Apache Software License 2.0 + * which is available at https://www.apache.org/licenses/LICENSE-2.0. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +package blockchains.iaas.uni.stuttgart.de.restapi.Controllers; + +import blockchains.iaas.uni.stuttgart.de.management.model.DistributedTransaction; +import blockchains.iaas.uni.stuttgart.de.management.tccsci.DistributedTransactionRepository; +import blockchains.iaas.uni.stuttgart.de.restapi.model.response.LinkCollectionResponse; +import blockchains.iaas.uni.stuttgart.de.restapi.util.UriUtil; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriInfo; +import java.util.List; +import java.util.UUID; + +@Path("distributed-transactions") +public class DistributedTransactionsController { + + @Context + protected UriInfo uriInfo; + @GET + public Response get() { + List all = DistributedTransactionRepository.getInstance().getAll(); + final LinkCollectionResponse response = new LinkCollectionResponse(); + + for (final DistributedTransaction dtx : all) { + response.add(UriUtil.generateSubResourceLink(uriInfo, dtx.getId().toString(), false, "self")); + } + + return Response.ok(response).build(); + } + + @GET + @Path("/{dtxId}") + public Response getSubscriptionDetails(@PathParam("dtxId") final String dtxId) { + UUID uuid = UUID.fromString(dtxId); + DistributedTransaction dtx = DistributedTransactionRepository.getInstance().getById(uuid); + if (dtx != null) { + return Response + .status(Response.Status.OK) + .entity(dtx) + .type(MediaType.APPLICATION_JSON) + .build(); + } else { + return Response.status(Response.Status.NOT_FOUND).build(); + } + } + +}