mirror of https://github.com/apache/lucene.git
SOLR-4515: CurrencyField's OpenExchangeRatesOrgProvider now requires a ratesFileLocation init param, since the previous global default no longer works
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1451818 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
aa22ceb97d
commit
daa66dd5d0
|
@ -195,6 +195,10 @@ Bug Fixes
|
||||||
well as when nodes may switch master/slave roles.
|
well as when nodes may switch master/slave roles.
|
||||||
(Mark Miller, Raúl Grande)
|
(Mark Miller, Raúl Grande)
|
||||||
|
|
||||||
|
* SOLR-4515: CurrencyField's OpenExchangeRatesOrgProvider now requires
|
||||||
|
a ratesFileLocation init param, since the previous global default
|
||||||
|
no longer works (hossman)
|
||||||
|
|
||||||
Optimizations
|
Optimizations
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
|
|
|
@ -130,7 +130,7 @@ public class CurrencyField extends FieldType implements SchemaAware, ResourceLoa
|
||||||
provider = c.newInstance();
|
provider = c.newInstance();
|
||||||
provider.init(args);
|
provider.init(args);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new SolrException(ErrorCode.BAD_REQUEST, "Error instansiating exhange rate provider "+exchangeRateProviderClass+". Please check your FieldType configuration", e);
|
throw new SolrException(ErrorCode.BAD_REQUEST, "Error instantiating exhange rate provider "+exchangeRateProviderClass+": " + e.getMessage(), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,19 +33,29 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Exchange Rates Provider for {@link CurrencyField} implementing the freely available
|
* <p>
|
||||||
* exchange rates from openexchangerates.org
|
* Exchange Rates Provider for {@link CurrencyField} capable of fetching &
|
||||||
|
* parsing the freely available exchange rates from openexchangerates.org
|
||||||
|
* </p>
|
||||||
|
* <p>
|
||||||
|
* Configuration Options:
|
||||||
|
* </p>
|
||||||
|
* <ul>
|
||||||
|
* <li><code>ratesFileLocation</code> - A file path or absolute URL specifying the JSON data to load (mandatory)</li>
|
||||||
|
* <li><coderefreshInterval></code> - How frequently (in minutes) to reload the exchange rate data (default: 1440)</li>
|
||||||
|
* </ul>
|
||||||
* <p>
|
* <p>
|
||||||
* <b>Disclaimer:</b> This data is collected from various providers and provided free of charge
|
* <b>Disclaimer:</b> This data is collected from various providers and provided free of charge
|
||||||
* for informational purposes only, with no guarantee whatsoever of accuracy, validity,
|
* for informational purposes only, with no guarantee whatsoever of accuracy, validity,
|
||||||
* availability or fitness for any purpose; use at your own risk. Other than that - have
|
* availability or fitness for any purpose; use at your own risk. Other than that - have
|
||||||
* fun, and please share/watch/fork if you think data like this should be free!
|
* fun, and please share/watch/fork if you think data like this should be free!
|
||||||
|
* </p>
|
||||||
|
* @see <a href="https://openexchangerates.org/documentation">openexchangerates.org JSON Data Format</a>
|
||||||
*/
|
*/
|
||||||
public class OpenExchangeRatesOrgProvider implements ExchangeRateProvider {
|
public class OpenExchangeRatesOrgProvider implements ExchangeRateProvider {
|
||||||
public static Logger log = LoggerFactory.getLogger(OpenExchangeRatesOrgProvider.class);
|
public static Logger log = LoggerFactory.getLogger(OpenExchangeRatesOrgProvider.class);
|
||||||
protected static final String PARAM_RATES_FILE_LOCATION = "ratesFileLocation";
|
protected static final String PARAM_RATES_FILE_LOCATION = "ratesFileLocation";
|
||||||
protected static final String PARAM_REFRESH_INTERVAL = "refreshInterval";
|
protected static final String PARAM_REFRESH_INTERVAL = "refreshInterval";
|
||||||
protected static final String DEFAULT_RATES_FILE_LOCATION = "http://openexchangerates.org/latest.json";
|
|
||||||
protected static final String DEFAULT_REFRESH_INTERVAL = "1440";
|
protected static final String DEFAULT_REFRESH_INTERVAL = "1440";
|
||||||
|
|
||||||
protected String ratesFileLocation;
|
protected String ratesFileLocation;
|
||||||
|
@ -145,7 +155,10 @@ public class OpenExchangeRatesOrgProvider implements ExchangeRateProvider {
|
||||||
@Override
|
@Override
|
||||||
public void init(Map<String,String> params) throws SolrException {
|
public void init(Map<String,String> params) throws SolrException {
|
||||||
try {
|
try {
|
||||||
ratesFileLocation = getParam(params.get(PARAM_RATES_FILE_LOCATION), DEFAULT_RATES_FILE_LOCATION);
|
ratesFileLocation = params.get(PARAM_RATES_FILE_LOCATION);
|
||||||
|
if (null == ratesFileLocation) {
|
||||||
|
throw new SolrException(ErrorCode.SERVER_ERROR, "Init param must be specified: " + PARAM_RATES_FILE_LOCATION);
|
||||||
|
}
|
||||||
refreshInterval = Integer.parseInt(getParam(params.get(PARAM_REFRESH_INTERVAL), DEFAULT_REFRESH_INTERVAL));
|
refreshInterval = Integer.parseInt(getParam(params.get(PARAM_REFRESH_INTERVAL), DEFAULT_REFRESH_INTERVAL));
|
||||||
// Force a refresh interval of minimum one hour, since the API does not offer better resolution
|
// Force a refresh interval of minimum one hour, since the API does not offer better resolution
|
||||||
if (refreshInterval < 60) {
|
if (refreshInterval < 60) {
|
||||||
|
@ -153,8 +166,11 @@ public class OpenExchangeRatesOrgProvider implements ExchangeRateProvider {
|
||||||
log.warn("Specified refreshInterval was too small. Setting to 60 minutes which is the update rate of openexchangerates.org");
|
log.warn("Specified refreshInterval was too small. Setting to 60 minutes which is the update rate of openexchangerates.org");
|
||||||
}
|
}
|
||||||
log.info("Initialized with rates="+ratesFileLocation+", refreshInterval="+refreshInterval+".");
|
log.info("Initialized with rates="+ratesFileLocation+", refreshInterval="+refreshInterval+".");
|
||||||
} catch (Exception e) {
|
} catch (SolrException e1) {
|
||||||
throw new SolrException(ErrorCode.BAD_REQUEST, "Error initializing", e);
|
throw e1;
|
||||||
|
} catch (Exception e2) {
|
||||||
|
throw new SolrException(ErrorCode.SERVER_ERROR, "Error initializing: " +
|
||||||
|
e2.getMessage(), e2);
|
||||||
} finally {
|
} finally {
|
||||||
// Removing config params custom to us
|
// Removing config params custom to us
|
||||||
params.remove(PARAM_RATES_FILE_LOCATION);
|
params.remove(PARAM_RATES_FILE_LOCATION);
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!--
|
||||||
|
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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<schema name="bad-schema-currency-ft-oer-norates" version="1.4">
|
||||||
|
<types>
|
||||||
|
<fieldType name="string" class="solr.StrField" multiValued="true"/>
|
||||||
|
<!-- BEGIN BAD STUFF: multiValued -->
|
||||||
|
<fieldType name="currency"
|
||||||
|
class="solr.CurrencyField"
|
||||||
|
providerClass="solr.OpenExchangeRatesOrgProvider"
|
||||||
|
multiValued="false" />
|
||||||
|
</types>
|
||||||
|
|
||||||
|
<fields>
|
||||||
|
<field name="id" type="string" indexed="true" stored="true" multiValued="false"/>
|
||||||
|
<field name="money" type="currency" indexed="true" stored="true" />
|
||||||
|
</fields>
|
||||||
|
|
||||||
|
<defaultSearchField>id</defaultSearchField>
|
||||||
|
<uniqueKey>id</uniqueKey>
|
||||||
|
|
||||||
|
</schema>
|
|
@ -73,6 +73,11 @@ public class BadIndexSchemaTest extends AbstractBadConfigTestBase {
|
||||||
"Fields can not be multiValued: *_c");
|
"Fields can not be multiValued: *_c");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testCurrencyOERNoRates() throws Exception {
|
||||||
|
doTest("bad-schema-currency-ft-oer-norates.xml",
|
||||||
|
"ratesFileLocation");
|
||||||
|
}
|
||||||
|
|
||||||
public void testPerFieldtypeSimButNoSchemaSimFactory() throws Exception {
|
public void testPerFieldtypeSimButNoSchemaSimFactory() throws Exception {
|
||||||
doTest("bad-schema-sim-global-vs-ft-mismatch.xml", "global similarity does not support it");
|
doTest("bad-schema-sim-global-vs-ft-mismatch.xml", "global similarity does not support it");
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,8 +32,7 @@ import java.util.Map;
|
||||||
public class OpenExchangeRatesOrgProviderTest extends SolrTestCaseJ4 {
|
public class OpenExchangeRatesOrgProviderTest extends SolrTestCaseJ4 {
|
||||||
OpenExchangeRatesOrgProvider oerp;
|
OpenExchangeRatesOrgProvider oerp;
|
||||||
ResourceLoader loader;
|
ResourceLoader loader;
|
||||||
private final Map<String,String> emptyParams = new HashMap<String,String>();
|
private final Map<String,String> mockParams = new HashMap<String,String>();
|
||||||
private Map<String,String> mockParams;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Before
|
@Before
|
||||||
|
@ -42,24 +41,27 @@ public class OpenExchangeRatesOrgProviderTest extends SolrTestCaseJ4 {
|
||||||
("USD", "EUR", "MXN", "GBP", "JPY");
|
("USD", "EUR", "MXN", "GBP", "JPY");
|
||||||
|
|
||||||
super.setUp();
|
super.setUp();
|
||||||
mockParams = new HashMap<String,String>();;
|
mockParams.put(OpenExchangeRatesOrgProvider.PARAM_RATES_FILE_LOCATION,
|
||||||
mockParams.put(OpenExchangeRatesOrgProvider.PARAM_RATES_FILE_LOCATION, "open-exchange-rates.json");
|
"open-exchange-rates.json");
|
||||||
oerp = new OpenExchangeRatesOrgProvider();
|
oerp = new OpenExchangeRatesOrgProvider();
|
||||||
loader = new SolrResourceLoader("solr/collection1");
|
loader = new SolrResourceLoader("solr/collection1");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testInit() throws Exception {
|
public void testInit() throws Exception {
|
||||||
oerp.init(emptyParams);
|
oerp.init(mockParams);
|
||||||
assertTrue("Wrong default url", oerp.ratesFileLocation.toString().equals("http://openexchangerates.org/latest.json"));
|
assertEquals("Wrong url",
|
||||||
assertTrue("Wrong default interval", oerp.refreshInterval == 1440);
|
"open-exchange-rates.json", oerp.ratesFileLocation);
|
||||||
|
assertEquals("Wrong default interval", 1440, oerp.refreshInterval);
|
||||||
|
|
||||||
Map<String,String> params = new HashMap<String,String>();
|
Map<String,String> params = new HashMap<String,String>();
|
||||||
params.put(OpenExchangeRatesOrgProvider.PARAM_RATES_FILE_LOCATION, "http://foo.bar/baz");
|
params.put(OpenExchangeRatesOrgProvider.PARAM_RATES_FILE_LOCATION,
|
||||||
|
"http://foo.bar/baz");
|
||||||
params.put(OpenExchangeRatesOrgProvider.PARAM_REFRESH_INTERVAL, "100");
|
params.put(OpenExchangeRatesOrgProvider.PARAM_REFRESH_INTERVAL, "100");
|
||||||
oerp.init(params);
|
oerp.init(params);
|
||||||
assertTrue("Wrong param set url", oerp.ratesFileLocation.equals("http://foo.bar/baz"));
|
assertEquals("Wrong param set url",
|
||||||
assertTrue("Wrong param interval", oerp.refreshInterval == 100);
|
"http://foo.bar/baz", oerp.ratesFileLocation);
|
||||||
|
assertEquals("Wrong param interval", 100, oerp.refreshInterval);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
Loading…
Reference in New Issue