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:
Axel Uhl committed 2015-06-18 13:45:50 +02:00
commit 535654593c
2045 files changed
+50038 -12668

No files matched your search

@@ -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);
@@ -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;
}
}
@@ -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());
@@ -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;
}
}
@@ -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;
}
@@ -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;
}
@@ -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;
}
}