Skip to content

Commit 5d33838

Browse files
committed
JAVAMONEY-80/81: Fixed priority mechanism. Added section in RI user guide. Ensured default entries added by clients will overriden entries from RI (defaults).
1 parent 3baaf02 commit 5d33838

File tree

5 files changed

+105
-32
lines changed

5 files changed

+105
-32
lines changed

src/main/asciidoc/userguide.adoc

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -894,3 +894,18 @@ public final class GeeCoinFormatProviderSpi implements MonetaryAmountFormatProvi
894894
895895
}
896896
--------------------------------------------
897+
898+
899+
=== Overriding values in javamoney.properties
900+
901+
The reference application supports overriding of the values in +javamoney.properties+ by prefexing the keys with
902+
a priority value in brackets. Hereby the mechanism reads all +javamoney.properties+ resources visible on the
903+
classpath. If no priority is annotated, priority=0 is assumed:
904+
905+
[source,listing]
906+
.Overriding a Configuration Value using a Priority
907+
--------------------------------------------
908+
{100}myKey=myValue
909+
--------------------------------------------
910+
911+
If two entries have the same value an exeption is thrown.

src/main/java/org/javamoney/moneta/spi/MonetaryConfig.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -66,21 +66,25 @@ private void updateConfig(Properties props) {
6666
for (Map.Entry<Object, Object> en : props.entrySet()) {
6767
String key = en.getKey().toString();
6868
String value = en.getValue().toString();
69-
Integer existingPrio = priorities.get(key);
7069
int prio = 0;
71-
if (value.startsWith("{prio=")) {
72-
int index = value.indexOf('}');
70+
if (key.startsWith("{")) {
71+
int index = key.indexOf('}');
7372
if (index > 0) {
74-
String prioString = value.substring("{prio=".length(),
75-
index);
76-
value = value.substring(index + 1);
77-
prio = Integer.parseInt(prioString);
78-
priorities.put(key, prio);
73+
String prioString = key.substring(1, index);
74+
try {
75+
prio = Integer.parseInt(prioString);
76+
key = key.substring(index + 1);
77+
} catch (NumberFormatException e) {
78+
LOG.warning("Invalid config key in javamoney.properties: " + key);
79+
}
7980
}
8081
}
82+
Integer existingPrio = priorities.get(key);
8183
if (Objects.isNull(existingPrio)) {
84+
priorities.put(key, prio);
8285
config.put(key, value);
8386
} else if (existingPrio < prio) {
87+
priorities.put(key, prio);
8488
config.put(key, value);
8589
} else if (existingPrio == prio) {
8690
throw new IllegalStateException(
Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,44 @@
11
# Default MathContext for Money
22
#-------------------------------
33
# Custom MathContext, overrides entries from
4-
org.javamoney.moneta.Money.defaults.precision=256
4+
{-1}org.javamoney.moneta.Money.defaults.precision=256
55
# RoundingMode enum values
6-
org.javamoney.moneta.Money.defaults.roundingMode=HALF_EVEN
6+
{-1}org.javamoney.moneta.Money.defaults.roundingMode=HALF_EVEN
77
# or, use one of DECIMAL32,DECIMAL64(default),DECIMAL128,UNLIMITED
88
# org.javamoney.moneta.Money.mathContext=DECIMAL128
99

1010
# ResourceLoader-Configuration (optional)
1111
# ECB Rates
12-
load.ECBCurrentRateProvider.type=SCHEDULED
13-
load.ECBCurrentRateProvider.period=03:00
14-
load.ECBCurrentRateProvider.resource=/java-money/defaults/ECB/eurofxref-daily.xml
15-
load.ECBCurrentRateProvider.urls=http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml
12+
{-1}load.ECBCurrentRateProvider.type=SCHEDULED
13+
{-1}load.ECBCurrentRateProvider.period=03:00
14+
{-1}load.ECBCurrentRateProvider.resource=/java-money/defaults/ECB/eurofxref-daily.xml
15+
{-1}load.ECBCurrentRateProvider.urls=http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml
1616

17-
load.ECBHistoric90RateProvider.type=SCHEDULED
18-
load.ECBHistoric90RateProvider.period=03:00
19-
#load.ECBHistoric90RateProvider.at=12:00
20-
load.ECBHistoric90RateProvider.resource=/java-money/defaults/ECB/eurofxref-hist-90d.xml
21-
load.ECBHistoric90RateProvider.urls=http://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist-90d.xml
17+
{-1}load.ECBHistoric90RateProvider.type=SCHEDULED
18+
{-1}load.ECBHistoric90RateProvider.period=03:00
19+
#{-1}load.ECBHistoric90RateProvider.at=12:00
20+
{-1}load.ECBHistoric90RateProvider.resource=/java-money/defaults/ECB/eurofxref-hist-90d.xml
21+
{-1}load.ECBHistoric90RateProvider.urls=http://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist-90d.xml
2222

23-
load.ECBHistoricRateProvider.type=SCHEDULED
24-
load.ECBHistoricRateProvider.period=24:00
25-
load.ECBHistoricRateProvider.delay=01:00
26-
load.ECBHistoricRateProvider.at=07:00
27-
load.ECBHistoricRateProvider.resource=/java-money/defaults/ECB/eurofxref-hist.xml
28-
load.ECBHistoricRateProvider.urls=http://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist.xml
23+
{-1}load.ECBHistoricRateProvider.type=SCHEDULED
24+
{-1}load.ECBHistoricRateProvider.period=24:00
25+
{-1}load.ECBHistoricRateProvider.delay=01:00
26+
{-1}load.ECBHistoricRateProvider.at=07:00
27+
{-1}load.ECBHistoricRateProvider.resource=/java-money/defaults/ECB/eurofxref-hist.xml
28+
{-1}load.ECBHistoricRateProvider.urls=http://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist.xml
2929

3030
# IMF Rates
31-
load.IMFRateProvider.type=SCHEDULED
32-
load.IMFRateProvider.period=06:00
33-
#load.IMFRateProvider.delay=12:00
34-
#load.IMFRateProvider.at=12:00
35-
load.IMFRateProvider.resource=/java-money/defaults/IMF/rms_five.xls
36-
load.IMFRateProvider.urls=http://www.imf.org/external/np/fin/data/rms_five.aspx?tsvflag=Y
31+
{-1}load.IMFRateProvider.type=SCHEDULED
32+
{-1}load.IMFRateProvider.period=06:00
33+
#{-1}load.IMFRateProvider.delay=12:00
34+
#{-1}load.IMFRateProvider.at=12:00
35+
{-1}load.IMFRateProvider.resource=/java-money/defaults/IMF/rms_five.xls
36+
{-1}load.IMFRateProvider.urls=http://www.imf.org/external/np/fin/data/rms_five.aspx?tsvflag=Y
3737

3838
#Currency Conversion
39-
conversion.default-chain=IDENT,ECB,IMF,ECB-HIST
39+
{-1}conversion.default-chain=IDENT,ECB,IMF,ECB-HIST
40+
41+
#Values to Test Override Mechanism
42+
{1}theWinner1=theWinner1
43+
theWinner2=theLooser1
44+
{-1}theWinner3=theLooser1
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/**
2+
* Copyright (c) 2015, Credit Suisse (Anatole Tresch), Werner Keil and others by the @author tag.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
5+
* use this file except in compliance with the License. You may obtain a copy of
6+
* the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12+
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13+
* License for the specific language governing permissions and limitations under
14+
* the License.
15+
*/
16+
package org.javamoney.moneta.spi;
17+
18+
import org.testng.annotations.Test;
19+
20+
import static org.testng.Assert.*;
21+
22+
/**
23+
* Test for the {@link org.javamoney.moneta.spi.MonetaryConfig} class.
24+
*/
25+
public class MonetaryConfigTest {
26+
27+
@Test
28+
public void testGetConfig() throws Exception {
29+
assertNotNull(MonetaryConfig.getConfig());
30+
assertFalse(MonetaryConfig.getConfig().isEmpty());
31+
}
32+
33+
@Test
34+
public void testConfigOverride() throws Exception {
35+
assertEquals(MonetaryConfig.getConfig().get("theWinner1"), "theWinner1");
36+
assertEquals(MonetaryConfig.getConfig().get("theWinner2"), "theWinner2");
37+
assertEquals(MonetaryConfig.getConfig().get("theWinner3"), "theWinner2");
38+
}
39+
40+
@Test
41+
public void testConfigNormal() throws Exception {
42+
assertEquals(MonetaryConfig.getConfig().get("myTestValue"), "myTestValue");
43+
}
44+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#Values to Test Override Mechanism
2+
theWinner1=theLooser2
3+
{1}theWinner2=theWinner2
4+
theWinner3=theWinner2
5+
myTestValue=myTestValue

0 commit comments

Comments
 (0)