diff options
-rw-r--r-- | same/src/main/java/com/orbekk/same/Variable.java | 2 | ||||
-rw-r--r-- | same/src/main/java/com/orbekk/same/VariableFactory.java | 30 | ||||
-rw-r--r-- | same/src/test/java/com/orbekk/same/VariableFactoryTest.java | 14 |
3 files changed, 41 insertions, 5 deletions
diff --git a/same/src/main/java/com/orbekk/same/Variable.java b/same/src/main/java/com/orbekk/same/Variable.java index 63f8063..b6d3b7f 100644 --- a/same/src/main/java/com/orbekk/same/Variable.java +++ b/same/src/main/java/com/orbekk/same/Variable.java @@ -11,7 +11,7 @@ public interface Variable<T> { } T get(); - void set(T value); + void set(T value) throws UpdateConflict; void update(); void setOnChangeListener(OnChangeListener<T> listener); } diff --git a/same/src/main/java/com/orbekk/same/VariableFactory.java b/same/src/main/java/com/orbekk/same/VariableFactory.java index 81b7615..79c2cdc 100644 --- a/same/src/main/java/com/orbekk/same/VariableFactory.java +++ b/same/src/main/java/com/orbekk/same/VariableFactory.java @@ -1,17 +1,27 @@ package com.orbekk.same; +import java.io.IOException; + +import org.codehaus.jackson.JsonGenerationException; +import org.codehaus.jackson.map.JsonMappingException; +import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.type.TypeReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * TODO: Use WeakReference in order to make variables GC-able. */ public class VariableFactory { - Client.ClientInterface client; + private Logger logger = LoggerFactory.getLogger(getClass()); + private Client.ClientInterface client; + private ObjectMapper mapper = new ObjectMapper(); private class VariableImpl<T> implements Variable<T> { String identifier; TypeReference<T> type; T value; + long revision = 0; public VariableImpl(String identifier, TypeReference<T> type) { this.identifier = identifier; @@ -24,7 +34,23 @@ public class VariableFactory { } @Override - public void set(T value) { + public void set(T value) throws UpdateConflict { + try { + String serializedValue = mapper.writeValueAsString(value); + client.set(identifier, serializedValue, revision); + } catch (JsonGenerationException e) { + logger.warn("Failed to convert to JSON: {}", value); + logger.warn("Parse exception.", e); + throw new RuntimeException(e); + } catch (JsonMappingException e) { + logger.warn("Failed to convert to JSON: {}", value); + logger.warn("Parse exception.", e); + throw new RuntimeException(e); + } catch (IOException e) { + logger.warn("Failed to cornvert to JSON: {}", value); + logger.warn("Parse exception.", e); + throw new RuntimeException(e); + } } @Override diff --git a/same/src/test/java/com/orbekk/same/VariableFactoryTest.java b/same/src/test/java/com/orbekk/same/VariableFactoryTest.java index eade799..7d20fa7 100644 --- a/same/src/test/java/com/orbekk/same/VariableFactoryTest.java +++ b/same/src/test/java/com/orbekk/same/VariableFactoryTest.java @@ -1,9 +1,11 @@ package com.orbekk.same; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import static org.mockito.Mockito.verify; import java.util.List; @@ -18,12 +20,14 @@ public class VariableFactoryTest { TypeReference<Integer> intType = new TypeReference<Integer>() {}; TypeReference<List<String>> listType = new TypeReference<List<String>>() {}; + TypeReference<String> stringType = new TypeReference<String>() {}; @Before public void setUp() { client = mock(Client.ClientInterface.class); vf = new VariableFactory(client); initializeSampleState(); + when(client.getState()).thenReturn(sampleState); } public void initializeSampleState() { @@ -34,14 +38,12 @@ public class VariableFactoryTest { @Test public void getsInitialValue() { - when(client.getState()).thenReturn(sampleState); Variable<Integer> testVariable = vf.create("TestVariable", intType); assertEquals(1, (int)testVariable.get()); } @Test public void updatesValue() { - when(client.getState()).thenReturn(sampleState); Variable<List<String>> list = vf.create("TestList", listType); assertTrue(list.get().isEmpty()); sampleState.update("TestList", "[\"CONTENT\"]", 2); @@ -49,4 +51,12 @@ public class VariableFactoryTest { assertEquals(1, list.get().size()); assertEquals("CONTENT", list.get().get(0)); } + + @Test + public void setsValue() throws Exception { + Variable<String> string = vf.create("X", stringType); + assertNull(string.get()); + string.set("NewValue"); + verify(client).set("X", "\"NewValue\"", 0); + } } |