4747
4848/**
4949 * Base to all Europe Central Bank implementation.
50+ *
5051 * @author otaviojava
5152 */
5253abstract class AbstractECBCurrentRateProvider extends AbstractRateProvider implements
53- LoaderListener {
54+ LoaderListener {
5455
5556 static final String BASE_CURRENCY_CODE = "EUR" ;
5657
@@ -62,15 +63,15 @@ abstract class AbstractECBCurrentRateProvider extends AbstractRateProvider imple
6263 /**
6364 * Historic exchange rates, rate timestamp as UTC long.
6465 */
65- private final Map <Long , Map <String , ExchangeRate >> historicRates = new ConcurrentHashMap <>();
66+ private final Map <Long , Map <String , ExchangeRate >> historicRates = new ConcurrentHashMap <>();
6667 /**
6768 * Parser factory.
6869 */
6970 private SAXParserFactory saxParserFactory = SAXParserFactory .newInstance ();
7071
7172 private Long recentKey ;
7273
73- public AbstractECBCurrentRateProvider (ProviderContext context ) throws MalformedURLException {
74+ public AbstractECBCurrentRateProvider (ProviderContext context ) throws MalformedURLException {
7475 super (context );
7576 saxParserFactory .setNamespaceAware (false );
7677 saxParserFactory .setValidating (false );
@@ -82,14 +83,13 @@ public AbstractECBCurrentRateProvider(ProviderContext context) throws MalformedU
8283 public abstract String getDataId ();
8384
8485 @ Override
85- public void newDataLoaded (String data , InputStream is ){
86+ public void newDataLoaded (String data , InputStream is ) {
8687 final int oldSize = this .historicRates .size ();
87- try {
88+ try {
8889 SAXParser parser = saxParserFactory .newSAXParser ();
8990 parser .parse (is , new RateReadingHandler (historicRates , getProviderContext ()));
9091 recentKey = null ;
91- }
92- catch (Exception e ){
92+ } catch (Exception e ) {
9393 LOGGER .log (Level .FINEST , "Error during data load." , e );
9494 }
9595 int newSize = this .historicRates .size ();
@@ -98,98 +98,98 @@ public void newDataLoaded(String data, InputStream is){
9898
9999
100100 @ Override
101- public ExchangeRate getExchangeRate (ConversionQuery query ){
102- Objects .requireNonNull (query );
103- if (historicRates .isEmpty ()){
101+ public ExchangeRate getExchangeRate (ConversionQuery query ) {
102+ Objects .requireNonNull (query );
103+ if (historicRates .isEmpty ()) {
104104 return null ;
105105 }
106106
107- Long timeStampMillis = getMillisSeconds (query );
107+ Long timeStampMillis = getMillisSeconds (query );
108108 ExchangeRateBuilder builder = getBuilder (query , timeStampMillis );
109109
110110
111- Map <String , ExchangeRate > targets = this .historicRates
112- .get (timeStampMillis );
113- if (Objects .isNull (targets )){
111+ Map <String , ExchangeRate > targets = this .historicRates
112+ .get (timeStampMillis );
113+ if (Objects .isNull (targets )) {
114114 return null ;
115115 }
116- ExchangeRate sourceRate = targets .get (query .getBaseCurrency ()
117- .getCurrencyCode ());
118- ExchangeRate target = targets
119- .get (query .getCurrency ().getCurrencyCode ());
116+ ExchangeRate sourceRate = targets .get (query .getBaseCurrency ()
117+ .getCurrencyCode ());
118+ ExchangeRate target = targets
119+ .get (query .getCurrency ().getCurrencyCode ());
120120 return createExchangeRate (query , builder , sourceRate , target );
121121 }
122122
123- private ExchangeRate createExchangeRate (ConversionQuery query ,
124- ExchangeRateBuilder builder , ExchangeRate sourceRate ,
125- ExchangeRate target ) {
123+ private ExchangeRate createExchangeRate (ConversionQuery query ,
124+ ExchangeRateBuilder builder , ExchangeRate sourceRate ,
125+ ExchangeRate target ) {
126126
127- if (areBothBaseCurrencies (query )){
127+ if (areBothBaseCurrencies (query )) {
128128 builder .setFactor (DefaultNumberValue .ONE );
129129 return builder .build ();
130- } else if (BASE_CURRENCY_CODE .equals (query .getCurrency ().getCurrencyCode ())){
131- if (Objects .isNull (sourceRate )){
130+ } else if (BASE_CURRENCY_CODE .equals (query .getCurrency ().getCurrencyCode ())) {
131+ if (Objects .isNull (sourceRate )) {
132132 return null ;
133133 }
134134 return reverse (sourceRate );
135- } else if (BASE_CURRENCY_CODE .equals (query .getBaseCurrency ()
136- .getCurrencyCode ())) {
135+ } else if (BASE_CURRENCY_CODE .equals (query .getBaseCurrency ()
136+ .getCurrencyCode ())) {
137137 return target ;
138- } else {
138+ } else {
139139 // Get Conversion base as derived rate: base -> EUR -> term
140140 ExchangeRate rate1 = getExchangeRate (
141141 query .toBuilder ().setTermCurrency (MonetaryCurrencies .getCurrency (BASE_CURRENCY_CODE )).build ());
142142 ExchangeRate rate2 = getExchangeRate (
143143 query .toBuilder ().setBaseCurrency (MonetaryCurrencies .getCurrency (BASE_CURRENCY_CODE ))
144144 .setTermCurrency (query .getCurrency ()).build ());
145- if (Objects .nonNull (rate1 ) && Objects .nonNull (rate2 )){
145+ if (Objects .nonNull (rate1 ) && Objects .nonNull (rate2 )) {
146146 builder .setFactor (multiply (rate1 .getFactor (), rate2 .getFactor ()));
147147 builder .setRateChain (rate1 , rate2 );
148148 return builder .build ();
149149 }
150- throw new CurrencyConversionException (query .getBaseCurrency (),
151- query .getCurrency (), sourceRate .getConversionContext ());
150+ throw new CurrencyConversionException (query .getBaseCurrency (),
151+ query .getCurrency (), sourceRate .getConversionContext ());
152152 }
153- }
153+ }
154154
155- private boolean areBothBaseCurrencies (ConversionQuery query ) {
156- return BASE_CURRENCY_CODE .equals (query .getBaseCurrency ().getCurrencyCode ()) &&
155+ private boolean areBothBaseCurrencies (ConversionQuery query ) {
156+ return BASE_CURRENCY_CODE .equals (query .getBaseCurrency ().getCurrencyCode ()) &&
157157 BASE_CURRENCY_CODE .equals (query .getCurrency ().getCurrencyCode ());
158- }
159-
160- private Long getMillisSeconds (ConversionQuery query ) {
161- if (Objects .nonNull (query .getTimestamp ())) {
162- LocalDate timeStamp = query .getTimestamp ().toLocalDate ();
163-
164- Date date = Date .from (timeStamp .atStartOfDay ()
165- .atZone (ZoneId .systemDefault ()).toInstant ());
166- Long timeStampMillis = date .getTime ();
167- return timeStampMillis ;
168- } else {
169- return getRecentKey ();
170- }
171- }
172-
173- private Long getRecentKey () {
174- if (Objects .isNull (recentKey )) {
175- Comparator <Long > reversed = Comparator .<Long >naturalOrder ().reversed ();
176- recentKey = historicRates .keySet ().stream ().sorted (reversed ).findFirst ().get ();
177- }
178- return recentKey ;
179- }
180-
181- private ExchangeRateBuilder getBuilder (ConversionQuery query ,
182- Long timeStampMillis ) {
183- ExchangeRateBuilder builder = new ExchangeRateBuilder (
158+ }
159+
160+ private Long getMillisSeconds (ConversionQuery query ) {
161+ if (Objects .nonNull (query .getTimestamp ())) {
162+ LocalDate timeStamp = query .getTimestamp ().toLocalDate ();
163+
164+ Date date = Date .from (timeStamp .atStartOfDay ()
165+ .atZone (ZoneId .systemDefault ()).toInstant ());
166+ Long timeStampMillis = date .getTime ();
167+ return timeStampMillis ;
168+ } else {
169+ return getRecentKey ();
170+ }
171+ }
172+
173+ private Long getRecentKey () {
174+ if (Objects .isNull (recentKey )) {
175+ Comparator <Long > reversed = Comparator .<Long >naturalOrder ().reversed ();
176+ recentKey = historicRates .keySet ().stream ().sorted (reversed ).findFirst ().get ();
177+ }
178+ return recentKey ;
179+ }
180+
181+ private ExchangeRateBuilder getBuilder (ConversionQuery query ,
182+ Long timeStampMillis ) {
183+ ExchangeRateBuilder builder = new ExchangeRateBuilder (
184184 ConversionContextBuilder .create (getProviderContext (), RateType .HISTORIC )
185- .setTimestampMillis (timeStampMillis ).build ());
185+ .setTimestampMillis (timeStampMillis ).build ());
186186 builder .setBase (query .getBaseCurrency ());
187187 builder .setTerm (query .getCurrency ());
188- return builder ;
189- }
188+ return builder ;
189+ }
190190
191- private ExchangeRate reverse (ExchangeRate rate ){
192- if (Objects .isNull (rate )){
191+ private ExchangeRate reverse (ExchangeRate rate ) {
192+ if (Objects .isNull (rate )) {
193193 throw new IllegalArgumentException ("Rate null is not reversable." );
194194 }
195195 return new ExchangeRateBuilder (rate ).setRate (rate ).setBase (rate .getCurrency ()).setTerm (rate .getBaseCurrency ())
0 commit comments