This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push: new 4d9757a CAMEL-16978: camel-xchange - Support more than one crypto exchanges. 4d9757a is described below commit 4d9757a8d7adbbdeb30010a01d1754eb233284ce Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Sun Nov 14 10:53:54 2021 +0100 CAMEL-16978: camel-xchange - Support more than one crypto exchanges. --- .../camel/component/xchange/XChangeComponent.java | 33 +++++++++---------- .../component/xchange/XChangeConfiguration.java | 31 ------------------ .../camel/component/xchange/XChangeHelper.java | 37 ++++++++++++++++++++++ .../xchange/account/AccountProducerTest.java | 15 +++------ 4 files changed, 58 insertions(+), 58 deletions(-) diff --git a/components/camel-xchange/src/main/java/org/apache/camel/component/xchange/XChangeComponent.java b/components/camel-xchange/src/main/java/org/apache/camel/component/xchange/XChangeComponent.java index c0c05fc..3d866e9 100644 --- a/components/camel-xchange/src/main/java/org/apache/camel/component/xchange/XChangeComponent.java +++ b/components/camel-xchange/src/main/java/org/apache/camel/component/xchange/XChangeComponent.java @@ -16,6 +16,7 @@ */ package org.apache.camel.component.xchange; +import java.util.HashMap; import java.util.Map; import org.apache.camel.Endpoint; @@ -28,40 +29,40 @@ import org.knowm.xchange.utils.Assert; @Component("xchange") public class XChangeComponent extends DefaultComponent { - private XChange xchange; + private final Map<String, XChange> xchanges = new HashMap<>(); @Override protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception { - // Init the configuration - XChangeConfiguration configuration = new XChangeConfiguration(this); - - // Set the required name of the exchange + XChangeConfiguration configuration = new XChangeConfiguration(); configuration.setName(remaining); XChangeEndpoint endpoint = new XChangeEndpoint(uri, this, configuration); setProperties(endpoint, parameters); - // after configuring endpoint then create xchange - XChange xchange = createXChange(configuration); + // after configuring endpoint then get or create xchange instance + XChange xchange = getOrCreateXChange(remaining); endpoint.setXchange(xchange); return endpoint; } - public XChange getXChange() { - return xchange; + public XChange getXChange(String name) { + return xchanges.get(name); } - private synchronized XChange createXChange(XChangeConfiguration configuration) { + @Override + protected void doShutdown() throws Exception { + super.doShutdown(); + xchanges.clear(); + } + private synchronized XChange getOrCreateXChange(String name) { + XChange xchange = xchanges.get(name); if (xchange == null) { - - // Get the XChange implementation - Class<? extends Exchange> exchangeClass = configuration.getXChangeClass(); - Assert.notNull(exchangeClass, "XChange not supported: " + configuration.getName()); - - // Create the XChange and associated Endpoint + Class<? extends Exchange> exchangeClass = XChangeHelper.loadXChangeClass(getCamelContext(), name); + Assert.notNull(exchangeClass, "XChange not supported: " + name); xchange = new XChange(ExchangeFactory.INSTANCE.createExchange(exchangeClass)); + xchanges.put(name, xchange); } return xchange; diff --git a/components/camel-xchange/src/main/java/org/apache/camel/component/xchange/XChangeConfiguration.java b/components/camel-xchange/src/main/java/org/apache/camel/component/xchange/XChangeConfiguration.java index d5fe013..b783d29 100644 --- a/components/camel-xchange/src/main/java/org/apache/camel/component/xchange/XChangeConfiguration.java +++ b/components/camel-xchange/src/main/java/org/apache/camel/component/xchange/XChangeConfiguration.java @@ -16,16 +16,10 @@ */ package org.apache.camel.component.xchange; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; - import org.apache.camel.spi.Metadata; import org.apache.camel.spi.UriParam; import org.apache.camel.spi.UriParams; import org.apache.camel.spi.UriPath; -import org.apache.camel.util.ObjectHelper; -import org.knowm.xchange.Exchange; import org.knowm.xchange.currency.Currency; import org.knowm.xchange.currency.CurrencyPair; @@ -57,8 +51,6 @@ public class XChangeConfiguration { public static final String HEADER_CURRENCY = "Currency"; public static final String HEADER_CURRENCY_PAIR = "CurrencyPair"; - static Map<String, Class<? extends Exchange>> xchangeMapping = new HashMap<>(); - @UriPath(description = "The exchange to connect to") @Metadata(required = true) private String name; @@ -73,10 +65,6 @@ public class XChangeConfiguration { @UriParam(description = "The currency pair") private String currencyPair; - public XChangeConfiguration(XChangeComponent component) { - ObjectHelper.notNull(component, "component"); - } - public String getName() { return name; } @@ -128,23 +116,4 @@ public class XChangeConfiguration { this.currencyPair = currencyPair; } - @SuppressWarnings("unchecked") - public Class<? extends Exchange> getXChangeClass() { - Class<? extends Exchange> xchangeClass = xchangeMapping.get(name); - if (xchangeClass == null) { - String firstUpper = name.substring(0, 1).toUpperCase() + name.substring(1); - String className = "org.knowm.xchange." + name + "." + firstUpper + "Exchange"; - ClassLoader classLoader = getClass().getClassLoader(); - try { - xchangeClass = (Class<? extends Exchange>) classLoader.loadClass(className); - } catch (ClassNotFoundException e) { - // ignore - } - } - return xchangeClass; - } - - public Set<String> getSupportedXChangeNames() { - return xchangeMapping.keySet(); - } } diff --git a/components/camel-xchange/src/main/java/org/apache/camel/component/xchange/XChangeHelper.java b/components/camel-xchange/src/main/java/org/apache/camel/component/xchange/XChangeHelper.java new file mode 100644 index 0000000..f785800 --- /dev/null +++ b/components/camel-xchange/src/main/java/org/apache/camel/component/xchange/XChangeHelper.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.xchange; + +import org.apache.camel.CamelContext; +import org.knowm.xchange.Exchange; + +public final class XChangeHelper { + + private XChangeHelper() { + } + + public static Class<? extends Exchange> loadXChangeClass(CamelContext camelContext, String name) { + String firstUpper = name.substring(0, 1).toUpperCase() + name.substring(1); + String className = "org.knowm.xchange." + name + "." + firstUpper + "Exchange"; + try { + return camelContext.getClassResolver().resolveClass(className, Exchange.class); + } catch (Exception e) { + // ignore + } + return null; + } +} diff --git a/components/camel-xchange/src/test/java/org/apache/camel/component/xchange/account/AccountProducerTest.java b/components/camel-xchange/src/test/java/org/apache/camel/component/xchange/account/AccountProducerTest.java index ea95037..2b8463d 100644 --- a/components/camel-xchange/src/test/java/org/apache/camel/component/xchange/account/AccountProducerTest.java +++ b/components/camel-xchange/src/test/java/org/apache/camel/component/xchange/account/AccountProducerTest.java @@ -36,7 +36,6 @@ public class AccountProducerTest extends CamelTestSupport { return new RouteBuilder() { @Override public void configure() { - from("direct:balances") .to("xchange:binance?service=account&method=balances"); @@ -50,9 +49,7 @@ public class AccountProducerTest extends CamelTestSupport { } @Test - @SuppressWarnings("unchecked") - void testBalances() { - + public void testBalances() { assumeTrue(hasAPICredentials()); List<Balance> balances = template.requestBody("direct:balances", null, List.class); @@ -60,9 +57,7 @@ public class AccountProducerTest extends CamelTestSupport { } @Test - @SuppressWarnings("unchecked") - void testWallets() { - + public void testWallets() { assumeTrue(hasAPICredentials()); List<Wallet> wallets = template.requestBody("direct:wallets", null, List.class); @@ -70,9 +65,7 @@ public class AccountProducerTest extends CamelTestSupport { } @Test - @SuppressWarnings("unchecked") - void testFundingHistory() { - + public void testFundingHistory() { assumeTrue(hasAPICredentials()); List<FundingRecord> records = template.requestBody("direct:fundingHistory", null, List.class); @@ -81,6 +74,6 @@ public class AccountProducerTest extends CamelTestSupport { private boolean hasAPICredentials() { XChangeComponent component = context().getComponent("xchange", XChangeComponent.class); - return component.getXChange().getExchangeSpecification().getApiKey() != null; + return component.getXChange("binance").getExchangeSpecification().getApiKey() != null; } }