Skip to content

Commit 09bb65a

Browse files
eelhazatipauljervis
authored andcommitted
BAEL-1570 (eugenp#3762)
* Create pom.xml * Update pom.xml * Create pom.xml * Update pom.xml * add impl * add app
1 parent 3722310 commit 09bb65a

16 files changed

Lines changed: 357 additions & 0 deletions

File tree

java-spi/exchange-rate-api/pom.xml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3+
<modelVersion>4.0.0</modelVersion>
4+
5+
<artifactId>exchange-rate-api</artifactId>
6+
<packaging>jar</packaging>
7+
8+
<parent>
9+
<groupId>com.baeldung</groupId>
10+
<artifactId>java-spi</artifactId>
11+
<version>1.0.0-SNAPSHOT</version>
12+
</parent>
13+
14+
</project>
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.baeldung.rate;
2+
3+
import com.baeldung.rate.exception.ProviderNotFoundException;
4+
import com.baeldung.rate.spi.ExchangeRateProvider;
5+
6+
import java.util.ArrayList;
7+
import java.util.Iterator;
8+
import java.util.List;
9+
import java.util.ServiceLoader;
10+
11+
public final class ExchangeRate {
12+
13+
private static final String DEFAULT_PROVIDER = "com.baeldung.rate.spi.YahooFinanceExchangeRateProvider";
14+
15+
//All providers
16+
public static List<ExchangeRateProvider> providers() {
17+
List<ExchangeRateProvider> services = new ArrayList<>();
18+
ServiceLoader<ExchangeRateProvider> loader = ServiceLoader.load(ExchangeRateProvider.class);
19+
loader.forEach(exchangeRateProvider -> {
20+
services.add(exchangeRateProvider);
21+
});
22+
return services;
23+
}
24+
25+
//Default provider
26+
public static ExchangeRateProvider provider() {
27+
return provider(DEFAULT_PROVIDER);
28+
}
29+
30+
//provider by name
31+
public static ExchangeRateProvider provider(String providerName) {
32+
ServiceLoader<ExchangeRateProvider> loader = ServiceLoader.load(ExchangeRateProvider.class);
33+
Iterator<ExchangeRateProvider> it = loader.iterator();
34+
while (it.hasNext()) {
35+
ExchangeRateProvider provider = it.next();
36+
if (providerName.equals(provider.getClass().getName())) {
37+
return provider;
38+
}
39+
}
40+
throw new ProviderNotFoundException("Exchange Rate provider " + providerName + " not found");
41+
}
42+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.baeldung.rate.api;
2+
3+
import java.math.BigDecimal;
4+
import java.time.LocalDate;
5+
6+
public class Quote {
7+
private String currency;
8+
private BigDecimal ask;
9+
private BigDecimal bid;
10+
private LocalDate date;
11+
//...
12+
13+
public String getCurrency() {
14+
return currency;
15+
}
16+
17+
public void setCurrency(String currency) {
18+
this.currency = currency;
19+
}
20+
21+
public BigDecimal getAsk() {
22+
return ask;
23+
}
24+
25+
public void setAsk(BigDecimal ask) {
26+
this.ask = ask;
27+
}
28+
29+
public BigDecimal getBid() {
30+
return bid;
31+
}
32+
33+
public void setBid(BigDecimal bid) {
34+
this.bid = bid;
35+
}
36+
37+
public LocalDate getDate() {
38+
return date;
39+
}
40+
41+
public void setDate(LocalDate date) {
42+
this.date = date;
43+
}
44+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.baeldung.rate.api;
2+
3+
import java.time.LocalDate;
4+
import java.util.List;
5+
6+
public interface QuoteManager {
7+
List<Quote> getQuotes(String baseCurrency, LocalDate date);
8+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.baeldung.rate.exception;
2+
3+
public class ProviderNotFoundException extends RuntimeException {
4+
5+
public ProviderNotFoundException() {
6+
super();
7+
}
8+
9+
public ProviderNotFoundException(String message) {
10+
super(message);
11+
}
12+
13+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.baeldung.rate.spi;
2+
3+
import com.baeldung.rate.api.QuoteManager;
4+
5+
public interface ExchangeRateProvider {
6+
QuoteManager create();
7+
}

java-spi/exchange-rate-app/pom.xml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3+
<modelVersion>4.0.0</modelVersion>
4+
5+
<artifactId>exchange-rate-app</artifactId>
6+
<packaging>jar</packaging>
7+
8+
<parent>
9+
<groupId>com.baeldung</groupId>
10+
<artifactId>java-spi</artifactId>
11+
<version>1.0.0-SNAPSHOT</version>
12+
</parent>
13+
14+
<dependencies>
15+
<dependency>
16+
<groupId>com.baeldung</groupId>
17+
<artifactId>exchange-rate-api</artifactId>
18+
<version>1.0.0-SNAPSHOT</version>
19+
</dependency>
20+
<dependency>
21+
<groupId>com.baeldung</groupId>
22+
<artifactId>exchange-rate-impl</artifactId>
23+
<version>1.0.0-SNAPSHOT</version>
24+
</dependency>
25+
</dependencies>
26+
27+
</project>
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.baeldung.rate.app;
2+
3+
import com.baeldung.rate.ExchangeRate;
4+
import com.baeldung.rate.api.Quote;
5+
6+
import java.time.LocalDate;
7+
import java.util.List;
8+
9+
public class MainApp {
10+
public static void main(String... args) {
11+
ExchangeRate.providers().forEach(provider -> {
12+
System.out.println("Retreiving USD quotes from provider :" + provider);
13+
List<Quote> quotes = provider.create().getQuotes("USD", LocalDate.now());
14+
System.out.println(String.format("%14s%12s|%12s", "","Ask", "Bid"));
15+
System.out.println("----------------------------------------");
16+
quotes.forEach(quote -> {
17+
System.out.println("USD --> " + quote.getCurrency() + " : " + String.format("%12f|%12f", quote.getAsk(), quote.getBid()));
18+
});
19+
});
20+
}
21+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3+
<modelVersion>4.0.0</modelVersion>
4+
5+
<artifactId>exchange-rate-impl</artifactId>
6+
<packaging>jar</packaging>
7+
8+
<parent>
9+
<groupId>com.baeldung</groupId>
10+
<artifactId>java-spi</artifactId>
11+
<version>1.0.0-SNAPSHOT</version>
12+
</parent>
13+
14+
<dependencies>
15+
<dependency>
16+
<groupId>com.baeldung</groupId>
17+
<artifactId>exchange-rate-api</artifactId>
18+
<version>1.0.0-SNAPSHOT</version>
19+
</dependency>
20+
<dependency>
21+
<groupId>com.squareup.okhttp3</groupId>
22+
<artifactId>okhttp</artifactId>
23+
<version>3.10.0</version>
24+
</dependency>
25+
<dependency>
26+
<groupId>javax.json.bind</groupId>
27+
<artifactId>javax.json.bind-api</artifactId>
28+
<version>1.0</version>
29+
</dependency>
30+
<dependency>
31+
<groupId>org.eclipse</groupId>
32+
<artifactId>yasson</artifactId>
33+
<version>1.0.1</version>
34+
</dependency>
35+
<dependency>
36+
<groupId>org.glassfish</groupId>
37+
<artifactId>javax.json</artifactId>
38+
<version>1.1.2</version>
39+
</dependency>
40+
</dependencies>
41+
42+
</project>
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.baeldung.rate.impl;
2+
3+
import com.baeldung.rate.api.Quote;
4+
5+
import java.util.List;
6+
7+
public class QuoteResponse {
8+
private List<Quote> result;
9+
private String error;
10+
11+
public List<Quote> getResult() {
12+
return result;
13+
}
14+
15+
public void setResult(List<Quote> result) {
16+
this.result = result;
17+
}
18+
19+
public String getError() {
20+
return error;
21+
}
22+
23+
public void setError(String error) {
24+
this.error = error;
25+
}
26+
}

0 commit comments

Comments
 (0)