From 3084236a4326f46c1f51b332615c32947c842331 Mon Sep 17 00:00:00 2001 From: Armin Zamani Date: Tue, 23 Apr 2013 16:51:31 +0200 Subject: [PATCH] Implementation of the course load from server --- .../racecommittee/app/data/DataStore.java | 28 +++++++------- .../app/data/OfflineDataManager.java | 6 +++ .../app/data/OnlineDataManager.java | 37 +++++++++++++++++++ .../app/data/ReadonlyDataManager.java | 3 ++ .../app/data/handlers/CourseDataHandler.java | 23 ++++++++++++ .../app/data/parsers/CourseDataParser.java | 28 ++++++++++++++ .../racecommittee/app/domain/ManagedRace.java | 4 ++ .../app/domain/impl/ManagedRaceImpl.java | 12 ++++++ .../dialogs/CourseDesignDialogFragment.java | 27 +++++++++++--- 9 files changed, 148 insertions(+), 20 deletions(-) create mode 100644 mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/CourseDataHandler.java create mode 100644 mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/CourseDataParser.java 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 41052c67121..1018bd83eee 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 @@ -11,20 +11,20 @@ import com.sap.sailing.racecommittee.app.domain.ManagedRace; public interface DataStore { - public Collection getEvents(); - public EventBase getEvent(Serializable id); - public boolean hasEvent(Serializable id); - public void addEvent(EventBase event); - - public Collection getCourseAreas(EventBase event); - public CourseArea getCourseArea(Serializable id); - public boolean hasCourseArea(Serializable id); - public void addCourseArea(EventBase event, CourseArea courseArea); - - public Collection getRaces(); - public void addRace(ManagedRace race); - public ManagedRace getRace(Serializable id); - public boolean hasRace(Serializable id); + public Collection getEvents(); + public EventBase getEvent(Serializable id); + public boolean hasEvent(Serializable id); + public void addEvent(EventBase event); + + public Collection getCourseAreas(EventBase event); + public CourseArea getCourseArea(Serializable id); + public boolean hasCourseArea(Serializable id); + public void addCourseArea(EventBase 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); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OfflineDataManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OfflineDataManager.java index 5886b9d6df3..c51ed554245 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OfflineDataManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OfflineDataManager.java @@ -10,6 +10,7 @@ import java.util.UUID; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseArea; +import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.EventBase; import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.base.impl.BoatClassImpl; @@ -158,4 +159,9 @@ public class OfflineDataManager extends DataManager { client.onLoadSucceded(dataStore.getMarks()); } + @Override + public void loadCourse(ManagedRace managedRace, LoadClient client) { + client.onLoadSucceded(managedRace.getCourseOnServer()); + } + } 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 8873c88e423..efe1c9adfd8 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.CourseBase; import com.sap.sailing.domain.base.EventBase; 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.CourseDataHandler; 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.CourseDataParser; 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; @@ -40,7 +43,11 @@ 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.coursedata.impl.ControlPointDeserializer; +import com.sap.sailing.server.gateway.deserialization.coursedata.impl.CourseDataDeserializer; +import com.sap.sailing.server.gateway.deserialization.coursedata.impl.GateDeserializer; import com.sap.sailing.server.gateway.deserialization.coursedata.impl.MarkDeserializer; +import com.sap.sailing.server.gateway.deserialization.coursedata.impl.WaypointDeserializer; import com.sap.sailing.server.gateway.deserialization.impl.CompetitorDeserializer; import com.sap.sailing.server.gateway.deserialization.racelog.impl.RaceLogEventDeserializer; @@ -178,4 +185,34 @@ public class OnlineDataManager extends DataManager { e.printStackTrace(); } } + + @Override + public void loadCourse(ManagedRace managedRace, LoadClient client) { + SharedDomainFactory domainFactory = DomainFactoryImpl.INSTANCE; + JsonDeserializer courseBaseDeserializer = new CourseDataDeserializer( + new WaypointDeserializer( + new ControlPointDeserializer( + new MarkDeserializer(domainFactory), + new GateDeserializer(domainFactory, + new MarkDeserializer(domainFactory))))); + DataParser parser = new CourseDataParser(courseBaseDeserializer); + DataHandler handler = new CourseDataHandler(this, client, managedRace); + + ManagedRaceIdentifier identifier = managedRace.getIdentifier(); + + String raceGroupName = URLEncoder.encode(identifier.getRaceGroup().getName()); + String raceColumnName = URLEncoder.encode(identifier.getRaceName()); + String fleetName = URLEncoder.encode(identifier.getFleet().getName()); + + try { + new DataLoader(context, URI.create(AppConstants.getServerBaseURL(context) + + "/sailingserver/rc/currentcourse?leaderboard=" + raceGroupName + "&raceColumn=" + raceColumnName + + "&fleet=" + fleetName), 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/ReadonlyDataManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/ReadonlyDataManager.java index 6c5328162ce..79c64213f49 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/ReadonlyDataManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/ReadonlyDataManager.java @@ -4,6 +4,7 @@ import java.io.Serializable; import java.util.Collection; import com.sap.sailing.domain.base.CourseArea; +import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.EventBase; import com.sap.sailing.domain.base.Mark; import com.sap.sailing.racecommittee.app.data.clients.LoadClient; @@ -20,4 +21,6 @@ public interface ReadonlyDataManager { public void loadRaces(Serializable courseAreaId, LoadClient> client); public void loadMarks(ManagedRace managedRace, LoadClient> client); + + public void loadCourse(ManagedRace managedRace, LoadClient client); } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/CourseDataHandler.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/CourseDataHandler.java new file mode 100644 index 00000000000..f22375bc985 --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/CourseDataHandler.java @@ -0,0 +1,23 @@ +package com.sap.sailing.racecommittee.app.data.handlers; + +import com.sap.sailing.domain.base.CourseBase; +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 CourseDataHandler extends DataHandler { + + private ManagedRace race; + + public CourseDataHandler(OnlineDataManager manager, LoadClient client, ManagedRace managedRace) { + super(manager, client); + race = managedRace; + } + + @Override + public void onLoaded(CourseBase data) { + super.onLoaded(data); + race.setCourseOnServer(data); + } + +} diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/CourseDataParser.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/CourseDataParser.java new file mode 100644 index 00000000000..5f2ab06bbf1 --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/CourseDataParser.java @@ -0,0 +1,28 @@ +package com.sap.sailing.racecommittee.app.data.parsers; + +import java.io.Reader; + +import org.json.simple.JSONObject; +import org.json.simple.JSONValue; + +import com.sap.sailing.domain.base.CourseBase; +import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; +import com.sap.sailing.server.gateway.deserialization.impl.Helpers; + +public class CourseDataParser implements DataParser { + + private JsonDeserializer deserializer; + + public CourseDataParser(JsonDeserializer deserializer) { + this.deserializer = deserializer; + } + + @Override + public CourseBase parse(Reader reader) throws Exception { + Object parsedResult = JSONValue.parseWithException(reader); + JSONObject jsonCurrentCourse = Helpers.toJSONObjectSafe(parsedResult); + CourseBase course = deserializer.deserialize(jsonCurrentCourse); + return course; + } + +} diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/ManagedRace.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/ManagedRace.java index 53ebff406d2..25141b8dd62 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/ManagedRace.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/ManagedRace.java @@ -45,5 +45,9 @@ public interface ManagedRace extends ManagedRaceIdentifier, Named, WithID { * @return list of competitors */ public Iterable getCompetitors(); + + public CourseBase getCourseOnServer(); + + public void setCourseOnServer(CourseBase course); } \ No newline at end of file diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/ManagedRaceImpl.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/ManagedRaceImpl.java index a5a056f5cbb..1d9698d7876 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/ManagedRaceImpl.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/ManagedRaceImpl.java @@ -24,6 +24,7 @@ public class ManagedRaceImpl implements ManagedRace { private ManagedRaceIdentifier identifier; private RaceState state; private Iterable competitors; + private CourseBase courseOnServer; public ManagedRaceImpl(ManagedRaceIdentifier identifier, PassAwareRaceLog raceLog, Iterable competitors) { //TODO To be changed when the start procedure for a regatta/leaderboard can be selected in the GWT Admin Console on backend side @@ -36,6 +37,7 @@ public class ManagedRaceImpl implements ManagedRace { this.identifier = identifier; this.state = state; this.competitors = competitors; + this.courseOnServer = null; } public Serializable getId() { @@ -88,4 +90,14 @@ public class ManagedRaceImpl implements ManagedRace { return competitors; } + @Override + public CourseBase getCourseOnServer() { + return courseOnServer; + } + + @Override + public void setCourseOnServer(CourseBase course) { + courseOnServer = course; + } + } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/CourseDesignDialogFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/CourseDesignDialogFragment.java index 236f79aac1d..2740097d041 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/CourseDesignDialogFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/CourseDesignDialogFragment.java @@ -110,6 +110,7 @@ public class CourseDesignDialogFragment extends RaceDialogFragment { previousCourseElementAdapter = new CourseElementListAdapter(getActivity(), R.layout.welter_one_row_three_columns, previousCourseElements); loadMarks(); + loadCourseOnServer(); GridView gridView = (GridView) getView().findViewById(R.id.gridViewAssets); gridView.setAdapter(gridAdapter); @@ -159,10 +160,6 @@ public class CourseDesignDialogFragment extends RaceDialogFragment { previousCourseListView = (ListView) getView().findViewById(R.id.listViewPreviousCourse); previousCourseListView.setAdapter(previousCourseElementAdapter); - if(InMemoryDataStore.INSTANCE.getLastPublishedCourseDesign() != null){ - fillPreviousCourseElementsInList(); - } - takePreviousButton = (Button) getView().findViewById(R.id.takePreviousCourseDesignButton); takePreviousButton.setOnClickListener(new OnClickListener() { @@ -229,6 +226,25 @@ public class CourseDesignDialogFragment extends RaceDialogFragment { super.onResume(); onLoadMarksSucceeded(hostActivity.getDataManager().getDataStore().getMarks()); } + + private void loadCourseOnServer() { + hostActivity.getDataManager().loadCourse(getRace(), new LoadClient() { + + @Override + public void onLoadFailed(Exception reason) { + CourseBase lastPublishedCourseDesign = InMemoryDataStore.INSTANCE.getLastPublishedCourseDesign(); + if(lastPublishedCourseDesign != null) { + fillPreviousCourseElementsInList(lastPublishedCourseDesign); + } + } + + @Override + public void onLoadSucceded(CourseBase data) { + fillPreviousCourseElementsInList(data); + } + + }); + } private void loadMarks() { hostActivity.getDataManager().loadMarks(getRace(), new LoadClient>() { @@ -252,8 +268,7 @@ public class CourseDesignDialogFragment extends RaceDialogFragment { gridAdapter.notifyDataSetChanged(); } - private void fillPreviousCourseElementsInList() { - CourseBase previousCourseData = InMemoryDataStore.INSTANCE.getLastPublishedCourseDesign(); + private void fillPreviousCourseElementsInList(CourseBase previousCourseData) { if (previousCourseData != null) { previousCourseElements.clear(); previousCourseElements.addAll(convertCourseDesignToCourseElements(previousCourseData));