Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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
16 changes: 14 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>MultiChainJavaAPI</groupId>
<artifactId>MultiChainJavaAPI</artifactId>
<version>0.3.1-SNAPSHOT</version>
<version>0.4.0-SNAPSHOT</version>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
Expand All @@ -12,8 +12,10 @@
<xmlrpc-client.version>3.1.3</xmlrpc-client.version>
<httpclient.version>4.3.6</httpclient.version>
<gson.version>2.8.1</gson.version>
<commons-codec.version>1.10</commons-codec.version>
<commons-collections4.version>4.1</commons-collections4.version>
</properties>

<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
Expand Down Expand Up @@ -43,5 +45,15 @@
<artifactId>gson</artifactId>
<version>${gson.version}</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>${commons-codec.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>${commons-collections4.version}</version>
</dependency>
</dependencies>
</project>
35 changes: 35 additions & 0 deletions src/main/java/multichain/command/KeyCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
* Copyright (C) 2017 Worldline, Inc.
*
* MultiChainJavaAPI code distributed under the GPLv3 license, see COPYING file.
* https://github.com/SimplyUb/MultiChainJavaAPI/blob/master/LICENSE
*
*/
package multichain.command;

import java.util.ArrayList;
import java.util.List;

import multichain.command.builders.QueryBuilderBalance;
import multichain.command.builders.QueryBuilderKey;
import multichain.object.BalanceAsset;
import multichain.object.formatters.BalanceFormatter;

/**
* @author Ub - H. MARTEAU
* @version 3.0
*/
public class KeyCommand extends QueryBuilderKey {
public KeyCommand(String ip, String port, String login, String password) {
initialize(ip, port, login, password);
}

public Object getPrivkey(String privkey) throws MultichainException {
return executeDumpPrivkey(privkey);
}

public Object importPrivkey(String privkey) throws MultichainException {
return executeImportPrivkey(privkey);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public class MultiChainCommand {
private RAWTransactionCommand rawTransactionCommand;
private StreamCommand streamCommand;
private WalletTransactionCommand walletTransactionCommand;
private KeyCommand keyCommand;

/**
*
Expand All @@ -38,6 +39,7 @@ public MultiChainCommand(String ip, String port, String login, String password)
rawTransactionCommand = new RAWTransactionCommand(ip, port, login, password);
streamCommand = new StreamCommand(ip, port, login, password);
walletTransactionCommand = new WalletTransactionCommand(ip, port, login, password);
keyCommand = new KeyCommand(ip, port, login, password);
}

/**
Expand Down Expand Up @@ -190,4 +192,12 @@ public void setChainCommand(ChainCommand chainCommand) {
this.chainCommand = chainCommand;
}

public KeyCommand getKeyCommand() {
return keyCommand;
}

public void setKeyCommand(KeyCommand keyCommand) {
this.keyCommand = keyCommand;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -648,7 +648,7 @@ public String sendToAddress(String address, List<BalanceAssetBase> assets) throw
* @return
* @throws MultichainException
*/
public String SendToAddress(String address, double amount) throws MultichainException {
public String sendToAddress(String address, double amount) throws MultichainException {
String stringSendToAddress = "";

Object objectSendToAddress = executeSendToAddress(address, amount);
Expand Down Expand Up @@ -687,7 +687,7 @@ public String SendToAddress(String address, double amount) throws MultichainExce
* @return
* @throws MultichainException
*/
public String SendWithMetaData(String address, List<BalanceAssetBase> assets, String hexMetaData)
public String sendWithMetaData(String address, List<BalanceAssetBase> assets, String hexMetaData)
throws MultichainException {
String stringSendWithMetaData = "";

Expand Down Expand Up @@ -727,7 +727,7 @@ public String SendWithMetaData(String address, List<BalanceAssetBase> assets, St
* @return
* @throws MultichainException
*/
public String SendWithMetaData(String address, double amount, String hexMetaData) throws MultichainException {
public String sendWithMetaData(String address, double amount, String hexMetaData) throws MultichainException {
String stringSendWithMetaData = "";

Object objectSendWithMetaData = executeSendWithMetaData(address, amount, hexMetaData);
Expand Down Expand Up @@ -769,16 +769,16 @@ public String SendWithMetaData(String address, double amount, String hexMetaData
* @return
* @throws MultichainException
*/
public String SendWithMetaDataFrom(String fromAddress, String toAddress, List<BalanceAssetBase> assets,
public String sendWithMetaDataFrom(String fromAddress, String toAddress, List<BalanceAssetBase> assets,
String hexMetaData) throws MultichainException {
String stringSendWithMetaDatarom = "";
String stringSendWithMetaDataFrom = "";

Object objectSendWithMetaDataFrom = executeSendWithMetaDataFrom(fromAddress, toAddress, assets, hexMetaData);
if (verifyInstance(objectSendWithMetaDataFrom, String.class)) {
stringSendWithMetaDatarom = (String) objectSendWithMetaDataFrom;
stringSendWithMetaDataFrom = (String) objectSendWithMetaDataFrom;
}

return stringSendWithMetaDatarom;
return stringSendWithMetaDataFrom;
}

/**
Expand Down Expand Up @@ -812,16 +812,28 @@ public String SendWithMetaDataFrom(String fromAddress, String toAddress, List<Ba
* @return
* @throws MultichainException
*/
public String SendWithMetaDataFrom(String fromAddress, String toAddress, double amount, String hexMetaData)
public String sendWithMetaDataFrom(String fromAddress, String toAddress, double amount, String hexMetaData)
throws MultichainException {
String stringSendWithMetaDatarom = "";
String stringSendWithMetaDataFrom = "";

Object objectSendWithMetaDataFrom = executeSendWithMetaDataFrom(fromAddress, toAddress, amount, hexMetaData);
if (verifyInstance(objectSendWithMetaDataFrom, String.class)) {
stringSendWithMetaDatarom = (String) objectSendWithMetaDataFrom;
stringSendWithMetaDataFrom = (String) objectSendWithMetaDataFrom;
}

return stringSendWithMetaDatarom;
return stringSendWithMetaDataFrom;
}

public String sendWithDataFrom(String fromAddress, String toAddress, String assetName, Integer assetValue, String metadata)
throws MultichainException {
String stringSendWithDataFrom = "";

Object objectSendWithDataFrom = executeSendWithDataFrom(fromAddress, toAddress, assetName, assetValue, metadata);
if (verifyInstance(objectSendWithDataFrom, String.class)) {
stringSendWithDataFrom = (String) objectSendWithDataFrom;
}

return stringSendWithDataFrom;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
package multichain.command.builders;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
Expand All @@ -23,6 +24,7 @@
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
Expand Down Expand Up @@ -133,7 +135,9 @@ protected enum CommandEnum
SUBSCRIBE,
UNSUBSCRIBE,
VALIDATEADDRESS,
VERIFYMESSAGE
VERIFYMESSAGE,
SENDWITHDATA,
SENDWITHDATAFROM
}

protected void initialize(String ip, String port, String login, String password) {
Expand Down Expand Up @@ -165,33 +169,12 @@ protected Object execute(CommandEnum command, Object... parameters) throws Multi
if (httpclient != null && httppost != null) {
try {
// Generate Mapping of calling arguments
Map<String, Object> entityValues = new HashMap<String, Object>();
entityValues.put("id", UUID.randomUUID().toString());
entityValues.put("method", command.toString().toLowerCase());
List<Object> paramList = new ArrayList<Object>(Arrays.asList(parameters));
entityValues.put("params", paramList);

Map<String, Object> entityValues = prepareMap(command, parameters);
// Generate the entity and initialize request
StringEntity rpcEntity = new StringEntity(formatJson(entityValues));
StringEntity rpcEntity = prepareRpcEntity(entityValues);
httppost.setEntity(rpcEntity);

// Execute the request and get the answer
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();

String rpcAnswer = EntityUtils.toString(entity);

final Gson gson = new GsonBuilder().create();
final MultiChainRPCAnswer multiChainRPCAnswer = gson.fromJson(rpcAnswer, MultiChainRPCAnswer.class);

if (multiChainRPCAnswer != null && multiChainRPCAnswer.getError() == null) {
return multiChainRPCAnswer.getResult();
} else if (multiChainRPCAnswer != null && multiChainRPCAnswer.getError() != null) {
throw new MultichainException("code :" + multiChainRPCAnswer.getError().get("code").toString(),
"message : " + multiChainRPCAnswer.getError().get("message").toString());
} else {
throw new MultichainException(null, "General RPC Exceution Technical Error");
}
return executeRequest();

} catch (IOException e) {
e.printStackTrace();
Expand All @@ -202,7 +185,38 @@ protected Object execute(CommandEnum command, Object... parameters) throws Multi
"MultiChainCommand not initialized, please specify ip, port, user and pwd !");

}
}

protected StringEntity prepareRpcEntity(Map<String, Object> entityValues) throws UnsupportedEncodingException {
return new StringEntity(formatJson(entityValues));
}

private Object executeRequest() throws IOException, ClientProtocolException, MultichainException {
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();

String rpcAnswer = EntityUtils.toString(entity);

final Gson gson = new GsonBuilder().create();
final MultiChainRPCAnswer multiChainRPCAnswer = gson.fromJson(rpcAnswer, MultiChainRPCAnswer.class);

if (multiChainRPCAnswer != null && multiChainRPCAnswer.getError() == null) {
return multiChainRPCAnswer.getResult();
} else if (multiChainRPCAnswer != null && multiChainRPCAnswer.getError() != null) {
throw new MultichainException("code :" + multiChainRPCAnswer.getError().get("code").toString(),
"message : " + multiChainRPCAnswer.getError().get("message").toString());
} else {
throw new MultichainException(null, "General RPC Exceution Technical Error");
}
}

private Map<String, Object> prepareMap(CommandEnum command, Object... parameters) {
Map<String, Object> entityValues = new HashMap<String, Object>();
entityValues.put("id", UUID.randomUUID().toString());
entityValues.put("method", command.toString().toLowerCase());
List<Object> paramList = new ArrayList<Object>(Arrays.asList(parameters));
entityValues.put("params", paramList);
return entityValues;
}

@SuppressWarnings("rawtypes")
Expand Down
27 changes: 27 additions & 0 deletions src/main/java/multichain/command/builders/QueryBuilderKey.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/*
* Copyright (C) 2017 Worldline, Inc.
*
* MultiChainJavaAPI code distributed under the GPLv3 license, see COPYING file.
* https://github.com/SimplyUb/MultiChainJavaAPI/blob/master/LICENSE
*
*/
package multichain.command.builders;

import multichain.command.MultichainException;
import multichain.command.builders.QueryBuilderCommon.CommandEnum;

/**
* @author Ub - H. MARTEAU
* @version 3.0
*/
public class QueryBuilderKey extends QueryBuilderCommon {

protected Object executeDumpPrivkey(String privkey) throws MultichainException {
return execute(CommandEnum.DUMPPRIVKEY, privkey);
}

protected Object executeImportPrivkey(String privkey) throws MultichainException {
return execute(CommandEnum.IMPORTPRIVKEY, privkey);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,24 @@
*/
package multichain.command.builders;

import java.io.UnsupportedEncodingException;
import java.lang.reflect.Type;
import java.util.AbstractMap.SimpleEntry;
import java.util.List;
import java.util.Map;

import org.apache.http.entity.StringEntity;

import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;

import multichain.command.MultichainException;
import multichain.command.tools.MultichainTestParameter;
import multichain.object.BalanceAssetBase;
import multichain.object.formatters.HexFormatter;

/**
* @author Ub - H. MARTEAU
Expand Down Expand Up @@ -284,9 +297,8 @@ protected Object executeListAddressTransactions(String address, long count, long
throws MultichainException {
MultichainTestParameter.isNotNullOrEmpty("address", address);
MultichainTestParameter.valueIsPositive("count", count);
MultichainTestParameter.valueIsPositive("skip", skip);
return execute(CommandEnum.LISTADDRESSTRANSACTIONS, address, String.valueOf(count), String.valueOf(skip),
verbose);
MultichainTestParameter.valueIsNotNegative("skip", skip);
return execute(CommandEnum.LISTADDRESSTRANSACTIONS, address, count, skip, verbose);
}

/**
Expand Down Expand Up @@ -344,7 +356,7 @@ protected Object executeListAddressTransactions(String address, long count, long
protected Object executeListWalletTransaction(long count, long skip, boolean includeWatchonly, boolean verbose)
throws MultichainException {
MultichainTestParameter.valueIsPositive("count", count);
MultichainTestParameter.valueIsPositive("skip", skip);
MultichainTestParameter.valueIsNotNegative("skip", skip);
return execute(CommandEnum.LISTWALLETTRANSACTIONS, String.valueOf(count), String.valueOf(skip),
includeWatchonly, verbose);
}
Expand Down Expand Up @@ -687,5 +699,38 @@ protected Object executeSendWithMetaDataFrom(String fromAddress, String toAddres

return execute(CommandEnum.SENDWITHMETADATAFROM, fromAddress, toAddress, String.valueOf(amount), hexMetaData);
}

protected Object executeSendWithDataFrom(String fromAddress, String toAddress, String assetName, Integer assetValue, String metadata)
throws MultichainException {
MultichainTestParameter.isNotNullOrEmpty("fromAddress", fromAddress);
MultichainTestParameter.isNotNullOrEmpty("toAddress", toAddress);
MultichainTestParameter.isNotNullOrEmpty("metadata", metadata);
MultichainTestParameter.isNotNull("asset", assetName);
MultichainTestParameter.valueIsPositive("assetValue", assetValue);

SimpleEntry<String, Integer> simpleEntry = new SimpleEntry<String, Integer>(assetName, assetValue);
return execute(CommandEnum.SENDWITHDATAFROM, fromAddress, toAddress, simpleEntry, HexFormatter.toHex(metadata));
}

@Override
protected StringEntity prepareRpcEntity(Map<String, Object> entityValues) throws UnsupportedEncodingException {
final GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(SimpleEntry.class, new SimpleEntryAdapter());
return new StringEntity(formatJsonWithCustomBuilder(entityValues, builder));
}

public static class SimpleEntryAdapter implements JsonSerializer<SimpleEntry> {

@Override
public JsonElement serialize(SimpleEntry src, Type typeOfSrc,
JsonSerializationContext context) {

JsonObject obj = new JsonObject();
obj.addProperty(src.getKey().toString(), (Integer) src.getValue());

return obj;
}
}


}
Loading