Skip to content

Commit d0f3ee9

Browse files
author
Erik Lenoir
committed
1 parent 69ed608 commit d0f3ee9

File tree

9 files changed

+231
-43
lines changed

9 files changed

+231
-43
lines changed

pom.xml

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<modelVersion>4.0.0</modelVersion>
44
<groupId>MultiChainJavaAPI</groupId>
55
<artifactId>MultiChainJavaAPI</artifactId>
6-
<version>0.3.1-SNAPSHOT</version>
6+
<version>0.3.2-SNAPSHOT</version>
77

88
<properties>
99
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -12,8 +12,10 @@
1212
<xmlrpc-client.version>3.1.3</xmlrpc-client.version>
1313
<httpclient.version>4.3.6</httpclient.version>
1414
<gson.version>2.8.1</gson.version>
15+
<commons-codec.version>1.10</commons-codec.version>
16+
<commons-collections4.version>4.1</commons-collections4.version>
1517
</properties>
16-
18+
1719
<build>
1820
<sourceDirectory>src</sourceDirectory>
1921
<plugins>
@@ -43,5 +45,15 @@
4345
<artifactId>gson</artifactId>
4446
<version>${gson.version}</version>
4547
</dependency>
48+
<dependency>
49+
<groupId>commons-codec</groupId>
50+
<artifactId>commons-codec</artifactId>
51+
<version>${commons-codec.version}</version>
52+
</dependency>
53+
<dependency>
54+
<groupId>org.apache.commons</groupId>
55+
<artifactId>commons-collections4</artifactId>
56+
<version>${commons-collections4.version}</version>
57+
</dependency>
4658
</dependencies>
4759
</project>
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* Copyright (C) 2017 Worldline, Inc.
3+
*
4+
* MultiChainJavaAPI code distributed under the GPLv3 license, see COPYING file.
5+
* https://github.com/SimplyUb/MultiChainJavaAPI/blob/master/LICENSE
6+
*
7+
*/
8+
package multichain.command;
9+
10+
import java.util.ArrayList;
11+
import java.util.List;
12+
13+
import multichain.command.builders.QueryBuilderBalance;
14+
import multichain.command.builders.QueryBuilderKey;
15+
import multichain.object.BalanceAsset;
16+
import multichain.object.formatters.BalanceFormatter;
17+
18+
/**
19+
* @author Ub - H. MARTEAU
20+
* @version 3.0
21+
*/
22+
public class KeyCommand extends QueryBuilderKey {
23+
public KeyCommand(String ip, String port, String login, String password) {
24+
initialize(ip, port, login, password);
25+
}
26+
27+
public Object getPrivkey(String privkey) throws MultichainException {
28+
return executeDumpPrivkey(privkey);
29+
}
30+
31+
public Object importPrivkey(String privkey) throws MultichainException {
32+
return executeImportPrivkey(privkey);
33+
}
34+
35+
}

src/multichain/command/MultiChainCommand.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public class MultiChainCommand {
2121
private RAWTransactionCommand rawTransactionCommand;
2222
private StreamCommand streamCommand;
2323
private WalletTransactionCommand walletTransactionCommand;
24+
private KeyCommand keyCommand;
2425

2526
/**
2627
*
@@ -36,6 +37,7 @@ public MultiChainCommand(String ip, String port, String login, String password)
3637
rawTransactionCommand = new RAWTransactionCommand(ip, port, login, password);
3738
streamCommand = new StreamCommand(ip, port, login, password);
3839
walletTransactionCommand = new WalletTransactionCommand(ip, port, login, password);
40+
keyCommand = new KeyCommand(ip, port, login, password);
3941
}
4042

4143
/**
@@ -173,4 +175,12 @@ public void setChainCommand(ChainCommand chainCommand) {
173175
this.chainCommand = chainCommand;
174176
}
175177

178+
public KeyCommand getKeyCommand() {
179+
return keyCommand;
180+
}
181+
182+
public void setKeyCommand(KeyCommand keyCommand) {
183+
this.keyCommand = keyCommand;
184+
}
185+
176186
}

src/multichain/command/WalletTransactionCommand.java

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -648,7 +648,7 @@ public String sendToAddress(String address, List<BalanceAssetBase> assets) throw
648648
* @return
649649
* @throws MultichainException
650650
*/
651-
public String SendToAddress(String address, double amount) throws MultichainException {
651+
public String sendToAddress(String address, double amount) throws MultichainException {
652652
String stringSendToAddress = "";
653653

654654
Object objectSendToAddress = executeSendToAddress(address, amount);
@@ -687,7 +687,7 @@ public String SendToAddress(String address, double amount) throws MultichainExce
687687
* @return
688688
* @throws MultichainException
689689
*/
690-
public String SendWithMetaData(String address, List<BalanceAssetBase> assets, String hexMetaData)
690+
public String sendWithMetaData(String address, List<BalanceAssetBase> assets, String hexMetaData)
691691
throws MultichainException {
692692
String stringSendWithMetaData = "";
693693

@@ -727,7 +727,7 @@ public String SendWithMetaData(String address, List<BalanceAssetBase> assets, St
727727
* @return
728728
* @throws MultichainException
729729
*/
730-
public String SendWithMetaData(String address, double amount, String hexMetaData) throws MultichainException {
730+
public String sendWithMetaData(String address, double amount, String hexMetaData) throws MultichainException {
731731
String stringSendWithMetaData = "";
732732

733733
Object objectSendWithMetaData = executeSendWithMetaData(address, amount, hexMetaData);
@@ -769,16 +769,16 @@ public String SendWithMetaData(String address, double amount, String hexMetaData
769769
* @return
770770
* @throws MultichainException
771771
*/
772-
public String SendWithMetaDataFrom(String fromAddress, String toAddress, List<BalanceAssetBase> assets,
772+
public String sendWithMetaDataFrom(String fromAddress, String toAddress, List<BalanceAssetBase> assets,
773773
String hexMetaData) throws MultichainException {
774-
String stringSendWithMetaDatarom = "";
774+
String stringSendWithMetaDataFrom = "";
775775

776776
Object objectSendWithMetaDataFrom = executeSendWithMetaDataFrom(fromAddress, toAddress, assets, hexMetaData);
777777
if (verifyInstance(objectSendWithMetaDataFrom, String.class)) {
778-
stringSendWithMetaDatarom = (String) objectSendWithMetaDataFrom;
778+
stringSendWithMetaDataFrom = (String) objectSendWithMetaDataFrom;
779779
}
780780

781-
return stringSendWithMetaDatarom;
781+
return stringSendWithMetaDataFrom;
782782
}
783783

784784
/**
@@ -812,16 +812,28 @@ public String SendWithMetaDataFrom(String fromAddress, String toAddress, List<Ba
812812
* @return
813813
* @throws MultichainException
814814
*/
815-
public String SendWithMetaDataFrom(String fromAddress, String toAddress, double amount, String hexMetaData)
815+
public String sendWithMetaDataFrom(String fromAddress, String toAddress, double amount, String hexMetaData)
816816
throws MultichainException {
817-
String stringSendWithMetaDatarom = "";
817+
String stringSendWithMetaDataFrom = "";
818818

819819
Object objectSendWithMetaDataFrom = executeSendWithMetaDataFrom(fromAddress, toAddress, amount, hexMetaData);
820820
if (verifyInstance(objectSendWithMetaDataFrom, String.class)) {
821-
stringSendWithMetaDatarom = (String) objectSendWithMetaDataFrom;
821+
stringSendWithMetaDataFrom = (String) objectSendWithMetaDataFrom;
822822
}
823823

824-
return stringSendWithMetaDatarom;
824+
return stringSendWithMetaDataFrom;
825+
}
826+
827+
public String sendWithDataFrom(String fromAddress, String toAddress, String assetName, Integer assetValue, String metadata)
828+
throws MultichainException {
829+
String stringSendWithDataFrom = "";
830+
831+
Object objectSendWithDataFrom = executeSendWithDataFrom(fromAddress, toAddress, assetName, assetValue, metadata);
832+
if (verifyInstance(objectSendWithDataFrom, String.class)) {
833+
stringSendWithDataFrom = (String) objectSendWithDataFrom;
834+
}
835+
836+
return stringSendWithDataFrom;
825837
}
826838

827839
}

src/multichain/command/builders/QueryBuilderCommon.java

Lines changed: 39 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
package multichain.command.builders;
99

1010
import java.io.IOException;
11+
import java.io.UnsupportedEncodingException;
1112
import java.util.ArrayList;
1213
import java.util.Arrays;
1314
import java.util.HashMap;
@@ -23,6 +24,7 @@
2324
import org.apache.http.HttpResponse;
2425
import org.apache.http.auth.AuthScope;
2526
import org.apache.http.auth.UsernamePasswordCredentials;
27+
import org.apache.http.client.ClientProtocolException;
2628
import org.apache.http.client.CredentialsProvider;
2729
import org.apache.http.client.methods.HttpPost;
2830
import org.apache.http.entity.StringEntity;
@@ -133,7 +135,9 @@ protected enum CommandEnum
133135
SUBSCRIBE,
134136
UNSUBSCRIBE,
135137
VALIDATEADDRESS,
136-
VERIFYMESSAGE
138+
VERIFYMESSAGE,
139+
SENDWITHDATA,
140+
SENDWITHDATAFROM
137141
}
138142

139143
protected void initialize(String ip, String port, String login, String password) {
@@ -165,33 +169,12 @@ protected Object execute(CommandEnum command, Object... parameters) throws Multi
165169
if (httpclient != null && httppost != null) {
166170
try {
167171
// Generate Mapping of calling arguments
168-
Map<String, Object> entityValues = new HashMap<String, Object>();
169-
entityValues.put("id", UUID.randomUUID().toString());
170-
entityValues.put("method", command.toString().toLowerCase());
171-
List<Object> paramList = new ArrayList<Object>(Arrays.asList(parameters));
172-
entityValues.put("params", paramList);
173-
172+
Map<String, Object> entityValues = prepareMap(command, parameters);
174173
// Generate the entity and initialize request
175-
StringEntity rpcEntity = new StringEntity(formatJson(entityValues));
174+
StringEntity rpcEntity = prepareRpcEntity(entityValues);
176175
httppost.setEntity(rpcEntity);
177-
178176
// Execute the request and get the answer
179-
HttpResponse response = httpclient.execute(httppost);
180-
HttpEntity entity = response.getEntity();
181-
182-
String rpcAnswer = EntityUtils.toString(entity);
183-
184-
final Gson gson = new GsonBuilder().create();
185-
final MultiChainRPCAnswer multiChainRPCAnswer = gson.fromJson(rpcAnswer, MultiChainRPCAnswer.class);
186-
187-
if (multiChainRPCAnswer != null && multiChainRPCAnswer.getError() == null) {
188-
return multiChainRPCAnswer.getResult();
189-
} else if (multiChainRPCAnswer != null && multiChainRPCAnswer.getError() != null) {
190-
throw new MultichainException("code :" + multiChainRPCAnswer.getError().get("code").toString(),
191-
"message : " + multiChainRPCAnswer.getError().get("message").toString());
192-
} else {
193-
throw new MultichainException(null, "General RPC Exceution Technical Error");
194-
}
177+
return executeRequest();
195178

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

204187
}
188+
}
189+
190+
protected StringEntity prepareRpcEntity(Map<String, Object> entityValues) throws UnsupportedEncodingException {
191+
return new StringEntity(formatJson(entityValues));
192+
}
193+
194+
private Object executeRequest() throws IOException, ClientProtocolException, MultichainException {
195+
HttpResponse response = httpclient.execute(httppost);
196+
HttpEntity entity = response.getEntity();
197+
198+
String rpcAnswer = EntityUtils.toString(entity);
199+
200+
final Gson gson = new GsonBuilder().create();
201+
final MultiChainRPCAnswer multiChainRPCAnswer = gson.fromJson(rpcAnswer, MultiChainRPCAnswer.class);
202+
203+
if (multiChainRPCAnswer != null && multiChainRPCAnswer.getError() == null) {
204+
return multiChainRPCAnswer.getResult();
205+
} else if (multiChainRPCAnswer != null && multiChainRPCAnswer.getError() != null) {
206+
throw new MultichainException("code :" + multiChainRPCAnswer.getError().get("code").toString(),
207+
"message : " + multiChainRPCAnswer.getError().get("message").toString());
208+
} else {
209+
throw new MultichainException(null, "General RPC Exceution Technical Error");
210+
}
211+
}
205212

213+
private Map<String, Object> prepareMap(CommandEnum command, Object... parameters) {
214+
Map<String, Object> entityValues = new HashMap<String, Object>();
215+
entityValues.put("id", UUID.randomUUID().toString());
216+
entityValues.put("method", command.toString().toLowerCase());
217+
List<Object> paramList = new ArrayList<Object>(Arrays.asList(parameters));
218+
entityValues.put("params", paramList);
219+
return entityValues;
206220
}
207221

208222
@SuppressWarnings("rawtypes")
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
* Copyright (C) 2017 Worldline, Inc.
3+
*
4+
* MultiChainJavaAPI code distributed under the GPLv3 license, see COPYING file.
5+
* https://github.com/SimplyUb/MultiChainJavaAPI/blob/master/LICENSE
6+
*
7+
*/
8+
package multichain.command.builders;
9+
10+
import multichain.command.MultichainException;
11+
import multichain.command.builders.QueryBuilderCommon.CommandEnum;
12+
13+
/**
14+
* @author Ub - H. MARTEAU
15+
* @version 3.0
16+
*/
17+
public class QueryBuilderKey extends QueryBuilderCommon {
18+
19+
protected Object executeDumpPrivkey(String privkey) throws MultichainException {
20+
return execute(CommandEnum.DUMPPRIVKEY, privkey);
21+
}
22+
23+
protected Object executeImportPrivkey(String privkey) throws MultichainException {
24+
return execute(CommandEnum.IMPORTPRIVKEY, privkey);
25+
}
26+
27+
}

src/multichain/command/builders/QueryBuilderWalletTransaction.java

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,24 @@
77
*/
88
package multichain.command.builders;
99

10+
import java.io.UnsupportedEncodingException;
11+
import java.lang.reflect.Type;
12+
import java.util.AbstractMap.SimpleEntry;
1013
import java.util.List;
14+
import java.util.Map;
15+
16+
import org.apache.http.entity.StringEntity;
17+
18+
import com.google.gson.GsonBuilder;
19+
import com.google.gson.JsonElement;
20+
import com.google.gson.JsonObject;
21+
import com.google.gson.JsonSerializationContext;
22+
import com.google.gson.JsonSerializer;
1123

1224
import multichain.command.MultichainException;
1325
import multichain.command.tools.MultichainTestParameter;
1426
import multichain.object.BalanceAssetBase;
27+
import multichain.object.formatters.HexFormatter;
1528

1629
/**
1730
* @author Ub - H. MARTEAU
@@ -284,9 +297,8 @@ protected Object executeListAddressTransactions(String address, long count, long
284297
throws MultichainException {
285298
MultichainTestParameter.isNotNullOrEmpty("address", address);
286299
MultichainTestParameter.valueIsPositive("count", count);
287-
MultichainTestParameter.valueIsPositive("skip", skip);
288-
return execute(CommandEnum.LISTADDRESSTRANSACTIONS, address, String.valueOf(count), String.valueOf(skip),
289-
verbose);
300+
MultichainTestParameter.valueIsNotNegative("skip", skip);
301+
return execute(CommandEnum.LISTADDRESSTRANSACTIONS, address, count, skip, verbose);
290302
}
291303

292304
/**
@@ -344,7 +356,7 @@ protected Object executeListAddressTransactions(String address, long count, long
344356
protected Object executeListWalletTransaction(long count, long skip, boolean includeWatchonly, boolean verbose)
345357
throws MultichainException {
346358
MultichainTestParameter.valueIsPositive("count", count);
347-
MultichainTestParameter.valueIsPositive("skip", skip);
359+
MultichainTestParameter.valueIsNotNegative("skip", skip);
348360
return execute(CommandEnum.LISTWALLETTRANSACTIONS, String.valueOf(count), String.valueOf(skip),
349361
includeWatchonly, verbose);
350362
}
@@ -687,5 +699,38 @@ protected Object executeSendWithMetaDataFrom(String fromAddress, String toAddres
687699

688700
return execute(CommandEnum.SENDWITHMETADATAFROM, fromAddress, toAddress, String.valueOf(amount), hexMetaData);
689701
}
702+
703+
protected Object executeSendWithDataFrom(String fromAddress, String toAddress, String assetName, Integer assetValue, String metadata)
704+
throws MultichainException {
705+
MultichainTestParameter.isNotNullOrEmpty("fromAddress", fromAddress);
706+
MultichainTestParameter.isNotNullOrEmpty("toAddress", toAddress);
707+
MultichainTestParameter.isNotNullOrEmpty("metadata", metadata);
708+
MultichainTestParameter.isNotNull("asset", assetName);
709+
MultichainTestParameter.valueIsPositive("assetValue", assetValue);
710+
711+
SimpleEntry<String, Integer> simpleEntry = new SimpleEntry<String, Integer>(assetName, assetValue);
712+
return execute(CommandEnum.SENDWITHDATAFROM, fromAddress, toAddress, simpleEntry, HexFormatter.toHex(metadata));
713+
}
714+
715+
@Override
716+
protected StringEntity prepareRpcEntity(Map<String, Object> entityValues) throws UnsupportedEncodingException {
717+
final GsonBuilder builder = new GsonBuilder();
718+
builder.registerTypeAdapter(SimpleEntry.class, new SimpleEntryAdapter());
719+
return new StringEntity(formatJsonWithCustomBuilder(entityValues, builder));
720+
}
721+
722+
public static class SimpleEntryAdapter implements JsonSerializer<SimpleEntry> {
723+
724+
@Override
725+
public JsonElement serialize(SimpleEntry src, Type typeOfSrc,
726+
JsonSerializationContext context) {
727+
728+
JsonObject obj = new JsonObject();
729+
obj.addProperty(src.getKey().toString(), (Integer) src.getValue());
730+
731+
return obj;
732+
}
733+
}
734+
690735

691736
}

0 commit comments

Comments
 (0)