mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-10 06:10:56 +00:00
Merge branch 'master' into jbross-dependent-race-start
Conflicts: java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CalculateImageSizeFromUrlTest.java java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java mobile/com.sap.sailing.racecommittee.app/res/values-de/strings.xml mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OfflineDataManager.java mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceFragment.java mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/ProtestTimeDialogFragment.java mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/RaceFinishingTimeDialog.java
This commit is contained in:
commit
535654593c
2045 files changed
+50038
-12668
No files matched your search
+8
-2
@@ -18,6 +18,7 @@ import com.sap.sailing.server.gateway.deserialization.JsonDeserializationExcepti
|
||||
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
|
||||
import com.sap.sailing.server.gateway.serialization.impl.CompetitorJsonSerializer;
|
||||
import com.sap.sse.common.Color;
|
||||
import com.sap.sse.common.impl.MillisecondsDurationImpl;
|
||||
import com.sap.sse.common.impl.RGBColor;
|
||||
|
||||
public class CompetitorJsonDeserializer implements JsonDeserializer<Competitor> {
|
||||
@@ -82,8 +83,13 @@ public class CompetitorJsonDeserializer implements JsonDeserializer<Competitor>
|
||||
boat = boatJsonDeserializer.deserialize(Helpers.getNestedObjectSafe(object,
|
||||
CompetitorJsonSerializer.FIELD_BOAT));
|
||||
}
|
||||
|
||||
Competitor competitor = competitorStore.getOrCreateCompetitor(competitorId, name, displayColor, email, flagImageURI, team, boat);
|
||||
final Double timeOnTimeFactor = (Double) object.get(CompetitorJsonSerializer.FIELD_TIME_ON_TIME_FACTOR);
|
||||
final Double timeOnDistanceAllowanceInSecondsPerNauticalMile = (Double) object
|
||||
.get(CompetitorJsonSerializer.FIELD_TIME_ON_DISTANCE_ALLOWANCE_IN_SECONDS_PER_NAUTICAL_MILE);
|
||||
Competitor competitor = competitorStore.getOrCreateCompetitor(competitorId, name, displayColor, email,
|
||||
flagImageURI, team, boat, timeOnTimeFactor,
|
||||
timeOnDistanceAllowanceInSecondsPerNauticalMile == null ? null :
|
||||
new MillisecondsDurationImpl((long) (timeOnDistanceAllowanceInSecondsPerNauticalMile*1000)));
|
||||
return competitor;
|
||||
} catch (Exception e) {
|
||||
throw new JsonDeserializationException(e);
|
||||
|
||||
+143
-30
@@ -3,7 +3,10 @@ package com.sap.sailing.server.gateway.deserialization.impl;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
import org.json.simple.JSONArray;
|
||||
@@ -17,7 +20,15 @@ import com.sap.sailing.domain.common.impl.ImageSizeImpl;
|
||||
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
|
||||
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
|
||||
import com.sap.sailing.server.gateway.serialization.impl.EventBaseJsonSerializer;
|
||||
import com.sap.sse.common.TimePoint;
|
||||
import com.sap.sse.common.Util;
|
||||
import com.sap.sse.common.impl.MillisecondsTimePoint;
|
||||
import com.sap.sse.common.media.ImageDescriptor;
|
||||
import com.sap.sse.common.media.ImageDescriptorImpl;
|
||||
import com.sap.sse.common.media.ImageSize;
|
||||
import com.sap.sse.common.media.MimeType;
|
||||
import com.sap.sse.common.media.VideoDescriptor;
|
||||
import com.sap.sse.common.media.VideoDescriptorImpl;
|
||||
|
||||
public class EventBaseJsonDeserializer implements JsonDeserializer<EventBase> {
|
||||
private final JsonDeserializer<Venue> venueDeserializer;
|
||||
@@ -28,22 +39,21 @@ public class EventBaseJsonDeserializer implements JsonDeserializer<EventBase> {
|
||||
this.leaderboardGroupDeserializer = leaderboardGroupDeserializer;
|
||||
}
|
||||
|
||||
public EventBase deserialize(JSONObject object) throws JsonDeserializationException {
|
||||
UUID id = UUID.fromString((String) object.get(EventBaseJsonSerializer.FIELD_ID));
|
||||
String name = (String) object.get(EventBaseJsonSerializer.FIELD_NAME);
|
||||
String description = (String) object.get(EventBaseJsonSerializer.FIELD_DESCRIPTION);
|
||||
String officialWebsiteURLAsString = (String) object.get(EventBaseJsonSerializer.FIELD_OFFICIAL_WEBSITE_URL);
|
||||
String logoImageURLAsString = (String) object.get(EventBaseJsonSerializer.FIELD_LOGO_IMAGE_URL);
|
||||
Number startDate = (Number) object.get(EventBaseJsonSerializer.FIELD_START_DATE);
|
||||
Number endDate = (Number) object.get(EventBaseJsonSerializer.FIELD_END_DATE);
|
||||
public EventBase deserialize(JSONObject eventJson) throws JsonDeserializationException {
|
||||
UUID id = UUID.fromString((String) eventJson.get(EventBaseJsonSerializer.FIELD_ID));
|
||||
String name = (String) eventJson.get(EventBaseJsonSerializer.FIELD_NAME);
|
||||
String description = (String) eventJson.get(EventBaseJsonSerializer.FIELD_DESCRIPTION);
|
||||
String officialWebsiteURLAsString = (String) eventJson.get(EventBaseJsonSerializer.FIELD_OFFICIAL_WEBSITE_URL);
|
||||
Number startDate = (Number) eventJson.get(EventBaseJsonSerializer.FIELD_START_DATE);
|
||||
Number endDate = (Number) eventJson.get(EventBaseJsonSerializer.FIELD_END_DATE);
|
||||
final Venue venue;
|
||||
if (object.get(EventBaseJsonSerializer.FIELD_VENUE) != null) {
|
||||
JSONObject venueObject = Helpers.getNestedObjectSafe(object, EventBaseJsonSerializer.FIELD_VENUE);
|
||||
if (eventJson.get(EventBaseJsonSerializer.FIELD_VENUE) != null) {
|
||||
JSONObject venueObject = Helpers.getNestedObjectSafe(eventJson, EventBaseJsonSerializer.FIELD_VENUE);
|
||||
venue = venueDeserializer.deserialize(venueObject);
|
||||
} else {
|
||||
venue = null;
|
||||
}
|
||||
JSONArray leaderboardGroupsJson = (JSONArray) object.get(EventBaseJsonSerializer.FIELDS_LEADERBOARD_GROUPS);
|
||||
JSONArray leaderboardGroupsJson = (JSONArray) eventJson.get(EventBaseJsonSerializer.FIELDS_LEADERBOARD_GROUPS);
|
||||
List<LeaderboardGroupBase> leaderboardGroups = new ArrayList<LeaderboardGroupBase>();
|
||||
if (leaderboardGroupsJson != null) {
|
||||
for (Object lgJson : leaderboardGroupsJson) {
|
||||
@@ -60,40 +70,75 @@ public class EventBaseJsonDeserializer implements JsonDeserializer<EventBase> {
|
||||
throw new JsonDeserializationException("Error deserializing official website URL for event "+name, e);
|
||||
}
|
||||
}
|
||||
JSONArray imagesJson = (JSONArray) eventJson.get(EventBaseJsonSerializer.FIELD_IMAGES);
|
||||
if (imagesJson != null) {
|
||||
for (Object imageJson : imagesJson) {
|
||||
ImageDescriptor imgaeDescriptor = loadImage((JSONObject) imageJson);
|
||||
if (imgaeDescriptor != null) {
|
||||
result.addImage(imgaeDescriptor);
|
||||
}
|
||||
}
|
||||
}
|
||||
JSONArray videosJson = (JSONArray) eventJson.get(EventBaseJsonSerializer.FIELD_VIDEOS);
|
||||
if (videosJson != null) {
|
||||
for (Object videoJson : videosJson) {
|
||||
VideoDescriptor videoDescriptor = loadVideo((JSONObject) videoJson);
|
||||
if (videoDescriptor != null) {
|
||||
result.addVideo(videoDescriptor);
|
||||
}
|
||||
}
|
||||
}
|
||||
// if we read an event with data in the old image/video format we need migrate them
|
||||
if(Util.size(result.getImages()) == 0 && Util.size(result.getVideos()) == 0) {
|
||||
readImageAndVideoURLsFromLegacyServer(eventJson, result);
|
||||
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private void readImageAndVideoURLsFromLegacyServer(JSONObject eventJson, StrippedEventImpl event) throws JsonDeserializationException {
|
||||
URL logoImageURL = null;
|
||||
List<URL> imageURLs = new ArrayList<URL>();
|
||||
List<URL> sponsorImageURLs = new ArrayList<URL>();
|
||||
List<URL> videoURLs = new ArrayList<URL>();
|
||||
|
||||
String logoImageURLAsString = (String) eventJson.get(EventBaseJsonSerializer.FIELD_LOGO_IMAGE_URL);
|
||||
if (logoImageURLAsString != null) {
|
||||
try {
|
||||
result.setLogoImageURL(new URL(logoImageURLAsString));
|
||||
logoImageURL = new URL(logoImageURLAsString);
|
||||
} catch (MalformedURLException e) {
|
||||
throw new JsonDeserializationException("Error deserializing logo image URL for event "+name, e);
|
||||
throw new JsonDeserializationException("Error deserializing logo image URL for event "+event.getName(), e);
|
||||
}
|
||||
}
|
||||
if (object.get(EventBaseJsonSerializer.FIELD_IMAGE_URLS) != null) {
|
||||
if (eventJson.get(EventBaseJsonSerializer.FIELD_IMAGE_URLS) != null) {
|
||||
try {
|
||||
result.setImageURLs(getURLsFromStrings(Helpers.getNestedArraySafe(object, EventBaseJsonSerializer.FIELD_IMAGE_URLS)));
|
||||
imageURLs = getURLsFromStrings(Helpers.getNestedArraySafe(eventJson, EventBaseJsonSerializer.FIELD_IMAGE_URLS));
|
||||
} catch (MalformedURLException e) {
|
||||
throw new JsonDeserializationException("Error deserializing image URLs for event "+name, e);
|
||||
throw new JsonDeserializationException("Error deserializing image URLs for event "+event.getName(), e);
|
||||
}
|
||||
}
|
||||
if (object.get(EventBaseJsonSerializer.FIELD_VIDEO_URLS) != null) {
|
||||
if (eventJson.get(EventBaseJsonSerializer.FIELD_VIDEO_URLS) != null) {
|
||||
try {
|
||||
result.setVideoURLs(getURLsFromStrings(Helpers.getNestedArraySafe(object, EventBaseJsonSerializer.FIELD_VIDEO_URLS)));
|
||||
videoURLs = getURLsFromStrings(Helpers.getNestedArraySafe(eventJson, EventBaseJsonSerializer.FIELD_VIDEO_URLS));
|
||||
} catch (MalformedURLException e) {
|
||||
throw new JsonDeserializationException("Error deserializing video URLs for event "+name, e);
|
||||
throw new JsonDeserializationException("Error deserializing video URLs for event "+event.getName(), e);
|
||||
}
|
||||
}
|
||||
if (object.get(EventBaseJsonSerializer.FIELD_SPONSOR_IMAGE_URLS) != null) {
|
||||
if (eventJson.get(EventBaseJsonSerializer.FIELD_SPONSOR_IMAGE_URLS) != null) {
|
||||
try {
|
||||
result.setSponsorImageURLs(getURLsFromStrings(Helpers.getNestedArraySafe(object, EventBaseJsonSerializer.FIELD_SPONSOR_IMAGE_URLS)));
|
||||
sponsorImageURLs = getURLsFromStrings(Helpers.getNestedArraySafe(eventJson, EventBaseJsonSerializer.FIELD_SPONSOR_IMAGE_URLS));
|
||||
} catch (MalformedURLException e) {
|
||||
throw new JsonDeserializationException("Error deserializing sponsor image URLs for event "+name, e);
|
||||
throw new JsonDeserializationException("Error deserializing sponsor image URLs for event "+event.getName(), e);
|
||||
}
|
||||
}
|
||||
JSONArray imageSizes = (JSONArray) object.get(EventBaseJsonSerializer.FIELD_IMAGE_SIZES);
|
||||
if (imageSizes != null) {
|
||||
for (Object imageURLAndSizeObject : imageSizes) {
|
||||
}
|
||||
// handle images sizes coming from an old server instance not having images and videos in the rich format
|
||||
Map<URL, ImageSize> imageSizes = new HashMap<URL, ImageSize>();;
|
||||
JSONArray imageSizesJson = (JSONArray) eventJson.get(EventBaseJsonSerializer.FIELD_IMAGE_SIZES);
|
||||
if (imageSizesJson != null) {
|
||||
for (Object imageURLAndSizeObject : imageSizesJson) {
|
||||
JSONObject imageURLAndSizeJson = (JSONObject) imageURLAndSizeObject;
|
||||
try {
|
||||
result.setImageSize(
|
||||
imageSizes.put(
|
||||
new URL((String) imageURLAndSizeJson.get(EventBaseJsonSerializer.FIELD_IMAGE_URL)),
|
||||
new ImageSizeImpl(
|
||||
((Number) imageURLAndSizeJson.get(EventBaseJsonSerializer.FIELD_IMAGE_WIDTH)).intValue(),
|
||||
@@ -103,10 +148,79 @@ public class EventBaseJsonDeserializer implements JsonDeserializer<EventBase> {
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
event.setMediaURLs(imageURLs, sponsorImageURLs, videoURLs, logoImageURL, imageSizes);
|
||||
}
|
||||
|
||||
private Iterable<URL> getURLsFromStrings(JSONArray strings) throws MalformedURLException {
|
||||
private ImageDescriptor loadImage(JSONObject imageJson) {
|
||||
ImageDescriptor image = null;
|
||||
URL imageURL = Helpers.getURLField(imageJson, EventBaseJsonSerializer.FIELD_SOURCE_URL);
|
||||
if (imageURL != null) {
|
||||
String title = (String) imageJson.get(EventBaseJsonSerializer.FIELD_TITLE);
|
||||
String subtitle = (String) imageJson.get(EventBaseJsonSerializer.FIELD_SUBTITLE);
|
||||
String copyright = (String) imageJson.get(EventBaseJsonSerializer.FIELD_COPYRIGHT);
|
||||
String localeRaw = (String) imageJson.get(EventBaseJsonSerializer.FIELD_LOCALE);
|
||||
// TODO use Locale.forLanguageTag(localeRaw) -> only possible with Android API Level 21
|
||||
Locale locale = localeRaw != null ? new Locale(localeRaw) : null;
|
||||
Number imageWidth = (Number) imageJson.get(EventBaseJsonSerializer.FIELD_IMAGE_WIDTH_IN_PX);
|
||||
Number imageHeight = (Number) imageJson.get(EventBaseJsonSerializer.FIELD_IMAGE_HEIGHT_IN_PX);
|
||||
Number createdAtDateInMs = (Number) imageJson.get(EventBaseJsonSerializer.FIELD_CREATEDATDATE);
|
||||
TimePoint createdAtDate = createdAtDateInMs != null ? new MillisecondsTimePoint(createdAtDateInMs.longValue()) : null;
|
||||
JSONArray tags = (JSONArray) imageJson.get(EventBaseJsonSerializer.FIELD_TAGS);
|
||||
List<String> imageTags = new ArrayList<String>();
|
||||
if (tags != null) {
|
||||
for (Object tagObject : tags) {
|
||||
imageTags.add((String) tagObject);
|
||||
}
|
||||
}
|
||||
image = new ImageDescriptorImpl(imageURL, createdAtDate);
|
||||
image.setCopyright(copyright);
|
||||
image.setLocale(locale);
|
||||
image.setTitle(title);
|
||||
image.setSubtitle(subtitle);
|
||||
image.setTags(imageTags);
|
||||
if (imageWidth != null && imageHeight != null) {
|
||||
image.setSize(imageWidth.intValue(), imageHeight.intValue());
|
||||
}
|
||||
}
|
||||
return image;
|
||||
}
|
||||
|
||||
private VideoDescriptor loadVideo(JSONObject videoJson) {
|
||||
VideoDescriptor video = null;
|
||||
URL videoURL = Helpers.getURLField(videoJson, EventBaseJsonSerializer.FIELD_SOURCE_URL);
|
||||
if(videoURL != null) {
|
||||
String title = (String) videoJson.get(EventBaseJsonSerializer.FIELD_TITLE);
|
||||
String subtitle = (String) videoJson.get(EventBaseJsonSerializer.FIELD_SUBTITLE);
|
||||
String copyright = (String) videoJson.get(EventBaseJsonSerializer.FIELD_COPYRIGHT);
|
||||
String localeRaw = (String) videoJson.get(EventBaseJsonSerializer.FIELD_LOCALE);
|
||||
// TODO use Locale.forLanguageTag(localeRaw) -> only possible with Android API Level 21
|
||||
Locale locale = localeRaw != null ? new Locale(localeRaw) : null;
|
||||
Object mimeTypeRaw = videoJson.get(EventBaseJsonSerializer.FIELD_MIMETYPE);
|
||||
MimeType mimeType = mimeTypeRaw == null ? null : MimeType.valueOf((String) mimeTypeRaw);
|
||||
Number createdAtDateInMs = (Number) videoJson.get(EventBaseJsonSerializer.FIELD_CREATEDATDATE);
|
||||
TimePoint createdAtDate = createdAtDateInMs != null ? new MillisecondsTimePoint(createdAtDateInMs.longValue()) : null;
|
||||
JSONArray tags = (JSONArray) videoJson.get(EventBaseJsonSerializer.FIELD_TAGS);
|
||||
Integer lengthInSeconds = (Integer) videoJson.get(EventBaseJsonSerializer.FIELD_VIDEO_LENGTH_IN_SECONDS);
|
||||
URL thumbnailURL = Helpers.getURLField(videoJson, EventBaseJsonSerializer.FIELD_VIDEO_THUMBNAIL_URL);
|
||||
List<String> videoTags = new ArrayList<String>();
|
||||
if (tags != null) {
|
||||
for (Object tagObject : tags) {
|
||||
videoTags.add((String) tagObject);
|
||||
}
|
||||
}
|
||||
video = new VideoDescriptorImpl(videoURL, mimeType, createdAtDate);
|
||||
video.setCopyright(copyright);
|
||||
video.setLocale(locale);
|
||||
video.setTitle(title);
|
||||
video.setSubtitle(subtitle);
|
||||
video.setTags(videoTags);
|
||||
video.setLengthInSeconds(lengthInSeconds);
|
||||
video.setThumbnailURL(thumbnailURL);
|
||||
}
|
||||
return video;
|
||||
}
|
||||
|
||||
private List<URL> getURLsFromStrings(JSONArray strings) throws MalformedURLException {
|
||||
List<URL> result = new ArrayList<URL>();
|
||||
if (strings != null) {
|
||||
for (Object string : strings) {
|
||||
@@ -115,5 +229,4 @@ public class EventBaseJsonDeserializer implements JsonDeserializer<EventBase> {
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
+15
@@ -1,6 +1,8 @@
|
||||
package com.sap.sailing.server.gateway.deserialization.impl;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.util.UUID;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
@@ -48,6 +50,19 @@ public class Helpers {
|
||||
return (JSONArray) childObject;
|
||||
}
|
||||
|
||||
public static URL getURLField(JSONObject parent, String fieldName) {
|
||||
URL result = null;
|
||||
String urlAsString = (String) parent.get(fieldName);
|
||||
if (urlAsString != null) {
|
||||
try {
|
||||
result = new URL(urlAsString);
|
||||
} catch (MalformedURLException e) {
|
||||
logger.severe("Error deserializing URL " + urlAsString);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static Serializable tryUuidConversion(Serializable serializableId) {
|
||||
try {
|
||||
return UUID.fromString(serializableId.toString());
|
||||
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
package com.sap.sailing.server.gateway.deserialization.impl;
|
||||
|
||||
import com.sap.sailing.domain.base.configuration.RacingProcedureConfiguration;
|
||||
import com.sap.sailing.domain.base.configuration.impl.LeagueConfigurationImpl;
|
||||
import com.sap.sailing.domain.base.configuration.procedures.LeagueConfiguration;
|
||||
import com.sap.sailing.domain.common.racelog.Flags;
|
||||
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
|
||||
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
public class LeagueConfigurationJsonDeserializer extends RacingProcedureConfigurationJsonDeserializer implements
|
||||
JsonDeserializer<RacingProcedureConfiguration> {
|
||||
|
||||
public static LeagueConfigurationJsonDeserializer create() {
|
||||
return new LeagueConfigurationJsonDeserializer();
|
||||
}
|
||||
|
||||
public LeagueConfigurationJsonDeserializer() {
|
||||
super();
|
||||
}
|
||||
|
||||
@Override
|
||||
public LeagueConfiguration deserialize(JSONObject object) throws JsonDeserializationException {
|
||||
return (LeagueConfiguration) super.deserialize(object);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected LeagueConfiguration createResult(JSONObject object, Boolean individualRecall, Flags classFlag)
|
||||
throws JsonDeserializationException {
|
||||
LeagueConfigurationImpl result = new LeagueConfigurationImpl();
|
||||
result.setClassFlag(classFlag);
|
||||
result.setHasInidividualRecall(individualRecall);
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
+12
-4
@@ -1,39 +1,41 @@
|
||||
package com.sap.sailing.server.gateway.deserialization.impl;
|
||||
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
import com.sap.sailing.domain.base.configuration.RacingProcedureConfiguration;
|
||||
import com.sap.sailing.domain.base.configuration.RegattaConfiguration;
|
||||
import com.sap.sailing.domain.base.configuration.impl.RegattaConfigurationImpl;
|
||||
import com.sap.sailing.domain.base.configuration.procedures.ESSConfiguration;
|
||||
import com.sap.sailing.domain.base.configuration.procedures.GateStartConfiguration;
|
||||
import com.sap.sailing.domain.base.configuration.procedures.LeagueConfiguration;
|
||||
import com.sap.sailing.domain.base.configuration.procedures.RRS26Configuration;
|
||||
import com.sap.sailing.domain.common.CourseDesignerMode;
|
||||
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
|
||||
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
|
||||
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
|
||||
import com.sap.sailing.server.gateway.serialization.impl.RegattaConfigurationJsonSerializer;
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
public class RegattaConfigurationJsonDeserializer implements JsonDeserializer<RegattaConfiguration> {
|
||||
|
||||
public static RegattaConfigurationJsonDeserializer create() {
|
||||
return new RegattaConfigurationJsonDeserializer(RRS26ConfigurationJsonDeserializer.create(),
|
||||
GateStartConfigurationJsonDeserializer.create(), ESSConfigurationJsonDeserializer.create(),
|
||||
RacingProcedureConfigurationJsonDeserializer.create());
|
||||
RacingProcedureConfigurationJsonDeserializer.create(), LeagueConfigurationJsonDeserializer.create());
|
||||
}
|
||||
|
||||
private final RRS26ConfigurationJsonDeserializer rrs26Deserializer;
|
||||
private final GateStartConfigurationJsonDeserializer gateStartDeserializer;
|
||||
private final ESSConfigurationJsonDeserializer essDeserializer;
|
||||
private final RacingProcedureConfigurationJsonDeserializer basicDeserializer;
|
||||
private final LeagueConfigurationJsonDeserializer leagueDeserializer;
|
||||
|
||||
public RegattaConfigurationJsonDeserializer(RRS26ConfigurationJsonDeserializer rrs26,
|
||||
GateStartConfigurationJsonDeserializer gateStart, ESSConfigurationJsonDeserializer ess,
|
||||
RacingProcedureConfigurationJsonDeserializer basicDeserializer) {
|
||||
RacingProcedureConfigurationJsonDeserializer basicDeserializer, LeagueConfigurationJsonDeserializer leagueDeserializer) {
|
||||
this.rrs26Deserializer = rrs26;
|
||||
this.gateStartDeserializer = gateStart;
|
||||
this.essDeserializer = ess;
|
||||
this.basicDeserializer = basicDeserializer;
|
||||
this.leagueDeserializer = leagueDeserializer;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -76,6 +78,12 @@ public class RegattaConfigurationJsonDeserializer implements JsonDeserializer<Re
|
||||
Helpers.getNestedObjectSafe(object, RegattaConfigurationJsonSerializer.FIELD_BASIC));
|
||||
configuration.setBasicConfiguration(basicConfiguration);
|
||||
}
|
||||
|
||||
if (object.containsKey(RegattaConfigurationJsonSerializer.FIELD_LEAGUE)) {
|
||||
LeagueConfiguration leagueConfiguration = leagueDeserializer.deserialize(
|
||||
Helpers.getNestedObjectSafe(object, RegattaConfigurationJsonSerializer.FIELD_LEAGUE));
|
||||
configuration.setLeagueConfiguration(leagueConfiguration);
|
||||
}
|
||||
|
||||
return configuration;
|
||||
}
|
||||
|
||||
+6
@@ -33,6 +33,8 @@ public class CompetitorJsonSerializer implements JsonSerializer<Competitor> {
|
||||
public static final String FIELD_DISPLAY_COLOR = "displayColor";
|
||||
public static final String FIELD_EMAIL = "email";
|
||||
public static final String FIELD_FLAG_IMAGE_URI = "flagImageUri";
|
||||
public static final String FIELD_TIME_ON_TIME_FACTOR = "timeOnTimeFactor";
|
||||
public static final String FIELD_TIME_ON_DISTANCE_ALLOWANCE_IN_SECONDS_PER_NAUTICAL_MILE = "timeOnDistanceAllowanceInSecondsPerNauticalMile";
|
||||
|
||||
private final JsonSerializer<Team> teamJsonSerializer;
|
||||
private final JsonSerializer<Boat> boatJsonSerializer;
|
||||
@@ -86,6 +88,10 @@ public class CompetitorJsonSerializer implements JsonSerializer<Competitor> {
|
||||
if (boatJsonSerializer != null) {
|
||||
result.put(FIELD_BOAT, boatJsonSerializer.serialize(competitor.getBoat()));
|
||||
}
|
||||
result.put(FIELD_TIME_ON_TIME_FACTOR, competitor.getTimeOnTimeFactor());
|
||||
result.put(FIELD_TIME_ON_DISTANCE_ALLOWANCE_IN_SECONDS_PER_NAUTICAL_MILE,
|
||||
competitor.getTimeOnDistanceAllowancePerNauticalMile() == null ? null :
|
||||
competitor.getTimeOnDistanceAllowancePerNauticalMile().asSeconds());
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
+157
-106
@@ -1,106 +1,157 @@
|
||||
package com.sap.sailing.server.gateway.serialization.impl;
|
||||
|
||||
import java.net.URL;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import org.json.simple.JSONArray;
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
import com.sap.sailing.domain.base.EventBase;
|
||||
import com.sap.sailing.domain.base.LeaderboardGroupBase;
|
||||
import com.sap.sailing.domain.base.Venue;
|
||||
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
|
||||
import com.sap.sse.common.media.ImageSize;
|
||||
|
||||
public class EventBaseJsonSerializer implements JsonSerializer<EventBase> {
|
||||
private static final Logger logger = Logger.getLogger(EventBaseJsonSerializer.class.getName());
|
||||
|
||||
public static final String FIELD_ID = "id";
|
||||
public static final String FIELD_NAME = "name";
|
||||
public static final String FIELD_DESCRIPTION = "description";
|
||||
public static final String FIELD_START_DATE = "startDate";
|
||||
public static final String FIELD_END_DATE = "endDate";
|
||||
public static final String FIELD_VENUE = "venue";
|
||||
public static final String FIELD_IMAGE_URLS = "imageURLs";
|
||||
public static final String FIELD_VIDEO_URLS = "videoURLs";
|
||||
public static final String FIELD_SPONSOR_IMAGE_URLS = "sponsorImageURLs";
|
||||
public static final String FIELD_LOGO_IMAGE_URL = "logoImageURL";
|
||||
public static final String FIELD_IMAGE_SIZES = "imageSizes";
|
||||
public static final String FIELD_IMAGE_URL = "imageURL";
|
||||
public static final String FIELD_IMAGE_WIDTH = "imageWidth";
|
||||
public static final String FIELD_IMAGE_HEIGHT = "imageHeight";
|
||||
public static final String FIELD_OFFICIAL_WEBSITE_URL = "officialWebsiteURL";
|
||||
public static final String FIELDS_LEADERBOARD_GROUPS = "leaderboardGroups";
|
||||
|
||||
private final JsonSerializer<Venue> venueSerializer;
|
||||
private final JsonSerializer<? super LeaderboardGroupBase> leaderboardGroupBaseSerializer;
|
||||
|
||||
public EventBaseJsonSerializer(JsonSerializer<Venue> venueSerializer, JsonSerializer<? super LeaderboardGroupBase> leaderboardGroupBaseSerializer) {
|
||||
this.leaderboardGroupBaseSerializer = leaderboardGroupBaseSerializer;
|
||||
this.venueSerializer = venueSerializer;
|
||||
}
|
||||
|
||||
public JSONObject serialize(EventBase event) {
|
||||
JSONObject result = new JSONObject();
|
||||
result.put(FIELD_ID, event.getId().toString());
|
||||
result.put(FIELD_NAME, event.getName());
|
||||
result.put(FIELD_DESCRIPTION, event.getDescription());
|
||||
result.put(FIELD_OFFICIAL_WEBSITE_URL, event.getOfficialWebsiteURL() != null ? event.getOfficialWebsiteURL().toString() : null);
|
||||
result.put(FIELD_LOGO_IMAGE_URL, event.getLogoImageURL() != null ? event.getLogoImageURL().toString() : null);
|
||||
result.put(FIELD_START_DATE, event.getStartDate() != null ? event.getStartDate().asMillis() : null);
|
||||
result.put(FIELD_END_DATE, event.getStartDate() != null ? event.getEndDate().asMillis() : null);
|
||||
result.put(FIELD_VENUE, venueSerializer.serialize(event.getVenue()));
|
||||
result.put(FIELD_IMAGE_URLS, getURLsAsStringArray(event.getImageURLs()));
|
||||
result.put(FIELD_VIDEO_URLS, getURLsAsStringArray(event.getVideoURLs()));
|
||||
result.put(FIELD_SPONSOR_IMAGE_URLS, getURLsAsStringArray(event.getSponsorImageURLs()));
|
||||
JSONArray leaderboardGroups = new JSONArray();
|
||||
result.put(FIELDS_LEADERBOARD_GROUPS, leaderboardGroups);
|
||||
for (LeaderboardGroupBase lg : event.getLeaderboardGroups()) {
|
||||
leaderboardGroups.add(leaderboardGroupBaseSerializer.serialize(lg));
|
||||
}
|
||||
JSONArray imageSizes = new JSONArray();
|
||||
result.put(FIELD_IMAGE_SIZES, imageSizes);
|
||||
for (URL imageURL : event.getImageURLs()) {
|
||||
addImageSize(imageURL, imageSizes, event);
|
||||
}
|
||||
if (event.getLogoImageURL() != null) {
|
||||
addImageSize(event.getLogoImageURL(), imageSizes, event);
|
||||
}
|
||||
for (URL sponsorImageURL : event.getSponsorImageURLs()) {
|
||||
addImageSize(sponsorImageURL, imageSizes, event);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* If <code>eventBase</code> knows the size of the image with URL <code>imageURL</code>, that size is serialized as
|
||||
* JSON object to <code>imageSizes</code>
|
||||
*/
|
||||
private void addImageSize(URL imageURL, JSONArray imageSizes, EventBase eventBase) {
|
||||
ImageSize imageSize;
|
||||
try {
|
||||
imageSize = eventBase.getImageSize(imageURL);
|
||||
if (imageSize != null) {
|
||||
JSONObject imageSizeJson = new JSONObject();
|
||||
imageSizes.add(imageSizeJson);
|
||||
imageSizeJson.put(FIELD_IMAGE_URL, imageURL.toString());
|
||||
imageSizeJson.put(FIELD_IMAGE_WIDTH, imageSize.getWidth());
|
||||
imageSizeJson.put(FIELD_IMAGE_HEIGHT, imageSize.getHeight());
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
logger.log(Level.FINE, "Couldn't retrieve image size for URL "+imageURL, e);
|
||||
} catch (ExecutionException e) {
|
||||
logger.log(Level.FINE, "Couldn't retrieve image size for URL "+imageURL, e);
|
||||
}
|
||||
}
|
||||
|
||||
private JSONArray getURLsAsStringArray(Iterable<URL> urls) {
|
||||
JSONArray jsonImageURLs = new JSONArray();
|
||||
for (URL url : urls) {
|
||||
jsonImageURLs.add(url.toString());
|
||||
}
|
||||
return jsonImageURLs;
|
||||
}
|
||||
}
|
||||
package com.sap.sailing.server.gateway.serialization.impl;
|
||||
|
||||
import java.net.URL;
|
||||
|
||||
import org.json.simple.JSONArray;
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
import com.sap.sailing.domain.base.EventBase;
|
||||
import com.sap.sailing.domain.base.LeaderboardGroupBase;
|
||||
import com.sap.sailing.domain.base.Venue;
|
||||
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
|
||||
import com.sap.sse.common.media.ImageDescriptor;
|
||||
import com.sap.sse.common.media.VideoDescriptor;
|
||||
|
||||
public class EventBaseJsonSerializer implements JsonSerializer<EventBase> {
|
||||
public static final String FIELD_ID = "id";
|
||||
public static final String FIELD_NAME = "name";
|
||||
public static final String FIELD_DESCRIPTION = "description";
|
||||
public static final String FIELD_START_DATE = "startDate";
|
||||
public static final String FIELD_END_DATE = "endDate";
|
||||
public static final String FIELD_VENUE = "venue";
|
||||
public static final String FIELD_IMAGE_URLS = "imageURLs";
|
||||
public static final String FIELD_VIDEO_URLS = "videoURLs";
|
||||
public static final String FIELD_SPONSOR_IMAGE_URLS = "sponsorImageURLs";
|
||||
public static final String FIELD_LOGO_IMAGE_URL = "logoImageURL";
|
||||
public static final String FIELD_IMAGE_SIZES = "imageSizes";
|
||||
public static final String FIELD_IMAGE_URL = "imageURL";
|
||||
public static final String FIELD_IMAGE_WIDTH = "imageWidth";
|
||||
public static final String FIELD_IMAGE_HEIGHT = "imageHeight";
|
||||
public static final String FIELD_VIDEO_URL = "videoURL";
|
||||
public static final String FIELD_OFFICIAL_WEBSITE_URL = "officialWebsiteURL";
|
||||
public static final String FIELDS_LEADERBOARD_GROUPS = "leaderboardGroups";
|
||||
|
||||
public static final String FIELD_SOURCE_URL = "sourceURL";
|
||||
public static final String FIELD_TITLE = "title";
|
||||
public static final String FIELD_SUBTITLE = "subtitle";
|
||||
public static final String FIELD_MIMETYPE = "mimetype";
|
||||
public static final String FIELD_COPYRIGHT = "copyright";
|
||||
public static final String FIELD_CREATEDATDATE = "createdAtDate";
|
||||
public static final String FIELD_LOCALE = "locale";
|
||||
public static final String FIELD_TAGS = "tags";
|
||||
// specific image fields
|
||||
public static final String FIELD_IMAGES = "images";
|
||||
public static final String FIELD_IMAGE_WIDTH_IN_PX = "widthInPixel";
|
||||
public static final String FIELD_IMAGE_HEIGHT_IN_PX = "heightInPixel";
|
||||
// specific video fields
|
||||
public static final String FIELD_VIDEOS = "videos";
|
||||
public static final String FIELD_VIDEO_THUMBNAIL_URL = "thumbnailURL";
|
||||
public static final String FIELD_VIDEO_LENGTH_IN_SECONDS = "lengthInSeconds";
|
||||
|
||||
private final JsonSerializer<Venue> venueSerializer;
|
||||
private final JsonSerializer<? super LeaderboardGroupBase> leaderboardGroupBaseSerializer;
|
||||
|
||||
public EventBaseJsonSerializer(JsonSerializer<Venue> venueSerializer, JsonSerializer<? super LeaderboardGroupBase> leaderboardGroupBaseSerializer) {
|
||||
this.leaderboardGroupBaseSerializer = leaderboardGroupBaseSerializer;
|
||||
this.venueSerializer = venueSerializer;
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public JSONObject serialize(EventBase event) {
|
||||
JSONObject result = new JSONObject();
|
||||
result.put(FIELD_ID, event.getId().toString());
|
||||
result.put(FIELD_NAME, event.getName());
|
||||
result.put(FIELD_DESCRIPTION, event.getDescription());
|
||||
result.put(FIELD_OFFICIAL_WEBSITE_URL, event.getOfficialWebsiteURL() != null ? event.getOfficialWebsiteURL().toString() : null);
|
||||
result.put(FIELD_START_DATE, event.getStartDate() != null ? event.getStartDate().asMillis() : null);
|
||||
result.put(FIELD_END_DATE, event.getStartDate() != null ? event.getEndDate().asMillis() : null);
|
||||
result.put(FIELD_VENUE, venueSerializer.serialize(event.getVenue()));
|
||||
result.put(FIELD_LOGO_IMAGE_URL, event.getLogoImageURL() != null ? event.getLogoImageURL().toString() : null);
|
||||
result.put(FIELD_IMAGE_URLS, getURLsAsStringArray(event.getImageURLs()));
|
||||
result.put(FIELD_VIDEO_URLS, getURLsAsStringArray(event.getVideoURLs()));
|
||||
result.put(FIELD_SPONSOR_IMAGE_URLS, getURLsAsStringArray(event.getSponsorImageURLs()));
|
||||
JSONArray leaderboardGroups = new JSONArray();
|
||||
result.put(FIELDS_LEADERBOARD_GROUPS, leaderboardGroups);
|
||||
for (LeaderboardGroupBase lg : event.getLeaderboardGroups()) {
|
||||
leaderboardGroups.add(leaderboardGroupBaseSerializer.serialize(lg));
|
||||
}
|
||||
JSONArray imageSizes = new JSONArray();
|
||||
result.put(FIELD_IMAGE_SIZES, imageSizes);
|
||||
for (ImageDescriptor image : event.getImages()) {
|
||||
addImageSize(image, imageSizes);
|
||||
}
|
||||
JSONArray jsonImages = new JSONArray();
|
||||
for(ImageDescriptor imageDescriptor: event.getImages()) {
|
||||
addImage(imageDescriptor, jsonImages);
|
||||
}
|
||||
result.put(FIELD_IMAGES, jsonImages);
|
||||
JSONArray jsonVideos = new JSONArray();
|
||||
for(VideoDescriptor videoDescriptor: event.getVideos()) {
|
||||
addVideo(videoDescriptor, jsonVideos);
|
||||
}
|
||||
result.put(FIELD_VIDEOS, jsonVideos);
|
||||
return result;
|
||||
}
|
||||
|
||||
private void addImage(ImageDescriptor image, JSONArray imagesJson) {
|
||||
JSONObject imageJson = new JSONObject();
|
||||
imageJson.put(FIELD_SOURCE_URL, image.getURL().toString());
|
||||
// TODO use toLanguageTag() when deserializer can use Locale.forLanguageTag()
|
||||
imageJson.put(FIELD_LOCALE, image.getLocale() != null ? image.getLocale().getLanguage() : null);
|
||||
imageJson.put(FIELD_TITLE, image.getTitle());
|
||||
imageJson.put(FIELD_SUBTITLE, image.getSubtitle());
|
||||
imageJson.put(FIELD_MIMETYPE, image.getMimeType().name());
|
||||
imageJson.put(FIELD_COPYRIGHT, image.getCopyright());
|
||||
imageJson.put(FIELD_IMAGE_WIDTH_IN_PX, image.getWidthInPx());
|
||||
imageJson.put(FIELD_IMAGE_HEIGHT_IN_PX, image.getHeightInPx());
|
||||
imageJson.put(FIELD_CREATEDATDATE, image.getCreatedAtDate().asMillis());
|
||||
JSONArray tags = new JSONArray();
|
||||
for (String tag : image.getTags()) {
|
||||
tags.add(tag);
|
||||
}
|
||||
imageJson.put(FIELD_TAGS, tags);
|
||||
imagesJson.add(imageJson);
|
||||
}
|
||||
|
||||
private void addVideo(VideoDescriptor video, JSONArray videosJson) {
|
||||
JSONObject videoJson = new JSONObject();
|
||||
videoJson.put(FIELD_SOURCE_URL, video.getURL().toString());
|
||||
// TODO use toLanguageTag() when deserializer can use Locale.forLanguageTag()
|
||||
videoJson.put(FIELD_LOCALE, video.getLocale() != null ? video.getLocale().getLanguage() : null);
|
||||
videoJson.put(FIELD_VIDEO_THUMBNAIL_URL, video.getThumbnailURL() != null ? video.getThumbnailURL().toString() : null);
|
||||
videoJson.put(FIELD_TITLE, video.getTitle());
|
||||
videoJson.put(FIELD_SUBTITLE, video.getSubtitle());
|
||||
videoJson.put(FIELD_MIMETYPE, video.getMimeType().name());
|
||||
videoJson.put(FIELD_COPYRIGHT, video.getCopyright());
|
||||
videoJson.put(FIELD_VIDEO_LENGTH_IN_SECONDS, video.getLengthInSeconds());
|
||||
videoJson.put(FIELD_CREATEDATDATE, video.getCreatedAtDate().asMillis());
|
||||
JSONArray tags = new JSONArray();
|
||||
for (String tag : video.getTags()) {
|
||||
tags.add(tag);
|
||||
}
|
||||
videoJson.put(FIELD_TAGS, tags);
|
||||
videosJson.add(videoJson);
|
||||
}
|
||||
|
||||
/**
|
||||
* For backward compatibility the size of an image is also serialized as
|
||||
* JSON object to <code>imageSizes</code>
|
||||
*/
|
||||
private void addImageSize(ImageDescriptor image, JSONArray imageSizes) {
|
||||
if(image.getHeightInPx() != null && image.getWidthInPx() != null) {
|
||||
JSONObject imageSizeJson = new JSONObject();
|
||||
imageSizes.add(imageSizeJson);
|
||||
imageSizeJson.put(FIELD_IMAGE_URL, image.getURL().toString());
|
||||
imageSizeJson.put(FIELD_IMAGE_WIDTH, image.getWidthInPx());
|
||||
imageSizeJson.put(FIELD_IMAGE_HEIGHT, image.getHeightInPx());
|
||||
}
|
||||
}
|
||||
|
||||
private JSONArray getURLsAsStringArray(Iterable<URL> urls) {
|
||||
JSONArray jsonImageURLs = new JSONArray();
|
||||
for (URL url : urls) {
|
||||
jsonImageURLs.add(url.toString());
|
||||
}
|
||||
return jsonImageURLs;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user