From 99434deaeda8c1ea14dfbb5d33ed25620105de7b Mon Sep 17 00:00:00 2001 From: Erich Birngruber Date: Tue, 21 Jan 2014 12:56:18 +0100 Subject: [PATCH] client request filter can enforce json media type, getting rid of all the other ugly hack that would have done the same --- .../api/client/RestExchangeClient.java | 1 + .../exchange/api/jaxb/JSONResolver.java | 89 ------------------- .../api/jaxb/JsonEnforcingFilter.java | 23 +++++ .../exchange/bitcurex/BitcurexApiClient.java | 14 +-- .../bitcurex/BitcurexJsonResolver.java | 26 ------ .../exchange/bitkonan/BitkonanApiClient.java | 12 --- .../bitkonan/BitkonanJsonResolver.java | 21 ----- .../bitstamp/BitstampJsonResolver.java | 25 ------ .../bitcoin/exchange/btce/BtcEApiClient.java | 23 ++--- .../exchange/btce/BtcEJsonResolver.java | 21 ----- kraken/kraken.iml | 2 +- .../bitcoin/exchange/mtgox/MtGoxClient.java | 2 - .../exchange/mtgox/MtGoxJSONResolver.java | 23 ----- 13 files changed, 33 insertions(+), 249 deletions(-) delete mode 100644 api/src/main/java/at/outdated/bitcoin/exchange/api/jaxb/JSONResolver.java create mode 100644 api/src/main/java/at/outdated/bitcoin/exchange/api/jaxb/JsonEnforcingFilter.java delete mode 100644 bitcurex/src/main/java/at/outdated/bitcoin/exchange/bitcurex/BitcurexJsonResolver.java delete mode 100644 bitkonan/src/main/java/at/outdated/bitcoin/exchange/bitkonan/BitkonanJsonResolver.java delete mode 100644 bitstamp/src/main/java/at/outdated/bitcoin/exchange/bitstamp/BitstampJsonResolver.java delete mode 100644 btc-e/src/main/java/at/outdated/bitcoin/exchange/btce/BtcEJsonResolver.java delete mode 100644 mtgox/src/main/java/at/outdated/bitcoin/exchange/mtgox/MtGoxJSONResolver.java diff --git a/api/src/main/java/at/outdated/bitcoin/exchange/api/client/RestExchangeClient.java b/api/src/main/java/at/outdated/bitcoin/exchange/api/client/RestExchangeClient.java index a19c2c3..fa77236 100644 --- a/api/src/main/java/at/outdated/bitcoin/exchange/api/client/RestExchangeClient.java +++ b/api/src/main/java/at/outdated/bitcoin/exchange/api/client/RestExchangeClient.java @@ -1,5 +1,6 @@ package at.outdated.bitcoin.exchange.api.client; +import at.outdated.bitcoin.exchange.api.jaxb.JsonEnforcingFilter; import at.outdated.bitcoin.exchange.api.market.*; import javax.json.Json; diff --git a/api/src/main/java/at/outdated/bitcoin/exchange/api/jaxb/JSONResolver.java b/api/src/main/java/at/outdated/bitcoin/exchange/api/jaxb/JSONResolver.java deleted file mode 100644 index e476114..0000000 --- a/api/src/main/java/at/outdated/bitcoin/exchange/api/jaxb/JSONResolver.java +++ /dev/null @@ -1,89 +0,0 @@ -package at.outdated.bitcoin.exchange.api.jaxb; - -import org.eclipse.persistence.jaxb.rs.MOXyJsonProvider; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.ws.rs.core.MediaType; -import javax.ws.rs.ext.ContextResolver; -import javax.ws.rs.ext.Provider; -import javax.xml.bind.JAXBElement; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.StringWriter; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - -/** - * Created with IntelliJ IDEA. - * User: ebirn - * Date: 30.05.13 - * Time: 13:32 - * To change this template use File | Settings | File Templates. - */ -@Provider -public abstract class JSONResolver implements ContextResolver { - protected static final Logger log = LoggerFactory.getLogger("JsonContextResolver"); - // does not contain InfoMessage, which is only returned in case of error and should throw exception - - protected MOXyJsonProvider context; - protected Set> types; - - public JSONResolver() { - this.types = new HashSet<>(Arrays.asList(getTypes())); - try { - this.context = new MOXyJsonProvider(); - } - catch(Exception je) { - log.error("failed to init JSON resolver for: " + getTypes(), je); - } - } - - protected abstract Class[] getTypes(); - - public static T convertFromJson(String jsonString, Class target) { - - T result = null; - - - try { - MOXyJsonProvider jacksonJAXBProvider = new MOXyJsonProvider(); - InputStream is = new ByteArrayInputStream(jsonString.getBytes()); - result = ((JAXBElement) jacksonJAXBProvider.readFrom(Object.class, target, null, MediaType.APPLICATION_JSON_TYPE, null, is)).getValue(); - }catch (IOException ioe) { - ioe.printStackTrace(); - } - - return result; - } - - public static String convert2Json(Object obj) { - - String result = null; - - try(StringWriter writer = new StringWriter()) { - - MOXyJsonProvider jacksonJAXBProvider = new MOXyJsonProvider(); - ///FIXME - - writer.flush(); - - result = writer.getBuffer().toString(); - - } - catch (IOException /*| JAXBException */ e) { - e.printStackTrace(); - } - - return result; - } - - - @Override - public MOXyJsonProvider getContext(Class objectType) { - log.info("resolving json {0}", objectType); - return (types.contains(objectType)) ? context : null; - } -} diff --git a/api/src/main/java/at/outdated/bitcoin/exchange/api/jaxb/JsonEnforcingFilter.java b/api/src/main/java/at/outdated/bitcoin/exchange/api/jaxb/JsonEnforcingFilter.java new file mode 100644 index 0000000..bedf35d --- /dev/null +++ b/api/src/main/java/at/outdated/bitcoin/exchange/api/jaxb/JsonEnforcingFilter.java @@ -0,0 +1,23 @@ +package at.outdated.bitcoin.exchange.api.jaxb; + +import javax.ws.rs.client.ClientRequestContext; +import javax.ws.rs.client.ClientRequestFilter; +import javax.ws.rs.client.ClientResponseContext; +import javax.ws.rs.client.ClientResponseFilter; +import javax.ws.rs.core.MediaType; +import java.io.IOException; + +/** + * Created by ebirn on 21.01.14. + */ + +public class JsonEnforcingFilter implements ClientResponseFilter { + + + @Override + public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException { + + responseContext.getHeaders().putSingle("Content-Type", MediaType.APPLICATION_JSON); + + } +} diff --git a/bitcurex/src/main/java/at/outdated/bitcoin/exchange/bitcurex/BitcurexApiClient.java b/bitcurex/src/main/java/at/outdated/bitcoin/exchange/bitcurex/BitcurexApiClient.java index f2f4005..2daefa2 100644 --- a/bitcurex/src/main/java/at/outdated/bitcoin/exchange/bitcurex/BitcurexApiClient.java +++ b/bitcurex/src/main/java/at/outdated/bitcoin/exchange/bitcurex/BitcurexApiClient.java @@ -2,6 +2,7 @@ import at.outdated.bitcoin.exchange.api.OrderId; import at.outdated.bitcoin.exchange.api.client.RestExchangeClient; +import at.outdated.bitcoin.exchange.api.jaxb.JsonEnforcingFilter; import at.outdated.bitcoin.exchange.api.market.Market; import at.outdated.bitcoin.exchange.api.account.AccountInfo; import at.outdated.bitcoin.exchange.api.account.Wallet; @@ -39,6 +40,8 @@ public class BitcurexApiClient extends RestExchangeClient { public BitcurexApiClient(Market market) { super(market); + client.register(JsonEnforcingFilter.class); + tradeTarget = client.target("https://{quote}.bitcurex.com/api/0/"); publicTarget = client.target("https://{quote}.bitcurex.com/data"); } @@ -136,17 +139,6 @@ public MarketDepth getMarketDepth(AssetPair asset) { return depth; } - @Override - protected R simpleGetRequest(WebTarget resource, Class resultClass) { - String resultStr = super.simpleGetRequest(resource, String.class); - - log.debug("BITCUREX raw: " + resultStr); - - R result = BitcurexJsonResolver.convertFromJson(resultStr, resultClass); - - return result; - } - @Override public TickerValue getTicker(AssetPair asset) { diff --git a/bitcurex/src/main/java/at/outdated/bitcoin/exchange/bitcurex/BitcurexJsonResolver.java b/bitcurex/src/main/java/at/outdated/bitcoin/exchange/bitcurex/BitcurexJsonResolver.java deleted file mode 100644 index 03f5976..0000000 --- a/bitcurex/src/main/java/at/outdated/bitcoin/exchange/bitcurex/BitcurexJsonResolver.java +++ /dev/null @@ -1,26 +0,0 @@ -package at.outdated.bitcoin.exchange.bitcurex; - -import at.outdated.bitcoin.exchange.api.jaxb.JSONResolver; -import at.outdated.bitcoin.exchange.bitcurex.jaxb.BitcurexTickerValue; - -import javax.ws.rs.ext.Provider; - -/** - * Created with IntelliJ IDEA. - * User: ebirn - * Date: 25.05.13 - * Time: 13:55 - * To change this template use File | Settings | File Templates. - */ - - -@Provider -public class BitcurexJsonResolver extends JSONResolver { - - - @Override - protected Class[] getTypes() { - return new Class[] { BitcurexTickerValue.class }; //To change body of implemented methods use File | Settings | File Templates. - } -} - diff --git a/bitkonan/src/main/java/at/outdated/bitcoin/exchange/bitkonan/BitkonanApiClient.java b/bitkonan/src/main/java/at/outdated/bitcoin/exchange/bitkonan/BitkonanApiClient.java index 9128724..0088410 100644 --- a/bitkonan/src/main/java/at/outdated/bitcoin/exchange/bitkonan/BitkonanApiClient.java +++ b/bitkonan/src/main/java/at/outdated/bitcoin/exchange/bitkonan/BitkonanApiClient.java @@ -98,18 +98,6 @@ public MarketDepth getMarketDepth(AssetPair asset) { return depth; } - @Override - protected R simpleGetRequest(WebTarget target, Class resultClass) { - - R result = null; - - String resultStr = super.simpleGetRequest(target, String.class); - - result = BitkonanJsonResolver.convertFromJson(resultStr, resultClass); - - return result; - } - @Override public TickerValue getTicker(AssetPair asset) { diff --git a/bitkonan/src/main/java/at/outdated/bitcoin/exchange/bitkonan/BitkonanJsonResolver.java b/bitkonan/src/main/java/at/outdated/bitcoin/exchange/bitkonan/BitkonanJsonResolver.java deleted file mode 100644 index 35bf03b..0000000 --- a/bitkonan/src/main/java/at/outdated/bitcoin/exchange/bitkonan/BitkonanJsonResolver.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.outdated.bitcoin.exchange.bitkonan; - -import at.outdated.bitcoin.exchange.api.jaxb.JSONResolver; - -import javax.ws.rs.ext.Provider; - -/** - * Created with IntelliJ IDEA. - * User: ebirn - * Date: 22.09.13 - * Time: 18:54 - * To change this template use File | Settings | File Templates. - */ -@Provider -public class BitkonanJsonResolver extends JSONResolver { - - @Override - protected Class[] getTypes() { - return new Class[] { BitkonanTickerValue.class }; - } -} diff --git a/bitstamp/src/main/java/at/outdated/bitcoin/exchange/bitstamp/BitstampJsonResolver.java b/bitstamp/src/main/java/at/outdated/bitcoin/exchange/bitstamp/BitstampJsonResolver.java deleted file mode 100644 index 51b76b8..0000000 --- a/bitstamp/src/main/java/at/outdated/bitcoin/exchange/bitstamp/BitstampJsonResolver.java +++ /dev/null @@ -1,25 +0,0 @@ -package at.outdated.bitcoin.exchange.bitstamp; - -import at.outdated.bitcoin.exchange.api.jaxb.JSONResolver; - -import javax.ws.rs.ext.Provider; - -/** - * Created with IntelliJ IDEA. - * User: ebirn - * Date: 25.05.13 - * Time: 13:55 - * To change this template use File | Settings | File Templates. - */ - - -@Provider -public class BitstampJsonResolver extends JSONResolver { - - @Override - protected Class[] getTypes() { - return new Class[]{ BitstampTickerValue.class, BitstampAccountBalance.class, BitstampAccountInfo.class }; //To change body of implemented methods use File | Settings | File Templates. - } - -} - diff --git a/btc-e/src/main/java/at/outdated/bitcoin/exchange/btce/BtcEApiClient.java b/btc-e/src/main/java/at/outdated/bitcoin/exchange/btce/BtcEApiClient.java index 98c15bc..8dfc00c 100644 --- a/btc-e/src/main/java/at/outdated/bitcoin/exchange/btce/BtcEApiClient.java +++ b/btc-e/src/main/java/at/outdated/bitcoin/exchange/btce/BtcEApiClient.java @@ -2,6 +2,7 @@ import at.outdated.bitcoin.exchange.api.OrderId; import at.outdated.bitcoin.exchange.api.client.RestExchangeClient; +import at.outdated.bitcoin.exchange.api.jaxb.JsonEnforcingFilter; import at.outdated.bitcoin.exchange.api.market.Market; import at.outdated.bitcoin.exchange.api.account.AccountInfo; import at.outdated.bitcoin.exchange.api.currency.Currency; @@ -37,8 +38,10 @@ public class BtcEApiClient extends RestExchangeClient { public BtcEApiClient(Market market) { super(market); + client.register(JsonEnforcingFilter.class); tradeFee = new SimplePercentageFee("0.002"); + } @Override @@ -53,15 +56,13 @@ public AccountInfo getAccountInfo() { data = new MultivaluedHashMap<>(); data.add("method", "getInfo"); - String raw = protectedPostRequest(tgt, String.class, Entity.form(data)); - //log.debug("raw info: {}", raw); - InfoResponse infoRes = BtcEJsonResolver.convertFromJson(raw, InfoResponse.class); + InfoResponse infoRes = protectedPostRequest(tgt, InfoResponse.class, Entity.form(data)); AccountInfo info = infoRes.result; data = new MultivaluedHashMap<>(); data.add("method", "TransHistory"); - raw = protectedPostRequest(tgt, String.class, Entity.form(data)); + String raw = protectedPostRequest(tgt, String.class, Entity.form(data)); //log.debug("raw transactions: {}", raw); JsonObject transResponse = jsonFromString(raw); @@ -170,20 +171,6 @@ public MarketDepth getMarketDepth(AssetPair asset) { return depth; } - - @Override - protected R simpleGetRequest(WebTarget target, Class resultClass) { - - R result = null; - - String resultStr = super.simpleGetRequest(target, String.class); - - //log.debug("BTC-E raw: " + resultStr); - result = BtcEJsonResolver.convertFromJson(resultStr, resultClass); - - return result; - } - @Override public TickerValue getTicker(AssetPair asset) { diff --git a/btc-e/src/main/java/at/outdated/bitcoin/exchange/btce/BtcEJsonResolver.java b/btc-e/src/main/java/at/outdated/bitcoin/exchange/btce/BtcEJsonResolver.java deleted file mode 100644 index 6e750b6..0000000 --- a/btc-e/src/main/java/at/outdated/bitcoin/exchange/btce/BtcEJsonResolver.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.outdated.bitcoin.exchange.btce; - -import at.outdated.bitcoin.exchange.api.jaxb.JSONResolver; - -import javax.ws.rs.ext.Provider; - -/** - * Created with IntelliJ IDEA. - * User: ebirn - * Date: 22.09.13 - * Time: 18:54 - * To change this template use File | Settings | File Templates. - */ -@Provider -public class BtcEJsonResolver extends JSONResolver { - - @Override - protected Class[] getTypes() { - return new Class[] { TickerResponse.class, InfoResponse.class }; - } -} diff --git a/kraken/kraken.iml b/kraken/kraken.iml index 64e78ef..7e51d38 100644 --- a/kraken/kraken.iml +++ b/kraken/kraken.iml @@ -4,10 +4,10 @@ - + diff --git a/mtgox/src/main/java/at/outdated/bitcoin/exchange/mtgox/MtGoxClient.java b/mtgox/src/main/java/at/outdated/bitcoin/exchange/mtgox/MtGoxClient.java index 7a45c7d..62e06c7 100644 --- a/mtgox/src/main/java/at/outdated/bitcoin/exchange/mtgox/MtGoxClient.java +++ b/mtgox/src/main/java/at/outdated/bitcoin/exchange/mtgox/MtGoxClient.java @@ -61,10 +61,8 @@ public class MtGoxClient extends RestExchangeClient { public MtGoxClient(Market market) { super(market); - client = ClientBuilder.newBuilder().register(MtGoxJSONResolver.class).build(); apiBaseResource = client.target(API_BASE_URL); - multiplier.put(Currency.BTC, new BigDecimal("1.0e8", CurrencyValue.CURRENCY_MATH_CONTEXT)); multiplier.put(Currency.USD, new BigDecimal("1.0e5", CurrencyValue.CURRENCY_MATH_CONTEXT)); multiplier.put(Currency.EUR, new BigDecimal("1.0e5", CurrencyValue.CURRENCY_MATH_CONTEXT)); diff --git a/mtgox/src/main/java/at/outdated/bitcoin/exchange/mtgox/MtGoxJSONResolver.java b/mtgox/src/main/java/at/outdated/bitcoin/exchange/mtgox/MtGoxJSONResolver.java deleted file mode 100644 index 7d470e3..0000000 --- a/mtgox/src/main/java/at/outdated/bitcoin/exchange/mtgox/MtGoxJSONResolver.java +++ /dev/null @@ -1,23 +0,0 @@ -package at.outdated.bitcoin.exchange.mtgox; - -import at.outdated.bitcoin.exchange.api.jaxb.JSONResolver; - -import javax.ws.rs.ext.Provider; - -/** - * Created with IntelliJ IDEA. - * User: ebirn - * Date: 02.05.13 - * Time: 20:32 - * To change this template use File | Settings | File Templates. - */ - -@Provider -public class MtGoxJSONResolver extends JSONResolver { - - - //@Override - protected Class[] getTypes() { - return new Class[] { ApiTickerResponse.class, ApiLagResponse.class, ApiAccountInfo.class, ApiWalletHistory.class }; - } -}