From 6a893a7ba5563774e66519988398b67b06bcd8b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kjetil=20=C3=98rbekk?= Date: Thu, 23 Feb 2012 14:18:12 +0100 Subject: Implement listeners in Variables. --- .../main/java/com/orbekk/same/VariableFactory.java | 21 +++++++++++++++++---- .../java/com/orbekk/same/VariableFactoryTest.java | 18 ++++++++++++++++++ 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/same/src/main/java/com/orbekk/same/VariableFactory.java b/same/src/main/java/com/orbekk/same/VariableFactory.java index 87db576..49604c6 100644 --- a/same/src/main/java/com/orbekk/same/VariableFactory.java +++ b/same/src/main/java/com/orbekk/same/VariableFactory.java @@ -9,6 +9,8 @@ import org.codehaus.jackson.type.TypeReference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.orbekk.same.State.Component; + /** * TODO: Use WeakReference in order to make variables GC-able. */ @@ -17,11 +19,12 @@ public class VariableFactory { private Client.ClientInterface client; private ObjectMapper mapper = new ObjectMapper(); - private class VariableImpl implements Variable { + private class VariableImpl implements Variable, StateChangedListener { String identifier; TypeReference type; T value; long revision = 0; + OnChangeListener listener = null; public VariableImpl(String identifier, TypeReference type) { this.identifier = identifier; @@ -59,8 +62,17 @@ public class VariableFactory { } @Override - public void setOnChangeListener(Variable.OnChangeListener listener) { - throw new RuntimeException("Not implemented."); + public void setOnChangeListener(OnChangeListener listener) { + this.listener = listener; + } + + @Override + public void stateChanged(Component component) { + if (component.getName().equals(identifier)) { + if (listener != null) { + listener.valueChanged(this); + } + } } } @@ -73,8 +85,9 @@ public class VariableFactory { } public Variable create(String identifier, TypeReference type) { - Variable variable = new VariableImpl(identifier, type); + VariableImpl variable = new VariableImpl(identifier, type); variable.update(); + client.addStateListener(variable); return variable; } diff --git a/same/src/test/java/com/orbekk/same/VariableFactoryTest.java b/same/src/test/java/com/orbekk/same/VariableFactoryTest.java index 7d20fa7..a6efa4b 100644 --- a/same/src/test/java/com/orbekk/same/VariableFactoryTest.java +++ b/same/src/test/java/com/orbekk/same/VariableFactoryTest.java @@ -59,4 +59,22 @@ public class VariableFactoryTest { string.set("NewValue"); verify(client).set("X", "\"NewValue\"", 0); } + + @Test + public void addsListener() throws Exception { + Variable v = vf.create("X", stringType); + verify(client).addStateListener((StateChangedListener)v); + } + + @Test + public void listenerNotifies() throws Exception { + @SuppressWarnings("unchecked") + Variable.OnChangeListener listener = + mock(Variable.OnChangeListener.class); + Variable v = vf.create("z", intType); + v.setOnChangeListener(listener); + ((StateChangedListener) v).stateChanged( + new State.Component("z", 1, "abc")); + verify(listener).valueChanged(v); + } } -- cgit v1.2.3