This commit is contained in:
pinpong
2016-12-02 18:47:43 +01:00
parent 67230b861a
commit 0ec801a581
15 changed files with 363 additions and 234 deletions
+1 -1
View File
@@ -1,5 +1,5 @@
iota.node.protocol=http
#iota.node.host=138.68.126.141
iota.node.host=127.0.0.1
iota.node.host=node.iotawallet.info
iota.node.port=14265
@@ -1,86 +1,15 @@
package jota.dto.response;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import jota.model.Transaction;
import java.util.ArrayList;
import java.util.List;
public class AnalyzeTransactionResponse extends AbstractResponse {
private Transactions[] transactions;
private List<Transaction> transactions = new ArrayList<Transaction>();
public Transactions[] getTransactions() {
public List<Transaction> getTransactions() {
return transactions;
}
static class Transactions {
private String signatureMessageChunk;
private String index;
private String approvalNonce;
private String hash;
private String digest;
private String type;
private String timestamp;
private String trunkTransaction;
private String branchTransaction;
private String signatureNonce;
private String address;
private String value;
private String bundle;
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
}
public String getValue() {
return value;
}
public String getDigest() {
return digest;
}
public String getTrunkTransaction() {
return trunkTransaction;
}
public String getTimestamp() {
return timestamp;
}
public String getSignatureNonce() {
return signatureNonce;
}
public String getType() {
return type;
}
public String getAddress() {
return address;
}
public String getApprovalNonce() {
return approvalNonce;
}
public String getBranchTransaction() {
return branchTransaction;
}
public String getBundle() {
return bundle;
}
public String getHash() {
return hash;
}
public String getIndex() {
return index;
}
public String getSignatureMessageChunk() {
return signatureMessageChunk;
}
}
}
@@ -1,93 +1,15 @@
package jota.dto.response;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import jota.model.Transaction;
import java.util.ArrayList;
import java.util.List;
public class GetBundleResponse extends AbstractResponse {
public Transactions[] transactions;
private List<Transaction> transactions = new ArrayList<>();
private String warning;
public String getWarning() {
return warning;
}
public Transactions[] getTransactions() {
public List<Transaction> getTransactions() {
return transactions;
}
public static class Transactions {
private String signatureMessageChunk;
private String index;
private String approvalNonce;
private String hash;
private String digest;
private String type;
private String timestamp;
private String trunkTransaction;
private String branchTransaction;
private String signatureNonce;
private String address;
private String value;
private String bundle;
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
}
public String getAddress() {
return address;
}
public String getApprovalNonce() {
return approvalNonce;
}
public String getBranchTransaction() {
return branchTransaction;
}
public String getBundle() {
return bundle;
}
public String getDigest() {
return digest;
}
public String getHash() {
return hash;
}
public String getIndex() {
return index;
}
public String getSignatureMessageChunk() {
return signatureMessageChunk;
}
public String getSignatureNonce() {
return signatureNonce;
}
public String getTimestamp() {
return timestamp;
}
public String getType() {
return type;
}
public String getTrunkTransaction() {
return trunkTransaction;
}
public String getValue() {
return value;
}
}
}
@@ -1,34 +1,15 @@
package jota.dto.response;
import jota.model.Neighbor;
import java.util.ArrayList;
import java.util.List;
public class GetNeighborsResponse extends AbstractResponse {
public Neighbors[] neighbors;
private List<Neighbor> neighbors = new ArrayList<>();
public Neighbors[] getNeighbors() {
public List<Neighbor> getNeighbors() {
return neighbors;
}
public static class Neighbors {
private String address;
private Integer numberOfAllTransactions;
private Integer numberOfInvalidTransactions;
private Integer numberOfNewTransactions;
public String getAddress() {
return address;
}
public Integer getNumberOfAllTransactions() {
return numberOfAllTransactions;
}
public Integer getNumberOfInvalidTransactions() {
return numberOfInvalidTransactions;
}
public Integer getNumberOfNewTransactions() {
return numberOfNewTransactions;
}
}
}
@@ -1,46 +1,15 @@
package jota.dto.response;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import jota.model.Transfer;
import java.util.ArrayList;
import java.util.List;
public class GetTransfersResponse extends AbstractResponse {
private Transfers[] transfers;
private List<Transfer> transfers = new ArrayList<>();
public Transfers[] getTransfers() {
public List<Transfer> getTransfers() {
return transfers;
}
public static class Transfers {
private String timestamp;
private String address;
private String hash;
private Integer persistence;
private long value;
public String getAddress() {
return address;
}
public String getHash() {
return hash;
}
public Integer getPersistence() {
return persistence;
}
public String getTimestamp() {
return timestamp;
}
public long getValue() {
return value;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
}
}
}
+36
View File
@@ -0,0 +1,36 @@
package jota.model;
/**
* Created by pinpong on 02.12.16.
*/
public class Neighbor {
private String address;
private Integer numberOfAllTransactions;
private Integer numberOfInvalidTransactions;
private Integer numberOfNewTransactions;
public Neighbor(String address, Integer numberOfAllTransactions, Integer numberOfInvalidTransactions, Integer numberOfNewTransactions) {
this.address = address;
this.numberOfAllTransactions = numberOfAllTransactions;
this.numberOfInvalidTransactions = numberOfInvalidTransactions;
this.numberOfNewTransactions = numberOfNewTransactions;
}
public String getAddress() {
return address;
}
public Integer getNumberOfAllTransactions() {
return numberOfAllTransactions;
}
public Integer getNumberOfInvalidTransactions() {
return numberOfInvalidTransactions;
}
public Integer getNumberOfNewTransactions() {
return numberOfNewTransactions;
}
}
+99
View File
@@ -0,0 +1,99 @@
package jota.model;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
* Created by pinpong on 02.12.16.
*/
public class Transaction {
private String signatureMessageChunk;
private String index;
private String approvalNonce;
private String hash;
private String digest;
private String type;
private String timestamp;
private String trunkTransaction;
private String branchTransaction;
private String signatureNonce;
private String address;
private String value;
private String bundle;
public Transaction(String signatureMessageChunk, String index, String approvalNonce, String hash, String digest, String type, String timestamp, String trunkTransaction, String branchTransaction, String signatureNonce, String address, String value, String bundle) {
this.hash = hash;
this.type = type;
this.signatureMessageChunk = signatureMessageChunk;
this.digest = digest;
this.address = address;
this.value = value;
this.timestamp = timestamp;
this.index = index;
this.bundle = bundle;
this.signatureNonce = signatureNonce;
this.approvalNonce = approvalNonce;
this.trunkTransaction = trunkTransaction;
this.branchTransaction = branchTransaction;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
}
public String getValue() {
return value;
}
public String getDigest() {
return digest;
}
public String getTrunkTransaction() {
return trunkTransaction;
}
public String getTimestamp() {
return timestamp;
}
public String getSignatureNonce() {
return signatureNonce;
}
public String getType() {
return type;
}
public String getAddress() {
return address;
}
public String getApprovalNonce() {
return approvalNonce;
}
public String getBranchTransaction() {
return branchTransaction;
}
public String getBundle() {
return bundle;
}
public String getHash() {
return hash;
}
public String getIndex() {
return index;
}
public String getSignatureMessageChunk() {
return signatureMessageChunk;
}
}
+50
View File
@@ -0,0 +1,50 @@
package jota.model;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
* Created by pinpong on 02.12.16.
*/
public class Transfer {
private String timestamp;
private String address;
private String hash;
private Integer persistence;
private long value;
public Transfer(String timestamp, String address, String hash, Integer persistence, long value) {
this.timestamp = timestamp;
this.address = address;
this.hash = hash;
this.persistence = persistence;
this.value = value;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
}
public String getAddress() {
return address;
}
public String getHash() {
return hash;
}
public Integer getPersistence() {
return persistence;
}
public String getTimestamp() {
return timestamp;
}
public long getValue() {
return value;
}
}
+44
View File
@@ -0,0 +1,44 @@
package jota.utils;
import org.apache.commons.lang3.NotImplementedException;
/**
* Created by pinpong on 02.12.16.
*/
public class Checksum {
public static String addChecksum(String address) {
InputValidator.checkAddress(address);
String addressWithChecksum = address;
addressWithChecksum += calculateChecksum(address);
return addressWithChecksum;
}
public static String removeChecksum(String addressWithChecksum) {
if (isAddressWithChecksum(addressWithChecksum)) {
return getAddress(addressWithChecksum);
}
throw new RuntimeException("Invalid address: " + addressWithChecksum);
}
private static String getAddress(String addressWithChecksum) {
return addressWithChecksum.substring(0, Constants.addressLengthWithoutChecksum);
}
public static boolean isValidChecksum(String addressWithChecksum) {
String addressWithoutChecksum = removeChecksum(addressWithChecksum);
String adressWithRecalculateChecksum = calculateChecksum(addressWithoutChecksum);
return adressWithRecalculateChecksum.equals(addressWithChecksum);
}
private static boolean isAddressWithChecksum(String addressWithChecksum) {
return InputValidator.checkAddress(addressWithChecksum) && addressWithChecksum.length() == Constants.addressLengthWithChecksum;
}
private static String calculateChecksum(String address) {
// TODO
throw new NotImplementedException(address);
}
}
+13
View File
@@ -0,0 +1,13 @@
package jota.utils;
/**
* Created by pinpong on 02.12.16.
*/
public class Constants {
public static final String TRYTE_ALPHABET = "9ABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static int addressLengthWithoutChecksum = 81;
public static int addressLengthWithChecksum = 90;
}
+3 -4
View File
@@ -9,7 +9,6 @@ public class Converter {
public static final int NUMBER_OF_TRITS_IN_A_BYTE = 5;
public static final int NUMBER_OF_TRITS_IN_A_TRYTE = 3;
public static final String TRYTE_ALPHABET = "9ABCDEFGHIJKLMNOPQRSTUVWXYZ";
static final int[][] BYTE_TO_TRITS_MAPPINGS = new int[243][];
static final int[][] TRYTE_TO_TRITS_MAPPINGS = new int[27][];
@@ -63,7 +62,7 @@ public class Converter {
final int[] trits = new int[trytes.length() * NUMBER_OF_TRITS_IN_A_TRYTE];
for (int i = 0; i < trytes.length(); i++) {
System.arraycopy(TRYTE_TO_TRITS_MAPPINGS[TRYTE_ALPHABET.indexOf(trytes.charAt(i))], 0, trits, i * NUMBER_OF_TRITS_IN_A_TRYTE, NUMBER_OF_TRITS_IN_A_TRYTE);
System.arraycopy(TRYTE_TO_TRITS_MAPPINGS[Constants.TRYTE_ALPHABET.indexOf(trytes.charAt(i))], 0, trits, i * NUMBER_OF_TRITS_IN_A_TRYTE, NUMBER_OF_TRITS_IN_A_TRYTE);
}
return trits;
@@ -100,9 +99,9 @@ public class Converter {
int j = trits[offset + i * 3] + trits[offset + i * 3 + 1] * 3 + trits[offset + i * 3 + 2] * 9;
if (j < 0) {
j += TRYTE_ALPHABET.length();
j += Constants.TRYTE_ALPHABET.length();
}
trytes.append(TRYTE_ALPHABET.charAt(j));
trytes.append(Constants.TRYTE_ALPHABET.charAt(j));
}
return trytes.toString();
}
@@ -0,0 +1,35 @@
package jota.utils;
import jdk.nashorn.internal.runtime.regexp.joni.Regex;
import jota.model.Transfer;
import org.apache.commons.lang3.NotImplementedException;
import java.util.Arrays;
/**
* Created by pinpong on 02.12.16.
*/
public class InputValidator {
public static boolean isAddress(String address) {
// TODO: In the future check checksum
// Check if address with checksum
return (address.length() == Constants.addressLengthWithoutChecksum ||
address.length() == Constants.addressLengthWithChecksum) && isTrytes(address, address.length());
}
public static boolean checkAddress(String address) {
if (!isAddress(address))
throw new RuntimeException("Invalid address: " + address);
return true;
}
public static boolean isTrytes(String trytes, int length) {
// If no length specified, just validate the trytes
Regex regexTrytes = new Regex("^[9A-Z]{" + (length == 0 ? "0," : length) + "}$");
return trytes.matches(regexTrytes.toString());
}
}
@@ -5,8 +5,6 @@ package jota.utils;
*/
public class TrytesConverter {
private static final String TRYTE_ALPHABET = "9ABCDEFGHIJKLMNOPQRSTUVWXYZ";
/**
* Conversion of ascii encoded bytes to trytes.
* Input is a string (can be stringified JSON object), return value is Trytes
@@ -52,7 +50,7 @@ public class TrytesConverter {
int firstValue = asciiValue % 27;
int secondValue = (asciiValue - firstValue) / 27;
String trytesValue = String.valueOf(TRYTE_ALPHABET.charAt(firstValue) + String.valueOf(TRYTE_ALPHABET.charAt(secondValue)));
String trytesValue = String.valueOf(Constants.TRYTE_ALPHABET.charAt(firstValue) + String.valueOf(Constants.TRYTE_ALPHABET.charAt(secondValue)));
trytes += trytesValue;
}
@@ -77,8 +75,8 @@ public class TrytesConverter {
for (int i = 0; i < inputTrytes.length(); i += 2) {
// get a trytes pair
int firstValue = TRYTE_ALPHABET.indexOf(inputTrytes.charAt(i));
int secondValue = TRYTE_ALPHABET.indexOf(inputTrytes.charAt(i + 1));
int firstValue = Constants.TRYTE_ALPHABET.indexOf(inputTrytes.charAt(i));
int secondValue = Constants.TRYTE_ALPHABET.indexOf(inputTrytes.charAt(i + 1));
int decimalValue = firstValue + secondValue * 27;
+25
View File
@@ -0,0 +1,25 @@
package jota;
import jota.utils.Checksum;
import jota.utils.InputValidator;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
/**
* Created by pinpong on 02.12.16.
*/
public class ChecksumTest {
private static final String TEST_ADDRESS = "RVORZ9SIIP9RCYMREUIXXVPQIPHVCNPQ9HZWYKFWYWZRE9JQKG9REPKIASHUUECPSQO9JT9XNMVKWYGVAZETAIRPTM";
@Test
public void shouldAddChecksum() {
assertEquals(Checksum.addChecksum(TEST_ADDRESS), true);
}
@Test
public void shouldRemoveChecksum() {
assertEquals(Checksum.addChecksum(TEST_ADDRESS), Checksum.isValidChecksum(Checksum.addChecksum(TEST_ADDRESS)));
}
}
@@ -0,0 +1,29 @@
package jota;
import jota.utils.InputValidator;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
/**
* Created by pinpong on 02.12.16.
*/
public class InputValidatorTest {
private static final String TEST_ADDRESS = "RVORZ9SIIP9RCYMREUIXXVPQIPHVCNPQ9HZWYKFWYWZRE9JQKG9REPKIASHUUECPSQO9JT9XNMVKWYGVAZETAIRPTM";
@Test
public void shouldIsAddress() {
assertEquals(InputValidator.isAddress(TEST_ADDRESS), true);
}
@Test
public void shouldCheckAddress() {
assertEquals(InputValidator.checkAddress(TEST_ADDRESS), true);
}
@Test
public void shouldIsTrytes() {
assertEquals(InputValidator.isTrytes(TEST_ADDRESS, TEST_ADDRESS.length()), true);
}
}