Adds DI and SPI examples
This commit is contained in:
15
spi/pom.xml
Normal file
15
spi/pom.xml
Normal file
@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<groupId>fr.gasser</groupId>
|
||||
<artifactId>java-cookbook</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>spi</artifactId>
|
||||
|
||||
</project>
|
32
spi/src/main/java/ovh/gasser/spi/CommandProvider.java
Normal file
32
spi/src/main/java/ovh/gasser/spi/CommandProvider.java
Normal file
@ -0,0 +1,32 @@
|
||||
package ovh.gasser.spi;
|
||||
|
||||
import ovh.gasser.spi.commands.Command;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.ServiceLoader;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
public class CommandProvider {
|
||||
private static CommandProvider instance = new CommandProvider();
|
||||
|
||||
private final ServiceLoader<Command> loader;
|
||||
|
||||
private CommandProvider() {
|
||||
loader = ServiceLoader.load(Command.class);
|
||||
}
|
||||
|
||||
public static CommandProvider getInstance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
public Stream<Command> getCommands() {
|
||||
return loader.stream().map(ServiceLoader.Provider::get);
|
||||
}
|
||||
|
||||
public Optional<Command> getCommand(String commandId) {
|
||||
return loader.stream()
|
||||
.filter(commandProvider -> commandProvider.get().getId().equalsIgnoreCase(commandId))
|
||||
.findFirst()
|
||||
.map(ServiceLoader.Provider::get);
|
||||
}
|
||||
}
|
16
spi/src/main/java/ovh/gasser/spi/Main.java
Normal file
16
spi/src/main/java/ovh/gasser/spi/Main.java
Normal file
@ -0,0 +1,16 @@
|
||||
package ovh.gasser.spi;
|
||||
|
||||
public class Main {
|
||||
public static void main(String[] args) {
|
||||
CommandProvider commandProvider = CommandProvider.getInstance();
|
||||
// Execute all commands
|
||||
commandProvider.getCommands()
|
||||
.forEach(command -> System.out.println(command.execute("Hello")));
|
||||
|
||||
// Execute command with specific ID
|
||||
String result = commandProvider.getCommand("reverse")
|
||||
.map(command -> command.execute("Reverse command"))
|
||||
.orElse("Unknown command");
|
||||
System.out.println(result);
|
||||
}
|
||||
}
|
7
spi/src/main/java/ovh/gasser/spi/commands/Command.java
Normal file
7
spi/src/main/java/ovh/gasser/spi/commands/Command.java
Normal file
@ -0,0 +1,7 @@
|
||||
package ovh.gasser.spi.commands;
|
||||
|
||||
public interface Command {
|
||||
String getId();
|
||||
|
||||
String execute(String input);
|
||||
}
|
14
spi/src/main/java/ovh/gasser/spi/commands/EchoCommand.java
Normal file
14
spi/src/main/java/ovh/gasser/spi/commands/EchoCommand.java
Normal file
@ -0,0 +1,14 @@
|
||||
package ovh.gasser.spi.commands;
|
||||
|
||||
public class EchoCommand implements Command {
|
||||
|
||||
private static final String COMMAND_NAME = "echo";
|
||||
|
||||
public String getId() {
|
||||
return COMMAND_NAME;
|
||||
}
|
||||
|
||||
public String execute(String input) {
|
||||
return input;
|
||||
}
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
package ovh.gasser.spi.commands;
|
||||
|
||||
public class ReverseCommand implements Command {
|
||||
|
||||
private static final String COMMAND_NAME = "reverse";
|
||||
|
||||
@Override
|
||||
public String getId() {
|
||||
return COMMAND_NAME;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String execute(String input) {
|
||||
return new StringBuilder(input).reverse().toString();
|
||||
}
|
||||
}
|
16
spi/src/main/java/ovh/gasser/spi/commands/UpperCommand.java
Normal file
16
spi/src/main/java/ovh/gasser/spi/commands/UpperCommand.java
Normal file
@ -0,0 +1,16 @@
|
||||
package ovh.gasser.spi.commands;
|
||||
|
||||
public class UpperCommand implements Command {
|
||||
|
||||
private static final String COMMAND_NAME = "upper";
|
||||
|
||||
@Override
|
||||
public String getId() {
|
||||
return COMMAND_NAME;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String execute(String input) {
|
||||
return input.toUpperCase();
|
||||
}
|
||||
}
|
@ -0,0 +1,3 @@
|
||||
ovh.gasser.spi.commands.EchoCommand
|
||||
ovh.gasser.spi.commands.UpperCommand
|
||||
ovh.gasser.spi.commands.ReverseCommand
|
Reference in New Issue
Block a user