From 7d490a9cd46b4295dca8535ca72d781070794f6b Mon Sep 17 00:00:00 2001 From: Narendra Pathai Date: Wed, 7 Sep 2016 02:02:06 +0530 Subject: [PATCH] Updated Announcer to use generics --- .../iluwatar/proxy/example2/Announcer.java | 23 +++++++++++-------- .../com/iluwatar/proxy/example2/EndPoint.java | 2 +- .../proxy/example2/HealthMonitor.java | 4 +++- .../proxy/example2/AnnouncerTest.java | 2 +- 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/proxy/src/main/java/com/iluwatar/proxy/example2/Announcer.java b/proxy/src/main/java/com/iluwatar/proxy/example2/Announcer.java index 1f0c6bc1..e22bc330 100644 --- a/proxy/src/main/java/com/iluwatar/proxy/example2/Announcer.java +++ b/proxy/src/main/java/com/iluwatar/proxy/example2/Announcer.java @@ -3,19 +3,20 @@ package com.iluwatar.proxy.example2; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Proxy; +import java.util.EventListener; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; -public class Announcer { +public class Announcer { - private HealthMonitor proxy; - private List listeners = new CopyOnWriteArrayList<>(); + private T proxy; + private List listeners = new CopyOnWriteArrayList<>(); - public Announcer(Class listenerType) { + public Announcer(Class listenerType) { proxy = createProxy(listenerType); } - private HealthMonitor createProxy(Class listenerType) { + private T createProxy(Class listenerType) { return listenerType.cast(Proxy.newProxyInstance(listenerType.getClassLoader(), new Class[] {listenerType}, (proxy, method, args) -> { invokeAll(method, args); @@ -24,7 +25,7 @@ public class Announcer { } private void invokeAll(Method method, Object[] args) { - for (HealthMonitor listener : listeners) { + for (T listener : listeners) { try { method.invoke(listener, args); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { @@ -33,15 +34,19 @@ public class Announcer { } } - public void registerListener(HealthMonitor listener) { + public void registerListener(T listener) { listeners.add(listener); } - public HealthMonitor announce() { + public T announce() { return proxy; } - public void removeListener(HealthMonitor listener) { + public void removeListener(T listener) { listeners.remove(listener); } + + public static Announcer to(Class listenerType) { + return new Announcer<>(listenerType); + } } diff --git a/proxy/src/main/java/com/iluwatar/proxy/example2/EndPoint.java b/proxy/src/main/java/com/iluwatar/proxy/example2/EndPoint.java index 7bb42b60..ee78d440 100644 --- a/proxy/src/main/java/com/iluwatar/proxy/example2/EndPoint.java +++ b/proxy/src/main/java/com/iluwatar/proxy/example2/EndPoint.java @@ -3,7 +3,7 @@ package com.iluwatar.proxy.example2; public class EndPoint { private final String name; - private final Announcer healthMonitors = new Announcer(HealthMonitor.class); + private final Announcer healthMonitors = Announcer.to(HealthMonitor.class); public EndPoint(String name) { this.name = name; diff --git a/proxy/src/main/java/com/iluwatar/proxy/example2/HealthMonitor.java b/proxy/src/main/java/com/iluwatar/proxy/example2/HealthMonitor.java index 84992c14..11ec4fd5 100644 --- a/proxy/src/main/java/com/iluwatar/proxy/example2/HealthMonitor.java +++ b/proxy/src/main/java/com/iluwatar/proxy/example2/HealthMonitor.java @@ -1,6 +1,8 @@ package com.iluwatar.proxy.example2; -public interface HealthMonitor { +import java.util.EventListener; + +public interface HealthMonitor extends EventListener { void disconnected(EndPoint endPoint); diff --git a/proxy/src/test/java/com/iluwatar/proxy/example2/AnnouncerTest.java b/proxy/src/test/java/com/iluwatar/proxy/example2/AnnouncerTest.java index 59470e0a..674d8c0c 100644 --- a/proxy/src/test/java/com/iluwatar/proxy/example2/AnnouncerTest.java +++ b/proxy/src/test/java/com/iluwatar/proxy/example2/AnnouncerTest.java @@ -16,7 +16,7 @@ public class AnnouncerTest { private EndPoint endPoint = mock(EndPoint.class); private HealthMonitor monitor1 = mock(HealthMonitor.class); private HealthMonitor monitor2 = mock(HealthMonitor.class); - private Announcer announcer = new Announcer(HealthMonitor.class); + private Announcer announcer = Announcer.to(HealthMonitor.class); @Before public void setUp() { -- GitLab