1717import javax .money .spi .MonetaryCurrenciesSingletonSpi ;
1818import java .util .ArrayList ;
1919import java .util .Collection ;
20- import java .util .Collections ;
2120import java .util .HashSet ;
2221import java .util .List ;
2322import java .util .Locale ;
@@ -40,7 +39,8 @@ final class DefaultMonetaryCurrenciesSingletonSpi implements MonetaryCurrenciesS
4039 @ Override
4140 public Set <CurrencyUnit > getCurrencies (CurrencyQuery query ) {
4241 Set <CurrencyUnit > result = new HashSet <CurrencyUnit >();
43- for (CurrencyProviderSpi spi : Bootstrap .getServices (CurrencyProviderSpi .class )) {
42+ List <CurrencyProviderSpi > providers = collectProviders (query );
43+ for (CurrencyProviderSpi spi : providers ) {
4444 try {
4545 result .addAll (spi .getCurrencies (query ));
4646 } catch (Exception e ) {
@@ -52,17 +52,54 @@ public Set<CurrencyUnit> getCurrencies(CurrencyQuery query) {
5252 return result ;
5353 }
5454
55+ private List <CurrencyProviderSpi > collectProviders (CurrencyQuery query ) {
56+ List <CurrencyProviderSpi > result = new ArrayList <CurrencyProviderSpi >();
57+ if (!query .getProviderNames ().isEmpty ()) {
58+ for (String providerName : query .getProviderNames ()) {
59+ CurrencyProviderSpi provider = getProvider (providerName );
60+ if (provider == null ) {
61+ Logger .getLogger (DefaultMonetaryCurrenciesSingletonSpi .class .getName ()).warning ("No such currenvcy " +
62+ "provider found, ignoring: " + providerName );
63+ } else {
64+ result .add (provider );
65+ }
66+ }
67+ }
68+ else {
69+ for (String providerName :getDefaultProviderChain ()){
70+ CurrencyProviderSpi provider = getProvider (providerName );
71+ if (provider == null ) {
72+ Logger .getLogger (DefaultMonetaryCurrenciesSingletonSpi .class .getName ()).warning ("No such currenvcy " +
73+ "provider found, ignoring: " + providerName );
74+ } else {
75+ result .add (provider );
76+ }
77+ }
78+ }
79+ return result ;
80+ }
81+
82+ private CurrencyProviderSpi getProvider (String providerName ) {
83+ for (CurrencyProviderSpi provider :Bootstrap .getServices (CurrencyProviderSpi .class )){
84+ if (provider .getProviderName ().equals (providerName )){
85+ return provider ;
86+ }
87+ }
88+ return null ;
89+ }
90+
5591 /**
5692 * This default implementation simply returns all providers defined in arbitrary order.
5793 *
5894 * @return the default provider chain, never null.
5995 */
6096 @ Override
6197 public List <String > getDefaultProviderChain () {
62- List <String > list = new ArrayList <String >();
63- list .addAll (getProviderNames ());
64- Collections .sort (list );
65- return list ;
98+ List <String > provList = new ArrayList <String >();
99+ for (CurrencyProviderSpi currencyProviderSpi :Bootstrap .getServices (CurrencyProviderSpi .class )){
100+ provList .add (currencyProviderSpi .getProviderName ());
101+ }
102+ return provList ;
66103 }
67104
68105 /**
0 commit comments