From 7fb62a6d592646df7b3a728399f830e7b4e68dec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kjetil=20=C3=98rbekk?= Date: Fri, 20 Jan 2012 16:30:44 +0100 Subject: Implement interface for notification of state changes. --- .../java/com/orbekk/same/ClientServiceImpl.java | 13 +++++++-- same/src/main/java/com/orbekk/same/Same.java | 32 +++++++++++++++++++++- .../main/java/com/orbekk/same/SameInterface.java | 3 ++ .../java/com/orbekk/same/StateChangedListener.java | 5 ++++ 4 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 same/src/main/java/com/orbekk/same/StateChangedListener.java diff --git a/same/src/main/java/com/orbekk/same/ClientServiceImpl.java b/same/src/main/java/com/orbekk/same/ClientServiceImpl.java index 75df9cc..7865167 100644 --- a/same/src/main/java/com/orbekk/same/ClientServiceImpl.java +++ b/same/src/main/java/com/orbekk/same/ClientServiceImpl.java @@ -9,7 +9,8 @@ public class ClientServiceImpl implements ClientService, UrlReceiver { private ConnectionManager connections; private State state; private String myUrl = null; - + private StateChangedListener listener; + public ClientServiceImpl(State state, ConnectionManager connections) { this.state = state; this.connections = connections; @@ -23,7 +24,11 @@ public class ClientServiceImpl implements ClientService, UrlReceiver { @Override public void setState(String component, String data, long revision) { boolean status = state.update(component, data, revision); - if (!status) { + if (status) { + if (listener != null) { + listener.stateChanged(component, data); + } + } else { logger.warn("Ignoring update: {}", new State.Component(component, revision, data)); } @@ -86,4 +91,8 @@ public class ClientServiceImpl implements ClientService, UrlReceiver { State testGetState() { return state; } + + public void setStateChangedListener(StateChangedListener listener) { + this.listener = listener; + } } diff --git a/same/src/main/java/com/orbekk/same/Same.java b/same/src/main/java/com/orbekk/same/Same.java index b70c7aa..d69061f 100644 --- a/same/src/main/java/com/orbekk/same/Same.java +++ b/same/src/main/java/com/orbekk/same/Same.java @@ -1,5 +1,6 @@ package com.orbekk.same; +import java.util.ArrayList; import java.util.List; import org.codehaus.jackson.type.TypeReference; @@ -9,8 +10,27 @@ import org.slf4j.LoggerFactory; public class Same implements SameInterface { private Logger logger = LoggerFactory.getLogger(getClass()); private ClientServiceImpl client; + private StateChangedProxy stateChangedProxy = new StateChangedProxy(); - public Same(ClientServiceImpl client) { + private class StateChangedProxy implements StateChangedListener { + public List listeners = + new ArrayList(); + + @Override + public void stateChanged(String id, String data) { + for (StateChangedListener listener : listeners) { + listener.stateChanged(id, data); + } + } + } + + public static Same createSame(ClientServiceImpl client) { + Same same = new Same(client); + client.setStateChangedListener(same.stateChangedProxy); + return same; + } + + Same(ClientServiceImpl client) { this.client = client; } @@ -39,4 +59,14 @@ public class Same implements SameInterface { throw new RuntimeException("Not implemented."); } + @Override + public void addStateChangedListener(StateChangedListener listener) { + stateChangedProxy.listeners.add(listener); + } + + @Override + public void removeStateChangedListener(StateChangedListener listener) { + stateChangedProxy.listeners.remove(listener); + } + } diff --git a/same/src/main/java/com/orbekk/same/SameInterface.java b/same/src/main/java/com/orbekk/same/SameInterface.java index 7541636..280bd9d 100644 --- a/same/src/main/java/com/orbekk/same/SameInterface.java +++ b/same/src/main/java/com/orbekk/same/SameInterface.java @@ -32,4 +32,7 @@ public interface SameInterface { * Set from an object: Pass it, e.g., a List. */ void setObject(String id, Object data); + + void addStateChangedListener(StateChangedListener listener); + void removeStateChangedListener(StateChangedListener listener); } diff --git a/same/src/main/java/com/orbekk/same/StateChangedListener.java b/same/src/main/java/com/orbekk/same/StateChangedListener.java new file mode 100644 index 0000000..deb9369 --- /dev/null +++ b/same/src/main/java/com/orbekk/same/StateChangedListener.java @@ -0,0 +1,5 @@ +package com.orbekk.same; + +public interface StateChangedListener { + void stateChanged(String id, String data); +} -- cgit v1.2.3