summaryrefslogtreecommitdiff
path: root/base/src/main/java/bjc/utils/services/Bordello.java
diff options
context:
space:
mode:
Diffstat (limited to 'base/src/main/java/bjc/utils/services/Bordello.java')
-rw-r--r--base/src/main/java/bjc/utils/services/Bordello.java53
1 files changed, 53 insertions, 0 deletions
diff --git a/base/src/main/java/bjc/utils/services/Bordello.java b/base/src/main/java/bjc/utils/services/Bordello.java
new file mode 100644
index 0000000..104c4ab
--- /dev/null
+++ b/base/src/main/java/bjc/utils/services/Bordello.java
@@ -0,0 +1,53 @@
+package bjc.utils.services;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * A place to retrieve services from
+ *
+ * @author bjcul
+ *
+ */
+public class Bordello {
+ private static final Map<Class<?>, Object> services = new ConcurrentHashMap<>();
+
+ /**
+ * Retrieve the implementation of a given service.
+ *
+ * @param <T> The type of the service.
+ *
+ * @param interfaceClass The class of the service.
+ *
+ * @return The default implementation of the service.
+ */
+ public static <T> T get(Class<T> interfaceClass) {
+ synchronized (interfaceClass) {
+ Object service = services.get(interfaceClass);
+ if (service == null) {
+ try {
+ Class<?> implementor = interfaceClass.getAnnotation(Implementor.class).value();
+ service = implementor.getDeclaredConstructor().newInstance();
+ services.put(interfaceClass, implementor);
+ } catch (Exception ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+ return interfaceClass.cast(service);
+ }
+ }
+
+ /**
+ * Set an implementation for a given service to be something other than the default.
+ *
+ * @param <T> The type of the service
+ *
+ * @param interfaceClass The class of the service
+ * @param implementor The alternate implementation for the service.
+ */
+ public static <T> void set(Class<T> interfaceClass, T implementor) {
+ synchronized (interfaceClass) {
+ services.put(interfaceClass, implementor);
+ }
+ }
+}