diff --git a/src/main/java/jota/IotaAPICore.java b/src/main/java/jota/IotaAPICore.java index 4adec7a..96651c5 100644 --- a/src/main/java/jota/IotaAPICore.java +++ b/src/main/java/jota/IotaAPICore.java @@ -2,6 +2,7 @@ package jota; import jota.dto.request.*; import jota.dto.response.*; +import jota.error.InvalidApiVersionException; import jota.error.InvalidTrytesException; import jota.model.Transaction; import jota.utils.InputValidator; @@ -60,8 +61,17 @@ public class IotaAPICore { protected static Response wrapCheckedException(final Call call) { try { final Response res = call.execute(); + if (res.code() == 400) { - throw new IllegalAccessError("400 " + res.errorBody().string()); + if (res.errorBody().string().contains("Invalid API Version")) { + try { + throw new InvalidApiVersionException(); + } catch (InvalidApiVersionException e) { + e.printStackTrace(); + } + } else { + throw new IllegalAccessError("400 " + res.errorBody().string()); + } } else if (res.code() == 401) { throw new IllegalAccessError("401 " + res.errorBody().string()); } else if (res.code() == 500) { @@ -72,6 +82,7 @@ public class IotaAPICore { log.error("Execution of the API call raised exception. IOTA Node not reachable?", e); throw new IllegalStateException(e.getMessage()); } + } /** @@ -97,13 +108,9 @@ public class IotaAPICore { final String nodeUrl = protocol + "://" + host + ":" + port; // Create OkHttpBuilder - final OkHttpClient.Builder okhttpBuilder = new OkHttpClient.Builder() + final OkHttpClient client = new OkHttpClient.Builder() .readTimeout(5000, TimeUnit.SECONDS) - .connectTimeout(5000, TimeUnit.SECONDS); - - // add an Interceptor in order to add the requested header - okhttpBuilder.addNetworkInterceptor( - new Interceptor() { + .addInterceptor(new Interceptor() { @Override public okhttp3.Response intercept(Chain chain) throws IOException { Request request = chain.request(); @@ -115,10 +122,9 @@ public class IotaAPICore { return chain.proceed(newRequest); } - }); - - // create client - final OkHttpClient client = okhttpBuilder.build(); + }) + .connectTimeout(5000, TimeUnit.SECONDS) + .build(); // use client to create Retrofit service final Retrofit retrofit = new Retrofit.Builder() @@ -267,13 +273,12 @@ public class IotaAPICore { @SuppressWarnings("unchecked") public static class Builder> { + String protocol, host, port; + IotaLocalPoW localPoW; private FileReader fileReader = null; private BufferedReader bufferedReader = null; private Properties nodeConfig = null; - String protocol, host, port; - IotaLocalPoW localPoW; - public IotaAPICore build() { // resolution order: builder value, configuration file, default value diff --git a/src/main/java/jota/IotaAPIService.java b/src/main/java/jota/IotaAPIService.java index bc3ca50..2946307 100644 --- a/src/main/java/jota/IotaAPIService.java +++ b/src/main/java/jota/IotaAPIService.java @@ -16,7 +16,6 @@ public interface IotaAPIService { String CONTENT_TYPE_HEADER = "Content-Type: application/json"; String USER_AGENT_HEADER = "User-Agent: JOTA-API wrapper"; - String X_IOTA_API_VERSION_HEADER = "X-IOTA-API-Version: 1"; /** * Returns information about your node. @@ -26,7 +25,7 @@ public interface IotaAPIService { * * @return a {@code NodeInfoResponse} object, if succesfull. */ - @Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER, X_IOTA_API_VERSION_HEADER}) + @Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER}) @POST("./") Call getNodeInfo(@Body IotaCommandRequest request); @@ -36,7 +35,7 @@ public interface IotaAPIService { * curl http://localhost:14265 -X POST -H 'Content-Type: application/json' * -d '{"command": "getNeighbors"}' */ - @Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER, X_IOTA_API_VERSION_HEADER}) + @Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER}) @POST("./") Call getNeighbors(@Body IotaCommandRequest request); @@ -46,7 +45,7 @@ public interface IotaAPIService { * curl http://localhost:14265 -X POST -H 'Content-Type: application/json' * -d '{"command": "addNeighbors", "uris": ["udp://8.8.8.8:14265", "udp://8.8.8.5:14265"]}' */ - @Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER, X_IOTA_API_VERSION_HEADER}) + @Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER}) @POST("./") Call addNeighbors(@Body IotaNeighborsRequest request); @@ -56,7 +55,7 @@ public interface IotaAPIService { * curl http://localhost:14265 -X POST -H 'Content-Type: application/json' * -d '{"command": "removeNeighbors", "uris": ["udp://8.8.8.8:14265", "udp://8.8.8.5:14265"]}' */ - @Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER, X_IOTA_API_VERSION_HEADER}) + @Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER}) @POST("./") Call removeNeighbors(@Body IotaNeighborsRequest request); @@ -66,7 +65,7 @@ public interface IotaAPIService { * curl http://localhost:14265 -X POST -H 'Content-Type: application/json' * -d '{"command": "getTips"}' */ - @Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER, X_IOTA_API_VERSION_HEADER}) + @Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER}) @POST("./") Call getTips(@Body IotaCommandRequest request); @@ -76,7 +75,7 @@ public interface IotaAPIService { * curl http://localhost:14265 \ -X POST \ -H 'Content-Type: application/json' \ * -d '{"command": "findTransactions", "addresses": ["RVORZ9SIIP9RCYMREUIXXVPQIPHVCNPQ9HZWYKFWYWZRE9JQKG9REPKIASHUUECPSQO9JT9XNMVKWYGVAZETAIRPTM"]}' */ - @Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER, X_IOTA_API_VERSION_HEADER}) + @Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER}) @POST("./") Call findTransactions(@Body IotaFindTransactionsRequest request); @@ -87,7 +86,7 @@ public interface IotaAPIService { * curl http://localhost:14265 -X POST -H 'Content-Type: application/json' * -d '{"command": "getInclusionStates", "transactions"Q9HZWYKFWYWZRE9JQKG9REPKIASHUUECPSQO9JT9XNMVKWYGVAZETAIRPTM"], "tips" : []}' */ - @Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER, X_IOTA_API_VERSION_HEADER}) + @Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER}) @POST("./") Call getInclusionStates(@Body IotaGetInclusionStateRequest request); @@ -97,7 +96,7 @@ public interface IotaAPIService { * curl http://localhost:14265 -X POST -H 'Content-Type: application/json' * -d '{"command": "getTrytes", "hashes": ["OAATQS9VQLSXCLDJVJJVYUGONXAXOFMJOZNSYWRZSWECMXAQQURHQBJNLD9IOFEPGZEPEMPXCIVRX9999"]}' */ - @Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER, X_IOTA_API_VERSION_HEADER}) + @Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER}) @POST("./") Call getTrytes(@Body IotaGetTrytesRequest request); @@ -107,7 +106,7 @@ public interface IotaAPIService { * curl http://localhost:14265 -X POST -H 'Content-Type: application/json' * -d '{"command": "getTransactionsToApprove", "depth": 27}' */ - @Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER, X_IOTA_API_VERSION_HEADER}) + @Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER}) @POST("./") Call getTransactionsToApprove(@Body IotaGetTransactionsToApproveRequest request); @@ -117,7 +116,7 @@ public interface IotaAPIService { * curl http://localhost:14265 -X POST -H 'Content-Type: application/json' * -d '{"command": "getBalances", "addresses": ["HBBYKAKTILIPVUKFOTSLHGENPTXYBNKXZFQFR9VQFWNBMTQNRVOUKPVPRNBSZVVILMAFBKOTBLGLWLOHQ"], "threshold": 100}' */ - @Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER, X_IOTA_API_VERSION_HEADER}) + @Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER}) @POST("./") Call getBalances(@Body IotaGetBalancesRequest request); @@ -127,7 +126,7 @@ public interface IotaAPIService { * curl http://localhost:14265 -X POST -H 'Content-Type: application/json' * -d '{"command": "attachToTangle", "trunkTransaction": "JVMTDGDPDFYHMZPMWEKKANBQSLSDTIIHAYQUMZOKHXXXGJHJDQPOMDOMNRDKYCZRUFZROZDADTHZC9999", "branchTransaction": "P9KFSJVGSPLXAEBJSHWFZLGP9GGJTIO9YITDEHATDTGAFLPLBZ9FOFWWTKMAZXZHFGQHUOXLXUALY9999", "minWeightMagnitude": 18, "trytes": ["TRYTVALUEHERE"]}' */ - @Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER, X_IOTA_API_VERSION_HEADER}) + @Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER}) @POST("./") Call attachToTangle(@Body IotaAttachToTangleRequest request); @@ -137,7 +136,7 @@ public interface IotaAPIService { * curl http://localhost:14265 -X POST -H 'Content-Type: application/json' * -d '{"command": "interruptAttachingToTangle" } */ - @Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER, X_IOTA_API_VERSION_HEADER}) + @Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER}) @POST("./") Call interruptAttachingToTangle(@Body IotaCommandRequest request); @@ -147,7 +146,7 @@ public interface IotaAPIService { * curl http://localhost:14265 -X POST -H 'Content-Type: application/json' * -d '{"command": "broadcastTransactions", "trytes": ["BYSWEAUTWXHXZ9YBZISEK9LUHWGMHXCGEVNZHRLUWQFCUSDXZHOFHWHL9MQPVJXXZLIXPXPXF9KYEREFSKCPKYIIKPZVLHUTDFQKKVVBBN9ATTLPCNPJDWDEVIYYLGPZGCWXOBDXMLJC9VO9QXTTBLAXTTBFUAROYEGQIVB9MJWJKXJMCUPTWAUGFZBTZCSJVRBGMYXTVBDDS9MYUJCPZ9YDWWQNIPUAIJXXSNLKUBSCOIJPCLEFPOXFJREXQCUVUMKSDOVQGGHRNILCO9GNCLWFM9APMNMWYASHXQAYBEXF9QRIHIBHYEJOYHRQJAOKAQ9AJJFQ9WEIWIJOTZATIBOXQLBMIJU9PCGBLVDDVFP9CFFSXTDUXMEGOOFXWRTLFGV9XXMYWEMGQEEEDBTIJ9OJOXFAPFQXCDAXOUDMLVYRMRLUDBETOLRJQAEDDLNVIRQJUBZBO9CCFDHIX9MSQCWYAXJVWHCUPTRSXJDESISQPRKZAFKFRULCGVRSBLVFOPEYLEE99JD9SEBALQINPDAZHFAB9RNBH9AZWIJOTLBZVIEJIAYGMC9AZGNFWGRSWAXTYSXVROVNKCOQQIWGPNQZKHUNODGYADPYLZZZUQRTJRTODOUKAOITNOMWNGHJBBA99QUMBHRENGBHTH9KHUAOXBVIVDVYYZMSEYSJWIOGGXZVRGN999EEGQMCOYVJQRIRROMPCQBLDYIGQO9AMORPYFSSUGACOJXGAQSPDY9YWRRPESNXXBDQ9OZOXVIOMLGTSWAMKMTDRSPGJKGBXQIVNRJRFRYEZ9VJDLHIKPSKMYC9YEGHFDS9SGVDHRIXBEMLFIINOHVPXIFAZCJKBHVMQZEVWCOSNWQRDYWVAIBLSCBGESJUIBWZECPUCAYAWMTQKRMCHONIPKJYYTEGZCJYCT9ABRWTJLRQXKMWY9GWZMHYZNWPXULNZAPVQLPMYQZCYNEPOCGOHBJUZLZDPIXVHLDMQYJUUBEDXXPXFLNRGIPWBRNQQZJSGSJTTYHIGGFAWJVXWL9THTPWOOHTNQWCNYOYZXALHAZXVMIZE9WMQUDCHDJMIBWKTYH9AC9AFOT9DPCADCV9ZWUTE9QNOMSZPTZDJLJZCJGHXUNBJFUBJWQUEZDMHXGBPTNSPZBR9TGSKVOHMOQSWPGFLSWNESFKSAZY9HHERAXALZCABFYPOVLAHMIHVDBGKUMDXC9WHHTIRYHZVWNXSVQUWCR9M9RAGMFEZZKZ9XEOQGOSLFQCHHOKLDSA9QCMDGCGMRYJZLBVIFOLBIJPROKMHOYTBTJIWUZWJMCTKCJKKTR9LCVYPVJI9AHGI9JOWMIWZAGMLDFJA9WU9QAMEFGABIBEZNNAL9OXSBFLOEHKDGHWFQSHMPLYFCNXAAZYJLMQDEYRGL9QKCEUEJ9LLVUOINVSZZQHCIKPAGMT9CAYIIMTTBCPKWTYHOJIIY9GYNPAJNUJ9BKYYXSV9JSPEXYMCFAIKTGNRSQGUNIYZCRT9FOWENSZQPD9ALUPYYAVICHVYELYFPUYDTWUSWNIYFXPX9MICCCOOZIWRNJIDALWGWRATGLJXNAYTNIZWQ9YTVDBOFZRKO9CFWRPAQQRXTPACOWCPRLYRYSJARRKSQPR9TCFXDVIXLP9XVL99ERRDSOHBFJDJQQGGGCZNDQ9NYCTQJWVZIAELCRBJJFDMCNZU9FIZRPGNURTXOCDSQGXTQHKHUECGWFUUYS9J9NYQ9U9P9UUP9YMZHWWWCIASCFLCMSKTELZWUGCDE9YOKVOVKTAYPHDF9ZCCQAYPJIJNGSHUIHHCOSSOOBUDOKE9CJZGYSSGNCQJVBEFTZFJ9SQUHOASKRRGBSHWKBCBWBTJHOGQ9WOMQFHWJVEG9NYX9KWBTCAIXNXHEBDIOFO9ALYMFGRICLCKKLG9FOBOX9PDWNQRGHBKHGKKRLWTBEQMCWQRLHAVYYZDIIPKVQTHYTWQMTOACXZOQCDTJTBAAUWXSGJF9PNQIJ9AJRUMUVCPWYVYVARKR9RKGOUHHNKNVGGPDDLGKPQNOYHNKAVVKCXWXOQPZNSLATUJT9AUWRMPPSWHSTTYDFAQDXOCYTZHOYYGAIM9CELMZ9AZPWB9MJXGHOKDNNSZVUDAGXTJJSSZCPZVPZBYNNTUQABSXQWZCHDQSLGK9UOHCFKBIBNETK999999999999999999999999999999999999999999999999999999999999999999999999999999999NOXDXXKUDWLOFJLIPQIBRBMGDYCPGDNLQOLQS99EQYKBIU9VHCJVIPFUYCQDNY9APGEVYLCENJIOBLWNB999999999XKBRHUD99C99999999NKZKEKWLDKMJCI9N9XQOLWEPAYWSH9999999999999999999999999KDDTGZLIPBNZKMLTOLOXQVNGLASESDQVPTXALEKRMIOHQLUHD9ELQDBQETS9QFGTYOYWLNTSKKMVJAUXSIROUICDOXKSYZTDPEDKOQENTJOWJONDEWROCEJIEWFWLUAACVSJFTMCHHXJBJRKAAPUDXXVXFWP9X9999IROUICDOXKSYZTDPEDKOQENTJOWJONDEWROCEJIEWFWLUAACVSJFTMCHHXJBJRKAAPUDXXVXFWP9X9999"]} */ - @Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER, X_IOTA_API_VERSION_HEADER}) + @Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER}) @POST("./") Call broadcastTransactions(@Body IotaBroadcastTransactionRequest request); @@ -157,7 +156,7 @@ public interface IotaAPIService { * curl http://localhost:14265 -X POST -H 'Content-Type: application/json' * -d '{"command": "storeTransactions", "trytes": ["BYSWEAUTWXHXZ9YBZISEK9LUHWGMHXCGEVNZHRLUWQFCUSDXZHOFHWHL9MQPVJXXZLIXPXPXF9KYEREFSKCPKYIIKPZVLHUTDFQKKVVBBN9ATTLPCNPJDWDEVIYYLGPZGCWXOBDXMLJC9VO9QXTTBLAXTTBFUAROYEGQIVB9MJWJKXJMCUPTWAUGFZBTZCSJVRBGMYXTVBDDS9MYUJCPZ9YDWWQNIPUAIJXXSNLKUBSCOIJPCLEFPOXFJREXQCUVUMKSDOVQGGHRNILCO9GNCLWFM9APMNMWYASHXQAYBEXF9QRIHIBHYEJOYHRQJAOKAQ9AJJFQ9WEIWIJOTZATIBOXQLBMIJU9PCGBLVDDVFP9CFFSXTDUXMEGOOFXWRTLFGV9XXMYWEMGQEEEDBTIJ9OJOXFAPFQXCDAXOUDMLVYRMRLUDBETOLRJQAEDDLNVIRQJUBZBO9CCFDHIX9MSQCWYAXJVWHCUPTRSXJDESISQPRKZAFKFRULCGVRSBLVFOPEYLEE99JD9SEBALQINPDAZHFAB9RNBH9AZWIJOTLBZVIEJIAYGMC9AZGNFWGRSWAXTYSXVROVNKCOQQIWGPNQZKHUNODGYADPYLZZZUQRTJRTODOUKAOITNOMWNGHJBBA99QUMBHRENGBHTH9KHUAOXBVIVDVYYZMSEYSJWIOGGXZVRGN999EEGQMCOYVJQRIRROMPCQBLDYIGQO9AMORPYFSSUGACOJXGAQSPDY9YWRRPESNXXBDQ9OZOXVIOMLGTSWAMKMTDRSPGJKGBXQIVNRJRFRYEZ9VJDLHIKPSKMYC9YEGHFDS9SGVDHRIXBEMLFIINOHVPXIFAZCJKBHVMQZEVWCOSNWQRDYWVAIBLSCBGESJUIBWZECPUCAYAWMTQKRMCHONIPKJYYTEGZCJYCT9ABRWTJLRQXKMWY9GWZMHYZNWPXULNZAPVQLPMYQZCYNEPOCGOHBJUZLZDPIXVHLDMQYJUUBEDXXPXFLNRGIPWBRNQQZJSGSJTTYHIGGFAWJVXWL9THTPWOOHTNQWCNYOYZXALHAZXVMIZE9WMQUDCHDJMIBWKTYH9AC9AFOT9DPCADCV9ZWUTE9QNOMSZPTZDJLJZCJGHXUNBJFUBJWQUEZDMHXGBPTNSPZBR9TGSKVOHMOQSWPGFLSWNESFKSAZY9HHERAXALZCABFYPOVLAHMIHVDBGKUMDXC9WHHTIRYHZVWNXSVQUWCR9M9RAGMFEZZKZ9XEOQGOSLFQCHHOKLDSA9QCMDGCGMRYJZLBVIFOLBIJPROKMHOYTBTJIWUZWJMCTKCJKKTR9LCVYPVJI9AHGI9JOWMIWZAGMLDFJA9WU9QAMEFGABIBEZNNAL9OXSBFLOEHKDGHWFQSHMPLYFCNXAAZYJLMQDEYRGL9QKCEUEJ9LLVUOINVSZZQHCIKPAGMT9CAYIIMTTBCPKWTYHOJIIY9GYNPAJNUJ9BKYYXSV9JSPEXYMCFAIKTGNRSQGUNIYZCRT9FOWENSZQPD9ALUPYYAVICHVYELYFPUYDTWUSWNIYFXPX9MICCCOOZIWRNJIDALWGWRATGLJXNAYTNIZWQ9YTVDBOFZRKO9CFWRPAQQRXTPACOWCPRLYRYSJARRKSQPR9TCFXDVIXLP9XVL99ERRDSOHBFJDJQQGGGCZNDQ9NYCTQJWVZIAELCRBJJFDMCNZU9FIZRPGNURTXOCDSQGXTQHKHUECGWFUUYS9J9NYQ9U9P9UUP9YMZHWWWCIASCFLCMSKTELZWUGCDE9YOKVOVKTAYPHDF9ZCCQAYPJIJNGSHUIHHCOSSOOBUDOKE9CJZGYSSGNCQJVBEFTZFJ9SQUHOASKRRGBSHWKBCBWBTJHOGQ9WOMQFHWJVEG9NYX9KWBTCAIXNXHEBDIOFO9ALYMFGRICLCKKLG9FOBOX9PDWNQRGHBKHGKKRLWTBEQMCWQRLHAVYYZDIIPKVQTHYTWQMTOACXZOQCDTJTBAAUWXSGJF9PNQIJ9AJRUMUVCPWYVYVARKR9RKGOUHHNKNVGGPDDLGKPQNOYHNKAVVKCXWXOQPZNSLATUJT9AUWRMPPSWHSTTYDFAQDXOCYTZHOYYGAIM9CELMZ9AZPWB9MJXGHOKDNNSZVUDAGXTJJSSZCPZVPZBYNNTUQABSXQWZCHDQSLGK9UOHCFKBIBNETK999999999999999999999999999999999999999999999999999999999999999999999999999999999NOXDXXKUDWLOFJLIPQIBRBMGDYCPGDNLQOLQS99EQYKBIU9VHCJVIPFUYCQDNY9APGEVYLCENJIOBLWNB999999999XKBRHUD99C99999999NKZKEKWLDKMJCI9N9XQOLWEPAYWSH9999999999999999999999999KDDTGZLIPBNZKMLTOLOXQVNGLASESDQVPTXALEKRMIOHQLUHD9ELQDBQETS9QFGTYOYWLNTSKKMVJAUXSIROUICDOXKSYZTDPEDKOQENTJOWJONDEWROCEJIEWFWLUAACVSJFTMCHHXJBJRKAAPUDXXVXFWP9X9999IROUICDOXKSYZTDPEDKOQENTJOWJONDEWROCEJIEWFWLUAACVSJFTMCHHXJBJRKAAPUDXXVXFWP9X9999"]}' */ - @Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER, X_IOTA_API_VERSION_HEADER}) + @Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER}) @POST("./") Call storeTransactions(@Body IotaStoreTransactionsRequest request); } diff --git a/src/main/java/jota/error/InvalidApiVersionException.java b/src/main/java/jota/error/InvalidApiVersionException.java new file mode 100644 index 0000000..e5776af --- /dev/null +++ b/src/main/java/jota/error/InvalidApiVersionException.java @@ -0,0 +1,16 @@ +package jota.error; + + /** + * This exception occurs when invalid api version is provided. + * + * @author pinpong + */ + public class InvalidApiVersionException extends BaseException { + + /** + * Initializes a new instance of the InvalidApiVersionException. + */ + public InvalidApiVersionException() { + super("Invalid api version"); + } +}