Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,8 @@ public enum ClientError implements ScalarDlError {
StatusCode.RUNTIME_ERROR, "004", "Processing JSON failed. Details: %s", "", ""),
CLASS_FILE_LOAD_FAILED(
StatusCode.RUNTIME_ERROR, "005", "Failed to load the class file. File: %s", "", ""),
WRITING_RESULT_TO_FILE_FAILED(
StatusCode.RUNTIME_ERROR, "006", "Failed to write the result to a file. Details: %s", "", ""),
;

private static final String COMPONENT_NAME = "DL-CLIENT";
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.scalar.dl.client.tool;

import com.google.common.annotations.VisibleForTesting;
import com.scalar.dl.client.config.ClientConfig;
import com.scalar.dl.client.config.GatewayClientConfig;
import com.scalar.dl.client.exception.ClientException;
import com.scalar.dl.client.service.ClientService;
import com.scalar.dl.client.service.ClientServiceFactory;
import java.io.File;
import java.util.concurrent.Callable;

public abstract class AbstractClientCommand extends CommonOptions implements Callable<Integer> {

@Override
public Integer call() throws Exception {
return call(new ClientServiceFactory());
}

@VisibleForTesting
public final Integer call(ClientServiceFactory factory) throws Exception {
try {
ClientService service =
useGateway
? factory.create(new GatewayClientConfig(new File(properties)))
: factory.create(new ClientConfig(new File(properties)));
return execute(service);
} catch (ClientException e) {
Common.printError(e);
printStackTrace(e);
return 1;
} finally {
factory.close();
}
}

/**
* Executes the specific command logic.
*
* @param service the client service to use for execution.
* @return the exit code.
* @throws ClientException if the execution fails.
*/
protected abstract Integer execute(ClientService service) throws ClientException;
}
38 changes: 5 additions & 33 deletions client/src/main/java/com/scalar/dl/client/tool/Bootstrap.java
Original file line number Diff line number Diff line change
@@ -1,46 +1,18 @@
package com.scalar.dl.client.tool;

import com.google.common.annotations.VisibleForTesting;
import com.scalar.dl.client.config.ClientConfig;
import com.scalar.dl.client.config.GatewayClientConfig;
import com.scalar.dl.client.exception.ClientException;
import com.scalar.dl.client.service.ClientService;
import com.scalar.dl.client.service.ClientServiceFactory;
import java.io.File;
import java.util.concurrent.Callable;
import picocli.CommandLine.Command;

@Command(
name = "bootstrap",
description = "Bootstrap the ledger by registering identity and system contracts.")
public class Bootstrap extends CommonOptions implements Callable<Integer> {
public class Bootstrap extends AbstractClientCommand {

@Override
public Integer call() throws Exception {
return call(new ClientServiceFactory());
}

@VisibleForTesting
Integer call(ClientServiceFactory factory) throws Exception {
ClientService service =
useGateway
? factory.create(new GatewayClientConfig(new File(properties)))
: factory.create(new ClientConfig(new File(properties)));
return call(factory, service);
}

@VisibleForTesting
Integer call(ClientServiceFactory factory, ClientService service) {
try {
service.bootstrap();
Common.printOutput(null);
return 0;
} catch (ClientException e) {
Common.printError(e);
printStackTrace(e);
return 1;
} finally {
factory.close();
}
protected Integer execute(ClientService service) throws ClientException {
service.bootstrap();
Common.printOutput(null);
return 0;
}
}
Original file line number Diff line number Diff line change
@@ -1,50 +1,22 @@
package com.scalar.dl.client.tool;

import com.google.common.annotations.VisibleForTesting;
import com.scalar.dl.client.config.ClientConfig;
import com.scalar.dl.client.config.GatewayClientConfig;
import com.scalar.dl.client.exception.ClientException;
import com.scalar.dl.client.service.ClientService;
import com.scalar.dl.client.service.ClientServiceFactory;
import java.io.File;
import java.util.concurrent.Callable;
import picocli.CommandLine;
import picocli.CommandLine.Command;

@Command(name = "register-cert", description = "Register a specified certificate.")
public class CertificateRegistration extends CommonOptions implements Callable<Integer> {
public class CertificateRegistration extends AbstractClientCommand {

public static void main(String[] args) {
int exitCode = new CommandLine(new CertificateRegistration()).execute(args);
System.exit(exitCode);
}

@Override
public Integer call() throws Exception {
return call(new ClientServiceFactory());
}

@VisibleForTesting
Integer call(ClientServiceFactory factory) throws Exception {
ClientService service =
useGateway
? factory.create(new GatewayClientConfig(new File(properties)))
: factory.create(new ClientConfig(new File(properties)));
return call(factory, service);
}

@VisibleForTesting
Integer call(ClientServiceFactory factory, ClientService service) {
try {
service.registerCertificate();
Common.printOutput(null);
return 0;
} catch (ClientException e) {
Common.printError(e);
printStackTrace(e);
return 1;
} finally {
factory.close();
}
protected Integer execute(ClientService service) throws ClientException {
service.registerCertificate();
Common.printOutput(null);
return 0;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,15 @@

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.annotations.VisibleForTesting;
import com.scalar.dl.client.config.ClientConfig;
import com.scalar.dl.client.config.GatewayClientConfig;
import com.scalar.dl.client.exception.ClientException;
import com.scalar.dl.client.service.ClientService;
import com.scalar.dl.client.service.ClientServiceFactory;
import com.scalar.dl.ledger.model.ContractExecutionResult;
import com.scalar.dl.ledger.util.JacksonSerDe;
import java.io.File;
import java.util.concurrent.Callable;
import picocli.CommandLine;
import picocli.CommandLine.Command;

@Command(name = "execute-contract", description = "Execute a specified contract.")
public class ContractExecution extends CommonOptions implements Callable<Integer> {
public class ContractExecution extends AbstractClientCommand {

@CommandLine.Option(
names = {"--contract-id"},
Expand Down Expand Up @@ -61,63 +55,41 @@ public static void main(String[] args) {
}

@Override
public Integer call() throws Exception {
return call(new ClientServiceFactory());
}

@VisibleForTesting
Integer call(ClientServiceFactory factory) throws Exception {
ClientService service =
useGateway
? factory.create(new GatewayClientConfig(new File(properties)))
: factory.create(new ClientConfig(new File(properties)));
return call(factory, service);
}

@VisibleForTesting
Integer call(ClientServiceFactory factory, ClientService service) throws Exception {
protected Integer execute(ClientService service) throws ClientException {
JacksonSerDe serde = new JacksonSerDe(new ObjectMapper());

try {
if (deserializationFormat == DeserializationFormat.JSON) {
JsonNode jsonContractArgument = serde.deserialize(contractArgument);
JsonNode jsonFunctionArgument = null;
if (functionArgument != null) {
jsonFunctionArgument = serde.deserialize(functionArgument);
}
ContractExecutionResult result =
service.executeContract(
contractId, jsonContractArgument, functionId, jsonFunctionArgument);

result
.getContractResult()
.ifPresent(
r -> {
System.out.println("Contract result:");
Common.printJson(serde.deserialize(r));
});
result
.getFunctionResult()
.ifPresent(
r -> {
System.out.println("Function result:");
Common.printJson(serde.deserialize(r));
});
} else if (deserializationFormat == DeserializationFormat.STRING) {
ContractExecutionResult result =
service.executeContract(contractId, contractArgument, functionId, functionArgument);

result.getContractResult().ifPresent(r -> System.out.println("Contract result: " + r));
result.getFunctionResult().ifPresent(r -> System.out.println("Function result: " + r));
if (deserializationFormat == DeserializationFormat.JSON) {
JsonNode jsonContractArgument = serde.deserialize(contractArgument);
JsonNode jsonFunctionArgument = null;
if (functionArgument != null) {
jsonFunctionArgument = serde.deserialize(functionArgument);
}
ContractExecutionResult result =
service.executeContract(
contractId, jsonContractArgument, functionId, jsonFunctionArgument);

return 0;
} catch (ClientException e) {
Common.printError(e);
printStackTrace(e);
return 1;
} finally {
factory.close();
result
.getContractResult()
.ifPresent(
r -> {
System.out.println("Contract result:");
Common.printJson(serde.deserialize(r));
});
result
.getFunctionResult()
.ifPresent(
r -> {
System.out.println("Function result:");
Common.printJson(serde.deserialize(r));
});
} else if (deserializationFormat == DeserializationFormat.STRING) {
ContractExecutionResult result =
service.executeContract(contractId, contractArgument, functionId, functionArgument);

result.getContractResult().ifPresent(r -> System.out.println("Contract result: " + r));
result.getFunctionResult().ifPresent(r -> System.out.println("Function result: " + r));
}

return 0;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,14 @@

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.annotations.VisibleForTesting;
import com.scalar.dl.client.config.ClientConfig;
import com.scalar.dl.client.config.GatewayClientConfig;
import com.scalar.dl.client.exception.ClientException;
import com.scalar.dl.client.service.ClientService;
import com.scalar.dl.client.service.ClientServiceFactory;
import com.scalar.dl.ledger.util.JacksonSerDe;
import java.io.File;
import java.util.concurrent.Callable;
import picocli.CommandLine;
import picocli.CommandLine.Command;

@Command(name = "register-contract", description = "Register a specified contract.")
public class ContractRegistration extends CommonOptions implements Callable<Integer> {
public class ContractRegistration extends AbstractClientCommand {

@CommandLine.Option(
names = {"--contract-id"},
Expand Down Expand Up @@ -60,42 +54,21 @@ public static void main(String[] args) {
}

@Override
public Integer call() throws Exception {
return call(new ClientServiceFactory());
}

@VisibleForTesting
Integer call(ClientServiceFactory factory) throws Exception {
ClientService service =
useGateway
? factory.create(new GatewayClientConfig(new File(properties)))
: factory.create(new ClientConfig(new File(properties)));
return call(factory, service);
}

Integer call(ClientServiceFactory factory, ClientService service) {
protected Integer execute(ClientService service) throws ClientException {
JacksonSerDe serde = new JacksonSerDe(new ObjectMapper());

try {
if (deserializationFormat == DeserializationFormat.JSON) {
JsonNode jsonContractProperties = null;
if (contractProperties != null) {
jsonContractProperties = serde.deserialize(contractProperties);
}
service.registerContract(
contractId, contractBinaryName, contractClassFile, jsonContractProperties);
} else if (deserializationFormat == DeserializationFormat.STRING) {
service.registerContract(
contractId, contractBinaryName, contractClassFile, contractProperties);
if (deserializationFormat == DeserializationFormat.JSON) {
JsonNode jsonContractProperties = null;
if (contractProperties != null) {
jsonContractProperties = serde.deserialize(contractProperties);
}
Common.printOutput(null);
return 0;
} catch (ClientException e) {
Common.printError(e);
printStackTrace(e);
return 1;
} finally {
factory.close();
service.registerContract(
contractId, contractBinaryName, contractClassFile, jsonContractProperties);
} else if (deserializationFormat == DeserializationFormat.STRING) {
service.registerContract(
contractId, contractBinaryName, contractClassFile, contractProperties);
}
Common.printOutput(null);
return 0;
}
}
Loading
Loading