From b21b53b919a741bc30ad835db14aefbeb4579f50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kjetil=20=C3=98rbekk?= Date: Fri, 17 Feb 2012 10:27:54 +0100 Subject: VariableFactory: Support set() operation. --- same/src/main/java/com/orbekk/same/Variable.java | 2 +- .../main/java/com/orbekk/same/VariableFactory.java | 30 ++++++++++++++++++++-- .../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 get(); - void set(T value); + void set(T value) throws UpdateConflict; void update(); void setOnChangeListener(OnChangeListener 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 implements Variable { String identifier; TypeReference type; T value; + long revision = 0; public VariableImpl(String identifier, TypeReference 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 intType = new TypeReference() {}; TypeReference> listType = new TypeReference>() {}; + TypeReference stringType = new TypeReference() {}; @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 testVariable = vf.create("TestVariable", intType); assertEquals(1, (int)testVariable.get()); } @Test public void updatesValue() { - when(client.getState()).thenReturn(sampleState); Variable> 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 = vf.create("X", stringType); + assertNull(string.get()); + string.set("NewValue"); + verify(client).set("X", "\"NewValue\"", 0); + } } -- cgit v1.2.3