# reworked serialization to use Leaderboards rather than Regatta.getRaces...

# deserialization of all relevant types on app side
This commit is contained in:
Lukas Niemeier committed 2013-02-05 19:29:12 +01:00
1 parent 0d67d37adc
commit 339f930a83
42 files changed
+851 -236

No files matched your search

@@ -0,0 +1,8 @@
package com.sap.sailing.domain.base;
public interface FleetWithRaceNames extends Fleet {
public Iterable<String> getRaceNames();
}
@@ -0,0 +1,11 @@
package com.sap.sailing.domain.base;
import com.sap.sailing.domain.common.Named;
public interface RaceGroup extends Named {
public CourseArea getDefaultCourseArea();
public Iterable<SeriesData> getSeries();
}
@@ -1,6 +1,5 @@
package com.sap.sailing.racecommittee.app.domain;
package com.sap.sailing.domain.base;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.common.Named;
public interface SeriesData extends Named {
@@ -15,6 +14,4 @@ public interface SeriesData extends Named {
* on the scoring scheme (usually, medal races scores are doubled and cannot be discarded).
*/
boolean isMedal();
Integer getOrderNumber();
}
@@ -0,0 +1,45 @@
package com.sap.sailing.domain.base.impl;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.FleetWithRaceNames;
import com.sap.sailing.domain.common.Color;
public class FleetWithRaceNamesImpl implements FleetWithRaceNames {
private static final long serialVersionUID = -7686050535458112702L;
private Fleet fleet;
private Iterable<String> raceNames;
public FleetWithRaceNamesImpl(
Fleet fleet,
Iterable<String> raceNames) {
this.fleet = fleet;
this.raceNames = raceNames;
}
@Override
public Iterable<String> getRaceNames() {
return raceNames;
}
@Override
public String getName() {
return fleet.getName();
}
@Override
public int compareTo(Fleet otherFleet) {
return fleet.compareTo(otherFleet);
}
@Override
public int getOrdering() {
return fleet.getOrdering();
}
@Override
public Color getColor() {
return fleet.getColor();
}
}
@@ -0,0 +1,38 @@
package com.sap.sailing.domain.base.impl;
import com.sap.sailing.domain.base.CourseArea;
import com.sap.sailing.domain.base.RaceGroup;
import com.sap.sailing.domain.base.SeriesData;
public class RaceGroupImpl implements RaceGroup {
private static final long serialVersionUID = 7760879536339600827L;
private final String name;
private final CourseArea courseArea;
private final Iterable<SeriesData> series;
public RaceGroupImpl(
String name,
CourseArea courseArea,
Iterable<SeriesData> series) {
this.name = name;
this.courseArea = courseArea;
this.series = series;
}
@Override
public String getName() {
return name;
}
@Override
public CourseArea getDefaultCourseArea() {
return courseArea;
}
@Override
public Iterable<SeriesData> getSeries() {
return series;
}
}
@@ -13,6 +13,7 @@ Export-Package: com.sap.sailing.server.gateway.deserialization,
com.sap.sailing.server.gateway.serialization,
com.sap.sailing.server.gateway.serialization.filter,
com.sap.sailing.server.gateway.serialization.impl,
com.sap.sailing.server.gateway.serialization.impl.leaderboard,
com.sap.sailing.server.gateway.serialization.impl.race,
com.sap.sailing.server.gateway.serialization.impl.racelog,
com.sap.sailing.server.gateway.serialization.impl.regatta
@@ -0,0 +1,18 @@
package com.sap.sailing.server.gateway.deserialization.impl;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
public class CompetitorDeserializer implements JsonDeserializer<Competitor> {
@Override
public Competitor deserialize(JSONObject object)
throws JsonDeserializationException {
// TODO Auto-generated method stub
return null;
}
}
@@ -0,0 +1,33 @@
package com.sap.sailing.server.gateway.serialization.impl.leaderboard;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.FleetWithRaceNames;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
public class FleetWithRaceNamesJsonSerializer implements JsonSerializer<FleetWithRaceNames> {
public static final String FIELD_RACES = "races";
private final JsonSerializer<Fleet> fleetSerializer;
public FleetWithRaceNamesJsonSerializer(JsonSerializer<Fleet> fleetSerializer) {
this.fleetSerializer = fleetSerializer;
}
@Override
public JSONObject serialize(FleetWithRaceNames object) {
JSONObject result = fleetSerializer.serialize(object);
JSONArray races = new JSONArray();
for (String raceName : object.getRaceNames()) {
races.add(raceName);
}
result.put(FIELD_RACES, races);
return result;
}
}
@@ -0,0 +1,43 @@
package com.sap.sailing.server.gateway.serialization.impl.leaderboard;
import java.util.ArrayList;
import java.util.Collection;
import org.json.simple.JSONArray;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.FleetWithRaceNames;
import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.base.impl.FleetWithRaceNamesImpl;
import com.sap.sailing.server.gateway.serialization.ExtensionJsonSerializer;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
public class FleetWithRaceNamesOfSeriesExtensionSerializer extends ExtensionJsonSerializer<Series, FleetWithRaceNames> {
public FleetWithRaceNamesOfSeriesExtensionSerializer(
JsonSerializer<FleetWithRaceNames> extensionSerializer) {
super(extensionSerializer);
}
@Override
public String getExtensionFieldName() {
return "fleets";
}
@Override
public Object serializeExtension(Series parent) {
JSONArray result = new JSONArray();
for (Fleet fleet : parent.getFleets()) {
Collection<String> raceNames = new ArrayList<String>();
for (RaceColumn column : parent.getRaceColumns()) {
raceNames.add(column.getName());
}
result.add(serialize(new FleetWithRaceNamesImpl(fleet, raceNames)));
}
return result;
}
}
@@ -0,0 +1,29 @@
package com.sap.sailing.server.gateway.serialization.impl.leaderboard;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.server.gateway.serialization.ExtendableJsonSerializer;
import com.sap.sailing.server.gateway.serialization.ExtensionJsonSerializer;
public class LeaderboardJsonSerializer extends ExtendableJsonSerializer<Leaderboard> {
public LeaderboardJsonSerializer(
ExtensionJsonSerializer<Leaderboard, ?> extensionSerializer) {
super(extensionSerializer);
}
@Override
protected JSONObject serializeFields(Leaderboard object) {
JSONObject result = new JSONObject();
result.put("name", object.getName());
result.put("courseArea", "tdb");
return result;
}
}
@@ -0,0 +1,62 @@
package com.sap.sailing.server.gateway.serialization.impl.leaderboard;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.json.simple.JSONArray;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.base.RaceColumnInSeries;
import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.base.impl.FleetImpl;
import com.sap.sailing.domain.base.impl.SeriesImpl;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.server.gateway.serialization.ExtensionJsonSerializer;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
public class SeriesOfLeaderboardExtensionSerializer extends ExtensionJsonSerializer<Leaderboard, Series> {
public SeriesOfLeaderboardExtensionSerializer(JsonSerializer<Series> extensionSerializer) {
super(extensionSerializer);
}
@Override
public String getExtensionFieldName() {
return "series";
}
@Override
public Object serializeExtension(Leaderboard parent) {
Map<Series, List<RaceColumn>> seriesToRaceColumns = new HashMap<Series, List<RaceColumn>>();
Series defaultSeries = new SeriesImpl(
"Default Series",
false,
Collections.<Fleet>singleton(new FleetImpl("Default Fleet")),
Collections.<String>emptyList(),
null);
seriesToRaceColumns.put(defaultSeries, Collections.<RaceColumn>emptyList());
for (RaceColumn raceColumn : parent.getRaceColumns()) {
if (raceColumn instanceof RaceColumnInSeries) {
RaceColumnInSeries raceColumnInSeries = (RaceColumnInSeries) raceColumn;
if (!seriesToRaceColumns.containsKey(raceColumnInSeries.getSeries())) {
seriesToRaceColumns.put(raceColumnInSeries.getSeries(), new ArrayList<RaceColumn>());
}
seriesToRaceColumns.get(raceColumnInSeries.getSeries()).add(raceColumnInSeries);
} else {
seriesToRaceColumns.get(defaultSeries).add(raceColumn);
}
}
JSONArray result = new JSONArray();
for (Series series : seriesToRaceColumns.keySet()) {
result.add(serialize(series));
}
return result;
}
}
@@ -16,6 +16,15 @@
<!-- RACE COMMITTEE START -->
<servlet>
<servlet-name>RCLeaderboards</servlet-name>
<servlet-class>com.sap.sailing.server.gateway.impl.rc.LeaderboardJsonExportServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RCLeaderboards</servlet-name>
<url-pattern>/rc/leaderboards</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>RCRegattas</servlet-name>
<servlet-class>com.sap.sailing.server.gateway.impl.rc.RegattasJsonExportServlet</servlet-class>
@@ -0,0 +1,58 @@
package com.sap.sailing.server.gateway.impl.rc;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.simple.JSONArray;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.server.gateway.impl.JsonExportServlet;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.leaderboard.FleetWithRaceNamesJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.leaderboard.FleetWithRaceNamesOfSeriesExtensionSerializer;
import com.sap.sailing.server.gateway.serialization.impl.leaderboard.LeaderboardJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.leaderboard.SeriesOfLeaderboardExtensionSerializer;
import com.sap.sailing.server.gateway.serialization.impl.regatta.ColorJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.regatta.FleetJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.regatta.SeriesJsonSerializer;
public class LeaderboardJsonExportServlet extends JsonExportServlet {
private static final long serialVersionUID = 4510175441769759252L;
private static final String PARAM_COURSE_AREA_FILTER = "courseArea";
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String courseAreaFilter = request.getParameter(PARAM_COURSE_AREA_FILTER);
if (courseAreaFilter != null) {
System.out.println("Filter by course area: " + courseAreaFilter);
}
/// TODO: implement course are filtering
JsonSerializer<Leaderboard> serializer = createSerializer();
JSONArray result = new JSONArray();
for (Leaderboard leaderboard : getService().getLeaderboards().values()) {
result.add(serializer.serialize(leaderboard));
}
result.writeJSONString(response.getWriter());
}
private static JsonSerializer<Leaderboard> createSerializer() {
return new LeaderboardJsonSerializer(
new SeriesOfLeaderboardExtensionSerializer(
new SeriesJsonSerializer(
new FleetWithRaceNamesOfSeriesExtensionSerializer(
new FleetWithRaceNamesJsonSerializer(
new FleetJsonSerializer(
new ColorJsonSerializer()))))));
}
}
@@ -92,7 +92,6 @@ public class RegattasJsonExportServlet extends JsonExportServlet {
}
private Filter<RaceDefinition> createFilter(final String courseAreaId) {
return new Filter<RaceDefinition>() {
@Override
public boolean isFiltered(RaceDefinition race) {
@@ -6,7 +6,6 @@ import java.util.Collection;
import android.content.Context;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.CourseArea;
import com.sap.sailing.domain.base.Event;
import com.sap.sailing.racecommittee.app.data.clients.LoadClient;
@@ -17,14 +16,15 @@ 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.domain.deserialization.RaceDefinitionJsonDeserializer;
import com.sap.sailing.racecommittee.app.domain.deserialization.RegattaJsonDeserializer;
import com.sap.sailing.racecommittee.app.domain.ManagedRace;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.BoatClassJsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.CourseAreaJsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.EventJsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.VenueJsonDeserializer;
import com.sap.sailing.racecommittee.app.domain.deserialization.impl.ColorDeserializer;
import com.sap.sailing.racecommittee.app.domain.deserialization.impl.CourseAreaJsonDeserializer;
import com.sap.sailing.racecommittee.app.domain.deserialization.impl.EventJsonDeserializer;
import com.sap.sailing.racecommittee.app.domain.deserialization.impl.FleetDeserializer;
import com.sap.sailing.racecommittee.app.domain.deserialization.impl.FleetWithRaceNamesDeserializer;
import com.sap.sailing.racecommittee.app.domain.deserialization.impl.RaceGroupDeserializer;
import com.sap.sailing.racecommittee.app.domain.deserialization.impl.SeriesDataDeserializer;
import com.sap.sailing.racecommittee.app.domain.deserialization.impl.VenueJsonDeserializer;
/**
* Enables accessing of data.
@@ -105,17 +105,18 @@ public class DataManager implements ReadonlyDataManager {
return;
}
JsonDeserializer<BoatClass> boatClassDeserializer = new BoatClassJsonDeserializer();
DataParser<Collection<ManagedRace>> parser = new ManagedRacesDataParser(
new RegattaJsonDeserializer(
boatClassDeserializer,
new RaceDefinitionJsonDeserializer(
boatClassDeserializer)));
//JsonDeserializer<BoatClass> boatClassDeserializer = new BoatClassJsonDeserializer();
DataParser<Collection<ManagedRace>> parser = new ManagedRacesDataParser(
new RaceGroupDeserializer(
new SeriesDataDeserializer(
new FleetWithRaceNamesDeserializer(
new FleetDeserializer(
new ColorDeserializer())))));
DataHandler<Collection<ManagedRace>> handler = new ManagedRacesDataHandler(this, client);
DataLoader<Collection<ManagedRace>> loader = new DataLoader<Collection<ManagedRace>>(
context,
URI.create("http://192.168.178.22:8888/sailingserver/rc/regattas?courseArea=" + courseAreaId.toString()),
URI.create("http://192.168.178.22:8888/sailingserver/rc/leaderboards?courseArea=" + courseAreaId.toString()),
parser,
handler);
loader.forceLoad();
@@ -1,8 +1,11 @@
package com.sap.sailing.racecommittee.app.data.handlers;
import java.util.Collection;
import java.util.UUID;
import com.sap.sailing.domain.base.Event;
import com.sap.sailing.domain.base.impl.CourseAreaImpl;
import com.sap.sailing.domain.base.impl.EventImpl;
import com.sap.sailing.racecommittee.app.data.DataManager;
import com.sap.sailing.racecommittee.app.data.clients.LoadClient;
@@ -14,6 +17,10 @@ public class EventsDataHandler extends DataHandler<Collection<Event>> {
@Override
public void onLoaded(Collection<Event> data) {
Event testEvet = new EventImpl("Test Event", "Berlin", "http://example.com", true, UUID.randomUUID());
testEvet.getVenue().addCourseArea(new CourseAreaImpl("Test Area", UUID.randomUUID()));
data.add(testEvet);
super.onLoaded(data);
manager.addEvents(data);
}
@@ -3,29 +3,31 @@ package com.sap.sailing.racecommittee.app.data.parsers;
import java.io.Reader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.impl.FleetImpl;
import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.base.FleetWithRaceNames;
import com.sap.sailing.domain.base.RaceGroup;
import com.sap.sailing.domain.base.SeriesData;
import com.sap.sailing.racecommittee.app.domain.ManagedRace;
import com.sap.sailing.racecommittee.app.domain.ManagedRaceIdentifier;
import com.sap.sailing.racecommittee.app.domain.impl.ManagedRaceIdentifierImpl;
import com.sap.sailing.racecommittee.app.domain.impl.ManagedRaceImpl;
import com.sap.sailing.racecommittee.app.domain.impl.SeriesDataImpl;
import com.sap.sailing.racecommittee.app.logging.ExLog;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.Helpers;
public class ManagedRacesDataParser implements DataParser<Collection<ManagedRace>> {
private JsonDeserializer<Regatta> regattaDeserializer;
private static final String TAG = ManagedRacesDataParser.class.getName();
public ManagedRacesDataParser(JsonDeserializer<Regatta> regattaDeserializer) {
this.regattaDeserializer = regattaDeserializer;
private JsonDeserializer<RaceGroup> deserializer;
public ManagedRacesDataParser(JsonDeserializer<RaceGroup> deserializer) {
this.deserializer = deserializer;
}
public Collection<ManagedRace> parse(Reader reader) throws Exception {
@@ -33,29 +35,46 @@ public class ManagedRacesDataParser implements DataParser<Collection<ManagedRace
JSONArray jsonArray = Helpers.toJSONArraySafe(parsedResult);
Collection<ManagedRace> managedRaces = new ArrayList<ManagedRace>();
for (Object element : jsonArray) {
JSONObject json = Helpers.toJSONObjectSafe(element);
Regatta regatta = regattaDeserializer.deserialize(json);
if (!Util.isEmpty(regatta.getAllRaces())) {
addManagedRaces(managedRaces, regatta);
}
RaceGroup group = deserializer.deserialize(json);
addManagedRaces(managedRaces, group);
}
return managedRaces;
}
private void addManagedRaces(Collection<ManagedRace> target, Regatta regatta) {
/// TODO: parse Series and Fleet information
for (RaceDefinition raceDefinition : regatta.getAllRaces()) {
target.add(new ManagedRaceImpl(
raceDefinition,
regatta,
raceDefinition.getBoatClass(),
new SeriesDataImpl("Unknown", Collections.<Fleet>emptyList(), false),
new FleetImpl("Unknown")));
private void addManagedRaces(Collection<ManagedRace> target, RaceGroup raceGroup) {
for (SeriesData series : raceGroup.getSeries()) {
for (Fleet fleet : series.getFleets()) {
if (fleet instanceof FleetWithRaceNames) {
FleetWithRaceNames fleetWithRaceNames = (FleetWithRaceNames) fleet;
for (String raceName : fleetWithRaceNames.getRaceNames()) {
ManagedRace managedRace = createManagedRace(
raceGroup,
series,
fleetWithRaceNames,
raceName);
target.add(managedRace);
}
} else {
ExLog.w(TAG, String.format("Fleet %s had no race information attached.", fleet));
}
}
}
}
private ManagedRace createManagedRace(
RaceGroup raceGroup,
SeriesData series,
FleetWithRaceNames fleetWithRaceNames,
String raceName) {
ManagedRaceIdentifier identifier =
new ManagedRaceIdentifierImpl(raceName, fleetWithRaceNames, series, raceGroup);
ManagedRace managedRace = new ManagedRaceImpl(identifier);
return managedRace;
}
}
@@ -1,24 +1,12 @@
package com.sap.sailing.racecommittee.app.domain;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.common.Named;
import com.sap.sailing.domain.common.WithID;
public interface ManagedRace extends Named, WithID {
public interface ManagedRace extends ManagedRaceIdentifier, Named, WithID {
public ManagedRaceIdentifier getIdentifier();
public RaceStatus getStatus();
public Regatta getRegatta();
public RaceDefinition getRaceDefinition();
public BoatClass getBoatClass();
public SeriesData getSeriesData();
public Fleet getFleet();
}
@@ -0,0 +1,21 @@
package com.sap.sailing.racecommittee.app.domain;
import java.io.Serializable;
import com.sap.sailing.domain.base.FleetWithRaceNames;
import com.sap.sailing.domain.base.RaceGroup;
import com.sap.sailing.domain.base.SeriesData;
public interface ManagedRaceIdentifier {
public String getRaceName();
public FleetWithRaceNames getFleet();
public SeriesData getSeries();
public RaceGroup getRaceGroup();
public Serializable getId();
}
@@ -1,39 +0,0 @@
package com.sap.sailing.racecommittee.app.domain.deserialization;
import java.util.Collections;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.impl.RaceDefinitionImpl;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.Helpers;
import com.sap.sailing.server.gateway.serialization.impl.race.RaceDefinitionJsonSerializer;
public class RaceDefinitionJsonDeserializer implements JsonDeserializer<RaceDefinition> {
private JsonDeserializer<BoatClass> boatClassDeserializer;
public RaceDefinitionJsonDeserializer(JsonDeserializer<BoatClass> boatClassDeserializer) {
this.boatClassDeserializer = boatClassDeserializer;
}
public RaceDefinition deserialize(JSONObject object) throws JsonDeserializationException {
String id = object.get(RaceDefinitionJsonSerializer.FIELD_ID).toString();
String name = object.get(RaceDefinitionJsonSerializer.FIELD_NAME).toString();
BoatClass boatClass = boatClassDeserializer.deserialize(
Helpers.getNestedObjectSafe(object, RaceDefinitionJsonSerializer.FIELD_BOAT_CLASS));
return new RaceDefinitionImpl(
name,
null,
boatClass,
Collections.<Competitor>emptyList(),
Helpers.tryUuidConversion(id));
}
}
@@ -1,46 +0,0 @@
package com.sap.sailing.racecommittee.app.domain.deserialization;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.racecommittee.app.domain.impl.SimpleRegattaImpl;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.Helpers;
import com.sap.sailing.server.gateway.serialization.impl.regatta.RegattaJsonSerializer;
public class RegattaJsonDeserializer implements JsonDeserializer<Regatta> {
private JsonDeserializer<BoatClass> boatClassDeserializer;
private JsonDeserializer<RaceDefinition> raceDefinitionDeserializer;
public RegattaJsonDeserializer(
JsonDeserializer<BoatClass> boatClassDeserializer,
JsonDeserializer<RaceDefinition> raceDefinitionDeserializer) {
this.raceDefinitionDeserializer = raceDefinitionDeserializer;
this.boatClassDeserializer = boatClassDeserializer;
}
public Regatta deserialize(JSONObject object) throws JsonDeserializationException {
String id = object.get(RegattaJsonSerializer.FIELD_ID).toString();
//String name = object.get(RegattaJsonSerializer.FIELD_NAME).toString();
String baseName = object.get(RegattaJsonSerializer.FIELD_BASE_NAME).toString();
BoatClass boatClass = boatClassDeserializer.deserialize(
Helpers.getNestedObjectSafe(object, RegattaJsonSerializer.FIELD_BOAT_CLASS));
Regatta regatta = new SimpleRegattaImpl(Helpers.tryUuidConversion(id), baseName, boatClass);
/*JSONArray races = Helpers.getNestedArraySafe(
object,
RegattaJsonSerializer.FIELD_RACES);
for (Object element : races) {
JSONObject race = Helpers.toJSONObjectSafe(element);
regatta.addRace(raceDefinitionDeserializer.deserialize(race));
}*/
return regatta;
}
}
@@ -1,4 +1,4 @@
package com.sap.sailing.server.gateway.deserialization.impl;
package com.sap.sailing.racecommittee.app.domain.deserialization.impl;
import org.json.simple.JSONObject;
@@ -10,7 +10,6 @@ import com.sap.sailing.server.gateway.serialization.impl.BoatClassJsonSerializer
public class BoatClassJsonDeserializer implements JsonDeserializer<BoatClass> {
@Override
public BoatClass deserialize(JSONObject object)
throws JsonDeserializationException {
String name = object.get(BoatClassJsonSerializer.FIELD_NAME).toString();
@@ -0,0 +1,20 @@
package com.sap.sailing.racecommittee.app.domain.deserialization.impl;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.common.Color;
import com.sap.sailing.domain.common.impl.RGBColor;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
public class ColorDeserializer implements JsonDeserializer<Color> {
public Color deserialize(JSONObject object)
throws JsonDeserializationException {
Number red = (Number) object.get("r");
Number green = (Number) object.get("g");
Number blue = (Number) object.get("b");
return new RGBColor(red.intValue(), green.intValue(), blue.intValue());
}
}
@@ -1,22 +1,22 @@
package com.sap.sailing.server.gateway.deserialization.impl;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.CourseArea;
import com.sap.sailing.domain.base.impl.CourseAreaImpl;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.serialization.impl.CourseAreaJsonSerializer;
public class CourseAreaJsonDeserializer implements JsonDeserializer<CourseArea> {
@Override
public CourseArea deserialize(JSONObject object)
throws JsonDeserializationException {
String name = object.get(CourseAreaJsonSerializer.FIELD_NAME).toString();
String id = object.get(CourseAreaJsonSerializer.FIELD_ID).toString();
return new CourseAreaImpl(name, Helpers.tryUuidConversion(id));
}
}
package com.sap.sailing.racecommittee.app.domain.deserialization.impl;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.CourseArea;
import com.sap.sailing.domain.base.impl.CourseAreaImpl;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.Helpers;
import com.sap.sailing.server.gateway.serialization.impl.CourseAreaJsonSerializer;
public class CourseAreaJsonDeserializer implements JsonDeserializer<CourseArea> {
public CourseArea deserialize(JSONObject object)
throws JsonDeserializationException {
String name = object.get(CourseAreaJsonSerializer.FIELD_NAME).toString();
String id = object.get(CourseAreaJsonSerializer.FIELD_ID).toString();
return new CourseAreaImpl(name, Helpers.tryUuidConversion(id));
}
}
@@ -1,4 +1,4 @@
package com.sap.sailing.server.gateway.deserialization.impl;
package com.sap.sailing.racecommittee.app.domain.deserialization.impl;
import org.json.simple.JSONObject;
@@ -7,6 +7,7 @@ import com.sap.sailing.domain.base.Venue;
import com.sap.sailing.domain.base.impl.EventImpl;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.Helpers;
import com.sap.sailing.server.gateway.serialization.impl.EventJsonSerializer;
public class EventJsonDeserializer implements JsonDeserializer<Event> {
@@ -0,0 +1,32 @@
package com.sap.sailing.racecommittee.app.domain.deserialization.impl;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.impl.FleetImpl;
import com.sap.sailing.domain.common.Color;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.Helpers;
public class FleetDeserializer implements JsonDeserializer<Fleet> {
private JsonDeserializer<Color> colorDeserializer;
public FleetDeserializer(JsonDeserializer<Color> colorDeserializer) {
this.colorDeserializer = colorDeserializer;
}
public Fleet deserialize(JSONObject object)
throws JsonDeserializationException {
Color color = null;
if (object.containsKey("color")) {
color = colorDeserializer.deserialize(Helpers.getNestedObjectSafe(object, "color"));
}
String name = object.get("name").toString();
Number ordering = (Number) object.get("ordering");
return new FleetImpl(name, ordering.intValue(), color);
}
}
@@ -0,0 +1,35 @@
package com.sap.sailing.racecommittee.app.domain.deserialization.impl;
import java.util.ArrayList;
import java.util.Collection;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.FleetWithRaceNames;
import com.sap.sailing.domain.base.impl.FleetWithRaceNamesImpl;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.Helpers;
public class FleetWithRaceNamesDeserializer implements JsonDeserializer<FleetWithRaceNames> {
private JsonDeserializer<Fleet> fleetDeserializer;
public FleetWithRaceNamesDeserializer(
JsonDeserializer<Fleet> fleetDeserializer) {
this.fleetDeserializer = fleetDeserializer;
}
public FleetWithRaceNames deserialize(JSONObject object)
throws JsonDeserializationException {
Fleet fleet = fleetDeserializer.deserialize(object);
Collection<String> raceNames = new ArrayList<String>();
for (Object raceName : Helpers.getNestedArraySafe(object, "races")) {
raceNames.add(raceName.toString());
}
return new FleetWithRaceNamesImpl(fleet, raceNames);
}
}
@@ -0,0 +1,33 @@
package com.sap.sailing.racecommittee.app.domain.deserialization.impl;
import java.util.ArrayList;
import java.util.Collection;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.RaceGroup;
import com.sap.sailing.domain.base.SeriesData;
import com.sap.sailing.domain.base.impl.RaceGroupImpl;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.Helpers;
public class RaceGroupDeserializer implements JsonDeserializer<RaceGroup> {
private JsonDeserializer<SeriesData> seriesDeserializer;
public RaceGroupDeserializer(JsonDeserializer<SeriesData> seriesDeserializer) {
this.seriesDeserializer = seriesDeserializer;
}
public RaceGroup deserialize(JSONObject object)
throws JsonDeserializationException {
String name = object.get("name").toString();
Collection<SeriesData> series = new ArrayList<SeriesData>();
for (Object seriesObject : Helpers.getNestedArraySafe(object, "series")) {
JSONObject seriesJson = Helpers.toJSONObjectSafe(seriesObject);
series.add(seriesDeserializer.deserialize(seriesJson));
}
return new RaceGroupImpl(name, null, series);
}
}
@@ -0,0 +1,37 @@
package com.sap.sailing.racecommittee.app.domain.deserialization.impl;
import java.util.ArrayList;
import java.util.Collection;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.FleetWithRaceNames;
import com.sap.sailing.domain.base.SeriesData;
import com.sap.sailing.racecommittee.app.domain.impl.SeriesDataImpl;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.Helpers;
public class SeriesDataDeserializer implements JsonDeserializer<SeriesData> {
private JsonDeserializer<FleetWithRaceNames> fleetDeserializer;
public SeriesDataDeserializer(JsonDeserializer<FleetWithRaceNames> fleetDeserializer) {
this.fleetDeserializer = fleetDeserializer;
}
public SeriesData deserialize(JSONObject object)
throws JsonDeserializationException {
String name = object.get("name").toString();
boolean isMedal = (Boolean) object.get("isMedal");
Collection<FleetWithRaceNames> fleets = new ArrayList<FleetWithRaceNames>();
for (Object fleetObject : Helpers.getNestedArraySafe(object, "fleets")) {
JSONObject fleetJson = Helpers.toJSONObjectSafe(fleetObject);
fleets.add(fleetDeserializer.deserialize(fleetJson));
}
return new SeriesDataImpl(name, fleets, isMedal);
}
}
@@ -1,4 +1,4 @@
package com.sap.sailing.server.gateway.deserialization.impl;
package com.sap.sailing.racecommittee.app.domain.deserialization.impl;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
@@ -8,6 +8,7 @@ import com.sap.sailing.domain.base.Venue;
import com.sap.sailing.domain.base.impl.VenueImpl;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.Helpers;
import com.sap.sailing.server.gateway.serialization.impl.VenueJsonSerializer;
public class VenueJsonDeserializer implements JsonDeserializer<Venue> {
@@ -17,7 +18,6 @@ public class VenueJsonDeserializer implements JsonDeserializer<Venue> {
this.courseAreaDeserializer = courseAreaDeserializer;
}
@Override
public Venue deserialize(JSONObject object)
throws JsonDeserializationException {
@@ -0,0 +1,50 @@
package com.sap.sailing.racecommittee.app.domain.impl;
import java.io.Serializable;
import com.sap.sailing.domain.base.FleetWithRaceNames;
import com.sap.sailing.domain.base.RaceGroup;
import com.sap.sailing.domain.base.SeriesData;
import com.sap.sailing.racecommittee.app.domain.ManagedRaceIdentifier;
public class ManagedRaceIdentifierImpl implements ManagedRaceIdentifier {
private String raceName;
private FleetWithRaceNames fleetWithRaceNames;
private SeriesData series;
private RaceGroup raceGroup;
public ManagedRaceIdentifierImpl(String raceName,
FleetWithRaceNames fleetWithRaceNames, SeriesData series,
RaceGroup raceGroup) {
this.raceName = raceName;
this.fleetWithRaceNames = fleetWithRaceNames;
this.series = series;
this.raceGroup = raceGroup;
}
public String getRaceName() {
return raceName;
}
public FleetWithRaceNames getFleet() {
return fleetWithRaceNames;
}
public SeriesData getSeries() {
return series;
}
public RaceGroup getRaceGroup() {
return raceGroup;
}
public Serializable getId() {
return String.format("%s.%s.%s.%s",
getRaceGroup().getName(),
getSeries().getName(),
getFleet().getName(),
getRaceName());
}
}
@@ -2,68 +2,54 @@ package com.sap.sailing.racecommittee.app.domain.impl;
import java.io.Serializable;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.FleetWithRaceNames;
import com.sap.sailing.domain.base.RaceGroup;
import com.sap.sailing.domain.base.SeriesData;
import com.sap.sailing.racecommittee.app.domain.ManagedRace;
import com.sap.sailing.racecommittee.app.domain.ManagedRaceIdentifier;
import com.sap.sailing.racecommittee.app.domain.RaceStatus;
import com.sap.sailing.racecommittee.app.domain.SeriesData;
public class ManagedRaceImpl implements ManagedRace {
private static final long serialVersionUID = -4936566684992524001L;
//private static final String TAG = ManagedRace.class.getName();
private ManagedRaceIdentifier identifier;
private RaceDefinition raceDefinition;
private Regatta regatta;
private BoatClass boatClass;
private SeriesData seriesData;
private Fleet fleet;
public ManagedRaceImpl(
RaceDefinition raceDefinition,
Regatta regatta,
BoatClass boatClass,
SeriesData seriesData,
Fleet fleet) {
this.raceDefinition = raceDefinition;
this.regatta = regatta;
this.boatClass = boatClass;
this.seriesData = seriesData;
this.fleet = fleet;
public ManagedRaceImpl(ManagedRaceIdentifier identifier) {
this.identifier = identifier;
}
public Serializable getId() {
return raceDefinition.getId();
return identifier.getId();
}
public String getName() {
return raceDefinition.getName();
return identifier.getRaceName();
}
public Regatta getRegatta() {
return regatta;
public String getRaceName() {
return getName();
}
public RaceDefinition getRaceDefinition() {
return raceDefinition;
public FleetWithRaceNames getFleet() {
return identifier.getFleet();
}
public SeriesData getSeries() {
return identifier.getSeries();
}
public RaceGroup getRaceGroup() {
return identifier.getRaceGroup();
}
public ManagedRaceIdentifier getIdentifier() {
return identifier;
}
public RaceStatus getStatus() {
return RaceStatus.UNKNOWN;
}
public BoatClass getBoatClass() {
return boatClass;
}
public SeriesData getSeriesData() {
return seriesData;
}
public Fleet getFleet() {
return fleet;
}
}
@@ -1,7 +1,7 @@
package com.sap.sailing.racecommittee.app.domain.impl;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.racecommittee.app.domain.SeriesData;
import com.sap.sailing.domain.base.SeriesData;
public class SeriesDataImpl implements SeriesData {
private static final long serialVersionUID = 8825402393444809944L;
@@ -28,9 +28,4 @@ public class SeriesDataImpl implements SeriesData {
return isMedal;
}
public Integer getOrderNumber() {
/// TODO: implement order number on seriesdata
return 0;
}
}
@@ -2,7 +2,7 @@ package com.sap.sailing.racecommittee.app.ui.adapters.racelist;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.racecommittee.app.domain.SeriesData;
import com.sap.sailing.domain.base.SeriesData;
public class BoatClassSeriesDataFleet {
@@ -2,7 +2,7 @@ package com.sap.sailing.racecommittee.app.ui.adapters.racelist;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.racecommittee.app.domain.SeriesData;
import com.sap.sailing.domain.base.SeriesData;
public class RaceListDataTypeTitle extends RaceListDataType {
@@ -7,6 +7,7 @@ import com.sap.sailing.domain.common.Named;
public class NamedRaceComparator extends RaceNameComparator implements Comparator<Named> {
public int compare(Named lhs, Named rhs) {
String left = lhs.getName();
String right = rhs.getName();
@@ -5,7 +5,7 @@ import java.util.Comparator;
import com.sap.sailing.racecommittee.app.ui.adapters.racelist.RaceListDataTypeElement;
public class RaceListDataTypeElementComparator extends RaceNameComparator implements Comparator<RaceListDataTypeElement> {
public int compare(RaceListDataTypeElement lhs, RaceListDataTypeElement rhs) {
String leftRaceName = lhs.getRaceName();
String rightRaceName = rhs.getRaceName();
@@ -19,9 +19,9 @@ public class RaceListDataTypeTitleComparator implements Comparator<RaceListDataT
if (left.getSeries().getName() == null || right.getSeries().getName() == null)
return 0;
int seriesResult = left.getSeries().getOrderNumber().compareTo(right.getSeries().getOrderNumber());
/*int seriesResult = left.getSeries().getOrderNumber().compareTo(right.getSeries().getOrderNumber());
if (seriesResult != 0)
return seriesResult;
return seriesResult;*/
if (left.getFleet().getName() == null || right.getFleet().getName() == null)
return 0;
@@ -1,9 +1,15 @@
package com.sap.sailing.racecommittee.app.ui.comparators;
import java.util.Comparator;
import com.sap.sailing.racecommittee.app.utils.AlphanumComparator;
public abstract class RaceNameComparator {
private Comparator<String> comparator;
public RaceNameComparator() {
super();
this.comparator = new AlphanumComparator();
}
/**
@@ -13,13 +19,7 @@ public abstract class RaceNameComparator {
* @return the comparison result (see String.compareTo)
*/
protected int compareRaceNames(String leftRaceName, String rightRaceName) {
leftRaceName = leftRaceName.replace("Race ", "");
rightRaceName = rightRaceName.replace("Race ", "");
Integer leftRaceNumber = Integer.valueOf(leftRaceName);
Integer rightRaceNumber = Integer.valueOf(rightRaceName);
return leftRaceNumber.compareTo(rightRaceNumber);
return comparator.compare(leftRaceName, rightRaceName);
}
}
@@ -7,11 +7,11 @@ import com.sap.sailing.racecommittee.app.ui.adapters.racelist.BoatClassSeriesDat
public class SeriesComparator implements Comparator<BoatClassSeriesDataFleet> {
public int compare(BoatClassSeriesDataFleet lhs, BoatClassSeriesDataFleet rhs) {
int result = lhs.getSeries().getOrderNumber().compareTo(rhs.getSeries().getOrderNumber());
if (result == 0) {
//int result = lhs.getSeries().getOrderNumber().compareTo(rhs.getSeries().getOrderNumber());
//if (result == 0) {
return lhs.getFleetName().compareTo(rhs.getFleetName());
}
return result;
//}
//return result;
}
}
@@ -14,6 +14,7 @@ import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import com.sap.sailing.domain.base.impl.BoatClassImpl;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.domain.ManagedRace;
import com.sap.sailing.racecommittee.app.domain.RaceStatus;
@@ -106,7 +107,7 @@ public class ManagedRaceListFragment extends ListFragment implements JuryFlagCli
// Group Managed Races by boat class and group
for (ManagedRace m : managedRacesById.values()) {
BoatClassSeriesDataFleet ser =
new BoatClassSeriesDataFleet(m.getBoatClass(), m.getSeriesData(), m.getFleet());
new BoatClassSeriesDataFleet(new BoatClassImpl("A", false), m.getSeries(), m.getFleet());
if (raceListHashMap.containsKey(ser)) {
raceListHashMap.get(ser).add(m);
@@ -0,0 +1,123 @@
package com.sap.sailing.racecommittee.app.utils;
/*
* The Alphanum Algorithm is an improved sorting algorithm for strings
* containing numbers. Instead of sorting numbers in ASCII order like
* a standard sort, this algorithm sorts numbers in numeric order.
*
* The Alphanum Algorithm is discussed at http://www.DaveKoelle.com
*
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
import java.util.Comparator;
/**
* This is an updated version with enhancements made by Daniel Migowski,
* Andre Bogus, and David Koelle
*
* To convert to use Templates (Java 1.5+):
* - Change "implements Comparator" to "implements Comparator<String>"
* - Change "compare(Object o1, Object o2)" to "compare(String s1, String s2)"
* - Remove the type checking and casting in compare().
*
* To use this class:
* Use the static "sort" method from the java.util.Collections class:
* Collections.sort(your list, new AlphanumComparator());
*/
public class AlphanumComparator implements Comparator<String>
{
private final boolean isDigit(char ch)
{
return ch >= 48 && ch <= 57;
}
/** Length of string is passed in for improved efficiency (only need to calculate it once) **/
private final String getChunk(String s, int slength, int marker)
{
StringBuilder chunk = new StringBuilder();
char c = s.charAt(marker);
chunk.append(c);
marker++;
if (isDigit(c))
{
while (marker < slength)
{
c = s.charAt(marker);
if (!isDigit(c))
break;
chunk.append(c);
marker++;
}
} else
{
while (marker < slength)
{
c = s.charAt(marker);
if (isDigit(c))
break;
chunk.append(c);
marker++;
}
}
return chunk.toString();
}
public int compare(String s1, String s2) {
int thisMarker = 0;
int thatMarker = 0;
int s1Length = s1.length();
int s2Length = s2.length();
while (thisMarker < s1Length && thatMarker < s2Length)
{
String thisChunk = getChunk(s1, s1Length, thisMarker);
thisMarker += thisChunk.length();
String thatChunk = getChunk(s2, s2Length, thatMarker);
thatMarker += thatChunk.length();
// If both chunks contain numeric characters, sort them numerically
int result = 0;
if (isDigit(thisChunk.charAt(0)) && isDigit(thatChunk.charAt(0)))
{
// Simple chunk comparison by length.
int thisChunkLength = thisChunk.length();
result = thisChunkLength - thatChunk.length();
// If equal, the first different number counts
if (result == 0)
{
for (int i = 0; i < thisChunkLength; i++)
{
result = thisChunk.charAt(i) - thatChunk.charAt(i);
if (result != 0)
{
return result;
}
}
}
} else
{
result = thisChunk.compareTo(thatChunk);
}
if (result != 0)
return result;
}
return s1Length - s2Length;
}
}