diff --git a/core-java/service-provider-interface/standard-library/pom.xml b/core-java/service-provider-interface/classics-library/pom.xml
similarity index 92%
rename from core-java/service-provider-interface/standard-library/pom.xml
rename to core-java/service-provider-interface/classics-library/pom.xml
index 143b32a..55fcd31 100644
--- a/core-java/service-provider-interface/standard-library/pom.xml
+++ b/core-java/service-provider-interface/classics-library/pom.xml
@@ -9,9 +9,9 @@
4.0.0
- standard-library
+ classics-library
- standard-library
+ classics-library
UTF-8
diff --git a/core-java/service-provider-interface/standard-library/src/main/java/org/library/StandardLibrary.java b/core-java/service-provider-interface/classics-library/src/main/java/org/library/ClassicsLibrary.java
similarity index 66%
rename from core-java/service-provider-interface/standard-library/src/main/java/org/library/StandardLibrary.java
rename to core-java/service-provider-interface/classics-library/src/main/java/org/library/ClassicsLibrary.java
index 5d2b0e7..feb110e 100644
--- a/core-java/service-provider-interface/standard-library/src/main/java/org/library/StandardLibrary.java
+++ b/core-java/service-provider-interface/classics-library/src/main/java/org/library/ClassicsLibrary.java
@@ -6,20 +6,29 @@ import java.util.TreeMap;
import org.library.spi.Book;
import org.library.spi.Library;
-public class StandardLibrary implements Library {
+public class ClassicsLibrary implements Library {
+ public static final String CLASSICS_LIBRARY = "CLASSICS";
private final Map books;
- public StandardLibrary() {
+ public ClassicsLibrary() {
books = new TreeMap<>();
Book nineteenEightyFour = new Book("Nineteen Eighty-Four", "George Orwell",
"It was a bright cold day in April, and the clocks were striking thirteen.");
Book theLordOfTheRings = new Book("The Lord of the Rings", "J. R. R. Tolkien",
"When Mr. Bilbo Baggins of Bag End announced that he would shortly be celebrating his " +
"eleventy-first birthday with a party of special magnificence, there was much talk and excitement in Hobbiton.");
+ Book cleanCode = new Book("Clean Code", "Robert C. Martin",
+ "ClassicsEven bad code can function. But if code isn’t clean, it can bring a development organization to its knees");
books.put("Nineteen Eighty-Four", nineteenEightyFour);
books.put("The Lord of the Rings", theLordOfTheRings);
+ books.put("Clean Code", cleanCode);
+ }
+
+ @Override
+ public String getCategory() {
+ return CLASSICS_LIBRARY;
}
@Override
diff --git a/core-java/service-provider-interface/classics-library/src/main/resources/META-INF/services/org.library.spi.Library b/core-java/service-provider-interface/classics-library/src/main/resources/META-INF/services/org.library.spi.Library
new file mode 100644
index 0000000..08823fa
--- /dev/null
+++ b/core-java/service-provider-interface/classics-library/src/main/resources/META-INF/services/org.library.spi.Library
@@ -0,0 +1 @@
+org.library.ClassicsLibrary
diff --git a/core-java/service-provider-interface/custom-library/pom.xml b/core-java/service-provider-interface/computer-science-library/pom.xml
similarity index 89%
rename from core-java/service-provider-interface/custom-library/pom.xml
rename to core-java/service-provider-interface/computer-science-library/pom.xml
index aa007bf..14808e2 100644
--- a/core-java/service-provider-interface/custom-library/pom.xml
+++ b/core-java/service-provider-interface/computer-science-library/pom.xml
@@ -5,10 +5,10 @@
4.0.0
org.library
- custom-library
+ computer-science-library
1.0-SNAPSHOT
- custom-library
+ computer-science-library
UTF-8
diff --git a/core-java/service-provider-interface/custom-library/src/main/java/org/library/CustomLibrary.java b/core-java/service-provider-interface/computer-science-library/src/main/java/org/library/ComputerScienceLibrary.java
similarity index 76%
rename from core-java/service-provider-interface/custom-library/src/main/java/org/library/CustomLibrary.java
rename to core-java/service-provider-interface/computer-science-library/src/main/java/org/library/ComputerScienceLibrary.java
index cc9bd4b..dcf8b63 100644
--- a/core-java/service-provider-interface/custom-library/src/main/java/org/library/CustomLibrary.java
+++ b/core-java/service-provider-interface/computer-science-library/src/main/java/org/library/ComputerScienceLibrary.java
@@ -6,11 +6,13 @@ import java.util.TreeMap;
import org.library.spi.Book;
import org.library.spi.Library;
-public class CustomLibrary implements Library {
+public class ComputerScienceLibrary implements Library {
+
+ public static final String COMPUTER_SCIENCE_LIBRARY = "COMPUTER_SCIENCE";
private final Map books;
- public CustomLibrary() {
+ public ComputerScienceLibrary() {
books = new TreeMap<>();
Book cleanCode = new Book("Clean Code", "Robert C. Martin",
@@ -22,6 +24,11 @@ public class CustomLibrary implements Library {
books.put(pragmaticProgrammer.getName(), pragmaticProgrammer);
}
+ @Override
+ public String getCategory() {
+ return COMPUTER_SCIENCE_LIBRARY;
+ }
+
@Override
public Book getBook(String name) {
return books.get(name);
diff --git a/core-java/service-provider-interface/computer-science-library/src/main/resources/META-INF/services/org.library.spi.Library b/core-java/service-provider-interface/computer-science-library/src/main/resources/META-INF/services/org.library.spi.Library
new file mode 100644
index 0000000..e24f5e5
--- /dev/null
+++ b/core-java/service-provider-interface/computer-science-library/src/main/resources/META-INF/services/org.library.spi.Library
@@ -0,0 +1 @@
+org.library.ComputerScienceLibrary
diff --git a/core-java/service-provider-interface/custom-library/src/main/resources/META-INF/services/org.library.spi.Library b/core-java/service-provider-interface/custom-library/src/main/resources/META-INF/services/org.library.spi.Library
deleted file mode 100644
index 37ee10f..0000000
--- a/core-java/service-provider-interface/custom-library/src/main/resources/META-INF/services/org.library.spi.Library
+++ /dev/null
@@ -1 +0,0 @@
-org.library.CustomLibrary
diff --git a/core-java/service-provider-interface/library-demo/pom.xml b/core-java/service-provider-interface/library-client/pom.xml
similarity index 50%
rename from core-java/service-provider-interface/library-demo/pom.xml
rename to core-java/service-provider-interface/library-client/pom.xml
index 8f100d6..2b18cc4 100644
--- a/core-java/service-provider-interface/library-demo/pom.xml
+++ b/core-java/service-provider-interface/library-client/pom.xml
@@ -9,28 +9,47 @@
4.0.0
- library-demo
+ library-client
- library-demo
+ library-client
UTF-8
- 1.8
- 1.8
+ 11
+ 11
+
org.library
- standard-library
+ computer-science-library
1.0-SNAPSHOT
org.library
- custom-library
+ classics-library
+ 1.0-SNAPSHOT
+
+
+ org.library
+ library-service-provider
1.0-SNAPSHOT
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 11
+ 11
+
+
+
+
+
diff --git a/core-java/service-provider-interface/library-client/src/main/java/org/library/LibraryClient.java b/core-java/service-provider-interface/library-client/src/main/java/org/library/LibraryClient.java
new file mode 100644
index 0000000..8e009c3
--- /dev/null
+++ b/core-java/service-provider-interface/library-client/src/main/java/org/library/LibraryClient.java
@@ -0,0 +1,22 @@
+package org.library;
+
+public class LibraryClient {
+ public static void main(String[] args) {
+ LibraryService libraryService = LibraryService.getInstance();
+ requestBook("Clean Code", libraryService);
+ requestBook("The Lord of the Rings", libraryService);
+ requestBook("The Lord of the Rings", "COMPUTER_SCIENCE", libraryService);
+ }
+
+ private static void requestBook(String bookName, LibraryService library) {
+ library.getBook(bookName)
+ .ifPresentOrElse(book -> System.out.println("The book '" + bookName + "' was found, here are the details:" + book),
+ () -> System.out.println("The library doesn't have the book '" + bookName + "' that you need."));
+ }
+
+ private static void requestBook(String bookName,String category, LibraryService library) {
+ library.getBook(bookName, category)
+ .ifPresentOrElse(book -> System.out.println("The book '" + bookName + "' was found in " + category + ", here are the details:" + book),
+ () -> System.out.println("The library " + category + " doesn't have the book '" + bookName + "' that you need."));
+ }
+}
diff --git a/core-java/service-provider-interface/library-demo/src/main/java/org/library/LibraryDemo.java b/core-java/service-provider-interface/library-demo/src/main/java/org/library/LibraryDemo.java
deleted file mode 100644
index 9f131cb..0000000
--- a/core-java/service-provider-interface/library-demo/src/main/java/org/library/LibraryDemo.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.library;
-
-import org.library.spi.Book;
-
-public class LibraryDemo {
- public static void main(String[] args) {
- LibraryService libraryService = LibraryService.getInstance();
- manageBookRequest("Clean Code", libraryService);
- manageBookRequest("The Lord of the Rings", libraryService);
- }
-
- private static void manageBookRequest(String bookName, LibraryService library) {
- Book book = library.getBook(bookName);
- if (book == null) {
- System.out.println("The library doesn't have the book '" + bookName + "' that you need.");
- } else {
- System.out.println("The book '" + bookName + "'was found, here are the details:" + book);
- }
- }
-}
diff --git a/core-java/service-provider-interface/library-service-provider/pom.xml b/core-java/service-provider-interface/library-service-provider/pom.xml
index 228f73c..e021cdb 100644
--- a/core-java/service-provider-interface/library-service-provider/pom.xml
+++ b/core-java/service-provider-interface/library-service-provider/pom.xml
@@ -16,5 +16,15 @@
1.8
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 9
+ 9
+
+
+
diff --git a/core-java/service-provider-interface/library-service-provider/src/main/java/org/library/LibraryService.java b/core-java/service-provider-interface/library-service-provider/src/main/java/org/library/LibraryService.java
index eb1cd91..465ac26 100644
--- a/core-java/service-provider-interface/library-service-provider/src/main/java/org/library/LibraryService.java
+++ b/core-java/service-provider-interface/library-service-provider/src/main/java/org/library/LibraryService.java
@@ -1,6 +1,8 @@
package org.library;
import java.util.Iterator;
+import java.util.Objects;
+import java.util.Optional;
import java.util.ServiceLoader;
import org.library.spi.Book;
@@ -22,13 +24,26 @@ public class LibraryService {
return libraryService;
}
- public Book getBook(String name) {
+ public void refresh() {
+ loader.reload();
+ }
+
+ public Optional getBook(String name) {
Book book = null;
Iterator libraries = loader.iterator();
while (book == null && libraries.hasNext()) {
Library library = libraries.next();
book = library.getBook(name);
}
- return book;
+ return Optional.ofNullable(book);
+ }
+
+ public Optional getBook(String name, String category) {
+ return loader.stream()
+ .map(ServiceLoader.Provider::get)
+ .filter(library -> library.getCategory().equals(category))
+ .map(library -> library.getBook(name))
+ .filter(Objects::nonNull)
+ .findFirst();
}
}
diff --git a/core-java/service-provider-interface/library-service-provider/src/main/java/org/library/spi/Library.java b/core-java/service-provider-interface/library-service-provider/src/main/java/org/library/spi/Library.java
index 9bea86d..a3068ec 100644
--- a/core-java/service-provider-interface/library-service-provider/src/main/java/org/library/spi/Library.java
+++ b/core-java/service-provider-interface/library-service-provider/src/main/java/org/library/spi/Library.java
@@ -1,5 +1,6 @@
package org.library.spi;
public interface Library {
+ String getCategory();
Book getBook(String name);
}
diff --git a/core-java/service-provider-interface/pom.xml b/core-java/service-provider-interface/pom.xml
index 8b85719..25c7ae3 100644
--- a/core-java/service-provider-interface/pom.xml
+++ b/core-java/service-provider-interface/pom.xml
@@ -9,10 +9,10 @@
pom
1.0-SNAPSHOT
- library-demo
+ library-client
library-service-provider
- standard-library
- custom-library
+ classics-library
+ computer-science-library
Library Service Provider Example
diff --git a/core-java/service-provider-interface/standard-library/src/main/resources/META-INF/services/org.library.spi.Library b/core-java/service-provider-interface/standard-library/src/main/resources/META-INF/services/org.library.spi.Library
deleted file mode 100644
index 587f111..0000000
--- a/core-java/service-provider-interface/standard-library/src/main/resources/META-INF/services/org.library.spi.Library
+++ /dev/null
@@ -1 +0,0 @@
-org.library.StandardLibrary