From 70683976415052887465a09f47ab921ab85b4b5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kai=20B=C3=B6rnert?= Date: Mon, 23 Apr 2018 14:04:09 +0200 Subject: [PATCH 01/11] bug4523 initial video flipping logic --- .../gwt/ui/adminconsole/VideoDialog.java | 1 + .../gwt/ui/client/media/NewMediaDialog.java | 3 ++- .../gwt/ui/client/media/VideoJSPlayer.java | 20 +++++++++++++++---- .../gwt/ui/client/media/VideoJSPlayer.ui.xml | 6 +++++- .../gwt/ui/shared/media/MediaConstants.java | 2 +- .../com/sap/sse/common/media/MimeType.java | 8 ++++++-- 6 files changed, 31 insertions(+), 9 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/VideoDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/VideoDialog.java index c74366727cf..c2d138576c5 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/VideoDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/VideoDialog.java @@ -73,6 +73,7 @@ public abstract class VideoDialog extends DataEntryDialog { mimeTypeListBox.addItem(MimeType.aac.name()); mimeTypeListBox.addItem(MimeType.mp4.name()); mimeTypeListBox.addItem(MimeType.mp4panorama.name()); + mimeTypeListBox.addItem(MimeType.mp4panoramaflip.name()); mimeTypeListBox.addItem(MimeType.ogg.name()); mimeTypeListBox.addItem(MimeType.ogv.name()); mimeTypeListBox.addItem(MimeType.qt.name()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/NewMediaDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/NewMediaDialog.java index 58ed5a95b37..43a54089e22 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/NewMediaDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/NewMediaDialog.java @@ -330,7 +330,7 @@ public class NewMediaDialog extends DataEntryDialog { infoLabel.setWidget(new Label(mediaTrack.url)); } else { infoLabelLabel.setText(stringMessages.mimeType() + ":"); - if (mediaTrack.mimeType == MimeType.mp4 || mediaTrack.mimeType == MimeType.mp4panorama) { + if (mediaTrack.mimeType == MimeType.mp4 || mediaTrack.mimeType == MimeType.mp4panorama || mediaTrack.mimeType == MimeType.mp4panoramaflip) { if (!remoteMp4WasStarted) { processMp4(mediaTrack); } else if (remoteMp4WasFinished) { @@ -464,6 +464,7 @@ public class NewMediaDialog extends DataEntryDialog { ListBox mimeTypeListBox = createListBox(false); mimeTypeListBox.addItem(MimeType.mp4.name()); mimeTypeListBox.addItem(MimeType.mp4panorama.name()); + mimeTypeListBox.addItem(MimeType.mp4panoramaflip.name()); mimeTypeListBox.addChangeHandler(new ChangeHandler() { @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/VideoJSPlayer.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/VideoJSPlayer.java index af8ededda45..a88da937ac8 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/VideoJSPlayer.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/VideoJSPlayer.java @@ -7,6 +7,7 @@ import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.SourceElement; import com.google.gwt.dom.client.VideoElement; import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.resources.client.CssResource; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.Timer; @@ -26,8 +27,16 @@ public class VideoJSPlayer extends Widget implements RequiresResize { interface VideoJSPlayerUiBinder extends UiBinder { } + + interface VideoJSStyle extends CssResource { + String invertedVideoPlayer(); + } - @UiField VideoElement videoElement; + @UiField + VideoJSStyle style; + + @UiField + VideoElement videoElement; private final String elementId; private JavaScriptObject player; @@ -63,17 +72,20 @@ public class VideoJSPlayer extends Widget implements RequiresResize { } public void setVideo(MimeType mimeType, String source) { + if (mimeType == null || mimeType.mediaType != MediaType.video) { + return; + } this.panorama = mimeType.isPanorama(); if (this.panorama) { videoElement.setAttribute("crossorigin", "anonymous"); } + if (mimeType.isFlippedPanorama()) { + videoElement.addClassName(style.invertedVideoPlayer()); + } if (isAttached()) { _onLoad(autoplay, panorama, StringMessages.INSTANCE.threeSixtyVideoHint()); resizeChecker.scheduleRepeating(RESIZE_CHECK); } - if (mimeType == null || mimeType.mediaType != MediaType.video) { - return; - } String type = null; if (mimeType.mediaSubType == MediaSubType.youtube) { type = "video/youtube"; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/VideoJSPlayer.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/VideoJSPlayer.ui.xml index 7eb95544df6..4f00d95471e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/VideoJSPlayer.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/VideoJSPlayer.ui.xml @@ -1,6 +1,6 @@ - + @external vjs-big-play-button; .vjs-big-play-button { display: none !important; @@ -10,6 +10,10 @@ height: 100%; min-height: 230px; } + + .invertedVideoPlayer canvas{ + transform: rotate(180deg) translateX(50%) translateZ(0) !important; + }
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/media/MediaConstants.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/media/MediaConstants.java index 2095bbda488..c172dc1d419 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/media/MediaConstants.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/media/MediaConstants.java @@ -31,7 +31,7 @@ public final class MediaConstants { public static final List imageTagSuggestions = Arrays.asList(new String[] { MediaTagConstants.BIGSCREEN,MediaTagConstants.STAGE, MediaTagConstants.TEASER, MediaTagConstants.SPONSOR, MediaTagConstants.LOGO, MediaTagConstants.GALLERY }); public static final List videoTagSuggestions = Arrays.asList(new String[] { MediaTagConstants.BIGSCREEN,MediaTagConstants.LIVESTREAM, MediaTagConstants.HIGHLIGHT, MediaTagConstants.FEATURED, MediaTagConstants.STAGE }); - public static final Set SUPPORTED_VIDEO_TYPES = new HashSet<>(Arrays.asList(MimeType.youtube, MimeType.vimeo, MimeType.mp4, MimeType.mp4panorama)); + public static final Set SUPPORTED_VIDEO_TYPES = new HashSet<>(Arrays.asList(MimeType.youtube, MimeType.vimeo, MimeType.mp4, MimeType.mp4panorama, MimeType.mp4panoramaflip)); private MediaConstants() { } diff --git a/java/com.sap.sse.common/src/com/sap/sse/common/media/MimeType.java b/java/com.sap.sse.common/src/com/sap/sse/common/media/MimeType.java index 6ae93394fc6..d837a2d69e8 100644 --- a/java/com.sap.sse.common/src/com/sap/sse/common/media/MimeType.java +++ b/java/com.sap.sse.common/src/com/sap/sse/common/media/MimeType.java @@ -6,7 +6,7 @@ public enum MimeType { MediaSubType.quicktime), mp3(MediaType.audio, MediaSubType.mpeg), ogg(MediaType.audio, MediaSubType.ogg), aac( MediaType.audio, MediaSubType.aac), webm(MediaType.video, MediaSubType.webm), youtube(MediaType.video, MediaSubType.youtube), vimeo(MediaType.video, MediaSubType.vimeo), image(MediaType.image, - MediaSubType.unknown), unknown(MediaType.unknown, MediaSubType.unknown), mp4panorama(MediaType.video, MediaSubType.mp4); + MediaSubType.unknown), unknown(MediaType.unknown, MediaSubType.unknown), mp4panorama(MediaType.video, MediaSubType.mp4), mp4panoramaflip(MediaType.video, MediaSubType.mp4); public final MediaType mediaType; public final MediaSubType mediaSubType; @@ -17,7 +17,11 @@ public enum MimeType { } public boolean isPanorama(){ - return this == mp4panorama; + return this == mp4panorama || this == mp4panoramaflip; + } + + public boolean isFlippedPanorama(){ + return this == mp4panoramaflip; } @Override From ab7daf375215c624f7a17e706cdb22b042401ace Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kai=20B=C3=B6rnert?= Date: Tue, 24 Apr 2018 11:19:22 +0200 Subject: [PATCH 02/11] bug4502 adjusted refreshing to respect currently selected values correctly --- .../LeaderboardGroupConfigPanel.java | 44 +++++++++---------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupConfigPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupConfigPanel.java index d56e660cfa3..77481f4154e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupConfigPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupConfigPanel.java @@ -656,44 +656,42 @@ public class LeaderboardGroupConfigPanel extends AbstractRegattaPanel implements @Override public void fillLeaderboards(Iterable leaderboards) { availableLeaderboards.clear(); + leaderboardsProvider.getList().clear(); if (leaderboards != null) { Util.addAll(leaderboards, availableLeaderboards); } - leaderboardsFilterablePanel.updateAll(availableLeaderboards); + final LeaderboardGroupDTO selectedGroup = getSelectedGroup(); + if(selectedGroup != null) { + leaderboardsProvider.getList().addAll(availableLeaderboards); + leaderboardsProvider.getList().removeAll(selectedGroup.leaderboards); + leaderboardsFilterablePanel.getTextBox().setText(""); + leaderboardsFilterablePanel.updateAll(leaderboardsProvider.getList()); + refreshableLeaderboardsSelectionModel.clear(); + final Set selectedLeaderboards = refreshableLeaderboardsSelectionModel.getSelectedSet(); + for (StrippedLeaderboardDTO leaderboard : selectedLeaderboards) { + refreshableLeaderboardsSelectionModel.setSelected(leaderboard, true); + } + } } /** - * If no leaderboard group is selected or more than one is selected, this method is a no-op because the - * leaderboard list displayed is defined to the be list of all leaderboards available, excluding those - * leaderboards that are already assigned to the selected leaderboard group. In other words, - * the leaderboard list is only well-defined in case a single leaderboard group is selected. + * If no leaderboard group is selected or more than one is selected, this method is a no-op because the leaderboard + * list displayed is defined to the be list of all leaderboards available, excluding those leaderboards that are + * already assigned to the selected leaderboard group. In other words, the leaderboard list is only + * well-defined in case a single leaderboard group is selected. */ private void refreshLeaderboardsList() { - final LeaderboardGroupDTO selectedGroup = getSelectedGroup(); - final Set selectedLeaderboards = refreshableLeaderboardsSelectionModel.getSelectedSet(); - if (isSingleGroupSelected && selectedGroup != null) { + if (isSingleGroupSelected && getSelectedGroup() != null) { sailingService.getLeaderboards(new MarkedAsyncCallback>( new AsyncCallback>() { @Override public void onFailure(Throwable t) { errorReporter.reportError("Error trying to obtain list of leaderboards: " + t.getMessage()); } - + @Override public void onSuccess(List leaderboards) { - availableLeaderboards.clear(); - if (leaderboards != null) { - availableLeaderboards.addAll(leaderboards); - } - leaderboardsProvider.getList().clear(); - leaderboardsProvider.getList().addAll(availableLeaderboards); - leaderboardsProvider.getList().removeAll(selectedGroup.leaderboards); - leaderboardsFilterablePanel.getTextBox().setText(""); - leaderboardsFilterablePanel.updateAll(availableLeaderboards); - refreshableLeaderboardsSelectionModel.clear(); - for (StrippedLeaderboardDTO leaderboard : selectedLeaderboards) { - refreshableLeaderboardsSelectionModel.setSelected(leaderboard, true); - } + fillLeaderboards(leaderboards); } })); } @@ -903,7 +901,7 @@ public class LeaderboardGroupConfigPanel extends AbstractRegattaPanel implements } updateGroup(selectedGroup); //Refilters the leaderboards list (hides the moved leaderboards if they don't fit to the filter) and resorts the list - leaderboardsFilterablePanel.updateAll(availableLeaderboards); + leaderboardsFilterablePanel.updateAll(leaderboardsProvider.getList()); } } From e0b002a245f04a12972e4084dc585f07157aaed1 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 7 May 2018 13:20:34 +0200 Subject: [PATCH 03/11] consolidated imports to avoid warnings Change-Id: I38a6c80422d6a4581554eb734eae87bc1fc55e32 --- .../datamining/impl/data/TrackedLegOfCompetitorWithContext.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/TrackedLegOfCompetitorWithContext.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/TrackedLegOfCompetitorWithContext.java index cb44dacb1d4..1ccb185f5a1 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/TrackedLegOfCompetitorWithContext.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/TrackedLegOfCompetitorWithContext.java @@ -12,10 +12,8 @@ import com.sap.sailing.domain.base.Leg; import com.sap.sailing.domain.common.Distance; import com.sap.sailing.domain.common.Position; import com.sap.sailing.domain.common.Wind; -import com.sap.sailing.domain.common.tracking.GPSFixMoving; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.tracking.BravoFixTrack; -import com.sap.sailing.domain.tracking.GPSFixTrack; import com.sap.sailing.domain.tracking.TrackedLeg; import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor; import com.sap.sailing.domain.tracking.TrackedRace; From 7e998f22a578d0b3b51305868b98f38eed81bd28 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 7 May 2018 14:36:06 +0200 Subject: [PATCH 04/11] fixing bug 4563: obtain boat for competitor from RaceColumn which considers RegattaLog registrations Change-Id: Iddb090ce63d313642b3e8b3923ccb1b20295d861 --- .../domain/leaderboard/impl/AbstractLeaderboardImpl.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java index c03bc4e5a1d..a49dc0d95bd 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java @@ -114,8 +114,7 @@ public abstract class AbstractLeaderboardImpl extends AbstractSimpleLeaderboardI @Override public Boat getBoatOfCompetitor(Competitor competitor, RaceColumn raceColumn, Fleet fleet) { - RaceDefinition raceDefinition = raceColumn.getRaceDefinition(fleet); - return raceDefinition != null ? raceDefinition.getBoatOfCompetitor(competitor) : null; + return raceColumn.getAllCompetitorsAndTheirBoats(fleet).get(competitor); } @Override From bf25cbace3e5162d5aa07cd87f07d80abfef2ded Mon Sep 17 00:00:00 2001 From: Alessandro Stoltenberg Date: Mon, 7 May 2018 17:12:21 +0200 Subject: [PATCH 05/11] Made Flags column in CompetitorTableWrapper sortable, fixed sorting of SailId and BoatClass columns --- .../ui/adminconsole/CompetitorTableWrapper.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java index e26c978233d..5e5a7f373f1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java @@ -93,9 +93,10 @@ public class CompetitorTableWrapper() { + private final NaturalComparator comparator = new NaturalComparator(/*case sensitive*/ false); @Override public int compare(CompetitorDTO o1, CompetitorDTO o2) { - return o1.getName().compareTo(o2.getName()); + return comparator.compare(o1.getName(), o2.getName()); } }); @@ -126,7 +127,7 @@ public class CompetitorTableWrapper() { + private final NaturalComparator comparator = new NaturalComparator(/* case sensitive */ false); + @Override + public int compare(CompetitorDTO o1, CompetitorDTO o2) { + return comparator.compare(o1.getThreeLetterIocCountryCode(), o2.getThreeLetterIocCountryCode()); + } + }); TextColumn sailIdColumn = new TextColumn() { @Override @@ -175,7 +184,7 @@ public class CompetitorTableWrapper Date: Tue, 8 May 2018 08:40:19 +0200 Subject: [PATCH 06/11] Bug 4502: the filter field isn't cleared anymore when refreshing the leaderboard list due to the fact that the previous filter is still active --- .../sailing/gwt/ui/adminconsole/LeaderboardGroupConfigPanel.java | 1 - 1 file changed, 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupConfigPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupConfigPanel.java index 77481f4154e..fad9c27a9a8 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupConfigPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupConfigPanel.java @@ -664,7 +664,6 @@ public class LeaderboardGroupConfigPanel extends AbstractRegattaPanel implements if(selectedGroup != null) { leaderboardsProvider.getList().addAll(availableLeaderboards); leaderboardsProvider.getList().removeAll(selectedGroup.leaderboards); - leaderboardsFilterablePanel.getTextBox().setText(""); leaderboardsFilterablePanel.updateAll(leaderboardsProvider.getList()); refreshableLeaderboardsSelectionModel.clear(); final Set selectedLeaderboards = refreshableLeaderboardsSelectionModel.getSelectedSet(); From da613dadefc7663a7d2745f58adea2805d125c59 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Tue, 8 May 2018 10:21:08 +0200 Subject: [PATCH 07/11] bug4546 Avoided NPE in Mark Position Editor when the mark is deselected while adding or editing positions --- .../gwt/ui/client/shared/charts/EditMarkPositionPanel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/EditMarkPositionPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/EditMarkPositionPanel.java index bd3497671db..edd0f7cb900 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/EditMarkPositionPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/EditMarkPositionPanel.java @@ -529,7 +529,7 @@ public class EditMarkPositionPanel extends AbstractRaceChart i public void resetPointColor(int index) { Point[] points = markSeries.getPoints(); - if (points.length > index) { + if (points.length > index && selectedMark != null) { points[index].setMarker(new Marker().setFillColor(selectedMark.color==null?null:selectedMark.color.getAsHtml())); setSeriesPoints(markSeries, points, /* manageZoom */ true); } From 9ed9a42cbf9ca3fa79f45231dba4b055f05117b8 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 8 May 2018 18:04:29 +0200 Subject: [PATCH 08/11] implemented DB migration for old, deprecated representation of two-mark control points Change-Id: I14adcd5af2a1ab3d22bc137e10159c96f960d1e9 --- .../impl/DomainObjectFactoryImpl.java | 42 +++++++++++++------ 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java index e5eeadf1c1f..75d88a3fa67 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java @@ -1541,8 +1541,10 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { } else if (eventClass.equals(RaceLogPassChangeEvent.class.getSimpleName())) { resultEvent = loadRaceLogPassChangeEvent(createdAt, author, logicalTimePoint, id, passId, competitors); } else if (eventClass.equals(RaceLogCourseDesignChangedEvent.class.getSimpleName())) { - resultEvent = loadRaceLogCourseDesignChangedEvent(createdAt, author, logicalTimePoint, id, passId, competitors, - dbObject); + final Pair> resultPair = loadRaceLogCourseDesignChangedEvent( + createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); + resultEvent = resultPair.getA(); + dbObjectForUpdate = resultPair.getB(); } else if (eventClass.equals(RaceLogFinishPositioningListChangedEvent.class.getSimpleName())) { resultEvent = loadRaceLogFinishPositioningListChangedEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); @@ -1815,17 +1817,21 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { return new RaceLogPassChangeEventImpl(createdAt, logicalTimePoint, author, id, passId); } - private RaceLogCourseDesignChangedEvent loadRaceLogCourseDesignChangedEvent(TimePoint createdAt, + /** + * @return the second pair component has a DBObject in case migration was performed and the updated race log event's + * DBObject representation shall be updated to the DB + */ + private Pair> loadRaceLogCourseDesignChangedEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { String courseName = (String) dbObject.get(FieldNames.RACE_LOG_COURSE_DESIGN_NAME.name()); - CourseBase courseData = loadCourseData((BasicDBList) dbObject.get(FieldNames.RACE_LOG_COURSE_DESIGN.name()), + Pair courseData = loadCourseData((BasicDBList) dbObject.get(FieldNames.RACE_LOG_COURSE_DESIGN.name()), courseName); final String courseDesignerModeName = (String) dbObject.get(FieldNames.RACE_LOG_COURSE_DESIGNER_MODE.name()); final CourseDesignerMode courseDesignerMode = courseDesignerModeName == null ? null : CourseDesignerMode.valueOf(courseDesignerModeName); - return new RaceLogCourseDesignChangedEventImpl(createdAt, logicalTimePoint, author, id, passId, courseData, - courseDesignerMode); + return new Pair<>(new RaceLogCourseDesignChangedEventImpl(createdAt, logicalTimePoint, author, id, passId, courseData.getA(), + courseDesignerMode), courseData.getB() ? /* migrated */ Optional.of(dbObject) : Optional.empty()); } private RaceLogEvent loadRaceLogFixedMarkPassingEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, @@ -2313,9 +2319,12 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { * field is loaded, the value of PASSINGSIDE is used and then migrated to PASSINGINSTRUCTION. If the first or last * Waypoint has the PassingInstructions Gate, it is transfered to Line. * + * @return the second component tells if migration was performed; in this case the {@code dbCourseList} passed has + * been edited "in place" to describe the migration that has happened */ @SuppressWarnings("deprecation") // Used to migrate from PASSINGSIDE to the new PASSINGINSTRUCTIONS - private CourseBase loadCourseData(BasicDBList dbCourseList, String courseName) { + private Pair loadCourseData(BasicDBList dbCourseList, String courseName) { + boolean migrated = false; if (courseName == null) { courseName = "Course"; } @@ -2338,25 +2347,31 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { } dbObject.put(FieldNames.WAYPOINT_PASSINGINSTRUCTIONS.name(), waypointPassingInstruction); dbObject.removeField(FieldNames.WAYPOINT_PASSINGSIDE.name()); + migrated = true; } } if (waypointPassingInstruction != null) { passingInstructions = PassingInstruction.valueOfIgnoringCase(waypointPassingInstruction); } - ControlPoint controlPoint = loadControlPoint((DBObject) dbObject.get(FieldNames.CONTROLPOINT.name())); + Pair controlPoint = loadControlPoint((DBObject) dbObject.get(FieldNames.CONTROLPOINT.name())); + migrated = migrated || controlPoint.getB(); if (passingInstructions == null) { - waypoint = new WaypointImpl(controlPoint); + waypoint = new WaypointImpl(controlPoint.getA()); } else { - waypoint = new WaypointImpl(controlPoint, passingInstructions); + waypoint = new WaypointImpl(controlPoint.getA(), passingInstructions); } courseData.addWaypoint(i++, waypoint); } - return courseData; + return new Pair<>(courseData, migrated); } - private ControlPoint loadControlPoint(DBObject dbObject) { + /** + * @return second component tells whether migration was performed on {@code dbObject} in place + */ + private Pair loadControlPoint(DBObject dbObject) { String controlPointClass = (String) dbObject.get(FieldNames.CONTROLPOINT_CLASS.name()); ControlPoint controlPoint = null; + boolean migrated = false; if (controlPointClass != null) { if (controlPointClass.equals(Mark.class.getSimpleName())) { Mark mark = loadMark((DBObject) dbObject.get(FieldNames.CONTROLPOINT_VALUE.name())); @@ -2366,13 +2381,14 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { (DBObject) dbObject.get(FieldNames.CONTROLPOINT_VALUE.name())); dbObject.put(FieldNames.CONTROLPOINT_CLASS.name(), ControlPointWithTwoMarks.class.getSimpleName()); controlPoint = cpwtm; + migrated = true; } else if (controlPointClass.equals(ControlPointWithTwoMarks.class.getSimpleName())) { ControlPointWithTwoMarks cpwtm = loadControlPointWithTwoMarks( (DBObject) dbObject.get(FieldNames.CONTROLPOINT_VALUE.name())); controlPoint = cpwtm; } } - return controlPoint; + return new Pair<>(controlPoint, migrated); } /** From e240d89690b9dca39b05ff8d955ad3890b6e5156 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Wed, 9 May 2018 16:56:22 +0200 Subject: [PATCH 09/11] bug4567 Added missing / adjusted component's localized short names --- .../gwt/ui/client/shared/charts/EditMarkPassingsPanel.java | 2 +- .../gwt/ui/client/shared/charts/EditMarkPositionPanel.java | 2 +- .../sailing/gwt/ui/client/shared/charts/WindChartLifecycle.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/EditMarkPassingsPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/EditMarkPassingsPanel.java index 54dc3a976b0..bf5be5ca401 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/EditMarkPassingsPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/EditMarkPassingsPanel.java @@ -470,7 +470,7 @@ public class EditMarkPassingsPanel extends AbstractCompositeComponent i @Override public String getLocalizedShortName() { - return null; + return stringMessages.editMarkPositions(); } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/WindChartLifecycle.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/WindChartLifecycle.java index f7996cf29d8..b36087f659a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/WindChartLifecycle.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/WindChartLifecycle.java @@ -24,7 +24,7 @@ public class WindChartLifecycle implements ComponentLifecycle @Override public String getLocalizedShortName() { - return stringMessages.wind(); + return stringMessages.windChart(); } @Override From d1dd9a1ee1b528feb5dd0d9450bbfdd20446ab2a Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Wed, 9 May 2018 16:59:19 +0200 Subject: [PATCH 10/11] bug4567 Use component's localized short names instead of widget's title a splitter toggle button text --- .../com/sap/sailing/gwt/ui/raceboard/TouchSplitLayoutPanel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/TouchSplitLayoutPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/TouchSplitLayoutPanel.java index 4d0449a453a..18adba1e143 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/TouchSplitLayoutPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/TouchSplitLayoutPanel.java @@ -243,7 +243,7 @@ public class TouchSplitLayoutPanel extends DockLayoutPanel { this.reverse = reverse; this.associatedComponent = associatedComponent; this.hasToggleButtonsAssociated = false; - this.splitterToggleButton = new Button(target.getTitle()); + this.splitterToggleButton = new Button(associatedComponent.getLocalizedShortName()); } public Component getAssociatedComponent() { From 932bed87954329119551c3fea060d1282a59426f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kai=20B=C3=B6rnert?= Date: Mon, 14 May 2018 12:21:05 +0200 Subject: [PATCH 11/11] fix for milliseconds parsing with datetime-locale --- .../datetime/NativeDateTimeInput.java | 51 ++++++++++++++----- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/datetime/NativeDateTimeInput.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/datetime/NativeDateTimeInput.java index 550b4e34ff4..ed09e347c10 100644 --- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/datetime/NativeDateTimeInput.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/datetime/NativeDateTimeInput.java @@ -1,6 +1,9 @@ package com.sap.sse.gwt.client.controls.datetime; +import java.util.ArrayList; +import java.util.Collections; import java.util.Date; +import java.util.List; import java.util.Objects; import com.google.gwt.dom.client.Document; @@ -26,7 +29,7 @@ class NativeDateTimeInput extends Widget implements DateTimeInput { * @return the newly created instance as {@link DateTimeInput} abstraction */ static DateTimeInput date() { - return new NativeDateTimeInput(DateTimeInputType.DATE, "", Accuracy.getDateFormat()); + return new NativeDateTimeInput(DateTimeInputType.DATE, "", Accuracy.getDateFormat(), Collections.emptyList()); } /** @@ -38,7 +41,16 @@ class NativeDateTimeInput extends Widget implements DateTimeInput { * @return the newly created instance as {@link DateTimeInput} abstraction */ static DateTimeInput time(Accuracy accuracy) { - return new NativeDateTimeInput(DateTimeInputType.TIME, accuracy.getStep(), accuracy.getTimeFormat()); + final List additionalFormats = new ArrayList<>(); + switch (accuracy) { + case MILLISECONDS: + additionalFormats.add(Accuracy.SECONDS.getTimeFormat()); + case SECONDS: + additionalFormats.add(Accuracy.MINUTES.getTimeFormat()); + default: + break; + } + return new NativeDateTimeInput(DateTimeInputType.TIME, accuracy.getStep(), accuracy.getTimeFormat(), additionalFormats); } /** @@ -50,14 +62,25 @@ class NativeDateTimeInput extends Widget implements DateTimeInput { * @return the newly created instance as {@link DateTimeInput} abstraction */ static DateTimeInput datetimeLocale(Accuracy accuracy) { + final List additionalFormats = new ArrayList<>(); + switch (accuracy) { + case MILLISECONDS: + additionalFormats.add(Accuracy.SECONDS.getDatetimeFormat()); + case SECONDS: + additionalFormats.add(Accuracy.MINUTES.getDatetimeFormat()); + default: + break; + } return new NativeDateTimeInput(DateTimeInputType.DATETIME_LOCAL, accuracy.getStep(), - accuracy.getDatetimeFormat()); + accuracy.getDatetimeFormat(), additionalFormats); } private final DateTimeFormat format; private final InputElement input; + private final List additionalFormatsForParsing; - private NativeDateTimeInput(DateTimeInputType inputType, String step, DateTimeFormat format) { + private NativeDateTimeInput(DateTimeInputType inputType, String step, DateTimeFormat format, List additionalFormatsForParsing) { + this.additionalFormatsForParsing = additionalFormatsForParsing; this.input = Document.get().createElement(InputElement.TAG).cast(); this.input.setAttribute(ATTR_TYPE, inputType.getType()); this.input.setAttribute(ATTR_STEP, step); @@ -79,19 +102,19 @@ class NativeDateTimeInput extends Widget implements DateTimeInput { @Override public final Date getValue() { + final String value = input.getValue(); + if (value == null || value.isEmpty()) { + return null; + } try { - return this.format.parse(input.getValue()); + return this.format.parse(value); } catch (IllegalArgumentException exc) { - try { - // at least Google Chrome omits the seconds, if they are 00 in input field - if (format == Accuracy.SECONDS.getDatetimeFormat()) { - return Accuracy.MINUTES.getDatetimeFormat().parse(input.getValue()); + for (DateTimeFormat additionalFormat : additionalFormatsForParsing) { + try { + // at least Google Chrome omits the seconds, if they are 00 in input field + return additionalFormat.parse(value); + } catch (IllegalArgumentException exc2) { } - if (format == Accuracy.SECONDS.getTimeFormat()) { - return Accuracy.MINUTES.getTimeFormat().parse(input.getValue()); - } - } catch (IllegalArgumentException exc2) { - return null; } } return null;