From aaf73deea5a278dac75f59d9015fea496f96c959 Mon Sep 17 00:00:00 2001 From: Armin Zamani Date: Thu, 7 Mar 2013 17:13:31 +0400 Subject: [PATCH] Extended Data Management in app to handle mark loading --- .../test/MarksJsonSerializerTest.java | 46 +++ .../impl/MarkDeserializer.java | 38 +++ .../racecommittee/app/data/DataStore.java | 60 ++-- .../app/data/InMemoryDataStore.java | 263 ++++++++++-------- .../app/data/OnlineDataManager.java | 32 ++- .../handlers/ManagedRacesDataHandler.java | 42 +-- .../app/data/handlers/MarksDataHandler.java | 21 ++ .../app/data/parsers/MarksDataParser.java | 36 +++ 8 files changed, 372 insertions(+), 166 deletions(-) create mode 100644 java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/MarksJsonSerializerTest.java create mode 100644 java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/MarkDeserializer.java create mode 100644 mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/MarksDataHandler.java create mode 100644 mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/MarksDataParser.java diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/MarksJsonSerializerTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/MarksJsonSerializerTest.java new file mode 100644 index 00000000000..ecb7ed30b7e --- /dev/null +++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/MarksJsonSerializerTest.java @@ -0,0 +1,46 @@ +package com.sap.sailing.server.gateway.serialization.test; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import org.json.simple.JSONObject; +import org.junit.Before; +import org.junit.Test; + +import com.sap.sailing.domain.base.Mark; +import com.sap.sailing.domain.common.MarkType; +import com.sap.sailing.server.gateway.serialization.coursedata.impl.MarkJsonSerializer; + +public class MarksJsonSerializerTest { + + private MarkJsonSerializer serializer; + + private Mark mark; + + @Before + public void setUp() { + serializer = new MarkJsonSerializer(); + + mark = mock(Mark.class); + } + + @Test + public void testName() { + when(mark.getName()).thenReturn("NAME"); + when(mark.getColor()).thenReturn("RED"); + when(mark.getId()).thenReturn("IIIIDDDD"); + when(mark.getPattern()).thenReturn("SHINY"); + when(mark.getShape()).thenReturn("ROUND"); + when(mark.getType()).thenReturn(MarkType.BUOY); + + JSONObject result = serializer.serialize(mark); + + assertEquals("NAME", result.get(MarkJsonSerializer.FIELD_NAME)); + assertEquals("RED", result.get(MarkJsonSerializer.FIELD_COLOR)); + assertEquals("IIIIDDDD", result.get(MarkJsonSerializer.FIELD_ID)); + assertEquals("SHINY", result.get(MarkJsonSerializer.FIELD_PATTERN)); + assertEquals("ROUND", result.get(MarkJsonSerializer.FIELD_SHAPE)); + assertEquals(MarkType.BUOY, MarkType.valueOf(result.get(MarkJsonSerializer.FIELD_TYPE).toString())); + } +} diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/MarkDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/MarkDeserializer.java new file mode 100644 index 00000000000..559139a6d1d --- /dev/null +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/MarkDeserializer.java @@ -0,0 +1,38 @@ +package com.sap.sailing.server.gateway.deserialization.impl; + +import java.io.Serializable; + +import org.json.simple.JSONObject; + +import com.sap.sailing.domain.base.Mark; +import com.sap.sailing.domain.base.SharedDomainFactory; +import com.sap.sailing.domain.common.MarkType; +import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; +import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; +import com.sap.sailing.server.gateway.serialization.coursedata.impl.MarkJsonSerializer; + +/** + * Deserializer for marks. + */ +public class MarkDeserializer implements JsonDeserializer { + + private SharedDomainFactory factory; + + public MarkDeserializer(SharedDomainFactory factory) { + this.factory = factory; + } + + @Override + public Mark deserialize(JSONObject object) throws JsonDeserializationException { + Serializable id = (Serializable) object.get(MarkJsonSerializer.FIELD_ID).toString(); + String color = object.get(MarkJsonSerializer.FIELD_COLOR).toString(); + String pattern = object.get(MarkJsonSerializer.FIELD_PATTERN).toString(); + String shape = object.get(MarkJsonSerializer.FIELD_SHAPE).toString(); + MarkType type = MarkType.valueOf(object.get(MarkJsonSerializer.FIELD_TYPE).toString()); + String name = object.get(MarkJsonSerializer.FIELD_NAME).toString(); + + Mark mark = factory.getOrCreateMark(id, name, type, color, shape, pattern); + return mark; + } + +} diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java index 2c8c5ed5e10..d816acfd93c 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java @@ -1,27 +1,33 @@ -package com.sap.sailing.racecommittee.app.data; - -import java.io.Serializable; -import java.util.Collection; - -import com.sap.sailing.domain.base.CourseArea; -import com.sap.sailing.domain.base.EventData; -import com.sap.sailing.racecommittee.app.domain.ManagedRace; - -public interface DataStore { - - public Collection getEvents(); - public EventData getEvent(Serializable id); - public boolean hasEvent(Serializable id); - public void addEvent(EventData event); - - public Collection getCourseAreas(EventData event); - public CourseArea getCourseArea(Serializable id); - public boolean hasCourseArea(Serializable id); - public void addCourseArea(EventData event, CourseArea courseArea); - - public Collection getRaces(); - public void addRace(ManagedRace race); - public ManagedRace getRace(Serializable id); - public boolean hasRace(Serializable id); - -} +package com.sap.sailing.racecommittee.app.data; + +import java.io.Serializable; +import java.util.Collection; + +import com.sap.sailing.domain.base.CourseArea; +import com.sap.sailing.domain.base.EventData; +import com.sap.sailing.domain.base.Mark; +import com.sap.sailing.racecommittee.app.domain.ManagedRace; + +public interface DataStore { + + public Collection getEvents(); + public EventData getEvent(Serializable id); + public boolean hasEvent(Serializable id); + public void addEvent(EventData event); + + public Collection getCourseAreas(EventData event); + public CourseArea getCourseArea(Serializable id); + public boolean hasCourseArea(Serializable id); + public void addCourseArea(EventData event, CourseArea courseArea); + + public Collection getRaces(); + public void addRace(ManagedRace race); + public ManagedRace getRace(Serializable id); + public boolean hasRace(Serializable id); + + public Collection getMarks(); + public Mark getMark(Serializable id); + public boolean hasMark(Serializable id); + public void addMark(Mark mark); + +} diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java index a69042bd26f..b6441ffee75 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java @@ -1,117 +1,146 @@ -package com.sap.sailing.racecommittee.app.data; - -import java.io.Serializable; -import java.util.Collection; -import java.util.HashMap; - -import com.sap.sailing.domain.base.CourseArea; -import com.sap.sailing.domain.base.EventData; -import com.sap.sailing.racecommittee.app.domain.ManagedRace; -import com.sap.sailing.racecommittee.app.utils.CollectionUtils; - -public enum InMemoryDataStore implements DataStore { - INSTANCE; - - private HashMap eventsById; - private HashMap managedRaceById; - - private InMemoryDataStore() { - this.eventsById = new HashMap(); - this.managedRaceById = new HashMap(); - } - - /* - * * * * * * - * EVENTS * - * * * * * * - */ - - public Collection getEvents() { - return eventsById.values(); - } - - public EventData getEvent(Serializable id) { - return eventsById.get(id); - } - - public boolean hasEvent(Serializable id) { - return eventsById.containsKey(id); - } - - public void addEvent(EventData event) { - eventsById.put(event.getId(), event); - } - - /* - * * * * * * * * - * COURSE AREA * - * * * * * * * * - */ - - public Collection getCourseAreas(EventData event) { - if (event.getVenue() != null) { - return CollectionUtils.newArrayList(event.getVenue().getCourseAreas()); - } - return null; - } - - public CourseArea getCourseArea(EventData event, String name) { - Collection courseAreas = getCourseAreas(event); - if (courseAreas != null) { - for (CourseArea courseArea : courseAreas) { - if (courseArea.getName().equals(name)) { - return courseArea; - } - } - } - return null; - } - - public CourseArea getCourseArea(Serializable id) { - for (EventData event : eventsById.values()) { - for (CourseArea courseArea : getCourseAreas(event)) { - if (courseArea.getId().equals(id)) - return courseArea; - } - } - return null; - } - - public boolean hasCourseArea(Serializable id) { - for (EventData event : eventsById.values()) { - for (CourseArea courseArea : getCourseAreas(event)) { - if (courseArea.getId().equals(id)) - return true; - } - } - return false; - } - - public void addCourseArea(EventData event, CourseArea courseArea) { - if (event.getVenue() != null) { - event.getVenue().addCourseArea(courseArea); - } - } - - /* - * * * * * * * * - * MANAGED RACE * - * * * * * * * * - */ - - public Collection getRaces() { - return managedRaceById.values(); - } - - public void addRace(ManagedRace race) { - managedRaceById.put(race.getId(), race); - } - - public ManagedRace getRace(Serializable id) { - return managedRaceById.get(id); - } - - public boolean hasRace(Serializable id) { - return managedRaceById.containsKey(id); - } -} +package com.sap.sailing.racecommittee.app.data; + +import java.io.Serializable; +import java.util.Collection; +import java.util.HashMap; + +import com.sap.sailing.domain.base.CourseArea; +import com.sap.sailing.domain.base.EventData; +import com.sap.sailing.domain.base.Mark; +import com.sap.sailing.racecommittee.app.domain.ManagedRace; +import com.sap.sailing.racecommittee.app.utils.CollectionUtils; + +public enum InMemoryDataStore implements DataStore { + INSTANCE; + + private HashMap eventsById; + private HashMap managedRaceById; + private HashMap marksById; + + private InMemoryDataStore() { + this.eventsById = new HashMap(); + this.managedRaceById = new HashMap(); + this.marksById = new HashMap(); + } + + /* + * * * * * * + * EVENTS * + * * * * * * + */ + + public Collection getEvents() { + return eventsById.values(); + } + + public EventData getEvent(Serializable id) { + return eventsById.get(id); + } + + public boolean hasEvent(Serializable id) { + return eventsById.containsKey(id); + } + + public void addEvent(EventData event) { + eventsById.put(event.getId(), event); + } + + /* + * * * * * * * * + * COURSE AREA * + * * * * * * * * + */ + + public Collection getCourseAreas(EventData event) { + if (event.getVenue() != null) { + return CollectionUtils.newArrayList(event.getVenue().getCourseAreas()); + } + return null; + } + + public CourseArea getCourseArea(EventData event, String name) { + Collection courseAreas = getCourseAreas(event); + if (courseAreas != null) { + for (CourseArea courseArea : courseAreas) { + if (courseArea.getName().equals(name)) { + return courseArea; + } + } + } + return null; + } + + public CourseArea getCourseArea(Serializable id) { + for (EventData event : eventsById.values()) { + for (CourseArea courseArea : getCourseAreas(event)) { + if (courseArea.getId().equals(id)) + return courseArea; + } + } + return null; + } + + public boolean hasCourseArea(Serializable id) { + for (EventData event : eventsById.values()) { + for (CourseArea courseArea : getCourseAreas(event)) { + if (courseArea.getId().equals(id)) + return true; + } + } + return false; + } + + public void addCourseArea(EventData event, CourseArea courseArea) { + if (event.getVenue() != null) { + event.getVenue().addCourseArea(courseArea); + } + } + + /* + * * * * * * * * + * MANAGED RACE * + * * * * * * * * + */ + + public Collection getRaces() { + return managedRaceById.values(); + } + + public void addRace(ManagedRace race) { + managedRaceById.put(race.getId(), race); + } + + public ManagedRace getRace(Serializable id) { + return managedRaceById.get(id); + } + + public boolean hasRace(Serializable id) { + return managedRaceById.containsKey(id); + } + + /* + * * * * * * + * MARKS * + * * * * * * + */ + + @Override + public Collection getMarks() { + return marksById.values(); + } + + @Override + public Mark getMark(Serializable id) { + return marksById.get(id); + } + + @Override + public boolean hasMark(Serializable id) { + return marksById.containsKey(id); + } + + @Override + public void addMark(Mark mark) { + marksById.put(mark.getId(), mark); + } +} diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java index d4a219d4265..d385b010f94 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java @@ -11,16 +11,19 @@ import android.content.Context; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.EventData; +import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.base.SharedDomainFactory; import com.sap.sailing.racecommittee.app.AppConstants; import com.sap.sailing.racecommittee.app.data.clients.LoadClient; import com.sap.sailing.racecommittee.app.data.handlers.DataHandler; import com.sap.sailing.racecommittee.app.data.handlers.EventsDataHandler; import com.sap.sailing.racecommittee.app.data.handlers.ManagedRacesDataHandler; +import com.sap.sailing.racecommittee.app.data.handlers.MarksDataHandler; import com.sap.sailing.racecommittee.app.data.loaders.DataLoader; import com.sap.sailing.racecommittee.app.data.parsers.DataParser; import com.sap.sailing.racecommittee.app.data.parsers.EventsDataParser; import com.sap.sailing.racecommittee.app.data.parsers.ManagedRacesDataParser; +import com.sap.sailing.racecommittee.app.data.parsers.MarksDataParser; import com.sap.sailing.racecommittee.app.deserialization.impl.BoatClassJsonDeserializer; import com.sap.sailing.racecommittee.app.deserialization.impl.ColorDeserializer; import com.sap.sailing.racecommittee.app.deserialization.impl.CourseAreaJsonDeserializer; @@ -33,8 +36,10 @@ import com.sap.sailing.racecommittee.app.deserialization.impl.RaceRowDeserialize import com.sap.sailing.racecommittee.app.deserialization.impl.SeriesWithRowsDeserializer; import com.sap.sailing.racecommittee.app.deserialization.impl.VenueJsonDeserializer; import com.sap.sailing.racecommittee.app.domain.ManagedRace; +import com.sap.sailing.racecommittee.app.domain.ManagedRaceIdentifier; import com.sap.sailing.racecommittee.app.domain.impl.DomainFactoryImpl; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; +import com.sap.sailing.server.gateway.deserialization.impl.MarkDeserializer; import com.sap.sailing.server.gateway.deserialization.impl.RaceLogEventDeserializer; /** @@ -140,6 +145,31 @@ public class OnlineDataManager extends DataManager { } catch (IOException e) { e.printStackTrace(); } - + } + + public void addMarks(Collection marks) { + for (Mark mark : marks) { + dataStore.addMark(mark); + } + } + + public void loadMarks(ManagedRace managedRace, LoadClient> client) { + SharedDomainFactory domainFactory = DomainFactoryImpl.INSTANCE; + JsonDeserializer markDeserializer = new MarkDeserializer(domainFactory); + DataParser> parser = new MarksDataParser(markDeserializer); + DataHandler> handler = new MarksDataHandler(this, client); + + ManagedRaceIdentifier identifier = managedRace.getIdentifier(); + + try { + new DataLoader>(context, URI.create(AppConstants.getServerBaseURL(context) + + "/sailingserver/rc/marks?leaderboard=" + identifier.getRaceGroup().getName() + "&raceColumn=" + identifier.getRaceName() + + "&fleet=" + identifier.getFleet().getName()), parser, handler) + .forceLoad(); + } catch (MalformedURLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } } } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/ManagedRacesDataHandler.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/ManagedRacesDataHandler.java index 154daa8b9b8..6b732a57006 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/ManagedRacesDataHandler.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/ManagedRacesDataHandler.java @@ -1,21 +1,21 @@ -package com.sap.sailing.racecommittee.app.data.handlers; - -import java.util.Collection; - -import com.sap.sailing.racecommittee.app.data.OnlineDataManager; -import com.sap.sailing.racecommittee.app.data.clients.LoadClient; -import com.sap.sailing.racecommittee.app.domain.ManagedRace; - -public class ManagedRacesDataHandler extends DataHandler> { - - public ManagedRacesDataHandler(OnlineDataManager manager, LoadClient> client) { - super(manager, client); - } - - @Override - public void onLoaded(Collection data) { - super.onLoaded(data); - manager.addRaces(data); - } - -} +package com.sap.sailing.racecommittee.app.data.handlers; + +import java.util.Collection; + +import com.sap.sailing.racecommittee.app.data.OnlineDataManager; +import com.sap.sailing.racecommittee.app.data.clients.LoadClient; +import com.sap.sailing.racecommittee.app.domain.ManagedRace; + +public class ManagedRacesDataHandler extends DataHandler> { + + public ManagedRacesDataHandler(OnlineDataManager manager, LoadClient> client) { + super(manager, client); + } + + @Override + public void onLoaded(Collection data) { + super.onLoaded(data); + manager.addRaces(data); + } + +} diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/MarksDataHandler.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/MarksDataHandler.java new file mode 100644 index 00000000000..816a1c57014 --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/MarksDataHandler.java @@ -0,0 +1,21 @@ +package com.sap.sailing.racecommittee.app.data.handlers; + +import java.util.Collection; + +import com.sap.sailing.domain.base.Mark; +import com.sap.sailing.racecommittee.app.data.OnlineDataManager; +import com.sap.sailing.racecommittee.app.data.clients.LoadClient; + +public class MarksDataHandler extends DataHandler> { + + public MarksDataHandler(OnlineDataManager manager, LoadClient> client) { + super(manager, client); + } + + @Override + public void onLoaded(Collection data) { + super.onLoaded(data); + manager.addMarks(data); + } + +} diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/MarksDataParser.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/MarksDataParser.java new file mode 100644 index 00000000000..3d62857b54f --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/MarksDataParser.java @@ -0,0 +1,36 @@ +package com.sap.sailing.racecommittee.app.data.parsers; + +import java.io.Reader; +import java.util.ArrayList; +import java.util.Collection; + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.JSONValue; + +import com.sap.sailing.domain.base.Mark; +import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; +import com.sap.sailing.server.gateway.deserialization.impl.Helpers; + +public class MarksDataParser implements DataParser> { + + private JsonDeserializer deserializer; + + public MarksDataParser(JsonDeserializer deserializer) { + this.deserializer = deserializer; + } + + public Collection parse(Reader reader) throws Exception { + Object parsedResult = JSONValue.parseWithException(reader); + JSONArray jsonArray = Helpers.toJSONArraySafe(parsedResult); + Collection marks = new ArrayList(); + + for (Object element : jsonArray) { + JSONObject json = Helpers.toJSONObjectSafe(element); + marks.add(deserializer.deserialize(json)); + } + + return marks; + } + +}