From 4919f9fc8c22b8f22509b7bac91b73d655a6b7ab Mon Sep 17 00:00:00 2001 From: D067890 Date: Tue, 17 Jul 2018 17:11:20 +0200 Subject: [PATCH 001/188] bug4301: EventDialog only accepts valid or empty base url --- .../sailing/gwt/ui/adminconsole/EventDialog.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventDialog.java index cbf77d1c367..2fff5a0f70c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventDialog.java @@ -12,6 +12,7 @@ import java.util.UUID; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; +import com.google.gwt.regexp.shared.RegExp; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.FocusWidget; import com.google.gwt.user.client.ui.Grid; @@ -58,6 +59,9 @@ public abstract class EventDialog extends DataEntryDialogWithDateTimeBox { private StringMessages stringMessages; @@ -74,7 +78,12 @@ public abstract class EventDialog extends DataEntryDialogWithDateTimeBox 0; boolean venueNotEmpty = eventToValidate.venue.getName() != null && eventToValidate.venue.getName().length() > 0; boolean courseAreaNotEmpty = eventToValidate.venue.getCourseAreas() != null && eventToValidate.venue.getCourseAreas().size() > 0; - + + boolean invalidURL = true; + if(eventToValidate.getBaseURL() == null && BASE_URL_REG_EXP.test(eventToValidate.getBaseURL())) { + invalidURL=false; + } + if (courseAreaNotEmpty) { for (CourseAreaDTO courseArea : eventToValidate.venue.getCourseAreas()) { courseAreaNotEmpty = courseArea.getName() != null && courseArea.getName().length() > 0; @@ -114,6 +123,8 @@ public abstract class EventDialog extends DataEntryDialogWithDateTimeBox Date: Fri, 14 Feb 2020 10:05:18 +0100 Subject: [PATCH 002/188] Remove branding in race board header and home --- .../home/desktop/partials/header/Header.java | 9 ++++++++ .../desktop/partials/header/Header.ui.xml | 2 +- .../gwt/ui/client/shared/racemap/RaceMap.java | 6 ++++- .../gwt/ui/shared/databylogo/DataByLogo.java | 20 ++++++++++++----- .../sse/gwt/client/sapheader/SAPHeader.java | 5 +++++ .../src/com/sap/sse/gwt/shared/Branding.java | 22 +++++++++++++++++++ 6 files changed, 57 insertions(+), 7 deletions(-) create mode 100644 java/com.sap.sse.gwt/src/com/sap/sse/gwt/shared/Branding.java diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.java index d560c0e42de..33ce5c9b742 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.java @@ -4,6 +4,8 @@ import java.util.Arrays; import java.util.List; import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.ImageElement; +import com.google.gwt.dom.client.Style.Display; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.event.dom.client.KeyPressEvent; @@ -32,6 +34,7 @@ import com.sap.sailing.gwt.home.shared.places.solutions.SolutionsPlace.Solutions import com.sap.sailing.gwt.home.shared.places.start.StartPlace; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sse.gwt.client.mvp.PlaceChangedEvent; +import com.sap.sse.gwt.shared.Branding; import com.sap.sse.security.ui.authentication.view.AuthenticationMenuView; import com.sap.sse.security.ui.authentication.view.AuthenticationMenuViewImpl; @@ -45,6 +48,8 @@ public class Header extends Composite { @UiField Button searchButton; @UiField Anchor usermenu; + + @UiField ImageElement logoImage; private static final HyperlinkImpl HYPERLINK_IMPL = GWT.create(HyperlinkImpl.class); @@ -96,6 +101,10 @@ public class Header extends Composite { }); authenticationMenuView = new AuthenticationMenuViewImpl(usermenu, HeaderResources.INSTANCE.css().loggedin(), HeaderResources.INSTANCE.css().open()); + + if (!Branding.getInstance().isActive()) { + logoImage.getStyle().setDisplay(Display.NONE); + } } @UiHandler("startPageLink") diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.ui.xml index a0463876c8f..051674dc271 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.ui.xml @@ -10,7 +10,7 @@
- {i18n.headerLogo} + {i18n.headerLogo}

diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java index 1c4e631fe2b..b10aa40f7e4 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java @@ -88,6 +88,7 @@ import com.sap.sailing.domain.common.impl.MeterDistance; import com.sap.sailing.domain.common.scalablevalue.impl.ScalableBearing; import com.sap.sailing.domain.common.scalablevalue.impl.ScalablePosition; import com.sap.sailing.domain.common.windfinder.SpotDTO; +import com.sap.sailing.gwt.home.shared.ExperimentalFeatures; import com.sap.sailing.gwt.ui.actions.GetBoatPositionsAction; import com.sap.sailing.gwt.ui.actions.GetPolarAction; import com.sap.sailing.gwt.ui.actions.GetRaceMapDataAction; @@ -164,6 +165,7 @@ import com.sap.sse.gwt.client.shared.components.Component; import com.sap.sse.gwt.client.shared.components.SettingsDialog; import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent; import com.sap.sse.gwt.client.shared.settings.ComponentContext; +import com.sap.sse.gwt.shared.Branding; public class RaceMap extends AbstractCompositeComponent implements TimeListener, CompetitorSelectionChangeListener, RaceTimesInfoProviderListener, TailFactory, ColorMapperChangedListener, RequiresDataInitialization, RequiresResize, QuickRankProvider { @@ -763,7 +765,9 @@ public class RaceMap extends AbstractCompositeComponent impleme rootPanel.add(map, 0, 0); if (showHeaderPanel) { Image sapLogo = createSAPLogo(); - rootPanel.add(sapLogo); + if (Branding.getInstance().isActive()) { + rootPanel.add(sapLogo); + } } map.setControls(ControlPosition.LEFT_TOP, topLeftControlsWrapperPanel); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/databylogo/DataByLogo.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/databylogo/DataByLogo.java index 1e83fa9ed49..977628c3cdd 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/databylogo/DataByLogo.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/databylogo/DataByLogo.java @@ -6,12 +6,14 @@ import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.AnchorElement; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.ImageElement; +import com.google.gwt.dom.client.Style.Display; import com.google.gwt.resources.client.DataResource; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.domain.common.tracking.TrackingConnectorType; import com.sap.sailing.gwt.ui.shared.TrackingConnectorInfoDTO; +import com.sap.sse.gwt.shared.Branding; public class DataByLogo extends Widget { @@ -28,15 +30,21 @@ public class DataByLogo extends Widget { public DataByLogo() { DataByLogoResources.INSTANCE.css().ensureInjected(); setElement(uiBinder.createAndBindUi(this)); + if (!Branding.getInstance().isActive()) { + dataByContainer.getStyle().setDisplay(Display.NONE); + } } public void setUp(Set trackingConnectorInfos, boolean colorIfPossible, boolean enforceTextColor) { - TrackingConnectorInfoDTO mostProminentConnectorInfo = selectMostProminentConnectorInfo(trackingConnectorInfos); - if (mostProminentConnectorInfo == null) { - this.setVisible(false); - } else { - setUpForConnectorType(colorIfPossible, enforceTextColor, mostProminentConnectorInfo); + if (Branding.getInstance().isActive()) { + TrackingConnectorInfoDTO mostProminentConnectorInfo = selectMostProminentConnectorInfo( + trackingConnectorInfos); + if (mostProminentConnectorInfo == null) { + this.setVisible(false); + } else { + setUpForConnectorType(colorIfPossible, enforceTextColor, mostProminentConnectorInfo); + } } } @@ -68,8 +76,10 @@ public class DataByLogo extends Widget { private void setUpTracTracLogo(boolean colorIfPossible, boolean enforceTextColor) { final DataByLogoResources resources = DataByLogoResources.INSTANCE; + final DataResource imageToSet = colorIfPossible ? resources.tractracColor() : resources.tractracWhite(); logo.setSrc(imageToSet.getSafeUri().asString()); + if (enforceTextColor) { this.addStyleName(colorIfPossible ? resources.css().databylogo_black_text() : resources.css().databylogo_white_text()); diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/sapheader/SAPHeader.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/sapheader/SAPHeader.java index 3df57f8f5a3..77aa774c6db 100644 --- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/sapheader/SAPHeader.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/sapheader/SAPHeader.java @@ -11,6 +11,7 @@ import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; +import com.sap.sse.gwt.shared.Branding; /** * Generic header widget that is designed with a SAP logo and SAP color scheme. @@ -52,6 +53,10 @@ public class SAPHeader extends Composite { logoAnchor.setHref(LOGO_URL); String sapSailingUrl = applicationBaseUrl + "?locale=" + LocaleInfo.getCurrentLocale().getLocaleName(); applicationNameAnchor.setHref(sapSailingUrl); + + if (!Branding.getInstance().isActive()) { + logoAnchor.getStyle().setDisplay(Display.NONE); + } } public void setHeaderTitle(String title) { diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/shared/Branding.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/shared/Branding.java new file mode 100644 index 00000000000..75dda441f6a --- /dev/null +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/shared/Branding.java @@ -0,0 +1,22 @@ +package com.sap.sse.gwt.shared; + +public class Branding { + + private static final Branding INSTANCE; + + static { + INSTANCE = new Branding(); + } + + public static Branding getInstance() { + return INSTANCE; + } + + /** + * + * @return true when + */ + public boolean isActive() { + return false; + } +} From 2209ceb0f2bcd13affa293f42180ed79d861530e Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Fri, 14 Feb 2020 16:13:16 +0100 Subject: [PATCH 003/188] bug 5153 debranding logic for ui elements --- java/com.sap.sailing.gwt.ui/Home.html | 2 +- .../home/desktop/partials/footer/Footer.java | 23 +++++++++++++++++- .../desktop/partials/footer/Footer.ui.xml | 10 ++++---- .../home/desktop/partials/header/Header.java | 4 ++++ .../desktop/partials/header/Header.ui.xml | 2 +- .../partials/sharing/SharingButtons.java | 12 ++++++++++ .../partials/sharing/SharingButtons.ui.xml | 2 +- .../partials/socialfooter/SocialFooter.java | 13 +++++++++- .../partials/socialfooter/SocialFooter.ui.xml | 2 +- .../start/TabletAndDesktopStartView.java | 1 + .../start/TabletAndDesktopStartView.ui.xml | 2 +- .../home/mobile/partials/footer/Footer.java | 24 ++++++++++++++++++- .../home/mobile/partials/footer/Footer.ui.xml | 8 +++---- .../home/mobile/partials/header/Header.java | 10 ++++++++ .../home/mobile/partials/header/Header.ui.xml | 4 ++-- .../partials/socialfooter/SocialFooter.java | 10 ++++++++ .../partials/socialfooter/SocialFooter.ui.xml | 2 +- .../sailing/gwt/ui/client/StringMessages.java | 2 ++ .../gwt/ui/client/StringMessages.properties | 4 +++- 19 files changed, 116 insertions(+), 21 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/Home.html b/java/com.sap.sailing.gwt.ui/Home.html index 4cbc22ab4b9..784e87ad219 100644 --- a/java/com.sap.sailing.gwt.ui/Home.html +++ b/java/com.sap.sailing.gwt.ui/Home.html @@ -26,7 +26,7 @@ - + + @-webkit-keyframes pulsate { + 0% { + -webkit-transform:scale(.1); + transform:scale(.1); + opacity: 0.0; + } + 50% { + opacity:1; + } + 100% { + -webkit-transform:scale(1.2); + transform:scale(1.2); + opacity:0; + } + } + + @keyframes pulsate { + 0% { + -webkit-transform:scale(.1); + transform:scale(.1); + opacity: 0.0; + } + 50% { + opacity:1; + } + 100% { + -webkit-transform:scale(1.2); + transform:scale(1.2); + opacity:0; + } + } + @@ -130,10 +130,10 @@
-
-

${SAP}Sailing Analytics

-

Loading, please wait...

-
-
+
+

${SAP}Sailing Analytics

+

Loading, please wait...

+
+
diff --git a/java/com.sap.sailing.gwt.ui/AutoPlay.html b/java/com.sap.sailing.gwt.ui/AutoPlay.html index b1758f9d3fb..6785e56f117 100644 --- a/java/com.sap.sailing.gwt.ui/AutoPlay.html +++ b/java/com.sap.sailing.gwt.ui/AutoPlay.html @@ -13,8 +13,8 @@ - - + + diff --git a/java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.html b/java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.html index 60867dd6d23..1671479c264 100644 --- a/java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.html +++ b/java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.html @@ -2,9 +2,9 @@ - + ${SAP}Sailing Analytics Race Board @@ -12,15 +12,15 @@ - - - - - - - - - + + + + + + + + + - - + @-webkit-keyframes pulsate { + 0% { + -webkit-transform:scale(.1); + transform:scale(.1); + opacity: 0.0; + } + 50% { + opacity:1; + } + 100% { + -webkit-transform:scale(1.2); + transform:scale(1.2); + opacity:0; + } + } + + @keyframes pulsate { + 0% { + -webkit-transform:scale(.1); + transform:scale(.1); + opacity: 0.0; + } + 50% { + opacity:1; + } + 100% { + -webkit-transform:scale(1.2); + transform:scale(1.2); + opacity:0; + } + } + @@ -108,10 +108,10 @@
-
-

${SAP}Sailing Analytics

-

Loading, please wait...

-
-
+
+

${SAP}Sailing Analytics

+

Loading, please wait...

+
+
diff --git a/java/com.sap.sailing.gwt.ui/Home.html b/java/com.sap.sailing.gwt.ui/Home.html index d21455e9619..279937ebfe7 100644 --- a/java/com.sap.sailing.gwt.ui/Home.html +++ b/java/com.sap.sailing.gwt.ui/Home.html @@ -1,115 +1,115 @@ - - - - + + + + - ${SAP}Sailing - Homepage + ${SAP}Sailing - Homepage - - - - - + + + + + - + - - + + - + @-webkit-keyframes pulsate { + 0% { + -webkit-transform:scale(.1); + transform:scale(.1); + opacity: 0.0; + } + 50% { + opacity:1; + } + 100% { + -webkit-transform:scale(1.2); + transform:scale(1.2); + opacity:0; + } + } + + @keyframes pulsate { + 0% { + -webkit-transform:scale(.1); + transform:scale(.1); + opacity: 0.0; + } + 50% { + opacity:1; + } + 100% { + -webkit-transform:scale(1.2); + transform:scale(1.2); + opacity:0; + } + } + - - -
-

${SAP}Sailing Analytics

-

Loading, please wait...

-
-
+ + +
+

${SAP}Sailing Analytics

+

Loading, please wait...

+
+
diff --git a/java/com.sap.sailing.gwt.ui/Leaderboard.html b/java/com.sap.sailing.gwt.ui/Leaderboard.html index 72383292a43..72ad6bf2ced 100755 --- a/java/com.sap.sailing.gwt.ui/Leaderboard.html +++ b/java/com.sap.sailing.gwt.ui/Leaderboard.html @@ -12,10 +12,10 @@ - - - - + + + + diff --git a/java/com.sap.sailing.gwt.ui/LeaderboardEditing.html b/java/com.sap.sailing.gwt.ui/LeaderboardEditing.html index 3973fc16a08..405177ba705 100755 --- a/java/com.sap.sailing.gwt.ui/LeaderboardEditing.html +++ b/java/com.sap.sailing.gwt.ui/LeaderboardEditing.html @@ -8,7 +8,7 @@ - + diff --git a/java/com.sap.sailing.gwt.ui/RaceBoard.html b/java/com.sap.sailing.gwt.ui/RaceBoard.html index d569575d20d..3f4d25fa309 100644 --- a/java/com.sap.sailing.gwt.ui/RaceBoard.html +++ b/java/com.sap.sailing.gwt.ui/RaceBoard.html @@ -2,9 +2,9 @@ - + ${SAP}Sailing Analytics Race Board @@ -12,15 +12,15 @@ - - - - - - - - - + + + + + + + + + diff --git a/java/com.sap.sailing.gwt.ui/RegattaOverview.html b/java/com.sap.sailing.gwt.ui/RegattaOverview.html index 3dccd24a862..96aab467ee1 100644 --- a/java/com.sap.sailing.gwt.ui/RegattaOverview.html +++ b/java/com.sap.sailing.gwt.ui/RegattaOverview.html @@ -10,7 +10,7 @@ - + ${SAP}Sailing Analytics Regatta Overview @@ -21,10 +21,10 @@ }; + type="text/javascript" + language="javascript" + src="com.sap.sailing.gwt.regattaoverview.RegattaOverview/com.sap.sailing.gwt.regattaoverview.RegattaOverview.nocache.js" + > diff --git a/java/com.sap.sailing.gwt.ui/Simulator.html b/java/com.sap.sailing.gwt.ui/Simulator.html index 56039bc45ea..576850d8227 100644 --- a/java/com.sap.sailing.gwt.ui/Simulator.html +++ b/java/com.sap.sailing.gwt.ui/Simulator.html @@ -9,15 +9,14 @@ - - - - - - - + + + + + + + - + + + From ac632df3fc009badced5147f749ab8dc41e7cccd Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Mon, 6 Apr 2020 13:11:45 +0200 Subject: [PATCH 060/188] add key for rib dashboard favicon #5153 --- .../sap/sailing/debranding/ClientConfigurationServlet.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/java/com.sap.sailing.debranding/src/com/sap/sailing/debranding/ClientConfigurationServlet.java b/java/com.sap.sailing.debranding/src/com/sap/sailing/debranding/ClientConfigurationServlet.java index d303f218c7b..d9824046399 100644 --- a/java/com.sap.sailing.debranding/src/com/sap/sailing/debranding/ClientConfigurationServlet.java +++ b/java/com.sap.sailing.debranding/src/com/sap/sailing/debranding/ClientConfigurationServlet.java @@ -103,22 +103,26 @@ public class ClientConfigurationServlet extends HttpServlet { final String faviconPath; final String appiconPath; final String saplogoBrowserInfo; + final String ribDashboardIcon; if (deBrandingActive) { title = ""; faviconPath = "images/whitelabel.ico"; appiconPath = "images/sailing-app-icon.png"; saplogoBrowserInfo = ""; + ribDashboardIcon = "images/dashboardicon-whitelabeled.png"; } else { title = "SAP "; faviconPath = "images/sap.ico"; appiconPath = "images/sap-sailing-app-icon.png"; saplogoBrowserInfo = "
\"SAP\r\n"; + ribDashboardIcon = "images/dashboardicon.png"; } map.put("SAP", title); map.put("faviconPath", faviconPath); map.put("appiconPath", appiconPath); map.put("debrandingActive", Boolean.toString(deBrandingActive)); map.put("saplogoBrowserInfo", saplogoBrowserInfo); + map.put("ribDashboardIcon", ribDashboardIcon); return map; } } From 1fd3160e8012cb83b248e01e227561e042f393d9 Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Mon, 6 Apr 2020 13:12:18 +0200 Subject: [PATCH 061/188] add key for rib dashboard favicon, add image for whitelabel scenario #5153 --- .../images/dashboardicon-whitelabeled.png | Bin 0 -> 4831 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 java/com.sap.sailing.dashboards.gwt/images/dashboardicon-whitelabeled.png diff --git a/java/com.sap.sailing.dashboards.gwt/images/dashboardicon-whitelabeled.png b/java/com.sap.sailing.dashboards.gwt/images/dashboardicon-whitelabeled.png new file mode 100644 index 0000000000000000000000000000000000000000..d109e11fc07021bf5ed32a4bd3fdbccc112b62aa GIT binary patch literal 4831 zcmdT`XHb)Emrkfk69mQ3q$<6IjzAzl5}JT?MS21OA&>w8MXD7EO-hs^N)e+0IUeO zz9j%aBYb$okI)<MY$zv%mUkr%oG0`v2hyPI6K7FklwR+sR zM;R4=zNpZ!1F_zc9gI4=Di2q zz=PDM$ey^egDq@y_Lw-5YL}V+1z@Yq{k7_T*iA;>>D+yXPTRFEwY2?`os%qYTE?3# zA5vMlmGuQZg>G;t*`@D|Lc6#wWLRMCy?~8hxgq*)RCUuUEZV@|%F7&hp1+^t!AB2S zm-ve#_*2Es6pl4_mPHo658;z;ZReYU`H3a+$6C@j3tk){NHxmGbxiDbTo4o;y(8gw zEn1W9V7=nDn0zkePdBPC`OEy?@%;@bnT+BN)3>2!rNue+lxMNeDKXqAXX$)Er-wpB1R)me zq-W%>KvJVBCyC77w%-s&#dMrHWdhcJiJ4jHogme#KiZSe{O=ZJjnctV!pAf`_w3~>zd(3v) zi;Ds`Nw96^wfZlM{49R)E8NrS8oPj>7?o|s0@DONK=C&iwCuB=e99c3xGyboagk{W zr9ZT>Xip;rOL-bM?X>YF>~q8@kTBjAkrg1z^vngT4v9uXuo#ab%4H?8ONBQo`s9FJ zK1to^*dEC4nf6}&l3&weP;js*jCo$5JrpcG|Kr2p+oKP~uy0M|2`R9L>f|v4bw(9A zmLA6I2DhZsd_2(N%IBjRpBPpq@G*Wdbmb4RsC(SMH_WB2Rcos%`V!$GlNSmSe-2GD zHMuWGBJ*Mz7i4bDrB@}MyGy@bd!uK>zMWKw(!`BrX)%r|2=EAGnmEW>@u;!6Je z6W1ba)KJo=-puPVTs9wE^~*V)MH0nA+nb@5B<*&F4PED<8PP4A#b}+}t8?NuF*n*? zS7si&3-NL+@Q!w2J9bleq=OyUBcI1(qAjTu!5DPC6h-qK2#NUS{CFE(EEO=Zkn>T& z-x^i-# zF_DqZPcous25N>36)wlkb{9vUgDp)M5bjEM@G)^fIU0dBrzr> zLZ3zN(b|ef^nYn$_D8{D-1@uNVSOM9;G0w1#AL^}_||iPWe@L@hU^mQ#+W;EVe1T+ z&wSTl5l*E)>n%@wGb;{beX2U=aTnL+#yHM$V8hi)lK0M%Qt>`zryXl8tY+!meL$DV zAhaNe`3^Wq;3>el5O9XjP$NRnH%`TDPm0qPlqw1NA+`4c$heq7jvGj9G zb#CsXJBHhk$-7p~Zg|s?A2?^^DRf6Ki0?Hp*Q9l*@kRE1hgN+BMF=`B-q?L|Y^@yP z8hz6?mBG2M0JL#ba{PF))W*@ccL{{ijPugAO{>s;(5S21vF;3X+{t9Z6scw^EPR@RaIKnY&)JwNIn^d^W#4FgNgi_>nzpNurfji1T(QC5TR|>moR?K+gLD z7S6Ky=^|1(j?jN=R>?DBr5ZNJG;Cv|M6a{*Qu3nS2Mm3(_zDv<@9_Sy z&KU8N31P8$008iY7ZhrafI|No-iISQBP>x1-Ui|8aC(C_E>s)UZ5M(DmJ3P>SHn-l zI_FfLa0ryI*<^m8Bq}3Ii1Kb}iSH%Z?8{RpI%+j zTA2dsRkT{YQDuATFaYmxb5$Wp?mEpt<)YFJAg=jYa5?0(M&ruN%#!1MR896Cc2goG z87Pp5CwwxD!$;#oEAp{ZXW1%}a@n&v<3TvxSy*WwTa&-+xb#~8^F+h|=dC*(uH1c& z{YE#9&KdAoSjBDJC~jj~kRhY<$m81-IhMJq6r~X_HW7lDXhO^pP~d$FT~-SRWlNJ> zPo4SM)8+e!fF6oubfO#3`e}lX&d%xYEAOOD%+wG$r(RQC?N5tDgmZf;OE2w>mOGq{ z*alS(X&j(A)4z!}3=RszAU{+v{*!|gt?2;9Q`d&Xpygt6ra9(-saJ~+1Dcy<*e_v2 zy;nbO0=vy^`&64-gybD^zXYZQGuB?++cv3dI_(x0kds^ii#}Yc7+j5E`iJ`P`v$EG zKU7CCaCi%a4rdP@q}r^YDd{f<43u%bb5#wee>CNLh!u#sNPX4xO*2dEUPu3Zh=bn zBa>^hw8MA+J5AQZ<j*m@b(+v zk0bhrqd(>S+w<=-{ohK!S;YHcWIy0qy|EqfPz!>8N;k_-QKXIN2OP>D0l$nCX@9-? zo94d-{*?ExQ2vznZ_od)5}4qr;Ak%JTsB)ke==h;4n{4Tp#=(yLX52QEmEvf{Dr{H z;ou_68dXWeN;;z=?F3JXXr|Rr{)?1G^}CJg>_lMD3tF+B%tWI=%k_|PWZWmSv$jhI z@et&6OmXHRW0ePTDJ}qKo7pTY0>%jE_l}1&nE0iwQ@?Enl>{%r&1MyY-*2T?fo*ka z!gqW=m%S>TPi!l_DhI~saaXrJh!uM!H?L~kV1KLAXZHF0$|BC~oZaG%5x)E@T>6&--Wc zYO*S}HA-)9ocmag&2lhC6C8>69E!T^1wQob_XhXaE4DKbT~1#$u`W}-Y|~UyZ<5-J zmW8eK*9UElg!JK0hcEb<+U%xGO^(0lk#_}Eb-4rQN&is7OT``u` zPf8Pu+Oj$fAUn_B3(NFBE_6jVx?kPuU#mql7ofBgN5&?thbIZ&Z%ckM^1bQ1B?!LS zIBmVZpDc1#8?haTGodvj92-z0JBX|~KO9><4mM3ro?6pJQqY@9sUhxmo)F{~zL2-= z7V`bFf@2N%T}^Gd%{c*D;#jiRgU(a&0$LC9y|PfmF};EjX`)l+97b-{a2(2$K%Be+ zcDv{Gz#aMIHD6L9k3x6?k^h+_am;tu5OB6vb>N?!llK7sDA&?Z}wxj!uAb|D(xqdsF>rV8J1dKriz7+qbOwU-svX5>ZEG$kV@aOZ%z4j`L$`e Ya5YW_mZ*lRpPLoJz)ZhX&pGPf0Kfm2TL1t6 literal 0 HcmV?d00001 From c741633622ef318b96873b34ca6c1de1ab077193 Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Mon, 6 Apr 2020 13:12:42 +0200 Subject: [PATCH 062/188] cleanup indentation tab -> space #5153 --- .../RibDashboard.html | 59 ++++++++----------- 1 file changed, 23 insertions(+), 36 deletions(-) diff --git a/java/com.sap.sailing.dashboards.gwt/RibDashboard.html b/java/com.sap.sailing.dashboards.gwt/RibDashboard.html index 9277c81feb4..b6be198a56f 100644 --- a/java/com.sap.sailing.dashboards.gwt/RibDashboard.html +++ b/java/com.sap.sailing.dashboards.gwt/RibDashboard.html @@ -7,51 +7,38 @@ - - - - - - - - -Dashboard - - - - - - - - + + + + Dashboard + + + + - - - - - - - - + + + + From fefbaba36451e394dbf61f11e4782487f03ebb7d Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Mon, 6 Apr 2020 13:22:39 +0200 Subject: [PATCH 063/188] show SAP logo only when branding information shall be displayed #5153 --- .../dashboards/gwt/client/header/DashboardHeader.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/header/DashboardHeader.java b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/header/DashboardHeader.java index 3f641a2b5b3..0237b3991bc 100644 --- a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/header/DashboardHeader.java +++ b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/header/DashboardHeader.java @@ -12,6 +12,7 @@ import com.google.gwt.user.client.ui.HasWidgets; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sse.gwt.shared.Branding; public class DashboardHeader extends Composite implements HasWidgets { @@ -37,7 +38,9 @@ public class DashboardHeader extends Composite implements HasWidgets { public DashboardHeader() { dashboardHeaderResources.gss().ensureInjected(); initWidget(uiBinder.createAndBindUi(this)); - sapLogo.setResource(DashboardHeaderResources.INSTANCE.sapLogo()); + if (Branding.getInstance().isActive()) { + sapLogo.setResource(DashboardHeaderResources.INSTANCE.sapLogo()); + } event.setInnerHTML(StringMessages.INSTANCE.dashboardHeader()); } From c6c7b2a3c062250f23bafe37e5809c021fbf5189 Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Mon, 6 Apr 2020 13:35:33 +0200 Subject: [PATCH 064/188] fix documentation #5153 --- .../sap/sailing/debranding/ClientConfigurationServlet.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.debranding/src/com/sap/sailing/debranding/ClientConfigurationServlet.java b/java/com.sap.sailing.debranding/src/com/sap/sailing/debranding/ClientConfigurationServlet.java index d9824046399..96d7e26f9c9 100644 --- a/java/com.sap.sailing.debranding/src/com/sap/sailing/debranding/ClientConfigurationServlet.java +++ b/java/com.sap.sailing.debranding/src/com/sap/sailing/debranding/ClientConfigurationServlet.java @@ -32,13 +32,13 @@ import org.apache.http.HttpStatus; * * * faviconPath + * images/sap.ico * images/whitelabel.ico - * * * * appiconPath * images/sap-sailing-app-icon.png - * + * images/sailing-app-icon.png * * * debrandingActive From 9c2ef66c60018b2a75a9065ea1aca23b0924af35 Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Mon, 6 Apr 2020 15:26:36 +0200 Subject: [PATCH 065/188] cleanup #5153 --- .../WEB-INF/web.xml | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/java/com.sap.sailing.dashboards.gwt/WEB-INF/web.xml b/java/com.sap.sailing.dashboards.gwt/WEB-INF/web.xml index 7df447fe2a2..5324d0ca3a9 100644 --- a/java/com.sap.sailing.dashboards.gwt/WEB-INF/web.xml +++ b/java/com.sap.sailing.dashboards.gwt/WEB-INF/web.xml @@ -23,6 +23,10 @@ SailingService com.sap.sailing.gwt.ui.server.SailingServiceImpl + + SailingService + /service/sailing + ClientConfigurationServlet @@ -34,11 +38,6 @@ *.html - - SailingService - /service/sailing - - LocaleInjectionFilter com.sap.sse.security.ui.server.LocaleInjectionFilter @@ -48,16 +47,16 @@ *.html - - GWTCacheControlServletFilter - com.sap.sse.gwt.server.GWTCacheControlServletFilter - - - GWTCacheControlServletFilter - /* - + + GWTCacheControlServletFilter + com.sap.sse.gwt.server.GWTCacheControlServletFilter + + + GWTCacheControlServletFilter + /* + - + Dashboard Dispatch Service dashboardDispatch com.sap.sailing.dashboards.gwt.server.DashboardDispatchServlet From 8a6ddba5ec9117e17937c688a896d8e2f1fad4ec Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Mon, 6 Apr 2020 15:27:10 +0200 Subject: [PATCH 066/188] add debranding to security project #5153 --- java/com.sap.sse.security.ui/EditProfile.html | 8 +- .../EmailValidation.html | 8 +- java/com.sap.sse.security.ui/Login.html | 8 +- .../META-INF/MANIFEST.MF | 1 + java/com.sap.sse.security.ui/OAuthLogin.html | 2 +- java/com.sap.sse.security.ui/Register.html | 6 +- .../UserManagement.html | 2 +- java/com.sap.sse.security.ui/WEB-INF/web.xml | 174 +++++++++--------- .../sap/sse/security/ui/login/LoginView.java | 8 + .../sse/security/ui/login/LoginView.ui.xml | 2 +- .../ui/registration/RegisterView.java | 7 + .../ui/registration/RegisterView.ui.xml | 2 +- 12 files changed, 135 insertions(+), 93 deletions(-) diff --git a/java/com.sap.sse.security.ui/EditProfile.html b/java/com.sap.sse.security.ui/EditProfile.html index f9da47b2982..818579c4cfe 100755 --- a/java/com.sap.sse.security.ui/EditProfile.html +++ b/java/com.sap.sse.security.ui/EditProfile.html @@ -18,11 +18,15 @@ - SAP Sailing Analytics Login + ${SAP}Sailing Analytics Login - + diff --git a/java/com.sap.sse.security.ui/EmailValidation.html b/java/com.sap.sse.security.ui/EmailValidation.html index 270c4a9e123..65502f03fed 100755 --- a/java/com.sap.sse.security.ui/EmailValidation.html +++ b/java/com.sap.sse.security.ui/EmailValidation.html @@ -18,11 +18,15 @@ - SAP Sailing Analytics Login + ${SAP}Sailing Analytics Login - + diff --git a/java/com.sap.sse.security.ui/Login.html b/java/com.sap.sse.security.ui/Login.html index 7034b1a4e64..401296d90ff 100644 --- a/java/com.sap.sse.security.ui/Login.html +++ b/java/com.sap.sse.security.ui/Login.html @@ -18,12 +18,16 @@ - SAP Sailing Analytics Login + ${SAP}Sailing Analytics Login - + diff --git a/java/com.sap.sse.security.ui/META-INF/MANIFEST.MF b/java/com.sap.sse.security.ui/META-INF/MANIFEST.MF index 5374aa4e408..b20fa52f5d0 100644 --- a/java/com.sap.sse.security.ui/META-INF/MANIFEST.MF +++ b/java/com.sap.sse.security.ui/META-INF/MANIFEST.MF @@ -21,6 +21,7 @@ Require-Bundle: javax.servlet;bundle-version="3.1.0", com.sap.sse.gwt, org.apache.shiro.core;bundle-version="1.2.2", org.apache.shiro.web;bundle-version="1.2.2", + com.sap.sailing.debranding, com.sap.sse.replication, com.sap.sse.security.common, com.sap.sse.mail diff --git a/java/com.sap.sse.security.ui/OAuthLogin.html b/java/com.sap.sse.security.ui/OAuthLogin.html index 5cbbe3bcc84..076732c2c8e 100644 --- a/java/com.sap.sse.security.ui/OAuthLogin.html +++ b/java/com.sap.sse.security.ui/OAuthLogin.html @@ -12,7 +12,7 @@ - + diff --git a/java/com.sap.sse.security.ui/Register.html b/java/com.sap.sse.security.ui/Register.html index 280e3023379..2306b5e12c8 100644 --- a/java/com.sap.sse.security.ui/Register.html +++ b/java/com.sap.sse.security.ui/Register.html @@ -23,7 +23,11 @@ - + diff --git a/java/com.sap.sse.security.ui/UserManagement.html b/java/com.sap.sse.security.ui/UserManagement.html index 226498dac25..2c1ef9ff41c 100644 --- a/java/com.sap.sse.security.ui/UserManagement.html +++ b/java/com.sap.sse.security.ui/UserManagement.html @@ -12,7 +12,7 @@ - + diff --git a/java/com.sap.sse.security.ui/WEB-INF/web.xml b/java/com.sap.sse.security.ui/WEB-INF/web.xml index 6a63530ab9f..200abe2f8a0 100644 --- a/java/com.sap.sse.security.ui/WEB-INF/web.xml +++ b/java/com.sap.sse.security.ui/WEB-INF/web.xml @@ -1,48 +1,48 @@ - - - - default - org.eclipse.jetty.servlet.DefaultServlet - - - dirAllowed - false - - - useFileMappedBuffer - false - - + xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" + version="2.5"> + + + + default + org.eclipse.jetty.servlet.DefaultServlet + + + dirAllowed + false + + + useFileMappedBuffer + false + + - - - shiroEnvironmentClass - org.apache.shiro.web.env.IniWebEnvironment - - - org.apache.shiro.web.env.EnvironmentLoaderListener - - - - ShiroFilter - org.apache.shiro.web.servlet.ShiroFilter - - - - ShiroFilter - /* - REQUEST - FORWARD - INCLUDE - ERROR - + + + shiroEnvironmentClass + org.apache.shiro.web.env.IniWebEnvironment + + + org.apache.shiro.web.env.EnvironmentLoaderListener + + + + ShiroFilter + org.apache.shiro.web.servlet.ShiroFilter + + + + ShiroFilter + /* + REQUEST + FORWARD + INCLUDE + ERROR + GWTCacheControlServletFilter @@ -52,47 +52,57 @@ GWTCacheControlServletFilter /* - - - LocaleInjectionFilter - com.sap.sse.security.ui.server.LocaleInjectionFilter - - - LocaleInjectionFilter - *.html - - - User Management Service - UserManagementService - com.sap.sse.security.ui.server.UserManagementServiceImpl - - - UserManagementService - /service/usermanagement - + + ClientConfigurationServlet + ClientConfigurationServlet + com.sap.sailing.debranding.ClientConfigurationServlet + + + ClientConfigurationServlet + *.html + - - Redirect Servlet - RedirectServlet - com.sap.sse.security.ui.servlet.RedirectServlet - - - RedirectServlet - /redirect - + + LocaleInjectionFilter + com.sap.sse.security.ui.server.LocaleInjectionFilter + + + LocaleInjectionFilter + *.html + - - - remoteLogging - com.google.gwt.logging.server.RemoteLoggingServiceImpl - - - remoteLogging - /com.sap.sse.security.ui.OAuthLogin/remote_logging - /com.sap.sse.security.ui.Login/remote_logging - /com.sap.sse.security.ui.UserManagement/remote_logging - /com.sap.sse.security.ui.EditProfile/remote_logging - /com.sap.sse.security.ui.EmailValidation/remote_logging - + + User Management Service + UserManagementService + com.sap.sse.security.ui.server.UserManagementServiceImpl + + + UserManagementService + /service/usermanagement + + + + Redirect Servlet + RedirectServlet + com.sap.sse.security.ui.servlet.RedirectServlet + + + RedirectServlet + /redirect + + + + + remoteLogging + com.google.gwt.logging.server.RemoteLoggingServiceImpl + + + remoteLogging + /com.sap.sse.security.ui.OAuthLogin/remote_logging + /com.sap.sse.security.ui.Login/remote_logging + /com.sap.sse.security.ui.UserManagement/remote_logging + /com.sap.sse.security.ui.EditProfile/remote_logging + /com.sap.sse.security.ui.EmailValidation/remote_logging + diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/login/LoginView.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/login/LoginView.java index 9214aacdcd5..c9430d32eac 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/login/LoginView.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/login/LoginView.java @@ -3,6 +3,8 @@ package com.sap.sse.security.ui.login; import java.util.Collections; import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.ImageElement; +import com.google.gwt.dom.client.Style.Display; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.logical.shared.AttachEvent; import com.google.gwt.event.logical.shared.AttachEvent.Handler; @@ -22,6 +24,7 @@ import com.sap.sse.gwt.client.Notification.NotificationType; import com.sap.sse.gwt.client.controls.PasswordTextBoxWithWatermark; import com.sap.sse.gwt.client.controls.TextBoxWithWatermark; import com.sap.sse.gwt.client.dialog.DialogUtils; +import com.sap.sse.gwt.shared.Branding; import com.sap.sse.security.ui.client.EntryPointLinkFactory; import com.sap.sse.security.ui.client.UserManagementServiceAsync; import com.sap.sse.security.ui.client.UserService; @@ -47,6 +50,7 @@ public class LoginView extends Composite { @UiField Button loginButton; @UiField Anchor signUpAnchor; @UiField HTMLPanel oAuthPanel; + @UiField ImageElement logoImage; public LoginView(UserManagementServiceAsync userManagementService, UserService userService, StringMessages stringMessages, String appName) { this.userManagementService = userManagementService; @@ -69,6 +73,10 @@ public class LoginView extends Composite { userNameTextBox.setFocus(true); } }); + + if (!Branding.getInstance().isActive()) { + logoImage.getStyle().setDisplay(Display.NONE); + } } @UiHandler("loginButton") diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/login/LoginView.ui.xml b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/login/LoginView.ui.xml index d6bb64969ec..afc790fbd57 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/login/LoginView.ui.xml +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/login/LoginView.ui.xml @@ -8,7 +8,7 @@ type="com.sap.sse.security.ui.login.LoginViewResources" />
- +
diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/registration/RegisterView.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/registration/RegisterView.java index 94b7fd23c34..7c36cb11842 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/registration/RegisterView.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/registration/RegisterView.java @@ -3,6 +3,8 @@ package com.sap.sse.security.ui.registration; import java.util.HashMap; import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.ImageElement; +import com.google.gwt.dom.client.Style.Display; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.KeyUpEvent; import com.google.gwt.event.dom.client.KeyUpHandler; @@ -20,6 +22,7 @@ import com.sap.sse.gwt.client.Notification.NotificationType; import com.sap.sse.gwt.client.controls.PasswordTextBoxWithWatermark; import com.sap.sse.gwt.client.controls.TextBoxWithWatermark; import com.sap.sse.gwt.client.dialog.DialogUtils; +import com.sap.sse.gwt.shared.Branding; import com.sap.sse.security.shared.UserManagementException; import com.sap.sse.security.shared.dto.UserDTO; import com.sap.sse.security.ui.client.EntryPointLinkFactory; @@ -43,6 +46,7 @@ public class RegisterView extends Composite { @UiField TextBoxWithWatermark emailTextBox; @UiField PasswordTextBoxWithWatermark passwordTextBox; @UiField PasswordTextBoxWithWatermark password2TextBox; + @UiField ImageElement logoImage; public RegisterView(UserManagementServiceAsync userManagementService, StringMessages stringMessages, String appName) { this.userManagementService = userManagementService; @@ -74,6 +78,9 @@ public class RegisterView extends Composite { password2TextBox.addKeyUpHandler(keyUpHandler); DialogUtils.linkEnterToButton(signUpButton, usernameTextBox, emailTextBox, passwordTextBox, password2TextBox); + if (!Branding.getInstance().isActive()) { + logoImage.getStyle().setDisplay(Display.NONE); + } } @UiHandler("signUpButton") diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/registration/RegisterView.ui.xml b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/registration/RegisterView.ui.xml index 680b85a2e17..56fb679a92d 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/registration/RegisterView.ui.xml +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/registration/RegisterView.ui.xml @@ -7,7 +7,7 @@
- +
From 66a2f068f0c01ffe3849f212db24caac74343507 Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Mon, 6 Apr 2020 16:47:10 +0200 Subject: [PATCH 067/188] renam bundle from com.sap.sailing.debranding to com.sap.sse.debranding --- java/com.sap.sailing.dashboards.gwt/META-INF/MANIFEST.MF | 2 +- java/com.sap.sailing.dashboards.gwt/WEB-INF/web.xml | 2 +- java/com.sap.sailing.feature/feature.xml | 2 +- java/com.sap.sailing.gwt.ui/META-INF/MANIFEST.MF | 2 +- java/com.sap.sailing.gwt.ui/WEB-INF/web.xml | 2 +- .../SailingServer (No Proxy OSX).launch | 2 +- .../SailingServer (No Proxy, Cached MTB).launch | 2 +- .../SailingServer (No Proxy, Igtimi Local Test).launch | 2 +- .../SailingServer (No Proxy, Java11).launch | 2 +- .../SailingServer (No Proxy, Java11, JFR Recording).launch | 2 +- .../SailingServer (No Proxy, Jetty on 8889).launch | 2 +- ...ilingServer (No Proxy, Jetty on 8889, Cached MTB).launch | 2 +- ... Proxy, Jetty on 8889, auto-replicate SS and SSD).launch | 2 +- ...ver (No Proxy, Jetty on 8889, auto-replicate dev).launch | 2 +- ...gServer (No Proxy, Jetty on 8889, auto-replicate).launch | 2 +- .../SailingServer (No Proxy, Jetty on 8890).launch | 2 +- ...tty on 8890, auto-replicate from replica at 8889).launch | 2 +- .../SailingServer (No Proxy, Remote Debug SAP VM).launch | 2 +- .../SailingServer (No Proxy, bundesliga2-2017 DB).launch | 2 +- .../SailingServer (No Proxy, debranding active).launch | 4 ++-- .../SailingServer (No Proxy, winddbTest).launch | 2 +- ...n 8889, Polar & Wind estimation Import from 8888).launch | 2 +- java/com.sap.sailing.www/META-INF/MANIFEST.MF | 2 +- java/com.sap.sailing.www/WEB-INF/web.xml | 2 +- java/com.sap.sailing.www/release_notes_admin.html | 2 +- .../.classpath | 0 .../.gitignore | 0 .../.project | 2 +- .../.settings/org.eclipse.jdt.core.prefs | 0 .../META-INF/MANIFEST.MF | 6 +++--- .../build.properties | 0 .../pom.xml | 2 +- .../com/sap/sse}/debranding/ClientConfigurationServlet.java | 4 ++-- java/com.sap.sse.security.ui/META-INF/MANIFEST.MF | 2 +- java/com.sap.sse.security.ui/WEB-INF/web.xml | 2 +- java/pom.xml | 2 +- java/target/env.sh | 4 ++-- 37 files changed, 38 insertions(+), 38 deletions(-) rename java/{com.sap.sailing.debranding => com.sap.sse.debranding}/.classpath (100%) rename java/{com.sap.sailing.debranding => com.sap.sse.debranding}/.gitignore (100%) rename java/{com.sap.sailing.debranding => com.sap.sse.debranding}/.project (93%) rename java/{com.sap.sailing.debranding => com.sap.sse.debranding}/.settings/org.eclipse.jdt.core.prefs (100%) mode change 100755 => 100644 rename java/{com.sap.sailing.debranding => com.sap.sse.debranding}/META-INF/MANIFEST.MF (71%) rename java/{com.sap.sailing.debranding => com.sap.sse.debranding}/build.properties (100%) rename java/{com.sap.sailing.debranding => com.sap.sse.debranding}/pom.xml (89%) rename java/{com.sap.sailing.debranding/src/com/sap/sailing => com.sap.sse.debranding/src/com/sap/sse}/debranding/ClientConfigurationServlet.java (98%) diff --git a/java/com.sap.sailing.dashboards.gwt/META-INF/MANIFEST.MF b/java/com.sap.sailing.dashboards.gwt/META-INF/MANIFEST.MF index 848e4030e4f..de6b585902a 100644 --- a/java/com.sap.sailing.dashboards.gwt/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.dashboards.gwt/META-INF/MANIFEST.MF @@ -12,7 +12,7 @@ Require-Bundle: com.sap.sailing.domain, com.google.gwt.user;bundle-version="2.8.2";resolution:=optional, com.google.gwt.servlet;bundle-version="2.8.2", com.sap.sse.common, - com.sap.sailing.debranding, + com.sap.sse.debranding, com.sap.sailing.domain.common, com.sap.sailing.domain.shared.android, com.sap.sailing.gwt.ui, diff --git a/java/com.sap.sailing.dashboards.gwt/WEB-INF/web.xml b/java/com.sap.sailing.dashboards.gwt/WEB-INF/web.xml index 5324d0ca3a9..48a75890c33 100644 --- a/java/com.sap.sailing.dashboards.gwt/WEB-INF/web.xml +++ b/java/com.sap.sailing.dashboards.gwt/WEB-INF/web.xml @@ -31,7 +31,7 @@ ClientConfigurationServlet ClientConfigurationServlet - com.sap.sailing.debranding.ClientConfigurationServlet + com.sap.sse.debranding.ClientConfigurationServlet ClientConfigurationServlet diff --git a/java/com.sap.sailing.feature/feature.xml b/java/com.sap.sailing.feature/feature.xml index fa5da9e742f..6e95cc98723 100755 --- a/java/com.sap.sailing.feature/feature.xml +++ b/java/com.sap.sailing.feature/feature.xml @@ -495,7 +495,7 @@ Computes leaderboard information for sailing races and offers RESTful APIs to al unpack="false"/> ClientConfigurationServlet ClientConfigurationServlet - com.sap.sailing.debranding.ClientConfigurationServlet + com.sap.sse.debranding.ClientConfigurationServlet ClientConfigurationServlet diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy OSX).launch b/java/com.sap.sailing.server/SailingServer (No Proxy OSX).launch index 4e6198a26d2..9aafc3a2f86 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy OSX).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy OSX).launch @@ -34,5 +34,5 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch index c8d344deeec..76e1b14d262 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch @@ -33,5 +33,5 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Igtimi Local Test).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Igtimi Local Test).launch index 83e8156fa8e..6d9cbf74bc3 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Igtimi Local Test).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Igtimi Local Test).launch @@ -36,5 +36,5 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Java11).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Java11).launch index 6d4babb670a..78af2fe21ef 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Java11).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Java11).launch @@ -36,5 +36,5 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Java11, JFR Recording).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Java11, JFR Recording).launch index 11e85dbce05..555b761a598 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Java11, JFR Recording).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Java11, JFR Recording).launch @@ -36,5 +36,5 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch index 92c655b0858..2263694bcc2 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch @@ -27,6 +27,6 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch index e0d5adb2209..e542d8163b0 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch @@ -27,6 +27,6 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate SS and SSD).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate SS and SSD).launch index ede72957719..05981685eb0 100644 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate SS and SSD).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate SS and SSD).launch @@ -29,6 +29,6 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate dev).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate dev).launch index c1d3389f7b1..e42be423ebf 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate dev).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate dev).launch @@ -27,6 +27,6 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate).launch index 1b6cdddfc83..c09d02aeb8b 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate).launch @@ -29,6 +29,6 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch index d4fb8440ec6..1f4382fbb33 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch @@ -27,6 +27,6 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890, auto-replicate from replica at 8889).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890, auto-replicate from replica at 8889).launch index 6e9dc93fb46..9ab0d7de54a 100644 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890, auto-replicate from replica at 8889).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890, auto-replicate from replica at 8889).launch @@ -27,6 +27,6 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch index 6b8a0fb516b..dc928839e90 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch @@ -27,5 +27,5 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, bundesliga2-2017 DB).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, bundesliga2-2017 DB).launch index c7c7603d51f..a8de4eee4af 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, bundesliga2-2017 DB).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, bundesliga2-2017 DB).launch @@ -36,5 +36,5 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, debranding active).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, debranding active).launch index d843823fd89..2a78e4b10bc 100644 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, debranding active).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, debranding active).launch @@ -23,7 +23,7 @@ - + @@ -33,7 +33,7 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch index 9e8615163cc..c5d5764e2a3 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch @@ -33,5 +33,5 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889, Polar & Wind estimation Import from 8888).launch b/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889, Polar & Wind estimation Import from 8888).launch index 292fa88467d..f6348129654 100755 --- a/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889, Polar & Wind estimation Import from 8888).launch +++ b/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889, Polar & Wind estimation Import from 8888).launch @@ -27,6 +27,6 @@ - + diff --git a/java/com.sap.sailing.www/META-INF/MANIFEST.MF b/java/com.sap.sailing.www/META-INF/MANIFEST.MF index e8ea2957116..269504e4181 100644 --- a/java/com.sap.sailing.www/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.www/META-INF/MANIFEST.MF @@ -11,4 +11,4 @@ Import-Package: javax.servlet;version="3.1.0", javax.servlet.http;version="3.1.0" Bundle-ClassPath: . Bundle-ActivationPolicy: lazy -Require-Bundle: com.sap.sailing.debranding +Require-Bundle: com.sap.sse.debranding diff --git a/java/com.sap.sailing.www/WEB-INF/web.xml b/java/com.sap.sailing.www/WEB-INF/web.xml index bc67aec9235..a8cebe1b367 100644 --- a/java/com.sap.sailing.www/WEB-INF/web.xml +++ b/java/com.sap.sailing.www/WEB-INF/web.xml @@ -20,7 +20,7 @@ ClientConfigurationServlet ClientConfigurationServlet - com.sap.sailing.debranding.ClientConfigurationServlet + com.sap.sse.debranding.ClientConfigurationServlet ClientConfigurationServlet diff --git a/java/com.sap.sailing.www/release_notes_admin.html b/java/com.sap.sailing.www/release_notes_admin.html index c6f1597e14b..21ca3679762 100755 --- a/java/com.sap.sailing.www/release_notes_admin.html +++ b/java/com.sap.sailing.www/release_notes_admin.html @@ -31,7 +31,7 @@

March 2020

    -
  • White label: Removal of SAP logos and brand related text from home page and racing panels. Use system property
    -Dcom.sap.sailing.debranding=true
    +
  • White label: Removal of SAP logos and brand related text from home page and racing panels. Use system property
    -Dcom.sap.sse.debranding=true
  • The visualization for ORC certificates has been much improved. It now shows all the diff --git a/java/com.sap.sailing.debranding/.classpath b/java/com.sap.sse.debranding/.classpath similarity index 100% rename from java/com.sap.sailing.debranding/.classpath rename to java/com.sap.sse.debranding/.classpath diff --git a/java/com.sap.sailing.debranding/.gitignore b/java/com.sap.sse.debranding/.gitignore similarity index 100% rename from java/com.sap.sailing.debranding/.gitignore rename to java/com.sap.sse.debranding/.gitignore diff --git a/java/com.sap.sailing.debranding/.project b/java/com.sap.sse.debranding/.project similarity index 93% rename from java/com.sap.sailing.debranding/.project rename to java/com.sap.sse.debranding/.project index 0f938e58f94..d4fa376096f 100644 --- a/java/com.sap.sailing.debranding/.project +++ b/java/com.sap.sse.debranding/.project @@ -1,6 +1,6 @@ - com.sap.sailing.debranding + com.sap.sse.debranding diff --git a/java/com.sap.sailing.debranding/.settings/org.eclipse.jdt.core.prefs b/java/com.sap.sse.debranding/.settings/org.eclipse.jdt.core.prefs old mode 100755 new mode 100644 similarity index 100% rename from java/com.sap.sailing.debranding/.settings/org.eclipse.jdt.core.prefs rename to java/com.sap.sse.debranding/.settings/org.eclipse.jdt.core.prefs diff --git a/java/com.sap.sailing.debranding/META-INF/MANIFEST.MF b/java/com.sap.sse.debranding/META-INF/MANIFEST.MF similarity index 71% rename from java/com.sap.sailing.debranding/META-INF/MANIFEST.MF rename to java/com.sap.sse.debranding/META-INF/MANIFEST.MF index 3bdbd2cf183..c2a3e538351 100644 --- a/java/com.sap.sailing.debranding/META-INF/MANIFEST.MF +++ b/java/com.sap.sse.debranding/META-INF/MANIFEST.MF @@ -1,8 +1,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: debranding -Bundle-SymbolicName: com.sap.sailing.debranding -Automatic-Module-Name: com.sap.sailing.debranding +Bundle-SymbolicName: com.sap.sse.debranding +Automatic-Module-Name: com.sap.sse.debranding Bundle-Version: 1.0.0.qualifier Bundle-Vendor: SAP Bundle-RequiredExecutionEnvironment: JavaSE-1.8 @@ -12,4 +12,4 @@ Import-Package: javax.servlet;version="3.1.0", Bundle-ClassPath: . Bundle-ActivationPolicy: lazy Require-Bundle: org.apache.commons.io -Export-Package: com.sap.sailing.debranding +Export-Package: com.sap.sse.debranding diff --git a/java/com.sap.sailing.debranding/build.properties b/java/com.sap.sse.debranding/build.properties similarity index 100% rename from java/com.sap.sailing.debranding/build.properties rename to java/com.sap.sse.debranding/build.properties diff --git a/java/com.sap.sailing.debranding/pom.xml b/java/com.sap.sse.debranding/pom.xml similarity index 89% rename from java/com.sap.sailing.debranding/pom.xml rename to java/com.sap.sse.debranding/pom.xml index e2a9e405ef3..9a692ef46cb 100644 --- a/java/com.sap.sailing.debranding/pom.xml +++ b/java/com.sap.sse.debranding/pom.xml @@ -10,6 +10,6 @@ 1.0.0-SNAPSHOT - com.sap.sailing.debranding + com.sap.sse.debranding eclipse-plugin diff --git a/java/com.sap.sailing.debranding/src/com/sap/sailing/debranding/ClientConfigurationServlet.java b/java/com.sap.sse.debranding/src/com/sap/sse/debranding/ClientConfigurationServlet.java similarity index 98% rename from java/com.sap.sailing.debranding/src/com/sap/sailing/debranding/ClientConfigurationServlet.java rename to java/com.sap.sse.debranding/src/com/sap/sse/debranding/ClientConfigurationServlet.java index 96d7e26f9c9..e437456619a 100644 --- a/java/com.sap.sailing.debranding/src/com/sap/sailing/debranding/ClientConfigurationServlet.java +++ b/java/com.sap.sse.debranding/src/com/sap/sse/debranding/ClientConfigurationServlet.java @@ -1,4 +1,4 @@ -package com.sap.sailing.debranding; +package com.sap.sse.debranding; import java.io.IOException; import java.io.InputStream; @@ -63,7 +63,7 @@ public class ClientConfigurationServlet extends HttpServlet { /** serial version uid */ private static final long serialVersionUID = -2228462977010198686L; - public static final String DEBRANDING_PROPERTY_NAME = "com.sap.sailing.debranding"; + public static final String DEBRANDING_PROPERTY_NAME = "com.sap.sse.debranding"; private final ConcurrentHashMap cache = new ConcurrentHashMap<>(); diff --git a/java/com.sap.sse.security.ui/META-INF/MANIFEST.MF b/java/com.sap.sse.security.ui/META-INF/MANIFEST.MF index b20fa52f5d0..53159d5c61d 100644 --- a/java/com.sap.sse.security.ui/META-INF/MANIFEST.MF +++ b/java/com.sap.sse.security.ui/META-INF/MANIFEST.MF @@ -21,7 +21,7 @@ Require-Bundle: javax.servlet;bundle-version="3.1.0", com.sap.sse.gwt, org.apache.shiro.core;bundle-version="1.2.2", org.apache.shiro.web;bundle-version="1.2.2", - com.sap.sailing.debranding, + com.sap.sse.debranding, com.sap.sse.replication, com.sap.sse.security.common, com.sap.sse.mail diff --git a/java/com.sap.sse.security.ui/WEB-INF/web.xml b/java/com.sap.sse.security.ui/WEB-INF/web.xml index 200abe2f8a0..e960b82cd8a 100644 --- a/java/com.sap.sse.security.ui/WEB-INF/web.xml +++ b/java/com.sap.sse.security.ui/WEB-INF/web.xml @@ -56,7 +56,7 @@ ClientConfigurationServlet ClientConfigurationServlet - com.sap.sailing.debranding.ClientConfigurationServlet + com.sap.sse.debranding.ClientConfigurationServlet ClientConfigurationServlet diff --git a/java/pom.xml b/java/pom.xml index 69c74f4bb4e..134e4ef4887 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -174,7 +174,7 @@ com.sap.sailing.server.trackfiles com.sap.sailing.feature.runtime com.sap.sailing.gwt.ui - com.sap.sailing.debranding + com.sap.sse.debranding com.sap.sailing.domain.test com.sap.sse.replication.testsupport com.sap.sailing.server.testsupport diff --git a/java/target/env.sh b/java/target/env.sh index bf1d0e93ab2..2db773c2166 100755 --- a/java/target/env.sh +++ b/java/target/env.sh @@ -163,8 +163,8 @@ else JAVA_VERSION_SPECIFIC_ARGS=$JAVA_8_ARGS fi -# White labeling: use -Dcom.sap.sailing.debranding=true to remove branding images and text -#ADDITIONAL_JAVA_ARGS="$ADDITIONAL_JAVA_ARGS -Dcom.sap.sailing.debranding=true" +# White labeling: use -Dcom.sap.sse.debranding=true to remove branding images and text +#ADDITIONAL_JAVA_ARGS="$ADDITIONAL_JAVA_ARGS -Dcom.sap.sse.debranding=true" ADDITIONAL_JAVA_ARGS="$JAVA_VERSION_SPECIFIC_ARGS $ADDITIONAL_JAVA_ARGS -Dpersistentcompetitors.clear=false -Drestore.tracked.races=true -Dpolardata.source.url=https://www.sapsailing.com -Dwindestimation.source.url=https://www.sapsailing.com -XX:MaxGCPauseMillis=500" From 8c71b0ee0a9604892b23cd6f32960a5aa6bbb3e6 Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Mon, 6 Apr 2020 17:44:24 +0200 Subject: [PATCH 068/188] reduce numeber of needed variables #5153 --- .../RibDashboard.html | 4 +-- java/com.sap.sailing.gwt.ui/AdminConsole.html | 2 +- java/com.sap.sailing.gwt.ui/AutoPlay.html | 4 +-- .../BrowserUnsupported.html | 2 +- java/com.sap.sailing.gwt.ui/DataMining.html | 4 +-- .../EmbeddedMapAndWindChart.html | 4 +-- java/com.sap.sailing.gwt.ui/Home.html | 4 +-- java/com.sap.sailing.gwt.ui/HomeDesktop.html | 4 +-- java/com.sap.sailing.gwt.ui/HomeMobile.html | 4 +-- java/com.sap.sailing.gwt.ui/Leaderboard.html | 4 +-- .../LeaderboardEditing.html | 2 +- java/com.sap.sailing.gwt.ui/PairingList.html | 4 +-- java/com.sap.sailing.gwt.ui/RaceBoard.html | 4 +-- .../RegattaOverview.html | 4 +-- java/com.sap.sailing.gwt.ui/Simulator.html | 4 +-- java/com.sap.sailing.gwt.ui/Spectator.html | 4 +-- java/com.sap.sailing.gwt.ui/VideoPopup.html | 2 +- java/com.sap.sailing.gwt.ui/YoutubePopup.html | 2 +- ... => sap-sailing-app-icon-whitelabeled.png} | Bin .../{whitelabel.ico => sap-whitelabeled.ico} | Bin .../SailingServer (No Proxy).launch | 10 +++--- java/com.sap.sailing.www/browser-info.html | 10 +++--- java/com.sap.sailing.www/index.html | 8 +++-- .../release_notes_admin.html | 8 +++-- .../ClientConfigurationServlet.java | 31 +++++++++++------- java/com.sap.sse.gwt/StorageMessaging.html | 2 +- .../com.sap.sse.gwt/StorageMessagingTest.html | 2 +- java/com.sap.sse.security.ui/EditProfile.html | 2 +- .../EmailValidation.html | 2 +- java/com.sap.sse.security.ui/OAuthLogin.html | 2 +- java/com.sap.sse.security.ui/Register.html | 2 +- .../UserManagement.html | 2 +- 32 files changed, 80 insertions(+), 63 deletions(-) rename java/com.sap.sailing.gwt.ui/images/{sailing-app-icon.png => sap-sailing-app-icon-whitelabeled.png} (100%) rename java/com.sap.sailing.gwt.ui/images/{whitelabel.ico => sap-whitelabeled.ico} (100%) diff --git a/java/com.sap.sailing.dashboards.gwt/RibDashboard.html b/java/com.sap.sailing.dashboards.gwt/RibDashboard.html index b6be198a56f..469760722e2 100644 --- a/java/com.sap.sailing.dashboards.gwt/RibDashboard.html +++ b/java/com.sap.sailing.dashboards.gwt/RibDashboard.html @@ -9,8 +9,8 @@ - - + + Dashboard
    Sailing Analytics
    diff --git a/java/com.sap.sailing.www/index.html b/java/com.sap.sailing.www/index.html index 9492cd35c94..5908a91c41f 100644 --- a/java/com.sap.sailing.www/index.html +++ b/java/com.sap.sailing.www/index.html @@ -4,13 +4,17 @@ ${SAP}Sailing Analytics Suite - +
    - ${saplogoBrowserInfo} +
    Sailing Analytics
    diff --git a/java/com.sap.sailing.www/release_notes_admin.html b/java/com.sap.sailing.www/release_notes_admin.html index 21ca3679762..ef4abe3af82 100755 --- a/java/com.sap.sailing.www/release_notes_admin.html +++ b/java/com.sap.sailing.www/release_notes_admin.html @@ -4,12 +4,16 @@ - + ${SAP}Sailing Analytics - Admin Console Release Notes
    - ${saplogoBrowserInfo} +
    Sailing Analytics
    diff --git a/java/com.sap.sse.debranding/src/com/sap/sse/debranding/ClientConfigurationServlet.java b/java/com.sap.sse.debranding/src/com/sap/sse/debranding/ClientConfigurationServlet.java index e437456619a..dd920a3fb7b 100644 --- a/java/com.sap.sse.debranding/src/com/sap/sse/debranding/ClientConfigurationServlet.java +++ b/java/com.sap.sse.debranding/src/com/sap/sse/debranding/ClientConfigurationServlet.java @@ -100,29 +100,36 @@ public class ClientConfigurationServlet extends HttpServlet { private Map createReplacementMap(boolean deBrandingActive) { final Map map = new HashMap<>(); final String title; - final String faviconPath; - final String appiconPath; +// final String faviconPath; +// final String appiconPath; final String saplogoBrowserInfo; - final String ribDashboardIcon; +// final String ribDashboardIcon; + + final String whitelabeled; if (deBrandingActive) { title = ""; - faviconPath = "images/whitelabel.ico"; - appiconPath = "images/sailing-app-icon.png"; + //faviconPath = "images/whitelabel.ico"; +// appiconPath = "images/sailing-app-icon.png"; saplogoBrowserInfo = ""; - ribDashboardIcon = "images/dashboardicon-whitelabeled.png"; +// ribDashboardIcon = "images/dashboardicon-whitelabeled.png"; + + whitelabeled = "-whitelabeled"; } else { title = "SAP "; - faviconPath = "images/sap.ico"; - appiconPath = "images/sap-sailing-app-icon.png"; + //faviconPath = "images/sap.ico"; +// appiconPath = "images/sap-sailing-app-icon.png"; saplogoBrowserInfo = "\"SAP\r\n"; - ribDashboardIcon = "images/dashboardicon.png"; +// ribDashboardIcon = "images/dashboardicon.png"; + + whitelabeled = ""; } map.put("SAP", title); - map.put("faviconPath", faviconPath); - map.put("appiconPath", appiconPath); +// map.put("faviconPath", faviconPath); +// map.put("appiconPath", appiconPath); map.put("debrandingActive", Boolean.toString(deBrandingActive)); map.put("saplogoBrowserInfo", saplogoBrowserInfo); - map.put("ribDashboardIcon", ribDashboardIcon); +// map.put("ribDashboardIcon", ribDashboardIcon); + map.put("whitelabeled", whitelabeled); return map; } } diff --git a/java/com.sap.sse.gwt/StorageMessaging.html b/java/com.sap.sse.gwt/StorageMessaging.html index ca1a31481a0..4d80b848ea6 100755 --- a/java/com.sap.sse.gwt/StorageMessaging.html +++ b/java/com.sap.sse.gwt/StorageMessaging.html @@ -12,7 +12,7 @@ - + diff --git a/java/com.sap.sse.gwt/StorageMessagingTest.html b/java/com.sap.sse.gwt/StorageMessagingTest.html index 191504514df..76265a20109 100755 --- a/java/com.sap.sse.gwt/StorageMessagingTest.html +++ b/java/com.sap.sse.gwt/StorageMessagingTest.html @@ -12,7 +12,7 @@ - + diff --git a/java/com.sap.sse.security.ui/EditProfile.html b/java/com.sap.sse.security.ui/EditProfile.html index 818579c4cfe..01873080d30 100755 --- a/java/com.sap.sse.security.ui/EditProfile.html +++ b/java/com.sap.sse.security.ui/EditProfile.html @@ -12,7 +12,7 @@ - + diff --git a/java/com.sap.sse.security.ui/EmailValidation.html b/java/com.sap.sse.security.ui/EmailValidation.html index 65502f03fed..c13aa5c9b1d 100755 --- a/java/com.sap.sse.security.ui/EmailValidation.html +++ b/java/com.sap.sse.security.ui/EmailValidation.html @@ -12,7 +12,7 @@ - + diff --git a/java/com.sap.sse.security.ui/OAuthLogin.html b/java/com.sap.sse.security.ui/OAuthLogin.html index 076732c2c8e..334f48a243a 100644 --- a/java/com.sap.sse.security.ui/OAuthLogin.html +++ b/java/com.sap.sse.security.ui/OAuthLogin.html @@ -12,7 +12,7 @@ - + diff --git a/java/com.sap.sse.security.ui/Register.html b/java/com.sap.sse.security.ui/Register.html index 2306b5e12c8..cec32e12b4f 100644 --- a/java/com.sap.sse.security.ui/Register.html +++ b/java/com.sap.sse.security.ui/Register.html @@ -12,7 +12,7 @@ - + diff --git a/java/com.sap.sse.security.ui/UserManagement.html b/java/com.sap.sse.security.ui/UserManagement.html index 2c1ef9ff41c..f918b4f8ed4 100644 --- a/java/com.sap.sse.security.ui/UserManagement.html +++ b/java/com.sap.sse.security.ui/UserManagement.html @@ -12,7 +12,7 @@ - + From 61c6e6ca4dca458932b6f705ebb9239e69a655fc Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Mon, 6 Apr 2020 17:47:41 +0200 Subject: [PATCH 069/188] add missing resource #5153 --- .../dashboards/gwt/client/linker/DashboardManifestLinker.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/linker/DashboardManifestLinker.java b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/linker/DashboardManifestLinker.java index 9ce145b54d3..6e2de373572 100644 --- a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/linker/DashboardManifestLinker.java +++ b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/linker/DashboardManifestLinker.java @@ -16,6 +16,7 @@ public class DashboardManifestLinker extends ManifestLinker { return new String[] { "/dashboards/RibDashboard.html", "/dashboards/RibDashboard.css", "/dashboards/images/dashboardicon.png", + "/dashboards/images/dashboardicon-whitelabeled.png", "/dashboards/js/jquery-3.3.1.min.js", "/sailing-fontface-1.0.cache.css"}; } From 4f31d7204396fd1088c0fa32dca9a3f466bf7e53 Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Mon, 6 Apr 2020 17:50:33 +0200 Subject: [PATCH 070/188] cleanup #5153 --- .../ClientConfigurationServlet.java | 33 ++----------------- 1 file changed, 2 insertions(+), 31 deletions(-) diff --git a/java/com.sap.sse.debranding/src/com/sap/sse/debranding/ClientConfigurationServlet.java b/java/com.sap.sse.debranding/src/com/sap/sse/debranding/ClientConfigurationServlet.java index dd920a3fb7b..87236d96fbb 100644 --- a/java/com.sap.sse.debranding/src/com/sap/sse/debranding/ClientConfigurationServlet.java +++ b/java/com.sap.sse.debranding/src/com/sap/sse/debranding/ClientConfigurationServlet.java @@ -31,24 +31,14 @@ import org.apache.http.HttpStatus; * * * - * faviconPath - * images/sap.ico - * images/whitelabel.ico - * - * - * appiconPath - * images/sap-sailing-app-icon.png - * images/sailing-app-icon.png - * - * * debrandingActive * false * true * * - * saplogoBrowserInfo - * {@code } + * whitelabeled * + * -whitelabeled * * * @@ -100,35 +90,16 @@ public class ClientConfigurationServlet extends HttpServlet { private Map createReplacementMap(boolean deBrandingActive) { final Map map = new HashMap<>(); final String title; -// final String faviconPath; -// final String appiconPath; - final String saplogoBrowserInfo; -// final String ribDashboardIcon; - final String whitelabeled; if (deBrandingActive) { title = ""; - //faviconPath = "images/whitelabel.ico"; -// appiconPath = "images/sailing-app-icon.png"; - saplogoBrowserInfo = ""; -// ribDashboardIcon = "images/dashboardicon-whitelabeled.png"; - whitelabeled = "-whitelabeled"; } else { title = "SAP "; - //faviconPath = "images/sap.ico"; -// appiconPath = "images/sap-sailing-app-icon.png"; - saplogoBrowserInfo = "\"SAP\r\n"; -// ribDashboardIcon = "images/dashboardicon.png"; - whitelabeled = ""; } map.put("SAP", title); -// map.put("faviconPath", faviconPath); -// map.put("appiconPath", appiconPath); map.put("debrandingActive", Boolean.toString(deBrandingActive)); - map.put("saplogoBrowserInfo", saplogoBrowserInfo); -// map.put("ribDashboardIcon", ribDashboardIcon); map.put("whitelabeled", whitelabeled); return map; } From 6b2daba2adc9873297ac5a9dfb78b2107303b5b5 Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Tue, 7 Apr 2020 08:57:28 +0200 Subject: [PATCH 071/188] hide feedback panel #5153 --- .../gwt/ui/spectator/SpectatorEntryPoint.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/spectator/SpectatorEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/spectator/SpectatorEntryPoint.java index b72ddfead17..272aff34372 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/spectator/SpectatorEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/spectator/SpectatorEntryPoint.java @@ -18,6 +18,7 @@ import com.sap.sailing.gwt.ui.client.RegattaRefresher; import com.sap.sailing.gwt.ui.client.shared.panels.SimpleWelcomeWidget; import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; import com.sap.sse.gwt.settings.SettingsToUrlSerializer; +import com.sap.sse.gwt.shared.Branding; /** * @@ -69,14 +70,17 @@ public class SpectatorEntryPoint extends AbstractSailingEntryPoint implements Re if (!embedded) { groupPanel.setWelcomeWidget(new SimpleWelcomeWidget(getStringMessages().welcomeToSailingAnalytics(), getStringMessages().welcomeToSailingAnalyticsBody())); - SimplePanel feedbackPanel = new SimplePanel(); - feedbackPanel.getElement().getStyle().setProperty("clear", "right"); - feedbackPanel.addStyleName("feedbackPanel"); - Anchor feedbackLink = new Anchor(new SafeHtmlBuilder().appendHtmlConstant( - "").toSafeHtml());// TODO set image - feedbackLink.setHref("mailto:sailing_analytics%40sap.com?subject=[SAP Sailing] Feedback"); - feedbackPanel.add(feedbackLink); - groupAndFeedbackPanel.add(feedbackPanel); + if (Branding.getInstance().isActive()) { + SimplePanel feedbackPanel = new SimplePanel(); + feedbackPanel.getElement().getStyle().setProperty("clear", "right"); + feedbackPanel.addStyleName("feedbackPanel"); + Anchor feedbackLink = new Anchor(new SafeHtmlBuilder() + .appendHtmlConstant("").toSafeHtml()); + // TODO set image + feedbackLink.setHref("mailto:sailing_analytics%40sap.com?subject=[SAP Sailing] Feedback"); + feedbackPanel.add(feedbackLink); + groupAndFeedbackPanel.add(feedbackPanel); + } } rootPanel.add(groupAndFeedbackPanel); } From 475b790b3ef3174cdb3c75a198c50b0a1748ad41 Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Tue, 7 Apr 2020 14:08:18 +0200 Subject: [PATCH 072/188] ensure buioy pinger and inSight app notes are hadnled just like the other sibling links #5256 --- .../whatsnew/TabletAndDesktopWhatsNewView.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/TabletAndDesktopWhatsNewView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/TabletAndDesktopWhatsNewView.java index 369d243a047..80bfcde23c9 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/TabletAndDesktopWhatsNewView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/TabletAndDesktopWhatsNewView.java @@ -113,7 +113,19 @@ public class TabletAndDesktopWhatsNewView extends Composite implements WhatsNewV setActiveContent(raceCommitteeAppNotes, raceCommitteeAppNotesAnchor); handleClickEventWithLocalNavigation(event, raceCommitteeAppNotesNavigation); } - + + @UiHandler("buoyPingerAppNotesAnchor") + void buoyPingerClicked(ClickEvent event) { + setActiveContent(buoyPingerAppNotes, buoyPingerAppNotesAnchor); + handleClickEventWithLocalNavigation(event, buoyPingerAppNotesNavigation); + } + + @UiHandler("inSightAppNotesAnchor") + void inSightAppClicked(ClickEvent event) { + setActiveContent(inSightAppNotes, inSightAppNotesAnchor); + handleClickEventWithLocalNavigation(event, inSightAppNotesNavigation); + } + private void setActiveContent(HTML activeHTML, Anchor activeLink) { for (HTML html: contentWidgets) { html.setVisible(html == activeHTML); From c9f1eae67b017f57c03f252c41f4f22528571c7f Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Tue, 7 Apr 2020 14:08:51 +0200 Subject: [PATCH 073/188] enforce scrolling to top of the page #5256 --- .../places/whatsnew/TabletAndDesktopWhatsNewView.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/TabletAndDesktopWhatsNewView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/TabletAndDesktopWhatsNewView.java index 80bfcde23c9..8510bf1802e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/TabletAndDesktopWhatsNewView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/TabletAndDesktopWhatsNewView.java @@ -10,6 +10,7 @@ import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.History; +import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HTML; @@ -127,7 +128,7 @@ public class TabletAndDesktopWhatsNewView extends Composite implements WhatsNewV } private void setActiveContent(HTML activeHTML, Anchor activeLink) { - for (HTML html: contentWidgets) { + for (HTML html : contentWidgets) { html.setVisible(html == activeHTML); } for (Anchor link : links) { @@ -137,8 +138,9 @@ public class TabletAndDesktopWhatsNewView extends Composite implements WhatsNewV link.removeStyleName(WhatsNewResources.INSTANCE.css().whatsnew_nav_linkactive()); } } + Window.scrollTo (0 ,0); } - + private void handleClickEventWithLocalNavigation(ClickEvent e, PlaceNavigation placeNavigation) { if (HYPERLINK_IMPL.handleAsClick((Event) e.getNativeEvent())) { // don't use the placecontroller for navigation here as we want to avoid a page reload From 91fd37786798b4b3707c24d19d44a6fd13097585 Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Wed, 8 Apr 2020 10:24:10 +0200 Subject: [PATCH 074/188] fix test #5153 --- .../src/com/sap/sailing/selenium/test/home/WhitelabelTest.java | 3 +-- .../server/gateway/test/support/WhitelabelSwitchServlet.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/home/WhitelabelTest.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/home/WhitelabelTest.java index 95af17954e0..bb8b98ca099 100644 --- a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/home/WhitelabelTest.java +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/home/WhitelabelTest.java @@ -96,8 +96,7 @@ public class WhitelabelTest extends AbstractSeleniumTest { } setWhitelabel(true, getContextRoot()); } - - + @Test public void testHomepageWhitelabel() throws UnsupportedEncodingException { HomePage homePage = HomePage.goToPage(getWebDriver(), getContextRoot()); diff --git a/java/com.sap.sailing.server.gateway.test.support/src/com/sap/sailing/server/gateway/test/support/WhitelabelSwitchServlet.java b/java/com.sap.sailing.server.gateway.test.support/src/com/sap/sailing/server/gateway/test/support/WhitelabelSwitchServlet.java index f21e9493590..92f19a03fed 100644 --- a/java/com.sap.sailing.server.gateway.test.support/src/com/sap/sailing/server/gateway/test/support/WhitelabelSwitchServlet.java +++ b/java/com.sap.sailing.server.gateway.test.support/src/com/sap/sailing/server/gateway/test/support/WhitelabelSwitchServlet.java @@ -16,7 +16,7 @@ import javax.servlet.http.HttpServletResponse; */ public class WhitelabelSwitchServlet extends HttpServlet { - private static final String COM_SAP_SAILING_DEBRANDING = "com.sap.sailing.debranding"; + private static final String COM_SAP_SAILING_DEBRANDING = "com.sap.sse.debranding"; private static final long serialVersionUID = 7132508855846001729L; From ed76cd7be0512d467e4d0f5893d9b5a393d8b8c2 Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Wed, 8 Apr 2020 12:06:23 +0200 Subject: [PATCH 075/188] migrate lanucher as example #5255 --- .../SailingServer (No Proxy).launch | 182 +++++++++++++++++- 1 file changed, 180 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy).launch b/java/com.sap.sailing.server/SailingServer (No Proxy).launch index 6c8d1a14bc2..6d414531eb2 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy).launch @@ -11,6 +11,7 @@ + @@ -31,10 +32,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - From 38597c3273386fd0854b6343895f7443b820f2c1 Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Wed, 8 Apr 2020 12:45:45 +0200 Subject: [PATCH 076/188] change scrolling behaviour: for first section stay on top, all other scroll to top of the div #5256 --- .../desktop/partials/solutions/Solutions.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/solutions/Solutions.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/solutions/Solutions.java index 51ced9bd899..a86fb24a85b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/solutions/Solutions.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/solutions/Solutions.java @@ -10,6 +10,7 @@ import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.History; +import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Widget; @@ -156,27 +157,29 @@ public class Solutions extends Composite { } private void scrollToView(SolutionsNavigationTabs navigationTab) { + final int actualScrollLeft = Window.getScrollLeft(); if (navigationTab == null) { sapInSailingDiv.scrollIntoView(); + Window.scrollTo(actualScrollLeft, 0); } else { switch (navigationTab) { case BuoyPingerApp: - buoyPingerDiv.scrollIntoView(); + Window.scrollTo(actualScrollLeft, buoyPingerDiv.getAbsoluteTop()); break; case InSightApp: - inSightDiv.scrollIntoView(); + Window.scrollTo(actualScrollLeft, inSightDiv.getAbsoluteTop()); break; case SapInSailing: - sapInSailingDiv.scrollIntoView(); + Window.scrollTo(actualScrollLeft, 0); break; case SailingAnalytics: - sailingAnalyticsDiv.scrollIntoView(); + Window.scrollTo(actualScrollLeft, sailingAnalyticsDiv.getAbsoluteTop()); break; case RaceManagerApp: - raceDiv.scrollIntoView(); + Window.scrollTo(actualScrollLeft, raceDiv.getAbsoluteTop()); break; case SailingSimulator: - simulatorDiv.scrollIntoView(); + Window.scrollTo(actualScrollLeft, simulatorDiv.getAbsoluteTop()); break; } } From 3dabc64c48069474a2d13e72488796917a91e4d5 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 8 Apr 2020 13:11:58 +0200 Subject: [PATCH 077/188] bug5153: review-based changes/updates; see comment #54 --- .../META-INF/MANIFEST.MF | 3 +- .../pages/raceboard/RaceBoardPage.java | 4 +- ...erver (No Proxy, debranding active).launch | 182 +++++++++++++++++- .../ClientConfigurationServlet.java | 96 +++++---- 4 files changed, 239 insertions(+), 46 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/META-INF/MANIFEST.MF b/java/com.sap.sailing.gwt.ui/META-INF/MANIFEST.MF index a56fae8abb9..a7efa0be243 100644 --- a/java/com.sap.sailing.gwt.ui/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.gwt.ui/META-INF/MANIFEST.MF @@ -63,8 +63,7 @@ Require-Bundle: com.sap.sailing.domain, org.mongodb.mongo-java-driver;bundle-version="3.6.4", com.sap.sailing.server.gateway.serialization.shared.android, com.sap.sailing.shared.server, - org.apache.commons.math;bundle-version="2.1.0", - org.apache.commons.io + org.apache.commons.math;bundle-version="2.1.0" Bundle-Activator: com.sap.sailing.gwt.ui.server.Activator Bundle-ActivationPolicy: lazy Import-Package: javax.servlet;version="3.1.0", diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/raceboard/RaceBoardPage.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/raceboard/RaceBoardPage.java index 78cbad43370..ebb55521f3f 100644 --- a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/raceboard/RaceBoardPage.java +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/raceboard/RaceBoardPage.java @@ -149,8 +149,6 @@ public class RaceBoardPage extends HostPageWithAuthentication { return dataByContainer; } - - public static RaceBoardPage goToRaceboardUrl(WebDriver webDriver,String context, String leaderboardName, String regattaName, String raceName, boolean whitelabel) throws UnsupportedEncodingException { return goToRaceboardUrl(webDriver, context, leaderboardName, regattaName, raceName, null, whitelabel); @@ -158,7 +156,7 @@ public class RaceBoardPage extends HostPageWithAuthentication { public static RaceBoardPage goToRaceboardUrl(WebDriver webDriver,String context, String leaderboardName, String regattaName, String raceName, String raceMode, boolean whitelabel) throws UnsupportedEncodingException { -// private static final String EVENT_LINK = "gwt/RaceBoard.html?leaderboardName=BMW+Cup+(J80)®attaName=BMW+Cup+(J80)&raceName=BMW+Cup+Race+1&canReplayDuringLiveRaces=true"; + // structure of an event link: "gwt/RaceBoard.html?leaderboardName=BMW+Cup+(J80)®attaName=BMW+Cup+(J80)&raceName=BMW+Cup+Race+1&canReplayDuringLiveRaces=true" String escapedLeaderBoardName = URLEncoder.encode(leaderboardName,"UTF-8"); String escapedRegattaName = URLEncoder.encode(regattaName, "UTF-8"); String escapedRaceName = URLEncoder.encode(raceName, "UTF-8"); diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, debranding active).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, debranding active).launch index 2a78e4b10bc..ae0761f4488 100644 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, debranding active).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, debranding active).launch @@ -32,8 +32,186 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sse.debranding/src/com/sap/sse/debranding/ClientConfigurationServlet.java b/java/com.sap.sse.debranding/src/com/sap/sse/debranding/ClientConfigurationServlet.java index 87236d96fbb..63fc1d9d497 100644 --- a/java/com.sap.sse.debranding/src/com/sap/sse/debranding/ClientConfigurationServlet.java +++ b/java/com.sap.sse.debranding/src/com/sap/sse/debranding/ClientConfigurationServlet.java @@ -17,30 +17,49 @@ import org.apache.commons.io.IOUtils; import org.apache.http.HttpStatus; /** - * Use ${[variable name]} to get strings replaced within static pages. - * These variables are available at the moment: + * Use ${[variable name]} to get strings replaced within static pages. All occurrences of the variables listed below + * that are found in the document will be replaced. The following variables are available at the moment: * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * *
    Variablenamebranded valuedebranded/whitelabeled
    SAPSAP 
    debrandingActivefalsetrue
    whitelabeled-whitelabeled
    Variablenamebranded valuedebranded/whitelabeled
    "SAP""SAP """
    "debrandingActive""false""true"
    "whitelabeled""""-whitelabeled"
    + *

    + * + * Register as a servlet for all the URLs that produce such static pages that you'd like to run replacements on. Example + * registration in a {@code web.xml} configuration file: + * + *

    + *   <servlet>
    + *       <display-name>ClientConfigurationServlet</display-name>
    + *       <servlet-name>ClientConfigurationServlet</servlet-name>
    + *       <servlet-class>com.sap.sse.debranding.ClientConfigurationServlet</servlet-class>
    + *   </servlet>
    + *   <servlet-mapping>
    + *       <servlet-name>ClientConfigurationServlet</servlet-name>
    + *       <url-pattern>*.html</url-pattern>
    + *   </servlet-mapping>
    + * 
    + *

    + * + * The servlet caches the results, both, for the branded as well as the unbranded/replaced contents. * * @see com.sap.sailing.server.gateway.test.support.WhitelabelSwitchServlet * @author Georg Herdt @@ -61,25 +80,24 @@ public class ClientConfigurationServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { final boolean deBrandingActive = Boolean.valueOf(System.getProperty(DEBRANDING_PROPERTY_NAME, "false")); final String servletPath = req.getServletPath(); - byte[] cachedPage = null; - if ((cachedPage = cache.get(generateKey(servletPath, deBrandingActive))) != null) { + final byte[] cachedPage; + final String pageKey = generateKey(servletPath, deBrandingActive); + if ((cachedPage = cache.get(pageKey)) != null) { IOUtils.write(cachedPage, resp.getOutputStream()); - return; - } - try (InputStream in = this.getServletContext().getResourceAsStream(servletPath);) { - byte[] buffer = IOUtils.toByteArray(in); - - String content = new String(buffer); - for (Map.Entry item : createReplacementMap(deBrandingActive).entrySet()) { - content = content.replace("${" + item.getKey() + "}", item.getValue()); + } else { + try (InputStream in = this.getServletContext().getResourceAsStream(servletPath)) { + byte[] buffer = IOUtils.toByteArray(in); + String content = new String(buffer); + for (Map.Entry item : createReplacementMap(deBrandingActive).entrySet()) { + content = content.replace("${" + item.getKey() + "}", item.getValue()); + } + byte[] bytes = content.getBytes(); + IOUtils.write(bytes, resp.getOutputStream()); + cache.computeIfAbsent(pageKey, key -> bytes); + } catch (RuntimeException e) { + logger.log(Level.WARNING, "could not process or read resource " + servletPath, e); + resp.sendError(HttpStatus.SC_INTERNAL_SERVER_ERROR); } - - byte[] bytes = content.getBytes(); - IOUtils.write(bytes, resp.getOutputStream()); - cache.computeIfAbsent(generateKey(servletPath, deBrandingActive), key -> bytes); - } catch (RuntimeException e) { - logger.log(Level.WARNING, "could not process or read resource " + servletPath, e); - resp.sendError(HttpStatus.SC_INTERNAL_SERVER_ERROR); } } From 48d3e0c2d0056cae7040552d4bcc98e777a6eb1f Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Wed, 8 Apr 2020 14:27:08 +0200 Subject: [PATCH 078/188] replacment of new eclipse format of launchers #5255 --- .../scripts/analyzeProduct.sh | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/java/com.sap.sailing.feature.p2build/scripts/analyzeProduct.sh b/java/com.sap.sailing.feature.p2build/scripts/analyzeProduct.sh index 0c22346e9a1..9a85abef51f 100755 --- a/java/com.sap.sailing.feature.p2build/scripts/analyzeProduct.sh +++ b/java/com.sap.sailing.feature.p2build/scripts/analyzeProduct.sh @@ -21,7 +21,7 @@ # will be set to default:default unless the bundle occurs in the section of the # .product definition in which case the start level and auto start values are copied from the # .product's section. - +NL=$'\n' GIT_ROOT=`dirname $0`/../../.. echo "GIT ROOT: $GIT_ROOT" features=$(cat "$1" | grep "feature id=" | sed -e 's/^.*feature id="\([^"]*\)".*$/\1/') @@ -55,26 +55,32 @@ for feature in $features; do fi if [[ $feature =~ .runtime$ ]]; then # contribute to target_bundles - target_bundles="${target_bundles},${bundle_spec_for_launch}" + target_bundles="${target_bundles}${NL}" else # contribute to workspace_bundles - workspace_bundles="${workspace_bundles},${bundle_spec_for_launch}" + workspace_bundles="${workspace_bundles}${NL}" fi done done echo ' *** Target Bundles ***' -echo "" +echo "${target_bundles}" echo ' *** Workspace Bundles ***' -echo "" +echo "${workspace_bundles}" # Now patch the .launch file if provided while [ "$2" != "" ]; do - echo "Patching $2 ..." - if echo "$2" | grep -q winddbTest; then - patched_workspace_bundles="${workspace_bundles},com.sap.sailing.server.gateway.test.support@default:default" - else - patched_workspace_bundles="${workspace_bundles}" + if grep -q key=\"target_bundles\" "$2"; then + echo "Not patching $2 ... please use script for eclipse 2019-09 or older" + else + echo "Patching $2 ..." + if echo "$2" | grep -q winddbTest; then + patched_workspace_bundles="${workspace_bundles}${NL}${NL}" + else + patched_workspace_bundles="${workspace_bundles}" + fi + target_bundles="${target_bundles}${NL}<\setAttribute>" + patched_workspace_bundles="${patched_workspace_bundles}${NL}<\setAttribute>" + perl -i -p0e "s/(.*?)<\/setAttribute>/${target_bundles}/sg" "$2" + perl -i -p0e "s/(.*?)<\/setAttribute>/${patched_workspace_bundles}/sg" "$2" fi - sed -i 's/ Date: Wed, 8 Apr 2020 15:00:53 +0200 Subject: [PATCH 079/188] added more documentation #5153 --- .../sse/debranding/ClientConfigurationServlet.java | 2 +- .../context/data/SapSailingContextDataJSO.java | 8 ++++++++ .../impl/SapSailingContextDataFactoryImpl.java | 12 ++++++++++++ .../src/com/sap/sse/gwt/shared/Branding.java | 9 +++++++++ 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sse.debranding/src/com/sap/sse/debranding/ClientConfigurationServlet.java b/java/com.sap.sse.debranding/src/com/sap/sse/debranding/ClientConfigurationServlet.java index 63fc1d9d497..3aa53f96415 100644 --- a/java/com.sap.sse.debranding/src/com/sap/sse/debranding/ClientConfigurationServlet.java +++ b/java/com.sap.sse.debranding/src/com/sap/sse/debranding/ClientConfigurationServlet.java @@ -17,7 +17,7 @@ import org.apache.commons.io.IOUtils; import org.apache.http.HttpStatus; /** - * Use ${[variable name]} to get strings replaced within static pages. All occurrences of the variables listed below + * Use ${[variable name]} to get strings replaced within static pages. No escape syntax is currently available. All occurrences of the variables listed below * that are found in the document will be replaced. The following variables are available at the moment: * * diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/context/data/SapSailingContextDataJSO.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/context/data/SapSailingContextDataJSO.java index 60ed2052b30..f87f4032f8d 100644 --- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/context/data/SapSailingContextDataJSO.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/context/data/SapSailingContextDataJSO.java @@ -2,6 +2,14 @@ package com.sap.sse.gwt.client.context.data; import com.google.gwt.core.client.JavaScriptObject; +/** + * Access custom information for GWT client from static browser page. + * + * @see com.sap.sse.gwt.client.context.impl.SapSailingContextDataFactoryImpl + * @see com.sap.sse.gwt.shared.Branding + * @author Georg Herdt + * + */ public class SapSailingContextDataJSO extends JavaScriptObject { protected SapSailingContextDataJSO() { diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/context/impl/SapSailingContextDataFactoryImpl.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/context/impl/SapSailingContextDataFactoryImpl.java index d81036921cc..e652c62f134 100644 --- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/context/impl/SapSailingContextDataFactoryImpl.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/context/impl/SapSailingContextDataFactoryImpl.java @@ -2,6 +2,18 @@ package com.sap.sse.gwt.client.context.impl; import com.sap.sse.gwt.client.context.data.SapSailingContextDataJSO; +/** + *

    + * Accessor to the custom object structure used for providing static configuration from the server to the GWT client. + * An example can be seen here {@link /com.sap.sailing.gwt.ui/Home.html} + *

    + *

    + * {@link SapSailingContextDataJSO} provides access to the individual fields. + *

    + * @see com.sap.sse.gwt.shared.Branding + * @author Georg Herdt + * + */ public final class SapSailingContextDataFactoryImpl { public native SapSailingContextDataJSO getInstance() /*-{ diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/shared/Branding.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/shared/Branding.java index 6ccf263deda..5b139cbd028 100644 --- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/shared/Branding.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/shared/Branding.java @@ -8,13 +8,22 @@ import com.sap.sse.gwt.client.context.impl.SapSailingContextDataFactoryImpl; * Provides information for the GWT client if debranding/whitelabeling is currently active. * Data is read from the static HTML page which starts the GWT client code. * Within the header there is script section that contains such a structure: + *
      *      document.sailingContext = {
      *          debrandingActive: true};
    + * 
    * The data in this structure is integrated into the document object tree within the browser. * That can be accessed from here using the {@link SapSailingContextDataJSO}. * * The structure in the HTML is generated by the server see ClientConfigurationServlet for that. * + * To add new fields the following steps must be performed: + *
      + *
    • template within the HTML page must be extend by a new field declaration inside {@code document.sailingContext}.
    • + *
    • corresponding variable must be declared and filled with the appropriate value in {@link ClientConfigurationServlet}
    • + *
    • class {@link SapSailingContextDataJSO} must be extended with an getter for the new field
    • + *
    + * * @author Georg Herdt * */ From 12f876a064134d9921993fceb40511480562644b Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Wed, 8 Apr 2020 15:42:18 +0200 Subject: [PATCH 080/188] revert to old eclipse .launch format #5153 --- .../SailingServer (No Proxy).launch | 182 +----------------- ...erver (No Proxy, debranding active).launch | 182 +----------------- 2 files changed, 4 insertions(+), 360 deletions(-) diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy).launch b/java/com.sap.sailing.server/SailingServer (No Proxy).launch index b30d4ab46e6..f1bacabfbff 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy).launch @@ -32,186 +32,8 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, debranding active).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, debranding active).launch index ae0761f4488..2a78e4b10bc 100644 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, debranding active).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, debranding active).launch @@ -32,186 +32,8 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + From 49de219f457555a7716fcf76539d8aff293b1829 Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Wed, 8 Apr 2020 15:59:25 +0200 Subject: [PATCH 081/188] upgrade all backend launchers to new format #5255 --- .../SailingServer (No Proxy OSX).launch | 182 ++++++++- .../SailingServer (No Proxy).launch | 356 +++++++++--------- ...ailingServer (No Proxy, Cached MTB).launch | 182 ++++++++- ...erver (No Proxy, Igtimi Local Test).launch | 182 ++++++++- .../SailingServer (No Proxy, Java11).launch | 182 ++++++++- ...r (No Proxy, Java11, JFR Recording).launch | 252 +++++++++++-- ...ingServer (No Proxy, Jetty on 8889).launch | 182 ++++++++- ...o Proxy, Jetty on 8889, Cached MTB).launch | 184 ++++++++- ...on 8889, auto-replicate SS and SSD).launch | 182 ++++++++- ... Jetty on 8889, auto-replicate dev).launch | 182 ++++++++- ...oxy, Jetty on 8889, auto-replicate).launch | 182 ++++++++- ...ingServer (No Proxy, Jetty on 8890).launch | 182 ++++++++- ...uto-replicate from replica at 8889).launch | 182 ++++++++- ...ver (No Proxy, Remote Debug SAP VM).launch | 184 ++++++++- ...ver (No Proxy, bundesliga2-2017 DB).launch | 182 ++++++++- ...ailingServer (No Proxy, winddbTest).launch | 183 ++++++++- ...& Wind estimation Import from 8888).launch | 182 ++++++++- 17 files changed, 3097 insertions(+), 246 deletions(-) diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy OSX).launch b/java/com.sap.sailing.server/SailingServer (No Proxy OSX).launch index 709fd3faa8a..8d42b48f6c0 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy OSX).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy OSX).launch @@ -11,6 +11,7 @@ + @@ -29,10 +30,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy).launch b/java/com.sap.sailing.server/SailingServer (No Proxy).launch index 6d414531eb2..5a111dfcf25 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy).launch @@ -33,184 +33,186 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch index 3812924b04c..20923280a11 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch @@ -10,6 +10,7 @@ + @@ -28,10 +29,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Igtimi Local Test).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Igtimi Local Test).launch index 2ad5ce9bfd4..19afc483949 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Igtimi Local Test).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Igtimi Local Test).launch @@ -11,6 +11,7 @@ + @@ -31,10 +32,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Java11).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Java11).launch index 88927584a41..23ec0ed14a2 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Java11).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Java11).launch @@ -11,6 +11,7 @@ + @@ -31,10 +32,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Java11, JFR Recording).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Java11, JFR Recording).launch index 39fb0441f9f..9cce32a359e 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Java11, JFR Recording).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Java11, JFR Recording).launch @@ -1,40 +1,218 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch index 6356bb97cba..c0c7419a8d7 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch @@ -10,6 +10,7 @@ + @@ -22,11 +23,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch index 79c22a1f79a..bb5f1919f1c 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch @@ -10,23 +10,201 @@ + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate SS and SSD).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate SS and SSD).launch index 8b6bf51129d..f5f2444ef21 100644 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate SS and SSD).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate SS and SSD).launch @@ -10,6 +10,7 @@ + @@ -24,11 +25,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate dev).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate dev).launch index c20153d2906..673c7251178 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate dev).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate dev).launch @@ -10,6 +10,7 @@ + @@ -22,11 +23,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate).launch index c88efedc996..6f8bae8f53f 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate).launch @@ -10,6 +10,7 @@ + @@ -24,11 +25,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch index a44e29981ee..863eeadc098 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch @@ -10,6 +10,7 @@ + @@ -22,11 +23,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890, auto-replicate from replica at 8889).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890, auto-replicate from replica at 8889).launch index e61aed2536c..6bf343b32b2 100644 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890, auto-replicate from replica at 8889).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890, auto-replicate from replica at 8889).launch @@ -10,6 +10,7 @@ + @@ -22,11 +23,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch index d4a3c3c14bb..86c2af16cdc 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch @@ -10,22 +10,200 @@ + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, bundesliga2-2017 DB).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, bundesliga2-2017 DB).launch index bcafeead5fa..4e13b4ad317 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, bundesliga2-2017 DB).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, bundesliga2-2017 DB).launch @@ -11,6 +11,7 @@ + @@ -31,10 +32,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch index 37fbcd2967c..9b1e621af38 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch @@ -10,6 +10,7 @@ + @@ -28,10 +29,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - diff --git a/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889, Polar & Wind estimation Import from 8888).launch b/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889, Polar & Wind estimation Import from 8888).launch index 7a709529a86..1fefbbbe5f7 100755 --- a/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889, Polar & Wind estimation Import from 8888).launch +++ b/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889, Polar & Wind estimation Import from 8888).launch @@ -10,6 +10,7 @@ + @@ -22,11 +23,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - From d9d435421f2ac68490b3d3dacb895417ac7c0633 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 8 Apr 2020 22:46:52 +0200 Subject: [PATCH 082/188] bug5153: fixed initialization of whitelabeling in selenium test set-up --- .../sailing/selenium/test/AbstractSeleniumTest.java | 13 +++++-------- .../sailing/selenium/test/home/WhitelabelTest.java | 11 ----------- .../test/support/WhitelabelSwitchServlet.java | 2 +- 3 files changed, 6 insertions(+), 20 deletions(-) diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/AbstractSeleniumTest.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/AbstractSeleniumTest.java index 703ca5ba12c..c28810b8dac 100644 --- a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/AbstractSeleniumTest.java +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/AbstractSeleniumTest.java @@ -12,6 +12,7 @@ import java.nio.file.Path; import java.nio.file.StandardCopyOption; import java.util.List; import java.util.UUID; +import java.util.logging.Level; import java.util.logging.Logger; import org.json.JSONException; @@ -96,11 +97,10 @@ public abstract class AbstractSeleniumTest { } catch (IOException exception) { throw new RuntimeException(exception); } - + setWhitelabel(false, contextRoot); if (!headless) { // To be able to access LocalStorage we need to load a page having the target origin getWebDriver().get(contextRoot); - final String notificationTimeoutKey = "sse.notification.customTimeOutInSeconds"; final String notificationTimeoutValue = Integer.toString(PageObject.DEFAULT_WAIT_TIMEOUT_SECONDS); if (getWebDriver() instanceof WebStorage) { @@ -115,7 +115,6 @@ public abstract class AbstractSeleniumTest { ((JavascriptExecutor) getWebDriver()).executeScript("window.localStorage.setItem(\"" + notificationTimeoutKey + "\", \"" + notificationTimeoutValue + "\");"); } - try { // In IE 11 we sometimes see the problem that IE somehow automatically changes the zoom level to 75%. // Selenium tests with InternetExplorerDriver fail if the zoom level is not set to 100% due to the fact @@ -125,20 +124,18 @@ public abstract class AbstractSeleniumTest { // (this should be pre-configured in local-test-environment.xml when activating IE driver) getWebDriver().findElement(By.tagName("html")).sendKeys(Keys.chord(Keys.CONTROL, "0")); } catch (Exception e) { + logger.log(Level.SEVERE, e.getMessage(), e); } } } /** * Resets the state for running tests in a clean state. In most cases of UI test also the state of the web page - * needs to get resetted. In some other cases (e.g. only Rest-API calls are involved in the test, an initialization - * of the webpage is not requirered. If so the method {@link clearState([contextroot], false)} can be called. - * - * @param contextRoot + * needs to get reset. In some other cases (e.g. only Rest-API calls are involved in the test) an initialization of + * the web page is not required. If so the method {@link #clearState(String, boolean)} can be called. */ protected void clearState(String contextRoot) { clearState(contextRoot, false); - setWhitelabel(false, contextRoot); } protected void setWhitelabel(boolean status, String contextRoot) { diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/home/WhitelabelTest.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/home/WhitelabelTest.java index bb8b98ca099..b75b3e8be27 100644 --- a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/home/WhitelabelTest.java +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/home/WhitelabelTest.java @@ -59,7 +59,6 @@ public class WhitelabelTest extends AbstractSeleniumTest { public void setUp() { clearState(getContextRoot()); super.setUp(); - final RegattaDescriptor regattaDescriptor = new RegattaDescriptor(REGATTA_49ER, BOAT_CLASS_49ER); { final AdminConsolePage adminConsole = AdminConsolePage.goToPage(getWebDriver(), getContextRoot()); @@ -74,18 +73,14 @@ public class WhitelabelTest extends AbstractSeleniumTest { editRegatta.addSeries(SERIES_QUALIFICATION); editRegatta.addSeries(SERIES_MEDALS); editRegatta.pressOk(); - final SeriesEditDialogPO editSeriesQualification = regattaDetails.editSeries(SERIES_QUALIFICATION); editSeriesQualification.addRaces(1, 11, "Q"); editSeriesQualification.pressOk(); - final SeriesEditDialogPO editSeriesMedals = regattaDetails.editSeries(SERIES_MEDALS); editSeriesMedals.setMedalSeries(true); editSeriesMedals.addSingleRace("M"); editSeriesMedals.pressOk(); - trackRacesFor49er(regattaDescriptor, adminConsole.goToTracTracEvents()); - final LeaderboardConfigurationPanelPO leaderboard = adminConsole.goToLeaderboardConfiguration(); final LeaderboardDetailsPanelPO details = leaderboard.getLeaderboardDetails(REGATTA_49ER_WITH_SUFFIX); @@ -100,9 +95,7 @@ public class WhitelabelTest extends AbstractSeleniumTest { @Test public void testHomepageWhitelabel() throws UnsupportedEncodingException { HomePage homePage = HomePage.goToPage(getWebDriver(), getContextRoot()); - assertThat(homePage.getPageTitle(), not(containsString("SAP"))); - validateIsDisplayed(homePage.getFavicon(), false); validateIsDisplayed(homePage.getSolutionsPageLink(), false); validateIsDisplayed(homePage.getSapSailingHeaderImage(), false); @@ -116,10 +109,8 @@ public class WhitelabelTest extends AbstractSeleniumTest { validateIsDisplayed(homePage.getNewsLink(), false); validateIsDisplayed(homePage.getLanguageSelectionLabel(), true); assertThat(homePage.getLanguageSelectionLabel().getText(), not(containsString("SAP"))); - RaceBoardPage raceboardPage = RaceBoardPage.goToRaceboardUrl(getWebDriver(), getContextRoot(), REGATTA_49ER_WITH_SUFFIX, REGATTA_49ER_WITH_SUFFIX, MEDAL_RACE_49ER, true); - assertThat(raceboardPage.isRaceBoardLogoExisting(),equalTo(false)); validateIsDisplayed(raceboardPage.getDataByContainer(), false); @@ -132,7 +123,6 @@ public class WhitelabelTest extends AbstractSeleniumTest { tracTracEvents.setFilterForTrackableRaces("(49er)"); // races are filtered so that all shown entries belong to the correct regatta tracTracEvents.startTrackingForAllRaces(); - final TrackedRacesListPO trackedRacesList = tracTracEvents.getTrackedRacesList(); final List racesToWaitLoadingFor = new ArrayList<>(); for(int i = 1; i<=11; i++) { @@ -145,5 +135,4 @@ public class WhitelabelTest extends AbstractSeleniumTest { private void validateIsDisplayed(WebElement element, boolean displayed) { assertThat(element.isDisplayed(),equalTo(displayed)); } - } diff --git a/java/com.sap.sailing.server.gateway.test.support/src/com/sap/sailing/server/gateway/test/support/WhitelabelSwitchServlet.java b/java/com.sap.sailing.server.gateway.test.support/src/com/sap/sailing/server/gateway/test/support/WhitelabelSwitchServlet.java index 92f19a03fed..95ebeca49ae 100644 --- a/java/com.sap.sailing.server.gateway.test.support/src/com/sap/sailing/server/gateway/test/support/WhitelabelSwitchServlet.java +++ b/java/com.sap.sailing.server.gateway.test.support/src/com/sap/sailing/server/gateway/test/support/WhitelabelSwitchServlet.java @@ -10,7 +10,7 @@ import javax.servlet.http.HttpServletResponse; /** * Use this servlet to turn whitelabelling on and off during testing. - * @see com.sap.sailing.debranding.ClientConfigurationServlet + * @see com.sap.sse.debranding.ClientConfigurationServlet * @author Georg Herdt * */ From 7d84db26302fb54a945a960c4a233050dabcc624 Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Thu, 9 Apr 2020 11:47:17 +0200 Subject: [PATCH 083/188] using more generalized classnames and fields #5153 --- .../RibDashboard.html | 2 +- .../gwt/client/header/DashboardHeader.java | 4 +-- java/com.sap.sailing.gwt.ui/AdminConsole.html | 2 +- java/com.sap.sailing.gwt.ui/AutoPlay.html | 2 +- java/com.sap.sailing.gwt.ui/DataMining.html | 2 +- .../EmbeddedMapAndWindChart.html | 2 +- java/com.sap.sailing.gwt.ui/Home.html | 2 +- java/com.sap.sailing.gwt.ui/Leaderboard.html | 2 +- .../LeaderboardEditing.html | 2 +- java/com.sap.sailing.gwt.ui/PairingList.html | 2 +- java/com.sap.sailing.gwt.ui/RaceBoard.html | 2 +- .../RegattaOverview.html | 2 +- java/com.sap.sailing.gwt.ui/Simulator.html | 2 +- java/com.sap.sailing.gwt.ui/Spectator.html | 2 +- java/com.sap.sailing.gwt.ui/VideoPopup.html | 2 +- java/com.sap.sailing.gwt.ui/YoutubePopup.html | 2 +- .../client/place/event/legacy/EventPlace.java | 4 +-- .../place/event/legacy/RegattaPlace.java | 4 +-- .../place/event/legacy/SeriesPlace.java | 4 +-- .../home/desktop/partials/footer/Footer.java | 4 +-- .../home/desktop/partials/header/Header.java | 4 +-- .../partials/sharing/SharingButtons.java | 6 ++-- .../partials/socialfooter/SocialFooter.java | 4 +-- ...TabletAndDesktopMultiRegattaEventView.java | 4 +-- .../TabletAndDesktopRegattaEventView.java | 4 +-- .../TabletAndDesktopSeriesView.java | 4 +-- .../places/solutions/SolutionsActivity.java | 4 +-- .../TabletAndDesktopUserProfileView.java | 4 +-- .../places/whatsnew/WhatsNewActivity.java | 4 +-- .../home/mobile/partials/footer/Footer.java | 4 +-- .../home/mobile/partials/header/Header.java | 4 +-- .../partials/socialfooter/SocialFooter.java | 4 +-- .../event/latestnews/LatestNewsPlace.java | 4 +-- .../whatsnew/WhatsNewDialogFactory.java | 4 +-- .../fullscreen/FullscreenContainer.java | 4 +-- .../places/event/AbstractEventPlace.java | 4 +-- .../shared/places/events/EventsPlace.java | 4 +-- .../fakeseries/AbstractSeriesPlace.java | 4 +-- .../searchresult/SearchResultPlace.java | 4 +-- .../home/shared/places/start/StartPlace.java | 4 +-- .../gwt/ui/client/shared/racemap/RaceMap.java | 4 +-- .../gwt/ui/shared/databylogo/DataByLogo.java | 6 ++-- .../gwt/ui/spectator/SpectatorEntryPoint.java | 4 +-- .../gwt/adminconsole/AdminConsolePanel.java | 4 +-- ...=> ClientConfigurationContextDataJSO.java} | 8 ++--- ...ntConfigurationContextDataFactoryImpl.java | 23 +++++++++++++ .../SapSailingContextDataFactoryImpl.java | 23 ------------- .../sse/gwt/client/sapheader/SAPHeader.java | 4 +-- ...Branding.java => ClientConfiguration.java} | 34 +++++++++---------- java/com.sap.sse.security.ui/EditProfile.html | 2 +- .../EmailValidation.html | 2 +- java/com.sap.sse.security.ui/Login.html | 2 +- java/com.sap.sse.security.ui/Register.html | 2 +- .../UserManagement.html | 2 +- .../login/LoginHintContent.java | 4 +-- .../sap/sse/security/ui/login/LoginView.java | 4 +-- .../ui/registration/RegisterView.java | 4 +-- 57 files changed, 132 insertions(+), 132 deletions(-) rename java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/context/data/{SapSailingContextDataJSO.java => ClientConfigurationContextDataJSO.java} (55%) create mode 100644 java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/context/impl/ClientConfigurationContextDataFactoryImpl.java delete mode 100644 java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/context/impl/SapSailingContextDataFactoryImpl.java rename java/com.sap.sse.gwt/src/com/sap/sse/gwt/shared/{Branding.java => ClientConfiguration.java} (52%) diff --git a/java/com.sap.sailing.dashboards.gwt/RibDashboard.html b/java/com.sap.sailing.dashboards.gwt/RibDashboard.html index 469760722e2..6c55c754bf9 100644 --- a/java/com.sap.sailing.dashboards.gwt/RibDashboard.html +++ b/java/com.sap.sailing.dashboards.gwt/RibDashboard.html @@ -14,7 +14,7 @@ Dashboard diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/header/DashboardHeader.java b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/header/DashboardHeader.java index 0237b3991bc..55f0b9290da 100644 --- a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/header/DashboardHeader.java +++ b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/header/DashboardHeader.java @@ -12,7 +12,7 @@ import com.google.gwt.user.client.ui.HasWidgets; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; public class DashboardHeader extends Composite implements HasWidgets { @@ -38,7 +38,7 @@ public class DashboardHeader extends Composite implements HasWidgets { public DashboardHeader() { dashboardHeaderResources.gss().ensureInjected(); initWidget(uiBinder.createAndBindUi(this)); - if (Branding.getInstance().isActive()) { + if (ClientConfiguration.getInstance().isBrandingActive()) { sapLogo.setResource(DashboardHeaderResources.INSTANCE.sapLogo()); } event.setInnerHTML(StringMessages.INSTANCE.dashboardHeader()); diff --git a/java/com.sap.sailing.gwt.ui/AdminConsole.html b/java/com.sap.sailing.gwt.ui/AdminConsole.html index 8a3e4095534..db0e90a4034 100644 --- a/java/com.sap.sailing.gwt.ui/AdminConsole.html +++ b/java/com.sap.sailing.gwt.ui/AdminConsole.html @@ -33,7 +33,7 @@ diff --git a/java/com.sap.sailing.gwt.ui/AutoPlay.html b/java/com.sap.sailing.gwt.ui/AutoPlay.html index 705f695b745..622fe347c41 100644 --- a/java/com.sap.sailing.gwt.ui/AutoPlay.html +++ b/java/com.sap.sailing.gwt.ui/AutoPlay.html @@ -40,7 +40,7 @@ videojs.options.techOrder = ['vimeo', 'youtube', 'html5']; diff --git a/java/com.sap.sailing.gwt.ui/DataMining.html b/java/com.sap.sailing.gwt.ui/DataMining.html index 288182bdc1e..cea6a7dfbbd 100644 --- a/java/com.sap.sailing.gwt.ui/DataMining.html +++ b/java/com.sap.sailing.gwt.ui/DataMining.html @@ -17,7 +17,7 @@ diff --git a/java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.html b/java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.html index 4903600a997..13cd4d1e379 100644 --- a/java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.html +++ b/java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.html @@ -22,7 +22,7 @@ diff --git a/java/com.sap.sailing.gwt.ui/Home.html b/java/com.sap.sailing.gwt.ui/Home.html index c06d66a3020..3014189d5ef 100644 --- a/java/com.sap.sailing.gwt.ui/Home.html +++ b/java/com.sap.sailing.gwt.ui/Home.html @@ -27,7 +27,7 @@ videojs.options.techOrder = ['vimeo', 'youtube', 'html5']; diff --git a/java/com.sap.sailing.gwt.ui/Leaderboard.html b/java/com.sap.sailing.gwt.ui/Leaderboard.html index b1490d0e287..ada1fcb3db8 100755 --- a/java/com.sap.sailing.gwt.ui/Leaderboard.html +++ b/java/com.sap.sailing.gwt.ui/Leaderboard.html @@ -20,7 +20,7 @@ diff --git a/java/com.sap.sailing.gwt.ui/LeaderboardEditing.html b/java/com.sap.sailing.gwt.ui/LeaderboardEditing.html index 3ef4765e617..00cd76c45d2 100755 --- a/java/com.sap.sailing.gwt.ui/LeaderboardEditing.html +++ b/java/com.sap.sailing.gwt.ui/LeaderboardEditing.html @@ -24,7 +24,7 @@ diff --git a/java/com.sap.sailing.gwt.ui/PairingList.html b/java/com.sap.sailing.gwt.ui/PairingList.html index 3d158a66cb2..f0812a97fdd 100644 --- a/java/com.sap.sailing.gwt.ui/PairingList.html +++ b/java/com.sap.sailing.gwt.ui/PairingList.html @@ -20,7 +20,7 @@ diff --git a/java/com.sap.sailing.gwt.ui/RaceBoard.html b/java/com.sap.sailing.gwt.ui/RaceBoard.html index 2bccf3635d7..de796021d04 100644 --- a/java/com.sap.sailing.gwt.ui/RaceBoard.html +++ b/java/com.sap.sailing.gwt.ui/RaceBoard.html @@ -33,7 +33,7 @@ videojs.options.techOrder = [ 'vimeo', 'html5' ]; diff --git a/java/com.sap.sailing.gwt.ui/RegattaOverview.html b/java/com.sap.sailing.gwt.ui/RegattaOverview.html index 1458f42bab1..7197ecb9282 100644 --- a/java/com.sap.sailing.gwt.ui/RegattaOverview.html +++ b/java/com.sap.sailing.gwt.ui/RegattaOverview.html @@ -16,7 +16,7 @@ diff --git a/java/com.sap.sailing.gwt.ui/Simulator.html b/java/com.sap.sailing.gwt.ui/Simulator.html index 2879592d84a..30f341ff11c 100644 --- a/java/com.sap.sailing.gwt.ui/Simulator.html +++ b/java/com.sap.sailing.gwt.ui/Simulator.html @@ -19,7 +19,7 @@ diff --git a/java/com.sap.sailing.gwt.ui/Spectator.html b/java/com.sap.sailing.gwt.ui/Spectator.html index ce46ee44f32..ce1142917d6 100644 --- a/java/com.sap.sailing.gwt.ui/Spectator.html +++ b/java/com.sap.sailing.gwt.ui/Spectator.html @@ -31,7 +31,7 @@ diff --git a/java/com.sap.sailing.gwt.ui/VideoPopup.html b/java/com.sap.sailing.gwt.ui/VideoPopup.html index 169da1109ee..a4c6b2f5615 100644 --- a/java/com.sap.sailing.gwt.ui/VideoPopup.html +++ b/java/com.sap.sailing.gwt.ui/VideoPopup.html @@ -5,7 +5,7 @@ ${SAP}Sailing Video diff --git a/java/com.sap.sailing.gwt.ui/YoutubePopup.html b/java/com.sap.sailing.gwt.ui/YoutubePopup.html index 827f971a43c..497486a5606 100644 --- a/java/com.sap.sailing.gwt.ui/YoutubePopup.html +++ b/java/com.sap.sailing.gwt.ui/YoutubePopup.html @@ -5,7 +5,7 @@ ${SAP}Sailing Video diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/legacy/EventPlace.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/legacy/EventPlace.java index b163d9854d8..33dd900831e 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/legacy/EventPlace.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/legacy/EventPlace.java @@ -3,7 +3,7 @@ package com.sap.sailing.gwt.home.client.place.event.legacy; import com.google.gwt.place.shared.PlaceTokenizer; import com.sap.sailing.gwt.common.client.AbstractBasePlace; import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; public class EventPlace extends AbstractBasePlace { private final String eventUuidAsString; @@ -36,7 +36,7 @@ public class EventPlace extends AbstractBasePlace { } public String getTitle(String eventName) { - return (Branding.getInstance().isActive() ? StringMessages.INSTANCE.sapSailing() + return (ClientConfiguration.getInstance().isBrandingActive() ? StringMessages.INSTANCE.sapSailing() : StringMessages.INSTANCE.whitelabelSailing()) + " - " + eventName; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/legacy/RegattaPlace.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/legacy/RegattaPlace.java index 54b496b2647..30df0c5439c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/legacy/RegattaPlace.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/legacy/RegattaPlace.java @@ -3,7 +3,7 @@ package com.sap.sailing.gwt.home.client.place.event.legacy; import com.google.gwt.place.shared.PlaceTokenizer; import com.sap.sailing.gwt.common.client.AbstractBasePlace; import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; public class RegattaPlace extends AbstractBasePlace { private final String eventUuidAsString; @@ -45,7 +45,7 @@ public class RegattaPlace extends AbstractBasePlace { } public String getTitle(String eventName, String leaderboardName) { - return (Branding.getInstance().isActive() ? StringMessages.INSTANCE.sapSailing() + return (ClientConfiguration.getInstance().isBrandingActive() ? StringMessages.INSTANCE.sapSailing() : StringMessages.INSTANCE.whitelabelSailing()) + " - " + StringMessages.INSTANCE.leaderboard() + ": " + leaderboardName; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/legacy/SeriesPlace.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/legacy/SeriesPlace.java index 0da7f405faa..361cf086e40 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/legacy/SeriesPlace.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/legacy/SeriesPlace.java @@ -3,7 +3,7 @@ package com.sap.sailing.gwt.home.client.place.event.legacy; import com.google.gwt.place.shared.PlaceTokenizer; import com.sap.sailing.gwt.common.client.AbstractBasePlace; import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; public class SeriesPlace extends AbstractBasePlace { private final String eventUuidAsString; @@ -45,7 +45,7 @@ public class SeriesPlace extends AbstractBasePlace { } public String getTitle(String eventName, String leaderboardName) { - return (Branding.getInstance().isActive() ? StringMessages.INSTANCE.sapSailing() + return (ClientConfiguration.getInstance().isBrandingActive() ? StringMessages.INSTANCE.sapSailing() : StringMessages.INSTANCE.whitelabelSailing()) + " - " + StringMessages.INSTANCE.leaderboard() + ": " + leaderboardName; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.java index c127b76b1c0..61793f4f590 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.java @@ -22,7 +22,7 @@ import com.sap.sailing.gwt.home.shared.SwitchingEntryPoint; import com.sap.sailing.gwt.home.shared.app.PlaceNavigation; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sse.gwt.client.controls.languageselect.LanguageSelector; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; import com.sap.sse.gwt.shared.DebugConstants; public class Footer extends Composite { @@ -60,7 +60,7 @@ public class Footer extends Composite { } }); - if (!Branding.getInstance().isActive()) { + if (!ClientConfiguration.getInstance().isBrandingActive()) { copyrightDiv.getStyle().setDisplay(NONE); languageSelector.setLabelText(StringMessages.INSTANCE.whitelabelFooterLanguage()); sapJobsAnchor.getStyle().setDisplay(Display.NONE); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.java index 2cf0c7c0f37..d5ba2c0e955 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.java @@ -37,7 +37,7 @@ import com.sap.sailing.gwt.home.shared.places.solutions.SolutionsPlace.Solutions import com.sap.sailing.gwt.home.shared.places.start.StartPlace; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sse.gwt.client.mvp.PlaceChangedEvent; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; import com.sap.sse.gwt.shared.DebugConstants; import com.sap.sse.security.ui.authentication.view.AuthenticationMenuView; import com.sap.sse.security.ui.authentication.view.AuthenticationMenuViewImpl; @@ -107,7 +107,7 @@ public class Header extends Composite { authenticationMenuView = new AuthenticationMenuViewImpl(usermenu, HeaderResources.INSTANCE.css().loggedin(), HeaderResources.INSTANCE.css().open()); - if (!Branding.getInstance().isActive()) { + if (!ClientConfiguration.getInstance().isBrandingActive()) { logoImage.getStyle().setDisplay(Display.NONE); solutionsPageLink.getElement().getStyle().setDisplay(Display.NONE); logoAnchor.setHref(""); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/sharing/SharingButtons.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/sharing/SharingButtons.java index be0a4fc82d3..f5a98882a8c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/sharing/SharingButtons.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/sharing/SharingButtons.java @@ -11,7 +11,7 @@ import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.Widget; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; public class SharingButtons extends Composite { @@ -28,13 +28,13 @@ public class SharingButtons extends Composite { public SharingButtons() { SharingButtonsResources.INSTANCE.css().ensureInjected(); initWidget(uiBinder.createAndBindUi(this)); - if (!Branding.getInstance().isActive()) { + if (!ClientConfiguration.getInstance().isBrandingActive()) { htmlPanel.getElement().getStyle().setDisplay(NONE); } } public void setUp(SharingMetadataProvider provider) { - if (!Branding.getInstance().isActive()) { + if (!ClientConfiguration.getInstance().isBrandingActive()) { return; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/socialfooter/SocialFooter.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/socialfooter/SocialFooter.java index 583dda025e5..20c7779a7b1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/socialfooter/SocialFooter.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/socialfooter/SocialFooter.java @@ -9,7 +9,7 @@ import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.Widget; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; public class SocialFooter extends Composite { @@ -24,7 +24,7 @@ public class SocialFooter extends Composite { public SocialFooter() { SocialFooterResources.INSTANCE.css().ensureInjected(); initWidget(uiBinder.createAndBindUi(this)); - if (!Branding.getInstance().isActive()) { + if (!ClientConfiguration.getInstance().isBrandingActive()) { htmlPanel.getElement().getStyle().setDisplay(NONE); } htmlPanel.getElement().setAttribute(DEBUG_ID_ATTRIBUTE, "socialFooter"); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/multiregatta/TabletAndDesktopMultiRegattaEventView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/multiregatta/TabletAndDesktopMultiRegattaEventView.java index f74db531068..4072b072d7f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/multiregatta/TabletAndDesktopMultiRegattaEventView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/multiregatta/TabletAndDesktopMultiRegattaEventView.java @@ -29,7 +29,7 @@ import com.sap.sailing.gwt.home.shared.places.fakeseries.SeriesDefaultPlace; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sse.common.Util; import com.sap.sse.gwt.client.LinkUtil; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; public class TabletAndDesktopMultiRegattaEventView extends Composite implements EventMultiregattaView { @@ -94,7 +94,7 @@ public class TabletAndDesktopMultiRegattaEventView extends Composite implements public void navigateTabsTo(AbstractMultiregattaEventPlace place) { tabPanelUi.activatePlace(place); StringBuilder titleBuilder = new StringBuilder( - (Branding.getInstance().isActive() ? StringMessages.INSTANCE.sapSailing() + (ClientConfiguration.getInstance().isBrandingActive() ? StringMessages.INSTANCE.sapSailing() : StringMessages.INSTANCE.whitelabelSailing())).append(" - "); titleBuilder.append(currentPresenter.showRegattaMetadata() ? currentPresenter.getRegattaMetadata() diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/TabletAndDesktopRegattaEventView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/TabletAndDesktopRegattaEventView.java index 8345587e439..457ef04d564 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/TabletAndDesktopRegattaEventView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/TabletAndDesktopRegattaEventView.java @@ -32,7 +32,7 @@ import com.sap.sailing.gwt.ui.client.FlagImageResolver; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sse.common.Util; import com.sap.sse.gwt.client.LinkUtil; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; public class TabletAndDesktopRegattaEventView extends Composite implements EventRegattaView { @@ -104,7 +104,7 @@ public class TabletAndDesktopRegattaEventView extends Composite implements Event public void navigateTabsTo(AbstractEventRegattaPlace place) { tabPanelUi.activatePlace(place); StringBuilder titleBuilder = new StringBuilder( - (Branding.getInstance().isActive() ? StringMessages.INSTANCE.sapSailing() + (ClientConfiguration.getInstance().isBrandingActive() ? StringMessages.INSTANCE.sapSailing() : StringMessages.INSTANCE.whitelabelSailing())).append(" - "); titleBuilder.append(currentPresenter.showRegattaMetadata() ? currentPresenter.getRegattaMetadata() diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/fakeseries/TabletAndDesktopSeriesView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/fakeseries/TabletAndDesktopSeriesView.java index c0db47cf915..4d7863343f3 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/fakeseries/TabletAndDesktopSeriesView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/fakeseries/TabletAndDesktopSeriesView.java @@ -14,7 +14,7 @@ import com.sap.sailing.gwt.common.client.controls.tabbar.TabView; import com.sap.sailing.gwt.home.desktop.partials.seriesheader.SeriesHeader; import com.sap.sailing.gwt.home.shared.app.ApplicationHistoryMapper; import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; public class TabletAndDesktopSeriesView extends Composite implements SeriesView { private static final ApplicationHistoryMapper historyMapper = GWT. create(ApplicationHistoryMapper.class); @@ -51,7 +51,7 @@ public class TabletAndDesktopSeriesView extends Composite implements SeriesView< public void navigateTabsTo(AbstractSeriesTabPlace place) { tabPanelUi.activatePlace(place); StringBuilder titleBuilder = new StringBuilder( - (Branding.getInstance().isActive() ? StringMessages.INSTANCE.sapSailing() + (ClientConfiguration.getInstance().isBrandingActive() ? StringMessages.INSTANCE.sapSailing() : StringMessages.INSTANCE.whitelabelSailing())).append(" - "); titleBuilder.append(currentPresenter.getSeriesDTO().getDisplayName()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/solutions/SolutionsActivity.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/solutions/SolutionsActivity.java index 63b39ed7a4e..9f654b8f398 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/solutions/SolutionsActivity.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/solutions/SolutionsActivity.java @@ -6,7 +6,7 @@ import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.AcceptsOneWidget; import com.sap.sailing.gwt.home.shared.places.solutions.SolutionsPlace; import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; public class SolutionsActivity extends AbstractActivity { private final SolutionsPlace solutionsPlace; @@ -21,7 +21,7 @@ public class SolutionsActivity extends AbstractActivity { public void start(AcceptsOneWidget panel, EventBus eventBus) { SolutionsView solutionsView = clientFactory.createSolutionsView(solutionsPlace.getNavigationTab()); panel.setWidget(solutionsView.asWidget()); - Window.setTitle((Branding.getInstance().isActive() ? StringMessages.INSTANCE.sapSailing() + Window.setTitle((ClientConfiguration.getInstance().isBrandingActive() ? StringMessages.INSTANCE.sapSailing() : StringMessages.INSTANCE.whitelabelSailing()) + " - " + StringMessages.INSTANCE.solutions()); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/TabletAndDesktopUserProfileView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/TabletAndDesktopUserProfileView.java index 240f05f2709..b226f44d25e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/TabletAndDesktopUserProfileView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/TabletAndDesktopUserProfileView.java @@ -18,7 +18,7 @@ import com.sap.sailing.gwt.home.shared.app.ApplicationHistoryMapper; import com.sap.sailing.gwt.home.shared.places.user.profile.AbstractUserProfilePlace; import com.sap.sailing.gwt.ui.client.FlagImageResolver; import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; import com.sap.sse.security.ui.authentication.app.AuthenticationContext; import com.sap.sse.security.ui.userprofile.desktop.userheader.UserHeader; @@ -73,7 +73,7 @@ public class TabletAndDesktopUserProfileView extends Composite public void navigateTabsTo(AbstractUserProfilePlace place) { tabPanelUi.activatePlace(place); StringBuilder titleBuilder = new StringBuilder( - (Branding.getInstance().isActive() ? StringMessages.INSTANCE.sapSailing() + (ClientConfiguration.getInstance().isBrandingActive() ? StringMessages.INSTANCE.sapSailing() : StringMessages.INSTANCE.whitelabelSailing())).append(" - "); titleBuilder.append(place.getLocationTitle()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/WhatsNewActivity.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/WhatsNewActivity.java index 3866ea958fd..b68af64ceb2 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/WhatsNewActivity.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/WhatsNewActivity.java @@ -5,7 +5,7 @@ import com.google.gwt.event.shared.EventBus; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.AcceptsOneWidget; import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; public class WhatsNewActivity extends AbstractActivity { private final WhatsNewPlace place; @@ -20,7 +20,7 @@ public class WhatsNewActivity extends AbstractActivity { public void start(AcceptsOneWidget panel, EventBus eventBus) { WhatsNewView whatsNewView = clientFactory.createWhatsNewView(place.getNavigationTab()); panel.setWidget(whatsNewView.asWidget()); - Window.setTitle((Branding.getInstance().isActive() ? StringMessages.INSTANCE.sapSailing() + Window.setTitle((ClientConfiguration.getInstance().isBrandingActive() ? StringMessages.INSTANCE.sapSailing() : StringMessages.INSTANCE.whitelabelSailing()) + " - " + StringMessages.INSTANCE.whatsNew()); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.java index 800664e1cb5..e5e89e6374d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.java @@ -21,7 +21,7 @@ import com.sap.sailing.gwt.home.mobile.app.MobilePlacesNavigator; import com.sap.sailing.gwt.home.shared.SwitchingEntryPoint; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sse.gwt.client.controls.languageselect.LanguageSelector; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; /** * Mobile page footer with several links and the ability to switch the language. @@ -60,7 +60,7 @@ public class Footer extends Composite { } }); - if (!Branding.getInstance().isActive()) { + if (!ClientConfiguration.getInstance().isBrandingActive()) { copyrightDiv.getStyle().setDisplay(NONE); languageSelector.setLabelText(StringMessages.INSTANCE.whitelabelFooterLanguage()); sapJobsAnchor.getStyle().setDisplay(Display.NONE); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/header/Header.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/header/Header.java index 465669b37f4..939c7a0a7c3 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/header/Header.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/header/Header.java @@ -24,7 +24,7 @@ import com.sap.sailing.gwt.home.shared.places.solutions.SolutionsPlace.Solutions import com.sap.sailing.gwt.home.shared.utils.DropdownHandler; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sse.gwt.client.LinkUtil; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; import com.sap.sse.security.ui.authentication.AuthenticationContextEvent; import com.sap.sse.security.ui.authentication.AuthenticationSignOutRequestEvent; @@ -108,7 +108,7 @@ public class Header extends Composite { } }); - if (!Branding.getInstance().isActive()) { + if (!ClientConfiguration.getInstance().isBrandingActive()) { logoImage.getStyle().setDisplay(Display.NONE); logoAnchor.setHref(""); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/socialfooter/SocialFooter.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/socialfooter/SocialFooter.java index fc7ab60b565..faf48103a91 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/socialfooter/SocialFooter.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/socialfooter/SocialFooter.java @@ -7,7 +7,7 @@ import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.Widget; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; public class SocialFooter extends Composite { @@ -22,7 +22,7 @@ public class SocialFooter extends Composite { SocialFooterResources.INSTANCE.css().ensureInjected(); initWidget(uiBinder.createAndBindUi(this)); - if (!Branding.getInstance().isActive()) { + if (!ClientConfiguration.getInstance().isBrandingActive()) { htmlPanel.getElement().getStyle().setDisplay(Display.NONE); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/event/latestnews/LatestNewsPlace.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/event/latestnews/LatestNewsPlace.java index 2fe70cfbc57..fc26eae94c4 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/event/latestnews/LatestNewsPlace.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/event/latestnews/LatestNewsPlace.java @@ -11,7 +11,7 @@ import com.sap.sailing.gwt.home.shared.places.PlaceTokenPrefixes; import com.sap.sailing.gwt.home.shared.places.event.AbstractEventPlace; import com.sap.sailing.gwt.home.shared.places.event.EventContext; import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; public class LatestNewsPlace extends AbstractEventPlace implements HasMobileVersion { private List news = new LinkedList(); @@ -34,7 +34,7 @@ public class LatestNewsPlace extends AbstractEventPlace implements HasMobileVers } public String getTitle() { - return (Branding.getInstance().isActive() ? StringMessages.INSTANCE.sapSailing() + return (ClientConfiguration.getInstance().isBrandingActive() ? StringMessages.INSTANCE.sapSailing() : StringMessages.INSTANCE.whitelabelSailing()); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/dialog/whatsnew/WhatsNewDialogFactory.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/dialog/whatsnew/WhatsNewDialogFactory.java index ee2af0a227f..6b73b7b123c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/dialog/whatsnew/WhatsNewDialogFactory.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/dialog/whatsnew/WhatsNewDialogFactory.java @@ -12,7 +12,7 @@ import com.sap.sailing.gwt.home.desktop.places.whatsnew.WhatsNewResources; import com.sap.sailing.gwt.home.shared.partials.dialog.DialogFactory; import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback; import com.sap.sse.gwt.settings.SettingsToJsonSerializerGWT; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; import com.sap.sse.security.ui.client.UserService; import com.sap.sse.security.ui.client.i18n.StringMessages; @@ -54,7 +54,7 @@ public final class WhatsNewDialogFactory { */ private static void showWhatsNewDialogIfNecessaryAndUpdatePreference(UserService userService, PlaceController placeController) { - if (isUserNotified || !Branding.getInstance().isActive()) { + if (isUserNotified || !ClientConfiguration.getInstance().isBrandingActive()) { return; } final long charactersInWhatsChangedDocument = WhatsNewResources.INSTANCE.getSailingAnalyticsNotesHtml() diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/fullscreen/FullscreenContainer.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/fullscreen/FullscreenContainer.java index 16eea0170c6..fe66b99d190 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/fullscreen/FullscreenContainer.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/fullscreen/FullscreenContainer.java @@ -26,7 +26,7 @@ import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.SimpleLayoutPanel; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; /** * Base class for fullscreen viewer UIs. This viewer has an extensible header area with a close button and a content @@ -82,7 +82,7 @@ public class FullscreenContainer { } protected void showLogo() { - if (Branding.getInstance().isActive()) { + if (ClientConfiguration.getInstance().isBrandingActive()) { headerContentUi.getElement().getStyle().setMarginLeft(5, Unit.EM); } else { logoUi.getStyle().setDisplay(Display.NONE); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/event/AbstractEventPlace.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/event/AbstractEventPlace.java index ec3e264d56c..1bf2d13d522 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/event/AbstractEventPlace.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/event/AbstractEventPlace.java @@ -9,7 +9,7 @@ import com.sap.sailing.gwt.common.client.AbstractMapTokenizer; import com.sap.sailing.gwt.home.shared.app.HasLocationTitle; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sse.common.Util; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; public abstract class AbstractEventPlace extends Place implements HasLocationTitle { private final EventContext ctx; @@ -28,7 +28,7 @@ public abstract class AbstractEventPlace extends Place implements HasLocationTit } public String getTitle(String eventName) { - return (Branding.getInstance().isActive() ? StringMessages.INSTANCE.sapSailing() + return (ClientConfiguration.getInstance().isBrandingActive() ? StringMessages.INSTANCE.sapSailing() : StringMessages.INSTANCE.whitelabelSailing()) + " - " + eventName; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/events/EventsPlace.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/events/EventsPlace.java index 19f9b63e50c..2f95e1dac7a 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/events/EventsPlace.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/events/EventsPlace.java @@ -5,11 +5,11 @@ import com.google.gwt.place.shared.PlaceTokenizer; import com.sap.sailing.gwt.home.shared.app.HasLocationTitle; import com.sap.sailing.gwt.home.shared.app.HasMobileVersion; import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; public class EventsPlace extends Place implements HasLocationTitle, HasMobileVersion { public String getTitle() { - return (Branding.getInstance().isActive() ? StringMessages.INSTANCE.sapSailing() + return (ClientConfiguration.getInstance().isBrandingActive() ? StringMessages.INSTANCE.sapSailing() : StringMessages.INSTANCE.whitelabelSailing()) + " - " + StringMessages.INSTANCE.events(); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/fakeseries/AbstractSeriesPlace.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/fakeseries/AbstractSeriesPlace.java index 69cb55e4b2b..5d8bfb51d63 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/fakeseries/AbstractSeriesPlace.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/fakeseries/AbstractSeriesPlace.java @@ -9,7 +9,7 @@ import com.google.gwt.place.shared.Place; import com.sap.sailing.gwt.common.client.AbstractMapTokenizer; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sse.common.Util; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; public abstract class AbstractSeriesPlace extends Place { private final SeriesContext ctx; @@ -23,7 +23,7 @@ public abstract class AbstractSeriesPlace extends Place { } public String getTitle(String eventName) { - return (Branding.getInstance().isActive() ? StringMessages.INSTANCE.sapSailing() + return (ClientConfiguration.getInstance().isBrandingActive() ? StringMessages.INSTANCE.sapSailing() : StringMessages.INSTANCE.whitelabelSailing()) + " - " + eventName; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/searchresult/SearchResultPlace.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/searchresult/SearchResultPlace.java index ab822dea079..431fb6964ab 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/searchresult/SearchResultPlace.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/searchresult/SearchResultPlace.java @@ -5,7 +5,7 @@ import com.google.gwt.place.shared.PlaceTokenizer; import com.sap.sailing.gwt.home.shared.app.HasLocationTitle; import com.sap.sailing.gwt.home.shared.app.HasMobileVersion; import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; public class SearchResultPlace extends Place implements HasLocationTitle, HasMobileVersion { private final String searchText; @@ -21,7 +21,7 @@ public class SearchResultPlace extends Place implements HasLocationTitle, HasMob } public String getTitle() { - return (Branding.getInstance().isActive() ? StringMessages.INSTANCE.sapSailing() + return (ClientConfiguration.getInstance().isBrandingActive() ? StringMessages.INSTANCE.sapSailing() : StringMessages.INSTANCE.whitelabelSailing()) + " - " + StringMessages.INSTANCE.search(); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/start/StartPlace.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/start/StartPlace.java index 49f17b08088..781d2d5ea61 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/start/StartPlace.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/start/StartPlace.java @@ -5,11 +5,11 @@ import com.google.gwt.place.shared.PlaceTokenizer; import com.sap.sailing.gwt.home.shared.app.HasLocationTitle; import com.sap.sailing.gwt.home.shared.app.HasMobileVersion; import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; public class StartPlace extends Place implements HasLocationTitle, HasMobileVersion { public String getTitle() { - return Branding.getInstance().isActive() ? StringMessages.INSTANCE.sapSailing() + return ClientConfiguration.getInstance().isBrandingActive() ? StringMessages.INSTANCE.sapSailing() : StringMessages.INSTANCE.whitelabelSailing(); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java index e51af3e4efd..fd021f45dc8 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java @@ -162,7 +162,7 @@ import com.sap.sse.gwt.client.shared.components.Component; import com.sap.sse.gwt.client.shared.components.SettingsDialog; import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent; import com.sap.sse.gwt.client.shared.settings.ComponentContext; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; import com.sap.sse.gwt.shared.DebugConstants; public class RaceMap extends AbstractCompositeComponent implements TimeListener, CompetitorSelectionChangeListener, @@ -758,7 +758,7 @@ public class RaceMap extends AbstractCompositeComponent impleme rootPanel.add(map, 0, 0); if (showHeaderPanel) { Image sapLogo = createSAPLogo(); - if (Branding.getInstance().isActive()) { + if (ClientConfiguration.getInstance().isBrandingActive()) { rootPanel.add(sapLogo); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/databylogo/DataByLogo.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/databylogo/DataByLogo.java index f71487209f9..e9083ed899a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/databylogo/DataByLogo.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/databylogo/DataByLogo.java @@ -13,7 +13,7 @@ import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.domain.common.tracking.TrackingConnectorType; import com.sap.sailing.gwt.ui.shared.TrackingConnectorInfoDTO; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; import com.sap.sse.gwt.shared.DebugConstants; public class DataByLogo extends Widget { @@ -31,7 +31,7 @@ public class DataByLogo extends Widget { public DataByLogo() { DataByLogoResources.INSTANCE.css().ensureInjected(); setElement(uiBinder.createAndBindUi(this)); - if (!Branding.getInstance().isActive()) { + if (!ClientConfiguration.getInstance().isBrandingActive()) { dataByContainer.getStyle().setDisplay(Display.NONE); } dataByContainer.setAttribute(DebugConstants.DEBUG_ID_ATTRIBUTE, "dataByContainer"); @@ -39,7 +39,7 @@ public class DataByLogo extends Widget { public void setUp(Set trackingConnectorInfos, boolean colorIfPossible, boolean enforceTextColor) { - if (Branding.getInstance().isActive()) { + if (ClientConfiguration.getInstance().isBrandingActive()) { TrackingConnectorInfoDTO mostProminentConnectorInfo = selectMostProminentConnectorInfo( trackingConnectorInfos); if (mostProminentConnectorInfo == null) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/spectator/SpectatorEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/spectator/SpectatorEntryPoint.java index 272aff34372..7977aaa8c9c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/spectator/SpectatorEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/spectator/SpectatorEntryPoint.java @@ -18,7 +18,7 @@ import com.sap.sailing.gwt.ui.client.RegattaRefresher; import com.sap.sailing.gwt.ui.client.shared.panels.SimpleWelcomeWidget; import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; import com.sap.sse.gwt.settings.SettingsToUrlSerializer; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; /** * @@ -70,7 +70,7 @@ public class SpectatorEntryPoint extends AbstractSailingEntryPoint implements Re if (!embedded) { groupPanel.setWelcomeWidget(new SimpleWelcomeWidget(getStringMessages().welcomeToSailingAnalytics(), getStringMessages().welcomeToSailingAnalyticsBody())); - if (Branding.getInstance().isActive()) { + if (ClientConfiguration.getInstance().isBrandingActive()) { SimplePanel feedbackPanel = new SimplePanel(); feedbackPanel.getElement().getStyle().setProperty("clear", "right"); feedbackPanel.addStyleName("feedbackPanel"); diff --git a/java/com.sap.sse.gwt.adminconsole/src/com/sap/sse/gwt/adminconsole/AdminConsolePanel.java b/java/com.sap.sse.gwt.adminconsole/src/com/sap/sse/gwt/adminconsole/AdminConsolePanel.java index 1b40193fea3..a51563ecefc 100644 --- a/java/com.sap.sse.gwt.adminconsole/src/com/sap/sse/gwt/adminconsole/AdminConsolePanel.java +++ b/java/com.sap.sse.gwt.adminconsole/src/com/sap/sse/gwt/adminconsole/AdminConsolePanel.java @@ -26,7 +26,7 @@ import com.sap.sse.gwt.client.ServerInfoDTO; import com.sap.sse.gwt.client.panels.AbstractTabLayoutPanel; import com.sap.sse.gwt.client.panels.HorizontalTabLayoutPanel; import com.sap.sse.gwt.client.panels.VerticalTabLayoutPanel; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; import com.sap.sse.security.shared.HasPermissions; import com.sap.sse.security.shared.WildcardPermission; import com.sap.sse.security.shared.dto.UserDTO; @@ -206,7 +206,7 @@ public class AdminConsolePanel extends HeaderPanel implements HandleTabSelectabl informationPanel.add(errorReporter.getPersistentInformationWidget(), DockPanel.CENTER); SystemInformationPanel sysinfoPanel = new SystemInformationPanel(serverInfo, errorReporter, stringMessages); sysinfoPanel.ensureDebugId("SystemInformation"); - if (Branding.getInstance().isActive()) { + if (ClientConfiguration.getInstance().isBrandingActive()) { final Anchor releaseNotesLink = new Anchor( new SafeHtmlBuilder().appendEscaped(releaseNotesAnchorLabel).toSafeHtml(), releaseNotesURL); sysinfoPanel.add(releaseNotesLink); diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/context/data/SapSailingContextDataJSO.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/context/data/ClientConfigurationContextDataJSO.java similarity index 55% rename from java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/context/data/SapSailingContextDataJSO.java rename to java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/context/data/ClientConfigurationContextDataJSO.java index f87f4032f8d..4bf5e911852 100644 --- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/context/data/SapSailingContextDataJSO.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/context/data/ClientConfigurationContextDataJSO.java @@ -5,14 +5,14 @@ import com.google.gwt.core.client.JavaScriptObject; /** * Access custom information for GWT client from static browser page. * - * @see com.sap.sse.gwt.client.context.impl.SapSailingContextDataFactoryImpl - * @see com.sap.sse.gwt.shared.Branding + * @see com.sap.sse.gwt.client.context.impl.ClientConfigurationContextDataFactoryImpl + * @see com.sap.sse.gwt.shared.ClientConfiguration * @author Georg Herdt * */ -public class SapSailingContextDataJSO extends JavaScriptObject { +public class ClientConfigurationContextDataJSO extends JavaScriptObject { - protected SapSailingContextDataJSO() { + protected ClientConfigurationContextDataJSO() { } public final native boolean isDebrandingActive() /*-{ diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/context/impl/ClientConfigurationContextDataFactoryImpl.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/context/impl/ClientConfigurationContextDataFactoryImpl.java new file mode 100644 index 00000000000..594ee75e55f --- /dev/null +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/context/impl/ClientConfigurationContextDataFactoryImpl.java @@ -0,0 +1,23 @@ +package com.sap.sse.gwt.client.context.impl; + +import com.sap.sse.gwt.client.context.data.ClientConfigurationContextDataJSO; + +/** + *

    + * Accessor to the custom object structure used for providing static configuration from the server to the GWT client. + * An example can be seen here {@link /com.sap.sailing.gwt.ui/Home.html} + *

    + *

    + * {@link ClientConfigurationContextDataJSO} provides access to the individual fields. + *

    + * @see com.sap.sse.gwt.shared.ClientConfiguration + * @author Georg Herdt + * + */ +public final class ClientConfigurationContextDataFactoryImpl { + + public native ClientConfigurationContextDataJSO getInstance() /*-{ + return $doc.clientConfigurationContext; + }-*/; + +} diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/context/impl/SapSailingContextDataFactoryImpl.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/context/impl/SapSailingContextDataFactoryImpl.java deleted file mode 100644 index e652c62f134..00000000000 --- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/context/impl/SapSailingContextDataFactoryImpl.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.sap.sse.gwt.client.context.impl; - -import com.sap.sse.gwt.client.context.data.SapSailingContextDataJSO; - -/** - *

    - * Accessor to the custom object structure used for providing static configuration from the server to the GWT client. - * An example can be seen here {@link /com.sap.sailing.gwt.ui/Home.html} - *

    - *

    - * {@link SapSailingContextDataJSO} provides access to the individual fields. - *

    - * @see com.sap.sse.gwt.shared.Branding - * @author Georg Herdt - * - */ -public final class SapSailingContextDataFactoryImpl { - - public native SapSailingContextDataJSO getInstance() /*-{ - return $doc.sailingContext; - }-*/; - -} diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/sapheader/SAPHeader.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/sapheader/SAPHeader.java index 4d86bfae784..bb762b846b8 100644 --- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/sapheader/SAPHeader.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/sapheader/SAPHeader.java @@ -11,7 +11,7 @@ import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; import com.sap.sse.gwt.shared.DebugConstants; /** @@ -55,7 +55,7 @@ public class SAPHeader extends Composite { String sapSailingUrl = applicationBaseUrl + "?locale=" + LocaleInfo.getCurrentLocale().getLocaleName(); applicationNameAnchor.setHref(sapSailingUrl); - if (!Branding.getInstance().isActive()) { + if (!ClientConfiguration.getInstance().isBrandingActive()) { logoAnchor.getStyle().setDisplay(Display.NONE); applicationNameAnchor.setHref(""); } diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/shared/Branding.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/shared/ClientConfiguration.java similarity index 52% rename from java/com.sap.sse.gwt/src/com/sap/sse/gwt/shared/Branding.java rename to java/com.sap.sse.gwt/src/com/sap/sse/gwt/shared/ClientConfiguration.java index 5b139cbd028..e7524da569b 100644 --- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/shared/Branding.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/shared/ClientConfiguration.java @@ -1,50 +1,50 @@ package com.sap.sse.gwt.shared; import com.google.gwt.core.client.GWT; -import com.sap.sse.gwt.client.context.data.SapSailingContextDataJSO; -import com.sap.sse.gwt.client.context.impl.SapSailingContextDataFactoryImpl; +import com.sap.sse.gwt.client.context.data.ClientConfigurationContextDataJSO; +import com.sap.sse.gwt.client.context.impl.ClientConfigurationContextDataFactoryImpl; /** - * Provides information for the GWT client if debranding/whitelabeling is currently active. + * Provides information for the GWT client if debranding/whitelabeling is currently brandingActive. * Data is read from the static HTML page which starts the GWT client code. * Within the header there is script section that contains such a structure: *
    - *      document.sailingContext = {
    + *      document.clientConfigurationContext = {
      *          debrandingActive: true};
      * 
    * The data in this structure is integrated into the document object tree within the browser. - * That can be accessed from here using the {@link SapSailingContextDataJSO}. + * That can be accessed from here using the {@link ClientConfigurationContextDataJSO}. * * The structure in the HTML is generated by the server see ClientConfigurationServlet for that. * * To add new fields the following steps must be performed: *
      - *
    • template within the HTML page must be extend by a new field declaration inside {@code document.sailingContext}.
    • + *
    • template within the HTML page must be extend by a new field declaration inside {@code document.clientConfigurationContext}.
    • *
    • corresponding variable must be declared and filled with the appropriate value in {@link ClientConfigurationServlet}
    • - *
    • class {@link SapSailingContextDataJSO} must be extended with an getter for the new field
    • + *
    • class {@link ClientConfigurationContextDataJSO} must be extended with an getter for the new field
    • *
    * * @author Georg Herdt * */ -public class Branding { +public class ClientConfiguration { - private static final Branding INSTANCE; + private static final ClientConfiguration INSTANCE; static { - INSTANCE = new Branding(); + INSTANCE = new ClientConfiguration(); } - public static Branding getInstance() { + public static ClientConfiguration getInstance() { return INSTANCE; } - private boolean active = true; + private boolean brandingActive = true; - public Branding() { + public ClientConfiguration() { try { - SapSailingContextDataJSO dataJso = new SapSailingContextDataFactoryImpl().getInstance(); - active = !dataJso.isDebrandingActive(); + ClientConfigurationContextDataJSO dataJso = new ClientConfigurationContextDataFactoryImpl().getInstance(); + brandingActive = !dataJso.isDebrandingActive(); } catch (RuntimeException e) { GWT.log("no debranding information found."); } @@ -54,7 +54,7 @@ public class Branding { * Access whitelabeling information. * @return true when branding information shall be shown */ - public boolean isActive() { - return active; + public boolean isBrandingActive() { + return brandingActive; } } diff --git a/java/com.sap.sse.security.ui/EditProfile.html b/java/com.sap.sse.security.ui/EditProfile.html index 01873080d30..e53ad32506a 100755 --- a/java/com.sap.sse.security.ui/EditProfile.html +++ b/java/com.sap.sse.security.ui/EditProfile.html @@ -23,7 +23,7 @@ diff --git a/java/com.sap.sse.security.ui/EmailValidation.html b/java/com.sap.sse.security.ui/EmailValidation.html index c13aa5c9b1d..91426cbc381 100755 --- a/java/com.sap.sse.security.ui/EmailValidation.html +++ b/java/com.sap.sse.security.ui/EmailValidation.html @@ -23,7 +23,7 @@ diff --git a/java/com.sap.sse.security.ui/Login.html b/java/com.sap.sse.security.ui/Login.html index 401296d90ff..809102e5cf6 100644 --- a/java/com.sap.sse.security.ui/Login.html +++ b/java/com.sap.sse.security.ui/Login.html @@ -24,7 +24,7 @@ diff --git a/java/com.sap.sse.security.ui/Register.html b/java/com.sap.sse.security.ui/Register.html index cec32e12b4f..206d08877a2 100644 --- a/java/com.sap.sse.security.ui/Register.html +++ b/java/com.sap.sse.security.ui/Register.html @@ -24,7 +24,7 @@ diff --git a/java/com.sap.sse.security.ui/UserManagement.html b/java/com.sap.sse.security.ui/UserManagement.html index f918b4f8ed4..f8acaf74535 100644 --- a/java/com.sap.sse.security.ui/UserManagement.html +++ b/java/com.sap.sse.security.ui/UserManagement.html @@ -23,7 +23,7 @@ diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/login/LoginHintContent.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/login/LoginHintContent.java index 9522be93dbd..214350691f5 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/login/LoginHintContent.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/login/LoginHintContent.java @@ -13,7 +13,7 @@ import com.google.gwt.user.client.EventListener; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Widget; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; /** * Widget that shows a message to inform the user that it has benefits to log in. There are two links the user can @@ -71,7 +71,7 @@ public class LoginHintContent extends Composite { } }); - if (!Branding.getInstance().isActive()) { + if (!ClientConfiguration.getInstance().isBrandingActive()) { moreInfo.getElement().getStyle().setDisplay(Display.NONE); } diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/login/LoginView.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/login/LoginView.java index c9430d32eac..c496cc70b9e 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/login/LoginView.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/login/LoginView.java @@ -24,7 +24,7 @@ import com.sap.sse.gwt.client.Notification.NotificationType; import com.sap.sse.gwt.client.controls.PasswordTextBoxWithWatermark; import com.sap.sse.gwt.client.controls.TextBoxWithWatermark; import com.sap.sse.gwt.client.dialog.DialogUtils; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; import com.sap.sse.security.ui.client.EntryPointLinkFactory; import com.sap.sse.security.ui.client.UserManagementServiceAsync; import com.sap.sse.security.ui.client.UserService; @@ -74,7 +74,7 @@ public class LoginView extends Composite { } }); - if (!Branding.getInstance().isActive()) { + if (!ClientConfiguration.getInstance().isBrandingActive()) { logoImage.getStyle().setDisplay(Display.NONE); } } diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/registration/RegisterView.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/registration/RegisterView.java index 7c36cb11842..6611e36cc20 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/registration/RegisterView.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/registration/RegisterView.java @@ -22,7 +22,7 @@ import com.sap.sse.gwt.client.Notification.NotificationType; import com.sap.sse.gwt.client.controls.PasswordTextBoxWithWatermark; import com.sap.sse.gwt.client.controls.TextBoxWithWatermark; import com.sap.sse.gwt.client.dialog.DialogUtils; -import com.sap.sse.gwt.shared.Branding; +import com.sap.sse.gwt.shared.ClientConfiguration; import com.sap.sse.security.shared.UserManagementException; import com.sap.sse.security.shared.dto.UserDTO; import com.sap.sse.security.ui.client.EntryPointLinkFactory; @@ -78,7 +78,7 @@ public class RegisterView extends Composite { password2TextBox.addKeyUpHandler(keyUpHandler); DialogUtils.linkEnterToButton(signUpButton, usernameTextBox, emailTextBox, passwordTextBox, password2TextBox); - if (!Branding.getInstance().isActive()) { + if (!ClientConfiguration.getInstance().isBrandingActive()) { logoImage.getStyle().setDisplay(Display.NONE); } } From 9a11e12b417820fa14c5105d9389904899cf249f Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Thu, 9 Apr 2020 11:58:24 +0200 Subject: [PATCH 084/188] updating wiki content #5153 --- wiki/howto/whitelabelling.md | 2 +- wiki/info/landscape/amazon-ec2.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/wiki/howto/whitelabelling.md b/wiki/howto/whitelabelling.md index 6aeab523cea..64a01e6e08b 100644 --- a/wiki/howto/whitelabelling.md +++ b/wiki/howto/whitelabelling.md @@ -3,7 +3,7 @@ Changes regarding whitellabelling are collected here: Runtime configuration of debranding: -1. The activation of the debranding could be done by providing a system property during startup of the server side application, e.g. -Dcom.sap.sailing.debranding=true +1. The activation of the debranding could be done by providing a system property during startup of the server side application, e.g. -Dcom.sap.sse.debranding=true 2. The debranding switch is delivered to the clients within the startup pages. Therefore we can put placeholders inside the existing static pages and deliver them through servlets to the client. The servlets will process the placeholders in the pages. The debranding switch will show up in the page. The GWT client can read this information during startup in the browser. The URLs for loading the pages are unchanged. \ No newline at end of file diff --git a/wiki/info/landscape/amazon-ec2.md b/wiki/info/landscape/amazon-ec2.md index e261043dd24..7a754cc8c4e 100644 --- a/wiki/info/landscape/amazon-ec2.md +++ b/wiki/info/landscape/amazon-ec2.md @@ -134,7 +134,7 @@ To set up a multi instance for a server with name "SSV", subdomain "ssv.sapsaili 8. White label switch, uncomment this line in env.sh
    -   #ADDITIONAL_JAVA_ARGS="$ADDITIONAL_JAVA_ARGS -Dcom.sap.sailing.debranding=true"
    +   #ADDITIONAL_JAVA_ARGS="$ADDITIONAL_JAVA_ARGS -Dcom.sap.sse.debranding=true"
        
    to enable white labeling. From c5a1cd6a62641c3ad71e3fa6e184f93063ff32a0 Mon Sep 17 00:00:00 2001 From: dmitry Date: Thu, 9 Apr 2020 14:15:33 +0300 Subject: [PATCH 085/188] bug5178: Added remove button to course create related panels and Moved behavior for selection event to access button panel --- .../coursecreation/CourseTemplatePanel.java | 37 ++++++++++++++++++ .../coursecreation/MarkPropertiesPanel.java | 37 ++++++++++++++++++ .../coursecreation/MarkRolePanel.java | 39 +++++++++++++++++++ .../coursecreation/MarkTemplatePanel.java | 38 ++++++++++++++++++ .../sailing/gwt/ui/client/SailingService.java | 24 ++++++++++++ .../gwt/ui/client/SailingServiceAsync.java | 9 +++++ .../sailing/gwt/ui/client/StringMessages.java | 8 ++++ .../gwt/ui/client/StringMessages.properties | 8 ++++ .../gwt/ui/server/SailingServiceImpl.java | 29 ++++++++++++++ .../shared/server/SharedSailingData.java | 14 ++++++- .../impl/ReplicatingSharedSailingData.java | 4 ++ .../server/impl/SharedSailingDataImpl.java | 38 +++++++++++++++++- .../operations/DeleteMarkRoleOperation.java | 20 ++++++++++ .../DeleteMarkTemplateOperation.java | 20 ++++++++++ .../AccessControlledButtonPanel.java | 16 +++++++- .../usermanagement/UserManagementPanel.java | 5 +-- 16 files changed, 338 insertions(+), 8 deletions(-) create mode 100644 java/com.sap.sailing.shared.server/src/com/sap/sailing/shared/server/operations/DeleteMarkRoleOperation.java create mode 100644 java/com.sap.sailing.shared.server/src/com/sap/sailing/shared/server/operations/DeleteMarkTemplateOperation.java diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java index 62f121379c9..893abc685eb 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java @@ -9,8 +9,10 @@ import static com.sap.sse.security.ui.client.component.DefaultActionsImagesBarCe import static com.sap.sse.security.ui.client.component.DefaultActionsImagesBarCell.ACTION_UPDATE; import java.util.ArrayList; +import java.util.Collection; import java.util.Comparator; import java.util.List; +import java.util.stream.Collectors; import com.google.gwt.cell.client.TextCell; import com.google.gwt.core.client.GWT; @@ -25,6 +27,7 @@ import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.view.client.CellPreviewEvent; @@ -92,6 +95,39 @@ public class CourseTemplatePanel extends FlowPanel { } }); + final Button removeButton = buttonAndFilterPanel.addRemoveAction(stringMessages.remove(), new Command() { + + @Override public void execute() { + if (askUserForConfirmation()) { + removeCourseTemplates(refreshableSelectionModel.getSelectedSet()); + } + } + + private void removeCourseTemplates(Collection courseTemplateDTOS) { + if (!courseTemplateDTOS.isEmpty()) { + sailingService.removeCourseTemplates(courseTemplateDTOS, new AsyncCallback() { + @Override public void onFailure(Throwable caught) { + errorReporter.reportError("Error trying to remove course teamplates:" + caught.getMessage()); + } + + @Override public void onSuccess(Void result) { + refreshCourseTemplates(); + } + }); + } + } + + private boolean askUserForConfirmation() { + if (refreshableSelectionModel.itemIsSelectedButNotVisible(courseTemplateTable.getVisibleItems())) { + final String markRolesNames = refreshableSelectionModel.getSelectedSet().stream() + .map(CourseTemplateDTO::getName).collect(Collectors.joining("\n")); + return Window.confirm(stringMessages.doYouReallyWantToRemoveNonVisibleCourseTemplates(markRolesNames)); + } + return Window.confirm(stringMessages.doYouReallyWantToRemoveCourseTemplates()); + } + }); + + removeButton.setEnabled(false); Label lblFilterRaces = new Label(stringMessages.filterCourseTemplateByName() + ":"); lblFilterRaces.setWordWrap(false); buttonAndFilterPanel.addUnsecuredWidget(lblFilterRaces); @@ -112,6 +148,7 @@ public class CourseTemplatePanel extends FlowPanel { } }; createCourseTemplateTable(userService); + buttonAndFilterPanel.addRemoveButtonStateUpdater(refreshableSelectionModel, stringMessages.remove()); filterableCourseTemplatePanel.getTextBox().ensureDebugId("CourseTemplateFilterTextBox"); buttonAndFilterPanel.addUnsecuredWidget(filterableCourseTemplatePanel); filterableCourseTemplatePanel diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java index 4d750b652c8..fb82b6a670c 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java @@ -10,8 +10,10 @@ import static com.sap.sse.security.ui.client.component.DefaultActionsImagesBarCe import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Comparator; import java.util.List; +import java.util.stream.Collectors; import com.google.gwt.cell.client.AbstractCell; import com.google.gwt.cell.client.TextCell; @@ -29,6 +31,7 @@ import com.google.gwt.user.client.Command; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.AbstractImagePrototype; +import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.view.client.CellPreviewEvent; @@ -99,6 +102,39 @@ public class MarkPropertiesPanel extends FlowPanel { openEditMarkPropertiesDialog(new MarkPropertiesDTO()); } }); + final Button removeButton = buttonAndFilterPanel.addRemoveAction(stringMessages.remove(), new Command() { + + @Override public void execute() { + if (askUserForConfirmation()) { + removeMarkProperties(refreshableSelectionModel.getSelectedSet()); + } + } + + private void removeMarkProperties(Collection markPropertiesDTOS) { + if (!markPropertiesDTOS.isEmpty()) { + sailingService.removeMarkProperties(markPropertiesDTOS, new AsyncCallback() { + @Override public void onFailure(Throwable caught) { + errorReporter.reportError("Error trying to remove mark properties:" + caught.getMessage()); + } + + @Override public void onSuccess(Void result) { + refreshMarkProperties(); + } + }); + } + } + + private boolean askUserForConfirmation() { + if (refreshableSelectionModel.itemIsSelectedButNotVisible(markPropertiesTable.getVisibleItems())) { + final String markPropertiesNames = refreshableSelectionModel.getSelectedSet().stream() + .map(MarkPropertiesDTO::getName).collect(Collectors.joining("\n")); + return Window.confirm(stringMessages.doYouReallyWantToRemoveNonVisibleMarkProperties(markPropertiesNames)); + } + return Window.confirm(stringMessages.doYouReallyWantToRemoveSeveralMarkProperties()); + } + }); + removeButton.setEnabled(false); + Label lblFilterRaces = new Label(stringMessages.filterMarkPropertiesByName() + ":"); lblFilterRaces.setWordWrap(false); buttonAndFilterPanel.addUnsecuredWidget(lblFilterRaces); @@ -120,6 +156,7 @@ public class MarkPropertiesPanel extends FlowPanel { } }; createMarkPropertiesTable(userService); + buttonAndFilterPanel.addRemoveButtonStateUpdater(refreshableSelectionModel, stringMessages.remove()); filterableMarkProperties.getTextBox().ensureDebugId("MarkPropertiesFilterTextBox"); buttonAndFilterPanel.addUnsecuredWidget(filterableMarkProperties); filterableMarkProperties diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkRolePanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkRolePanel.java index 5abb9d4d477..f256df6600b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkRolePanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkRolePanel.java @@ -5,8 +5,10 @@ import static com.sap.sse.security.ui.client.component.AccessControlledActionsCo import static com.sap.sse.security.ui.client.component.DefaultActionsImagesBarCell.ACTION_CHANGE_OWNERSHIP; import java.util.ArrayList; +import java.util.Collection; import java.util.Comparator; import java.util.List; +import java.util.stream.Collectors; import com.google.gwt.cell.client.TextCell; import com.google.gwt.core.client.GWT; @@ -19,7 +21,9 @@ import com.google.gwt.user.cellview.client.CellTable; import com.google.gwt.user.cellview.client.Column; import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler; import com.google.gwt.user.client.Command; +import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.view.client.CellPreviewEvent; @@ -82,6 +86,39 @@ public class MarkRolePanel extends FlowPanel { openEditMarkRoleDialog(new MarkRoleDTO()); } }); + final Button removeButton = buttonAndFilterPanel.addRemoveAction(stringMessages.remove(), new Command() { + + @Override public void execute() { + if (askUserForConfirmation()) { + removeMarkRoles(refreshableSelectionModel.getSelectedSet()); + } + } + + private void removeMarkRoles(Collection markRoleDTOS) { + if (!markRoleDTOS.isEmpty()) { + sailingService.removeMarkRoles(markRoleDTOS, new AsyncCallback() { + @Override public void onFailure(Throwable caught) { + errorReporter.reportError("Error trying to remove mark roles:" + caught.getMessage()); + } + + @Override public void onSuccess(Void result) { + refreshMarkRoles(); + } + }); + } + } + + private boolean askUserForConfirmation() { + if (refreshableSelectionModel.itemIsSelectedButNotVisible(markRolesTable.getVisibleItems())) { + final String markRolesNames = refreshableSelectionModel.getSelectedSet().stream() + .map(MarkRoleDTO::getName).collect(Collectors.joining("\n")); + return Window.confirm(stringMessages.doYouReallyWantToRemoveNonVisibleMarkRoles(markRolesNames)); + } + return Window.confirm(stringMessages.doYouReallyWantToRemoveMarkRoles()); + } + }); + + removeButton.setEnabled(false); Label lblFilter = new Label(stringMessages.filterMarkRoles() + ":"); lblFilter.setWordWrap(false); buttonAndFilterPanel.addUnsecuredWidget(lblFilter); @@ -101,6 +138,7 @@ public class MarkRolePanel extends FlowPanel { } }; createMarkRoleTable(userService); + buttonAndFilterPanel.addRemoveButtonStateUpdater(refreshableSelectionModel, stringMessages.remove()); filterableMarkRoles.getTextBox().ensureDebugId("MarkRolesFilterTextBox"); buttonAndFilterPanel.addUnsecuredWidget(filterableMarkRoles); filterableMarkRoles @@ -250,6 +288,7 @@ public class MarkRolePanel extends FlowPanel { markRolesTable.addColumn(actionsColumn, stringMessages.actions()); } + private void openEditMarkRoleDialog(final MarkRoleDTO originalMarkRole) { final MarkRoleEditDialog dialog = new MarkRoleEditDialog(stringMessages, originalMarkRole, new DialogCallback() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkTemplatePanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkTemplatePanel.java index 4fcac55cb6f..004b7a43b45 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkTemplatePanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkTemplatePanel.java @@ -5,8 +5,10 @@ import static com.sap.sse.security.ui.client.component.AccessControlledActionsCo import static com.sap.sse.security.ui.client.component.DefaultActionsImagesBarCell.ACTION_CHANGE_OWNERSHIP; import java.util.ArrayList; +import java.util.Collection; import java.util.Comparator; import java.util.List; +import java.util.stream.Collectors; import com.google.gwt.cell.client.TextCell; import com.google.gwt.core.client.GWT; @@ -19,7 +21,9 @@ import com.google.gwt.user.cellview.client.CellTable; import com.google.gwt.user.cellview.client.Column; import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler; import com.google.gwt.user.client.Command; +import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.view.client.CellPreviewEvent; @@ -85,6 +89,39 @@ public class MarkTemplatePanel extends FlowPanel { } }); + final Button removeButton = buttonAndFilterPanel.addRemoveAction(stringMessages.remove(), new Command() { + + @Override public void execute() { + if (askUserForConfirmation()) { + removeMarkTemplates(refreshableSelectionModel.getSelectedSet()); + } + } + + private void removeMarkTemplates(Collection markTemplateDTOS) { + if (!markTemplateDTOS.isEmpty()) { + sailingService.removeMarkTemplates(markTemplateDTOS, new AsyncCallback() { + @Override public void onFailure(Throwable caught) { + errorReporter.reportError("Error trying to remove mark templates:" + caught.getMessage()); + } + + @Override public void onSuccess(Void result) { + refreshMarkTemplates(); + } + }); + } + } + + private boolean askUserForConfirmation() { + if (refreshableSelectionModel.itemIsSelectedButNotVisible(markTemplateTable.getVisibleItems())) { + final String markTemplatesNames = refreshableSelectionModel.getSelectedSet().stream() + .map(MarkTemplateDTO::getName).collect(Collectors.joining("\n")); + return Window.confirm(stringMessages.doYouReallyWantToRemoveNonVisibleMarkTemplates(markTemplatesNames)); + } + return Window.confirm(stringMessages.doYouReallyWantToRemoveMarkTemplates()); + } + }); + removeButton.setEnabled(false); + Label lblFilterRaces = new Label(stringMessages.filterMarkTemplateByName() + ":"); lblFilterRaces.setWordWrap(false); buttonAndFilterPanel.addUnsecuredWidget(lblFilterRaces); @@ -106,6 +143,7 @@ public class MarkTemplatePanel extends FlowPanel { } }; createMarkTemplatesTable(userService); + buttonAndFilterPanel.addRemoveButtonStateUpdater(refreshableSelectionModel, stringMessages.remove()); filterableMarkTemplates.getTextBox().ensureDebugId("MarkTemplatesFilterTextBox"); buttonAndFilterPanel.addUnsecuredWidget(filterableMarkTemplates); filterableMarkTemplates diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java index 487859d979a..1f9d2223b0a 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java @@ -1296,4 +1296,28 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS List getMarkRoles(); MarkRoleDTO createMarkRole(MarkRoleDTO markRole); + + /** + * Removes mark roles list + * @param markRoleDTOs list of mark roles to remove + */ + void removeMarkRoles(Collection markRoleDTOs); + + /** + * Removes course templates list + * @param courseTemplateDTOs list of course templates to remove + */ + void removeCourseTemplates(Collection courseTemplateDTOs); + + /** + * Removes mark templates list + * @param markTemplateDTOS list of mark templates to remove + */ + void removeMarkTemplates(Collection markTemplateDTOS); + + /** + * Removes mark properties list + * @param markPropertiesDTOS list of mark properties to remove + */ + void removeMarkProperties(Collection markPropertiesDTOS); } \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java index 49235aab31b..454e4dd21c3 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java @@ -1243,4 +1243,13 @@ public interface SailingServiceAsync extends FileStorageManagementGwtServiceAsyn void getMarkRoles(AsyncCallback> callback); void createMarkRole(MarkRoleDTO markRole, AsyncCallback asyncCallback); + + void removeMarkRoles(Collection markRoleDTOs, AsyncCallback asyncCallback); + + void removeCourseTemplates(Collection courseTemplatesDTOs, AsyncCallback asyncCallback); + + void removeMarkProperties(Collection markPropertiesDTOs, AsyncCallback asyncCallback); + + void removeMarkTemplates(Collection markTemplateDTOs, AsyncCallback asyncCallback); + } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java index be320481442..eea6fb2739f 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java @@ -2335,6 +2335,8 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, String courseCreation(); String filterMarkTemplateByName(); String markTemplates(); + String doYouReallyWantToRemoveMarkTemplates(); + String doYouReallyWantToRemoveNonVisibleMarkTemplates(String message); String filterMarkPropertiesByName(); String markProperties(); String filterCourseTemplateByName(); @@ -2345,8 +2347,14 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, String pleaseSelectAValidPassingInstruction(); String pleaseSelectAValidMarkTemplate(); String doYouReallyWantToRemoveCourseTemplate(String name); + String doYouReallyWantToRemoveCourseTemplates(); + String doYouReallyWantToRemoveNonVisibleCourseTemplates(String message); String couldNotRemoveCourseTemplate(String message); + String doYouReallyWantToRemoveMarkRoles(); + String doYouReallyWantToRemoveNonVisibleMarkRoles(String message); String doYouReallyWantToRemoveMarkProperties(String name); + String doYouReallyWantToRemoveSeveralMarkProperties(); + String doYouReallyWantToRemoveNonVisibleMarkProperties(String message); String couldNotRemoveMarkProperties(String message); String markRoles(); String filterMarkRoles(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties index 4c550c358b4..90d45d69ed1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties @@ -2343,13 +2343,21 @@ markProperties=Mark Properties filterCourseTemplateByName=Filter course templates courseTemplates=Course Templates markTemplate=Mark Template +doYouReallyWantToRemoveMarkTemplates=Do you really want to remove the mark templates? +doYouReallyWantToRemoveNonVisibleMarkTemplates=You are also deleting mark templates that are currently not visible while filtering. The following mark templates will be removed. Do you want to continue?\n\n{0} markRole1=Mark Role 1 markRole2=Mark Role 2 pleaseSelectAValidMarkTemplate=Please select a valid mark template pleaseSelectAValidPassingInstruction=Please select a valid passing instruction doYouReallyWantToRemoveCourseTemplate=Do you really want to remove course template "{0}"? All associated courses will be unlinked. +doYouReallyWantToRemoveCourseTemplates=Do you really want to remove the course templates? +doYouReallyWantToRemoveNonVisibleCourseTemplates=You are also deleting course templates that are currently not visible while filtering. The following course templates will be removed. Do you want to continue?\n\n{0} couldNotRemoveCourseTemplate=Could not remove course template "{0}". +doYouReallyWantToRemoveMarkRoles=Do you really want to remove the mark roles? +doYouReallyWantToRemoveNonVisibleMarkRoles=You are also deleting mark roles that are currently not visible while filtering. The following mark roles will be removed. Do you want to continue?\n\n{0} doYouReallyWantToRemoveMarkProperties=Do you really want to remove mark properties "{0}"? +doYouReallyWantToRemoveSeveralMarkProperties=Do you really want to remove the mark properties? +doYouReallyWantToRemoveNonVisibleMarkProperties=You are also deleting mark properties that are currently not visible while filtering. The following mark properties will be removed. Do you want to continue?\n\n{0} couldNotRemoveMarkProperties=Could not remove mark properties "{0}". markRoles=Mark Roles filterMarkRoles=Filter mark roles diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index 12c1981a319..8332bcb95bb 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -10096,4 +10096,33 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet } return result; } + + @Override + public void removeMarkRoles(Collection markRoleDTOs) { + for (MarkRoleDTO markRoleDTO : markRoleDTOs) { + getSharedSailingData().deleteMarkRole(getSharedSailingData().getMarkRoleById(markRoleDTO.getUuid())); + } + } + + @Override + public void removeCourseTemplates(Collection courseTemplateDTOs) { + for (CourseTemplateDTO courseTemplateDTO : courseTemplateDTOs) { + getSharedSailingData().deleteCourseTemplate(getSharedSailingData().getCourseTemplateById(courseTemplateDTO.getUuid())); + } + } + + + @Override + public void removeMarkProperties(Collection markPropertiesDTOS) { + for (MarkPropertiesDTO markPropertiesDTO : markPropertiesDTOS) { + getSharedSailingData().deleteMarkProperties(getSharedSailingData().getMarkPropertiesById(markPropertiesDTO.getUuid())); + } + } + + @Override + public void removeMarkTemplates(Collection markTemplatesDTOs) { + for (MarkTemplateDTO markTemplateDTO : markTemplatesDTOs) { + getSharedSailingData().deleteMarkTemplate(getSharedSailingData().getMarkTemplateById(markTemplateDTO.getUuid())); + } + } } \ No newline at end of file diff --git a/java/com.sap.sailing.shared.server/src/com/sap/sailing/shared/server/SharedSailingData.java b/java/com.sap.sailing.shared.server/src/com/sap/sailing/shared/server/SharedSailingData.java index 586c2ecfa6e..da1238cd656 100644 --- a/java/com.sap.sailing.shared.server/src/com/sap/sailing/shared/server/SharedSailingData.java +++ b/java/com.sap.sailing.shared.server/src/com/sap/sailing/shared/server/SharedSailingData.java @@ -145,7 +145,19 @@ public interface SharedSailingData extends ReplicableWithObjectInputStream getUsedMarkProperties(MarkRole roleName); void deleteMarkProperties(MarkProperties markProperties); - + + /** + * deletes the mark role + * @param markRole mark role object which is being deleted + */ + void deleteMarkRole(MarkRole markRole); + + /** + * deletes the mark template + * @param markTemplate mark template object which is being deleted + */ + void deleteMarkTemplate(MarkTemplate markTemplate); + void deleteCourseTemplate(CourseTemplate courseTemplate); Iterable getAllMarkProperties(); diff --git a/java/com.sap.sailing.shared.server/src/com/sap/sailing/shared/server/impl/ReplicatingSharedSailingData.java b/java/com.sap.sailing.shared.server/src/com/sap/sailing/shared/server/impl/ReplicatingSharedSailingData.java index d98e3179d67..aa3fe05e6ac 100644 --- a/java/com.sap.sailing.shared.server/src/com/sap/sailing/shared/server/impl/ReplicatingSharedSailingData.java +++ b/java/com.sap.sailing.shared.server/src/com/sap/sailing/shared/server/impl/ReplicatingSharedSailingData.java @@ -33,6 +33,10 @@ public interface ReplicatingSharedSailingData extends SharedSailingData { Void internalDeleteMarkProperties(UUID markPropertiesUUID); + Void internalDeleteMarkTemplate(UUID markPropertiesUUID); + + Void internalDeleteMarkRole(UUID markRoleUUID); + Void internalDeleteCourseTemplate(UUID courseTemplateUUID); Void internalRecordUsage(UUID markTemplateId, UUID markPropertiesId); diff --git a/java/com.sap.sailing.shared.server/src/com/sap/sailing/shared/server/impl/SharedSailingDataImpl.java b/java/com.sap.sailing.shared.server/src/com/sap/sailing/shared/server/impl/SharedSailingDataImpl.java index 94a075bec13..d0ff4015be0 100755 --- a/java/com.sap.sailing.shared.server/src/com/sap/sailing/shared/server/impl/SharedSailingDataImpl.java +++ b/java/com.sap.sailing.shared.server/src/com/sap/sailing/shared/server/impl/SharedSailingDataImpl.java @@ -46,6 +46,8 @@ import com.sap.sailing.shared.server.operations.CreateMarkRoleOperation; import com.sap.sailing.shared.server.operations.CreateMarkTemplateOperation; import com.sap.sailing.shared.server.operations.DeleteCourseTemplateOperation; import com.sap.sailing.shared.server.operations.DeleteMarkPropertiesOperation; +import com.sap.sailing.shared.server.operations.DeleteMarkRoleOperation; +import com.sap.sailing.shared.server.operations.DeleteMarkTemplateOperation; import com.sap.sailing.shared.server.operations.RecordUsageForMarkRoleOperation; import com.sap.sailing.shared.server.operations.RecordUsageForMarkTemplateOperation; import com.sap.sailing.shared.server.operations.SetPositioningInformationForMarkPropertiesOperation; @@ -200,7 +202,7 @@ public class SharedSailingDataImpl implements ReplicatingSharedSailingData, Clea }); return getMarkRoleById(idOfNewMarkRole); } - + @Override public Void internalCreateMarkRole(UUID idOfNewMarkRole, String name, String shortName) { final MarkRole markRole = new MarkRoleImpl(idOfNewMarkRole, name, shortName); @@ -549,6 +551,40 @@ public class SharedSailingDataImpl implements ReplicatingSharedSailingData, Clea return null; } + @Override + public void deleteMarkTemplate(MarkTemplate markTemplate) { + final UUID id = markTemplate.getId(); + getSecurityService().checkPermissionAndDeleteOwnershipForObjectRemoval(markTemplate, + () -> apply(new DeleteMarkTemplateOperation(id))); + } + + @Override + public Void internalDeleteMarkTemplate(UUID markTemplateUUID) { + if (this.markTemplatesById.remove(markTemplateUUID) != null) { + mongoObjectFactory.removeMarkTemplate(markTemplateUUID); + } else { + throw new NullPointerException(String.format("Did not find a mark template with ID %s", markTemplateUUID)); + } + return null; + } + + @Override + public void deleteMarkRole(final MarkRole markRole) { + final UUID id = markRole.getId(); + getSecurityService().checkPermissionAndDeleteOwnershipForObjectRemoval(markRole, + () -> apply(new DeleteMarkRoleOperation(id))); + } + + @Override + public Void internalDeleteMarkRole(UUID markRoleUUID) { + if (this.markRolesById.remove(markRoleUUID) != null) { + mongoObjectFactory.removeMarkRole(markRoleUUID); + } else { + throw new NullPointerException(String.format("Did not find a mark role with ID %s", markRoleUUID)); + } + return null; + } + @Override public void deleteCourseTemplate(CourseTemplate courseTemplate) { final UUID id = courseTemplate.getId(); diff --git a/java/com.sap.sailing.shared.server/src/com/sap/sailing/shared/server/operations/DeleteMarkRoleOperation.java b/java/com.sap.sailing.shared.server/src/com/sap/sailing/shared/server/operations/DeleteMarkRoleOperation.java new file mode 100644 index 00000000000..8e3a5922a10 --- /dev/null +++ b/java/com.sap.sailing.shared.server/src/com/sap/sailing/shared/server/operations/DeleteMarkRoleOperation.java @@ -0,0 +1,20 @@ +package com.sap.sailing.shared.server.operations; + +import com.sap.sailing.shared.server.impl.ReplicatingSharedSailingData; + +import java.util.UUID; + +public class DeleteMarkRoleOperation implements SharedSailingDataOperation { + private static final long serialVersionUID = 6069375751925606420L; + private final UUID markRoleUUID; + + public DeleteMarkRoleOperation(UUID markRoleUUID) { + this.markRoleUUID = markRoleUUID; + } + + @Override + public Void internalApplyTo(ReplicatingSharedSailingData toState) throws Exception { + toState.internalDeleteMarkRole(markRoleUUID); + return null; + } +} diff --git a/java/com.sap.sailing.shared.server/src/com/sap/sailing/shared/server/operations/DeleteMarkTemplateOperation.java b/java/com.sap.sailing.shared.server/src/com/sap/sailing/shared/server/operations/DeleteMarkTemplateOperation.java new file mode 100644 index 00000000000..a2d20531aef --- /dev/null +++ b/java/com.sap.sailing.shared.server/src/com/sap/sailing/shared/server/operations/DeleteMarkTemplateOperation.java @@ -0,0 +1,20 @@ +package com.sap.sailing.shared.server.operations; + +import com.sap.sailing.shared.server.impl.ReplicatingSharedSailingData; + +import java.util.UUID; + +public class DeleteMarkTemplateOperation implements SharedSailingDataOperation { + private static final long serialVersionUID = 4157045245768162929L; + private final UUID markTemplateUUID; + + public DeleteMarkTemplateOperation(UUID markTemplateUUID) { + this.markTemplateUUID = markTemplateUUID; + } + + @Override + public Void internalApplyTo(ReplicatingSharedSailingData toState) throws Exception { + toState.internalDeleteMarkTemplate(markTemplateUUID); + return null; + } +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java index c1de5c3a169..2ce9b304f9d 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java @@ -2,6 +2,7 @@ package com.sap.sse.security.ui.client.component; import java.util.HashMap; import java.util.Map; +import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Supplier; @@ -13,6 +14,7 @@ import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Widget; +import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel; import com.sap.sse.security.shared.HasPermissions; import com.sap.sse.security.ui.client.UserService; @@ -30,6 +32,7 @@ public class AccessControlledButtonPanel extends Composite { private final Supplier createPermissionCheck, createPermissionCheckWithoutServerCreateObjectCheck, removePermissionCheck, updatePermissionCheck; private final BiConsumer> visibilityUpdater = (btn, check) -> btn.setVisible(check.get()); + private Button removeButton; /** * Creates an {@link AccessControlledButtonPanel} instance for the given {@link HasPermissions type} using the @@ -112,9 +115,18 @@ public class AccessControlledButtonPanel extends Composite { * @return the created {@link Button} instance */ public Button addRemoveAction(final String text, final Command callback) { - return addAction(text, removePermissionCheck, callback); + removeButton = addAction(text, removePermissionCheck, callback); + return removeButton; } - + + public void addRemoveButtonStateUpdater(RefreshableMultiSelectionModel selectionModel, String text) { + selectionModel.addSelectionChangeHandler((event) -> { + Set selectedSet = selectionModel.getSelectedSet(); + removeButton.setEnabled(!selectedSet.isEmpty()); + removeButton.setText(selectedSet.size() <= 1 ? text : text + '(' + selectedSet.size() + ')'); + }); + } + /** * Adds a secured action button, which is only visible if the current user has any * {@link UserService#hasCurrentUserPermissionToUpdateAnyObjectOfType(HasPermissions) update permission} for the diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/usermanagement/UserManagementPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/usermanagement/UserManagementPanel.java index 622c2aba2fb..6f21c45f803 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/usermanagement/UserManagementPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/usermanagement/UserManagementPanel.java @@ -106,10 +106,7 @@ public class UserManagementPanel
    exte } }); deleteButton.setEnabled(userSelectionModel.getSelectedSet().size() >= 1); - userSelectionModel.addSelectionChangeHandler(event -> { - deleteButton.setText(stringMessages.remove() + " (" + userSelectionModel.getSelectedSet().size() + ")"); - deleteButton.setEnabled(userSelectionModel.getSelectedSet().size() >= 1); - }); + buttonPanel.addRemoveButtonStateUpdater(userSelectionModel, stringMessages.remove()); ScrollPanel scrollPanel = new ScrollPanel(userList.asWidget()); LabeledAbstractFilterablePanel filterBox = userList.getFilterField(); filterBox.getElement().setPropertyString("placeholder", stringMessages.filterUsers()); From cb0aba5c35769950f3862a9de59f05c4e37ce62e Mon Sep 17 00:00:00 2001 From: Alexandr Timoshenko Date: Thu, 9 Apr 2020 14:08:51 +0200 Subject: [PATCH 086/188] start implementation of revoke finishing state --- .../test/FinishingTimeFinderTest.java | 15 ++++++ .../race/RaceLogRaceStatusEvent.java | 3 +- .../analyzing/impl/FinishingTimeFinder.java | 22 ++++++-- .../GWT Sailing SDM.launch | 3 +- .../res/layout-hdpi/race_finishing.xml | 2 + .../res/layout/race_finishing.xml | 1 + .../race_revoke_finishing_button_normal.xml | 11 ++++ .../res/values/references.xml | 1 + .../res/values/strings.xml | 1 + .../racecommittee/app/domain/ManagedRace.java | 3 ++ .../app/domain/impl/ManagedRaceImpl.java | 54 ++++++++++++++----- .../raceinfo/RaceFinishingFragment.java | 12 ++++- 12 files changed, 109 insertions(+), 19 deletions(-) create mode 100644 mobile/com.sap.sailing.racecommittee.app/res/layout/race_revoke_finishing_button_normal.xml diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/FinishingTimeFinderTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/FinishingTimeFinderTest.java index b23ad5385ab..9db58e68923 100644 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/FinishingTimeFinderTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/FinishingTimeFinderTest.java @@ -12,6 +12,7 @@ import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogRaceStatusEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogRevokeEvent; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.FinishingTimeFinder; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sse.common.TimePoint; @@ -62,4 +63,18 @@ public class FinishingTimeFinderTest extends PassAwareRaceLogAnalyzerTest { super(raceLog); } + public RaceLogRaceStatusEvent findFinishingEvent() { + log.lockForRead(); + try { + for (RaceLogEvent event : getPassEventsDescending()) { + if (event instanceof RaceLogRaceStatusEvent) { + RaceLogRaceStatusEvent statusEvent = (RaceLogRaceStatusEvent) event; + if (statusEvent.getNextStatus().equals(RaceLogRaceStatus.FINISHING)) { + return statusEvent; + } + } + } + return null; + } finally { + log.unlockAfterRead(); + } + } + @Override protected TimePoint performAnalysis() { - for (RaceLogEvent event : getPassEventsDescending()) { + for (RaceLogEvent event : log.getUnrevokedEventsDescending()) { if (event instanceof RaceLogRaceStatusEvent) { RaceLogRaceStatusEvent statusEvent = (RaceLogRaceStatusEvent) event; if (statusEvent.getNextStatus().equals(RaceLogRaceStatus.FINISHING)) { @@ -22,8 +39,7 @@ public class FinishingTimeFinder extends RaceLogAnalyzer { } } } - + return null; } - } diff --git a/java/com.sap.sailing.gwt.ui/GWT Sailing SDM.launch b/java/com.sap.sailing.gwt.ui/GWT Sailing SDM.launch index 05821f7f895..37849240e83 100755 --- a/java/com.sap.sailing.gwt.ui/GWT Sailing SDM.launch +++ b/java/com.sap.sailing.gwt.ui/GWT Sailing SDM.launch @@ -34,7 +34,7 @@ - + @@ -116,6 +116,7 @@ + diff --git a/mobile/com.sap.sailing.racecommittee.app/res/layout-hdpi/race_finishing.xml b/mobile/com.sap.sailing.racecommittee.app/res/layout-hdpi/race_finishing.xml index d55990730e1..3e2a5c29e65 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/layout-hdpi/race_finishing.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/layout-hdpi/race_finishing.xml @@ -47,5 +47,7 @@ android:src="?attr/arrow_down_normal"/> + + \ No newline at end of file diff --git a/mobile/com.sap.sailing.racecommittee.app/res/layout/race_finishing.xml b/mobile/com.sap.sailing.racecommittee.app/res/layout/race_finishing.xml index 698009941e5..2ad707d0305 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/layout/race_finishing.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/layout/race_finishing.xml @@ -38,5 +38,6 @@ android:textSize="@dimen/finishing_text_size"/> + \ No newline at end of file diff --git a/mobile/com.sap.sailing.racecommittee.app/res/layout/race_revoke_finishing_button_normal.xml b/mobile/com.sap.sailing.racecommittee.app/res/layout/race_revoke_finishing_button_normal.xml new file mode 100644 index 00000000000..299992632c1 --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/res/layout/race_revoke_finishing_button_normal.xml @@ -0,0 +1,11 @@ + + extends DockPanel { - + private final List userCreatedHandlers = new ArrayList<>(); private final List userDeletedHandlers = new ArrayList<>(); - + private final UserTableWrapper, TR> userList; private final RefreshableMultiSelectionModel userSelectionModel; private final TextBox userNameTextbox; @@ -49,9 +49,9 @@ public class UserManagementPanel exte public UserManagementPanel(final UserService userService, final StringMessages stringMessages, ErrorReporter errorReporter, TR tableResources) { - this(userService, stringMessages, Collections.emptySet(), errorReporter, tableResources); + this(userService, stringMessages, Collections. emptySet(), errorReporter, tableResources); } - + public UserManagementPanel(final UserService userService, final StringMessages stringMessages, Iterable additionalPermissions, ErrorReporter errorReporter, TR tableResources) { final UserManagementServiceAsync userManagementService = userService.getUserManagementService(); @@ -73,40 +73,40 @@ public class UserManagementPanel exte e -> editRolesAndPermissionsForUserButton.setEnabled(!userNameTextbox.getText().isEmpty())); editRolesAndPermissionsForUserButton.setEnabled(false); userSelectionModel = userList.getSelectionModel(); - final Button deleteButton = buttonPanel.addRemoveAction(stringMessages.remove(), () -> { - assert userSelectionModel.getSelectedSet().size() > 0; - final Set usersToDelete = new HashSet<>(); - final Set usernamesToDelete = new HashSet<>(); - for (UserDTO userToDelete : userSelectionModel.getSelectedSet()) { - usersToDelete.add(userToDelete); - usernamesToDelete.add(userToDelete.getName()); - } - if (Window.confirm(usernamesToDelete.size() == 1 - ? stringMessages.doYouReallyWantToDeleteUser(usernamesToDelete.iterator().next()) - : stringMessages.doYouReallyWantToDeleteNUsers(usernamesToDelete.size()))) { - userManagementService.deleteUsers(usernamesToDelete, new AsyncCallback>() { - @Override - public void onSuccess(Set result) { - for (UserDTO userToDelete : usersToDelete) { - for (UserDeletedEventHandler userDeletedHandler : userDeletedHandlers) { - userDeletedHandler.onUserDeleted(userToDelete); + final Button deleteButton = buttonPanel.addRemoveAction(userList.getSelectionModel(), stringMessages.remove(), + () -> { + assert userSelectionModel.getSelectedSet().size() > 0; + final Set usersToDelete = new HashSet<>(); + final Set usernamesToDelete = new HashSet<>(); + for (UserDTO userToDelete : userSelectionModel.getSelectedSet()) { + usersToDelete.add(userToDelete); + usernamesToDelete.add(userToDelete.getName()); + } + if (Window.confirm(usernamesToDelete.size() == 1 + ? stringMessages.doYouReallyWantToDeleteUser(usernamesToDelete.iterator().next()) + : stringMessages.doYouReallyWantToDeleteNUsers(usernamesToDelete.size()))) { + userManagementService.deleteUsers(usernamesToDelete, new AsyncCallback>() { + @Override + public void onSuccess(Set result) { + for (UserDTO userToDelete : usersToDelete) { + for (UserDeletedEventHandler userDeletedHandler : userDeletedHandlers) { + userDeletedHandler.onUserDeleted(userToDelete); + } + } + for (SuccessInfo successInfo : result) { + Notification.notify(successInfo.getMessage(), NotificationType.SUCCESS); } } - for (SuccessInfo successInfo : result) { - Notification.notify(successInfo.getMessage(), NotificationType.SUCCESS); - } - } - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError(stringMessages.errorDeletingUser(usernamesToDelete.iterator().next(), - caught.getMessage())); - } - }); - } - }); + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError(stringMessages + .errorDeletingUser(usernamesToDelete.iterator().next(), caught.getMessage())); + } + }); + } + }); deleteButton.setEnabled(userSelectionModel.getSelectedSet().size() >= 1); - buttonPanel.addRemoveButtonStateUpdater(userSelectionModel, stringMessages.remove()); ScrollPanel scrollPanel = new ScrollPanel(userList.asWidget()); LabeledAbstractFilterablePanel filterBox = userList.getFilterField(); filterBox.getElement().setPropertyString("placeholder", stringMessages.filterUsers()); @@ -132,8 +132,7 @@ public class UserManagementPanel exte updateUsers(); final HorizontalPanel detailsPanel = new HorizontalPanel(); // add details panel for user roles - userRoleDefinitionPanel = new UserRoleDefinitionPanel(userService, stringMessages, - errorReporter, + userRoleDefinitionPanel = new UserRoleDefinitionPanel(userService, stringMessages, errorReporter, tableResources, userList.getSelectionModel(), () -> updateUsers(), SuggestBox::new, TextBox::new); detailsPanel.add(userRoleDefinitionPanel); // add details panel for user permissions @@ -162,8 +161,7 @@ public class UserManagementPanel exte updateUsers(); } }).show(); - } - else { + } else { Notification.notify(StringMessages.INSTANCE.userNotFound(userNameTextbox.getText()), NotificationType.ERROR); } @@ -184,26 +182,26 @@ public class UserManagementPanel exte userList.refreshUserList((Callback, Throwable>) null); } - public void addUserCreatedEventHandler(UserCreatedEventHandler handler){ + public void addUserCreatedEventHandler(UserCreatedEventHandler handler) { this.userCreatedHandlers.add(handler); } - - public void removeUserCreatedEventHandler(UserCreatedEventHandler handler){ + + public void removeUserCreatedEventHandler(UserCreatedEventHandler handler) { this.userCreatedHandlers.remove(handler); } - + public static interface UserCreatedEventHandler extends EventHandler { void onUserCreated(UserDTO user); } - public void addUserDeletedEventHandler(UserDeletedEventHandler handler){ + public void addUserDeletedEventHandler(UserDeletedEventHandler handler) { this.userDeletedHandlers.add(handler); } - - public void removeUserDeletedEventHandler(UserDeletedEventHandler handler){ + + public void removeUserDeletedEventHandler(UserDeletedEventHandler handler) { this.userDeletedHandlers.remove(handler); } - + public static interface UserDeletedEventHandler extends EventHandler { void onUserDeleted(UserDTO user); } From 94a6d94d7041fd3231c9bf0c34fd369cc6bc6248 Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Thu, 9 Apr 2020 15:14:01 +0200 Subject: [PATCH 089/188] add documentation, fix replacement issue when multiple files being processed (pumping variable), cleanup tabs #5255 --- .../scripts/analyzeProduct.sh | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/java/com.sap.sailing.feature.p2build/scripts/analyzeProduct.sh b/java/com.sap.sailing.feature.p2build/scripts/analyzeProduct.sh index 9a85abef51f..0b7ca1f9654 100755 --- a/java/com.sap.sailing.feature.p2build/scripts/analyzeProduct.sh +++ b/java/com.sap.sailing.feature.p2build/scripts/analyzeProduct.sh @@ -1,12 +1,21 @@ #!/bin/bash # Call like this: analyzeProduct.sh [ ...] +# Updates Eclipse .launch files with the needed bundles for starting a SAP sailing server based on the current feature.xml. +# The .launch files must be in der workspace format that is introduced since Eclipse 2019-12. Script prints an error when no matching +# replacment section could be found. # Will output two lines in format -# -# +# +# +# +# +# ${NL}" else patched_workspace_bundles="${workspace_bundles}" fi - target_bundles="${target_bundles}${NL}<\setAttribute>" - patched_workspace_bundles="${patched_workspace_bundles}${NL}<\setAttribute>" - perl -i -p0e "s/(.*?)<\/setAttribute>/${target_bundles}/sg" "$2" - perl -i -p0e "s/(.*?)<\/setAttribute>/${patched_workspace_bundles}/sg" "$2" + selected_target_bundles="${target_bundles}${NL}<\setAttribute>" + patched_workspace_bundles="${patched_workspace_bundles}${NL}<\setAttribute>" + perl -i -p0e "s/(.*?)<\/setAttribute>/${selected_target_bundles}/sg" "$2" + perl -i -p0e "s/(.*?)<\/setAttribute>/${patched_workspace_bundles}/sg" "$2" fi shift done From 46b6baaea9a959a7d9f9758ed237c04d2c31964d Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Thu, 9 Apr 2020 15:54:16 +0200 Subject: [PATCH 090/188] add missing slash #5255 --- .../com.sap.sailing.feature.p2build/scripts/analyzeProduct.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.feature.p2build/scripts/analyzeProduct.sh b/java/com.sap.sailing.feature.p2build/scripts/analyzeProduct.sh index 0b7ca1f9654..5505bacaadb 100755 --- a/java/com.sap.sailing.feature.p2build/scripts/analyzeProduct.sh +++ b/java/com.sap.sailing.feature.p2build/scripts/analyzeProduct.sh @@ -86,8 +86,8 @@ while [ "$2" != "" ]; do else patched_workspace_bundles="${workspace_bundles}" fi - selected_target_bundles="${target_bundles}${NL}<\setAttribute>" - patched_workspace_bundles="${patched_workspace_bundles}${NL}<\setAttribute>" + selected_target_bundles="${target_bundles}${NL}<\/setAttribute>" + patched_workspace_bundles="${patched_workspace_bundles}${NL}<\/setAttribute>" perl -i -p0e "s/(.*?)<\/setAttribute>/${selected_target_bundles}/sg" "$2" perl -i -p0e "s/(.*?)<\/setAttribute>/${patched_workspace_bundles}/sg" "$2" fi From 97cd9f32bb30b8623b60881b7733a08e4dc8b5f0 Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Thu, 9 Apr 2020 16:03:44 +0200 Subject: [PATCH 091/188] remove unneeded scripts #5255 --- .../scripts/analyzeLaunch.sh | 8 -------- .../scripts/analyzeTarget.sh | 4 ---- 2 files changed, 12 deletions(-) delete mode 100755 java/com.sap.sailing.feature.p2build/scripts/analyzeLaunch.sh delete mode 100755 java/com.sap.sailing.feature.p2build/scripts/analyzeTarget.sh diff --git a/java/com.sap.sailing.feature.p2build/scripts/analyzeLaunch.sh b/java/com.sap.sailing.feature.p2build/scripts/analyzeLaunch.sh deleted file mode 100755 index 6e54a0d1415..00000000000 --- a/java/com.sap.sailing.feature.p2build/scripts/analyzeLaunch.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -target_bundles=$(cat "$1" | grep 'key="target_bundles"' | sed -e 's/^.* value="\([^"]*\)"\/>/\1/' | sed -e 's/,/\n/g' | sed -e 's/^\(.*\)@\(.*\):\(.*\)$/\1 \2 \3/') -workspace_bundles=$(cat "$1" | grep 'key="workspace_bundles"' | sed -e 's/^.* value="\([^"]*\)"\/>/\1/' | sed -e 's/,/\n/g' | sed -e 's/^\(.*\)@\(.*\):\(.*\)$/\1 \2 \3/') -echo " *** Target Bundles ***" -echo "$target_bundles" | sort -echo " *** Workspace Bundles ***" -echo "$workspace_bundles" | sort - diff --git a/java/com.sap.sailing.feature.p2build/scripts/analyzeTarget.sh b/java/com.sap.sailing.feature.p2build/scripts/analyzeTarget.sh deleted file mode 100755 index d5f82d11a84..00000000000 --- a/java/com.sap.sailing.feature.p2build/scripts/analyzeTarget.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -target_bundles=$(cat "$1" | grep "plugin id=" | sed -e 's/^.* id="\([^"]*\)".*$/\1/') -echo " *** Target Bundles ***" -echo "$target_bundles" From ddf2cbee22dcd0f6384238082eca7ba50709ab2d Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Thu, 9 Apr 2020 16:05:36 +0200 Subject: [PATCH 092/188] eclipse is reordering bundles after first opening #5255 --- .../SailingServer (No Proxy OSX).launch | 352 ++++++++--------- ...ailingServer (No Proxy, Cached MTB).launch | 352 ++++++++--------- ...erver (No Proxy, Igtimi Local Test).launch | 352 ++++++++--------- .../SailingServer (No Proxy, Java11).launch | 352 ++++++++--------- ...r (No Proxy, Java11, JFR Recording).launch | 352 ++++++++--------- ...ingServer (No Proxy, Jetty on 8889).launch | 352 ++++++++--------- ...o Proxy, Jetty on 8889, Cached MTB).launch | 352 ++++++++--------- ...on 8889, auto-replicate SS and SSD).launch | 352 ++++++++--------- ... Jetty on 8889, auto-replicate dev).launch | 352 ++++++++--------- ...oxy, Jetty on 8889, auto-replicate).launch | 352 ++++++++--------- ...ingServer (No Proxy, Jetty on 8890).launch | 352 ++++++++--------- ...uto-replicate from replica at 8889).launch | 352 ++++++++--------- ...ver (No Proxy, Remote Debug SAP VM).launch | 352 ++++++++--------- ...ver (No Proxy, bundesliga2-2017 DB).launch | 352 ++++++++--------- ...ailingServer (No Proxy, winddbTest).launch | 355 +++++++++--------- ...& Wind estimation Import from 8888).launch | 352 ++++++++--------- 16 files changed, 2834 insertions(+), 2801 deletions(-) diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy OSX).launch b/java/com.sap.sailing.server/SailingServer (No Proxy OSX).launch index 8d42b48f6c0..514e6b4db56 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy OSX).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy OSX).launch @@ -31,183 +31,185 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch index 20923280a11..155fb78f0d7 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch @@ -30,183 +30,185 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Igtimi Local Test).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Igtimi Local Test).launch index 19afc483949..500bb2d2841 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Igtimi Local Test).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Igtimi Local Test).launch @@ -33,183 +33,185 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Java11).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Java11).launch index 23ec0ed14a2..6dbd9c9253e 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Java11).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Java11).launch @@ -33,183 +33,185 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Java11, JFR Recording).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Java11, JFR Recording).launch index 9cce32a359e..e6fd2cb8d12 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Java11, JFR Recording).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Java11, JFR Recording).launch @@ -33,183 +33,185 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch index c0c7419a8d7..bc6585d53c8 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch @@ -24,183 +24,185 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch index bb5f1919f1c..4324ebd4707 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch @@ -24,183 +24,185 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate SS and SSD).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate SS and SSD).launch index f5f2444ef21..827c8c54833 100644 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate SS and SSD).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate SS and SSD).launch @@ -26,183 +26,185 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate dev).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate dev).launch index 673c7251178..cf54bc7bc24 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate dev).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate dev).launch @@ -24,183 +24,185 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate).launch index 6f8bae8f53f..d63e8715553 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate).launch @@ -26,183 +26,185 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch index 863eeadc098..72c1c8e2a62 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch @@ -24,183 +24,185 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890, auto-replicate from replica at 8889).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890, auto-replicate from replica at 8889).launch index 6bf343b32b2..638bdceebdb 100644 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890, auto-replicate from replica at 8889).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890, auto-replicate from replica at 8889).launch @@ -24,183 +24,185 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch index 86c2af16cdc..fd4e018d6dc 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch @@ -24,183 +24,185 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, bundesliga2-2017 DB).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, bundesliga2-2017 DB).launch index 4e13b4ad317..d5939e93a16 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, bundesliga2-2017 DB).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, bundesliga2-2017 DB).launch @@ -33,183 +33,185 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch index 9b1e621af38..9bd3ee99481 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch @@ -30,184 +30,187 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889, Polar & Wind estimation Import from 8888).launch b/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889, Polar & Wind estimation Import from 8888).launch index 1fefbbbe5f7..bbe51f9b30f 100755 --- a/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889, Polar & Wind estimation Import from 8888).launch +++ b/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889, Polar & Wind estimation Import from 8888).launch @@ -24,183 +24,185 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 3c03d67641c9f9129143eb1e6b9f45fe6940192c Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Thu, 9 Apr 2020 16:28:38 +0200 Subject: [PATCH 093/188] fix fileformat, add missin "/" due to bug in script #5255 --- java/com.sap.sailing.server/SailingServer (No Proxy).launch | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy).launch b/java/com.sap.sailing.server/SailingServer (No Proxy).launch index 5a111dfcf25..6d1556bc3f5 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy).launch @@ -113,7 +113,7 @@ - + @@ -212,7 +212,7 @@ - + From 9e43b62c6da59187da74c7bbc5a1cfac1e264b96 Mon Sep 17 00:00:00 2001 From: Alexandr Timoshenko Date: Thu, 9 Apr 2020 16:37:53 +0200 Subject: [PATCH 094/188] revoke source pass test --- .../test/FinishingTimeFinderTest.java | 20 +++++++++++++++++-- .../analyzing/impl/FinishingTimeFinder.java | 2 +- .../raceinfo/RaceFinishingFragment.java | 1 + 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/FinishingTimeFinderTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/FinishingTimeFinderTest.java index ca3ce7ce304..696eb8d5e3e 100644 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/FinishingTimeFinderTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/FinishingTimeFinderTest.java @@ -69,10 +69,24 @@ public class FinishingTimeFinderTest extends PassAwareRaceLogAnalyzerTest { @Override protected TimePoint performAnalysis() { - for (RaceLogEvent event : log.getUnrevokedEvents()) { + for (RaceLogEvent event : log.getUnrevokedEventsDescending()) { if (event instanceof RaceLogRaceStatusEvent) { RaceLogRaceStatusEvent statusEvent = (RaceLogRaceStatusEvent) event; if (statusEvent.getNextStatus().equals(RaceLogRaceStatus.FINISHING)) { diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/RaceFinishingFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/RaceFinishingFragment.java index d26830fbb72..7984a074df8 100755 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/RaceFinishingFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/RaceFinishingFragment.java @@ -60,6 +60,7 @@ public class RaceFinishingFragment extends BaseFragment { @Override public void onClick(View v) { final Result result = getRace().revokeFinish(preferences.getAuthor()); + } }); } From 37d360d2e6199b6d027bee17311a05da2545ca41 Mon Sep 17 00:00:00 2001 From: dmitry Date: Thu, 9 Apr 2020 20:26:19 +0300 Subject: [PATCH 095/188] bug5178: Added SelectedElementsCountingRemoveButton and changed all panels to use it --- .../AbstractLeaderboardConfigPanel.java | 2 +- .../ui/adminconsole/EventListComposite.java | 53 ++++++++------- .../ui/adminconsole/IgtimiAccountsPanel.java | 17 ++--- .../adminconsole/LeaderboardConfigPanel.java | 4 +- .../LeaderboardGroupConfigPanel.java | 48 +++++++------- .../adminconsole/RegattaManagementPanel.java | 12 ++-- .../ResultImportUrlsListComposite.java | 64 ++++++++++--------- .../SwissTimingEventManagementPanel.java | 3 +- .../SwissTimingReplayConnectorPanel.java | 3 +- .../TracTracEventManagementPanel.java | 3 +- .../coursecreation/CourseTemplatePanel.java | 2 +- .../AccessControlledButtonPanel.java | 50 +++++++-------- .../component/RoleDefinitionsPanel.java | 5 +- .../SelectedElementsCountingRemoveButton.java | 29 +++++++++ .../component/UserGroupManagementPanel.java | 3 +- 15 files changed, 165 insertions(+), 133 deletions(-) create mode 100644 java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/SelectedElementsCountingRemoveButton.java diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractLeaderboardConfigPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractLeaderboardConfigPanel.java index 6b0ff6955a3..af440f0d7f8 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractLeaderboardConfigPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractLeaderboardConfigPanel.java @@ -182,7 +182,6 @@ public abstract class AbstractLeaderboardConfigPanel extends FormPanel final AccessControlledButtonPanel buttonPanel = new AccessControlledButtonPanel(userService, LEADERBOARD); Label lblFilterEvents = new Label(stringMessages.filterLeaderboardsByName() + ": "); - addLeaderboardControls(buttonPanel); leaderboardsPanel.add(buttonPanel); AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class); @@ -225,6 +224,7 @@ public abstract class AbstractLeaderboardConfigPanel extends FormPanel raceColumnTable.setSelectedLeaderboardName(getSelectedLeaderboardName()); } }); + addLeaderboardControls(buttonPanel); filteredLeaderboardList.addDataDisplay(leaderboardTable); leaderboardsPanel.add(leaderboardTable); mainPanel.add(new Grid(1, 1)); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java index 7d636ee74c0..bd4c0927543 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java @@ -22,6 +22,7 @@ import com.google.gwt.cell.client.AbstractCell; import com.google.gwt.cell.client.SafeHtmlCell; import com.google.gwt.cell.client.ValueUpdater; import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.Scheduler; import com.google.gwt.safehtml.client.SafeHtmlTemplates; import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; @@ -133,29 +134,6 @@ public class EventListComposite extends Composite implements EventsRefresher, Le final VerticalPanel panel = new VerticalPanel(); final AccessControlledButtonPanel buttonPanel = new AccessControlledButtonPanel(userService, EVENT); panel.add(buttonPanel); - final Button refresh = buttonPanel.addUnsecuredAction(stringMessages.refresh(), this::fillEvents); - refresh.ensureDebugId("RefreshEventsButton"); - final Button create = buttonPanel.addCreateAction(stringMessages.actionAddEvent(), this::openCreateEventDialog); - create.ensureDebugId("CreateEventButton"); - final Button remove = buttonPanel.addRemoveAction(stringMessages.remove(), new Command() { - @Override - public void execute() { - if(askUserForConfirmation()){ - removeEvents(refreshableEventSelectionModel.getSelectedSet()); - } - } - - private boolean askUserForConfirmation() { - if (refreshableEventSelectionModel.itemIsSelectedButNotVisible(eventTable.getVisibleItems())){ - final String eventNames = refreshableEventSelectionModel.getSelectedSet().stream() - .map(EventDTO::getName).collect(Collectors.joining("\n")); - return Window.confirm(stringMessages.doYouReallyWantToRemoveNonVisibleEvents(eventNames)); - } - return Window.confirm(stringMessages.doYouReallyWantToRemoveEvents()); - } - }); - remove.setEnabled(false); - remove.ensureDebugId("RemoveEventsButton"); eventListDataProvider = new ListDataProvider(); filterTextbox = new LabeledAbstractFilterablePanel(new Label(stringMessages.filterEventsByName()), allEvents, eventListDataProvider, stringMessages) { @@ -185,13 +163,35 @@ public class EventListComposite extends Composite implements EventsRefresher, Le refreshableEventSelectionModel = selectionModel; eventTable.setVisible(false); + final Button refresh = buttonPanel.addUnsecuredAction(stringMessages.refresh(), this::fillEvents); + refresh.ensureDebugId("RefreshEventsButton"); + final Button create = buttonPanel.addCreateAction(stringMessages.actionAddEvent(), this::openCreateEventDialog); + create.ensureDebugId("CreateEventButton"); + final Button remove = buttonPanel.addRemoveAction(refreshableEventSelectionModel, stringMessages.remove(), + new Command() { + @Override + public void execute() { + if (askUserForConfirmation()) { + removeEvents(refreshableEventSelectionModel.getSelectedSet()); + } + } + + private boolean askUserForConfirmation() { + if (refreshableEventSelectionModel.itemIsSelectedButNotVisible(eventTable.getVisibleItems())) { + final String eventNames = refreshableEventSelectionModel.getSelectedSet().stream() + .map(EventDTO::getName).collect(Collectors.joining("\n")); + return Window.confirm(stringMessages.doYouReallyWantToRemoveNonVisibleEvents(eventNames)); + } + return Window.confirm(stringMessages.doYouReallyWantToRemoveEvents()); + } + }); + remove.setEnabled(false); + remove.ensureDebugId("RemoveEventsButton"); + this.refreshableEventSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() { @Override public void onSelectionChange(SelectionChangeEvent event) { final Set selectedEvents = refreshableEventSelectionModel.getSelectedSet(); - final int numberOfItemsSelected = selectedEvents.size(); - remove.setText(numberOfItemsSelected <= 1 ? stringMessages.remove() - : stringMessages.removeNumber(numberOfItemsSelected)); boolean canDeleteAll = true; for (EventDTO eventDTO : selectedEvents) { if (!userService.hasPermission(eventDTO, DefaultActions.DELETE)) { @@ -199,7 +199,6 @@ public class EventListComposite extends Composite implements EventsRefresher, Le } } remove.setEnabled(!selectedEvents.isEmpty() && canDeleteAll); - } }); panel.add(filterTextbox); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/IgtimiAccountsPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/IgtimiAccountsPanel.java index 3a194c5c2a1..12eedcbbfb0 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/IgtimiAccountsPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/IgtimiAccountsPanel.java @@ -134,15 +134,16 @@ public class IgtimiAccountsPanel extends FlowPanel { buttonPanel.addUnsecuredAction(stringMessages.refresh(), () -> refresh()); // setup controls - final Button removeAccountButton = buttonPanel.addRemoveAction(stringMessages.remove(), () -> { - if (refreshableAccountsSelectionModel.getSelectedSet().size() > 0) { - if (Window.confirm(stringMessages.doYouReallyWantToRemoveTheSelectedIgtimiAccounts())) { - for (AccountWithSecurityDTO account : refreshableAccountsSelectionModel.getSelectedSet()) { - removeAccount(account, filteredAccounts); + final Button removeAccountButton = buttonPanel.addRemoveAction(refreshableAccountsSelectionModel, + stringMessages.remove(), () -> { + if (refreshableAccountsSelectionModel.getSelectedSet().size() > 0) { + if (Window.confirm(stringMessages.doYouReallyWantToRemoveTheSelectedIgtimiAccounts())) { + for (AccountWithSecurityDTO account : refreshableAccountsSelectionModel.getSelectedSet()) { + removeAccount(account, filteredAccounts); + } + } } - } - } - }); + }); removeAccountButton.setEnabled(false); refreshableAccountsSelectionModel.addSelectionChangeHandler( e -> removeAccountButton.setEnabled(refreshableAccountsSelectionModel.getSelectedSet().size() > 0)); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java index ab1ac35ff01..75c445f3682 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java @@ -164,7 +164,7 @@ public class LeaderboardConfigPanel extends AbstractLeaderboardConfigPanel leaderboardCreateAndRegattaReadPermission, this::createRegattaLeaderboardWithEliminations); createRegattaLeaderboardWithEliminationsBtn.ensureDebugId("CreateRegattaLeaderboardWithEliminationsButton"); - leaderboardRemoveButton = buttonPanel.addRemoveAction(stringMessages.remove(), new Command() { + leaderboardRemoveButton = buttonPanel.addRemoveAction(leaderboardSelectionModel, stringMessages.remove(), new Command() { @Override public void execute() { @@ -866,8 +866,6 @@ public class LeaderboardConfigPanel extends AbstractLeaderboardConfigPanel } leaderboardRemoveButton.setEnabled(!selectedLeaderboards.isEmpty() && canDeleteAllSelected); - leaderboardRemoveButton.setText(selectedLeaderboards.size() <= 1 ? stringMessages.remove() - : stringMessages.removeNumber(selectedLeaderboards.size())); final StrippedLeaderboardDTOWithSecurity selectedLeaderboard = getSelectedLeaderboard(); if (leaderboardSelectionModel.getSelectedSet().size() == 1 && selectedLeaderboard != null) { 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 6d001d66105..08b0f1bc3ab 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 @@ -512,28 +512,6 @@ public class LeaderboardGroupConfigPanel extends AbstractRegattaPanel }); refreshButton.ensureDebugId("RefreshLeaderboardGroupsButton"); - removeButton = buttonPanel.addRemoveAction(stringMessages.remove(), new Command() { - - @Override - public void execute() { - if(askUserForConfirmation()){ - removeLeaderboardGroups(refreshableGroupsSelectionModel.getSelectedSet()); - } - } - - private boolean askUserForConfirmation() { - if (refreshableGroupsSelectionModel.itemIsSelectedButNotVisible(groupsTable.getVisibleItems())) { - final String leaderboardGroupNames = refreshableGroupsSelectionModel.getSelectedSet().stream() - .map(LeaderboardGroupDTO::getName).collect(Collectors.joining("\n")); - return Window.confirm( - stringMessages.doYouReallyWantToRemoveNonVisibleLeaderboardGroups(leaderboardGroupNames)); - } - return Window.confirm(stringMessages.doYouReallyWantToRemoveLeaderboardGroups()); - } - }); - removeButton.ensureDebugId("RemoveLeaderboardButton"); - removeButton.setEnabled(false); - AnchorCell anchorCell = new AnchorCell(); final TextColumn groupUUidColumn = new AbstractSortableTextColumn( @@ -673,6 +651,31 @@ public class LeaderboardGroupConfigPanel extends AbstractRegattaPanel groupsTable.addColumnSortHandler(leaderboardGroupsListHandler); refreshableGroupsSelectionModel = leaderboardTableSelectionColumn.getSelectionModel(); + + removeButton = buttonPanel.addRemoveAction(refreshableGroupsSelectionModel, stringMessages.remove(), + new Command() { + + @Override + public void execute() { + if (askUserForConfirmation()) { + removeLeaderboardGroups(refreshableGroupsSelectionModel.getSelectedSet()); + } + } + + private boolean askUserForConfirmation() { + if (refreshableGroupsSelectionModel + .itemIsSelectedButNotVisible(groupsTable.getVisibleItems())) { + final String leaderboardGroupNames = refreshableGroupsSelectionModel.getSelectedSet() + .stream().map(LeaderboardGroupDTO::getName).collect(Collectors.joining("\n")); + return Window.confirm(stringMessages + .doYouReallyWantToRemoveNonVisibleLeaderboardGroups(leaderboardGroupNames)); + } + return Window.confirm(stringMessages.doYouReallyWantToRemoveLeaderboardGroups()); + } + }); + removeButton.ensureDebugId("RemoveLeaderboardButton"); + removeButton.setEnabled(false); + refreshableGroupsSelectionModel.addSelectionChangeHandler(event -> groupSelectionChanged()); groupsTable.setSelectionModel(refreshableGroupsSelectionModel, leaderboardTableSelectionColumn.getSelectionManager()); @@ -908,7 +911,6 @@ public class LeaderboardGroupConfigPanel extends AbstractRegattaPanel Set selectedLeaderboardGroups = refreshableGroupsSelectionModel.getSelectedSet(); isSingleGroupSelected = selectedLeaderboardGroups.size() == 1; - removeButton.setText(selectedLeaderboardGroups.size() <= 1 ? stringMessages.remove() : stringMessages.removeNumber(selectedLeaderboardGroups.size())); boolean canDeleteAllSelected = true; for (LeaderboardGroupDTO group : selectedLeaderboardGroups) { if (!userService.hasPermission(group, DefaultActions.DELETE)) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaManagementPanel.java index 8bdb3d8d611..463e6c0e4f6 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaManagementPanel.java @@ -68,12 +68,16 @@ public class RegattaManagementPanel extends SimplePanel implements RegattasDispl mainPanel.add(regattasPanel); final VerticalPanel regattasContentPanel = new VerticalPanel(); regattasPanel.setContentWidget(regattasContentPanel); - + + regattaListComposite = new RegattaListComposite(sailingService, userService, regattaRefresher, errorReporter, + stringMessages); + regattaListComposite.ensureDebugId("RegattaListComposite"); + refreshableRegattaMultiSelectionModel = regattaListComposite.getRefreshableMultiSelectionModel(); final AccessControlledButtonPanel buttonPanel = new AccessControlledButtonPanel(userService, REGATTA); final Button create = buttonPanel.addCreateAction(stringMessages.addRegatta(), this::openCreateRegattaDialog); create.ensureDebugId("AddRegattaButton"); - final Button remove = buttonPanel.addRemoveAction(stringMessages.remove(), new Command() { + final Button remove = buttonPanel.addRemoveAction(refreshableRegattaMultiSelectionModel, stringMessages.remove(), new Command() { @Override public void execute() { @@ -97,10 +101,6 @@ public class RegattaManagementPanel extends SimplePanel implements RegattasDispl remove.setEnabled(false); regattasContentPanel.add(buttonPanel); - regattaListComposite = new RegattaListComposite(sailingService, userService, regattaRefresher, errorReporter, - stringMessages); - regattaListComposite.ensureDebugId("RegattaListComposite"); - refreshableRegattaMultiSelectionModel = regattaListComposite.getRefreshableMultiSelectionModel(); refreshableRegattaMultiSelectionModel.addSelectionChangeHandler(new Handler() { @Override public void onSelectionChange(SelectionChangeEvent event) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/ResultImportUrlsListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/ResultImportUrlsListComposite.java index a7479b12444..a5ea400265f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/ResultImportUrlsListComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/ResultImportUrlsListComposite.java @@ -54,42 +54,11 @@ public class ResultImportUrlsListComposite extends Composite { final AccessControlledButtonPanel buttonPanel = new AccessControlledButtonPanel(userService, SecuredDomainType.RESULT_IMPORT_URL); - final Button add = buttonPanel.addCreateAction(stringMessages.add(), this::addUrl); - add.setEnabled(false); - - final Button remove = buttonPanel.addRemoveAction(stringMessages.remove(), new Command() { - @Override - public void execute() { - if (Window.confirm(stringMessages.doYouReallyWantToRemoveResultImportUrls())) { - removeUrls(table.getSelectionModel().getSelectedSet()); - } - } - }); - remove.setEnabled(false); - - final Button refresh = buttonPanel.addUnsecuredAction(stringMessages.refresh(), this::updateTable); - refresh.setEnabled(false); - Grid urlSample = new Grid(1, 2); urlSample.setWidget(0, 0, new Label(stringMessages.sampleURL(""))); Label urlSampleLabel = new Label(); urlSample.setWidget(0, 1, urlSampleLabel); - urlProviderListBox = new ListBox(); - urlProviderListBox.setMultipleSelect(false); - urlProviderListBox.addChangeHandler(new ChangeHandler() { - @Override - public void onChange(ChangeEvent event) { - int index = urlProviderListBox.getSelectedIndex(); - boolean buttonsEnabled = index > 0; - add.setEnabled(buttonsEnabled); - refresh.setEnabled(buttonsEnabled); - table.getSelectionModel().clear(); - table.update(getSelectedProviderName()); - String provider = urlProviderListBox.getSelectedValue(); - urlSampleLabel.setText(provider == null || provider.equals("null") ? "" : provider); - } - }); sailingService.getUrlResultProviderNamesAndOptionalSampleURL(new AsyncCallback>>() { @Override public void onSuccess(List> urlProviderNamesAndOptionalSampleURL) { @@ -106,6 +75,20 @@ public class ResultImportUrlsListComposite extends Composite { }); table = new ResultImportUrlsTableWrapper<>(sailingServiceAsync, userService, stringMessages, errorReporter); + + final Button add = buttonPanel.addCreateAction(stringMessages.add(), this::addUrl); + add.setEnabled(false); + + final Button remove = buttonPanel.addRemoveAction(table.getSelectionModel(), stringMessages.remove(), new Command() { + @Override + public void execute() { + if (Window.confirm(stringMessages.doYouReallyWantToRemoveResultImportUrls())) { + removeUrls(table.getSelectionModel().getSelectedSet()); + } + } + }); + remove.setEnabled(false); + table.getSelectionModel().addSelectionChangeHandler(new Handler() { @Override public void onSelectionChange(SelectionChangeEvent event) { @@ -113,6 +96,25 @@ public class ResultImportUrlsListComposite extends Composite { } }); + final Button refresh = buttonPanel.addUnsecuredAction(stringMessages.refresh(), this::updateTable); + refresh.setEnabled(false); + + urlProviderListBox = new ListBox(); + urlProviderListBox.setMultipleSelect(false); + urlProviderListBox.addChangeHandler(new ChangeHandler() { + @Override + public void onChange(ChangeEvent event) { + int index = urlProviderListBox.getSelectedIndex(); + boolean buttonsEnabled = index > 0; + add.setEnabled(buttonsEnabled); + refresh.setEnabled(buttonsEnabled); + table.getSelectionModel().clear(); + table.update(getSelectedProviderName()); + String provider = urlProviderListBox.getSelectedValue(); + urlSampleLabel.setText(provider == null || provider.equals("null") ? "" : provider); + } + }); + Grid providerGrid = new Grid(1, 2); providerGrid.setWidget(0, 0, new Label(stringMessages.urlProviders())); providerGrid.setWidget(0, 1, urlProviderListBox); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java index 4a16e3ba427..667f7bead7a 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java @@ -121,7 +121,8 @@ public class SwissTimingEventManagementPanel extends AbstractEventManagementPane }, userService, errorReporter).show()); // Remove SwissTiming Connection - final Button removeButton = buttonPanel.addRemoveAction(stringMessages.remove(), () -> { + final Button removeButton = buttonPanel.addRemoveAction(connectionsTable.getSelectionModel(), + stringMessages.remove(), () -> { sailingService.deleteSwissTimingConfiguration(connectionsTable.getSelectionModel().getSelectedObject(), new AsyncCallback() { @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingReplayConnectorPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingReplayConnectorPanel.java index 38b211c838c..495aa163c2c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingReplayConnectorPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingReplayConnectorPanel.java @@ -281,7 +281,8 @@ public class SwissTimingReplayConnectorPanel extends AbstractEventManagementPane } }, userService, errorReporter).show()); // Remove action - final Button removeButton = buttonPanel.addRemoveAction(stringMessages.remove(), () -> { + final Button removeButton = buttonPanel.addRemoveAction(connectionsTable.getSelectionModel(), + stringMessages.remove(), () -> { sailingService.deleteSwissTimingArchiveConfiguration( connectionsTable.getSelectionModel().getSelectedObject(), new AsyncCallback() { @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TracTracEventManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TracTracEventManagementPanel.java index a27424f2448..e69ed8a3a51 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TracTracEventManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TracTracEventManagementPanel.java @@ -151,7 +151,8 @@ public class TracTracEventManagementPanel extends AbstractEventManagementPanel { } }, userService, errorReporter).show()); addCreateAction.ensureDebugId("AddConnectionButton"); - final Button removeButton = buttonPanel.addRemoveAction(stringMessages.remove(), () -> { + final Button removeButton = buttonPanel.addRemoveAction(connectionsTable.getSelectionModel(), + stringMessages.remove(), () -> { sailingService.deleteTracTracConfiguration(connectionsTable.getSelectionModel().getSelectedObject(), new AsyncCallback() { @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java index 291d3412dcc..d310a9d0122 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java @@ -115,7 +115,7 @@ public class CourseTemplatePanel extends FlowPanel { } }); - final Button removeButton = buttonAndFilterPanel.addRemoveAction(stringMessages.remove(), new Command() { + final Button removeButton = buttonAndFilterPanel.addRemoveAction(refreshableSelectionModel, stringMessages.remove(), new Command() { @Override public void execute() { if (askUserForConfirmation()) { diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java index 6a223918bd0..8170bb42e85 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java @@ -2,7 +2,6 @@ package com.sap.sse.security.ui.client.component; import java.util.HashMap; import java.util.Map; -import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Supplier; @@ -14,14 +13,14 @@ import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Widget; -import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel; +import com.sap.sse.gwt.client.celltable.RefreshableSelectionModel; import com.sap.sse.security.shared.HasPermissions; import com.sap.sse.security.ui.client.UserService; /** * Panel where several buttons can be added which are either {@link #addUnsecuredAction(String, Command) unsecured} or * restricted for users with {@link #addCreateAction(String, Command) create} and /or - * {@link #addRemoveAction(String, Command) remove} permissions. The {@link Button#setVisible(boolean) visibility} of + * {@link #addRemoveAction(RefreshableSelectionModel, String, Command)} remove} permissions. The {@link Button#setVisible(boolean) visibility} of * secured buttons depend on the permissions of the currently logged-in user and changes dynamically. */ public class AccessControlledButtonPanel extends Composite { @@ -102,42 +101,22 @@ public class AccessControlledButtonPanel extends Composite { return addAction(text, createPermissionCheckWithoutServerCreateObjectCheck, callback); } - /** - * Adds a secured action button, which is only visible if the current user has any - * {@link UserService#hasCurrentUserPermissionToDeleteAnyObjectOfType(HasPermissions) delete permission} for the - * {@link HasPermissions type} provided in this {@link AccessControlledButtonPanel}'s constructor. - * - * @param text - * the {@link String text} to show on the button - * @param callback - * the {@link Command callback} to execute on button click, if permission is granted - * @return the created {@link Button} instance - */ - public Button addRemoveAction(final String text, final Command callback) { - return addAction(text, removePermissionCheck, callback); - } - /** * Adds a secured action button, which is only visible if the current user has any * {@link UserService#hasCurrentUserPermissionToDeleteAnyObjectOfType(HasPermissions) delete permission} for the * {@link HasPermissions type} provided in this {@link AccessControlledButtonPanel}'s constructor. * * @param selectionModel - * the selection model of the table + * the {@link RefreshableSelectionModel}selection model of the table * @param text * the {@link String text} to show on the button * @param callback * the {@link Command callback} to execute on button click, if permission is granted * @return the created {@link Button} instance */ - public Button addRemoveAction(RefreshableMultiSelectionModel selectionModel, final String text, final Command callback) { - final Button removeButton = addAction(text, removePermissionCheck, callback); - selectionModel.addSelectionChangeHandler((event) -> { - Set selectedSet = selectionModel.getSelectedSet(); - removeButton.setEnabled(!selectedSet.isEmpty()); - removeButton.setText(selectedSet.size() <= 1 ? text : text + '(' + selectedSet.size() + ')'); - }); - return removeButton; + public Button addRemoveAction(RefreshableSelectionModel selectionModel, final String text, + final Command callback) { + return addAction(selectionModel, text, removePermissionCheck, callback); } /** @@ -172,11 +151,26 @@ public class AccessControlledButtonPanel extends Composite { callback.execute(); } }); + resolveButtonVisibility(permissionCheck, button); + return button; + } + + public Button addAction(RefreshableSelectionModel selectionModel, final String text, + final Supplier permissionCheck, final Command callback) { + final Button button = new SelectedElementsCountingRemoveButton(selectionModel, text, (ClickHandler) event -> { + if (permissionCheck.get()) { + callback.execute(); + } + }); + resolveButtonVisibility(permissionCheck, button); + return button; + } + + private void resolveButtonVisibility(Supplier permissionCheck, Button button) { this.buttonToPermissions.put(button, permissionCheck); button.getElement().getStyle().setMarginRight(5, Unit.PX); this.panel.add(button); this.visibilityUpdater.accept(button, permissionCheck); - return button; } /** diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/RoleDefinitionsPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/RoleDefinitionsPanel.java index 249a4926fc8..e423c1b91bf 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/RoleDefinitionsPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/RoleDefinitionsPanel.java @@ -25,6 +25,7 @@ import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler; import com.google.gwt.user.cellview.client.TextColumn; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.view.client.ListDataProvider; @@ -102,7 +103,8 @@ public class RoleDefinitionsPanel extends VerticalPanel { buttonPanel.addUnsecuredAction(stringMessages.refresh(), this::updateRoleDefinitions); buttonPanel.addCreateActionWithoutServerCreateObjectPermissionCheck(stringMessages.add(), this::createRoleDefinition); - buttonPanel.addRemoveAction(stringMessages.remove(), () -> { + Button removeButton = buttonPanel.addRemoveAction(refreshableRoleDefinitionMultiSelectionModel, + stringMessages.remove(), () -> { final String roles = String.join(", ", Util.map(getSelectedRoleDefinitions(), RoleDefinitionDTO::getName)); if (Window.confirm(stringMessages.doYouReallyWantToRemoveRole(roles))) { final Set selectedRoles = new HashSet<>(getSelectedRoleDefinitions()); @@ -110,6 +112,7 @@ public class RoleDefinitionsPanel extends VerticalPanel { } }); + removeButton.setEnabled(false); add(buttonPanel); add(filterablePanelRoleDefinitions); add(roleDefinitionsTable); diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/SelectedElementsCountingRemoveButton.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/SelectedElementsCountingRemoveButton.java new file mode 100644 index 00000000000..97b4d5e5ee0 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/SelectedElementsCountingRemoveButton.java @@ -0,0 +1,29 @@ +package com.sap.sse.security.ui.client.component; + +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.safehtml.shared.annotations.IsSafeHtml; +import com.google.gwt.user.client.ui.Button; +import com.sap.sse.gwt.client.celltable.RefreshableSelectionModel; + +import java.util.Set; + +/** + * The implementation of Button which re-draws it's label based on SelectionEvent with showing the number of + * selected items + * + * @author dmitry + * + */ +public class SelectedElementsCountingRemoveButton extends Button { + public SelectedElementsCountingRemoveButton(RefreshableSelectionModel selectionModel, @IsSafeHtml String html, + ClickHandler handler) { + setHTML(html); + addClickHandler(handler); + selectionModel.addSelectionChangeHandler(event -> { + Set selectedSet = selectionModel.getSelectedSet(); + setEnabled(!selectedSet.isEmpty()); + setText(selectedSet.size() <= 1 ? html : html + '(' + selectedSet.size() + ')'); + }); + + } +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupManagementPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupManagementPanel.java index a84c8a7afa2..48ec19bc660 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupManagementPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupManagementPanel.java @@ -71,7 +71,7 @@ public class UserGroupManagementPanel extends Composite { buttonPanel.addCreateActionWithoutServerCreateObjectPermissionCheck(stringMessages.createUserGroup(), () -> new CreateUserGroupDialog(stringMessages, userService, userManagementService, userGroupListDataProvider, () -> updateUserGroups()).show()); - final Button removeButton = buttonPanel.addRemoveAction(stringMessages.removeUserGroup(), () -> { + final Button removeButton = buttonPanel.addRemoveAction(userGroupSelectionModel, stringMessages.removeUserGroup(), () -> { Set userGroups = userGroupTableWrapper.getSelectionModel().getSelectedSet(); if (userGroups == null || userGroups.isEmpty()) { Window.alert(stringMessages.youHaveToSelectAUserGroup()); @@ -101,6 +101,7 @@ public class UserGroupManagementPanel extends Composite { } } }); + removeButton.setEnabled(false); userGroupSelectionModel.addSelectionChangeHandler(event -> { removeButton.setText(stringMessages.remove() + " (" + userGroupSelectionModel.getSelectedSet().size() + ")"); removeButton.setEnabled(userGroupSelectionModel.getSelectedSet().size() >= 1); From a479374f814307b1635d6a6e49c555f392888b46 Mon Sep 17 00:00:00 2001 From: dmitry Date: Thu, 9 Apr 2020 21:02:51 +0300 Subject: [PATCH 096/188] bug5178: Re-factored AccessControlledButtonPanel --- .../AccessControlledButtonPanel.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java index 8170bb42e85..9fedba57f3c 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java @@ -146,24 +146,24 @@ public class AccessControlledButtonPanel extends Composite { * @return the created {@link Button} instance */ public Button addAction(final String text, final Supplier permissionCheck, final Command callback) { - final Button button = new Button(text, (ClickHandler) event -> { - if (permissionCheck.get()) { - callback.execute(); - } - }); + return addAction(null, text, permissionCheck, callback); + } + + private Button addAction(RefreshableSelectionModel selectionModel, final String text, + final Supplier permissionCheck, final Command callback) { + ClickHandler handler = wrap(permissionCheck, callback); + final Button button = selectionModel == null ? new Button(text, handler) + : new SelectedElementsCountingRemoveButton(selectionModel, text, handler); resolveButtonVisibility(permissionCheck, button); return button; } - public Button addAction(RefreshableSelectionModel selectionModel, final String text, - final Supplier permissionCheck, final Command callback) { - final Button button = new SelectedElementsCountingRemoveButton(selectionModel, text, (ClickHandler) event -> { + private ClickHandler wrap(Supplier permissionCheck, Command callback) { + return event -> { if (permissionCheck.get()) { callback.execute(); } - }); - resolveButtonVisibility(permissionCheck, button); - return button; + }; } private void resolveButtonVisibility(Supplier permissionCheck, Button button) { From 81e701f144147d1065330f5f51d52b70af67bc5b Mon Sep 17 00:00:00 2001 From: Alexandr Timoshenko Date: Fri, 10 Apr 2020 09:48:37 +0200 Subject: [PATCH 097/188] update ui after finishing revoked completed finishing flag revoking --- .../test/FinishingTimeFinderTest.java | 16 +++ .../abstractlog/impl/AbstractLogImpl.java | 97 ++++++++++++------- .../domain/abstractlog/race/RaceLog.java | 23 ++++- .../analyzing/impl/FinishingTimeFinder.java | 4 +- .../race/analyzing/impl/RaceLogAnalyzer.java | 13 ++- .../analyzing/impl/RaceStatusAnalyzer.java | 2 +- .../abstractlog/race/impl/RaceLogImpl.java | 9 +- .../res/layout-hdpi/race_finishing.xml | 5 +- .../res/layout/race_finishing.xml | 19 ++-- .../race_revoke_finishing_button_xlarge.xml | 10 ++ .../res/values-sw720dp/references.xml | 1 + .../res/values/strings.xml | 4 +- .../app/domain/impl/ManagedRaceImpl.java | 52 +++++----- .../raceinfo/BaseRaceInfoRaceFragment.java | 35 +++---- .../raceinfo/RaceFinishingFragment.java | 7 +- 15 files changed, 190 insertions(+), 107 deletions(-) create mode 100644 mobile/com.sap.sailing.racecommittee.app/res/layout/race_revoke_finishing_button_xlarge.xml diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/FinishingTimeFinderTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/FinishingTimeFinderTest.java index 696eb8d5e3e..efd25f01335 100644 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/FinishingTimeFinderTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/FinishingTimeFinderTest.java @@ -95,5 +95,21 @@ public class FinishingTimeFinderTest extends PassAwareRaceLogAnalyzerTest * {@link TrackImpl#getDummyFix(com.sap.sailing.domain.common.TimePoint)} is not overridden, see * {@link RaceLogEventComparator} for sorting when interface methods like * {@link Track#getFirstFixAfter(com.sap.sailing.domain.common.TimePoint)} are used. *

    - * */ public abstract class AbstractLogImpl, VisitorT> -extends TrackImpl implements AbstractLog { + extends TrackImpl implements AbstractLog { private static final long serialVersionUID = -176745401321893502L; private static final String DefaultLockName = AbstractLogImpl.class.getName() + ".lock"; private final static Logger logger = Logger.getLogger(AbstractLogImpl.class.getName()); @@ -52,7 +53,7 @@ extends TrackImpl implements AbstractLog { * Clients can use the {@link #add(RaceLogEvent, UUID)} method */ private transient Map> eventsDeliveredToClient = new HashMap>(); - + private Map eventsById = new HashMap(); private final Serializable id; @@ -67,9 +68,8 @@ extends TrackImpl implements AbstractLog { /** * Initializes a new {@link RaceLogImpl}. - * - * @param nameForReadWriteLock - * name of lock. + * + * @param nameForReadWriteLock name of lock. */ public AbstractLogImpl(String nameForReadWriteLock, Serializable identifier, Comparator comparator) { super(new ArrayListNavigableSet(comparator), nameForReadWriteLock); @@ -82,7 +82,7 @@ extends TrackImpl implements AbstractLog { public Serializable getId() { return this.id; } - + protected void onSuccessfulAdd(EventT event, boolean notifyListeners) { revokeIfNecessary(event); eventsById.put(event.getId(), event); @@ -90,7 +90,7 @@ extends TrackImpl implements AbstractLog { notifyListenersAboutReceive(event); } } - + protected boolean add(EventT event, boolean notifyListeners) { boolean isAdded = false; lockForWrite(); @@ -107,7 +107,7 @@ extends TrackImpl implements AbstractLog { } return isAdded; } - + @Override public boolean add(EventT event) { return add(event, true); @@ -117,7 +117,7 @@ extends TrackImpl implements AbstractLog { public boolean load(EventT event) { return add(event, false); } - + private void revokeIfNecessary(EventT newEvent) { if (newEvent instanceof RevokeEvent) { RevokeEvent revokeEvent = (RevokeEvent) newEvent; @@ -134,7 +134,7 @@ extends TrackImpl implements AbstractLog { } } } - + private void checkIfSuccessfullyRevokes(RevokeEvent revokeEvent) throws NotRevokableException { lockForRead(); EventT revokedEvent; @@ -147,9 +147,9 @@ extends TrackImpl implements AbstractLog { // it can happen that the event that has been revoked is not yet loaded - as we assume // that race log events never get removed we can safely continue and assume that // the event will be loaded later - logger.warning("RevokeEvent for "+revokeEvent.getShortInfo()+" added, that refers to non-existent event to be revoked. Could also happen that the revoke event is before the event to be revoked."); + logger.warning("RevokeEvent for " + revokeEvent.getShortInfo() + " added, that refers to non-existent event to be revoked. Could also happen that the revoke event is before the event to be revoked."); } else { - if (! (revokedEvent instanceof Revokable)) { + if (!(revokedEvent instanceof Revokable)) { throw new NotRevokableException("RevokeEvent trying to revoke non-revokable event"); } @@ -166,7 +166,7 @@ extends TrackImpl implements AbstractLog { add(event); return getEventsToDeliver(clientId, event); } - + @Override public Iterable getEventsToDeliver(UUID clientId) { return getEventsToDeliver(clientId, null); @@ -253,7 +253,7 @@ extends TrackImpl implements AbstractLog { try { for (EventT event : getRawFixes()) { if (event instanceof RevokeEvent) { - revokedEventIds.add(((RevokeEvent)event).getRevokedEventId()); + revokedEventIds.add(((RevokeEvent) event).getRevokedEventId()); } } } finally { @@ -311,25 +311,15 @@ extends TrackImpl implements AbstractLog { assertReadLock(); return eventsById.get(id); } - + @Override public NavigableSet getUnrevokedEvents() { - return new PartialNavigableSetView(super.getInternalFixes()) { - @Override - protected boolean isValid(EventT e) { - return ! (e instanceof RevokeEvent) && ! revokedEventIds.contains(e.getId()); - } - }; + return new FilteredPartialNavigableSetView(super.getInternalFixes(), new RevokedValidator(revokedEventIds)); } - + @Override public NavigableSet getUnrevokedEventsDescending() { - return new PartialNavigableSetView(super.getInternalFixes().descendingSet()) { - @Override - protected boolean isValid(EventT e) { - return ! (e instanceof RevokeEvent) && ! revokedEventIds.contains(e.getId()); - } - }; + return new FilteredPartialNavigableSetView(super.getInternalFixes().descendingSet(), new RevokedValidator(revokedEventIds)); } @Override @@ -375,14 +365,14 @@ extends TrackImpl implements AbstractLog { unlockAfterWrite(); } } - + @Override public void revokeEvent(AbstractLogEventAuthor author, EventT toRevoke) throws NotRevokableException { revokeEvent(author, toRevoke, null); } - + protected abstract EventT createRevokeEvent(AbstractLogEventAuthor author, EventT toRevoke, String reason); - + @Override public void revokeEvent(AbstractLogEventAuthor author, EventT toRevoke, String reason) throws NotRevokableException { if (toRevoke == null) { @@ -392,4 +382,45 @@ extends TrackImpl implements AbstractLog { checkIfSuccessfullyRevokes((RevokeEvent) revokeEvent); add(revokeEvent); } + + public interface NavigableSetViewValidator { + boolean isValid(T item); + } + + public static class RevokedValidator, VisitorT> implements NavigableSetViewValidator { + final Set revokedEventIds; + + public RevokedValidator(Set revokedEventIds) { + this.revokedEventIds = revokedEventIds; + } + + @Override + public boolean isValid(EventT item) { + return !(item instanceof RevokeEvent) && !revokedEventIds.contains(item.getId()); + } + } + + public static class FilteredPartialNavigableSetView extends PartialNavigableSetView { + private final List> validators; + + public FilteredPartialNavigableSetView(NavigableSet set, final List> validators) { + super(set); + this.validators = validators; + } + + public FilteredPartialNavigableSetView(NavigableSet set, final NavigableSetViewValidator... validators) { + super(set); + this.validators = Arrays.asList(validators); + } + + @Override + protected boolean isValid(T t) { + for (NavigableSetViewValidator validator : validators) { + if (!validator.isValid(t)) { + return false; + } + } + return true; + } + } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLog.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLog.java index 84199147b1f..bd136ad5575 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLog.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLog.java @@ -1,18 +1,33 @@ package com.sap.sailing.domain.abstractlog.race; import com.sap.sailing.domain.abstractlog.AbstractLog; +import com.sap.sailing.domain.abstractlog.impl.AbstractLogImpl; import com.sap.sse.common.WithID; /** -* "Fix" validity is decided based on the {@link #getCurrentPassId() current pass}. The validity is not cached. -*/ + * "Fix" validity is decided based on the {@link #getCurrentPassId() current pass}. The validity is not cached. + */ public interface RaceLog extends AbstractLog, WithID { public static final int DefaultPassId = 0; - + + class PassValidator implements AbstractLogImpl.NavigableSetViewValidator { + final int pass; + + public PassValidator(int pass) { + this.pass = pass; + } + + @Override + public boolean isValid(RaceLogEvent item) { + return item.getPassId() == pass; + } + } + /** * Gets the current pass id. - * + * * @return the pass id. */ int getCurrentPassId(); + } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/FinishingTimeFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/FinishingTimeFinder.java index dc43b0f9313..25d5c1b4cc0 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/FinishingTimeFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/FinishingTimeFinder.java @@ -15,7 +15,7 @@ public class FinishingTimeFinder extends RaceLogAnalyzer { public RaceLogRaceStatusEvent findFinishingEvent() { log.lockForRead(); try { - for (RaceLogEvent event : getPassEventsDescending()) { + for (RaceLogEvent event : getPassUnrevokedEventsDescending()) { if (event instanceof RaceLogRaceStatusEvent) { RaceLogRaceStatusEvent statusEvent = (RaceLogRaceStatusEvent) event; if (statusEvent.getNextStatus().equals(RaceLogRaceStatus.FINISHING)) { @@ -31,7 +31,7 @@ public class FinishingTimeFinder extends RaceLogAnalyzer { @Override protected TimePoint performAnalysis() { - for (RaceLogEvent event : log.getUnrevokedEventsDescending()) { + for (RaceLogEvent event : getPassUnrevokedEventsDescending()) { if (event instanceof RaceLogRaceStatusEvent) { RaceLogRaceStatusEvent statusEvent = (RaceLogRaceStatusEvent) event; if (statusEvent.getNextStatus().equals(RaceLogRaceStatus.FINISHING)) { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceLogAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceLogAnalyzer.java index aeaf179fb2d..5d8ca4bd8c1 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceLogAnalyzer.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceLogAnalyzer.java @@ -1,12 +1,13 @@ package com.sap.sailing.domain.abstractlog.race.analyzing.impl; import com.sap.sailing.domain.abstractlog.BaseLogAnalyzer; +import com.sap.sailing.domain.abstractlog.impl.AbstractLogImpl; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; public abstract class RaceLogAnalyzer extends BaseLogAnalyzer - { + { public RaceLogAnalyzer(RaceLog raceLog) { super(raceLog); @@ -15,8 +16,16 @@ public abstract class RaceLogAnalyzer extends BaseLogAnalyzer protected Iterable getPassEvents() { return log.getFixes(); } - + protected Iterable getPassEventsDescending() { return log.getFixesDescending(); } + + protected Iterable getPassUnrevokedEvents() { + return new AbstractLogImpl.FilteredPartialNavigableSetView<>(log.getUnrevokedEvents(), new RaceLog.PassValidator(log.getCurrentPassId())); + } + + protected Iterable getPassUnrevokedEventsDescending() { + return new AbstractLogImpl.FilteredPartialNavigableSetView<>(log.getUnrevokedEventsDescending(), new RaceLog.PassValidator(log.getCurrentPassId())); + } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceStatusAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceStatusAnalyzer.java index ae4b65c7cf1..f025c5f35f6 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceStatusAnalyzer.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceStatusAnalyzer.java @@ -59,7 +59,7 @@ public class RaceStatusAnalyzer extends RaceLogAnalyzer performAnalysis() { ArrayListNavigableSet statusEvents = new ArrayListNavigableSet<>( RaceLogRaceStatusEventComparator.INSTANCE); - for (RaceLogEvent event : getPassEvents()) { + for (RaceLogEvent event : getPassUnrevokedEvents()) { if (event instanceof RaceLogRaceStatusEvent) { statusEvents.add((RaceLogRaceStatusEvent) event); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogImpl.java index 290bbea15e9..cc9812a9a16 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogImpl.java @@ -59,11 +59,8 @@ public class RaceLogImpl extends AbstractLogImpl getInternalFixes() { - return new PartialNavigableSetView(super.getInternalFixes()) { - @Override - protected boolean isValid(RaceLogEvent e) { - return e.getPassId() == getCurrentPassId(); - } - }; + return new FilteredPartialNavigableSetView<>(super.getInternalFixes(),new PassValidator(getCurrentPassId())); } + + } diff --git a/mobile/com.sap.sailing.racecommittee.app/res/layout-hdpi/race_finishing.xml b/mobile/com.sap.sailing.racecommittee.app/res/layout-hdpi/race_finishing.xml index 3e2a5c29e65..17fc754806a 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/layout-hdpi/race_finishing.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/layout-hdpi/race_finishing.xml @@ -46,8 +46,9 @@ android:layout_margin="@dimen/default_margin_half" android:src="?attr/arrow_down_normal"/> - - + + + \ No newline at end of file diff --git a/mobile/com.sap.sailing.racecommittee.app/res/layout/race_finishing.xml b/mobile/com.sap.sailing.racecommittee.app/res/layout/race_finishing.xml index 2ad707d0305..b4cd9e0a43a 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/layout/race_finishing.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/layout/race_finishing.xml @@ -1,9 +1,9 @@ + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + tools:src="@drawable/flag_blue_96dp" /> + android:textSize="@dimen/finishing_text_size" /> + android:textSize="@dimen/finishing_text_size" /> - - + + + \ No newline at end of file diff --git a/mobile/com.sap.sailing.racecommittee.app/res/layout/race_revoke_finishing_button_xlarge.xml b/mobile/com.sap.sailing.racecommittee.app/res/layout/race_revoke_finishing_button_xlarge.xml new file mode 100644 index 00000000000..308cf786643 --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/res/layout/race_revoke_finishing_button_xlarge.xml @@ -0,0 +1,10 @@ + +
    exte e -> editRolesAndPermissionsForUserButton.setEnabled(!userNameTextbox.getText().isEmpty())); editRolesAndPermissionsForUserButton.setEnabled(false); userSelectionModel = userList.getSelectionModel(); - final Button deleteButton = buttonPanel.addRemoveAction(userList.getSelectionModel(), stringMessages.remove(), - () -> { - assert userSelectionModel.getSelectedSet().size() > 0; - final Set usersToDelete = new HashSet<>(); - final Set usernamesToDelete = new HashSet<>(); - for (UserDTO userToDelete : userSelectionModel.getSelectedSet()) { - usersToDelete.add(userToDelete); - usernamesToDelete.add(userToDelete.getName()); + buttonPanel.addRemoveAction(userList.getSelectionModel(), stringMessages.remove(), () -> { + assert userSelectionModel.getSelectedSet().size() > 0; + final Set usersToDelete = new HashSet<>(); + final Set usernamesToDelete = new HashSet<>(); + for (UserDTO userToDelete : userSelectionModel.getSelectedSet()) { + usersToDelete.add(userToDelete); + usernamesToDelete.add(userToDelete.getName()); + } + if (Window.confirm(usernamesToDelete.size() == 1 + ? stringMessages.doYouReallyWantToDeleteUser(usernamesToDelete.iterator().next()) + : stringMessages.doYouReallyWantToDeleteNUsers(usernamesToDelete.size()))) { + userManagementService.deleteUsers(usernamesToDelete, new AsyncCallback>() { + @Override + public void onSuccess(Set result) { + for (UserDTO userToDelete : usersToDelete) { + for (UserDeletedEventHandler userDeletedHandler : userDeletedHandlers) { + userDeletedHandler.onUserDeleted(userToDelete); + } + } + for (SuccessInfo successInfo : result) { + Notification.notify(successInfo.getMessage(), NotificationType.SUCCESS); + } } - if (Window.confirm(usernamesToDelete.size() == 1 - ? stringMessages.doYouReallyWantToDeleteUser(usernamesToDelete.iterator().next()) - : stringMessages.doYouReallyWantToDeleteNUsers(usernamesToDelete.size()))) { - userManagementService.deleteUsers(usernamesToDelete, new AsyncCallback>() { - @Override - public void onSuccess(Set result) { - for (UserDTO userToDelete : usersToDelete) { - for (UserDeletedEventHandler userDeletedHandler : userDeletedHandlers) { - userDeletedHandler.onUserDeleted(userToDelete); - } - } - for (SuccessInfo successInfo : result) { - Notification.notify(successInfo.getMessage(), NotificationType.SUCCESS); - } - } - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError(stringMessages - .errorDeletingUser(usernamesToDelete.iterator().next(), caught.getMessage())); - } - }); + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError(stringMessages.errorDeletingUser(usernamesToDelete.iterator().next(), + caught.getMessage())); } }); - deleteButton.setEnabled(userSelectionModel.getSelectedSet().size() >= 1); + } + }); ScrollPanel scrollPanel = new ScrollPanel(userList.asWidget()); LabeledAbstractFilterablePanel filterBox = userList.getFilterField(); filterBox.getElement().setPropertyString("placeholder", stringMessages.filterUsers()); From cc1d9ca1519a956480a2736d94ba6e5f28d705eb Mon Sep 17 00:00:00 2001 From: dmitry Date: Fri, 10 Apr 2020 22:08:33 +0300 Subject: [PATCH 102/188] bug5178: fixed review remarks --- .../DeviceConfigurationPanel.java | 20 +++--- .../ui/adminconsole/EventListComposite.java | 1 - .../ui/adminconsole/IgtimiAccountsPanel.java | 1 - .../adminconsole/LeaderboardConfigPanel.java | 1 - .../LeaderboardGroupConfigPanel.java | 1 - .../adminconsole/RegattaManagementPanel.java | 1 - .../RemoteServerInstancesManagementPanel.java | 17 ++--- .../ResultImportUrlsListComposite.java | 1 - .../TrackedRacesListComposite.java | 41 ++++++----- .../coursecreation/CourseTemplatePanel.java | 71 +++++++++---------- .../coursecreation/MarkPropertiesPanel.java | 70 +++++++++--------- .../component/RoleDefinitionsPanel.java | 5 +- .../SelectedElementsCountingButton.java | 2 + .../component/UserGroupManagementPanel.java | 2 - 14 files changed, 110 insertions(+), 124 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationPanel.java index 011d9c990ee..e7e2284c0a1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationPanel.java @@ -26,6 +26,7 @@ import com.sap.sse.gwt.client.async.MarkedAsyncCallback; import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel; import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback; import com.sap.sse.security.ui.client.UserService; +import com.sap.sse.security.ui.client.component.SelectedElementsCountingButton; public class DeviceConfigurationPanel extends SimplePanel implements DeviceConfigurationDetailComposite.DeviceConfigurationFactory { private final SailingServiceAsync sailingService; @@ -47,8 +48,9 @@ public class DeviceConfigurationPanel extends SimplePanel implements DeviceConfi this.userService = userService; this.stringMessages = stringMessages; this.errorReporter = reporter; - setupUi(); + listComposite = new DeviceConfigurationListComposite(sailingService, errorReporter, stringMessages, userService); refreshableMultiSelectionModel = listComposite.getSelectionModel(); + setupUi(); refreshableMultiSelectionModel.addSelectionChangeHandler(new Handler() { @Override public void onSelectionChange(SelectionChangeEvent event) { @@ -88,14 +90,15 @@ public class DeviceConfigurationPanel extends SimplePanel implements DeviceConfi if (userService.hasCreatePermission(SecuredDomainType.RACE_MANAGER_APP_DEVICE_CONFIGURATION)) { deviceManagementControlPanel.add(addConfigurationButton); } - removeConfigurationButton = new Button(stringMessages.remove()); + removeConfigurationButton = new SelectedElementsCountingButton( + refreshableMultiSelectionModel, stringMessages.remove(), new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + removeConfiguration(); + } + }); removeConfigurationButton.setEnabled(false); - removeConfigurationButton.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - removeConfiguration(); - } - }); deviceManagementControlPanel.add(removeConfigurationButton); refreshConfigurationsButton = new Button(stringMessages.refresh()); refreshConfigurationsButton.addClickHandler(new ClickHandler() { @@ -111,7 +114,6 @@ public class DeviceConfigurationPanel extends SimplePanel implements DeviceConfi private void setupConfigurationPanels(VerticalPanel mainPanel) { Grid grid = new Grid(1 ,2); mainPanel.add(grid); - listComposite = new DeviceConfigurationListComposite(sailingService, errorReporter, stringMessages, userService); grid.setWidget(0, 0, listComposite); grid.getRowFormatter().setVerticalAlign(0, HasVerticalAlignment.ALIGN_TOP); grid.getColumnFormatter().getElement(1).getStyle().setPaddingTop(2.0, Unit.EM); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java index 14d4c5b41ee..ad7e4f49f68 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java @@ -184,7 +184,6 @@ public class EventListComposite extends Composite implements EventsRefresher, Le return Window.confirm(stringMessages.doYouReallyWantToRemoveEvents()); } }); - remove.setEnabled(false); remove.ensureDebugId("RemoveEventsButton"); this.refreshableEventSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/IgtimiAccountsPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/IgtimiAccountsPanel.java index 12eedcbbfb0..db88713658d 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/IgtimiAccountsPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/IgtimiAccountsPanel.java @@ -144,7 +144,6 @@ public class IgtimiAccountsPanel extends FlowPanel { } } }); - removeAccountButton.setEnabled(false); refreshableAccountsSelectionModel.addSelectionChangeHandler( e -> removeAccountButton.setEnabled(refreshableAccountsSelectionModel.getSelectedSet().size() > 0)); add(controlsPanel); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java index 75c445f3682..28d5c25e393 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java @@ -184,7 +184,6 @@ public class LeaderboardConfigPanel extends AbstractLeaderboardConfigPanel } }); leaderboardRemoveButton.ensureDebugId("LeaderboardsRemoveButton"); - leaderboardRemoveButton.setEnabled(false); } @Override 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 08b0f1bc3ab..7c51d96462c 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 @@ -674,7 +674,6 @@ public class LeaderboardGroupConfigPanel extends AbstractRegattaPanel } }); removeButton.ensureDebugId("RemoveLeaderboardButton"); - removeButton.setEnabled(false); refreshableGroupsSelectionModel.addSelectionChangeHandler(event -> groupSelectionChanged()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaManagementPanel.java index 463e6c0e4f6..b2c2396afd8 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaManagementPanel.java @@ -98,7 +98,6 @@ public class RegattaManagementPanel extends SimplePanel implements RegattasDispl return Window.confirm(stringMessages.doYouReallyWantToRemoveRegattas()); } }); - remove.setEnabled(false); regattasContentPanel.add(buttonPanel); refreshableRegattaMultiSelectionModel.addSelectionChangeHandler(new Handler() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RemoteServerInstancesManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RemoteServerInstancesManagementPanel.java index a0737083725..b49d7c3e4ea 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RemoteServerInstancesManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RemoteServerInstancesManagementPanel.java @@ -38,6 +38,7 @@ import com.sap.sse.gwt.client.celltable.EntityIdentityComparator; import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel; import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback; import com.sap.sse.gwt.client.panels.LabeledAbstractFilterablePanel; +import com.sap.sse.security.ui.client.component.SelectedElementsCountingButton; public class RemoteServerInstancesManagementPanel extends SimplePanel { private final SailingServiceAsync sailingService; @@ -112,14 +113,14 @@ public class RemoteServerInstancesManagementPanel extends SimplePanel { } }); - Button removeButton = new Button(stringMessages.remove()); - buttonPanel.add(removeButton); - removeButton.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - removeSelectedSailingServers(); - } - }); + buttonPanel.add(new SelectedElementsCountingButton<>(refreshableServerSelectionModel, stringMessages.remove(), + new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + removeSelectedSailingServers(); + } + })); Button refreshButton = new Button(stringMessages.refresh()); buttonPanel.add(refreshButton); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/ResultImportUrlsListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/ResultImportUrlsListComposite.java index a5ea400265f..cdf3c5d7396 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/ResultImportUrlsListComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/ResultImportUrlsListComposite.java @@ -87,7 +87,6 @@ public class ResultImportUrlsListComposite extends Composite { } } }); - remove.setEnabled(false); table.getSelectionModel().addSelectionChangeHandler(new Handler() { @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java index f22bc8814ca..3beaedc3864 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java @@ -29,6 +29,7 @@ import com.sap.sse.gwt.client.shared.components.SettingsDialog; import com.sap.sse.gwt.client.shared.settings.ComponentContext; import com.sap.sse.security.shared.HasPermissions.DefaultActions; import com.sap.sse.security.ui.client.UserService; +import com.sap.sse.security.ui.client.component.SelectedElementsCountingButton; /** * Shows the currently tracked events/races in a table. Updated if subscribed as an {@link RegattasDisplayer}, e.g., with @@ -145,26 +146,28 @@ public class TrackedRacesListComposite extends AbstractTrackedRacesListComposite }); btnExport.setEnabled(false); trackedRacesButtonPanel.add(btnExport); - - btnRemoveRace = new Button(stringMessages.remove()); - btnRemoveRace.ensureDebugId("RemoveRaceButton"); - btnRemoveRace.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - if(askUserForConfirmation()){ - removeAndUntrackRaces(refreshableSelectionModel.getSelectedSet()); - } - } - private boolean askUserForConfirmation() { - if(refreshableSelectionModel.itemIsSelectedButNotVisible(raceTable.getVisibleItems())){ - final String trackedRaceNames = refreshableSelectionModel.getSelectedSet().stream().map(e -> e.getRegattaName()+" - "+e.getName()).collect(Collectors.joining("\n")); - return Window.confirm(stringMessages.doYouReallyWantToRemoveNonVisibleTrackedRaces(trackedRaceNames)); - } - return true; - } - - }); + btnRemoveRace = new SelectedElementsCountingButton(refreshableSelectionModel, + stringMessages.remove(), new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + if (askUserForConfirmation()) { + removeAndUntrackRaces(refreshableSelectionModel.getSelectedSet()); + } + } + + private boolean askUserForConfirmation() { + if (refreshableSelectionModel.itemIsSelectedButNotVisible(raceTable.getVisibleItems())) { + final String trackedRaceNames = refreshableSelectionModel.getSelectedSet().stream() + .map(e -> e.getRegattaName() + " - " + e.getName()) + .collect(Collectors.joining("\n")); + return Window.confirm( + stringMessages.doYouReallyWantToRemoveNonVisibleTrackedRaces(trackedRaceNames)); + } + return true; + } + }); + btnRemoveRace.ensureDebugId("RemoveRaceButton"); btnRemoveRace.setEnabled(false); trackedRacesButtonPanel.add(btnRemoveRace); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java index be2c290bab4..9f6b544b33b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java @@ -28,7 +28,6 @@ import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; -import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.view.client.CellPreviewEvent; @@ -116,49 +115,45 @@ public class CourseTemplatePanel extends FlowPanel { } }); - final Button removeButton = buttonAndFilterPanel.addRemoveAction(refreshableSelectionModel, - stringMessages.remove(), new Command() { + buttonAndFilterPanel.addRemoveAction(refreshableSelectionModel, stringMessages.remove(), new Command() { - @Override - public void execute() { - if (askUserForConfirmation()) { - removeCourseTemplates( - refreshableSelectionModel.getSelectedSet().stream().map(courseTemplateDTO -> { - return courseTemplateDTO.getUuid(); - }).collect(Collectors.toList())); + @Override + public void execute() { + if (askUserForConfirmation()) { + removeCourseTemplates(refreshableSelectionModel.getSelectedSet().stream().map(courseTemplateDTO -> { + return courseTemplateDTO.getUuid(); + }).collect(Collectors.toList())); + } + } + + private void removeCourseTemplates(Collection courseTemplatesUuids) { + if (!courseTemplatesUuids.isEmpty()) { + sailingService.removeCourseTemplates(courseTemplatesUuids, new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + errorReporter + .reportError("Error trying to remove course teamplates:" + caught.getMessage()); } - } - private void removeCourseTemplates(Collection courseTemplatesUuids) { - if (!courseTemplatesUuids.isEmpty()) { - sailingService.removeCourseTemplates(courseTemplatesUuids, new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError( - "Error trying to remove course teamplates:" + caught.getMessage()); - } - - @Override - public void onSuccess(Void result) { - refreshCourseTemplates(); - } - }); + @Override + public void onSuccess(Void result) { + refreshCourseTemplates(); } - } + }); + } + } - private boolean askUserForConfirmation() { - if (refreshableSelectionModel - .itemIsSelectedButNotVisible(courseTemplateTable.getVisibleItems())) { - final String markRolesNames = refreshableSelectionModel.getSelectedSet().stream() - .map(CourseTemplateDTO::getName).collect(Collectors.joining("\n")); - return Window.confirm( - stringMessages.doYouReallyWantToRemoveNonVisibleCourseTemplates(markRolesNames)); - } - return Window.confirm(stringMessages.doYouReallyWantToRemoveCourseTemplates()); - } - }); + private boolean askUserForConfirmation() { + if (refreshableSelectionModel.itemIsSelectedButNotVisible(courseTemplateTable.getVisibleItems())) { + final String markRolesNames = refreshableSelectionModel.getSelectedSet().stream() + .map(CourseTemplateDTO::getName).collect(Collectors.joining("\n")); + return Window + .confirm(stringMessages.doYouReallyWantToRemoveNonVisibleCourseTemplates(markRolesNames)); + } + return Window.confirm(stringMessages.doYouReallyWantToRemoveCourseTemplates()); + } + }); - removeButton.setEnabled(false); buttonAndFilterPanel.addUnsecuredWidget(lblFilterRaces); buttonAndFilterPanel.addUnsecuredWidget(filterableCourseTemplatePanel); filterableCourseTemplatePanel diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java index 035cc1c9a79..e6aea825473 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java @@ -32,7 +32,6 @@ import com.google.gwt.user.client.Command; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.AbstractImagePrototype; -import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.view.client.CellPreviewEvent; @@ -123,48 +122,43 @@ public class MarkPropertiesPanel extends FlowPanel { openEditMarkPropertiesDialog(new MarkPropertiesDTO()); } }); - final Button removeButton = buttonAndFilterPanel.addRemoveAction(refreshableSelectionModel, - stringMessages.remove(), new Command() { + buttonAndFilterPanel.addRemoveAction(refreshableSelectionModel, stringMessages.remove(), new Command() { - @Override - public void execute() { - if (askUserForConfirmation()) { - removeMarkProperties( - refreshableSelectionModel.getSelectedSet().stream().map(markPropertiesDTO -> { - return markPropertiesDTO.getUuid(); - }).collect(Collectors.toList())); + @Override + public void execute() { + if (askUserForConfirmation()) { + removeMarkProperties(refreshableSelectionModel.getSelectedSet().stream().map(markPropertiesDTO -> { + return markPropertiesDTO.getUuid(); + }).collect(Collectors.toList())); + } + } + + private void removeMarkProperties(Collection markPropertiesUuids) { + if (!markPropertiesUuids.isEmpty()) { + sailingService.removeMarkProperties(markPropertiesUuids, new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError("Error trying to remove mark properties:" + caught.getMessage()); } - } - private void removeMarkProperties(Collection markPropertiesUuids) { - if (!markPropertiesUuids.isEmpty()) { - sailingService.removeMarkProperties(markPropertiesUuids, new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError( - "Error trying to remove mark properties:" + caught.getMessage()); - } - - @Override - public void onSuccess(Void result) { - refreshMarkProperties(); - } - }); + @Override + public void onSuccess(Void result) { + refreshMarkProperties(); } - } + }); + } + } - private boolean askUserForConfirmation() { - if (refreshableSelectionModel - .itemIsSelectedButNotVisible(markPropertiesTable.getVisibleItems())) { - final String markPropertiesNames = refreshableSelectionModel.getSelectedSet().stream() - .map(MarkPropertiesDTO::getName).collect(Collectors.joining("\n")); - return Window.confirm(stringMessages - .doYouReallyWantToRemoveNonVisibleMarkProperties(markPropertiesNames)); - } - return Window.confirm(stringMessages.doYouReallyWantToRemoveSeveralMarkProperties()); - } - }); - removeButton.setEnabled(false); + private boolean askUserForConfirmation() { + if (refreshableSelectionModel.itemIsSelectedButNotVisible(markPropertiesTable.getVisibleItems())) { + final String markPropertiesNames = refreshableSelectionModel.getSelectedSet().stream() + .map(MarkPropertiesDTO::getName).collect(Collectors.joining("\n")); + return Window.confirm( + stringMessages.doYouReallyWantToRemoveNonVisibleMarkProperties(markPropertiesNames)); + } + return Window.confirm(stringMessages.doYouReallyWantToRemoveSeveralMarkProperties()); + } + }); buttonAndFilterPanel.addUnsecuredWidget(lblFilterRaces); filterableMarkProperties.getTextBox().ensureDebugId("MarkPropertiesFilterTextBox"); buttonAndFilterPanel.addUnsecuredWidget(filterableMarkProperties); diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/RoleDefinitionsPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/RoleDefinitionsPanel.java index e423c1b91bf..918d46fa9d0 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/RoleDefinitionsPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/RoleDefinitionsPanel.java @@ -25,7 +25,6 @@ import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler; import com.google.gwt.user.cellview.client.TextColumn; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; -import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.view.client.ListDataProvider; @@ -103,8 +102,7 @@ public class RoleDefinitionsPanel extends VerticalPanel { buttonPanel.addUnsecuredAction(stringMessages.refresh(), this::updateRoleDefinitions); buttonPanel.addCreateActionWithoutServerCreateObjectPermissionCheck(stringMessages.add(), this::createRoleDefinition); - Button removeButton = buttonPanel.addRemoveAction(refreshableRoleDefinitionMultiSelectionModel, - stringMessages.remove(), () -> { + buttonPanel.addRemoveAction(refreshableRoleDefinitionMultiSelectionModel, stringMessages.remove(), () -> { final String roles = String.join(", ", Util.map(getSelectedRoleDefinitions(), RoleDefinitionDTO::getName)); if (Window.confirm(stringMessages.doYouReallyWantToRemoveRole(roles))) { final Set selectedRoles = new HashSet<>(getSelectedRoleDefinitions()); @@ -112,7 +110,6 @@ public class RoleDefinitionsPanel extends VerticalPanel { } }); - removeButton.setEnabled(false); add(buttonPanel); add(filterablePanelRoleDefinitions); add(roleDefinitionsTable); diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/SelectedElementsCountingButton.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/SelectedElementsCountingButton.java index 5c814808327..1facc99acca 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/SelectedElementsCountingButton.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/SelectedElementsCountingButton.java @@ -18,9 +18,11 @@ public class SelectedElementsCountingButton extends Button { public SelectedElementsCountingButton(final SetSelectionModel selectionModel, final @IsSafeHtml String html, final ClickHandler handler) { super(html, handler); + setEnabled(false); selectionModel.addSelectionChangeHandler(event -> { Set selectedSet = selectionModel.getSelectedSet(); setText(selectedSet.size() <= 1 ? html : html + " (" + selectedSet.size() + ")"); + setEnabled(!selectedSet.isEmpty()); }); } diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupManagementPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupManagementPanel.java index 48ec19bc660..4c21536f843 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupManagementPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupManagementPanel.java @@ -101,9 +101,7 @@ public class UserGroupManagementPanel extends Composite { } } }); - removeButton.setEnabled(false); userGroupSelectionModel.addSelectionChangeHandler(event -> { - removeButton.setText(stringMessages.remove() + " (" + userGroupSelectionModel.getSelectedSet().size() + ")"); removeButton.setEnabled(userGroupSelectionModel.getSelectedSet().size() >= 1); }); return buttonPanel; From 5f7d43666091cb94cfc8eb2f5932d0fb2ec45d32 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Sat, 11 Apr 2020 00:20:05 +0200 Subject: [PATCH 103/188] bug5178: fixing issues with the remove button creation and removed redundant listeners --- .../adminconsole/LeaderboardConfigPanel.java | 1 - .../LeaderboardGroupConfigPanel.java | 1 - .../adminconsole/RegattaManagementPanel.java | 1 - .../coursecreation/CourseTemplatePanel.java | 1 - .../coursecreation/MarkPropertiesPanel.java | 1 - .../AccessControlledButtonPanel.java | 39 ++++++++++--------- .../SelectedElementsCountingButton.java | 6 +-- .../component/UserGroupManagementPanel.java | 6 +-- 8 files changed, 25 insertions(+), 31 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java index 28d5c25e393..a529ac37398 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java @@ -165,7 +165,6 @@ public class LeaderboardConfigPanel extends AbstractLeaderboardConfigPanel createRegattaLeaderboardWithEliminationsBtn.ensureDebugId("CreateRegattaLeaderboardWithEliminationsButton"); leaderboardRemoveButton = buttonPanel.addRemoveAction(leaderboardSelectionModel, stringMessages.remove(), new Command() { - @Override public void execute() { if (askUserForConfirmation()) { 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 7c51d96462c..76fe4e3da94 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 @@ -654,7 +654,6 @@ public class LeaderboardGroupConfigPanel extends AbstractRegattaPanel removeButton = buttonPanel.addRemoveAction(refreshableGroupsSelectionModel, stringMessages.remove(), new Command() { - @Override public void execute() { if (askUserForConfirmation()) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaManagementPanel.java index b2c2396afd8..0e47dd03b8d 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaManagementPanel.java @@ -78,7 +78,6 @@ public class RegattaManagementPanel extends SimplePanel implements RegattasDispl create.ensureDebugId("AddRegattaButton"); final Button remove = buttonPanel.addRemoveAction(refreshableRegattaMultiSelectionModel, stringMessages.remove(), new Command() { - @Override public void execute() { if (askUserForConfirmation()) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java index 9f6b544b33b..733adeedc22 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java @@ -116,7 +116,6 @@ public class CourseTemplatePanel extends FlowPanel { }); buttonAndFilterPanel.addRemoveAction(refreshableSelectionModel, stringMessages.remove(), new Command() { - @Override public void execute() { if (askUserForConfirmation()) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java index e6aea825473..9c0bf6e4f8f 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java @@ -123,7 +123,6 @@ public class MarkPropertiesPanel extends FlowPanel { } }); buttonAndFilterPanel.addRemoveAction(refreshableSelectionModel, stringMessages.remove(), new Command() { - @Override public void execute() { if (askUserForConfirmation()) { diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java index ddaa68468a3..1fce9129186 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java @@ -3,6 +3,7 @@ package com.sap.sse.security.ui.client.component; import java.util.HashMap; import java.util.Map; import java.util.function.BiConsumer; +import java.util.function.Function; import java.util.function.Supplier; import com.google.gwt.dom.client.Style.Unit; @@ -13,7 +14,6 @@ import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Widget; -import com.google.gwt.view.client.SetSelectionModel; import com.sap.sse.gwt.client.celltable.RefreshableSelectionModel; import com.sap.sse.security.shared.HasPermissions; import com.sap.sse.security.ui.client.UserService; @@ -108,7 +108,10 @@ public class AccessControlledButtonPanel extends Composite { * {@link HasPermissions type} provided in this {@link AccessControlledButtonPanel}'s constructor. * * @param selectionModel - * the {@link RefreshableSelectionModel}selection model of the table + * the {@link RefreshableSelectionModel selection model} of the table; used + * to enable/disable the remove button when the selection becomes non-empty/empty, + * respectively and to display the number of elements selected in case the selection + * contains more than one element * @param text * the {@link String text} to show on the button * @param callback @@ -117,7 +120,10 @@ public class AccessControlledButtonPanel extends Composite { */ public Button addRemoveAction(RefreshableSelectionModel selectionModel, final String text, final Command callback) { - return addAction(selectionModel, text, removePermissionCheck, callback); + if (selectionModel == null) { + throw new IllegalArgumentException("Selection model for a remove action must not be null"); + } + return addAction(handler->new SelectedElementsCountingButton(selectionModel, text, handler), removePermissionCheck, callback); } /** @@ -147,18 +153,16 @@ public class AccessControlledButtonPanel extends Composite { * @return the created {@link Button} instance */ public Button addAction(final String text, final Supplier permissionCheck, final Command callback) { - return addAction(null, text, permissionCheck, callback); + return addAction(handler->new Button(text, handler), permissionCheck, callback); } /** * Adds an action button, which's visibility depends on the provided {@link Supplier permission check} * - * @param selectionModel - * the {@link RefreshableSelectionModel} selection model. If actual object is passed then instance of - * {@link SelectedElementsCountingButton} is created. If null is passed then native gwt {@link Button} is - * created. - * @param text - * the {@link String text} to show on the button + * @param buttonContructor + * called with the click handler which is based on the {@code callback} to produce + * the button to show; the resulting remove button will be wired with the {@code callback} + * for its click handler. * @param permissionCheck * the {@link Supplier permission check} to decide if the action button is visible or not * @param callback @@ -167,16 +171,15 @@ public class AccessControlledButtonPanel extends Composite { * type of DTO objects which are selected * @return the {@link Button} instance */ - private Button addAction(final SetSelectionModel selectionModel, final String text, + private Button addAction(final Function buttonConstructor, final Supplier permissionCheck, final Command callback) { ClickHandler handler = wrap(permissionCheck, callback); - final Button button = selectionModel == null ? new Button(text, handler) - : new SelectedElementsCountingButton(selectionModel, text, handler); - this.buttonToPermissions.put(button, permissionCheck); - button.getElement().getStyle().setMarginRight(5, Unit.PX); - this.panel.add(button); - this.visibilityUpdater.accept(button, permissionCheck); - return button; + final Button removeButton = buttonConstructor.apply(handler); + this.buttonToPermissions.put(removeButton, permissionCheck); + removeButton.getElement().getStyle().setMarginRight(5, Unit.PX); + this.panel.add(removeButton); + this.visibilityUpdater.accept(removeButton, permissionCheck); + return removeButton; } private ClickHandler wrap(Supplier permissionCheck, Command callback) { diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/SelectedElementsCountingButton.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/SelectedElementsCountingButton.java index 1facc99acca..3fb4352855e 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/SelectedElementsCountingButton.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/SelectedElementsCountingButton.java @@ -9,7 +9,8 @@ import java.util.Set; /** * The implementation of Button which re-draws it's label based on SelectionEvent with showing the number of selected - * items. If number of selected items is <= 1 then no number is shown + * items. If number of selected items is <= 1 then no number is shown. The button's enablement state depends on whether + * the selection is empty or not. It will be shown disabled for an empty selection, also upon first creation. * * @author Dmitry Bilyk * @@ -18,12 +19,11 @@ public class SelectedElementsCountingButton extends Button { public SelectedElementsCountingButton(final SetSelectionModel selectionModel, final @IsSafeHtml String html, final ClickHandler handler) { super(html, handler); - setEnabled(false); + setEnabled(!selectionModel.getSelectedSet().isEmpty()); selectionModel.addSelectionChangeHandler(event -> { Set selectedSet = selectionModel.getSelectedSet(); setText(selectedSet.size() <= 1 ? html : html + " (" + selectedSet.size() + ")"); setEnabled(!selectedSet.isEmpty()); }); - } } diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupManagementPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupManagementPanel.java index 4c21536f843..22801e071d7 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupManagementPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupManagementPanel.java @@ -8,7 +8,6 @@ import java.util.Map.Entry; import java.util.Set; import com.google.gwt.user.client.Window; -import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.CaptionPanel; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HorizontalPanel; @@ -71,7 +70,7 @@ public class UserGroupManagementPanel extends Composite { buttonPanel.addCreateActionWithoutServerCreateObjectPermissionCheck(stringMessages.createUserGroup(), () -> new CreateUserGroupDialog(stringMessages, userService, userManagementService, userGroupListDataProvider, () -> updateUserGroups()).show()); - final Button removeButton = buttonPanel.addRemoveAction(userGroupSelectionModel, stringMessages.removeUserGroup(), () -> { + buttonPanel.addRemoveAction(userGroupSelectionModel, stringMessages.removeUserGroup(), () -> { Set userGroups = userGroupTableWrapper.getSelectionModel().getSelectedSet(); if (userGroups == null || userGroups.isEmpty()) { Window.alert(stringMessages.youHaveToSelectAUserGroup()); @@ -101,9 +100,6 @@ public class UserGroupManagementPanel extends Composite { } } }); - userGroupSelectionModel.addSelectionChangeHandler(event -> { - removeButton.setEnabled(userGroupSelectionModel.getSelectedSet().size() >= 1); - }); return buttonPanel; } From 8c388b189369189396887b2bb3eeecf1317b90e0 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Sat, 11 Apr 2020 00:44:08 +0200 Subject: [PATCH 104/188] bug5178: lambda simplifications, single point of exit pattern --- .../coursecreation/CourseTemplatePanel.java | 16 +++++++--------- .../coursecreation/MarkPropertiesPanel.java | 18 +++++++----------- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java index 733adeedc22..72121ee5a07 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java @@ -83,7 +83,6 @@ public class CourseTemplatePanel extends FlowPanel { allCourseTemplates = new ArrayList<>(); Label lblFilterRaces = new Label(stringMessages.filterCourseTemplateByName() + ":"); lblFilterRaces.setWordWrap(false); - this.filterableCourseTemplatePanel = new LabeledAbstractFilterablePanel(lblFilterRaces, allCourseTemplates, courseTemplateListDataProvider, stringMessages) { @Override @@ -102,7 +101,6 @@ public class CourseTemplatePanel extends FlowPanel { filterableCourseTemplatePanel.getTextBox().ensureDebugId("CourseTemplateFilterTextBox"); createCourseTemplateTable(userService); buttonAndFilterPanel.addUnsecuredAction(stringMessages.refresh(), new Command() { - @Override public void execute() { loadCourseTemplates(); @@ -114,14 +112,12 @@ public class CourseTemplatePanel extends FlowPanel { openEditCourseTemplateDialog(new CourseTemplateDTO(), userService, true); } }); - buttonAndFilterPanel.addRemoveAction(refreshableSelectionModel, stringMessages.remove(), new Command() { @Override public void execute() { if (askUserForConfirmation()) { - removeCourseTemplates(refreshableSelectionModel.getSelectedSet().stream().map(courseTemplateDTO -> { - return courseTemplateDTO.getUuid(); - }).collect(Collectors.toList())); + removeCourseTemplates(refreshableSelectionModel.getSelectedSet().stream().map( + courseTemplateDTO -> courseTemplateDTO.getUuid()).collect(Collectors.toList())); } } @@ -143,16 +139,18 @@ public class CourseTemplatePanel extends FlowPanel { } private boolean askUserForConfirmation() { + final boolean result; if (refreshableSelectionModel.itemIsSelectedButNotVisible(courseTemplateTable.getVisibleItems())) { final String markRolesNames = refreshableSelectionModel.getSelectedSet().stream() .map(CourseTemplateDTO::getName).collect(Collectors.joining("\n")); - return Window + result = Window .confirm(stringMessages.doYouReallyWantToRemoveNonVisibleCourseTemplates(markRolesNames)); + } else { + result = Window.confirm(stringMessages.doYouReallyWantToRemoveCourseTemplates()); } - return Window.confirm(stringMessages.doYouReallyWantToRemoveCourseTemplates()); + return result; } }); - buttonAndFilterPanel.addUnsecuredWidget(lblFilterRaces); buttonAndFilterPanel.addUnsecuredWidget(filterableCourseTemplatePanel); filterableCourseTemplatePanel diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java index 9c0bf6e4f8f..caf0647b251 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java @@ -126,9 +126,8 @@ public class MarkPropertiesPanel extends FlowPanel { @Override public void execute() { if (askUserForConfirmation()) { - removeMarkProperties(refreshableSelectionModel.getSelectedSet().stream().map(markPropertiesDTO -> { - return markPropertiesDTO.getUuid(); - }).collect(Collectors.toList())); + removeMarkProperties(refreshableSelectionModel.getSelectedSet().stream().map( + markPropertiesDTO -> markPropertiesDTO.getUuid()).collect(Collectors.toList())); } } @@ -149,13 +148,16 @@ public class MarkPropertiesPanel extends FlowPanel { } private boolean askUserForConfirmation() { + final boolean result; if (refreshableSelectionModel.itemIsSelectedButNotVisible(markPropertiesTable.getVisibleItems())) { final String markPropertiesNames = refreshableSelectionModel.getSelectedSet().stream() .map(MarkPropertiesDTO::getName).collect(Collectors.joining("\n")); - return Window.confirm( + result = Window.confirm( stringMessages.doYouReallyWantToRemoveNonVisibleMarkProperties(markPropertiesNames)); + } else { + result = Window.confirm(stringMessages.doYouReallyWantToRemoveSeveralMarkProperties()); } - return Window.confirm(stringMessages.doYouReallyWantToRemoveSeveralMarkProperties()); + return result; } }); buttonAndFilterPanel.addUnsecuredWidget(lblFilterRaces); @@ -235,7 +237,6 @@ public class MarkPropertiesPanel extends FlowPanel { return columnIndex == 0; } })); - // Initialize the columns. initTableColumns(sortHandler, userService); markPropertiesListDataProvider.addDataDisplay(markPropertiesTable); @@ -259,7 +260,6 @@ public class MarkPropertiesPanel extends FlowPanel { }; markPropertiesTable.addColumn(checkColumn, SafeHtmlUtils.fromSafeConstant("
    ")); markPropertiesTable.setColumnWidth(checkColumn, 40, Unit.PX); - // id Column idColumn = new Column(new TextCell()) { @Override @@ -357,17 +357,13 @@ public class MarkPropertiesPanel extends FlowPanel { markPropertiesTable.addColumn(typeColumn, stringMessages.type()); markPropertiesTable.addColumn(positioningColumn, stringMessages.position()); markPropertiesTable.addColumn(tagsColumn, stringMessages.tags()); - SecuredDTOOwnerColumn.configureOwnerColumns(markPropertiesTable, sortHandler, stringMessages); - final HasPermissions type = SecuredDomainType.MARK_PROPERTIES; - final AccessControlledActionsColumn actionsColumn = create( new MarkPropertiesImagesbarCell(stringMessages), userService); final EditOwnershipDialog.DialogConfig configOwnership = EditOwnershipDialog .create(userService.getUserManagementService(), type, markProperties -> { /* no refresh action */}, stringMessages); - final EditACLDialog.DialogConfig configACL = EditACLDialog.create( userService.getUserManagementService(), type, markProperties -> markProperties.getAccessControlList(), stringMessages); From 5744127110b684961d2a3768c41fe1378d9f0ebb Mon Sep 17 00:00:00 2001 From: dmitry Date: Mon, 13 Apr 2020 20:11:16 +0300 Subject: [PATCH 105/188] bug5178: fixed review remarks --- .../AbstractLeaderboardConfigPanel.java | 2 +- .../DeviceConfigurationPanel.java | 13 +-- .../ui/adminconsole/EventListComposite.java | 10 +- .../ui/adminconsole/IgtimiAccountsPanel.java | 18 ++-- .../adminconsole/LeaderboardConfigPanel.java | 32 +++--- .../LeaderboardGroupConfigPanel.java | 19 +--- .../adminconsole/RegattaManagementPanel.java | 37 +++---- .../RemoteServerInstancesManagementPanel.java | 2 +- .../ResultImportUrlsListComposite.java | 51 ++++------ .../TracTracEventManagementPanel.java | 3 +- .../TrackedRacesListComposite.java | 19 ++-- .../coursecreation/CourseTemplatePanel.java | 57 +++++------ .../coursecreation/MarkPropertiesPanel.java | 56 +++++------ .../sailing/gwt/ui/client/StringMessages.java | 8 -- .../gwt/ui/client/StringMessages.properties | 10 +- .../ui/client/StringMessages_de.properties | 10 +- .../ui/client/StringMessages_es.properties | 8 -- .../ui/client/StringMessages_fr.properties | 8 -- .../ui/client/StringMessages_it.properties | 8 -- .../ui/client/StringMessages_ja.properties | 8 -- .../ui/client/StringMessages_pt.properties | 8 -- .../ui/client/StringMessages_ru.properties | 8 -- .../ui/client/StringMessages_zh.properties | 8 -- .../AccessControlledButtonPanel.java | 99 ++++++++++++++----- .../component/RoleDefinitionsPanel.java | 2 +- .../SelectedElementsCountingButton.java | 48 +++++++-- .../component/UserGroupManagementPanel.java | 5 +- .../ui/client/i18n/StringMessages.java | 1 + .../ui/client/i18n/StringMessages.properties | 3 +- .../usermanagement/UserManagementPanel.java | 15 +-- 30 files changed, 258 insertions(+), 318 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractLeaderboardConfigPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractLeaderboardConfigPanel.java index af440f0d7f8..5469c749421 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractLeaderboardConfigPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractLeaderboardConfigPanel.java @@ -902,4 +902,4 @@ public abstract class AbstractLeaderboardConfigPanel extends FormPanel } }); } -} \ No newline at end of file +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationPanel.java index e7e2284c0a1..a73f5d30a1c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationPanel.java @@ -48,13 +48,15 @@ public class DeviceConfigurationPanel extends SimplePanel implements DeviceConfi this.userService = userService; this.stringMessages = stringMessages; this.errorReporter = reporter; - listComposite = new DeviceConfigurationListComposite(sailingService, errorReporter, stringMessages, userService); + listComposite = new DeviceConfigurationListComposite(sailingService, errorReporter, stringMessages, + userService); refreshableMultiSelectionModel = listComposite.getSelectionModel(); setupUi(); refreshableMultiSelectionModel.addSelectionChangeHandler(new Handler() { @Override public void onSelectionChange(SelectionChangeEvent event) { - Set selectedConfigurations = refreshableMultiSelectionModel.getSelectedSet(); + Set selectedConfigurations = refreshableMultiSelectionModel + .getSelectedSet(); if (selectedConfigurations.size() == 1 && selectedConfigurations.iterator().hasNext()) { detailComposite.setConfiguration(selectedConfigurations.iterator().next()); } else { @@ -62,7 +64,7 @@ public class DeviceConfigurationPanel extends SimplePanel implements DeviceConfi } removeConfigurationButton.setEnabled(!selectedConfigurations.isEmpty()); } - }); + }); } protected UserService getUserService() { @@ -90,15 +92,14 @@ public class DeviceConfigurationPanel extends SimplePanel implements DeviceConfi if (userService.hasCreatePermission(SecuredDomainType.RACE_MANAGER_APP_DEVICE_CONFIGURATION)) { deviceManagementControlPanel.add(addConfigurationButton); } - removeConfigurationButton = new SelectedElementsCountingButton( - refreshableMultiSelectionModel, stringMessages.remove(), new ClickHandler() { + removeConfigurationButton = new SelectedElementsCountingButton(refreshableMultiSelectionModel, + stringMessages.remove(), new ClickHandler() { @Override public void onClick(ClickEvent event) { removeConfiguration(); } }); - removeConfigurationButton.setEnabled(false); deviceManagementControlPanel.add(removeConfigurationButton); refreshConfigurationsButton = new Button(stringMessages.refresh()); refreshConfigurationsButton.addClickHandler(new ClickHandler() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java index ad7e4f49f68..6332ff5b57c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java @@ -71,6 +71,7 @@ import com.sap.sse.gwt.client.dialog.DataEntryDialog; import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback; import com.sap.sse.gwt.client.panels.LabeledAbstractFilterablePanel; import com.sap.sse.security.shared.HasPermissions.DefaultActions; +import com.sap.sse.security.shared.dto.NamedDTO; import com.sap.sse.security.shared.dto.UserDTO; import com.sap.sse.security.ui.client.UserService; import com.sap.sse.security.ui.client.component.AccessControlledActionsColumn; @@ -176,12 +177,9 @@ public class EventListComposite extends Composite implements EventsRefresher, Le } private boolean askUserForConfirmation() { - if (refreshableEventSelectionModel.itemIsSelectedButNotVisible(eventTable.getVisibleItems())) { - final String eventNames = refreshableEventSelectionModel.getSelectedSet().stream() - .map(EventDTO::getName).collect(Collectors.joining("\n")); - return Window.confirm(stringMessages.doYouReallyWantToRemoveNonVisibleEvents(eventNames)); - } - return Window.confirm(stringMessages.doYouReallyWantToRemoveEvents()); + final String names = refreshableEventSelectionModel.getSelectedSet().stream() + .map(NamedDTO::getName).collect(Collectors.joining("\n")); + return Window.confirm(StringMessages.INSTANCE.doYouReallyWantToRemoveSelectedElements(names)); } }); remove.ensureDebugId("RemoveEventsButton"); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/IgtimiAccountsPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/IgtimiAccountsPanel.java index db88713658d..3a194c5c2a1 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/IgtimiAccountsPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/IgtimiAccountsPanel.java @@ -134,16 +134,16 @@ public class IgtimiAccountsPanel extends FlowPanel { buttonPanel.addUnsecuredAction(stringMessages.refresh(), () -> refresh()); // setup controls - final Button removeAccountButton = buttonPanel.addRemoveAction(refreshableAccountsSelectionModel, - stringMessages.remove(), () -> { - if (refreshableAccountsSelectionModel.getSelectedSet().size() > 0) { - if (Window.confirm(stringMessages.doYouReallyWantToRemoveTheSelectedIgtimiAccounts())) { - for (AccountWithSecurityDTO account : refreshableAccountsSelectionModel.getSelectedSet()) { - removeAccount(account, filteredAccounts); - } - } + final Button removeAccountButton = buttonPanel.addRemoveAction(stringMessages.remove(), () -> { + if (refreshableAccountsSelectionModel.getSelectedSet().size() > 0) { + if (Window.confirm(stringMessages.doYouReallyWantToRemoveTheSelectedIgtimiAccounts())) { + for (AccountWithSecurityDTO account : refreshableAccountsSelectionModel.getSelectedSet()) { + removeAccount(account, filteredAccounts); } - }); + } + } + }); + removeAccountButton.setEnabled(false); refreshableAccountsSelectionModel.addSelectionChangeHandler( e -> removeAccountButton.setEnabled(refreshableAccountsSelectionModel.getSelectedSet().size() > 0)); add(controlsPanel); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java index 28d5c25e393..2fbcc42b04e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java @@ -102,6 +102,7 @@ import com.sap.sse.gwt.client.shared.components.SettingsDialogForLinkSharing; import com.sap.sse.gwt.client.shared.perspective.PerspectiveCompositeSettings; import com.sap.sse.security.shared.HasPermissions; import com.sap.sse.security.shared.HasPermissions.DefaultActions; +import com.sap.sse.security.shared.dto.NamedDTO; import com.sap.sse.security.ui.client.UserService; import com.sap.sse.security.ui.client.component.AccessControlledActionsColumn; import com.sap.sse.security.ui.client.component.AccessControlledButtonPanel; @@ -164,25 +165,22 @@ public class LeaderboardConfigPanel extends AbstractLeaderboardConfigPanel leaderboardCreateAndRegattaReadPermission, this::createRegattaLeaderboardWithEliminations); createRegattaLeaderboardWithEliminationsBtn.ensureDebugId("CreateRegattaLeaderboardWithEliminationsButton"); - leaderboardRemoveButton = buttonPanel.addRemoveAction(leaderboardSelectionModel, stringMessages.remove(), new Command() { + leaderboardRemoveButton = buttonPanel.addRemoveAction(leaderboardSelectionModel, stringMessages.remove(), + new Command() { - @Override - public void execute() { - if (askUserForConfirmation()) { - removeLeaderboards(leaderboardSelectionModel.getSelectedSet()); - } - } + @Override + public void execute() { + if (askUserForConfirmation()) { + removeLeaderboards(leaderboardSelectionModel.getSelectedSet()); + } + } - private boolean askUserForConfirmation() { - if (leaderboardSelectionModel.itemIsSelectedButNotVisible(leaderboardTable.getVisibleItems())) { - final String leaderboardNames = leaderboardSelectionModel.getSelectedSet().stream() - .map(StrippedLeaderboardDTO::getName).collect(Collectors.joining("\n")); - return Window - .confirm(stringMessages.doYouReallyWantToRemoveNonVisibleLeaderboards(leaderboardNames)); - } - return Window.confirm(stringMessages.doYouReallyWantToRemoveLeaderboards()); - } - }); + private boolean askUserForConfirmation() { + final String names = leaderboardSelectionModel.getSelectedSet().stream().map(NamedDTO::getName) + .collect(Collectors.joining("\n")); + return Window.confirm(StringMessages.INSTANCE.doYouReallyWantToRemoveSelectedElements(names)); + } + }); leaderboardRemoveButton.ensureDebugId("LeaderboardsRemoveButton"); } 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 7c51d96462c..c39e3d88204 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 @@ -652,25 +652,12 @@ public class LeaderboardGroupConfigPanel extends AbstractRegattaPanel refreshableGroupsSelectionModel = leaderboardTableSelectionColumn.getSelectionModel(); - removeButton = buttonPanel.addRemoveAction(refreshableGroupsSelectionModel, stringMessages.remove(), - new Command() { + removeButton = buttonPanel.addRemoveActionWithConfirmation(refreshableGroupsSelectionModel, + stringMessages.remove(), new Command() { @Override public void execute() { - if (askUserForConfirmation()) { - removeLeaderboardGroups(refreshableGroupsSelectionModel.getSelectedSet()); - } - } - - private boolean askUserForConfirmation() { - if (refreshableGroupsSelectionModel - .itemIsSelectedButNotVisible(groupsTable.getVisibleItems())) { - final String leaderboardGroupNames = refreshableGroupsSelectionModel.getSelectedSet() - .stream().map(LeaderboardGroupDTO::getName).collect(Collectors.joining("\n")); - return Window.confirm(stringMessages - .doYouReallyWantToRemoveNonVisibleLeaderboardGroups(leaderboardGroupNames)); - } - return Window.confirm(stringMessages.doYouReallyWantToRemoveLeaderboardGroups()); + removeLeaderboardGroups(refreshableGroupsSelectionModel.getSelectedSet()); } }); removeButton.ensureDebugId("RemoveLeaderboardButton"); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaManagementPanel.java index b2c2396afd8..7b6a4609e06 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaManagementPanel.java @@ -7,10 +7,8 @@ import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; -import java.util.stream.Collectors; import com.google.gwt.user.client.Command; -import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.CaptionPanel; @@ -77,33 +75,23 @@ public class RegattaManagementPanel extends SimplePanel implements RegattasDispl final Button create = buttonPanel.addCreateAction(stringMessages.addRegatta(), this::openCreateRegattaDialog); create.ensureDebugId("AddRegattaButton"); - final Button remove = buttonPanel.addRemoveAction(refreshableRegattaMultiSelectionModel, stringMessages.remove(), new Command() { + final Button remove = buttonPanel.addRemoveActionWithConfirmation(refreshableRegattaMultiSelectionModel, + stringMessages.remove(), new Command() { - @Override - public void execute() { - if (askUserForConfirmation()) { - // unmodifiable collection can't be sent to the server. - final Collection regattas = createModifiableCollection(); - removeRegattas(regattas); - } - } - - private boolean askUserForConfirmation() { - if (refreshableRegattaMultiSelectionModel - .itemIsSelectedButNotVisible(regattaListComposite.getRegattaTable().getVisibleItems())) { - final String regattaNames = refreshableRegattaMultiSelectionModel.getSelectedSet().stream() - .map(RegattaDTO::getName).collect(Collectors.joining("\n")); - return Window.confirm(stringMessages.doYouReallyWantToRemoveNonVisibleRegattas(regattaNames)); - } - return Window.confirm(stringMessages.doYouReallyWantToRemoveRegattas()); - } - }); + @Override + public void execute() { + // unmodifiable collection can't be sent to the server. + final Collection regattas = createModifiableCollection(); + removeRegattas(regattas); + } + }); regattasContentPanel.add(buttonPanel); refreshableRegattaMultiSelectionModel.addSelectionChangeHandler(new Handler() { @Override public void onSelectionChange(SelectionChangeEvent event) { - List selectedRegattas = new ArrayList<>(refreshableRegattaMultiSelectionModel.getSelectedSet()); + List selectedRegattas = new ArrayList<>( + refreshableRegattaMultiSelectionModel.getSelectedSet()); final RegattaIdentifier selectedRegatta; if (selectedRegattas.size() == 1) { selectedRegatta = selectedRegattas.iterator().next().getRegattaIdentifier(); @@ -127,9 +115,6 @@ public class RegattaManagementPanel extends SimplePanel implements RegattasDispl } } remove.setEnabled(!selectedRegattas.isEmpty() && canDeleteAllSelected); - - remove.setText(selectedRegattas.size() <= 1 ? stringMessages.remove() - : stringMessages.removeNumber(selectedRegattas.size())); } }); regattasContentPanel.add(regattaListComposite); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RemoteServerInstancesManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RemoteServerInstancesManagementPanel.java index b49d7c3e4ea..34d823c5d50 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RemoteServerInstancesManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RemoteServerInstancesManagementPanel.java @@ -113,7 +113,7 @@ public class RemoteServerInstancesManagementPanel extends SimplePanel { } }); - buttonPanel.add(new SelectedElementsCountingButton<>(refreshableServerSelectionModel, stringMessages.remove(), + buttonPanel.add(new SelectedElementsCountingButton(refreshableServerSelectionModel, stringMessages.remove(), new ClickHandler() { @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/ResultImportUrlsListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/ResultImportUrlsListComposite.java index cdf3c5d7396..6834086be36 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/ResultImportUrlsListComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/ResultImportUrlsListComposite.java @@ -14,8 +14,6 @@ import com.google.gwt.user.client.ui.Grid; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.VerticalPanel; -import com.google.gwt.view.client.SelectionChangeEvent; -import com.google.gwt.view.client.SelectionChangeEvent.Handler; import com.sap.sailing.domain.common.security.SecuredDomainType; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.StringMessages; @@ -54,32 +52,11 @@ public class ResultImportUrlsListComposite extends Composite { final AccessControlledButtonPanel buttonPanel = new AccessControlledButtonPanel(userService, SecuredDomainType.RESULT_IMPORT_URL); - Grid urlSample = new Grid(1, 2); - urlSample.setWidget(0, 0, new Label(stringMessages.sampleURL(""))); - Label urlSampleLabel = new Label(); - urlSample.setWidget(0, 1, urlSampleLabel); - - sailingService.getUrlResultProviderNamesAndOptionalSampleURL(new AsyncCallback>>() { - @Override - public void onSuccess(List> urlProviderNamesAndOptionalSampleURL) { - urlProviderListBox.clear(); - urlProviderListBox.addItem(stringMessages.pleaseSelectAURLProvider()); - for (Pair urlProviderNameAndSampleURL : urlProviderNamesAndOptionalSampleURL) { - urlProviderListBox.addItem(urlProviderNameAndSampleURL.getA(), urlProviderNameAndSampleURL.getB()); - } - } - - @Override - public void onFailure(Throwable caught) { - } - }); - table = new ResultImportUrlsTableWrapper<>(sailingServiceAsync, userService, stringMessages, errorReporter); - final Button add = buttonPanel.addCreateAction(stringMessages.add(), this::addUrl); add.setEnabled(false); - final Button remove = buttonPanel.addRemoveAction(table.getSelectionModel(), stringMessages.remove(), new Command() { + buttonPanel.addRemoveAction(table.getSelectionModel(), stringMessages.remove(), new Command() { @Override public void execute() { if (Window.confirm(stringMessages.doYouReallyWantToRemoveResultImportUrls())) { @@ -88,16 +65,14 @@ public class ResultImportUrlsListComposite extends Composite { } }); - table.getSelectionModel().addSelectionChangeHandler(new Handler() { - @Override - public void onSelectionChange(SelectionChangeEvent event) { - remove.setEnabled(!table.getSelectionModel().getSelectedSet().isEmpty()); - } - }); - final Button refresh = buttonPanel.addUnsecuredAction(stringMessages.refresh(), this::updateTable); refresh.setEnabled(false); + Grid urlSample = new Grid(1, 2); + urlSample.setWidget(0, 0, new Label(stringMessages.sampleURL(""))); + Label urlSampleLabel = new Label(); + urlSample.setWidget(0, 1, urlSampleLabel); + urlProviderListBox = new ListBox(); urlProviderListBox.setMultipleSelect(false); urlProviderListBox.addChangeHandler(new ChangeHandler() { @@ -113,6 +88,20 @@ public class ResultImportUrlsListComposite extends Composite { urlSampleLabel.setText(provider == null || provider.equals("null") ? "" : provider); } }); + sailingService.getUrlResultProviderNamesAndOptionalSampleURL(new AsyncCallback>>() { + @Override + public void onSuccess(List> urlProviderNamesAndOptionalSampleURL) { + urlProviderListBox.clear(); + urlProviderListBox.addItem(stringMessages.pleaseSelectAURLProvider()); + for (Pair urlProviderNameAndSampleURL : urlProviderNamesAndOptionalSampleURL) { + urlProviderListBox.addItem(urlProviderNameAndSampleURL.getA(), urlProviderNameAndSampleURL.getB()); + } + } + + @Override + public void onFailure(Throwable caught) { + } + }); Grid providerGrid = new Grid(1, 2); providerGrid.setWidget(0, 0, new Label(stringMessages.urlProviders())); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TracTracEventManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TracTracEventManagementPanel.java index e69ed8a3a51..a27424f2448 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TracTracEventManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TracTracEventManagementPanel.java @@ -151,8 +151,7 @@ public class TracTracEventManagementPanel extends AbstractEventManagementPanel { } }, userService, errorReporter).show()); addCreateAction.ensureDebugId("AddConnectionButton"); - final Button removeButton = buttonPanel.addRemoveAction(connectionsTable.getSelectionModel(), - stringMessages.remove(), () -> { + final Button removeButton = buttonPanel.addRemoveAction(stringMessages.remove(), () -> { sailingService.deleteTracTracConfiguration(connectionsTable.getSelectionModel().getSelectedObject(), new AsyncCallback() { @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java index 3beaedc3864..c9aa55d13b0 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java @@ -147,8 +147,8 @@ public class TrackedRacesListComposite extends AbstractTrackedRacesListComposite btnExport.setEnabled(false); trackedRacesButtonPanel.add(btnExport); - btnRemoveRace = new SelectedElementsCountingButton(refreshableSelectionModel, - stringMessages.remove(), new ClickHandler() { + btnRemoveRace = new SelectedElementsCountingButton(refreshableSelectionModel, stringMessages.remove(), + new ClickHandler() { @Override public void onClick(ClickEvent event) { if (askUserForConfirmation()) { @@ -157,18 +157,15 @@ public class TrackedRacesListComposite extends AbstractTrackedRacesListComposite } private boolean askUserForConfirmation() { - if (refreshableSelectionModel.itemIsSelectedButNotVisible(raceTable.getVisibleItems())) { - final String trackedRaceNames = refreshableSelectionModel.getSelectedSet().stream() - .map(e -> e.getRegattaName() + " - " + e.getName()) - .collect(Collectors.joining("\n")); - return Window.confirm( - stringMessages.doYouReallyWantToRemoveNonVisibleTrackedRaces(trackedRaceNames)); - } - return true; + final String names = refreshableSelectionModel.getSelectedSet().stream() + .map(e -> e.getRegattaName() + " - " + e.getName()) + .collect(Collectors.joining("\n")); + return Window + .confirm(StringMessages.INSTANCE.doYouReallyWantToRemoveSelectedElements(names)); } + }); btnRemoveRace.ensureDebugId("RemoveRaceButton"); - btnRemoveRace.setEnabled(false); trackedRacesButtonPanel.add(btnRemoveRace); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java index 9f6b544b33b..fd6b78904d9 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java @@ -115,44 +115,33 @@ public class CourseTemplatePanel extends FlowPanel { } }); - buttonAndFilterPanel.addRemoveAction(refreshableSelectionModel, stringMessages.remove(), new Command() { + buttonAndFilterPanel.addRemoveActionWithConfirmation(refreshableSelectionModel, stringMessages.remove(), + new Command() { - @Override - public void execute() { - if (askUserForConfirmation()) { - removeCourseTemplates(refreshableSelectionModel.getSelectedSet().stream().map(courseTemplateDTO -> { - return courseTemplateDTO.getUuid(); - }).collect(Collectors.toList())); - } - } + @Override + public void execute() { + removeCourseTemplates(refreshableSelectionModel.getSelectedSet().stream() + .map(courseTemplateDTO -> courseTemplateDTO.getUuid()).collect(Collectors.toList())); + } - private void removeCourseTemplates(Collection courseTemplatesUuids) { - if (!courseTemplatesUuids.isEmpty()) { - sailingService.removeCourseTemplates(courseTemplatesUuids, new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - errorReporter - .reportError("Error trying to remove course teamplates:" + caught.getMessage()); + private void removeCourseTemplates(Collection courseTemplatesUuids) { + if (!courseTemplatesUuids.isEmpty()) { + sailingService.removeCourseTemplates(courseTemplatesUuids, new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError( + "Error trying to remove course teamplates:" + caught.getMessage()); + } + + @Override + public void onSuccess(Void result) { + refreshCourseTemplates(); + } + }); } + } - @Override - public void onSuccess(Void result) { - refreshCourseTemplates(); - } - }); - } - } - - private boolean askUserForConfirmation() { - if (refreshableSelectionModel.itemIsSelectedButNotVisible(courseTemplateTable.getVisibleItems())) { - final String markRolesNames = refreshableSelectionModel.getSelectedSet().stream() - .map(CourseTemplateDTO::getName).collect(Collectors.joining("\n")); - return Window - .confirm(stringMessages.doYouReallyWantToRemoveNonVisibleCourseTemplates(markRolesNames)); - } - return Window.confirm(stringMessages.doYouReallyWantToRemoveCourseTemplates()); - } - }); + }); buttonAndFilterPanel.addUnsecuredWidget(lblFilterRaces); buttonAndFilterPanel.addUnsecuredWidget(filterableCourseTemplatePanel); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java index e6aea825473..a1f1824b21e 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java @@ -122,43 +122,33 @@ public class MarkPropertiesPanel extends FlowPanel { openEditMarkPropertiesDialog(new MarkPropertiesDTO()); } }); - buttonAndFilterPanel.addRemoveAction(refreshableSelectionModel, stringMessages.remove(), new Command() { + buttonAndFilterPanel.addRemoveActionWithConfirmation(refreshableSelectionModel, stringMessages.remove(), + new Command() { - @Override - public void execute() { - if (askUserForConfirmation()) { - removeMarkProperties(refreshableSelectionModel.getSelectedSet().stream().map(markPropertiesDTO -> { - return markPropertiesDTO.getUuid(); - }).collect(Collectors.toList())); - } - } + @Override + public void execute() { + removeMarkProperties(refreshableSelectionModel.getSelectedSet().stream() + .map(markPropertiesDTO -> markPropertiesDTO.getUuid()).collect(Collectors.toList())); + } - private void removeMarkProperties(Collection markPropertiesUuids) { - if (!markPropertiesUuids.isEmpty()) { - sailingService.removeMarkProperties(markPropertiesUuids, new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError("Error trying to remove mark properties:" + caught.getMessage()); + private void removeMarkProperties(Collection markPropertiesUuids) { + if (!markPropertiesUuids.isEmpty()) { + sailingService.removeMarkProperties(markPropertiesUuids, new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError( + "Error trying to remove mark properties:" + caught.getMessage()); + } + + @Override + public void onSuccess(Void result) { + refreshMarkProperties(); + } + }); } + } - @Override - public void onSuccess(Void result) { - refreshMarkProperties(); - } - }); - } - } - - private boolean askUserForConfirmation() { - if (refreshableSelectionModel.itemIsSelectedButNotVisible(markPropertiesTable.getVisibleItems())) { - final String markPropertiesNames = refreshableSelectionModel.getSelectedSet().stream() - .map(MarkPropertiesDTO::getName).collect(Collectors.joining("\n")); - return Window.confirm( - stringMessages.doYouReallyWantToRemoveNonVisibleMarkProperties(markPropertiesNames)); - } - return Window.confirm(stringMessages.doYouReallyWantToRemoveSeveralMarkProperties()); - } - }); + }); buttonAndFilterPanel.addUnsecuredWidget(lblFilterRaces); filterableMarkProperties.getTextBox().ensureDebugId("MarkPropertiesFilterTextBox"); buttonAndFilterPanel.addUnsecuredWidget(filterableMarkProperties); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java index c2edb8f8419..36943effa0b 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java @@ -383,8 +383,6 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, String pleaseSelectARegatta(); String addFleet(); String doYouReallyWantToRemoveRegatta(String name); - String doYouReallyWantToRemoveRegattas(); - String doYouReallyWantToRemoveNonVisibleRegattas(String regattaNames); String errorLoadingScoreCorrectionProviders(String message); String selectResultListToImportFrom(); String of(); @@ -971,8 +969,6 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, String offset(); String line(); String lineAngleToWindAndAdvantage(String startLineLength, String startLineAngleToCombinedWind, String startLineAdvantageousSide, String startLineAdvantageInMeters); - String doYouReallyWantToRemoveNonVisibleEvents(String eventNames); - String doYouReallyWantToRemoveEvents(); String doYouReallyWantToRemoveEvent(String eventName); String doYouReallyWantToRemoveCompetitors(); String doYouReallyWantToRemoveCompetitor(String name); @@ -1050,8 +1046,6 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, String couldNotAuthorizedAccessToIgtimiUser(String text); String errorGettingIgtimiAuthorizationUrl(String message); String addIgtimiUser(); - String doYouReallyWantToRemoveLeaderboards(); - String doYouReallyWantToRemoveNonVisibleLeaderboards(String leaderboardNames); String doYouReallyWantToRemoveTrackedRaces(); String doYouReallyWantToRemoveNonVisibleTrackedRaces(String trackedRacesName); String errorTryingToRemoveIgtimiAccount(String eMailOfAccountToRemove); @@ -1147,8 +1141,6 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, String availableLeaderboardGroups(); String leaderboardGroupsOfSelectedEvent(); String doYouReallyWantToRemoveLeaderboardGroup(String leaderboardGroupName); - String doYouReallyWantToRemoveLeaderboardGroups(); - String doYouReallyWantToRemoveNonVisibleLeaderboardGroups(String leaderboardGroupNames); String addRaces(); String withNamePrefix(); String pleaseSelectASeriesFirst(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties index 91e6c8586dc..31e741d7d83 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties @@ -407,8 +407,6 @@ noColor=No color pleaseSelectARegatta=Please select a regatta. addFleet=Add fleet doYouReallyWantToRemoveRegatta=Do you really want to remove the regatta "{0}"? This will also remove all leaderboards for this regatta! -doYouReallyWantToRemoveRegattas=Do you really want to remove the regattas? This will also remove all leaderboards for those regattas! -doYouReallyWantToRemoveNonVisibleRegattas=You are also deleting regattas that are currently not visible while filtering. The following regattas will be removed. Do you want to continue?\n\n{0} errorLoadingScoreCorrectionProviders=Error loading score correction providers: {0} selectResultListToImportFrom=Select result list to import from of=of @@ -959,8 +957,6 @@ hideToolbar=Hide toolbar showSeriesLeaderboards=Show series leaderboards showOverallLeaderboard=Show overall leaderboard lineAngleToWindAndAdvantage=length: {0}m\nangle to wind: {1}°\n{2} side has {3}m advantage -doYouReallyWantToRemoveNonVisibleEvents=You are also deleting events that are currently not visible while filtering. The following events will be removed. Do you want to continue?\n\n{0} -doYouReallyWantToRemoveEvents=Do you really want to remove the events? doYouReallyWantToRemoveEvent=Do you really want to remove event {0}? line=Line offset=Offset @@ -1032,11 +1028,7 @@ successfullyAuthorizedAccessToIgtimiUser=Successfully authorized access to Igtim couldNotAuthorizedAccessToIgtimiUser=Could not authorize user {0}; invalid user name or password errorGettingIgtimiAuthorizationUrl=Error getting Igtimi authorization URL: {0} addIgtimiUser=Add Igtimi User -doYouReallyWantToRemoveLeaderboards=Do you really want to remove the leaderboards? -doYouReallyWantToRemoveNonVisibleLeaderboards=You are also deleting leaderboards that are currently not visible while filtering. The following leaderboards will be removed. Do you want to continue?\n\n{0} doYouReallyWantToRemoveLeaderboardGroup=Do you really want to remove the leaderboard group "{0}"? -doYouReallyWantToRemoveLeaderboardGroups=Do you really want to remove the leaderboard groups? -doYouReallyWantToRemoveNonVisibleLeaderboardGroups=You are also deleting leaderboard groups that are currently not visible while filtering. The following leaderboard groups will be removed. Do you want to continue?\n\n{0} doYouReallyWantToRemoveTrackedRaces=Do you really want to remove the tracked races? doYouReallyWantToRemoveNonVisibleTrackedRaces=You are also deleting tracked races that are currently not visible while filtering. The following tracked races will be removed. Do you want to continue?\n\n{0} errorTryingToRemoveIgtimiAccount=Error trying to remove Igtimi account for user {0} @@ -2388,4 +2380,4 @@ unsetPosition=Unset position errorTryingToUpdateMarkProperties=Error trying to update mark properties: {0} confirmUnsettingPositionForMarkProperties=Really remove positioning information for mark properties {0}? useOfficialResultsForAutomaticUpdates=Automatically update from "official" results published by TracTrac -keepEmptyForDefaultUserAndPassword=If username and password are left empty the current user is used to log in on the remote server. If your user has the correct permission to do a master data import from the remote server there is no need to fill in those fields. Use only if you have separate user stores or if the data belongs to another user. \ No newline at end of file +keepEmptyForDefaultUserAndPassword=If username and password are left empty the current user is used to log in on the remote server. If your user has the correct permission to do a master data import from the remote server there is no need to fill in those fields. Use only if you have separate user stores or if the data belongs to another user. diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties index af8f160b870..36c3e48bc9d 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties @@ -405,8 +405,6 @@ noColor=Keine Farbe pleaseSelectARegatta=Bitte wählen Sie eine Regatta aus. addFleet=Gruppe hinzufügen doYouReallyWantToRemoveRegatta=Möchten Sie wirklich Regatta "{0}" löschen? Alle Regatta-Ranglisten werden dadurch ebenfalls gelöscht. -doYouReallyWantToRemoveRegattas=Möchten Sie die Regatten wirklich löschen? Alle Regatta-Ranglisten werden dadurch ebenfalls gelöscht. -doYouReallyWantToRemoveNonVisibleRegattas=Sie entfernen auch Regatten, die während des Filterns nicht angezeigt werden. Die folgenden Regatten werden entfernt. Möchten Sie fortfahren?\n\n{0} errorLoadingScoreCorrectionProviders=Fehler beim Laden der offiziellen Ergebnis-Dienste: {0} selectResultListToImportFrom=Rangliste auswählen of=von @@ -943,8 +941,6 @@ hideToolbar=Toolbar ausblenden showSeriesLeaderboards=Ranglisten der Serie anzeigen showOverallLeaderboard=Gesamtrangliste anzeigen lineAngleToWindAndAdvantage=Länge: {0}m\nWinkel zum Wind: {1}°\n{2}-Seite ist {3}m bevorteilt -doYouReallyWantToRemoveNonVisibleEvents=Sie entfernen auch Veranstaltungen, die während des Filterns nicht angezeigt werden. Die folgenden Veranstaltungen werden entfernt. Möchten Sie fortfahren?\n\n{0} -doYouReallyWantToRemoveEvents=Möchten Sie diese Veranstaltungen wirklich entfernen? doYouReallyWantToRemoveEvent=Möchten Sie wirklich die Veranstaltung {0} entfernen? line=Linie offset=Ablauftonne @@ -1015,10 +1011,7 @@ couldNotAuthorizedAccessToIgtimiUser=Benutzer {0} konnte nicht authentifiziert w errorGettingIgtimiAuthorizationUrl=Fehler beim Beschaffen der Igtimi Authorisierungs-URL: {0} addIgtimiUser=Igtimi-Benutzer hinzufügen doYouReallyWantToRemoveLeaderboards=Möchten Sie wirklich diese Ranglisten löschen? -doYouReallyWantToRemoveNonVisibleLeaderboards=Sie entfernen auch Ranglisten, die während des Filterns nicht angezeigt werden. Die folgenden Ranglisten werden entfernt. Möchten Sie fortfahren?\n\n{0} doYouReallyWantToRemoveLeaderboardGroup=Möchten Sie wirklich Ranglisten-Gruppe "{0}" löschen? -doYouReallyWantToRemoveLeaderboardGroups=Möchten Sie wirklich diese Ranglisten-Gruppen löschen? -doYouReallyWantToRemoveNonVisibleLeaderboardGroups=Sie entfernen auch Ranglisten-Gruppen, die während des Filterns nicht angezeigt werden. Die folgenden Ranglisten-Gruppen werden entfernt. Möchten Sie fortfahren?\n\n{0} doYouReallyWantToRemoveNonVisibleLeaderboards=Sie entfernen auch Ranglisten, die während des Filterns nicht angezeigt werden. Die folgenden Ranglisten werden entfernt. Möchten Sie fortfahren?\n\n{0} errorTryingToRemoveIgtimiAccount=Fehler beim Löschen des Zugangs zum Benutzerkonto {0} successfullyRemoveIgtimiAccount=Zugang zum Igtimi-Benutzerkonto {0} erfolgreich gelöscht @@ -1027,7 +1020,6 @@ emailAddress=e-Mailadresse password=Kennwort searchTag=Suchhilfe doYouReallyWantToRemoveLeaderboard=Möchten Sie wirklich die Rangliste ''{0}'' löschen? -doYouReallyWantToRemoveLeaderboards=Möchten Sie die Ranglisten wirklich löschen? doYouReallyWantToRemoveTrackedRaces=Möchten Sie die getrackten Rennen wirklich löschen? doYouReallyWantToRemoveNonVisibleTrackedRaces=Sie entfernen auch getrackte Rennen, die während des Filterns nicht angezeigt werden. Die folgenden getrackten Rennen werden entfernt. Möchten Sie fortfahren?\n\n{0} metaLeaderboardCannotBeChanged=Dies ist eine Meta-Rangliste, das hier nicht geändert werden kann. @@ -2398,4 +2390,4 @@ importTrackedRaces=Getrackte Rennen werden importiert errorTryingToUpdateMarkProperties=Fehler beim Ändern der Bahnmarkeneigenschaften: {0} confirmUnsettingPositionForMarkProperties=Positionierungsinformation für Bahnmarkeneigenschaften {0} wirklich entfernen? useOfficialResultsForAutomaticUpdates=Automatisch von "offiziellen" von TracTrac veröffentlichten Ergebnissen aktualisieren -keepEmptyForDefaultUserAndPassword=Wenn kein Benutzername und kein Kennwort eingetragen werden, wird der aktuelle Benutzer zum importieren verwendet. Wenn der aktuelle Nutzer die Berechtigung zum Exportieren der Daten auf dem Zielserver hat, können die Felder leer bleiben. Sollen jedoch die Daten eines anderen Benutzers importiert werden, sind Benutzername und Kennwort des Benutzers einzutragen. \ No newline at end of file +keepEmptyForDefaultUserAndPassword=Wenn kein Benutzername und kein Kennwort eingetragen werden, wird der aktuelle Benutzer zum importieren verwendet. Wenn der aktuelle Nutzer die Berechtigung zum Exportieren der Daten auf dem Zielserver hat, können die Felder leer bleiben. Sollen jedoch die Daten eines anderen Benutzers importiert werden, sind Benutzername und Kennwort des Benutzers einzutragen. diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_es.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_es.properties index eea42c1c0b8..231c780af33 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_es.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_es.properties @@ -401,8 +401,6 @@ noColor=Sin color pleaseSelectARegatta=Seleccione una regata. addFleet=Añadir flota doYouReallyWantToRemoveRegatta=¿Realmente desea eliminar la regata "{0}"? Con ello también se eliminarán todas las tablas de clasificación de esta regata. -doYouReallyWantToRemoveRegattas=¿Realmente desea eliminar las regatas? Con ello también se eliminarán todas las tablas de clasificación de aquellas regatas. -doYouReallyWantToRemoveNonVisibleRegattas=Del mismo modo, está borrando las regatas que actualmente no son visibles con el filtro. Se eliminarán las siguientes regatas. ¿Desea continuar?\n\n{0} errorLoadingScoreCorrectionProviders=Error al cargar proveedores de corrección de puntuaciones: {0} selectResultListToImportFrom=Seleccione la lista de resultados desde la que desea importar of=de @@ -953,8 +951,6 @@ hideToolbar=Ocultar barra de herramientas showSeriesLeaderboards=Mostrar tablas de clasificación de las series showOverallLeaderboard=Mostrar tabla de clasificación general lineAngleToWindAndAdvantage=longitud: {0}m\nángulo respecto al viento: {1}°\n{2} sbanda tiene {3}m de ventaja -doYouReallyWantToRemoveNonVisibleEvents=Del mismo modo, está borrando los eventos que actualmente no son visibles con el filtro. Se eliminarán los siguientes eventos. ¿Desea continuar?\n\n{0} -doYouReallyWantToRemoveEvents=¿Desea realmente eliminar los eventos? doYouReallyWantToRemoveEvent=¿Desea realmente eliminar el evento {0}? line=Línea offset=Offset @@ -1026,11 +1022,7 @@ successfullyAuthorizedAccessToIgtimiUser=Acceso autorizado correctamente al usua couldNotAuthorizedAccessToIgtimiUser=No se ha podido autorizar al usuario {0}; nombre de usuario o contraseña no válido errorGettingIgtimiAuthorizationUrl=Error al obtener URL de autorización de Igtimi: {0} addIgtimiUser=Añadir usuario de Igtimi -doYouReallyWantToRemoveLeaderboards=¿Desea realmente eliminar las tablas de clasificación? -doYouReallyWantToRemoveNonVisibleLeaderboards=Del mismo modo, está borrando las tablas de clasificación que actualmente no son visibles con el filtro. Se eliminarán las siguientes tablas de clasificación. ¿Desea continuar?\n\n{0} doYouReallyWantToRemoveLeaderboardGroup=¿Desea realmente eliminar los grupos de la tabla de clasificación "{0}"? -doYouReallyWantToRemoveLeaderboardGroups=¿Desea realmente eliminar los grupos de la tabla de clasificación? -doYouReallyWantToRemoveNonVisibleLeaderboardGroups=Del mismo modo, está borrando los grupos de la tabla de clasificación que actualmente no son visibles con el filtro. Se eliminarán los siguientes grupos de la tabla de clasificación. ¿Desea continuar?\n\n{0} doYouReallyWantToRemoveTrackedRaces=¿Desea realmente eliminar las carreras rastreadas? doYouReallyWantToRemoveNonVisibleTrackedRaces=Del mismo modo, está borrando las carreras rastreadas que actualmente no son visibles con el filtro. Se eliminarán las siguientes carreras rastreadas. ¿Desea continuar?\n\n{0} errorTryingToRemoveIgtimiAccount=Error al intentar eliminar la cuenta de Igtimi para el usuario {0} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_fr.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_fr.properties index 70822765a60..55dcde27ed4 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_fr.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_fr.properties @@ -401,8 +401,6 @@ noColor=Aucune couleur pleaseSelectARegatta=Sélectionnez une régate. addFleet=Ajouter flotte doYouReallyWantToRemoveRegatta=Voulez-vous vraiment supprimer la régate "{0}" ? Cela entraînera également la suppression de tous les palmarès de cette régate. -doYouReallyWantToRemoveRegattas=Voulez-vous vraiment supprimer les régates ? Cela entraînera également la suppression de tous les palmarès de ces régates. -doYouReallyWantToRemoveNonVisibleRegattas=Vous êtes également en train de supprimer des régates qui ne sont pas visibles actuellement à cause du filtre. Les régates suivantes seront supprimées. Voulez-vous poursuivre ?\n\n{0} errorLoadingScoreCorrectionProviders=Erreur lors du chargement des fournisseurs de corrections de scores : {0} selectResultListToImportFrom=Sélectionner la liste des résultats depuis laquelle importer of=de @@ -953,8 +951,6 @@ hideToolbar=Masquer barre d''outils showSeriesLeaderboards=Afficher palmarès de la série showOverallLeaderboard=Afficher palmarès général lineAngleToWindAndAdvantage=longueur : {0} m\nangle au vent : {1}°\ncôté {2} a {3} m d''avantage -doYouReallyWantToRemoveNonVisibleEvents=Vous êtes également en train de supprimer des manifestations qui ne sont pas visibles actuellement à cause du filtre. Les manifestations suivantes seront supprimées. Voulez-vous poursuivre ?\n\n{0} -doYouReallyWantToRemoveEvents=Voulez-vous vraiment supprimer les manifestations ? doYouReallyWantToRemoveEvent=Voulez-vous vraiment supprimer la manifestation {0} ? line=Ligne offset=Décalage @@ -1026,11 +1022,7 @@ successfullyAuthorizedAccessToIgtimiUser=Autorisation d''accès réussie pour l' couldNotAuthorizedAccessToIgtimiUser=Autorisation pour l''utilisateur {0} échouée : mot de passe ou nom d''utilisateur non valide. errorGettingIgtimiAuthorizationUrl=Erreur lors de l''accès à l''URL d''autorisation Igtimi : {0} addIgtimiUser=Ajouter utilisateur Igtimi -doYouReallyWantToRemoveLeaderboards=Voulez-vous vraiment supprimer les palmarès ? -doYouReallyWantToRemoveNonVisibleLeaderboards=Vous êtes également en train de supprimer des palmarès qui ne sont pas visibles actuellement à cause du filtre. Les palmarès suivants seront supprimés. Voulez-vous poursuivre ?\n\n{0} doYouReallyWantToRemoveLeaderboardGroup=Voulez-vous vraiment supprimer le groupe de palmarès "{0}" ? -doYouReallyWantToRemoveLeaderboardGroups=Voulez-vous vraiment supprimer les groupes de palmarès ? -doYouReallyWantToRemoveNonVisibleLeaderboardGroups=Vous êtes également en train de supprimer des groupes de palmarès qui ne sont pas visibles actuellement à cause du filtre. Les groupes de palmarès suivants seront supprimés. Voulez-vous poursuivre ?\n\n{0} doYouReallyWantToRemoveTrackedRaces=Voulez-vous vraiment supprimer les courses suivies ? doYouReallyWantToRemoveNonVisibleTrackedRaces=Vous êtes également en train de supprimer des courses suivies qui ne sont pas visibles actuellement à cause du filtre. Les courses suivies suivantes seront supprimées. Voulez-vous poursuivre ?\n\n{0} errorTryingToRemoveIgtimiAccount=Erreur lors de la tentative de suppression du compte Igtimi pour l''utilisateur {0}. diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_it.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_it.properties index 98653a95daf..b848345977c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_it.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_it.properties @@ -401,8 +401,6 @@ noColor=Nessun colore pleaseSelectARegatta=Selezionare una regata. addFleet=Aggiungi flotta doYouReallyWantToRemoveRegatta=Confermare la rimozione della regata "{0}"? Questa azione rimuoverà anche tutte le classifiche di questa regata. -doYouReallyWantToRemoveRegattas=Confermare la rimozione delle regate? Questa azione rimuoverà anche tutte le classifiche di queste regate. -doYouReallyWantToRemoveNonVisibleRegattas=Si sta eliminando anche regate attualmente non visibili durante il filtro. Verranno rimosse le seguenti regate. Continuare?\n\n{0} errorLoadingScoreCorrectionProviders=Errore di caricamento dei provider di correzione dei punteggi: {0} selectResultListToImportFrom=Seleziona l''elenco di risultati da cui eseguire l''importazione of=di @@ -953,8 +951,6 @@ hideToolbar=Nascondi barra degli strumenti showSeriesLeaderboards=Mostra classifiche serie showOverallLeaderboard=Mostra classifica generale lineAngleToWindAndAdvantage=lunghezza: {0}m\nangolo rispetto al vento: {1}°\nil lato {2} ha uno svantaggio di {3} m -doYouReallyWantToRemoveNonVisibleEvents=Si stanno eliminando anche eventi attualmente non visibili durante il filtro. Verranno rimossi i seguenti eventi. Continuare?\n\n{0} -doYouReallyWantToRemoveEvents=Confermare l''eliminazione degli eventi? doYouReallyWantToRemoveEvent=Confermare l''eliminazione dell''evento {0}? line=Linea offset=Offset @@ -1026,11 +1022,7 @@ successfullyAuthorizedAccessToIgtimiUser=Autorizzazione accesso corretta a utent couldNotAuthorizedAccessToIgtimiUser=Impossibile autorizzare utente {0}; nome utente o password non validi errorGettingIgtimiAuthorizationUrl=Errore nella chiamata URL autorizzazione Igtimi: {0} addIgtimiUser=Aggiungi utente Igtimi -doYouReallyWantToRemoveLeaderboards=Confermare l''eliminazione delle classifiche? -doYouReallyWantToRemoveNonVisibleLeaderboards=Si stanno eliminando anche classifiche attualmente non visibili durante il filtro. Verranno rimosse le seguenti classifiche. Continuare?\n\n{0} doYouReallyWantToRemoveLeaderboardGroup=Confermare l''eliminazione del gruppo di classifiche “{0}”? -doYouReallyWantToRemoveLeaderboardGroups=Confermare l''eliminazione dei gruppi classifiche? -doYouReallyWantToRemoveNonVisibleLeaderboardGroups=Si sta eliminando anche gruppi di classifiche attualmente non visibili durante il filtro. Verranno rimossi i seguenti gruppi di classifiche. Continuare?\n\n{0} doYouReallyWantToRemoveTrackedRaces=Confermare l''eliminazione delle gare tracciate? doYouReallyWantToRemoveNonVisibleTrackedRaces=Si sta eliminando anche gare tracciate attualmente non visibili durante il filtro. Verranno rimosse le seguenti gare tracciate. Continuare?\n\n{0} errorTryingToRemoveIgtimiAccount=Errore nel tentativo di eliminare l’account Igtimi dell’utente {0} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ja.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ja.properties index 2e5764128fe..d7eaeb8cff4 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ja.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ja.properties @@ -401,8 +401,6 @@ noColor=色なし pleaseSelectARegatta=レガッタを選択してください。 addFleet=フリート追加 doYouReallyWantToRemoveRegatta=レガッタ "{0}" を削除しますか。削除すると、このレガッタのためのリーダーボードもすべて削除されます。 -doYouReallyWantToRemoveRegattas=レガッタを削除しますか。削除すると、これらのレガッタのためのリーダーボードもすべて削除されます。 -doYouReallyWantToRemoveNonVisibleRegattas=フィルタリングされていて現在表示されていないレガッタも削除しようとしています。以下のレガッタが削除されます。続行しますか。\n\n{0} errorLoadingScoreCorrectionProviders=スコア修正プロバイダのロードでエラー発生: {0} selectResultListToImportFrom=インポート元の結果一覧を選択 of=of @@ -953,8 +951,6 @@ hideToolbar=ツールバー非表示 showSeriesLeaderboards=シリーズリーダーボード表示 showOverallLeaderboard=全体リーダーボード表示 lineAngleToWindAndAdvantage=長さ: {0} m\n風とのアングル: {1}°\n{2} 側に {3} m のアドバンテージ -doYouReallyWantToRemoveNonVisibleEvents=フィルタリングされていて現在表示されていないイベントも削除しようとしています。以下のイベントが削除されます。続行しますか。\n\n{0} -doYouReallyWantToRemoveEvents=イベントを削除しますか doYouReallyWantToRemoveEvent=イベント {0} を削除しますか line=ライン offset=オフセット @@ -1026,11 +1022,7 @@ successfullyAuthorizedAccessToIgtimiUser=Igtimi ユーザ {0} へのアクセス couldNotAuthorizedAccessToIgtimiUser=ユーザ {0} への権限付与ができませんでした (ユーザ名またはパスワードが無効) errorGettingIgtimiAuthorizationUrl=Igtimi 権限 URL 取得でエラー発生: {0} addIgtimiUser=Igtimi ユーザ追加 -doYouReallyWantToRemoveLeaderboards=リーダーボードを削除しますか -doYouReallyWantToRemoveNonVisibleLeaderboards=フィルタリングされていて現在表示されていないリーダーボードも削除しようとしています。以下のリーダーボードが削除されます。続行しますか。\n\n{0} doYouReallyWantToRemoveLeaderboardGroup=リーダーボードグループ "{0}" を削除しますか -doYouReallyWantToRemoveLeaderboardGroups=リーダーボードグループを削除しますか -doYouReallyWantToRemoveNonVisibleLeaderboardGroups=フィルタリングされていて現在表示されていないリーダーボードグループも削除しようとしています。以下のリーダーボードグループが削除されます。続行しますか。\n\n{0} doYouReallyWantToRemoveTrackedRaces=追跡レースを削除しますか doYouReallyWantToRemoveNonVisibleTrackedRaces=フィルタリングされていて現在表示されていない追跡レースも削除しようとしています。以下の追跡レースが削除されます。続行しますか。\n\n{0} errorTryingToRemoveIgtimiAccount=ユーザ {0} の Igtimi アカウントを削除しようとしてエラーが発生 diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_pt.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_pt.properties index 40461ab888c..a7d347bce19 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_pt.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_pt.properties @@ -401,8 +401,6 @@ noColor=Nenhuma cor pleaseSelectARegatta=Selecione uma regata. addFleet=Adicionar flotilha doYouReallyWantToRemoveRegatta=Você tem a certeza que quer remover a regata "{0}"? Isto irá remover também todos os painéis de classificação para esta regata! -doYouReallyWantToRemoveRegattas=Você tem a certeza que quer remover as regatas? Isto irá remover também todos os painéis de classificação para essas regatas! -doYouReallyWantToRemoveNonVisibleRegattas=Você está também eliminando regatas que não estão atualmente visíveis ao filtrar. As seguintes regatas serão removidas. Continuar?\n\n{0} errorLoadingScoreCorrectionProviders=Erro ao carregar fornecedores de correções de pontuação: {0} selectResultListToImportFrom=Selecionar lista de resultados de onde efetuar a importação of=de @@ -953,8 +951,6 @@ hideToolbar=Ocultar barra de ferramentas showSeriesLeaderboards=Visualizar painéis de classificação da série showOverallLeaderboard=Visualizar painel de classificação geral lineAngleToWindAndAdvantage=comprimento: {0}m\nângulo em relação ao vento: {1}°\no lado {2} tem {3}m de vantagem -doYouReallyWantToRemoveNonVisibleEvents=Você está também eliminando eventos que não estão atualmente visíveis ao filtrar. Os seguintes eventos serão removidos. Continuar?\n\n{0} -doYouReallyWantToRemoveEvents=Você tem a certeza que quer remover os eventos? doYouReallyWantToRemoveEvent=Você tem a certeza que quer remover o evento {0}? line=Linha offset=Deslocamento @@ -1026,11 +1022,7 @@ successfullyAuthorizedAccessToIgtimiUser=Acesso autorizado com êxito ao usuári couldNotAuthorizedAccessToIgtimiUser=Não foi possível autorizar o usuário {0}; nome de usuário ou senha inválidos errorGettingIgtimiAuthorizationUrl=Erro ao obter URL de autorização de Igtimi: {0} addIgtimiUser=Adicionar usuário de Igtimi -doYouReallyWantToRemoveLeaderboards=Você tem a certeza que quer remover os painéis de classificação? -doYouReallyWantToRemoveNonVisibleLeaderboards=Você está também eliminando painéis de classificação que não estão atualmente visíveis ao filtrar. Os seguintes painéis de classificação serão removidos. Continuar?\n\n{0} doYouReallyWantToRemoveLeaderboardGroup=Você tem a certeza que quer remover o grupo de painéis de classificação "{0}"? -doYouReallyWantToRemoveLeaderboardGroups=Você tem a certeza que quer remover os grupos de painéis de classificação? -doYouReallyWantToRemoveNonVisibleLeaderboardGroups=Você está também eliminando grupos de painéis de classificação que não estão atualmente visíveis ao filtrar. Os seguintes grupos de painéis de classificação serão removidos. Continuar?\n\n{0} doYouReallyWantToRemoveTrackedRaces=Você tem a certeza que quer remover as corridas rastreadas? doYouReallyWantToRemoveNonVisibleTrackedRaces=Você está também eliminando corridas rastreadas que não estão atualmente visíveis ao filtrar. As seguintes corridas rastreadas serão removidas. Continuar?\n\n{0} errorTryingToRemoveIgtimiAccount=Erro ao tentar remover conta de Igtimi para usuário {0} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties index 69cca163c95..6d6f46df53c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties @@ -401,8 +401,6 @@ noColor=Без цвета pleaseSelectARegatta=Выберите регату. addFleet=Добавить флот doYouReallyWantToRemoveRegatta=Действительно удалить регату "{0}"? При этом также будут удалены все таблицы лидеров для данной регаты! -doYouReallyWantToRemoveRegattas=Действительно удалить эти регаты? Также будут удалены все таблицы лидеров для соответствующих регат! -doYouReallyWantToRemoveNonVisibleRegattas=Регаты, не отображаемые сейчас из-за фильтрации, также удаляются. Будут удалены следующие регаты. Продолжить?\n\n{0} errorLoadingScoreCorrectionProviders=Ошибка при загрузке поставщиков корректировки оценок: {0} selectResultListToImportFrom=Выберите список результатов для импорта of=из @@ -953,8 +951,6 @@ hideToolbar=Скрыть панель инструментов showSeriesLeaderboards=Показать таблицы лидеров серии showOverallLeaderboard=Показать итоговую таблицу лидеров lineAngleToWindAndAdvantage=длина: {0} м\nугол к ветру: {1}°\n{2} сторона имеет преимущество {3} м -doYouReallyWantToRemoveNonVisibleEvents=События, не отображаемые сейчас из-за фильтрации, также удаляются. Будут удалены следующие события. Продолжить?\n\n{0} -doYouReallyWantToRemoveEvents=Действительно удалить эти события? doYouReallyWantToRemoveEvent=Действительно удалить событие {0}? line=Линия offset=Сдвиг @@ -1026,11 +1022,7 @@ successfullyAuthorizedAccessToIgtimiUser=Успешно авторизован couldNotAuthorizedAccessToIgtimiUser=Не удалось авторизовать пользователя {0}; недействительное имя пользователя и пароль errorGettingIgtimiAuthorizationUrl=Ошибка при получении URL-адреса авторизации Igtimi: {0} addIgtimiUser=Добавить пользователя Igtimi -doYouReallyWantToRemoveLeaderboards=Действительно удалить эти таблицы лидеров? -doYouReallyWantToRemoveNonVisibleLeaderboards=Таблицы лидеров, не отображаемые сейчас из-за фильтрации, также удаляются. Будут удалены следующие таблицы лидеров. Продолжить?\n\n{0} doYouReallyWantToRemoveLeaderboardGroup=Действительно удалить группу таблиц лидеров "{0}"? -doYouReallyWantToRemoveLeaderboardGroups=Действительно удалить эти группы таблиц лидеров? -doYouReallyWantToRemoveNonVisibleLeaderboardGroups=Группы таблиц лидеров, не отображаемые сейчас из-за фильтрации, также удаляются. Будут удалены следующие группы таблиц лидеров. Продолжить?\n\n{0} doYouReallyWantToRemoveTrackedRaces=Действительно удалить эти отслеживаемые гонки? doYouReallyWantToRemoveNonVisibleTrackedRaces=Отслеживаемые гонки, не отображаемые сейчас из-за фильтрации, также удаляются. Будут удалены следующие отслеживаемые гонки. Продолжить?\n\n{0} errorTryingToRemoveIgtimiAccount=Ошибка при попытке удалить учетную запись Igtimi для пользователя {0} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties index 313f5e10481..479bc051ac9 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties @@ -401,8 +401,6 @@ noColor=没有颜色 pleaseSelectARegatta=请选择比赛。 addFleet=添加船队 doYouReallyWantToRemoveRegatta=是否确定移除比赛 "{0}"?还将移除此比赛的所有积分榜! -doYouReallyWantToRemoveRegattas=是否确定移除比赛?还将移除这些比赛的所有积分榜! -doYouReallyWantToRemoveNonVisibleRegattas=您还正要删除筛选时目前不可见的比赛。以下比赛将移除。是否继续?\n\n{0} errorLoadingScoreCorrectionProviders=加载得分更正机构出错: {0} selectResultListToImportFrom=选择从中导入的结果清单 of=/ @@ -953,8 +951,6 @@ hideToolbar=隐藏工具栏 showSeriesLeaderboards=显示系列积分榜 showOverallLeaderboard=显示总积分榜 lineAngleToWindAndAdvantage=长度: {0}m\n风力角度: {1}°\n{2}侧具有 {3}m 优势 -doYouReallyWantToRemoveNonVisibleEvents=您还正要删除筛选时目前不可见的活动。以下活动将移除。是否继续?\n\n{0} -doYouReallyWantToRemoveEvents=是否确定移除活动? doYouReallyWantToRemoveEvent=是否确定移除活动 {0}? line=线 offset=分支 @@ -1026,11 +1022,7 @@ successfullyAuthorizedAccessToIgtimiUser=已成功授予 Igtimi 用户{0}权限 couldNotAuthorizedAccessToIgtimiUser=无法授予用户{0}权限;用户名或密码无效 errorGettingIgtimiAuthorizationUrl=获取 Igtimi 权限 URL 出错: {0} addIgtimiUser=添加 Igtimi 用户 -doYouReallyWantToRemoveLeaderboards=是否确定移除积分榜? -doYouReallyWantToRemoveNonVisibleLeaderboards=您还正要删除筛选时目前不可见的积分榜。以下积分榜将移除。是否继续?\n\n{0} doYouReallyWantToRemoveLeaderboardGroup=是否确定移除积分榜组 "{0}"? -doYouReallyWantToRemoveLeaderboardGroups=是否确定移除积分榜组? -doYouReallyWantToRemoveNonVisibleLeaderboardGroups=您还正要删除筛选时目前不可见的积分榜组。以下积分榜组将移除。是否继续?\n\n{0} doYouReallyWantToRemoveTrackedRaces=是否确定移除跟踪的比赛轮次? doYouReallyWantToRemoveNonVisibleTrackedRaces=您还正要删除筛选时目前不可见的跟踪的比赛轮次。以下跟踪的比赛轮次将移除。是否继续?\n\n{0} errorTryingToRemoveIgtimiAccount=尝试移除用户{0}的 Igtimi 账户出错 diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java index ddaa68468a3..94d9e6166ab 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java @@ -14,14 +14,14 @@ import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.view.client.SetSelectionModel; -import com.sap.sse.gwt.client.celltable.RefreshableSelectionModel; import com.sap.sse.security.shared.HasPermissions; +import com.sap.sse.security.shared.dto.NamedDTO; import com.sap.sse.security.ui.client.UserService; /** * Panel where several buttons can be added which are either {@link #addUnsecuredAction(String, Command) unsecured} or * restricted for users with {@link #addCreateAction(String, Command) create} and /or - * {@link #addRemoveAction(RefreshableSelectionModel, String, Command)} remove} permissions. The {@link Button#setVisible(boolean) visibility} of + * {@link #addRemoveAction(String, Command) remove} permissions. The {@link Button#setVisible(boolean) visibility} of * secured buttons depend on the permissions of the currently logged-in user and changes dynamically. */ public class AccessControlledButtonPanel extends Composite { @@ -105,19 +105,62 @@ public class AccessControlledButtonPanel extends Composite { /** * Adds a secured action button, which is only visible if the current user has any * {@link UserService#hasCurrentUserPermissionToDeleteAnyObjectOfType(HasPermissions) delete permission} for the - * {@link HasPermissions type} provided in this {@link AccessControlledButtonPanel}'s constructor. - * - * @param selectionModel - * the {@link RefreshableSelectionModel}selection model of the table + * {@link HasPermissions type} provided in this {@link AccessControlledButtonPanel}'s constructor. This remove + * action is for panels with single selection model used. + * * @param text * the {@link String text} to show on the button * @param callback * the {@link Command callback} to execute on button click, if permission is granted * @return the created {@link Button} instance */ - public Button addRemoveAction(RefreshableSelectionModel selectionModel, final String text, + public Button addRemoveAction(final String text, final Command callback) { + return addAction(text, removePermissionCheck, callback); + } + + /** + * Adds a secured action button, which is only visible if the current user has any + * {@link UserService#hasCurrentUserPermissionToDeleteAnyObjectOfType(HasPermissions) delete permission} for the + * {@link HasPermissions type} provided in this {@link AccessControlledButtonPanel}'s constructor. This remove + * action is for panels which use multi selection model and list of selected elements could be shown on confirmation + * window. + * + * @param selectionModel + * the {@link SetSelectionModel} of elements which will show their names on the remove button + * @param text + * the {@link String text} to show on the button + * @param callback + * the {@link Command callback} to execute on button click, if permission is granted + * @return the created {@link Button} instance + */ + public Button addRemoveActionWithConfirmation(final SetSelectionModel selectionModel, + final String text, final Command callback) { + ClickHandler handler = wrap(removePermissionCheck, callback); + final Button button = new SelectedElementsCountingButton(text, selectionModel, handler); + resolveButtonVisibility(removePermissionCheck, button); + return button; + } + + /** + * Adds a secured action button, which is only visible if the current user has any + * {@link UserService#hasCurrentUserPermissionToDeleteAnyObjectOfType(HasPermissions) delete permission} for the + * {@link HasPermissions type} provided in this {@link AccessControlledButtonPanel}'s constructor. This remove + * action is for panels which use multi selection model where callback could not be passed to button. + * + * @param selectionModel + * the {@link SetSelectionModel} of elements which will show their names on the remove button + * @param text + * the {@link String text} to show on the button + * @param callback + * the {@link Command callback} to execute on button click, if permission is granted + * @return the created {@link Button} instance + */ + public Button addRemoveAction(final SetSelectionModel selectionModel, final String text, final Command callback) { - return addAction(selectionModel, text, removePermissionCheck, callback); + ClickHandler handler = wrap(removePermissionCheck, callback); + final Button button = new SelectedElementsCountingButton(selectionModel, text, handler); + resolveButtonVisibility(removePermissionCheck, button); + return button; } /** @@ -147,36 +190,44 @@ public class AccessControlledButtonPanel extends Composite { * @return the created {@link Button} instance */ public Button addAction(final String text, final Supplier permissionCheck, final Command callback) { - return addAction(null, text, permissionCheck, callback); + final Button button = new Button(text, (ClickHandler) event -> { + if (permissionCheck.get()) { + callback.execute(); + } + }); + resolveButtonVisibility(permissionCheck, button); + return button; } /** * Adds an action button, which's visibility depends on the provided {@link Supplier permission check} - * - * @param selectionModel - * the {@link RefreshableSelectionModel} selection model. If actual object is passed then instance of - * {@link SelectedElementsCountingButton} is created. If null is passed then native gwt {@link Button} is - * created. + * + * @param + * the type of selected elements which could provide their names to confirmation window * @param text - * the {@link String text} to show on the button + * the essential part of {@link String text} to show on the button * @param permissionCheck * the {@link Supplier permission check} to decide if the action button is visible or not * @param callback * the {@link Command callback} to execute on button click, if permission is granted - * @param - * type of DTO objects which are selected - * @return the {@link Button} instance + * @return the created {@link Button} instance */ - private Button addAction(final SetSelectionModel selectionModel, final String text, - final Supplier permissionCheck, final Command callback) { - ClickHandler handler = wrap(permissionCheck, callback); - final Button button = selectionModel == null ? new Button(text, handler) - : new SelectedElementsCountingButton(selectionModel, text, handler); + public Button addRemoveCountingAction(final SetSelectionModel selectionModel, + final String text, final Supplier permissionCheck, final Command callback) { + final Button button = new SelectedElementsCountingButton(text, selectionModel, (ClickHandler) event -> { + if (permissionCheck.get()) { + callback.execute(); + } + }); + resolveButtonVisibility(permissionCheck, button); + return button; + } + + private void resolveButtonVisibility(final Supplier permissionCheck, final Button button) { this.buttonToPermissions.put(button, permissionCheck); button.getElement().getStyle().setMarginRight(5, Unit.PX); this.panel.add(button); this.visibilityUpdater.accept(button, permissionCheck); - return button; } private ClickHandler wrap(Supplier permissionCheck, Command callback) { diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/RoleDefinitionsPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/RoleDefinitionsPanel.java index 918d46fa9d0..249a4926fc8 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/RoleDefinitionsPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/RoleDefinitionsPanel.java @@ -102,7 +102,7 @@ public class RoleDefinitionsPanel extends VerticalPanel { buttonPanel.addUnsecuredAction(stringMessages.refresh(), this::updateRoleDefinitions); buttonPanel.addCreateActionWithoutServerCreateObjectPermissionCheck(stringMessages.add(), this::createRoleDefinition); - buttonPanel.addRemoveAction(refreshableRoleDefinitionMultiSelectionModel, stringMessages.remove(), () -> { + buttonPanel.addRemoveAction(stringMessages.remove(), () -> { final String roles = String.join(", ", Util.map(getSelectedRoleDefinitions(), RoleDefinitionDTO::getName)); if (Window.confirm(stringMessages.doYouReallyWantToRemoveRole(roles))) { final Set selectedRoles = new HashSet<>(getSelectedRoleDefinitions()); diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/SelectedElementsCountingButton.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/SelectedElementsCountingButton.java index 1facc99acca..b1856f073f5 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/SelectedElementsCountingButton.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/SelectedElementsCountingButton.java @@ -1,29 +1,61 @@ package com.sap.sse.security.ui.client.component; import com.google.gwt.event.dom.client.ClickHandler; -import com.google.gwt.safehtml.shared.annotations.IsSafeHtml; +import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Button; import com.google.gwt.view.client.SetSelectionModel; +import com.sap.sse.security.shared.dto.NamedDTO; +import com.sap.sse.security.ui.client.i18n.StringMessages; import java.util.Set; +import java.util.stream.Collectors; /** - * The implementation of Button which re-draws it's label based on SelectionEvent with showing the number of selected - * items. If number of selected items is <= 1 then no number is shown - * + * The button can draw the count of selected element. Optionally callback could be passed from outside and confirmation + * window could appear + * * @author Dmitry Bilyk * */ -public class SelectedElementsCountingButton extends Button { - public SelectedElementsCountingButton(final SetSelectionModel selectionModel, final @IsSafeHtml String html, - final ClickHandler handler) { + +public class SelectedElementsCountingButton extends Button { + + public SelectedElementsCountingButton(final String html, + final SetSelectionModel selectionModel, final ClickHandler clickHandler) { + super(html); + setEnabled(!selectionModel.getSelectedSet().isEmpty()); + addSelectionEventHandler(html, selectionModel); + addClickHandler(event -> { + if (askUserForConfirmation(selectionModel)) { + clickHandler.onClick(event); + } + }); + } + + public SelectedElementsCountingButton(final String html, + final SetSelectionModel selectionModel) { + super(html); + setEnabled(!selectionModel.getSelectedSet().isEmpty()); + addSelectionEventHandler(html, selectionModel); + } + + public SelectedElementsCountingButton(SetSelectionModel selectionModel, String html, ClickHandler handler) { super(html, handler); - setEnabled(false); + setEnabled(!selectionModel.getSelectedSet().isEmpty()); + addSelectionEventHandler(html, selectionModel); + } + + private void addSelectionEventHandler(String html, SetSelectionModel selectionModel) { selectionModel.addSelectionChangeHandler(event -> { Set selectedSet = selectionModel.getSelectedSet(); setText(selectedSet.size() <= 1 ? html : html + " (" + selectedSet.size() + ")"); setEnabled(!selectedSet.isEmpty()); }); + } + private boolean askUserForConfirmation(SetSelectionModel selectionModel) { + final String names = selectionModel.getSelectedSet().stream().map(NamedDTO::getName) + .collect(Collectors.joining("\n")); + return Window.confirm(StringMessages.INSTANCE.doYouReallyWantToRemoveSelectedElements(names)); } } diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupManagementPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupManagementPanel.java index 4c21536f843..196b46e992a 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupManagementPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupManagementPanel.java @@ -71,7 +71,7 @@ public class UserGroupManagementPanel extends Composite { buttonPanel.addCreateActionWithoutServerCreateObjectPermissionCheck(stringMessages.createUserGroup(), () -> new CreateUserGroupDialog(stringMessages, userService, userManagementService, userGroupListDataProvider, () -> updateUserGroups()).show()); - final Button removeButton = buttonPanel.addRemoveAction(userGroupSelectionModel, stringMessages.removeUserGroup(), () -> { + final Button removeButton = buttonPanel.addRemoveAction(stringMessages.removeUserGroup(), () -> { Set userGroups = userGroupTableWrapper.getSelectionModel().getSelectedSet(); if (userGroups == null || userGroups.isEmpty()) { Window.alert(stringMessages.youHaveToSelectAUserGroup()); @@ -102,6 +102,7 @@ public class UserGroupManagementPanel extends Composite { } }); userGroupSelectionModel.addSelectionChangeHandler(event -> { + removeButton.setText(stringMessages.remove() + " (" + userGroupSelectionModel.getSelectedSet().size() + ")"); removeButton.setEnabled(userGroupSelectionModel.getSelectedSet().size() >= 1); }); return buttonPanel; @@ -151,4 +152,4 @@ public class UserGroupManagementPanel extends Composite { userGroupDetailPanel.refreshSuggest(); userGroupRoleDefinitionPanel.refreshSuggest(); } -} \ No newline at end of file +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.java index 14c95860325..eaa5944cfff 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.java @@ -126,6 +126,7 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages { String actionChangeOwnership(); String errorUpdatingOwnership(String name); String doYouReallyWantToRemoveRole(String name); + String doYouReallyWantToRemoveSelectedElements(String message); String errorTryingToDeleteRole(String rolename, String message); String pleaseEnterARoleName(); String editRoles(); diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.properties b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.properties index 642bf294724..9588c57652e 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.properties +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.properties @@ -115,6 +115,7 @@ createUserGroup=Create user group removeUserGroup=Remove user group youHaveToSelectAUserGroup=You have to select a user group. doYouReallyWantToRemoveUserGroup=Do you really want to remove user group {0}? +doYouReallyWantToRemoveSelectedElements=The following element(s) will be removed. Do you want to continue?\n\n{0} couldNotDeleteUserGroup=Could not delete user group. filterUserGroups=Filter user groups... id=ID @@ -190,4 +191,4 @@ permission=Permission nullUserGroup= editRolesAndPermissionsForUser=Edit roles and permissions for user {0} permissionType=Permission Type -couldNotLoadMarkTemplates=Could not load mark templates. \ No newline at end of file +couldNotLoadMarkTemplates=Could not load mark templates. diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/usermanagement/UserManagementPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/usermanagement/UserManagementPanel.java index bc3a8b5de38..6d4533cff24 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/usermanagement/UserManagementPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/usermanagement/UserManagementPanel.java @@ -49,7 +49,7 @@ public class UserManagementPanel
    exte public UserManagementPanel(final UserService userService, final StringMessages stringMessages, ErrorReporter errorReporter, TR tableResources) { - this(userService, stringMessages, Collections. emptySet(), errorReporter, tableResources); + this(userService, stringMessages, Collections.emptySet(), errorReporter, tableResources); } public UserManagementPanel(final UserService userService, final StringMessages stringMessages, @@ -73,7 +73,7 @@ public class UserManagementPanel exte e -> editRolesAndPermissionsForUserButton.setEnabled(!userNameTextbox.getText().isEmpty())); editRolesAndPermissionsForUserButton.setEnabled(false); userSelectionModel = userList.getSelectionModel(); - buttonPanel.addRemoveAction(userList.getSelectionModel(), stringMessages.remove(), () -> { + buttonPanel.addRemoveAction(userSelectionModel, stringMessages.remove(), () -> { assert userSelectionModel.getSelectedSet().size() > 0; final Set usersToDelete = new HashSet<>(); final Set usernamesToDelete = new HashSet<>(); @@ -159,7 +159,8 @@ public class UserManagementPanel exte updateUsers(); } }).show(); - } else { + } + else { Notification.notify(StringMessages.INSTANCE.userNotFound(userNameTextbox.getText()), NotificationType.ERROR); } @@ -180,11 +181,11 @@ public class UserManagementPanel exte userList.refreshUserList((Callback, Throwable>) null); } - public void addUserCreatedEventHandler(UserCreatedEventHandler handler) { + public void addUserCreatedEventHandler(UserCreatedEventHandler handler){ this.userCreatedHandlers.add(handler); } - public void removeUserCreatedEventHandler(UserCreatedEventHandler handler) { + public void removeUserCreatedEventHandler(UserCreatedEventHandler handler){ this.userCreatedHandlers.remove(handler); } @@ -192,11 +193,11 @@ public class UserManagementPanel exte void onUserCreated(UserDTO user); } - public void addUserDeletedEventHandler(UserDeletedEventHandler handler) { + public void addUserDeletedEventHandler(UserDeletedEventHandler handler){ this.userDeletedHandlers.add(handler); } - public void removeUserDeletedEventHandler(UserDeletedEventHandler handler) { + public void removeUserDeletedEventHandler(UserDeletedEventHandler handler){ this.userDeletedHandlers.remove(handler); } From ef3887163bdd3157e0f4b816c927d1db1da73aab Mon Sep 17 00:00:00 2001 From: dmitry Date: Tue, 14 Apr 2020 13:18:21 +0300 Subject: [PATCH 106/188] bug5178: introduced univeral message for confirmation and related method in access panel --- .../DeviceConfigurationPanel.java | 9 +- .../ui/adminconsole/EventListComposite.java | 21 +---- .../adminconsole/LeaderboardConfigPanel.java | 29 ++----- .../LeaderboardGroupConfigPanel.java | 11 +-- .../adminconsole/RegattaManagementPanel.java | 15 ++-- .../RemoteServerInstancesManagementPanel.java | 9 +- .../ResultImportUrlsListComposite.java | 12 +-- .../SwissTimingEventManagementPanel.java | 80 +++++++++--------- .../SwissTimingReplayConnectorPanel.java | 30 +++---- .../TrackedRacesListComposite.java | 25 +----- .../coursecreation/CourseTemplatePanel.java | 46 +++++----- .../coursecreation/MarkPropertiesPanel.java | 46 +++++----- .../sailing/gwt/ui/client/StringMessages.java | 1 - .../gwt/ui/client/StringMessages.properties | 1 - .../ui/client/StringMessages_de.properties | 1 - .../ui/client/StringMessages_es.properties | 1 - .../ui/client/StringMessages_fr.properties | 1 - .../ui/client/StringMessages_it.properties | 1 - .../ui/client/StringMessages_ja.properties | 1 - .../ui/client/StringMessages_pt.properties | 1 - .../ui/client/StringMessages_ru.properties | 1 - .../ui/client/StringMessages_zh.properties | 1 - .../AccessControlledButtonPanel.java | 84 ++++--------------- .../SelectedElementsCountingButton.java | 65 +++++++------- .../usergroup/users/UserGroupDetailPanel.java | 2 +- .../usermanagement/UserManagementPanel.java | 2 +- 26 files changed, 168 insertions(+), 328 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationPanel.java index a73f5d30a1c..86042925aba 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationPanel.java @@ -92,14 +92,7 @@ public class DeviceConfigurationPanel extends SimplePanel implements DeviceConfi if (userService.hasCreatePermission(SecuredDomainType.RACE_MANAGER_APP_DEVICE_CONFIGURATION)) { deviceManagementControlPanel.add(addConfigurationButton); } - removeConfigurationButton = new SelectedElementsCountingButton(refreshableMultiSelectionModel, - stringMessages.remove(), new ClickHandler() { - - @Override - public void onClick(ClickEvent event) { - removeConfiguration(); - } - }); + removeConfigurationButton = new SelectedElementsCountingButton(stringMessages.remove(), refreshableMultiSelectionModel, true, (event) -> removeConfiguration()); deviceManagementControlPanel.add(removeConfigurationButton); refreshConfigurationsButton = new Button(stringMessages.refresh()); refreshConfigurationsButton.addClickHandler(new ClickHandler() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java index 6332ff5b57c..ae5cee05c22 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java @@ -16,8 +16,6 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; -import java.util.stream.Collectors; - import com.google.gwt.cell.client.AbstractCell; import com.google.gwt.cell.client.SafeHtmlCell; import com.google.gwt.cell.client.ValueUpdater; @@ -32,7 +30,6 @@ import com.google.gwt.user.cellview.client.CellTable; import com.google.gwt.user.cellview.client.Column; import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler; import com.google.gwt.user.cellview.client.TextColumn; -import com.google.gwt.user.client.Command; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; @@ -71,7 +68,6 @@ import com.sap.sse.gwt.client.dialog.DataEntryDialog; import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback; import com.sap.sse.gwt.client.panels.LabeledAbstractFilterablePanel; import com.sap.sse.security.shared.HasPermissions.DefaultActions; -import com.sap.sse.security.shared.dto.NamedDTO; import com.sap.sse.security.shared.dto.UserDTO; import com.sap.sse.security.ui.client.UserService; import com.sap.sse.security.ui.client.component.AccessControlledActionsColumn; @@ -167,21 +163,8 @@ public class EventListComposite extends Composite implements EventsRefresher, Le refresh.ensureDebugId("RefreshEventsButton"); final Button create = buttonPanel.addCreateAction(stringMessages.actionAddEvent(), this::openCreateEventDialog); create.ensureDebugId("CreateEventButton"); - final Button remove = buttonPanel.addRemoveAction(refreshableEventSelectionModel, stringMessages.remove(), - new Command() { - @Override - public void execute() { - if (askUserForConfirmation()) { - removeEvents(refreshableEventSelectionModel.getSelectedSet()); - } - } - - private boolean askUserForConfirmation() { - final String names = refreshableEventSelectionModel.getSelectedSet().stream() - .map(NamedDTO::getName).collect(Collectors.joining("\n")); - return Window.confirm(StringMessages.INSTANCE.doYouReallyWantToRemoveSelectedElements(names)); - } - }); + final Button remove = buttonPanel.addRemoveAction(stringMessages.remove(), refreshableEventSelectionModel, true, + () -> removeEvents(refreshableEventSelectionModel.getSelectedSet())); remove.ensureDebugId("RemoveEventsButton"); this.refreshableEventSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java index 2fbcc42b04e..acfd4020671 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java @@ -31,8 +31,6 @@ import java.util.Set; import java.util.function.Supplier; import java.util.logging.Level; import java.util.logging.Logger; -import java.util.stream.Collectors; - import com.google.gwt.cell.client.AbstractCell; import com.google.gwt.cell.client.FieldUpdater; import com.google.gwt.core.client.GWT; @@ -46,7 +44,6 @@ import com.google.gwt.user.cellview.client.Column; import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler; import com.google.gwt.user.cellview.client.ColumnSortList; import com.google.gwt.user.cellview.client.TextColumn; -import com.google.gwt.user.client.Command; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; @@ -102,7 +99,6 @@ import com.sap.sse.gwt.client.shared.components.SettingsDialogForLinkSharing; import com.sap.sse.gwt.client.shared.perspective.PerspectiveCompositeSettings; import com.sap.sse.security.shared.HasPermissions; import com.sap.sse.security.shared.HasPermissions.DefaultActions; -import com.sap.sse.security.shared.dto.NamedDTO; import com.sap.sse.security.ui.client.UserService; import com.sap.sse.security.ui.client.component.AccessControlledActionsColumn; import com.sap.sse.security.ui.client.component.AccessControlledButtonPanel; @@ -165,22 +161,8 @@ public class LeaderboardConfigPanel extends AbstractLeaderboardConfigPanel leaderboardCreateAndRegattaReadPermission, this::createRegattaLeaderboardWithEliminations); createRegattaLeaderboardWithEliminationsBtn.ensureDebugId("CreateRegattaLeaderboardWithEliminationsButton"); - leaderboardRemoveButton = buttonPanel.addRemoveAction(leaderboardSelectionModel, stringMessages.remove(), - new Command() { - - @Override - public void execute() { - if (askUserForConfirmation()) { - removeLeaderboards(leaderboardSelectionModel.getSelectedSet()); - } - } - - private boolean askUserForConfirmation() { - final String names = leaderboardSelectionModel.getSelectedSet().stream().map(NamedDTO::getName) - .collect(Collectors.joining("\n")); - return Window.confirm(StringMessages.INSTANCE.doYouReallyWantToRemoveSelectedElements(names)); - } - }); + leaderboardRemoveButton = buttonPanel.addRemoveAction(stringMessages.remove(), leaderboardSelectionModel, true, + () -> removeLeaderboards(leaderboardSelectionModel.getSelectedSet())); leaderboardRemoveButton.ensureDebugId("LeaderboardsRemoveButton"); } @@ -344,8 +326,7 @@ public class LeaderboardConfigPanel extends AbstractLeaderboardConfigPanel }); editCompetitorsDialog.show(); }); - leaderboardActionColumn.addAction(LeaderboardConfigImagesBarCell.ACTION_CONFIGURE_URL, READ, - leaderboardDTO -> { + leaderboardActionColumn.addAction(LeaderboardConfigImagesBarCell.ACTION_CONFIGURE_URL, READ, leaderboardDTO -> { sailingService.getAvailableDetailTypesForLeaderboard(leaderboardDTO.getName(), null, new AsyncCallback>() { @@ -869,8 +850,8 @@ public class LeaderboardConfigPanel extends AbstractLeaderboardConfigPanel raceColumnTable.getDataProvider().getList().clear(); for (RaceColumnDTO raceColumn : selectedLeaderboard.getRaceList()) { for (FleetDTO fleet : raceColumn.getFleets()) { - raceColumnTable.getDataProvider().getList().add(new RaceColumnDTOAndFleetDTOWithNameBasedEquality( - raceColumn, fleet, selectedLeaderboard)); + raceColumnTable.getDataProvider().getList().add( + new RaceColumnDTOAndFleetDTOWithNameBasedEquality(raceColumn, fleet, selectedLeaderboard)); } } selectedLeaderBoardPanel.setVisible(true); 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 c39e3d88204..cd47bf68099 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 @@ -32,7 +32,6 @@ import com.google.gwt.user.cellview.client.CellTable.Resources; import com.google.gwt.user.cellview.client.Column; import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler; import com.google.gwt.user.cellview.client.TextColumn; -import com.google.gwt.user.client.Command; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; @@ -652,14 +651,8 @@ public class LeaderboardGroupConfigPanel extends AbstractRegattaPanel refreshableGroupsSelectionModel = leaderboardTableSelectionColumn.getSelectionModel(); - removeButton = buttonPanel.addRemoveActionWithConfirmation(refreshableGroupsSelectionModel, - stringMessages.remove(), new Command() { - - @Override - public void execute() { - removeLeaderboardGroups(refreshableGroupsSelectionModel.getSelectedSet()); - } - }); + removeButton = buttonPanel.addRemoveAction(stringMessages.remove(), refreshableGroupsSelectionModel, true, + () -> removeLeaderboardGroups(refreshableGroupsSelectionModel.getSelectedSet())); removeButton.ensureDebugId("RemoveLeaderboardButton"); refreshableGroupsSelectionModel.addSelectionChangeHandler(event -> groupSelectionChanged()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaManagementPanel.java index 7b6a4609e06..7653ebe3d64 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaManagementPanel.java @@ -8,7 +8,6 @@ import java.util.Collections; import java.util.HashSet; import java.util.List; -import com.google.gwt.user.client.Command; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.CaptionPanel; @@ -75,15 +74,11 @@ public class RegattaManagementPanel extends SimplePanel implements RegattasDispl final Button create = buttonPanel.addCreateAction(stringMessages.addRegatta(), this::openCreateRegattaDialog); create.ensureDebugId("AddRegattaButton"); - final Button remove = buttonPanel.addRemoveActionWithConfirmation(refreshableRegattaMultiSelectionModel, - stringMessages.remove(), new Command() { - - @Override - public void execute() { - // unmodifiable collection can't be sent to the server. - final Collection regattas = createModifiableCollection(); - removeRegattas(regattas); - } + final Button remove = buttonPanel.addRemoveAction(stringMessages.remove(), + refreshableRegattaMultiSelectionModel, true, () -> { + // unmodifiable collection can't be sent to the server. + final Collection regattas = createModifiableCollection(); + removeRegattas(regattas); }); regattasContentPanel.add(buttonPanel); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RemoteServerInstancesManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RemoteServerInstancesManagementPanel.java index 34d823c5d50..5b7f0ae5f73 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RemoteServerInstancesManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RemoteServerInstancesManagementPanel.java @@ -113,14 +113,7 @@ public class RemoteServerInstancesManagementPanel extends SimplePanel { } }); - buttonPanel.add(new SelectedElementsCountingButton(refreshableServerSelectionModel, stringMessages.remove(), - new ClickHandler() { - - @Override - public void onClick(ClickEvent event) { - removeSelectedSailingServers(); - } - })); + buttonPanel.add(new SelectedElementsCountingButton(stringMessages.remove(), refreshableServerSelectionModel, true, (event) -> removeSelectedSailingServers())); Button refreshButton = new Button(stringMessages.refresh()); buttonPanel.add(refreshButton); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/ResultImportUrlsListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/ResultImportUrlsListComposite.java index 6834086be36..29567f242c0 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/ResultImportUrlsListComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/ResultImportUrlsListComposite.java @@ -4,8 +4,6 @@ import java.util.List; import java.util.Set; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; -import com.google.gwt.user.client.Command; -import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.CaptionPanel; @@ -56,14 +54,8 @@ public class ResultImportUrlsListComposite extends Composite { final Button add = buttonPanel.addCreateAction(stringMessages.add(), this::addUrl); add.setEnabled(false); - buttonPanel.addRemoveAction(table.getSelectionModel(), stringMessages.remove(), new Command() { - @Override - public void execute() { - if (Window.confirm(stringMessages.doYouReallyWantToRemoveResultImportUrls())) { - removeUrls(table.getSelectionModel().getSelectedSet()); - } - } - }); + buttonPanel.addRemoveAction(stringMessages.remove(), table.getSelectionModel(), true, + () -> removeUrls(table.getSelectionModel().getSelectedSet())); final Button refresh = buttonPanel.addUnsecuredAction(stringMessages.refresh(), this::updateTable); refresh.setEnabled(false); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java index 667f7bead7a..1cf2a4f4286 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java @@ -91,52 +91,50 @@ public class SwissTimingEventManagementPanel extends AbstractEventManagementPane () -> connectionsTable.refreshSwissTimingConnectionList()); // Add SwissTiming Connection buttonPanel.addCreateAction(stringMessages.addSwissTimingConnection(), - () -> new SwissTimingConnectionDialog( - new DialogCallback() { - @Override - public void ok(SwissTimingConfigurationWithSecurityDTO editedConnection) { - sailingService.createSwissTimingConfiguration(editedConnection.getName(), - editedConnection.getJsonUrl(), editedConnection.getHostname(), - editedConnection.getPort(), editedConnection.getUpdateURL(), - editedConnection.getUpdateUsername(), editedConnection.getUpdatePassword(), - new MarkedAsyncCallback(new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - errorReporter - .reportError("Exception trying to create configuration in DB: " - + caught.getMessage()); - } + () -> new SwissTimingConnectionDialog(new DialogCallback() { + @Override + public void ok(SwissTimingConfigurationWithSecurityDTO editedConnection) { + sailingService.createSwissTimingConfiguration(editedConnection.getName(), + editedConnection.getJsonUrl(), editedConnection.getHostname(), + editedConnection.getPort(), editedConnection.getUpdateURL(), + editedConnection.getUpdateUsername(), editedConnection.getUpdatePassword(), + new MarkedAsyncCallback(new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError("Exception trying to create configuration in DB: " + + caught.getMessage()); + } - @Override - public void onSuccess(Void voidResult) { - connectionsTable.refreshSwissTimingConnectionList(); - connectionsTable.getFilterField().search(editedConnection.getJsonUrl()); - } - })); - } + @Override + public void onSuccess(Void voidResult) { + connectionsTable.refreshSwissTimingConnectionList(); + connectionsTable.getFilterField().search(editedConnection.getJsonUrl()); + } + })); + } - @Override - public void cancel() { - } - }, userService, errorReporter).show()); + @Override + public void cancel() { + } + }, userService, errorReporter).show()); // Remove SwissTiming Connection - final Button removeButton = buttonPanel.addRemoveAction(connectionsTable.getSelectionModel(), - stringMessages.remove(), () -> { - sailingService.deleteSwissTimingConfiguration(connectionsTable.getSelectionModel().getSelectedObject(), - new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError( - "Exception trying to delete configuration in DB: " + caught.getMessage()); - } + final Button removeButton = buttonPanel.addRemoveAction(stringMessages.remove(), + connectionsTable.getSelectionModel(), false, () -> { + sailingService.deleteSwissTimingConfiguration( + connectionsTable.getSelectionModel().getSelectedObject(), new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError( + "Exception trying to delete configuration in DB: " + caught.getMessage()); + } - @Override - public void onSuccess(Void result) { - connectionsTable.refreshSwissTimingConnectionList(); - } - }); - }); + @Override + public void onSuccess(Void result) { + connectionsTable.refreshSwissTimingConnectionList(); + } + }); + }); // List Races in SwissTiming Connection final Button listRacesButton = buttonPanel.addUnsecuredAction(stringMessages.listRaces(), () -> { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingReplayConnectorPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingReplayConnectorPanel.java index 495aa163c2c..ef19e687f3a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingReplayConnectorPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingReplayConnectorPanel.java @@ -281,22 +281,22 @@ public class SwissTimingReplayConnectorPanel extends AbstractEventManagementPane } }, userService, errorReporter).show()); // Remove action - final Button removeButton = buttonPanel.addRemoveAction(connectionsTable.getSelectionModel(), - stringMessages.remove(), () -> { - sailingService.deleteSwissTimingArchiveConfiguration( - connectionsTable.getSelectionModel().getSelectedObject(), new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError( - "Exception trying to delete configuration in DB: " + caught.getMessage()); - } + final Button removeButton = buttonPanel.addRemoveAction(stringMessages.remove(), + connectionsTable.getSelectionModel(), false, () -> { + sailingService.deleteSwissTimingArchiveConfiguration( + connectionsTable.getSelectionModel().getSelectedObject(), new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError( + "Exception trying to delete configuration in DB: " + caught.getMessage()); + } - @Override - public void onSuccess(Void result) { - connectionsTable.refreshConnectionList(); - } - }); - }); + @Override + public void onSuccess(Void result) { + connectionsTable.refreshConnectionList(); + } + }); + }); // List Race action final Button listRacesButton = buttonPanel.addUnsecuredAction(stringMessages.listRaces(), () -> { fillRaces(sailingService); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java index c9aa55d13b0..eb984f92d3e 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java @@ -4,11 +4,8 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; -import java.util.stream.Collectors; - import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; -import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.HorizontalPanel; @@ -147,24 +144,10 @@ public class TrackedRacesListComposite extends AbstractTrackedRacesListComposite btnExport.setEnabled(false); trackedRacesButtonPanel.add(btnExport); - btnRemoveRace = new SelectedElementsCountingButton(refreshableSelectionModel, stringMessages.remove(), - new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - if (askUserForConfirmation()) { - removeAndUntrackRaces(refreshableSelectionModel.getSelectedSet()); - } - } - - private boolean askUserForConfirmation() { - final String names = refreshableSelectionModel.getSelectedSet().stream() - .map(e -> e.getRegattaName() + " - " + e.getName()) - .collect(Collectors.joining("\n")); - return Window - .confirm(StringMessages.INSTANCE.doYouReallyWantToRemoveSelectedElements(names)); - } - - }); + btnRemoveRace = new SelectedElementsCountingButton(stringMessages.remove(), + refreshableSelectionModel, + e -> e.getRegattaName() + " - " + e.getName(), + (event) -> removeAndUntrackRaces(refreshableSelectionModel.getSelectedSet())); btnRemoveRace.ensureDebugId("RemoveRaceButton"); trackedRacesButtonPanel.add(btnRemoveRace); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java index fd6b78904d9..16208a6f5da 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java @@ -115,33 +115,9 @@ public class CourseTemplatePanel extends FlowPanel { } }); - buttonAndFilterPanel.addRemoveActionWithConfirmation(refreshableSelectionModel, stringMessages.remove(), - new Command() { - - @Override - public void execute() { - removeCourseTemplates(refreshableSelectionModel.getSelectedSet().stream() - .map(courseTemplateDTO -> courseTemplateDTO.getUuid()).collect(Collectors.toList())); - } - - private void removeCourseTemplates(Collection courseTemplatesUuids) { - if (!courseTemplatesUuids.isEmpty()) { - sailingService.removeCourseTemplates(courseTemplatesUuids, new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError( - "Error trying to remove course teamplates:" + caught.getMessage()); - } - - @Override - public void onSuccess(Void result) { - refreshCourseTemplates(); - } - }); - } - } - - }); + buttonAndFilterPanel.addRemoveAction(stringMessages.remove(), refreshableSelectionModel, true, + () -> removeCourseTemplates(refreshableSelectionModel.getSelectedSet().stream() + .map(courseTemplateDTO -> courseTemplateDTO.getUuid()).collect(Collectors.toList()))); buttonAndFilterPanel.addUnsecuredWidget(lblFilterRaces); buttonAndFilterPanel.addUnsecuredWidget(filterableCourseTemplatePanel); @@ -150,6 +126,22 @@ public class CourseTemplatePanel extends FlowPanel { } + private void removeCourseTemplates(Collection courseTemplatesUuids) { + if (!courseTemplatesUuids.isEmpty()) { + sailingService.removeCourseTemplates(courseTemplatesUuids, new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError("Error trying to remove course teamplates:" + caught.getMessage()); + } + + @Override + public void onSuccess(Void result) { + refreshCourseTemplates(); + } + }); + } + } + public void loadCourseTemplates() { courseTemplateListDataProvider.getList().clear(); sailingService.getCourseTemplates(new AsyncCallback>() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java index a1f1824b21e..b10658928fc 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java @@ -122,33 +122,9 @@ public class MarkPropertiesPanel extends FlowPanel { openEditMarkPropertiesDialog(new MarkPropertiesDTO()); } }); - buttonAndFilterPanel.addRemoveActionWithConfirmation(refreshableSelectionModel, stringMessages.remove(), - new Command() { - - @Override - public void execute() { - removeMarkProperties(refreshableSelectionModel.getSelectedSet().stream() - .map(markPropertiesDTO -> markPropertiesDTO.getUuid()).collect(Collectors.toList())); - } - - private void removeMarkProperties(Collection markPropertiesUuids) { - if (!markPropertiesUuids.isEmpty()) { - sailingService.removeMarkProperties(markPropertiesUuids, new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError( - "Error trying to remove mark properties:" + caught.getMessage()); - } - - @Override - public void onSuccess(Void result) { - refreshMarkProperties(); - } - }); - } - } - - }); + buttonAndFilterPanel.addRemoveAction(stringMessages.remove(), refreshableSelectionModel, true, + () -> removeMarkProperties(refreshableSelectionModel.getSelectedSet().stream() + .map(markPropertiesDTO -> markPropertiesDTO.getUuid()).collect(Collectors.toList()))); buttonAndFilterPanel.addUnsecuredWidget(lblFilterRaces); filterableMarkProperties.getTextBox().ensureDebugId("MarkPropertiesFilterTextBox"); buttonAndFilterPanel.addUnsecuredWidget(filterableMarkProperties); @@ -156,6 +132,22 @@ public class MarkPropertiesPanel extends FlowPanel { .setUpdatePermissionFilterForCheckbox(event -> userService.hasPermission(event, DefaultActions.UPDATE)); } + private void removeMarkProperties(Collection markPropertiesUuids) { + if (!markPropertiesUuids.isEmpty()) { + sailingService.removeMarkProperties(markPropertiesUuids, new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError("Error trying to remove mark properties:" + caught.getMessage()); + } + + @Override + public void onSuccess(Void result) { + refreshMarkProperties(); + } + }); + } + } + public void loadMarkProperties() { markPropertiesListDataProvider.getList().clear(); sailingService.getMarkProperties(new AsyncCallback>() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java index 36943effa0b..ce4a7f75c0f 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java @@ -420,7 +420,6 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, String addResultImportUrl(); String errorAddingResultImportUrl(String message); String eventIdOrUrl(); - String doYouReallyWantToRemoveResultImportUrls(); String remoteServerInstances(); String localServer(); String errorRefreshingSailingServers(String message); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties index 31e741d7d83..24bf85e84f7 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties @@ -443,7 +443,6 @@ pleaseEnterNonEmptyUrlOrUploadImage=Please enter a URL or upload an image. addResultImportUrl=Add result import URL errorAddingResultImportUrl=Error adding result import URL: {0} eventIdOrUrl=Event ID or URL -doYouReallyWantToRemoveResultImportUrls=Do you really want to remove the selected result import URLs? remoteServerInstances=Remote Server Instances localServer=Local Server errorRefreshingSailingServers=Error refreshing SailingServer instances: {0} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties index 36c3e48bc9d..aa9c36c6ae4 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties @@ -441,7 +441,6 @@ pleaseEnterNonEmptyUrlOrUploadImage=Bitte gebe eine URL an oder lade ein Bild ho addResultImportUrl=Ergebnisimport-URL hinzufügen errorAddingResultImportUrl=Fehler beim Hinzufügen einer Ergebnisimport URL: {0} eventIdOrUrl=Event ID oder URL -doYouReallyWantToRemoveResultImportUrls=Möchten Sie wirklich die ausgewählten Ergebnisimport URLs entfernen? remoteServerInstances=Remote-Server Instanzen localServer=Lokaler Server errorRefreshingSailingServers=Fehler beim Aktualisieren der SailingServer Instanzen: {0} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_es.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_es.properties index 231c780af33..70249f0136d 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_es.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_es.properties @@ -437,7 +437,6 @@ pleaseEnterNonEmptyUrlOrUploadImage=Indique un URL o cargue una imagen. addResultImportUrl=Añadir un URL de importación de resultados errorAddingResultImportUrl=Error al añadir URL de importación de resultados: {0} eventIdOrUrl=ID de evento o URL -doYouReallyWantToRemoveResultImportUrls=¿Desea realmente eliminar los URLs de importación de resultados seleccionados? remoteServerInstances=Instancias de servidor remoto localServer=Servidor local errorRefreshingSailingServers=Error al refrescar instancias SailingServer: {0} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_fr.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_fr.properties index 55dcde27ed4..f325d5d8fea 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_fr.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_fr.properties @@ -437,7 +437,6 @@ pleaseEnterNonEmptyUrlOrUploadImage=Veuillez saisir une URL ou charger une image addResultImportUrl=Ajouter URL d''importation des résultats errorAddingResultImportUrl=Erreur lors de l''ajout de l''URL d''importation des résultats : {0} eventIdOrUrl=URL ou ID de manifestation -doYouReallyWantToRemoveResultImportUrls=Voulez-vous vraiment supprimer les URL d''importation de résultats sélectionnées ? remoteServerInstances=Instances de serveur distant localServer=Serveur local errorRefreshingSailingServers=Erreur lors de la mise à jour des instances SailingServer : {0} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_it.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_it.properties index b848345977c..30e12a44ae0 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_it.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_it.properties @@ -437,7 +437,6 @@ pleaseEnterNonEmptyUrlOrUploadImage=Inserire un URL o caricare un''immagine. addResultImportUrl=Aggiungi URL di importazione dei risultati errorAddingResultImportUrl=Errore nell’aggiunta degli URL di importazione dei risultati: {0} eventIdOrUrl=URL o ID evento -doYouReallyWantToRemoveResultImportUrls=Eliminare gli URL di importazione dei risultati selezionati? remoteServerInstances=Istanze del server remoto localServer=Server locale errorRefreshingSailingServers=Errore nell’aggiornamento delle istanze SailingServer: {0} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ja.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ja.properties index d7eaeb8cff4..92a1532f095 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ja.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ja.properties @@ -437,7 +437,6 @@ pleaseEnterNonEmptyUrlOrUploadImage=URL を入力するか、画像をアップ addResultImportUrl=結果インポート URL の追加 errorAddingResultImportUrl=結果インポート URL を追加しようとしてエラーが発生: {0} eventIdOrUrl=イベント ID または URL -doYouReallyWantToRemoveResultImportUrls=選択した結果インポート URL を削除しますか remoteServerInstances=リモートサーバインスタンス localServer=ローカルサーバ errorRefreshingSailingServers=SailingServer インスタンスをリフレッシュしようとしてエラーが発生: {0} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_pt.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_pt.properties index a7d347bce19..73749d3601a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_pt.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_pt.properties @@ -437,7 +437,6 @@ pleaseEnterNonEmptyUrlOrUploadImage=Insira um URL ou carregue uma imagem. addResultImportUrl=Adicionar URL de importação de resultado errorAddingResultImportUrl=Erro ao adicionar URL de importação de resultado: {0} eventIdOrUrl=ID de evento ou URL -doYouReallyWantToRemoveResultImportUrls=Remover os URLs de importação de resultados selecionados? remoteServerInstances=Instâncias do servidor remoto localServer=Servidor local errorRefreshingSailingServers=Erro ao atualizar instâncias de SailingServer: {0} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties index 6d6f46df53c..a7ec411c74a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties @@ -437,7 +437,6 @@ pleaseEnterNonEmptyUrlOrUploadImage=Введите URL-адрес или заг addResultImportUrl=Добавьте URL-адрес импорта результатов errorAddingResultImportUrl=Ошибка при добавлении URL-адресов импорта результатов: {0} eventIdOrUrl=Ид. события или URL -doYouReallyWantToRemoveResultImportUrls=Действительно удалить выбранные URL-адреса импорта результатов? remoteServerInstances=Удаленные экземпляры сервера localServer=Локальный сервер errorRefreshingSailingServers=Ошибка при обновлении экземпляров SailingServer: {0} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties index 479bc051ac9..f35e0861f2f 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties @@ -437,7 +437,6 @@ pleaseEnterNonEmptyUrlOrUploadImage=请输入 URL 或上传图像。 addResultImportUrl=添加结果导入 URL errorAddingResultImportUrl=添加结果导入 URL 出错: {0} eventIdOrUrl=活动编号或 URL -doYouReallyWantToRemoveResultImportUrls=是否确定移除所选结果导入 URL? remoteServerInstances=远程服务器实例 localServer=本地服务器 errorRefreshingSailingServers=刷新 SailingServer 实例出错: {0} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java index 94d9e6166ab..8e4a74a3393 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java @@ -14,8 +14,8 @@ import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.view.client.SetSelectionModel; +import com.sap.sse.common.Named; import com.sap.sse.security.shared.HasPermissions; -import com.sap.sse.security.shared.dto.NamedDTO; import com.sap.sse.security.ui.client.UserService; /** @@ -105,8 +105,7 @@ public class AccessControlledButtonPanel extends Composite { /** * Adds a secured action button, which is only visible if the current user has any * {@link UserService#hasCurrentUserPermissionToDeleteAnyObjectOfType(HasPermissions) delete permission} for the - * {@link HasPermissions type} provided in this {@link AccessControlledButtonPanel}'s constructor. This remove - * action is for panels with single selection model used. + * {@link HasPermissions type} provided in this {@link AccessControlledButtonPanel}'s constructor. * * @param text * the {@link String text} to show on the button @@ -121,46 +120,24 @@ public class AccessControlledButtonPanel extends Composite { /** * Adds a secured action button, which is only visible if the current user has any * {@link UserService#hasCurrentUserPermissionToDeleteAnyObjectOfType(HasPermissions) delete permission} for the - * {@link HasPermissions type} provided in this {@link AccessControlledButtonPanel}'s constructor. This remove - * action is for panels which use multi selection model and list of selected elements could be shown on confirmation - * window. - * - * @param selectionModel - * the {@link SetSelectionModel} of elements which will show their names on the remove button + * {@link HasPermissions type} provided in this {@link AccessControlledButtonPanel}'s constructor. + * * @param text * the {@link String text} to show on the button - * @param callback - * the {@link Command callback} to execute on button click, if permission is granted - * @return the created {@link Button} instance - */ - public Button addRemoveActionWithConfirmation(final SetSelectionModel selectionModel, - final String text, final Command callback) { - ClickHandler handler = wrap(removePermissionCheck, callback); - final Button button = new SelectedElementsCountingButton(text, selectionModel, handler); - resolveButtonVisibility(removePermissionCheck, button); - return button; - } - - /** - * Adds a secured action button, which is only visible if the current user has any - * {@link UserService#hasCurrentUserPermissionToDeleteAnyObjectOfType(HasPermissions) delete permission} for the - * {@link HasPermissions type} provided in this {@link AccessControlledButtonPanel}'s constructor. This remove - * action is for panels which use multi selection model where callback could not be passed to button. - * * @param selectionModel - * the {@link SetSelectionModel} of elements which will show their names on the remove button - * @param text - * the {@link String text} to show on the button + * the {@link SetSelectionModel} of the table + * @param withConfirmation + * the {@link Boolean} flag indicates whether to show confirmation or not * @param callback * the {@link Command callback} to execute on button click, if permission is granted - * @return the created {@link Button} instance + * + * @return the created {@link SelectedElementsCountingButton} instance with optional confirmation */ - public Button addRemoveAction(final SetSelectionModel selectionModel, final String text, - final Command callback) { + public Button addRemoveAction(final String text, final SetSelectionModel selectionModel, + boolean withConfirmation, final Command callback) { ClickHandler handler = wrap(removePermissionCheck, callback); - final Button button = new SelectedElementsCountingButton(selectionModel, text, handler); - resolveButtonVisibility(removePermissionCheck, button); - return button; + Button button = new SelectedElementsCountingButton(text, selectionModel, withConfirmation, handler); + return resolveButtonVisibility(removePermissionCheck, button); } /** @@ -190,44 +167,15 @@ public class AccessControlledButtonPanel extends Composite { * @return the created {@link Button} instance */ public Button addAction(final String text, final Supplier permissionCheck, final Command callback) { - final Button button = new Button(text, (ClickHandler) event -> { - if (permissionCheck.get()) { - callback.execute(); - } - }); - resolveButtonVisibility(permissionCheck, button); - return button; + return resolveButtonVisibility(permissionCheck, new Button(text, wrap(permissionCheck, callback))); } - /** - * Adds an action button, which's visibility depends on the provided {@link Supplier permission check} - * - * @param - * the type of selected elements which could provide their names to confirmation window - * @param text - * the essential part of {@link String text} to show on the button - * @param permissionCheck - * the {@link Supplier permission check} to decide if the action button is visible or not - * @param callback - * the {@link Command callback} to execute on button click, if permission is granted - * @return the created {@link Button} instance - */ - public Button addRemoveCountingAction(final SetSelectionModel selectionModel, - final String text, final Supplier permissionCheck, final Command callback) { - final Button button = new SelectedElementsCountingButton(text, selectionModel, (ClickHandler) event -> { - if (permissionCheck.get()) { - callback.execute(); - } - }); - resolveButtonVisibility(permissionCheck, button); - return button; - } - - private void resolveButtonVisibility(final Supplier permissionCheck, final Button button) { + private Button resolveButtonVisibility(final Supplier permissionCheck, final Button button) { this.buttonToPermissions.put(button, permissionCheck); button.getElement().getStyle().setMarginRight(5, Unit.PX); this.panel.add(button); this.visibilityUpdater.accept(button, permissionCheck); + return button; } private ClickHandler wrap(Supplier permissionCheck, Command callback) { diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/SelectedElementsCountingButton.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/SelectedElementsCountingButton.java index b1856f073f5..a035d392520 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/SelectedElementsCountingButton.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/SelectedElementsCountingButton.java @@ -4,48 +4,43 @@ import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Button; import com.google.gwt.view.client.SetSelectionModel; -import com.sap.sse.security.shared.dto.NamedDTO; +import com.sap.sse.common.Named; import com.sap.sse.security.ui.client.i18n.StringMessages; import java.util.Set; +import java.util.function.Function; +import java.util.function.Supplier; import java.util.stream.Collectors; /** - * The button can draw the count of selected element. Optionally callback could be passed from outside and confirmation - * window could appear + * The button which shows the count of selected element(s). Optionally callback could be passed from outside and + * confirmation window could appear depending on the flag. * * @author Dmitry Bilyk * */ -public class SelectedElementsCountingButton extends Button { +public class SelectedElementsCountingButton extends Button { - public SelectedElementsCountingButton(final String html, - final SetSelectionModel selectionModel, final ClickHandler clickHandler) { + public SelectedElementsCountingButton(final String html, final SetSelectionModel selectionModel, + boolean withConfirmation, final ClickHandler clickHandler) { + this(html, selectionModel, withConfirmation ? Named::getName : null, clickHandler); + } + + public SelectedElementsCountingButton(final String html, final SetSelectionModel selectionModel, + Function nameMapper, final ClickHandler clickHandler) { + this(html, selectionModel, nameMapper == null ? null : createAsker(selectionModel, nameMapper), clickHandler); + } + + public SelectedElementsCountingButton(final String html, final SetSelectionModel selectionModel, + Supplier asker, final ClickHandler clickHandler) { super(html); setEnabled(!selectionModel.getSelectedSet().isEmpty()); addSelectionEventHandler(html, selectionModel); - addClickHandler(event -> { - if (askUserForConfirmation(selectionModel)) { - clickHandler.onClick(event); - } - }); + addClickHandler(asker, selectionModel, clickHandler); } - public SelectedElementsCountingButton(final String html, - final SetSelectionModel selectionModel) { - super(html); - setEnabled(!selectionModel.getSelectedSet().isEmpty()); - addSelectionEventHandler(html, selectionModel); - } - - public SelectedElementsCountingButton(SetSelectionModel selectionModel, String html, ClickHandler handler) { - super(html, handler); - setEnabled(!selectionModel.getSelectedSet().isEmpty()); - addSelectionEventHandler(html, selectionModel); - } - - private void addSelectionEventHandler(String html, SetSelectionModel selectionModel) { + private void addSelectionEventHandler(String html, SetSelectionModel selectionModel) { selectionModel.addSelectionChangeHandler(event -> { Set selectedSet = selectionModel.getSelectedSet(); setText(selectedSet.size() <= 1 ? html : html + " (" + selectedSet.size() + ")"); @@ -53,9 +48,21 @@ public class SelectedElementsCountingButton extends Button { }); } - private boolean askUserForConfirmation(SetSelectionModel selectionModel) { - final String names = selectionModel.getSelectedSet().stream().map(NamedDTO::getName) - .collect(Collectors.joining("\n")); - return Window.confirm(StringMessages.INSTANCE.doYouReallyWantToRemoveSelectedElements(names)); + private void addClickHandler(Supplier asker, SetSelectionModel selectionModel, + ClickHandler clickHandler) { + if (clickHandler != null) { + addClickHandler(event -> { + if (asker == null || asker.get()) { + clickHandler.onClick(event); + } + }); + } + } + + private static Supplier createAsker(SetSelectionModel selectionModel, Function mapper) { + return () -> { + final String names = selectionModel.getSelectedSet().stream().map(mapper).collect(Collectors.joining("\n")); + return Window.confirm(StringMessages.INSTANCE.doYouReallyWantToRemoveSelectedElements(names)); + }; } } diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/users/UserGroupDetailPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/users/UserGroupDetailPanel.java index f59f9f29049..debacb83338 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/users/UserGroupDetailPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/users/UserGroupDetailPanel.java @@ -165,7 +165,7 @@ public class UserGroupDetailPanel extends Composite } }); // add remove button - final Button removeButton = buttonPanel.addUpdateAction(stringMessages.actionRemove(), () -> { + final Button removeButton = buttonPanel.addUpdateAction("ccc", () -> { final Set selectedUserGroups = userGroupSelectionModel.getSelectedSet(); if (selectedUserGroups != null && selectedUserGroups.size() == 1) { final UserGroupDTO selectedUserGroup = selectedUserGroups.iterator().next(); diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/usermanagement/UserManagementPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/usermanagement/UserManagementPanel.java index 6d4533cff24..260d75403ff 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/usermanagement/UserManagementPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/usermanagement/UserManagementPanel.java @@ -73,7 +73,7 @@ public class UserManagementPanel exte e -> editRolesAndPermissionsForUserButton.setEnabled(!userNameTextbox.getText().isEmpty())); editRolesAndPermissionsForUserButton.setEnabled(false); userSelectionModel = userList.getSelectionModel(); - buttonPanel.addRemoveAction(userSelectionModel, stringMessages.remove(), () -> { + buttonPanel.addRemoveAction(stringMessages.remove(), userSelectionModel, false, () -> { assert userSelectionModel.getSelectedSet().size() > 0; final Set usersToDelete = new HashSet<>(); final Set usernamesToDelete = new HashSet<>(); From 73bdbfa89f0de014f12eb1eb1d71c5cb1590efb9 Mon Sep 17 00:00:00 2001 From: dmitry Date: Tue, 14 Apr 2020 14:00:38 +0300 Subject: [PATCH 107/188] bug5178: fixed review remarks --- .../component/AccessControlledButtonPanel.java | 7 ++++++- .../component/UserGroupManagementPanel.java | 17 ++++++++++------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java index 5a12463b68a..1e5b9c2ff98 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java @@ -125,7 +125,9 @@ public class AccessControlledButtonPanel extends Composite { * @param text * the {@link String text} to show on the button * @param selectionModel - * the {@link SetSelectionModel} of the table + * the {@link SetSelectionModel selection model} of the table; used to enable/disable the remove + * button when the selection becomes non-empty/empty, respectively and to display the number of elements + * selected in case the selection contains more than one element * @param withConfirmation * the {@link Boolean} flag indicates whether to show confirmation or not * @param callback @@ -135,6 +137,9 @@ public class AccessControlledButtonPanel extends Composite { */ public Button addRemoveAction(final String text, final SetSelectionModel selectionModel, boolean withConfirmation, final Command callback) { + if (selectionModel == null) { + throw new IllegalArgumentException("Selection model for a remove action must not be null"); + } ClickHandler handler = wrap(removePermissionCheck, callback); Button button = new SelectedElementsCountingButton(text, selectionModel, withConfirmation, handler); return resolveButtonVisibility(removePermissionCheck, button); diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupManagementPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupManagementPanel.java index 2cd22e4d77b..8a7c962f0b8 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupManagementPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupManagementPanel.java @@ -64,18 +64,19 @@ public class UserGroupManagementPanel extends Composite { /** Creates the button bar with add/remove/refresh buttons. * @param userGroupSelectionModel */ private Widget createButtonPanel(final UserService userService, final StringMessages stringMessages, - final UserManagementServiceAsync userManagementService, RefreshableSelectionModel userGroupSelectionModel) { + final UserManagementServiceAsync userManagementService, + RefreshableSelectionModel userGroupSelectionModel) { final AccessControlledButtonPanel buttonPanel = new AccessControlledButtonPanel(userService, USER_GROUP); buttonPanel.addUnsecuredAction(stringMessages.refresh(), () -> updateUserGroups()); buttonPanel.addCreateActionWithoutServerCreateObjectPermissionCheck(stringMessages.createUserGroup(), - () -> new CreateUserGroupDialog(stringMessages, - userService, userManagementService, userGroupListDataProvider, () -> updateUserGroups()).show()); - final Button removeButton = buttonPanel.addRemoveAction(stringMessages.removeUserGroup(), () -> { + () -> new CreateUserGroupDialog(stringMessages, userService, userManagementService, + userGroupListDataProvider, () -> updateUserGroups()).show()); + buttonPanel.addRemoveAction(stringMessages.removeUserGroup(), () -> { Set userGroups = userGroupTableWrapper.getSelectionModel().getSelectedSet(); if (userGroups == null || userGroups.isEmpty()) { Window.alert(stringMessages.youHaveToSelectAUserGroup()); } else { - final String userGroupNames = String.join(", ", Util.map(userGroups, g->g.getName())); + final String userGroupNames = String.join(", ", Util.map(userGroups, g -> g.getName())); if (Window.confirm(stringMessages.doYouReallyWantToRemoveUserGroup(userGroupNames))) { final Map> callbacks = new HashMap<>(); for (final UserGroupDTO userGroup : userGroups) { @@ -94,8 +95,10 @@ public class UserGroupManagementPanel extends Composite { Window.alert(stringMessages.couldNotDeleteUserGroup()); } }; - for (final Entry> groupAndCallback : callbacks.entrySet()) { - userManagementService.deleteUserGroup(groupAndCallback.getKey().getId().toString(), groupAndCallback.getValue()); + for (final Entry> groupAndCallback : callbacks + .entrySet()) { + userManagementService.deleteUserGroup(groupAndCallback.getKey().getId().toString(), + groupAndCallback.getValue()); } } } From 3bf5b1958241d2d901dc056feaf7bc3a41960d70 Mon Sep 17 00:00:00 2001 From: Alexandr Timoshenko Date: Tue, 14 Apr 2020 13:31:22 +0200 Subject: [PATCH 108/188] moved race finishing from hdpi to large --- .../res/{layout-hdpi => layout-large}/race_finishing.xml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename mobile/com.sap.sailing.racecommittee.app/res/{layout-hdpi => layout-large}/race_finishing.xml (100%) diff --git a/mobile/com.sap.sailing.racecommittee.app/res/layout-hdpi/race_finishing.xml b/mobile/com.sap.sailing.racecommittee.app/res/layout-large/race_finishing.xml similarity index 100% rename from mobile/com.sap.sailing.racecommittee.app/res/layout-hdpi/race_finishing.xml rename to mobile/com.sap.sailing.racecommittee.app/res/layout-large/race_finishing.xml From 8d693b08f2d6094340ad7cae33070d7280113de9 Mon Sep 17 00:00:00 2001 From: dmitry Date: Tue, 14 Apr 2020 17:19:34 +0300 Subject: [PATCH 109/188] bug5178: fixed review remarks --- .../ui/client/component/SelectedElementsCountingButton.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/SelectedElementsCountingButton.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/SelectedElementsCountingButton.java index ee3b461892a..9431ea4775a 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/SelectedElementsCountingButton.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/SelectedElementsCountingButton.java @@ -28,19 +28,19 @@ public class SelectedElementsCountingButton extends Button { } public SelectedElementsCountingButton(final String html, final SetSelectionModel selectionModel, - Function nameMapper, final ClickHandler clickHandler) { + final Function nameMapper, final ClickHandler clickHandler) { this(html, selectionModel, nameMapper == null ? null : createAsker(selectionModel, nameMapper), clickHandler); } public SelectedElementsCountingButton(final String html, final SetSelectionModel selectionModel, - Supplier asker, final ClickHandler clickHandler) { + final Supplier asker, final ClickHandler clickHandler) { super(html); setEnabled(!selectionModel.getSelectedSet().isEmpty()); addSelectionEventHandler(html, selectionModel); addClickHandler(asker, selectionModel, clickHandler); } - private void addSelectionEventHandler(String html, SetSelectionModel selectionModel) { + private void addSelectionEventHandler(final String html, final SetSelectionModel selectionModel) { selectionModel.addSelectionChangeHandler(event -> { Set selectedSet = selectionModel.getSelectedSet(); setText(selectedSet.size() <= 1 ? html : html + " (" + selectedSet.size() + ")"); From 45d837209d8f927ff778b269d2e870da194efd41 Mon Sep 17 00:00:00 2001 From: dmitry Date: Tue, 14 Apr 2020 17:21:09 +0300 Subject: [PATCH 110/188] bug5178: fixed review remarks --- .../ui/client/component/AccessControlledButtonPanel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java index 1e5b9c2ff98..baf4a0961a5 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AccessControlledButtonPanel.java @@ -183,7 +183,7 @@ public class AccessControlledButtonPanel extends Composite { return button; } - private ClickHandler wrap(Supplier permissionCheck, Command callback) { + private ClickHandler wrap(final Supplier permissionCheck, final Command callback) { return event -> { if (permissionCheck.get()) { callback.execute(); From 1630f6faf7e0277fdaba7fc63f44a6979b6217f1 Mon Sep 17 00:00:00 2001 From: dmitry Date: Tue, 14 Apr 2020 18:00:09 +0300 Subject: [PATCH 111/188] bug5178: fixed review remarks --- .../gwt/ui/adminconsole/DeviceConfigurationPanel.java | 3 ++- .../RemoteServerInstancesManagementPanel.java | 3 ++- .../component/usergroup/users/UserGroupDetailPanel.java | 8 ++++---- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationPanel.java index 86042925aba..033e3ee67b4 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationPanel.java @@ -92,7 +92,8 @@ public class DeviceConfigurationPanel extends SimplePanel implements DeviceConfi if (userService.hasCreatePermission(SecuredDomainType.RACE_MANAGER_APP_DEVICE_CONFIGURATION)) { deviceManagementControlPanel.add(addConfigurationButton); } - removeConfigurationButton = new SelectedElementsCountingButton(stringMessages.remove(), refreshableMultiSelectionModel, true, (event) -> removeConfiguration()); + removeConfigurationButton = new SelectedElementsCountingButton( + stringMessages.remove(), refreshableMultiSelectionModel, true, (event) -> removeConfiguration()); deviceManagementControlPanel.add(removeConfigurationButton); refreshConfigurationsButton = new Button(stringMessages.refresh()); refreshConfigurationsButton.addClickHandler(new ClickHandler() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RemoteServerInstancesManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RemoteServerInstancesManagementPanel.java index 5b7f0ae5f73..ecfd48ec3db 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RemoteServerInstancesManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RemoteServerInstancesManagementPanel.java @@ -113,7 +113,8 @@ public class RemoteServerInstancesManagementPanel extends SimplePanel { } }); - buttonPanel.add(new SelectedElementsCountingButton(stringMessages.remove(), refreshableServerSelectionModel, true, (event) -> removeSelectedSailingServers())); + buttonPanel.add(new SelectedElementsCountingButton(stringMessages.remove(), + refreshableServerSelectionModel, true, (event) -> removeSelectedSailingServers())); Button refreshButton = new Button(stringMessages.refresh()); buttonPanel.add(refreshButton); diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/users/UserGroupDetailPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/users/UserGroupDetailPanel.java index debacb83338..c4fc57000b6 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/users/UserGroupDetailPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/users/UserGroupDetailPanel.java @@ -165,7 +165,7 @@ public class UserGroupDetailPanel extends Composite } }); // add remove button - final Button removeButton = buttonPanel.addUpdateAction("ccc", () -> { + final Button removeButton = buttonPanel.addUpdateAction(stringMessages.actionRemove(), () -> { final Set selectedUserGroups = userGroupSelectionModel.getSelectedSet(); if (selectedUserGroups != null && selectedUserGroups.size() == 1) { final UserGroupDTO selectedUserGroup = selectedUserGroups.iterator().next(); @@ -180,10 +180,10 @@ public class UserGroupDetailPanel extends Composite new AsyncCallback() { @Override public void onFailure(Throwable caught) { - Window.alert(stringMessages.couldNotRemoveUserFromUserGroup(username, selectedUserGroup.getName(), - caught.getMessage())); + Window.alert(stringMessages.couldNotRemoveUserFromUserGroup(username, + selectedUserGroup.getName(), caught.getMessage())); } - + @Override public void onSuccess(Void result) { StrippedUserDTO userToRemoveFromTenant = null; From c730c03bc2122ed79902f1cca53def2ca7729680 Mon Sep 17 00:00:00 2001 From: dmitry Date: Tue, 14 Apr 2020 18:32:36 +0300 Subject: [PATCH 112/188] bug5178: fixed review remarks --- .../coursecreation/CourseTemplatePanel.java | 17 +++-------------- .../coursecreation/MarkPropertiesPanel.java | 16 +++------------- .../component/UserGroupManagementPanel.java | 2 +- 3 files changed, 7 insertions(+), 28 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java index cfbf7de9fda..31b9f6764d8 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java @@ -25,7 +25,6 @@ import com.google.gwt.user.cellview.client.AbstractCellTable; import com.google.gwt.user.cellview.client.CellTable; import com.google.gwt.user.cellview.client.Column; import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler; -import com.google.gwt.user.client.Command; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.FlowPanel; @@ -100,19 +99,9 @@ public class CourseTemplatePanel extends FlowPanel { }; filterableCourseTemplatePanel.getTextBox().ensureDebugId("CourseTemplateFilterTextBox"); createCourseTemplateTable(userService); - buttonAndFilterPanel.addUnsecuredAction(stringMessages.refresh(), new Command() { - @Override - public void execute() { - loadCourseTemplates(); - } - }); - buttonAndFilterPanel.addCreateAction(stringMessages.add(), new Command() { - @Override - public void execute() { - openEditCourseTemplateDialog(new CourseTemplateDTO(), userService, true); - } - }); - + buttonAndFilterPanel.addUnsecuredAction(stringMessages.refresh(), this::loadCourseTemplates); + buttonAndFilterPanel.addCreateAction(stringMessages.add(), + () -> openEditCourseTemplateDialog(new CourseTemplateDTO(), userService, true)); buttonAndFilterPanel.addRemoveAction(stringMessages.remove(), refreshableSelectionModel, true, () -> removeCourseTemplates(refreshableSelectionModel.getSelectedSet().stream() .map(courseTemplateDTO -> courseTemplateDTO.getUuid()).collect(Collectors.toList()))); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java index f7b597407d1..cb6e919de72 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java @@ -28,7 +28,6 @@ import com.google.gwt.user.cellview.client.AbstractCellTable; import com.google.gwt.user.cellview.client.CellTable; import com.google.gwt.user.cellview.client.Column; import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler; -import com.google.gwt.user.client.Command; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.AbstractImagePrototype; @@ -110,18 +109,9 @@ public class MarkPropertiesPanel extends FlowPanel { } }; createMarkPropertiesTable(userService); - buttonAndFilterPanel.addUnsecuredAction(stringMessages.refresh(), new Command() { - @Override - public void execute() { - loadMarkProperties(); - } - }); - buttonAndFilterPanel.addCreateAction(stringMessages.add(), new Command() { - @Override - public void execute() { - openEditMarkPropertiesDialog(new MarkPropertiesDTO()); - } - }); + buttonAndFilterPanel.addUnsecuredAction(stringMessages.refresh(), this::loadMarkProperties); + buttonAndFilterPanel.addCreateAction(stringMessages.add(), + () -> openEditMarkPropertiesDialog(new MarkPropertiesDTO())); buttonAndFilterPanel.addRemoveAction(stringMessages.remove(), refreshableSelectionModel, true, () -> removeMarkProperties(refreshableSelectionModel.getSelectedSet().stream() .map(markPropertiesDTO -> markPropertiesDTO.getUuid()).collect(Collectors.toList()))); diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupManagementPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupManagementPanel.java index 8a7c962f0b8..ac514ed6295 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupManagementPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupManagementPanel.java @@ -71,7 +71,7 @@ public class UserGroupManagementPanel extends Composite { buttonPanel.addCreateActionWithoutServerCreateObjectPermissionCheck(stringMessages.createUserGroup(), () -> new CreateUserGroupDialog(stringMessages, userService, userManagementService, userGroupListDataProvider, () -> updateUserGroups()).show()); - buttonPanel.addRemoveAction(stringMessages.removeUserGroup(), () -> { + buttonPanel.addRemoveAction(stringMessages.removeUserGroup(), userGroupSelectionModel, false, () -> { Set userGroups = userGroupTableWrapper.getSelectionModel().getSelectedSet(); if (userGroups == null || userGroups.isEmpty()) { Window.alert(stringMessages.youHaveToSelectAUserGroup()); From 1ff519231ab4af47f6a01d2c16588b46bc4efa38 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 15 Apr 2020 02:29:37 +0200 Subject: [PATCH 113/188] removing obsolete (commented) code and empty lines --- .../TrackedRacesListComposite.java | 1 - .../tracking/TrackedRacesListPO.java | 63 +------------------ 2 files changed, 3 insertions(+), 61 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java index eb984f92d3e..5d068a2d7c1 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java @@ -143,7 +143,6 @@ public class TrackedRacesListComposite extends AbstractTrackedRacesListComposite }); btnExport.setEnabled(false); trackedRacesButtonPanel.add(btnExport); - btnRemoveRace = new SelectedElementsCountingButton(stringMessages.remove(), refreshableSelectionModel, e -> e.getRegattaName() + " - " + e.getName(), diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/tracking/TrackedRacesListPO.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/tracking/TrackedRacesListPO.java index faa3e8c047d..9972ed74199 100644 --- a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/tracking/TrackedRacesListPO.java +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/tracking/TrackedRacesListPO.java @@ -85,8 +85,6 @@ public class TrackedRacesListPO extends PageArea { @FindBy(how = BySeleniumId.class, using = "TrackedRacesFilterTextBox") private WebElement trackedRacesFilterTextBox; - //@FindBy(how = BySeleniumId.class, using = "NoTrackedRacesLabel") - @FindBy(how = BySeleniumId.class, using = "TrackedRacesCellTable") private WebElement trackedRacesTable; @@ -105,8 +103,6 @@ public class TrackedRacesListPO extends PageArea { @FindBy(how = BySeleniumId.class, using = "ExportButton") private WebElement exportButton; - //@FindBy(how = BySeleniumId.class, using = "ExportPopup") - public TrackedRacesListPO(WebDriver driver, WebElement element) { super(driver, element); } @@ -117,41 +113,18 @@ public class TrackedRacesListPO extends PageArea { } public List getTrackedRaces() { -// List descriptors = new LinkedList<>(); CellTablePO table = getTrackedRacesTable(); - -// for(DataEntryPO entry : table.getEntries()) { -// String regatta = entry.getColumnContent(0); -// String boatClass = entry.getColumnContent(1); -// String race = entry.getColumnContent(2); -// -// descriptors.add(new TrackedRaceDescriptor(regatta, boatClass, race)); -// } - return table.getEntries(); } -// public WebElement getTrackedRace(String regatta, String race) { -// for (WebElement raceRow : getTrackedRaces()) { -// List fields = raceRow.findElements(By.tagName("td")); -// if (regattaName.equals(fields.get(0).getText()) && raceName.equals(fields.get(2).getText())) { -// return raceRow; -// } -// } -// return null; -// } - public Status getStatus(TrackedRaceDescriptor race) { List status = getStatus(Arrays.asList(race)); - return status.get(0); } public List getStatus(List races) { List result = new ArrayList<>(Collections.nCopies(races.size(), null)); - CellTablePO table = getTrackedRacesTable(); - final int regattaColumnIndex = table.getColumnIndex("Regatta"); final int boatClassColumnIndex = table.getColumnIndex("Boat Class"); final int raceColumnIndex = table.getColumnIndex("Race"); @@ -161,14 +134,11 @@ public class TrackedRacesListPO extends PageArea { String boatClass = entry.getColumnContent(boatClassColumnIndex); String race = entry.getColumnContent(raceColumnIndex); String status = entry.getColumnContent(statusColumnIndex); - TrackedRaceDescriptor descriptor = new TrackedRaceDescriptor(regatta, boatClass, race); - if(races.contains(descriptor)) { result.set(races.indexOf(descriptor), Status.fromString(status)); } } - return result; } @@ -194,25 +164,21 @@ public class TrackedRacesListPO extends PageArea { public void remove(List races) { selectRaces(races); - removeSelectedTrackedRacesAndWaitForAjaxRequests(); } public void removeAll() { getTrackedRacesTable().selectAllEntries(); - removeSelectedTrackedRacesAndWaitForAjaxRequests(); } private void removeSelectedTrackedRacesAndWaitForAjaxRequests() { this.removeButton.click(); - waitForAjaxRequests(); } public void refresh() { this.refreshButton.click(); - waitForAjaxRequests(); } @@ -249,60 +215,37 @@ public class TrackedRacesListPO extends PageArea { }); } -// public void waitForTrackedRaceLoadingFinished(String regattaName, String raceName, long timeoutInMillis) throws InterruptedException { -// waitForAjaxRequests(); // wait for the Start Tracking request to succeed; then check Tracked races table and keep refreshing until we time out -// TrackedRacesPanel trp = getTrackedRacesPanel(); -// long started = System.currentTimeMillis(); -// WebElement raceRow = trp.getTrackedRace(regattaName, raceName); -// while ((raceRow == null || !"TRACKING".equals(raceRow.findElements(By.tagName("td")).get(6).getText())) -// && System.currentTimeMillis()-started < timeoutInMillis) { -// Thread.sleep(2000); // wait 2s for the race to appear -// trp.refresh(); -// raceRow = trp.getTrackedRace(regattaName, raceName); -// } -// } - public void stopTracking(List races, boolean waitForFinished) { selectRaces(races); this.stopTrackingButton.click(); waitForAjaxRequests(); - if(waitForFinished) { + if (waitForFinished) { waitForTrackedRaces(races, Status.FINISHED); } } public CellTablePO getTrackedRacesTable() { -// if(!this.trackedRacesTable.isDisplayed()) { -// return null; -// } - return new GenericCellTablePO<>(this.driver, this.trackedRacesTable, DataEntryPO.class); } private List getTrackedRaces(List races) { List result = new ArrayList<>(Collections.nCopies(races.size(), null)); - CellTablePO table = getTrackedRacesTable(); List rows = table.getEntries(); Iterator iterator = rows.iterator(); - final int regattaColumnIndex = table.getColumnIndex("Regatta"); final int boatClassColumnIndex = table.getColumnIndex("Boat Class"); final int raceColumnIndex = table.getColumnIndex("Race"); - while(iterator.hasNext()) { + while (iterator.hasNext()) { DataEntryPO entry = iterator.next(); - String regatta = entry.getColumnContent(regattaColumnIndex); String boatClass = entry.getColumnContent(boatClassColumnIndex); String race = entry.getColumnContent(raceColumnIndex); - TrackedRaceDescriptor descriptor = new TrackedRaceDescriptor(regatta, boatClass, race); - - if(races.contains(descriptor)) { + if (races.contains(descriptor)) { result.set(races.indexOf(descriptor), entry); } } - return result; } From ef065feff79a1dbc65c5465c1400c4113c6194f6 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 15 Apr 2020 02:49:11 +0200 Subject: [PATCH 114/188] bug5178: adding necessary wait for new removal alert dialog --- .../com/sap/sailing/selenium/pages/PageObject.java | 11 +++++------ .../adminconsole/tracking/TrackedRacesListPO.java | 1 + 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/PageObject.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/PageObject.java index a9c8bbe39a9..0358bfe5374 100644 --- a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/PageObject.java +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/PageObject.java @@ -304,8 +304,8 @@ public class PageObject { * @return * The first matching element in the given context. */ - protected WebElement waitForElementBySeleniumId(SearchContext context, String id, int timeout) { - FluentWait wait = createFluentWait(context, timeout, DEFAULT_POLLING_INTERVAL); + protected WebElement waitForElementBySeleniumId(SearchContext context, String id, int timeoutInSeconds) { + FluentWait wait = createFluentWait(context, timeoutInSeconds, DEFAULT_POLLING_INTERVAL); return (WebElement) wait.until(new Function() { @Override public Object apply(SearchContext context) { @@ -514,13 +514,13 @@ public class PageObject { * * @param supplier {@link PageAreaSupplier} used to instantiate the {@link PageArea} * @param seleniumId the selenium id of the desired element - * @param timeout the timeout in seconds to wait for the element + * @param timeoutInSeconds the timeout in seconds to wait for the element * @return {@link PageArea} representing the first matching element * * @see #findElementBySeleniumId(SearchContext, String) */ - protected T waitForPO(PageAreaSupplier supplier, String seleniumId, int timeout) { - return supplier.get(driver, waitForElementBySeleniumId(driver, seleniumId, timeout)); + protected T waitForPO(PageAreaSupplier supplier, String seleniumId, int timeoutInSeconds) { + return supplier.get(driver, waitForElementBySeleniumId(driver, seleniumId, timeoutInSeconds)); } /** @@ -626,7 +626,6 @@ public class PageObject { protected void waitForNotificationAndDismiss(int timeoutInSeconds, String expectedNotificationMessage) { WebDriverWait wait = new WebDriverWait(driver, timeoutInSeconds); wait.until(new Function() { - @Override public Boolean apply(WebDriver t) { boolean clickedNotifications = false; diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/tracking/TrackedRacesListPO.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/tracking/TrackedRacesListPO.java index 9972ed74199..da712b1204a 100644 --- a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/tracking/TrackedRacesListPO.java +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/tracking/TrackedRacesListPO.java @@ -174,6 +174,7 @@ public class TrackedRacesListPO extends PageArea { private void removeSelectedTrackedRacesAndWaitForAjaxRequests() { this.removeButton.click(); + this.waitForAlertAndAccept(); waitForAjaxRequests(); } From 22496feef8b58215ec1e38e75d58f8c85853f516 Mon Sep 17 00:00:00 2001 From: Alexandr Timoshenko Date: Wed, 15 Apr 2020 12:23:56 +0200 Subject: [PATCH 115/188] Bug 5068 - Use previous race (of the same fleet) for default values in initial race configuration --- .../app/ui/activities/RacingActivity.java | 29 +- .../racelist/ManagedRaceListAdapter.java | 60 ++- .../app/ui/fragments/RaceListFragment.java | 10 +- .../fragments/panels/SetupPanelFragment.java | 360 +++++++++--------- 4 files changed, 254 insertions(+), 205 deletions(-) diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java index 330869448ab..e58ff6c3038 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java @@ -40,12 +40,17 @@ import com.sap.sailing.android.shared.util.BroadcastManager; import com.sap.sailing.android.shared.util.ViewHelper; import com.sap.sailing.domain.abstractlog.race.SimpleRaceLogIdentifier; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.StartTimeFinderResult; +import com.sap.sailing.domain.abstractlog.race.state.RaceState; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedure; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.line.ConfigurableStartModeFlagRacingProcedure; import com.sap.sailing.domain.base.CourseArea; +import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.EventBase; import com.sap.sailing.domain.base.configuration.RegattaConfiguration; import com.sap.sailing.domain.base.configuration.impl.RegattaConfigurationImpl; import com.sap.sailing.domain.base.racegroup.RaceGroup; import com.sap.sailing.domain.base.racegroup.RaceGroupSeriesFleet; +import com.sap.sailing.domain.common.CourseDesignerMode; import com.sap.sailing.domain.common.Wind; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.domain.common.racelog.RacingProcedureType; @@ -59,6 +64,7 @@ import com.sap.sailing.racecommittee.app.data.clients.LoadClient; import com.sap.sailing.racecommittee.app.data.loaders.DataLoaderResult; import com.sap.sailing.racecommittee.app.domain.ManagedRace; import com.sap.sailing.racecommittee.app.domain.configuration.impl.PreferencesRegattaConfigurationLoader; +import com.sap.sailing.racecommittee.app.domain.coursedesign.CourseDesign; import com.sap.sailing.racecommittee.app.logging.LogEvent; import com.sap.sailing.racecommittee.app.ui.adapters.racelist.RaceListDataType; import com.sap.sailing.racecommittee.app.ui.adapters.racelist.RaceListDataTypeHeader; @@ -298,13 +304,34 @@ public class RacingActivity extends SessionActivity implements RaceListCallbacks } @Override - public void onRaceListItemSelected(RaceListDataType selectedItem) { + public void onRaceListItemSelected(RaceListDataType selectedItem, RaceListDataTypeRace prevRaceItem) { + if (selectedItem instanceof RaceListDataTypeRace) { RaceListDataTypeRace selectedElement = (RaceListDataTypeRace) selectedItem; selectedElement.setUpdateIndicatorVisible(false); ManagedRace managedRace = selectedElement.getRace(); ExLog.i(this, LogEvent.RACE_SELECTED_ELEMENT, managedRace.getId() + " " + managedRace.getStatus()); + if (prevRaceItem != null && managedRace.getStatus() == RaceLogRaceStatus.UNSCHEDULED) { + final ManagedRace prevRace = prevRaceItem.getRace(); + final RaceState currentRaceState = managedRace.getState(); + final RacingProcedure racingProcedure = prevRace.getState().getRacingProcedure(); + currentRaceState.setRacingProcedure(MillisecondsTimePoint.now(), racingProcedure.getType()); + final RacingProcedure newRacingProcedure = currentRaceState.getRacingProcedure(); + if (racingProcedure instanceof ConfigurableStartModeFlagRacingProcedure && newRacingProcedure instanceof ConfigurableStartModeFlagRacingProcedure){ + ConfigurableStartModeFlagRacingProcedure configurableFlag = (ConfigurableStartModeFlagRacingProcedure)racingProcedure; + ((ConfigurableStartModeFlagRacingProcedure)newRacingProcedure).setStartModeFlag(MillisecondsTimePoint.now(), configurableFlag.getStartModeFlag()); + } + final CourseBase courseDesign = prevRace.getCourseDesign(); + if (courseDesign != null) { + currentRaceState.setCourseDesign(MillisecondsTimePoint.now(), courseDesign, CourseDesignerMode.BY_NAME); + } + + final Wind windFix = prevRace.getState().getWindFix(); + if (windFix != null) { + currentRaceState.setWindFix(MillisecondsTimePoint.now(), windFix, preferences.isMagnetic()); + } + } onRaceItemClicked(managedRace); } else if (selectedItem instanceof RaceListDataTypeHeader) { // This is for logging purposes only! diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/ManagedRaceListAdapter.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/ManagedRaceListAdapter.java index 6de47a74ac7..06b8a5dce10 100755 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/ManagedRaceListAdapter.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/ManagedRaceListAdapter.java @@ -1,6 +1,7 @@ package com.sap.sailing.racecommittee.app.ui.adapters.racelist; import com.sap.sailing.racecommittee.app.ui.views.FlagTimeView; + import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Collections; @@ -228,15 +229,15 @@ public class ManagedRaceListAdapter extends ArrayAdapter imple setDependingText(holder, race); if (state.getStartTime() == null && state.getFinishedTime() == null) { switch (race.getRace().getStatus()) { - case PRESCHEDULED: - holder.panel_right.setVisibility(View.GONE); - holder.race_scheduled.setVisibility(View.GONE); - holder.race_unscheduled.setVisibility(View.GONE); - break; + case PRESCHEDULED: + holder.panel_right.setVisibility(View.GONE); + holder.race_scheduled.setVisibility(View.GONE); + holder.race_unscheduled.setVisibility(View.GONE); + break; - default: - holder.race_scheduled.setVisibility(View.GONE); - holder.race_unscheduled.setVisibility(View.VISIBLE); + default: + holder.race_scheduled.setVisibility(View.GONE); + holder.race_unscheduled.setVisibility(View.VISIBLE); } } else { if (holder.race_name != null) { @@ -291,6 +292,25 @@ public class ManagedRaceListAdapter extends ArrayAdapter imple } } + + public RaceListDataTypeRace getPreviousRaceInSeries(RaceListDataType selectedItem) { + List races = getShownViewItems(new ArrayList<>(mAllRaces)); + int index = races.indexOf(selectedItem); + if (index >= 1 && selectedItem instanceof RaceListDataTypeRace) { + RaceListDataTypeRace currentRace = (RaceListDataTypeRace) selectedItem; + for (int i = index; i >= 0; i--) { + final RaceListDataType prevItem = races.get(i); + if (prevItem instanceof RaceListDataTypeRace) { + RaceListDataTypeRace prevRace = (RaceListDataTypeRace) prevItem; + if (prevRace.getFleet() == currentRace.getFleet()) { + return prevRace; + } + } + } + } + return null; + } + /** * For the {@code filteredRaces} ensure that exactly the required view items are in {@link #mShownViewItems}. This * encompasses the header items for all non-empty series and the race items for all races in their series. @@ -448,20 +468,20 @@ public class ManagedRaceListAdapter extends ArrayAdapter imple if (isNext != 0) { flag = FlagsResources.getFlagDrawable(getContext(), currentFlag.name(), flag_size); switch (isNext) { - case 1: - if (nextPole.isDisplayed()) { + case 1: + if (nextPole.isDisplayed()) { + arrow = BitmapHelper.getAttrDrawable(getContext(), R.attr.arrow_up); + } else { + arrow = BitmapHelper.getAttrDrawable(getContext(), R.attr.arrow_down); + } + break; + + case 2: arrow = BitmapHelper.getAttrDrawable(getContext(), R.attr.arrow_up); - } else { - arrow = BitmapHelper.getAttrDrawable(getContext(), R.attr.arrow_down); - } - break; + break; - case 2: - arrow = BitmapHelper.getAttrDrawable(getContext(), R.attr.arrow_up); - break; - - default: - ExLog.i(getContext(), TAG, "unknown flag"); + default: + ExLog.i(getContext(), TAG, "unknown flag"); } timer = TimeUtils.formatDuration(now, poleState.getNextStateValidFrom()); } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceListFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceListFragment.java index 2e941e61732..2038e99c18d 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceListFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceListFragment.java @@ -289,11 +289,13 @@ public class RaceListFragment extends LoggableFragment @Override public void onItemClick(AdapterView parent, View view, int position, long id) { - ExLog.i(getActivity(), TAG, "Touched " + mAdapter.getItem(position).toString()); + final RaceListDataType selectedItem = mAdapter.getItem(position); + ExLog.i(getActivity(), TAG, "Touched " + selectedItem.toString()); + RaceListDataTypeRace prevRace = mAdapter.getPreviousRaceInSeries(selectedItem); mDrawerLayout.closeDrawers(); - mAdapter.setSelectedRace(mAdapter.getItem(position)); - mCallbacks.onRaceListItemSelected(mAdapter.getItem(position)); + mAdapter.setSelectedRace(selectedItem); + mCallbacks.onRaceListItemSelected(selectedItem, prevRace); } @Override @@ -553,7 +555,7 @@ public class RaceListFragment extends LoggableFragment } public interface RaceListCallbacks { - void onRaceListItemSelected(RaceListDataType selectedItem); + void onRaceListItemSelected(RaceListDataType selectedItem, RaceListDataTypeRace prevRace); } private class IntentReceiver extends BroadcastReceiver { diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/panels/SetupPanelFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/panels/SetupPanelFragment.java index 1340b119515..8585dd7bd25 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/panels/SetupPanelFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/panels/SetupPanelFragment.java @@ -72,12 +72,12 @@ public class SetupPanelFragment extends BasePanelFragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View layout; switch (getArguments().getInt(ARGS_PAGE, 0)) { - case 1: - layout = inflater.inflate(R.layout.race_panel_setup_hor_2, container, false); - break; + case 1: + layout = inflater.inflate(R.layout.race_panel_setup_hor_2, container, false); + break; - default: - layout = inflater.inflate(R.layout.race_panel_setup, container, false); + default: + layout = inflater.inflate(R.layout.race_panel_setup, container, false); } mStateListener = new RaceStateChangedListener(); @@ -232,110 +232,110 @@ public class SetupPanelFragment extends BasePanelFragment { private void checkStatus() { switch (getRace().getStatus()) { - case UNSCHEDULED: - changeVisibility(mButtonProcedure, false); - changeVisibility(mButtonMode, false); - changeVisibility(mButtonPathfinder, false); - changeVisibility(mButtonTiming, false); - changeVisibility(mButtonRaceGroup, false); - changeVisibility(mButtonCourse, false); - changeVisibility(mButtonWind, false); - break; + case UNSCHEDULED: + changeVisibility(mButtonProcedure, false); + changeVisibility(mButtonMode, false); + changeVisibility(mButtonPathfinder, false); + changeVisibility(mButtonTiming, false); + changeVisibility(mButtonRaceGroup, false); + changeVisibility(mButtonCourse, false); + changeVisibility(mButtonWind, false); + break; - case PRESCHEDULED: - changeVisibility(mButtonProcedure, false); - changeVisibility(mButtonMode, false); - changeVisibility(mButtonPathfinder, false); - changeVisibility(mButtonTiming, false); - changeVisibility(mButtonRaceGroup, false); - changeVisibility(mButtonCourse, false); - changeVisibility(mButtonWind, false); - break; + case PRESCHEDULED: + changeVisibility(mButtonProcedure, false); + changeVisibility(mButtonMode, false); + changeVisibility(mButtonPathfinder, false); + changeVisibility(mButtonTiming, false); + changeVisibility(mButtonRaceGroup, false); + changeVisibility(mButtonCourse, false); + changeVisibility(mButtonWind, false); + break; - case SCHEDULED: - changeVisibility(mButtonProcedure, false); - changeVisibility(mButtonMode, false); - changeVisibility(mButtonPathfinder, false); - changeVisibility(mButtonTiming, false); - changeVisibility(mButtonRaceGroup, false); - changeVisibility(mButtonCourse, false); - changeVisibility(mButtonWind, false); - break; + case SCHEDULED: + changeVisibility(mButtonProcedure, false); + changeVisibility(mButtonMode, false); + changeVisibility(mButtonPathfinder, false); + changeVisibility(mButtonTiming, false); + changeVisibility(mButtonRaceGroup, false); + changeVisibility(mButtonCourse, false); + changeVisibility(mButtonWind, false); + break; - case STARTPHASE: - changeVisibility(mButtonProcedure, true); - changeVisibility(mButtonMode, true); - changeVisibility(mButtonPathfinder, true); - changeVisibility(mButtonTiming, true); - changeVisibility(mButtonRaceGroup, true); - changeVisibility(mButtonCourse, false); - changeVisibility(mButtonWind, false); - break; + case STARTPHASE: + changeVisibility(mButtonProcedure, true); + changeVisibility(mButtonMode, true); + changeVisibility(mButtonPathfinder, true); + changeVisibility(mButtonTiming, true); + changeVisibility(mButtonRaceGroup, true); + changeVisibility(mButtonCourse, false); + changeVisibility(mButtonWind, false); + break; - case RUNNING: - changeVisibility(mButtonProcedure, true); - changeVisibility(mButtonMode, true); - changeVisibility(mButtonPathfinder, true); - changeVisibility(mButtonTiming, true); - changeVisibility(mButtonRaceGroup, true); - changeVisibility(mButtonCourse, false); - changeVisibility(mButtonWind, false); + case RUNNING: + changeVisibility(mButtonProcedure, true); + changeVisibility(mButtonMode, true); + changeVisibility(mButtonPathfinder, true); + changeVisibility(mButtonTiming, true); + changeVisibility(mButtonRaceGroup, true); + changeVisibility(mButtonCourse, false); + changeVisibility(mButtonWind, false); - uncheckMarker(mButtonProcedure); - uncheckMarker(mButtonMode); - uncheckMarker(mButtonPathfinder); - uncheckMarker(mButtonTiming); - break; + uncheckMarker(mButtonProcedure); + uncheckMarker(mButtonMode); + uncheckMarker(mButtonPathfinder); + uncheckMarker(mButtonTiming); + break; - case FINISHING: - changeVisibility(mButtonProcedure, true); - changeVisibility(mButtonMode, true); - changeVisibility(mButtonPathfinder, true); - changeVisibility(mButtonTiming, true); - changeVisibility(mButtonRaceGroup, true); - changeVisibility(mButtonCourse, true); - changeVisibility(mButtonWind, false); + case FINISHING: + changeVisibility(mButtonProcedure, true); + changeVisibility(mButtonMode, true); + changeVisibility(mButtonPathfinder, true); + changeVisibility(mButtonTiming, true); + changeVisibility(mButtonRaceGroup, true); + changeVisibility(mButtonCourse, true); + changeVisibility(mButtonWind, false); - uncheckMarker(mButtonProcedure); - uncheckMarker(mButtonMode); - uncheckMarker(mButtonPathfinder); - uncheckMarker(mButtonTiming); - uncheckMarker(mButtonCourse); - break; + uncheckMarker(mButtonProcedure); + uncheckMarker(mButtonMode); + uncheckMarker(mButtonPathfinder); + uncheckMarker(mButtonTiming); + uncheckMarker(mButtonCourse); + break; - case FINISHED: - changeVisibility(mButtonProcedure, false); - changeVisibility(mButtonMode, false); - changeVisibility(mButtonPathfinder, false); - changeVisibility(mButtonTiming, false); - changeVisibility(mButtonRaceGroup, false); - changeVisibility(mButtonCourse, false); - changeVisibility(mButtonWind, false); + case FINISHED: + changeVisibility(mButtonProcedure, false); + changeVisibility(mButtonMode, false); + changeVisibility(mButtonPathfinder, false); + changeVisibility(mButtonTiming, false); + changeVisibility(mButtonRaceGroup, false); + changeVisibility(mButtonCourse, false); + changeVisibility(mButtonWind, false); - uncheckMarker(mButtonProcedure); - uncheckMarker(mButtonMode); - uncheckMarker(mButtonPathfinder); - uncheckMarker(mButtonTiming); - uncheckMarker(mButtonCourse); - uncheckMarker(mButtonWind); - break; + uncheckMarker(mButtonProcedure); + uncheckMarker(mButtonMode); + uncheckMarker(mButtonPathfinder); + uncheckMarker(mButtonTiming); + uncheckMarker(mButtonCourse); + uncheckMarker(mButtonWind); + break; - default: - changeVisibility(mButtonProcedure, true); - changeVisibility(mButtonMode, true); - changeVisibility(mButtonPathfinder, true); - changeVisibility(mButtonTiming, true); - changeVisibility(mButtonRaceGroup, true); - changeVisibility(mButtonCourse, true); - changeVisibility(mButtonWind, true); + default: + changeVisibility(mButtonProcedure, true); + changeVisibility(mButtonMode, true); + changeVisibility(mButtonPathfinder, true); + changeVisibility(mButtonTiming, true); + changeVisibility(mButtonRaceGroup, true); + changeVisibility(mButtonCourse, true); + changeVisibility(mButtonWind, true); - uncheckMarker(mButtonProcedure); - uncheckMarker(mButtonMode); - uncheckMarker(mButtonProcedure); - uncheckMarker(mButtonTiming); - uncheckMarker(mButtonCourse); - uncheckMarker(mButtonWind); - break; + uncheckMarker(mButtonProcedure); + uncheckMarker(mButtonMode); + uncheckMarker(mButtonProcedure); + uncheckMarker(mButtonTiming); + uncheckMarker(mButtonCourse); + uncheckMarker(mButtonWind); + break; } } @@ -440,17 +440,17 @@ public class SetupPanelFragment extends BasePanelFragment { sendIntent(AppConstants.INTENT_ACTION_TOGGLE, AppConstants.INTENT_ACTION_EXTRA, AppConstants.INTENT_ACTION_TOGGLE_PROCEDURE); switch (view.toggleMarker()) { - case PanelButton.LEVEL_NORMAL: - sendIntent(AppConstants.INTENT_ACTION_SHOW_MAIN_CONTENT); - break; + case PanelButton.LEVEL_NORMAL: + sendIntent(AppConstants.INTENT_ACTION_SHOW_MAIN_CONTENT); + break; - case PanelButton.LEVEL_TOGGLED: - replaceFragment(StartProcedureFragment.newInstance(BaseFragment.START_MODE_PLANNED)); - break; + case PanelButton.LEVEL_TOGGLED: + replaceFragment(StartProcedureFragment.newInstance(BaseFragment.START_MODE_PLANNED)); + break; - default: - ExLog.i(getActivity(), TAG, "Unknown return value"); - break; + default: + ExLog.i(getActivity(), TAG, "Unknown return value"); + break; } view.disableToggle(); } @@ -470,16 +470,16 @@ public class SetupPanelFragment extends BasePanelFragment { sendIntent(AppConstants.INTENT_ACTION_TOGGLE, AppConstants.INTENT_ACTION_EXTRA, AppConstants.INTENT_ACTION_TOGGLE_PROCEDURE_MORE_MODE); switch (view.toggleMarker()) { - case PanelButton.LEVEL_NORMAL: - sendIntent(AppConstants.INTENT_ACTION_SHOW_MAIN_CONTENT); - break; + case PanelButton.LEVEL_NORMAL: + sendIntent(AppConstants.INTENT_ACTION_SHOW_MAIN_CONTENT); + break; - case PanelButton.LEVEL_TOGGLED: - replaceFragment(StartModeFragment.newInstance(StartModeFragment.START_MODE_PLANNED)); - break; + case PanelButton.LEVEL_TOGGLED: + replaceFragment(StartModeFragment.newInstance(StartModeFragment.START_MODE_PLANNED)); + break; - default: - ExLog.i(getActivity(), TAG, "Unknown return value"); + default: + ExLog.i(getActivity(), TAG, "Unknown return value"); } view.disableToggle(); } @@ -499,17 +499,17 @@ public class SetupPanelFragment extends BasePanelFragment { sendIntent(AppConstants.INTENT_ACTION_TOGGLE, AppConstants.INTENT_ACTION_EXTRA, AppConstants.INTENT_ACTION_TOGGLE_PROCEDURE_MORE_PATHFINDER); switch (view.toggleMarker()) { - case PanelButton.LEVEL_NORMAL: - sendIntent(AppConstants.INTENT_ACTION_SHOW_MAIN_CONTENT); - break; + case PanelButton.LEVEL_NORMAL: + sendIntent(AppConstants.INTENT_ACTION_SHOW_MAIN_CONTENT); + break; - case PanelButton.LEVEL_TOGGLED: - replaceFragment( - GateStartPathFinderFragment.newInstance(GateStartPathFinderFragment.START_MODE_PLANNED)); - break; + case PanelButton.LEVEL_TOGGLED: + replaceFragment( + GateStartPathFinderFragment.newInstance(GateStartPathFinderFragment.START_MODE_PLANNED)); + break; - default: - ExLog.i(getActivity(), TAG, "Unknown return value"); + default: + ExLog.i(getActivity(), TAG, "Unknown return value"); } view.disableToggle(); } @@ -529,16 +529,16 @@ public class SetupPanelFragment extends BasePanelFragment { sendIntent(AppConstants.INTENT_ACTION_TOGGLE, AppConstants.INTENT_ACTION_EXTRA, AppConstants.INTENT_ACTION_TOGGLE_PROCEDURE_MORE_TIMING); switch (view.toggleMarker()) { - case PanelButton.LEVEL_NORMAL: - sendIntent(AppConstants.INTENT_ACTION_SHOW_MAIN_CONTENT); - break; + case PanelButton.LEVEL_NORMAL: + sendIntent(AppConstants.INTENT_ACTION_SHOW_MAIN_CONTENT); + break; - case PanelButton.LEVEL_TOGGLED: - replaceFragment(GateStartTimingFragment.newInstance(GateStartTimingFragment.START_MODE_PLANNED)); - break; + case PanelButton.LEVEL_TOGGLED: + replaceFragment(GateStartTimingFragment.newInstance(GateStartTimingFragment.START_MODE_PLANNED)); + break; - default: - ExLog.i(getActivity(), TAG, "Unknown return value"); + default: + ExLog.i(getActivity(), TAG, "Unknown return value"); } view.disableToggle(); } @@ -571,16 +571,16 @@ public class SetupPanelFragment extends BasePanelFragment { sendIntent(AppConstants.INTENT_ACTION_TOGGLE, AppConstants.INTENT_ACTION_EXTRA, AppConstants.INTENT_ACTION_TOGGLE_FACTOR); switch (view.toggleMarker()) { - case LEVEL_NORMAL: - sendIntent(AppConstants.INTENT_ACTION_SHOW_MAIN_CONTENT); - break; + case LEVEL_NORMAL: + sendIntent(AppConstants.INTENT_ACTION_SHOW_MAIN_CONTENT); + break; - case LEVEL_TOGGLED: - replaceFragment(RaceFactorFragment.newInstance(BaseFragment.START_MODE_PLANNED)); - break; + case LEVEL_TOGGLED: + replaceFragment(RaceFactorFragment.newInstance(BaseFragment.START_MODE_PLANNED)); + break; - default: - ExLog.i(getActivity(), TAG, "Unknown return value"); + default: + ExLog.i(getActivity(), TAG, "Unknown return value"); } view.disableToggle(); } @@ -599,16 +599,16 @@ public class SetupPanelFragment extends BasePanelFragment { sendIntent(AppConstants.INTENT_ACTION_TOGGLE, AppConstants.INTENT_ACTION_EXTRA, AppConstants.INTENT_ACTION_TOGGLE_COURSE); switch (view.toggleMarker()) { - case LEVEL_NORMAL: - sendIntent(AppConstants.INTENT_ACTION_SHOW_MAIN_CONTENT); - break; + case LEVEL_NORMAL: + sendIntent(AppConstants.INTENT_ACTION_SHOW_MAIN_CONTENT); + break; - case LEVEL_TOGGLED: - replaceFragment(CourseFragment.newInstance(BaseFragment.START_MODE_PLANNED, preferences)); - break; + case LEVEL_TOGGLED: + replaceFragment(CourseFragment.newInstance(BaseFragment.START_MODE_PLANNED, preferences)); + break; - default: - ExLog.i(getActivity(), TAG, "Unknown return value"); + default: + ExLog.i(getActivity(), TAG, "Unknown return value"); } view.disableToggle(); } @@ -627,16 +627,16 @@ public class SetupPanelFragment extends BasePanelFragment { sendIntent(AppConstants.INTENT_ACTION_TOGGLE, AppConstants.INTENT_ACTION_EXTRA, AppConstants.INTENT_ACTION_TOGGLE_WIND); switch (view.toggleMarker()) { - case LEVEL_NORMAL: - sendIntent(AppConstants.INTENT_ACTION_SHOW_MAIN_CONTENT); - break; + case LEVEL_NORMAL: + sendIntent(AppConstants.INTENT_ACTION_SHOW_MAIN_CONTENT); + break; - case LEVEL_TOGGLED: - replaceFragment(WindFragment.newInstance(BaseFragment.START_MODE_PLANNED)); - break; + case LEVEL_TOGGLED: + replaceFragment(WindFragment.newInstance(BaseFragment.START_MODE_PLANNED)); + break; - default: - ExLog.i(getActivity(), TAG, "Unknown return value"); + default: + ExLog.i(getActivity(), TAG, "Unknown return value"); } view.disableToggle(); } @@ -660,30 +660,30 @@ public class SetupPanelFragment extends BasePanelFragment { if (intent.getExtras() != null) { String data = intent.getExtras().getString(AppConstants.INTENT_ACTION_EXTRA); switch (data) { - case AppConstants.INTENT_ACTION_TOGGLE_PROCEDURE: - uncheckMarker(mButtonProcedure); - break; - case AppConstants.INTENT_ACTION_TOGGLE_PROCEDURE_MORE_MODE: - uncheckMarker(mButtonMode); - break; - case AppConstants.INTENT_ACTION_TOGGLE_PROCEDURE_MORE_PATHFINDER: - uncheckMarker(mButtonPathfinder); - break; - case AppConstants.INTENT_ACTION_TOGGLE_PROCEDURE_MORE_TIMING: - uncheckMarker(mButtonTiming); - break; - case AppConstants.INTENT_ACTION_TOGGLE_FACTOR: - uncheckMarker(mButtonFactor); - break; - case AppConstants.INTENT_ACTION_TOGGLE_COURSE: - uncheckMarker(mButtonCourse); - break; - case AppConstants.INTENT_ACTION_TOGGLE_WIND: - uncheckMarker(mButtonWind); - break; - default: - uncheckMarker(null); - break; + case AppConstants.INTENT_ACTION_TOGGLE_PROCEDURE: + uncheckMarker(mButtonProcedure); + break; + case AppConstants.INTENT_ACTION_TOGGLE_PROCEDURE_MORE_MODE: + uncheckMarker(mButtonMode); + break; + case AppConstants.INTENT_ACTION_TOGGLE_PROCEDURE_MORE_PATHFINDER: + uncheckMarker(mButtonPathfinder); + break; + case AppConstants.INTENT_ACTION_TOGGLE_PROCEDURE_MORE_TIMING: + uncheckMarker(mButtonTiming); + break; + case AppConstants.INTENT_ACTION_TOGGLE_FACTOR: + uncheckMarker(mButtonFactor); + break; + case AppConstants.INTENT_ACTION_TOGGLE_COURSE: + uncheckMarker(mButtonCourse); + break; + case AppConstants.INTENT_ACTION_TOGGLE_WIND: + uncheckMarker(mButtonWind); + break; + default: + uncheckMarker(null); + break; } } } From 6e1a0420011d511729e171d0758a3a091ec19d2e Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 15 Apr 2020 18:10:03 +0200 Subject: [PATCH 116/188] bug5219: introduced the isAutoRestartTrackingUponCompetitorSetChange() flag on Regatta --- .../impl/DomainObjectFactoryImpl.java | 6 ++- .../domain/persistence/impl/FieldNames.java | 1 + .../impl/MigratableRegattaImpl.java | 8 +-- .../impl/MongoObjectFactoryImpl.java | 1 + .../impl/CreateAndTrackWithRaceLogTest.java | 2 +- ...stFarthestAheadWithSkippedMarkPassing.java | 4 +- ...mpleTimeOnTimeRankingWithOneUpwindLeg.java | 4 +- .../test/TestDeadlockInRegattaListener.java | 2 +- .../domain/test/mock/MockedTrackedRace.java | 10 ++++ .../impl/DomainFactoryImpl.java | 4 +- .../com/sap/sailing/domain/base/Regatta.java | 17 +++++- .../sailing/domain/base/impl/RegattaImpl.java | 35 ++++++++---- .../ui/test/PingMarkViaRegattaLogTest.java | 2 +- .../sap/sailing/gwt/ui/test/SlicingTest.java | 2 +- ...tractRegattaWithSeriesAndFleetsDialog.java | 30 +++++------ .../adminconsole/CreateRegattaCallback.java | 2 +- .../ui/adminconsole/RegattaListComposite.java | 4 +- ...martphoneTrackingEventManagementPanel.java | 4 +- .../sailing/gwt/ui/client/SailingService.java | 4 +- .../gwt/ui/client/SailingServiceAsync.java | 6 +-- .../sailing/gwt/ui/client/StringMessages.java | 1 + .../gwt/ui/client/StringMessages.properties | 3 +- .../ui/client/StringMessages_de.properties | 3 +- .../gwt/ui/server/SailingServiceImpl.java | 11 ++-- .../sap/sailing/gwt/ui/shared/RegattaDTO.java | 2 + ...tStoringAndRetrievingRaceLogInRegatta.java | 4 +- ...LogConnectivityParamsLoadAndStoreTest.java | 2 +- ...estStoringAndLoadingEventsAndRegattas.java | 13 +---- .../impl/RegattaJsonSerializer.java | 2 + .../jaxrs/LeaderboardGroupResourceTest.java | 2 +- .../test/jaxrs/LeaderboardsResourceTest.java | 2 +- .../test/jaxrs/RegattasResourceTest.java | 4 +- .../gateway/jaxrs/api/EventsResource.java | 17 +++--- .../gateway/jaxrs/api/RegattasResource.java | 11 +--- .../impl/ExpeditionAllInOneImporter.java | 5 +- .../webservices/api/v1/regattaUpdateDoc.html | 3 ++ .../server/interfaces/RacingEventService.java | 12 +++-- .../AddSpecificRegatta.java | 12 +++-- .../UpdateSpecificRegatta.java | 6 ++- .../test/AbstractLogReplicationTest.java | 2 +- .../replication/test/BoatReplicationTest.java | 2 +- .../test/CompetitorReplicationTest.java | 2 +- ...tialLoadReplicationObjectIdentityTest.java | 3 +- .../test/RegattaReplicationTest.java | 53 ++++++++----------- ...BoatCompetitorMetadataReplicationTest.java | 2 +- .../server/test/MasterDataImportTest.java | 28 +++++----- .../server/test/SearchServiceTest.java | 6 +-- .../server/impl/RacingEventServiceImpl.java | 22 ++++---- 48 files changed, 211 insertions(+), 172 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 ba674d1f8e4..d49ab6f2d19 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 @@ -1292,6 +1292,8 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { .get(FieldNames.REGATTA_USE_START_TIME_INFERENCE.name()); final Boolean controlTrackingFromStartAndFinishTimes = (Boolean) dbRegatta .get(FieldNames.REGATTA_CONTROL_TRACKING_FROM_START_AND_FINISH_TIMES.name()); + final Boolean autoRestartTrackingUponCompetitorSetChange = (Boolean) dbRegatta + .get(FieldNames.REGATTA_AUTO_RESTART_TRACKING_UPON_COMPETITOR_SET_CHANGE.name()); Boolean canBoatsOfCompetitorsChangePerRace = (Boolean) dbRegatta .get(FieldNames.REGATTA_CAN_BOATS_OF_COMPETITORS_CHANGE_PER_RACE.name()); // for backward compatibility @@ -1313,7 +1315,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { : buoyZoneRadiusInHullLengths, useStartTimeInference == null ? true : useStartTimeInference, controlTrackingFromStartAndFinishTimes == null ? false : controlTrackingFromStartAndFinishTimes, - rankingMetricConstructor, new MongoObjectFactoryImpl(database), registrationLinkSecret); + autoRestartTrackingUponCompetitorSetChange, rankingMetricConstructor, new MongoObjectFactoryImpl(database), registrationLinkSecret); } else { result = new RegattaImpl(getRaceLogStore(), getRegattaLogStore(), name, boatClass, canBoatsOfCompetitorsChangePerRace, competitorRegistrationType, startDate, endDate, series, /* persistent */true, @@ -1322,7 +1324,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { : buoyZoneRadiusInHullLengths, useStartTimeInference == null ? true : useStartTimeInference, controlTrackingFromStartAndFinishTimes == null ? false : controlTrackingFromStartAndFinishTimes, - rankingMetricConstructor, registrationLinkSecret); + autoRestartTrackingUponCompetitorSetChange, rankingMetricConstructor, registrationLinkSecret); } result.setRegattaConfiguration(configuration); } diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java index 352a3c8cc9d..5467cb8de54 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java @@ -38,6 +38,7 @@ public enum FieldNames { REGATTA_BUOY_ZONE_RADIUS_IN_HULL_LENGTHS, REGATTA_USE_START_TIME_INFERENCE, REGATTA_CONTROL_TRACKING_FROM_START_AND_FINISH_TIMES, + REGATTA_AUTO_RESTART_TRACKING_UPON_COMPETITOR_SET_CHANGE, REGATTA_CAN_BOATS_OF_COMPETITORS_CHANGE_PER_RACE, REGATTA_COMPETITOR_REGISTRATION_TYPE, REGATTA_REGISTRATION_LINK_SECRET, diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MigratableRegattaImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MigratableRegattaImpl.java index 9ed54fa3fc7..9b06d52e891 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MigratableRegattaImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MigratableRegattaImpl.java @@ -32,12 +32,12 @@ public class MigratableRegattaImpl extends RegattaImpl implements MigratableRega TimePoint startDate, TimePoint endDate, Iterable series, boolean persistent, ScoringScheme scoringScheme, Serializable id, CourseArea courseArea, Double buoyZoneRadiusInHullLengths, boolean useStartTimeInference, - boolean controlTrackingFromStartAndFinishTimes, RankingMetricConstructor rankingMetricConstructor, - MongoObjectFactory mongoObjectFactory, String registrationLinkSecret) { + boolean controlTrackingFromStartAndFinishTimes, boolean autoRestartTrackingUponCompetitorSetChange, + RankingMetricConstructor rankingMetricConstructor, MongoObjectFactory mongoObjectFactory, String registrationLinkSecret) { super(raceLogStore, regattaLogStore, name, boatClass, canBoatsOfCompetitorsChangePerRace, competitorRegistrationType, startDate, endDate, series, persistent, scoringScheme, id, courseArea, buoyZoneRadiusInHullLengths, useStartTimeInference, - controlTrackingFromStartAndFinishTimes, rankingMetricConstructor, - registrationLinkSecret); + controlTrackingFromStartAndFinishTimes, autoRestartTrackingUponCompetitorSetChange, + rankingMetricConstructor, registrationLinkSecret); this.mongoObjectFactory = mongoObjectFactory; mongoObjectFactory.storeRegatta(this); // make sure the canBoatsOfCompetitorsChangePerRace flag makes it into the DB } diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java index a1e67c42e72..1aabc2b38b0 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java @@ -729,6 +729,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { dbRegatta.put(FieldNames.REGATTA_BUOY_ZONE_RADIUS_IN_HULL_LENGTHS.name(), regatta.getBuoyZoneRadiusInHullLengths()); dbRegatta.put(FieldNames.REGATTA_USE_START_TIME_INFERENCE.name(), regatta.useStartTimeInference()); dbRegatta.put(FieldNames.REGATTA_CONTROL_TRACKING_FROM_START_AND_FINISH_TIMES.name(), regatta.isControlTrackingFromStartAndFinishTimes()); + dbRegatta.put(FieldNames.REGATTA_AUTO_RESTART_TRACKING_UPON_COMPETITOR_SET_CHANGE.name(), regatta.isAutoRestartTrackingUponCompetitorSetChange()); dbRegatta.put(FieldNames.REGATTA_CAN_BOATS_OF_COMPETITORS_CHANGE_PER_RACE.name(), regatta.canBoatsOfCompetitorsChangePerRace()); dbRegatta.put(FieldNames.REGATTA_COMPETITOR_REGISTRATION_TYPE.name(), regatta.getCompetitorRegistrationType().name()); dbRegatta.put(FieldNames.REGATTA_REGISTRATION_LINK_SECRET.name(), regatta.getRegistrationLinkSecret()); diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java index 89822fc7c60..7cf78cf058c 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java @@ -103,7 +103,7 @@ public class CreateAndTrackWithRaceLogTest extends RaceLogTrackingTestHelper { /* registrationLinkSecret */ null, /* startDate */null, /* endDate */null, UUID.randomUUID(), Collections. singletonList(series), /* persistent */ true, new HighPoint(), UUID.randomUUID(), /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */true, - /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new); + /* controlTrackingFromStartAndFinishTimes */ false, /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); series.addRaceColumn(columnName, /* trackedRegattaRegistry */null); leaderboard = service.addRegattaLeaderboard(regatta.getRegattaIdentifier(), "RegattaLeaderboard", new int[] {}); adapter = RaceLogTrackingAdapterFactory.INSTANCE.getAdapter(DomainFactory.INSTANCE); diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/ranking/TestFarthestAheadWithSkippedMarkPassing.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/ranking/TestFarthestAheadWithSkippedMarkPassing.java index 781b78d1b11..8c69d95c3cd 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/ranking/TestFarthestAheadWithSkippedMarkPassing.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/ranking/TestFarthestAheadWithSkippedMarkPassing.java @@ -102,8 +102,8 @@ public class TestFarthestAheadWithSkippedMarkPassing { /* canBoatsOfCompetitorsChangePerRace */ true, CompetitorRegistrationType.CLOSED, /*startDate*/ null, /*endDate*/ null, /* trackedRegattaRegistry */ null, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), "123", /* courseArea */ null, - /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new, - /* registrationLinkSecret */ UUID.randomUUID().toString()); + /* controlTrackingFromStartAndFinishTimes */ false, /* autoRestartTrackingUponCompetitorSetChange */ false, + OneDesignRankingMetric::new, /* registrationLinkSecret */ UUID.randomUUID().toString()); TrackedRegatta trackedRegatta = new DynamicTrackedRegattaImpl(regatta); List waypoints = new ArrayList(); // create a two-lap upwind/downwind course: diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/ranking/TestSimpleTimeOnTimeRankingWithOneUpwindLeg.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/ranking/TestSimpleTimeOnTimeRankingWithOneUpwindLeg.java index 96fb14346e8..989e2e72836 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/ranking/TestSimpleTimeOnTimeRankingWithOneUpwindLeg.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/ranking/TestSimpleTimeOnTimeRankingWithOneUpwindLeg.java @@ -83,8 +83,8 @@ public class TestSimpleTimeOnTimeRankingWithOneUpwindLeg { RegattaImpl.getDefaultName("Test Regatta", boatClass.getName()), boatClass, /* canBoatsOfCompetitorsChangePerRace */ true, CompetitorRegistrationType.CLOSED, /*startDate*/ null, /*endDate*/ null, /* trackedRegattaRegistry */ null, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), "123", /* courseArea */ null, - /* controlTrackingFromStartAndFinishTimes */ false, TimeOnTimeAndDistanceRankingMetric::new, - /* registrationLinkSecret */ UUID.randomUUID().toString()); + /* controlTrackingFromStartAndFinishTimes */ false, /* autoRestartTrackingUponCompetitorSetChange */ false, + TimeOnTimeAndDistanceRankingMetric::new, /* registrationLinkSecret */ UUID.randomUUID().toString()); TrackedRegatta trackedRegatta = new DynamicTrackedRegattaImpl(regatta); List waypoints = new ArrayList(); // create a two-lap upwind/downwind course: diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TestDeadlockInRegattaListener.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TestDeadlockInRegattaListener.java index f5bf2e0c4c7..902b6a9c411 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TestDeadlockInRegattaListener.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TestDeadlockInRegattaListener.java @@ -55,7 +55,7 @@ public class TestDeadlockInRegattaListener { /* startDate */ null, /* endDate */ null, /* trackedRegattaRegistry */ null, new LowPoint(), UUID.randomUUID(), /* courseArea */ null, /* controlTrackingFromStartAndFinishTimes */ true, - OneDesignRankingMetric::new, /* registrationLinkSecret */ UUID.randomUUID().toString()); + /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new, /* registrationLinkSecret */ UUID.randomUUID().toString()); DynamicTrackedRegatta trackedRegatta = new DynamicTrackedRegattaImpl(regatta) { private static final long serialVersionUID = -3599667964201700780L; diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java index ff855818226..b0757e95608 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java @@ -618,6 +618,16 @@ public class MockedTrackedRace implements DynamicTrackedRace { @Override public void setCompetitorRegistrationType(CompetitorRegistrationType competitorRegistrationType) { } + + @Override + public boolean isAutoRestartTrackingUponCompetitorSetChange() { + return false; + } + + @Override + public void setAutoRestartTrackingUponCompetitorSetChange( + boolean autoRestartTrackingUponCompetitorSetChange) { + } }; } diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java index 597b7fc3a80..490a229c015 100755 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java @@ -497,8 +497,8 @@ public class DomainFactoryImpl implements DomainFactory { trackedRegattaRegistry, // use the low-point system as the default scoring scheme getBaseDomainFactory().createScoringScheme(ScoringSchemeType.LOW_POINT), race.getId(), null, - /* controlTrackingFromStartAndFinishTimes */ false, rankingMetricConstructor, - /* registrationLinkSecret */ UUID.randomUUID().toString()); + /* controlTrackingFromStartAndFinishTimes */ false, /* autoRestartTrackingUponCompetitorSetChange */ false, + rankingMetricConstructor, /* registrationLinkSecret */ UUID.randomUUID().toString()); regattaCache.put(key, result); weakDefaultRegattaCache.put(race, result); logger.info("Created regatta "+result.getName()+" ("+result.hashCode()+") because none found for key "+key); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/Regatta.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/Regatta.java index 23bd93ebfd1..60997a38154 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/Regatta.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/Regatta.java @@ -238,11 +238,26 @@ public interface Regatta * show_bug.cgi?id=3588. */ boolean isControlTrackingFromStartAndFinishTimes(); - + /** * @see #isControlTrackingFromStartAndFinishTimes() */ void setControlTrackingFromStartAndFinishTimes(boolean controlTrackingFromStartAndFinishTimes); + + /** + * Tells whether in the scope of this regatta tracking of a race shall automatically be re-started if the competitor + * registrations change. Removing the {@link TrackedRace tracked races} and {@link RaceDefinition}s affected is then + * required because the {@link RaceDefinition#getCompetitors() set of competitors of a race} is modeled to be + * immutable. As the set of competitors that are part of a tracked race is provided by the tracking connector, the + * responsibility for adhering to this flag, which rather expresses a request than describes a fact, lies with the + * respective connectors. + */ + boolean isAutoRestartTrackingUponCompetitorSetChange(); + + /** + * @see #isAutoRestartTrackingUponCompetitorSetChange() + */ + void setAutoRestartTrackingUponCompetitorSetChange(boolean autoRestartTrackingUponCompetitorSetChange); @Override default QualifiedObjectIdentifier getIdentifier() { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java index 06cdbbd8d80..4cb2b71e4f4 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java @@ -152,6 +152,8 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene * show_bug.cgi?id=3588. */ private boolean controlTrackingFromStartAndFinishTimes; + + private boolean autoRestartTrackingUponCompetitorSetChange; private boolean canBoatsOfCompetitorsChangePerRace; @@ -169,7 +171,8 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene /** * Constructs a regatta with an empty {@link RaceLogStore} and with - * {@link Regatta#isControlTrackingFromStartAndFinishTimes()} set to {@code false}. + * {@link Regatta#isControlTrackingFromStartAndFinishTimes()} and + * {@link #isAutoRestartTrackingUponCompetitorSetChange()} set to {@code false}. */ public RegattaImpl(String name, BoatClass boatClass, boolean canBoatsOfCompetitorsChangePerRace, CompetitorRegistrationType competitorRegistrationType, TimePoint startDate, TimePoint endDate, @@ -178,13 +181,14 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene this(EmptyRaceLogStore.INSTANCE, EmptyRegattaLogStore.INSTANCE, name, boatClass, canBoatsOfCompetitorsChangePerRace, competitorRegistrationType, startDate, endDate, series, persistent, scoringScheme, id, courseArea, 0.0, /* useStartTimeInference */true, /* controlTrackingFromStartAndFinishTimes */ false, - rankingMetricConstructor, registrationLinkSecret); + /* autoRestartTrackingUponCompetitorSetChange */ false, rankingMetricConstructor, registrationLinkSecret); } /** * Constructs a regatta with a single default series with empty race column list, and a single default fleet which * is not {@link #isPersistent() marked for persistence}. The regatta is created with - * {@link Regatta#isControlTrackingFromStartAndFinishTimes()} set to {@code false}. + * {@link Regatta#isControlTrackingFromStartAndFinishTimes()} and + * {@link #isAutoRestartTrackingUponCompetitorSetChange()} set to {@code false}. * * @param trackedRegattaRegistry * used to find the {@link TrackedRegatta} for this column's series' {@link Series#getRegatta() regatta} @@ -199,8 +203,8 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene ScoringScheme scoringScheme, Serializable id, CourseArea courseArea, String registrationLinkSecret) { this(raceLogStore, regattaLogStore, name, boatClass, canBoatsOfCompetitorsChangePerRace, competitorRegistrationType, startDate, endDate, trackedRegattaRegistry, scoringScheme, - id, courseArea, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new, - registrationLinkSecret); + id, courseArea, /* controlTrackingFromStartAndFinishTimes */ false, /* autoRestartTrackingUponCompetitorSetChange */ false, + OneDesignRankingMetric::new, registrationLinkSecret); } /** @@ -217,15 +221,15 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene boolean canBoatsOfCompetitorsChangePerRace, CompetitorRegistrationType competitorRegistrationType, TimePoint startDate, TimePoint endDate, TrackedRegattaRegistry trackedRegattaRegistry, ScoringScheme scoringScheme, Serializable id, CourseArea courseArea, - boolean controlTrackingFromStartAndFinishTimes, RankingMetricConstructor rankingMetricConstructor, - String registrationLinkSecret) { + boolean controlTrackingFromStartAndFinishTimes, boolean autoRestartTrackingUponCompetitorSetChange, + RankingMetricConstructor rankingMetricConstructor, String registrationLinkSecret) { this(raceLogStore, regattaLogStore, name, boatClass, canBoatsOfCompetitorsChangePerRace, competitorRegistrationType, startDate, endDate, Collections.singletonList(new SeriesImpl(LeaderboardNameConstants.DEFAULT_SERIES_NAME, /* isMedal */false, /* isFleetsCanRunInParallel */ true, Collections .singletonList(new FleetImpl(LeaderboardNameConstants.DEFAULT_FLEET_NAME)), /* race column names */new ArrayList(), trackedRegattaRegistry)), /* persistent */false, scoringScheme, id, courseArea, /*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */true, controlTrackingFromStartAndFinishTimes, - rankingMetricConstructor, registrationLinkSecret); + autoRestartTrackingUponCompetitorSetChange, rankingMetricConstructor, registrationLinkSecret); } /** @@ -237,13 +241,14 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene BoatClass boatClass, boolean canBoatsOfCompetitorsChangePerRace, CompetitorRegistrationType competitorRegistrationType, TimePoint startDate, TimePoint endDate, Iterable series, boolean persistent, ScoringScheme scoringScheme, Serializable id, CourseArea courseArea, Double buoyZoneRadiusInHullLengths, boolean useStartTimeInference, - boolean controlTrackingFromStartAndFinishTimes, RankingMetricConstructor rankingMetricConstructor, - String registrationLinkSecret) { + boolean controlTrackingFromStartAndFinishTimes, boolean autoRestartTrackingUponCompetitorSetChange, + RankingMetricConstructor rankingMetricConstructor, String registrationLinkSecret) { super(name); this.registrationLinkSecret = registrationLinkSecret; this.rankingMetricConstructor = rankingMetricConstructor; this.useStartTimeInference = useStartTimeInference; this.controlTrackingFromStartAndFinishTimes = controlTrackingFromStartAndFinishTimes; + this.autoRestartTrackingUponCompetitorSetChange = autoRestartTrackingUponCompetitorSetChange; this.id = id; this.raceLogStore = raceLogStore; races = new ConcurrentHashMap<>(); @@ -671,10 +676,20 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene return controlTrackingFromStartAndFinishTimes; } + @Override + public boolean isAutoRestartTrackingUponCompetitorSetChange() { + return autoRestartTrackingUponCompetitorSetChange; + } + @Override public void setControlTrackingFromStartAndFinishTimes(boolean controlTrackingFromStartAndFinishTimes) { this.controlTrackingFromStartAndFinishTimes = controlTrackingFromStartAndFinishTimes; } + + @Override + public void setAutoRestartTrackingUponCompetitorSetChange(boolean autoRestartTrackingUponCompetitorSetChange) { + this.autoRestartTrackingUponCompetitorSetChange = autoRestartTrackingUponCompetitorSetChange; + } @Override public void setUseStartTimeInference(boolean useStartTimeInference) { diff --git a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/PingMarkViaRegattaLogTest.java b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/PingMarkViaRegattaLogTest.java index ceecd2aa025..8cf7b6a5a99 100644 --- a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/PingMarkViaRegattaLogTest.java +++ b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/PingMarkViaRegattaLogTest.java @@ -45,7 +45,7 @@ public class PingMarkViaRegattaLogTest { /* canBoatsOfCompetitorsChangePerRace */ true, CompetitorRegistrationType.CLOSED, /* registrationLinkSecret */ null, /*startDate*/ null, /*endDate*/ null, UUID.randomUUID(), Collections.singletonList(series), false, new HighPoint(), UUID.randomUUID(), /*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */ true, - /* controlTrackingFromStartAndFinishTimes */ false, RankingMetricsFactory.getRankingMetricConstructor(RankingMetrics.ONE_DESIGN)); + /* controlTrackingFromStartAndFinishTimes */ false, /* autoRestartTrackingUponCompetitorSetChange */ false, RankingMetricsFactory.getRankingMetricConstructor(RankingMetrics.ONE_DESIGN)); RegattaLeaderboard leaderboard = service.addRegattaLeaderboard(regatta.getRegattaIdentifier(), "RegattaLeaderboard", new int[] {}); MarkDTO mark = new MarkDTO("mark", "mark", "m"); diff --git a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/SlicingTest.java b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/SlicingTest.java index f452ff75ebb..3414f6e3909 100644 --- a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/SlicingTest.java +++ b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/SlicingTest.java @@ -99,7 +99,7 @@ public class SlicingTest { seriesCreationParameters); final RegattaDTO regatta = sailingService.createRegatta(regattaName, boatClassName, false, CompetitorRegistrationType.CLOSED, null, null, null, regattaCreationParameters, false, - ScoringSchemeType.HIGH_POINT, null, 3.0, false, false, RankingMetrics.ONE_DESIGN); + ScoringSchemeType.HIGH_POINT, null, 3.0, false, false, /* autoRestartTrackingUponCompetitorSetChange */ false, RankingMetrics.ONE_DESIGN); final List> columnNames = new ArrayList<>(); columnNames.add(new Pair<>(columnNameOriginalRace, 0)); sailingService.addRaceColumnsToSeries(regatta.getRegattaIdentifier(), seriesName, columnNames); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractRegattaWithSeriesAndFleetsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractRegattaWithSeriesAndFleetsDialog.java index 282cd7e48a6..3ecb79559e9 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractRegattaWithSeriesAndFleetsDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractRegattaWithSeriesAndFleetsDialog.java @@ -62,6 +62,7 @@ public abstract class AbstractRegattaWithSeriesAndFleetsDialog extends DataEn protected final ListBox sailingEventsListBox; protected final CheckBox useStartTimeInferenceCheckBox; protected final CheckBox controlTrackingFromStartAndFinishTimesCheckBox; + protected final CheckBox autoRestartTrackingUponCompetitorSetChangeCheckBox; protected final DoubleBox buoyZoneRadiusInHullLengthsDoubleBox; protected final ListEditorComposite seriesEditor; private final ListBox rankingMetricListBox; @@ -110,22 +111,20 @@ public abstract class AbstractRegattaWithSeriesAndFleetsDialog extends DataEn controlTrackingFromStartAndFinishTimesCheckBox = createCheckbox(stringMessages.controlTrackingFromStartAndFinishTimes()); controlTrackingFromStartAndFinishTimesCheckBox.ensureDebugId("ControlTrackingFromStartAndFinishTimesCheckBox"); controlTrackingFromStartAndFinishTimesCheckBox.setValue(regatta.controlTrackingFromStartAndFinishTimes); - + autoRestartTrackingUponCompetitorSetChangeCheckBox = createCheckbox(stringMessages.autoRestartTrackingUponCompetitorSetChange()); + autoRestartTrackingUponCompetitorSetChangeCheckBox.ensureDebugId("AutoRestartTrackingUponCompetitorSetChangeCheckBox"); + autoRestartTrackingUponCompetitorSetChangeCheckBox.setValue(regatta.autoRestartTrackingUponCompetitorSetChange); buoyZoneRadiusInHullLengthsDoubleBox = createDoubleBox(regatta.buoyZoneRadiusInHullLengths, 10); buoyZoneRadiusInHullLengthsDoubleBox.ensureDebugId("BuoyZoneRadiusInHullLengthsDoubleBox"); - courseAreaListBox = createListBox(false); courseAreaListBox.ensureDebugId("CourseAreaListBox"); courseAreaListBox.setEnabled(false); this.seriesEditor = createSeriesEditor(series); setupEventAndCourseAreaListBoxes(stringMessages); - competitorRegistrationTypeListBox = createListBox(false); competitorRegistrationTypeListBox.ensureDebugId("CompetitorRegistrationTypeListBox"); EnumSet.allOf(CompetitorRegistrationType.class).forEach(t->competitorRegistrationTypeListBox.addItem(t.getLabel(stringMessages), t.name())); competitorRegistrationTypeListBox.setSelectedIndex(regatta.competitorRegistrationType.ordinal()); - - // Registration Link registrationLinkWithQRCode = new RegistrationLinkWithQRCode(); if (regatta.registrationLinkSecret == null) { @@ -135,7 +134,6 @@ public abstract class AbstractRegattaWithSeriesAndFleetsDialog extends DataEn } else { registrationLinkWithQRCode.setSecret(regatta.registrationLinkSecret); } - // secret panel final TextBox secretTextBox = createTextBox(regatta.registrationLinkSecret, 30); secretPanel = new CaptionPanel(stringMessages.registrationLinkSecret()); @@ -146,23 +144,18 @@ public abstract class AbstractRegattaWithSeriesAndFleetsDialog extends DataEn final TextBox secretTextBox) { final VerticalPanel secretPanelContent = new VerticalPanel(); secretPanel.add(secretPanelContent); - // explain Label with description of secret final Label secretExplainLabel = new Label(stringMessages.registrationLinkSecretExplain()); secretPanelContent.add(secretExplainLabel); secretExplainLabel.setWordWrap(true); - // Label Label secretLabel = new Label(stringMessages.registrationLinkSecret() + ":"); - // Textbox secretTextBox.ensureDebugId("SecretTextBox"); secretTextBox.addChangeHandler(e -> validateSecret(stringMessages, secretTextBox)); - // Generate-Button final Button generateSecretButton = new Button(stringMessages.registrationLinkSecretGenerate(), new ClickHandler() { - @Override public void onClick(ClickEvent event) { final String randomString = RandomString.createRandomSecret(20); @@ -172,13 +165,11 @@ public abstract class AbstractRegattaWithSeriesAndFleetsDialog extends DataEn } }); generateSecretButton.ensureDebugId("GenerateSecretButton"); - // add all to grid final Grid secretPanelFormGrid = new Grid(1, 3); secretPanelFormGrid.setWidget(0, 0, secretLabel); secretPanelFormGrid.setWidget(0, 1, secretTextBox); secretPanelFormGrid.setWidget(0, 2, generateSecretButton); - secretPanelContent.add(secretPanelFormGrid); } @@ -235,7 +226,7 @@ public abstract class AbstractRegattaWithSeriesAndFleetsDialog extends DataEn if (additionalWidget != null) { panel.add(additionalWidget); } - Grid formGrid = new Grid(11, 2); + Grid formGrid = new Grid(12, 2); panel.add(formGrid); formGrid.setWidget(0, 0, new Label(stringMessages.timeZone() + ":")); @@ -254,10 +245,12 @@ public abstract class AbstractRegattaWithSeriesAndFleetsDialog extends DataEn formGrid.setWidget(6, 1, useStartTimeInferenceCheckBox); formGrid.setWidget(7, 0, new Label(stringMessages.controlTrackingFromStartAndFinishTimes() + ":")); formGrid.setWidget(7, 1, controlTrackingFromStartAndFinishTimesCheckBox); - formGrid.setWidget(8, 0, new Label(stringMessages.buoyZoneRadiusInHullLengths() + ":")); - formGrid.setWidget(8, 1, buoyZoneRadiusInHullLengthsDoubleBox); - formGrid.setWidget(9, 0, new Label(stringMessages.competitorRegistrationType() + ":")); - formGrid.setWidget(9, 1, competitorRegistrationTypeListBox); + formGrid.setWidget(8, 0, new Label(stringMessages.autoRestartTrackingUponCompetitorSetChange() + ":")); + formGrid.setWidget(8, 1, autoRestartTrackingUponCompetitorSetChangeCheckBox); + formGrid.setWidget(9, 0, new Label(stringMessages.buoyZoneRadiusInHullLengths() + ":")); + formGrid.setWidget(9, 1, buoyZoneRadiusInHullLengthsDoubleBox); + formGrid.setWidget(10, 0, new Label(stringMessages.competitorRegistrationType() + ":")); + formGrid.setWidget(10, 1, competitorRegistrationTypeListBox); panel.add(secretPanel); setupAdditionalWidgetsOnPanel(panel, formGrid); @@ -384,6 +377,7 @@ public abstract class AbstractRegattaWithSeriesAndFleetsDialog extends DataEn result.scoringScheme = getSelectedScoringSchemeType(); result.useStartTimeInference = useStartTimeInferenceCheckBox.getValue(); result.controlTrackingFromStartAndFinishTimes = controlTrackingFromStartAndFinishTimesCheckBox.getValue(); + result.autoRestartTrackingUponCompetitorSetChange = autoRestartTrackingUponCompetitorSetChangeCheckBox.getValue(); result.buoyZoneRadiusInHullLengths = buoyZoneRadiusInHullLengthsDoubleBox.getValue(); setCourseAreaInRegatta(result); result.series = getSeriesEditor().getValue(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CreateRegattaCallback.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CreateRegattaCallback.java index ba6ae5a3cde..3e6fcd52e80 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CreateRegattaCallback.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CreateRegattaCallback.java @@ -74,7 +74,7 @@ public class CreateRegattaCallback implements DialogCallback{ new RegattaCreationParametersDTO(seriesStructure), true, newRegatta.scoringScheme, newRegatta.defaultCourseAreaUuid, newRegatta.buoyZoneRadiusInHullLengths, newRegatta.useStartTimeInference, newRegatta.controlTrackingFromStartAndFinishTimes, - newRegatta.rankingMetricType, new AsyncCallback() { + newRegatta.autoRestartTrackingUponCompetitorSetChange, newRegatta.rankingMetricType, new AsyncCallback() { @Override public void onFailure(Throwable t) { errorReporter.reportError("Error trying to create new regatta " + newRegatta.getName() + ": " + t.getMessage()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaListComposite.java index c852c891268..b129e6b607f 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaListComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaListComposite.java @@ -347,8 +347,8 @@ public class RegattaListComposite extends Composite implements RegattasDisplayer final RegattaIdentifier regattaName = new RegattaName(editedRegatta.getName()); sailingService.updateRegatta(regattaName, editedRegatta.startDate, editedRegatta.endDate, editedRegatta.defaultCourseAreaUuid, editedRegatta.configuration, editedRegatta.buoyZoneRadiusInHullLengths, editedRegatta.useStartTimeInference, editedRegatta.controlTrackingFromStartAndFinishTimes, - editedRegatta.registrationLinkSecret, editedRegatta.competitorRegistrationType, - new MarkedAsyncCallback(new AsyncCallback() { + editedRegatta.autoRestartTrackingUponCompetitorSetChange, editedRegatta.registrationLinkSecret, + editedRegatta.competitorRegistrationType, new MarkedAsyncCallback(new AsyncCallback() { @Override public void onFailure(Throwable caught) { errorReporter.reportError("Error trying to update regatta " + editedRegatta.getName() + ": " diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SmartphoneTrackingEventManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SmartphoneTrackingEventManagementPanel.java index 96c53a7807f..04aaf699e9f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SmartphoneTrackingEventManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SmartphoneTrackingEventManagementPanel.java @@ -749,8 +749,8 @@ public class SmartphoneTrackingEventManagementPanel sailingService.updateRegatta(regattaIdentifier, regatta.startDate, regatta.endDate, regatta.defaultCourseAreaUuid, configuration, regatta.buoyZoneRadiusInHullLengths, regatta.useStartTimeInference, regatta.controlTrackingFromStartAndFinishTimes, - regatta.registrationLinkSecret, regatta.competitorRegistrationType, - new MarkedAsyncCallback(new AsyncCallback() { + regatta.autoRestartTrackingUponCompetitorSetChange, regatta.registrationLinkSecret, + regatta.competitorRegistrationType, new MarkedAsyncCallback(new AsyncCallback() { @Override public void onFailure(Throwable caught) { errorReporter.reportError( diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java index 487859d979a..932d46e4e3f 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java @@ -325,7 +325,7 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS Date endDate, RegattaCreationParametersDTO seriesNamesWithFleetNamesAndFleetOrderingAndMedal, boolean persistent, ScoringSchemeType scoringSchemeType, UUID defaultCourseAreaId, Double buoyZoneRadiusInHullLengths, boolean useStartTimeInference, - boolean controlTrackingFromStartAndFinishTimes, RankingMetrics rankingMetricType) + boolean controlTrackingFromStartAndFinishTimes, boolean autoRestartTrackingUponCompetitorSetChange, RankingMetrics rankingMetricType) throws UnauthorizedException; void removeRegatta(RegattaIdentifier regattaIdentifier) throws UnauthorizedException; @@ -337,7 +337,7 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS void updateRegatta(RegattaIdentifier regattaIdentifier, Date startDate, Date endDate, UUID defaultCourseAreaUuid, RegattaConfigurationDTO regattaConfiguration, Double buoyZoneRadiusInHullLengths, boolean useStartTimeInference, boolean controlTrackingFromStartAndFinishTimes, - String registrationLinkSecret, CompetitorRegistrationType registrationType) throws UnauthorizedException; + boolean autoRestartTrackingUponCompetitorSetChange, String registrationLinkSecret, CompetitorRegistrationType registrationType) throws UnauthorizedException; List addRaceColumnsToSeries(RegattaIdentifier regattaIdentifier, String seriesName, List> columnNames) throws UnauthorizedException; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java index 49235aab31b..62aba97d488 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java @@ -498,8 +498,8 @@ public interface SailingServiceAsync extends FileStorageManagementGwtServiceAsyn CompetitorRegistrationType competitorRegistrationType, String registrationLinkSecret, Date startDate, Date endDate, RegattaCreationParametersDTO seriesNamesWithFleetNamesAndFleetOrderingAndMedal, boolean persistent, ScoringSchemeType scoringSchemeType, UUID defaultCourseAreaId, Double buoyZoneRadiusInHullLengths, boolean useStartTimeInference, - boolean controlTrackingFromStartAndFinishTimes, RankingMetrics rankingMetricType, - AsyncCallback callback); + boolean controlTrackingFromStartAndFinishTimes, boolean autoRestartTrackingUponCompetitorSetChange, + RankingMetrics rankingMetricType, AsyncCallback callback); void addRaceColumnsToSeries(RegattaIdentifier regattaIdentifier, String seriesName, List> columnNames, AsyncCallback> callback); @@ -608,7 +608,7 @@ public interface SailingServiceAsync extends FileStorageManagementGwtServiceAsyn void updateRegatta(RegattaIdentifier regattaIdentifier, Date startDate, Date endDate, UUID defaultCourseAreaUuid, RegattaConfigurationDTO regattaConfiguration, Double buoyZoneRadiusInHullLengths, boolean useStartTimeInference, boolean controlTrackingFromStartAndFinishTimes, - String registrationLinkSecret, CompetitorRegistrationType registrationType, AsyncCallback callback); + boolean autoRestartTrackingUponCompetitorSetChange, String registrationLinkSecret, CompetitorRegistrationType registrationType, AsyncCallback callback); /** * @param detailType diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java index be320481442..6404896a6c0 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java @@ -2381,4 +2381,5 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, String confirmUnsettingPositionForMarkProperties(String name); String useOfficialResultsForAutomaticUpdates(); String keepEmptyForDefaultUserAndPassword(); + String autoRestartTrackingUponCompetitorSetChange(); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties index 4c550c358b4..6f74f9fe38c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties @@ -2384,4 +2384,5 @@ unsetPosition=Unset position errorTryingToUpdateMarkProperties=Error trying to update mark properties: {0} confirmUnsettingPositionForMarkProperties=Really remove positioning information for mark properties {0}? useOfficialResultsForAutomaticUpdates=Automatically update from "official" results published by TracTrac -keepEmptyForDefaultUserAndPassword=If username and password are left empty the current user is used to log in on the remote server. If your user has the correct permission to do a master data import from the remote server there is no need to fill in those fields. Use only if you have separate user stores or if the data belongs to another user. \ No newline at end of file +keepEmptyForDefaultUserAndPassword=If username and password are left empty the current user is used to log in on the remote server. If your user has the correct permission to do a master data import from the remote server there is no need to fill in those fields. Use only if you have separate user stores or if the data belongs to another user. +autoRestartTrackingUponCompetitorSetChange=Restart tracking of races automatically when competitor set changes \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties index af8f160b870..5116658608a 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties @@ -2398,4 +2398,5 @@ importTrackedRaces=Getrackte Rennen werden importiert errorTryingToUpdateMarkProperties=Fehler beim Ändern der Bahnmarkeneigenschaften: {0} confirmUnsettingPositionForMarkProperties=Positionierungsinformation für Bahnmarkeneigenschaften {0} wirklich entfernen? useOfficialResultsForAutomaticUpdates=Automatisch von "offiziellen" von TracTrac veröffentlichten Ergebnissen aktualisieren -keepEmptyForDefaultUserAndPassword=Wenn kein Benutzername und kein Kennwort eingetragen werden, wird der aktuelle Benutzer zum importieren verwendet. Wenn der aktuelle Nutzer die Berechtigung zum Exportieren der Daten auf dem Zielserver hat, können die Felder leer bleiben. Sollen jedoch die Daten eines anderen Benutzers importiert werden, sind Benutzername und Kennwort des Benutzers einzutragen. \ No newline at end of file +keepEmptyForDefaultUserAndPassword=Wenn kein Benutzername und kein Kennwort eingetragen werden, wird der aktuelle Benutzer zum importieren verwendet. Wenn der aktuelle Nutzer die Berechtigung zum Exportieren der Daten auf dem Zielserver hat, können die Felder leer bleiben. Sollen jedoch die Daten eines anderen Benutzers importiert werden, sind Benutzername und Kennwort des Benutzers einzutragen. +autoRestartTrackingUponCompetitorSetChange=Tracking der Rennen automatisch neu starten, wenn sich die Teilnehmerliste ändert \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index 12c1981a319..c08d4ccaa20 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -1143,6 +1143,7 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet regattaDTO.buoyZoneRadiusInHullLengths = regatta.getBuoyZoneRadiusInHullLengths(); regattaDTO.useStartTimeInference = regatta.useStartTimeInference(); regattaDTO.controlTrackingFromStartAndFinishTimes = regatta.isControlTrackingFromStartAndFinishTimes(); + regattaDTO.autoRestartTrackingUponCompetitorSetChange = regatta.isAutoRestartTrackingUponCompetitorSetChange(); regattaDTO.canBoatsOfCompetitorsChangePerRace = regatta.canBoatsOfCompetitorsChangePerRace(); regattaDTO.competitorRegistrationType = regatta.getCompetitorRegistrationType(); regattaDTO.configuration = convertToRegattaConfigurationDTO(regatta.getRegattaConfiguration()); @@ -5067,7 +5068,7 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet @Override public void updateRegatta(RegattaIdentifier regattaName, Date startDate, Date endDate, UUID defaultCourseAreaUuid, RegattaConfigurationDTO configurationDTO, Double buoyZoneRadiusInHullLengths, boolean useStartTimeInference, boolean controlTrackingFromStartAndFinishTimes, - String registrationLinkSecret, CompetitorRegistrationType registrationType) { + boolean autoRestartTrackingUponCompetitorSetChange, String registrationLinkSecret, CompetitorRegistrationType registrationType) { Regatta regatta = getService().getRegatta(regattaName); if (regatta != null) { SecurityUtils.getSubject().checkPermission(SecuredDomainType.REGATTA.getStringPermissionForObject(DefaultActions.UPDATE, regatta)); @@ -5076,7 +5077,7 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet TimePoint endTimePoint = endDate != null ? new MillisecondsTimePoint(endDate) : null; getService().apply(new UpdateSpecificRegatta(regattaName, startTimePoint, endTimePoint, defaultCourseAreaUuid, convertToRegattaConfiguration(configurationDTO), buoyZoneRadiusInHullLengths, useStartTimeInference, - controlTrackingFromStartAndFinishTimes, registrationLinkSecret, registrationType)); + controlTrackingFromStartAndFinishTimes, autoRestartTrackingUponCompetitorSetChange, registrationLinkSecret, registrationType)); } @Override @@ -5147,7 +5148,7 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet Date startDate, Date endDate, RegattaCreationParametersDTO seriesNamesWithFleetNamesAndFleetOrderingAndMedal, boolean persistent, ScoringSchemeType scoringSchemeType, UUID defaultCourseAreaId, Double buoyZoneRadiusInHullLengths, boolean useStartTimeInference, - boolean controlTrackingFromStartAndFinishTimes, RankingMetrics rankingMetricType) { + boolean controlTrackingFromStartAndFinishTimes, boolean autoRestartTrackingUponCompetitorSetChange, RankingMetrics rankingMetricType) { return getSecurityService().setOwnershipCheckPermissionForObjectCreationAndRevertOnError( SecuredDomainType.REGATTA, Regatta.getTypeRelativeObjectIdentifier(regattaName), regattaName, new Callable() { @@ -5161,7 +5162,7 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet seriesNamesWithFleetNamesAndFleetOrderingAndMedal, persistent, baseDomainFactory.createScoringScheme(scoringSchemeType), defaultCourseAreaId, buoyZoneRadiusInHullLengths, useStartTimeInference, - controlTrackingFromStartAndFinishTimes, rankingMetricType)); + controlTrackingFromStartAndFinishTimes, autoRestartTrackingUponCompetitorSetChange, rankingMetricType)); return convertToRegattaDTO(regatta); } }); @@ -5513,7 +5514,7 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet regatta.startDate, regatta.endDate, new RegattaCreationParametersDTO(getSeriesCreationParameters(regatta)), true, regatta.scoringScheme, regatta.defaultCourseAreaUuid, regatta.buoyZoneRadiusInHullLengths, regatta.useStartTimeInference, - regatta.controlTrackingFromStartAndFinishTimes, regatta.rankingMetricType); + regatta.controlTrackingFromStartAndFinishTimes, regatta.autoRestartTrackingUponCompetitorSetChange, regatta.rankingMetricType); } private SeriesParameters getSeriesParameters(SeriesDTO seriesDTO) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RegattaDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RegattaDTO.java index e12208f6d98..25dc3338ea0 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RegattaDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RegattaDTO.java @@ -42,6 +42,7 @@ public class RegattaDTO extends NamedSecuredObjectDTO implements SecuredDTO { public DeviceConfigurationDTO.RegattaConfigurationDTO configuration; public boolean useStartTimeInference = true; public boolean controlTrackingFromStartAndFinishTimes = false; + public boolean autoRestartTrackingUponCompetitorSetChange = false; public boolean canBoatsOfCompetitorsChangePerRace = false; public CompetitorRegistrationType competitorRegistrationType = CompetitorRegistrationType.CLOSED; public RankingMetrics rankingMetricType; @@ -77,6 +78,7 @@ public class RegattaDTO extends NamedSecuredObjectDTO implements SecuredDTO { this.configuration = other.configuration; this.useStartTimeInference = other.useStartTimeInference; this.controlTrackingFromStartAndFinishTimes = other.controlTrackingFromStartAndFinishTimes; + this.autoRestartTrackingUponCompetitorSetChange = other.autoRestartTrackingUponCompetitorSetChange; this.canBoatsOfCompetitorsChangePerRace = other.canBoatsOfCompetitorsChangePerRace; this.competitorRegistrationType = other.competitorRegistrationType; this.buoyZoneRadiusInHullLengths = other.buoyZoneRadiusInHullLengths; diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/AbstractTestStoringAndRetrievingRaceLogInRegatta.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/AbstractTestStoringAndRetrievingRaceLogInRegatta.java index 6c29c8527ca..1df6fb1e03c 100755 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/AbstractTestStoringAndRetrievingRaceLogInRegatta.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/AbstractTestStoringAndRetrievingRaceLogInRegatta.java @@ -67,8 +67,8 @@ public abstract class AbstractTestStoringAndRetrievingRaceLogInRegatta extends R /* canBoatsOfCompetitorsChangePerRace */ true, CompetitorRegistrationType.CLOSED, /*startDate*/ null, /*endDate*/ null, series, persistent, scoringScheme, "123", courseArea, /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */ true, - /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new, - /* registrationLinkSecret */ UUID.randomUUID().toString()); + /* controlTrackingFromStartAndFinishTimes */ false, /* autoRestartTrackingUponCompetitorSetChange */ false, + OneDesignRankingMetric::new, /* registrationLinkSecret */ UUID.randomUUID().toString()); return regatta; } diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/RaceLogConnectivityParamsLoadAndStoreTest.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/RaceLogConnectivityParamsLoadAndStoreTest.java index 7b25b86397a..2e505eaa35d 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/RaceLogConnectivityParamsLoadAndStoreTest.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/RaceLogConnectivityParamsLoadAndStoreTest.java @@ -55,7 +55,7 @@ public class RaceLogConnectivityParamsLoadAndStoreTest extends AbstractConnectiv MillisecondsTimePoint.now().plus(Duration.ONE_DAY), UUID.randomUUID(), series, /* persistent */ true, new LowPoint(), new CourseAreaImpl("Default", UUID.randomUUID()), /* buoyZoneRadiusInHullLengths */ 2.0, /* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, - OneDesignRankingMetric::new); + /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); theSeries.addRaceColumn("R1", racingEventService); theSeries.addRaceColumn("R2", racingEventService); theSeries.addRaceColumn("R3", racingEventService); diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndLoadingEventsAndRegattas.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndLoadingEventsAndRegattas.java index 710ab9885fd..4bd1b2de649 100755 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndLoadingEventsAndRegattas.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndLoadingEventsAndRegattas.java @@ -394,20 +394,16 @@ public class TestStoringAndLoadingEventsAndRegattas extends AbstractMongoDBTest @Test public void testLoadStoreRegattaConfiguration() { - RegattaConfigurationImpl configuration = new RegattaConfigurationImpl(); configuration.setDefaultRacingProcedureType(RacingProcedureType.BASIC); - BoatClass boatClass = DomainFactory.INSTANCE.getOrCreateBoatClass("ESS40", false); Regatta regatta = createRegattaAndAddRaceColumns(1, 1, RegattaImpl.getDefaultName("RR", boatClass.getName()), boatClass, regattaStartDate, regattaEndDate, false, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.HIGH_POINT), OneDesignRankingMetric::new); regatta.setRegattaConfiguration(configuration); - MongoObjectFactory mof = PersistenceFactory.INSTANCE.getMongoObjectFactory(getMongoService()); mof.storeRegatta(regatta); DomainObjectFactory dof = PersistenceFactory.INSTANCE.getDomainObjectFactory(getMongoService(), DomainFactory.INSTANCE); Regatta loadedRegatta = dof.loadRegatta(regatta.getName(), null); - assertNotNull(loadedRegatta.getRegattaConfiguration()); assertEquals(RacingProcedureType.BASIC, loadedRegatta.getRegattaConfiguration().getDefaultRacingProcedureType()); } @@ -429,7 +425,7 @@ public class TestStoringAndLoadingEventsAndRegattas extends AbstractMongoDBTest /* registrationLinkSecret */ null, regattaStartDate, regattaEndDate, "123", regattaProxy.getSeries(), regattaProxy.isPersistent(), DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), /* defaultCourseAreaId */ null, /* buoyZoneRadiusInHullLengths */ 2.0, /* useStartTimeInference */ true, - /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new); + /* controlTrackingFromStartAndFinishTimes */ false, /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); DynamicCompetitorWithBoat competitorWithBoat1 = AbstractLeaderboardTest.createCompetitorWithBoat("Humba1"); DynamicCompetitorWithBoat competitorWithBoat2 = AbstractLeaderboardTest.createCompetitorWithBoat("Humba2"); DynamicBoat boat1= AbstractLeaderboardTest.createBoat("Humba1 Boot"); @@ -449,19 +445,16 @@ public class TestStoringAndLoadingEventsAndRegattas extends AbstractMongoDBTest // use the set-up and add a regatta leaderboard with eliminations that wraps the regatta leaderboard RegattaLeaderboardWithEliminations withEliminations = res.addRegattaLeaderboardWithEliminations("U16", /* leaderboardDisplayName */ "Display Name", fullLeaderboard); res.apply(new UpdateEliminatedCompetitorsInLeaderboard(withEliminations.getName(), Collections.singleton(competitorWithBoat1))); - DomainObjectFactory dof = PersistenceFactory.INSTANCE.getDomainObjectFactory(getMongoService(), DomainFactory.INSTANCE); Regatta loadedRegatta = dof.loadRegatta(regatta.getName(), /* trackedRegattaRegistry */ null); assertNotNull(loadedRegatta); assertEquals(regatta.getName(), loadedRegatta.getName()); assertEquals(Util.size(regatta.getSeries()), Util.size(loadedRegatta.getSeries())); - Leaderboard loadedLeaderboard = dof.loadLeaderboard(regatta.getName(), res, /* leaderboardRegistry */ null); assertNotNull(loadedLeaderboard); assertTrue(loadedLeaderboard instanceof RegattaLeaderboard); RegattaLeaderboard loadedRegattaLeaderboard = (RegattaLeaderboard) loadedLeaderboard; assertSame(regatta, loadedRegattaLeaderboard.getRegatta()); - RacingEventService res2 = new RacingEventServiceImpl(PersistenceFactory.INSTANCE.getDomainObjectFactory(getMongoService(), DomainFactory.INSTANCE), PersistenceFactory.INSTANCE .getMongoObjectFactory(getMongoService()), MediaDBFactory.INSTANCE.getMediaDB(getMongoService()), EmptyWindStore.INSTANCE, EmptySensorFixStore.INSTANCE, /* restoreTrackedRaces */ false); // now load the thing again from the store: @@ -497,7 +490,6 @@ public class TestStoringAndLoadingEventsAndRegattas extends AbstractMongoDBTest final int numberOfQualifyingRaces = 5; final int numberOfFinalRaces = 7; final String regattaBaseName = "Kieler Woche"; - Regatta regattaProxy = createRegatta(RegattaImpl.getDefaultName(regattaBaseName, boatClass.getName()), boatClass, /* canBoatsOfCompetitorsChangePerRace */ true, CompetitorRegistrationType.OPEN_UNMODERATED, regattaStartDate, regattaEndDate, /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null, OneDesignRankingMetric::new); @@ -507,7 +499,7 @@ public class TestStoringAndLoadingEventsAndRegattas extends AbstractMongoDBTest regattaProxy.getSeries(), regattaProxy.isPersistent(), DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null, /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */ true, - /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new); + /* controlTrackingFromStartAndFinishTimes */ false, /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); trackedRegatta[0] = new DynamicTrackedRegattaImpl(regatta); addRaceColumns(numberOfQualifyingRaces, numberOfFinalRaces, regatta); logColumnsInRegatta(regatta); @@ -522,7 +514,6 @@ public class TestStoringAndLoadingEventsAndRegattas extends AbstractMongoDBTest .getName(), q2YellowTrackedRace.getRaceIdentifier())); res.apply(new UpdateLeaderboardMaxPointsReason(regattaLeaderboard.getName(), q2.getName(), hasso.getId().toString(), MaxPointsReason.DNF, MillisecondsTimePoint.now())); - // load new RacingEventService including regatta and leaderboard RacingEventService resForLoading = createRacingEventServiceWithOneMockedTrackedRace(q2YellowTrackedRace); Regatta loadedRegatta = resForLoading.getRegattaByName("Kieler Woche (29ERXX)"); diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/RegattaJsonSerializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/RegattaJsonSerializer.java index 7b337a3922b..8d5b35d528a 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/RegattaJsonSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/RegattaJsonSerializer.java @@ -27,6 +27,7 @@ public class RegattaJsonSerializer implements JsonSerializer { public static final String FIELD_COMPETITOR_REGISTRATION_TYPE = "competitorRegistrationType"; public static final String FIELD_USE_START_TIME_INFERENCE = "useStartTimeInference"; public static final String FIELD_CONTROL_TRACKING_FROM_START_AND_FINISH_TIMES = "controlTrackingFromStartAndFinishTimes"; + public static final String FIELD_AUTO_RESTART_TRACKING_UPON_COMPETITOR_SET_CHANGE = "autoRestartTrackingUponCompetitorSetChange"; private final JsonSerializer seriesSerializer; private final JsonSerializer competitorSerializer; @@ -60,6 +61,7 @@ public class RegattaJsonSerializer implements JsonSerializer { result.put(FIELD_COMPETITOR_REGISTRATION_TYPE, regatta.getCompetitorRegistrationType().name()); result.put(FIELD_USE_START_TIME_INFERENCE, regatta.useStartTimeInference()); result.put(FIELD_CONTROL_TRACKING_FROM_START_AND_FINISH_TIMES, regatta.isControlTrackingFromStartAndFinishTimes()); + result.put(FIELD_AUTO_RESTART_TRACKING_UPON_COMPETITOR_SET_CHANGE, regatta.isAutoRestartTrackingUponCompetitorSetChange()); if (seriesSerializer != null) { JSONArray seriesJson = new JSONArray(); for (Series series : regatta.getSeries()) { diff --git a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardGroupResourceTest.java b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardGroupResourceTest.java index 9dcc7dabffe..787fd3d842e 100644 --- a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardGroupResourceTest.java +++ b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardGroupResourceTest.java @@ -54,7 +54,7 @@ public class LeaderboardGroupResourceTest extends AbstractJaxRsApiTest { /* registrationLinkSecret */ null, /* startDate */ null, /* endDate */ null, UUID.randomUUID(), series, /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null, /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */ true, - /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new); + /* controlTrackingFromStartAndFinishTimes */ false, /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); testSeries.addRaceColumn("R1", /* trackedRegattaRegistry */ null); testSeries.addRaceColumn("R2", /* trackedRegattaRegistry */ null); List competitors = createCompetitors(4); diff --git a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourceTest.java b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourceTest.java index 0ebf6f086d0..1996d8a397c 100644 --- a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourceTest.java +++ b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourceTest.java @@ -66,7 +66,7 @@ public class LeaderboardsResourceTest extends AbstractJaxRsApiTest { /* registrationLinkSecret */ null, /* startDate */ null, /* endDate */ null, UUID.randomUUID(), series, /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null, /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */ true, - /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new); + /* controlTrackingFromStartAndFinishTimes */ false, /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); testSeries.addRaceColumn("R1", /* trackedRegattaRegistry */ null); testSeries.addRaceColumn("R2", /* trackedRegattaRegistry */ null); List competitors = createCompetitors(4); diff --git a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/RegattasResourceTest.java b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/RegattasResourceTest.java index 58b57a44164..801410562d6 100644 --- a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/RegattasResourceTest.java +++ b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/RegattasResourceTest.java @@ -95,7 +95,7 @@ public class RegattasResourceTest extends AbstractJaxRsApiTest { /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null, /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */ true, - /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new); + /* controlTrackingFromStartAndFinishTimes */ false, /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); } }); getSecurityService().setOwnershipCheckPermissionForObjectCreationAndRevertOnError(SecuredDomainType.REGATTA, @@ -108,7 +108,7 @@ public class RegattasResourceTest extends AbstractJaxRsApiTest { UUID.randomUUID(), series, /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null, /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */ true, - /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new); + /* controlTrackingFromStartAndFinishTimes */ false, /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); } }); testSeries.addRaceColumn("R1", /* trackedRegattaRegistry */ null); diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/EventsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/EventsResource.java index 9a421ad66f0..473182ab70e 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/EventsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/EventsResource.java @@ -388,11 +388,13 @@ public class EventsResource extends AbstractSailingServerResource { private RegattaLeaderboard validateAndCreateRegatta(String regattaNameParam, String boatClassNameParam, String scoringSchemeParam, UUID courseAreaId, String buoyZoneRadiusInHullLengthsParam, String useStartTimeInterferenceParam, String controlTrackingFromStartAndFinishTimesParam, - String rankingMetricParam, List leaderboardDiscardThresholdsParam, String numberOfRacesParam, - boolean canBoatsOfCompetitorsChangePerRace, CompetitorRegistrationType competitorRegistrationType, - String competitorRegistrationSecret) throws ParseException, NotFoundException { + String autoRestartTrackingUponCompetitorSetChangeParam, String rankingMetricParam, List leaderboardDiscardThresholdsParam, + String numberOfRacesParam, boolean canBoatsOfCompetitorsChangePerRace, + CompetitorRegistrationType competitorRegistrationType, String competitorRegistrationSecret) throws ParseException, NotFoundException { boolean controlTrackingFromStartAndFinishTimes = controlTrackingFromStartAndFinishTimesParam == null ? false : Boolean.parseBoolean(controlTrackingFromStartAndFinishTimesParam); + boolean autoRestartTrackingUponCompetitorSetChange = autoRestartTrackingUponCompetitorSetChangeParam == null ? false + : Boolean.parseBoolean(autoRestartTrackingUponCompetitorSetChangeParam); boolean useStartTimeInterference = useStartTimeInterferenceParam == null ? true : Boolean.parseBoolean(useStartTimeInterferenceParam); double buoyZoneRadiusInHullLengths = buoyZoneRadiusInHullLengthsParam == null ? 3.0 @@ -426,7 +428,7 @@ public class EventsResource extends AbstractSailingServerResource { return getService().apply(new AddSpecificRegatta(regattaName, boatClassName, canBoatsOfCompetitorsChangePerRace, competitorRegistrationType, competitorRegistrationSecret, null, null, regattaId, regattaCreationParametersDTO, /* isPersistent */ true, scoringScheme, courseAreaId, buoyZoneRadiusInHullLengths, - useStartTimeInterference, controlTrackingFromStartAndFinishTimes, rankingMetric)); + useStartTimeInterference, controlTrackingFromStartAndFinishTimes, autoRestartTrackingUponCompetitorSetChange, rankingMetric)); } }); final RegattaLeaderboard leaderboard = addLeaderboard(regattaName, leaderboardDiscardThresholds); @@ -497,7 +499,6 @@ public class EventsResource extends AbstractSailingServerResource { throw new IllegalArgumentException(ExceptionManager.incorrectParameterValue(competitorRegistrationTypeString, StringUtils.join(CompetitorRegistrationType.values(), ", "))); } - Callable> doCreationAction = new Callable>() { @Override public Util.Triple call() throws Exception { @@ -525,9 +526,9 @@ public class EventsResource extends AbstractSailingServerResource { leaderboard = validateAndCreateRegatta(regattaAndLeaderboardName, boatClassName, /* scoringSchemeParam */ scoringScheme, courseArea.getId(), /* buoyZoneRadiusInHullLengthsParam */ null, /* useStartTimeInterferenceParam */ null, /* controlTrackingFromStartAndFinishTimesParam */ null, - /* rankingMetricParam */ rankingMetric, /* leaderboardDiscardThresholdsParam */ leaderboardDiscardThresholdsParam, - numberOfRacesParam, canBoatsOfCompetitorsChangePerRace, competitorRegistrationType, - localCompetitorRegistrationSecret); + /* autoRestartTrackingUponCompetitorSetChangeParam */ null, /* rankingMetricParam */ rankingMetric, + /* leaderboardDiscardThresholdsParam */ leaderboardDiscardThresholdsParam, numberOfRacesParam, canBoatsOfCompetitorsChangePerRace, + competitorRegistrationType, localCompetitorRegistrationSecret); if (leaderboardGroup != null) { getService().apply(new UpdateLeaderboardGroup(leaderboardGroup.getName(), leaderboardGroup.getName(), leaderboardGroup.getDescription(), leaderboardGroup.getDisplayName(), diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RegattasResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RegattasResource.java index b4e7806be1f..afebb8565ad 100755 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RegattasResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RegattasResource.java @@ -306,7 +306,6 @@ public class RegattasResource extends AbstractSailingServerResource { response = getBadRegattaErrorResponse(regattaName); } else { getSecurityService().checkCurrentUserUpdatePermission(regatta); - final JSONObject requestObject; try { Object requestBody = JSONValue.parseWithException(jsonBody); @@ -316,41 +315,35 @@ public class RegattasResource extends AbstractSailingServerResource { return Response.status(Status.BAD_REQUEST).entity("Invalid JSON body in request") .type(MediaType.TEXT_PLAIN).build(); } - final Number startTimePointAsMillis = (Number) requestObject.get("startTimePointAsMillis"); final TimePoint startTimePoint = startTimePointAsMillis == null ? null : new MillisecondsTimePoint(startTimePointAsMillis.longValue()); final Number endTimePointAsMillis = (Number) requestObject.get("endTimePointAsMillis"); final TimePoint endTimePoint = endTimePointAsMillis == null ? null : new MillisecondsTimePoint(endTimePointAsMillis.longValue()); - final String defaultCourseAreaUuidString = (String) requestObject.get("defaultCourseAreaUuid"); final UUID defaultCourseAreaUuid = defaultCourseAreaUuidString == null ? null : UUID.fromString(defaultCourseAreaUuidString); - final Number buoyZoneRadiusInHullLengthsNumber = (Number) requestObject.get("buoyZoneRadiusInHullLengths"); final Double buoyZoneRadiusInHullLengths = buoyZoneRadiusInHullLengthsNumber == null ? null : buoyZoneRadiusInHullLengthsNumber.doubleValue(); final boolean useStartTimeInference = Boolean.TRUE.equals(requestObject.get("useStartTimeInference")); final boolean controlTrackingFromStartAndFinishTimes = Boolean.TRUE .equals(requestObject.get("controlTrackingFromStartAndFinishTimes")); - + final boolean autoRestartTrackingUponCompetitorSetChange = Boolean.TRUE.equals(requestObject.get("autoRestartTrackingUponCompetitorSetChange")); String registrationLinkSecret = (String) requestObject.get("registrationLinkSecret"); if (registrationLinkSecret == null) { registrationLinkSecret = regatta.getRegistrationLinkSecret(); } - final String competitorRegistrationTypeString = (String) requestObject.get("competitorRegistrationType"); final CompetitorRegistrationType competitorRegistrationType = competitorRegistrationTypeString == null ? regatta.getCompetitorRegistrationType() : CompetitorRegistrationType.valueOf(competitorRegistrationTypeString); - getService().apply(new UpdateSpecificRegatta(new RegattaName(regattaName), startTimePoint, endTimePoint, defaultCourseAreaUuid, /* TODO updating the configuration is currently not supported */ regatta.getRegattaConfiguration(), buoyZoneRadiusInHullLengths, useStartTimeInference, controlTrackingFromStartAndFinishTimes, - registrationLinkSecret, competitorRegistrationType)); - + autoRestartTrackingUponCompetitorSetChange, registrationLinkSecret, competitorRegistrationType)); SeriesJsonSerializer seriesJsonSerializer = new SeriesJsonSerializer( new FleetJsonSerializer(new ColorJsonSerializer())); JsonSerializer regattaSerializer = new RegattaJsonSerializer(seriesJsonSerializer, null, null, diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/trackfiles/impl/ExpeditionAllInOneImporter.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/trackfiles/impl/ExpeditionAllInOneImporter.java index 025002e3592..34496677bdb 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/trackfiles/impl/ExpeditionAllInOneImporter.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/trackfiles/impl/ExpeditionAllInOneImporter.java @@ -762,8 +762,9 @@ public class ExpeditionAllInOneImporter { /* can boats of competitors change */ false, CompetitorRegistrationType.CLOSED, /* registrationLinkSecret */ UUID.randomUUID().toString(), /* start date */ null, /* end date */ null, UUID.randomUUID(), - regattaCreationParameters, true, scoringScheme, courseAreaId, buoyZoneRadiusInHullLengths, true, false, - rankingMetric)); + regattaCreationParameters, true, scoringScheme, courseAreaId, buoyZoneRadiusInHullLengths, /* use start time inference */ true, + /* control tracking from start and finish times */ false, + /* autoRestartTrackingUponCompetitorSetChange */ false, rankingMetric)); this.ensureBoatClassDetermination(regatta); service.apply(new AddColumnToSeries(regattaIdentifier, seriesName, raceColumnName)); return regatta; diff --git a/java/com.sap.sailing.server.gateway/webservices/api/v1/regattaUpdateDoc.html b/java/com.sap.sailing.server.gateway/webservices/api/v1/regattaUpdateDoc.html index 5a04b76d60c..014119cafa8 100644 --- a/java/com.sap.sailing.server.gateway/webservices/api/v1/regattaUpdateDoc.html +++ b/java/com.sap.sailing.server.gateway/webservices/api/v1/regattaUpdateDoc.html @@ -38,6 +38,9 @@ All slashes contained within the {name} parameter must be replaced by "__" (doub
  • buoyZoneRadiusInHullLengths: Double to set buoy zone value or null to unset
  • useStartTimeInference: Only one of useStartTimeInference and controlTrackingFromStartAndFinishTimes may be true
  • controlTrackingFromStartAndFinishTimes: Only one of useStartTimeInference and controlTrackingFromStartAndFinishTimes may be true
  • +
  • autoRestartTrackingUponCompetitorSetChange: If set, changes in the competitor registrations trigger removing and re-tracking of the tracked races affected + to reflect the changes in the set of competitors. Note that this has the effect that until the race(s) is/are re-loaded, users may see incorrect + or incomplete states.
  • diff --git a/java/com.sap.sailing.server.interface/src/com/sap/sailing/server/interfaces/RacingEventService.java b/java/com.sap.sailing.server.interface/src/com/sap/sailing/server/interfaces/RacingEventService.java index e53695c8f74..133b25073b0 100644 --- a/java/com.sap.sailing.server.interface/src/com/sap/sailing/server/interfaces/RacingEventService.java +++ b/java/com.sap.sailing.server.interface/src/com/sap/sailing/server/interfaces/RacingEventService.java @@ -333,26 +333,27 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch /** * Creates a regatta and replicates this to all replicas currently attached. - * * @param series * the series must not have any {@link RaceColumn}s yet * @param controlTrackingFromStartAndFinishTimes * cannot be {@code true} if {@link useStartTimeInference} is also {@code true} + * @param autoRestartTrackingUponCompetitorSetChange TODO */ Regatta createRegatta(String regattaName, String boatClassName, boolean canBoatsOfCompetitorsChangePerRace, CompetitorRegistrationType competitorRegistrationType, String registrationLinkSecret, TimePoint startDate, TimePoint endDate, Serializable id, Iterable series, boolean persistent, ScoringScheme scoringScheme, Serializable defaultCourseAreaId, Double buoyZoneRadiusInHullLengths, - boolean useStartTimeInference, boolean controlTrackingFromStartAndFinishTimes, RankingMetricConstructor rankingMetricConstructor); + boolean useStartTimeInference, boolean controlTrackingFromStartAndFinishTimes, boolean autoRestartTrackingUponCompetitorSetChange, RankingMetricConstructor rankingMetricConstructor); /** * @param controlTrackingFromStartAndFinishTimes * cannot be {@code true} if {@link useStartTimeInference} is also {@code true} + * @param autoRestartTrackingUponCompetitorSetChange TODO */ Regatta updateRegatta(RegattaIdentifier regattaIdentifier, TimePoint startDate, TimePoint endDate, Serializable newDefaultCourseAreaId, RegattaConfiguration regattaConfiguration, Iterable series, Double buoyZoneRadiusInHullLengths, boolean useStartTimeInference, - boolean controlTrackingFromStartAndFinishTimes, String registrationLinkSecret, - CompetitorRegistrationType registrationType); + boolean controlTrackingFromStartAndFinishTimes, boolean autoRestartTrackingUponCompetitorSetChange, + String registrationLinkSecret, CompetitorRegistrationType registrationType); /** * Adds raceDefinition to the {@link Regatta} such that it will appear in {@link Regatta#getAllRaces()} @@ -504,6 +505,7 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch Map getCompetitorToBoatMappingsForRace(String leaderboardName, String raceColumnName, String fleetName); /** + * @param autoRestartTrackingUponCompetitorSetChange TODO * @return a pair with the found or created regatta, and a boolean that tells whether the regatta was created during * the call */ @@ -512,7 +514,7 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch String registrationLinkSecret, TimePoint startDate, TimePoint endDate, Serializable id, Iterable series, boolean persistent, ScoringScheme scoringScheme, Serializable defaultCourseAreaId, Double buoyZoneRadiusInHullLengths, boolean useStartTimeInference, - boolean controlTrackingFromStartAndFinishTimes, RankingMetricConstructor rankingMetricConstructor); + boolean controlTrackingFromStartAndFinishTimes, boolean autoRestartTrackingUponCompetitorSetChange, RankingMetricConstructor rankingMetricConstructor); /** * @return map where keys are the toString() representation of the {@link RaceDefinition#getId() IDs} of races passed to diff --git a/java/com.sap.sailing.server.interface/src/com/sap/sailing/server/operationaltransformation/AddSpecificRegatta.java b/java/com.sap.sailing.server.interface/src/com/sap/sailing/server/operationaltransformation/AddSpecificRegatta.java index 7dfbf1d18ee..f996873547c 100755 --- a/java/com.sap.sailing.server.interface/src/com/sap/sailing/server/operationaltransformation/AddSpecificRegatta.java +++ b/java/com.sap.sailing.server.interface/src/com/sap/sailing/server/operationaltransformation/AddSpecificRegatta.java @@ -33,6 +33,7 @@ public class AddSpecificRegatta extends AbstractAddRegattaOperation { private final Double buoyZoneRadiusInHullLengths; private final boolean useStartTimeInference; private final boolean controlTrackingFromStartAndFinishTimes; + private final boolean autoRestartTrackingUponCompetitorSetChange; private final boolean canBoatsOfCompetitorsChangePerRace; private final CompetitorRegistrationType competitorRegistrationType; private final RankingMetrics rankingMetricType; @@ -42,7 +43,7 @@ public class AddSpecificRegatta extends AbstractAddRegattaOperation { CompetitorRegistrationType competitorRegistrationType, String registrationLinkSecret, TimePoint startDate, TimePoint endDate, Serializable id, RegattaCreationParametersDTO seriesNamesWithFleetNamesAndFleetOrderingAndMedalAndDiscardingThresholds, boolean persistent, ScoringScheme scoringScheme, Serializable defaultCourseAreaId, Double buoyZoneRadiusInHullLengths, boolean useStartTimeInference, - boolean controlTrackingFromStartAndFinishTimes, RankingMetrics rankingMetricType) { + boolean controlTrackingFromStartAndFinishTimes, boolean autoRestartTrackingUponCompetitorSetChange, RankingMetrics rankingMetricType) { super(regattaName, boatClassName, startDate, endDate, id); this.canBoatsOfCompetitorsChangePerRace = canBoatsOfCompetitorsChangePerRace; this.competitorRegistrationType = competitorRegistrationType; @@ -52,6 +53,7 @@ public class AddSpecificRegatta extends AbstractAddRegattaOperation { this.defaultCourseAreaId = defaultCourseAreaId; this.useStartTimeInference = useStartTimeInference; this.controlTrackingFromStartAndFinishTimes = controlTrackingFromStartAndFinishTimes; + this.autoRestartTrackingUponCompetitorSetChange = autoRestartTrackingUponCompetitorSetChange; this.rankingMetricType = rankingMetricType; this.buoyZoneRadiusInHullLengths = buoyZoneRadiusInHullLengths; this.registrationLinkSecret = registrationLinkSecret; @@ -59,9 +61,11 @@ public class AddSpecificRegatta extends AbstractAddRegattaOperation { @Override public Regatta internalApplyTo(RacingEventService toState) throws Exception { - Regatta regatta = toState.createRegatta(getRegattaName(), getBoatClassName(), canBoatsOfCompetitorsChangePerRace, - competitorRegistrationType, registrationLinkSecret, getStartDate(), getEndDate(), getId(), createSeries(toState), - persistent, scoringScheme, defaultCourseAreaId, buoyZoneRadiusInHullLengths, useStartTimeInference, controlTrackingFromStartAndFinishTimes, RankingMetricsFactory.getRankingMetricConstructor(rankingMetricType)); + Regatta regatta = toState.createRegatta(getRegattaName(), getBoatClassName(), + canBoatsOfCompetitorsChangePerRace, competitorRegistrationType, registrationLinkSecret, getStartDate(), + getEndDate(), getId(), createSeries(toState), persistent, scoringScheme, defaultCourseAreaId, + buoyZoneRadiusInHullLengths, useStartTimeInference, controlTrackingFromStartAndFinishTimes, + autoRestartTrackingUponCompetitorSetChange, RankingMetricsFactory.getRankingMetricConstructor(rankingMetricType)); return regatta; } diff --git a/java/com.sap.sailing.server.interface/src/com/sap/sailing/server/operationaltransformation/UpdateSpecificRegatta.java b/java/com.sap.sailing.server.interface/src/com/sap/sailing/server/operationaltransformation/UpdateSpecificRegatta.java index 16c5c626216..326959b042c 100755 --- a/java/com.sap.sailing.server.interface/src/com/sap/sailing/server/operationaltransformation/UpdateSpecificRegatta.java +++ b/java/com.sap.sailing.server.interface/src/com/sap/sailing/server/operationaltransformation/UpdateSpecificRegatta.java @@ -19,6 +19,7 @@ public class UpdateSpecificRegatta extends AbstractRacingEventServiceOperation emptyWaypointList = Collections.emptyList(); final String boatName = "Kielboat Harry"; final BoatClass boatClass = DomainFactory.INSTANCE.getOrCreateBoatClass("505", /* typicallyStartsUpwind */true); diff --git a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/CompetitorReplicationTest.java b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/CompetitorReplicationTest.java index fc166869d16..1a9b5a89687 100755 --- a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/CompetitorReplicationTest.java +++ b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/CompetitorReplicationTest.java @@ -87,7 +87,7 @@ public class CompetitorReplicationTest extends AbstractServerReplicationTest { /* registrationLinkSecret */ null, /* startDate */ null, /* endDate */ null, regattaId, series, /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null, /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */ true, - /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new); + /* controlTrackingFromStartAndFinishTimes */ false, /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); Iterable emptyWaypointList = Collections.emptyList(); final String competitorName = "Der mit dem Kiel zieht"; final String competitorShortName = "DK"; diff --git a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/InitialLoadReplicationObjectIdentityTest.java b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/InitialLoadReplicationObjectIdentityTest.java index 7e2ff452472..3cda3089f89 100755 --- a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/InitialLoadReplicationObjectIdentityTest.java +++ b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/InitialLoadReplicationObjectIdentityTest.java @@ -164,7 +164,8 @@ public class InitialLoadReplicationObjectIdentityTest extends AbstractServerRepl /* registrationLinkSecret */ null, /* startDate */ null, /* endDate */ null, UUID.randomUUID(), series, /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null, /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */ true, - /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new); + /* controlTrackingFromStartAndFinishTimes */ false, + /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); assertNotNull(master.getRegatta(masterRegatta.getRegattaIdentifier())); assertTrue(master.getAllRegattas().iterator().hasNext()); assertNull(replica.getRegatta(masterRegatta.getRegattaIdentifier())); diff --git a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/RegattaReplicationTest.java b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/RegattaReplicationTest.java index bc3ef32c90f..d6d0f0065c8 100755 --- a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/RegattaReplicationTest.java +++ b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/RegattaReplicationTest.java @@ -50,7 +50,7 @@ public class RegattaReplicationTest extends AbstractServerReplicationTest { /* registrationLinkSecret */ null, /* startDate */ null, /* endDate */ null, regattaId, series, /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null, /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */ true, - /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new); + /* controlTrackingFromStartAndFinishTimes */ false, /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); Thread.sleep(1000); @@ -78,13 +78,13 @@ public class RegattaReplicationTest extends AbstractServerReplicationTest { /* registrationLinkSecret */ null, /* startDate */ null, /* endDate */ null, regattaId1, series, /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null, /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */ true, - /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new); + /* controlTrackingFromStartAndFinishTimes */ false, /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); Regatta masterRegatta2 = master.createRegatta(RegattaImpl.getDefaultName(baseEventName, boatClass2Name), boatClass2Name, canBoatsOfCompetitorsChangePerRaceRegatta2, CompetitorRegistrationType.CLOSED, /* registrationLinkSecret */ null, /* startDate */ null, /* endDate */ null, regattaId2, series, /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null, /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */ true, - /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new); + /* controlTrackingFromStartAndFinishTimes */ false, /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); Thread.sleep(1000); @@ -99,57 +99,53 @@ public class RegattaReplicationTest extends AbstractServerReplicationTest { @Test public void testUpdateSpecificRegattaReplicationForCourseArea() throws InterruptedException { Regatta replicatedRegatta; - final UUID alphaCourseAreaId = UUID.randomUUID(); final UUID tvCourseAreaId = UUID.randomUUID(); final TimePoint eventStartDate = new MillisecondsTimePoint(new Date()); final TimePoint eventEndDate = new MillisecondsTimePoint(new Date()); - Event event = master.addEvent("Event", /* eventDescription */ null, eventStartDate, eventEndDate, "Venue", true, UUID.randomUUID()); master.addCourseAreas(event.getId(), new String[] {"Alpha"}, new UUID[] {alphaCourseAreaId}); master.addCourseAreas(event.getId(), new String[] {"TV"}, new UUID[] {tvCourseAreaId}); - UUID currentCourseAreaId = null; - Regatta masterRegatta = master.createRegatta(RegattaImpl.getDefaultName("Kiel Week 2012", "49er"), "49er", - /* canBoatsOfCompetitorsChangePerRace */ true, CompetitorRegistrationType.CLOSED, /* registrationLinkSecret */ null, /*startDate*/ null, /*endDate*/ null, - UUID.randomUUID(), Collections.emptyList(), - /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), currentCourseAreaId, - /*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new); - + Regatta masterRegatta = master.createRegatta(RegattaImpl.getDefaultName("Kiel Week 2012", "49er"), "49er", + /* canBoatsOfCompetitorsChangePerRace */ true, CompetitorRegistrationType.CLOSED, + /* registrationLinkSecret */ null, /* startDate */ null, /* endDate */ null, UUID.randomUUID(), + Collections. emptyList(), /* persistent */ true, + DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), currentCourseAreaId, + /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */ true, + /* controlTrackingFromStartAndFinishTimes */ false, + /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); // Test for 'null' master.apply(new UpdateSpecificRegatta(masterRegatta.getRegattaIdentifier(), /*startDate*/ null, /*endDate*/ null, currentCourseAreaId, null, /*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, - /* registrationLinkSecret */ null, CompetitorRegistrationType.CLOSED)); + /* autoRestartTrackingUponCompetitorSetChange */ false, /* registrationLinkSecret */ null, CompetitorRegistrationType.CLOSED)); Thread.sleep(1000); replicatedRegatta = replica.getRegatta(new RegattaName(masterRegatta.getName())); assertNotNull(replicatedRegatta); assertNull(replicatedRegatta.getDefaultCourseArea()); - // Test for 'alpha' currentCourseAreaId = alphaCourseAreaId; master.apply(new UpdateSpecificRegatta(masterRegatta.getRegattaIdentifier(), /*startDate*/ null, /*endDate*/ null, currentCourseAreaId, null, /*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, - /* registrationLinkSecret */ null, CompetitorRegistrationType.CLOSED)); + /* autoRestartTrackingUponCompetitorSetChange */ false, /* registrationLinkSecret */ null, CompetitorRegistrationType.CLOSED)); Thread.sleep(1000); replicatedRegatta = replica.getRegatta(new RegattaName(masterRegatta.getName())); assertNotNull(replicatedRegatta); assertEquals(currentCourseAreaId, replicatedRegatta.getDefaultCourseArea().getId()); - // Test for 'tv' currentCourseAreaId = tvCourseAreaId; master.apply(new UpdateSpecificRegatta(masterRegatta.getRegattaIdentifier(), /*startDate*/ null, /*endDate*/ null, currentCourseAreaId, null, /*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, - /* registrationLinkSecret */ null, CompetitorRegistrationType.CLOSED)); + /* autoRestartTrackingUponCompetitorSetChange */ false, /* registrationLinkSecret */ null, CompetitorRegistrationType.CLOSED)); Thread.sleep(1000); replicatedRegatta = replica.getRegatta(new RegattaName(masterRegatta.getName())); assertNotNull(replicatedRegatta); assertEquals(currentCourseAreaId, replicatedRegatta.getDefaultCourseArea().getId()); - // Test back to 'null' currentCourseAreaId = null; master.apply(new UpdateSpecificRegatta(masterRegatta.getRegattaIdentifier(), /*startDate*/ null, /*endDate*/ null, currentCourseAreaId, null, /*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, - /* registrationLinkSecret */ null, CompetitorRegistrationType.CLOSED)); + /* autoRestartTrackingUponCompetitorSetChange */ false, /* registrationLinkSecret */ null, CompetitorRegistrationType.CLOSED)); Thread.sleep(1000); replicatedRegatta = replica.getRegatta(new RegattaName(masterRegatta.getName())); assertNotNull(replicatedRegatta); @@ -158,14 +154,11 @@ public class RegattaReplicationTest extends AbstractServerReplicationTest { public void testUpdateSpecificRegattaReplicationForProcedureAndCourseDesignerAndConfig() throws InterruptedException { Regatta replicatedRegatta; - final UUID alphaCourseAreaId = UUID.randomUUID(); final TimePoint eventStartDate = new MillisecondsTimePoint(new Date()); final TimePoint eventEndDate = new MillisecondsTimePoint(new Date()); - Event event = master.addEvent("Event", /* eventDescription */ null, eventStartDate, eventEndDate, "Venue", true, UUID.randomUUID()); master.addCourseAreas(event.getId(), new String[] {"Alpha"}, new UUID[] {alphaCourseAreaId}); - UUID currentCourseAreaId = null; Regatta masterRegatta = master.createRegatta(RegattaImpl.getDefaultName("RR", "49er"), "49er", /* canBoatsOfCompetitorsChangePerRace */ true, CompetitorRegistrationType.CLOSED, @@ -173,23 +166,21 @@ public class RegattaReplicationTest extends AbstractServerReplicationTest { Collections. emptyList(), true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), currentCourseAreaId, /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */ true, - /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new); - + /* controlTrackingFromStartAndFinishTimes */ false, /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); // Test for 'null' master.apply(new UpdateSpecificRegatta(masterRegatta.getRegattaIdentifier(), /*startDate*/ null, /*endDate*/ null, currentCourseAreaId, null, /*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, - /* registrationLinkSecret */ null, CompetitorRegistrationType.CLOSED)); + /* autoRestartTrackingUponCompetitorSetChange */ false, /* registrationLinkSecret */ null, CompetitorRegistrationType.CLOSED)); Thread.sleep(1000); replicatedRegatta = replica.getRegatta(new RegattaName(masterRegatta.getName())); assertNotNull(replicatedRegatta); assertNull(replicatedRegatta.getRegattaConfiguration()); - // Test for values RegattaConfigurationImpl config = new RegattaConfigurationImpl(); config.setDefaultCourseDesignerMode(CourseDesignerMode.BY_MARKS); master.apply(new UpdateSpecificRegatta(masterRegatta.getRegattaIdentifier(), /*startDate*/ null, /*endDate*/ null, currentCourseAreaId, config, /*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, - /* registrationLinkSecret */ null, CompetitorRegistrationType.CLOSED)); + /* autoRestartTrackingUponCompetitorSetChange */ false, /* registrationLinkSecret */ null, CompetitorRegistrationType.CLOSED)); Thread.sleep(1000); replicatedRegatta = replica.getRegatta(new RegattaName(masterRegatta.getName())); assertNotNull(replicatedRegatta); @@ -226,7 +217,7 @@ public class RegattaReplicationTest extends AbstractServerReplicationTest { Arrays.asList(new Series[] { qualification, finals, medal }), /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null, /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */ true, - /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new); + /* controlTrackingFromStartAndFinishTimes */ false, /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); Thread.sleep(1000); Regatta replicatedRegatta = replica.getRegatta(new RegattaName(masterRegatta.getName())); assertNotNull(replicatedRegatta); @@ -266,7 +257,7 @@ public class RegattaReplicationTest extends AbstractServerReplicationTest { Arrays.asList(new Series[] { qualification }), /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null, /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */ true, - /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new); + /* controlTrackingFromStartAndFinishTimes */ false, /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); Thread.sleep(1000); Regatta replicatedRegatta = replica.getRegatta(new RegattaName(masterRegatta.getName())); assertNotNull(replicatedRegatta); @@ -314,7 +305,7 @@ public class RegattaReplicationTest extends AbstractServerReplicationTest { Arrays.asList(new Series[] { qualification }), /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null, /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */ true, - /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new); + /* controlTrackingFromStartAndFinishTimes */ false, /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); Thread.sleep(1000); Regatta replicatedRegatta = replica.getRegatta(new RegattaName(masterRegatta.getName())); assertNotNull(replicatedRegatta); @@ -353,7 +344,7 @@ public class RegattaReplicationTest extends AbstractServerReplicationTest { /* registrationLinkSecret */ null, /* startDate */ null, /* endDate */ null, UUID.randomUUID(), series, /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), masterCourseArea.getId(), /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */ true, - /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new); + /* controlTrackingFromStartAndFinishTimes */ false, /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); Thread.sleep(1000); Event replicatedEvent = replica.getEvent(masterEvent.getId()); assertNotNull(replicatedEvent); diff --git a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/TrackRaceBoatCompetitorMetadataReplicationTest.java b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/TrackRaceBoatCompetitorMetadataReplicationTest.java index 1fd352293a9..467ab3cd33b 100644 --- a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/TrackRaceBoatCompetitorMetadataReplicationTest.java +++ b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/TrackRaceBoatCompetitorMetadataReplicationTest.java @@ -104,7 +104,7 @@ public class TrackRaceBoatCompetitorMetadataReplicationTest extends AbstractServ /* start with no series */ Collections.emptySet(), /* persistent */ true, new LowPoint(), /* defaultCourseAreaId */ UUID.randomUUID(), /* buoyZoneRadiusInHullLengths */ 2., /* useStartTimeInference */ false, /* controlTrackingFromStartAndFinishTimes */ false, - /* rankingMetricConstructor */ OneDesignRankingMetric::new); + /* autoRestartTrackingUponCompetitorSetChange */ false, /* rankingMetricConstructor */ OneDesignRankingMetric::new); final RegattaName regattaIdentifier = new RegattaName(regatta.getName()); master.apply(new UpdateSeries(regattaIdentifier, "Default", "Default", /* isMedal */ false, /* isFleetsCanRunInParallel */ false, /* resultDiscardingThresholds */ null, /* startsWithZeroScore */ false, /* firstColumnIsNonDiscardableCarryForward */ false, diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java index ba347ed0090..71f2d233c1b 100644 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java @@ -282,7 +282,7 @@ public class MasterDataImportTest { /* canBoatsOfCompetitorsChangePerRace */ true, CompetitorRegistrationType.CLOSED, /* registrationLinkSecret */ null, /* startDate */null, /* endDate */null, regattaUUID, series, true, new LowPoint(), courseAreaUUID, /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */ true, - /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new); + /* controlTrackingFromStartAndFinishTimes */ false, /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); for (String name : raceColumnNames) { series.get(0).addRaceColumn(name, sourceService); } @@ -569,7 +569,7 @@ public class MasterDataImportTest { /* canBoatsOfCompetitorsChangePerRace */ true, CompetitorRegistrationType.CLOSED, /* registrationLinkSecret */ null, /* startDate */null, /* endDate */null, regattaUUID, series, true, new LowPoint(), courseAreaUUID, /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */ true, - /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new); + /* controlTrackingFromStartAndFinishTimes */ false, /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); for (String name : raceColumnNames) { series.get(0).addRaceColumn(name, sourceService); } @@ -751,7 +751,7 @@ public class MasterDataImportTest { /* canBoatsOfCompetitorsChangePerRace */ true, CompetitorRegistrationType.CLOSED, /* registrationLinkSecret */ null, /* startDate */null, /* endDate */null, regattaUUID, series, true, new LowPoint(), courseAreaUUID, /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */ true, - /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new); + /* controlTrackingFromStartAndFinishTimes */ false, /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); for (String name : raceColumnNames) { series.get(0).addRaceColumn(name, sourceService); } @@ -902,7 +902,7 @@ public class MasterDataImportTest { /* canBoatsOfCompetitorsChangePerRace */ true, CompetitorRegistrationType.CLOSED, /* registrationLinkSecret */ null, /* startDate */null, /* endDate */null, regattaUUID, series, true, new LowPoint(), courseAreaUUID, /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */ true, - /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new); + /* controlTrackingFromStartAndFinishTimes */ false, /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); for (String name : raceColumnNames) { series.get(0).addRaceColumn(name, sourceService); } @@ -1047,7 +1047,7 @@ public class MasterDataImportTest { /* canBoatsOfCompetitorsChangePerRace */ true, CompetitorRegistrationType.CLOSED, /* registrationLinkSecret */ null, /* startDate */null, /* endDate */null, regattaUUID, series, true, new LowPoint(), courseAreaUUID, /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */ true, - /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new); + /* controlTrackingFromStartAndFinishTimes */ false, /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); for (String name : raceColumnNames) { series.get(0).addRaceColumn(name, sourceService); } @@ -1147,7 +1147,7 @@ public class MasterDataImportTest { /* registrationLinkSecret */ null, /* startDate */ null, /* endDate */null, regattaUUID, seriesNotToOverride, true, new LowPoint(), courseAreaUUID, /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, - OneDesignRankingMetric::new); + /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); for (String name : raceColumnNamesNotToOverride) { seriesNotToOverride.get(0).addRaceColumn(name, destService); } @@ -1232,7 +1232,7 @@ public class MasterDataImportTest { /* canBoatsOfCompetitorsChangePerRace */ true, CompetitorRegistrationType.CLOSED, /* registrationLinkSecret */ null, /* startDate */null, /* endDate */null, regattaUUID, series, true, new LowPoint(), courseAreaUUID, /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */ true, - /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new); + /* controlTrackingFromStartAndFinishTimes */ false, /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); for (String name : raceColumnNames) { series.get(0).addRaceColumn(name, sourceService); @@ -1340,7 +1340,7 @@ public class MasterDataImportTest { /* registrationLinkSecret */ null, /* startDate */ null, /* endDate */null, regattaUUID, seriesToOverride, true, new LowPoint(), courseAreaUUID, /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, - OneDesignRankingMetric::new); + /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); for (String name : raceColumnNamesToOverride) { seriesToOverride.get(0).addRaceColumn(name, destService); @@ -1450,7 +1450,7 @@ public class MasterDataImportTest { /* registrationLinkSecret */ null, /* startDate */ null, /* endDate */null, UUID.randomUUID(), new ArrayList(), true, new LowPoint(), defaultCourseArea.getId(), /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */true, - /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new); + /* controlTrackingFromStartAndFinishTimes */ false, /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); // Let's use the setters directly because we are not testing replication RegattaConfigurationImpl configuration = new RegattaConfigurationImpl(); configuration.setDefaultCourseDesignerMode(CourseDesignerMode.BY_MAP); @@ -1531,7 +1531,7 @@ public class MasterDataImportTest { /* registrationLinkSecret */ null, /* startDate */null, /* endDate */null, regattaUUID, series, true, new LowPoint(), defaultCourseArea.getId(), /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */true, /* controlTrackingFromStartAndFinishTimes */ false, - OneDesignRankingMetric::new); + /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); for (String name : raceColumnNames) { series.get(0).addRaceColumn(name, sourceService); } @@ -1660,7 +1660,7 @@ public class MasterDataImportTest { /* canBoatsOfCompetitorsChangePerRace */ true, CompetitorRegistrationType.CLOSED, /* registrationLinkSecret */ null, /* startDate */null, /* endDate */null, regattaUUID, series, true, new LowPoint(), courseAreaUUID, /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */true, - /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new); + /* controlTrackingFromStartAndFinishTimes */ false, /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); for (String name : raceColumnNames) { series.get(0).addRaceColumn(name, sourceService); @@ -1907,7 +1907,7 @@ public class MasterDataImportTest { /* canBoatsOfCompetitorsChangePerRace */ true, CompetitorRegistrationType.CLOSED, /* registrationLinkSecret */ null, /* startDate */null, /* endDate */null, regattaUUID, series, true, new LowPoint(), courseAreaUUID, /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */true, - /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new); + /* controlTrackingFromStartAndFinishTimes */ false, /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); for (String name : raceColumnNames) { series.get(0).addRaceColumn(name, sourceService); @@ -2130,7 +2130,7 @@ public class MasterDataImportTest { /* registrationLinkSecret */ null, /* startDate */ null, /* endDate */null, regattaUUID, seriesOnSource, true, new LowPoint(), courseAreaUUID, /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */true, /* controlTrackingFromStartAndFinishTimes */ false, - OneDesignRankingMetric::new); + /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); for (String name : raceColumnNames) { seriesOnSource.get(0).addRaceColumn(name, sourceService); } @@ -2258,7 +2258,7 @@ public class MasterDataImportTest { /* registrationLinkSecret */ null, /* startDate */null, /* endDate */null, regattaUUID, seriesOnTarget, true, new LowPoint(), courseAreaUUID, /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */true, /* controlTrackingFromStartAndFinishTimes */ false, - OneDesignRankingMetric::new); + /* autoRestartTrackingUponCompetitorSetChange */ false, OneDesignRankingMetric::new); raceColumnOnTarget.setTrackedRace(defaultFleetOnTarget, new DummyTrackedRace(raceId, createCompetitorsAndBoatsMap(boatClass, competitors), regattaOnTarget, null, sourceService.getWindStore())); diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/SearchServiceTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/SearchServiceTest.java index 83d03a59039..8fe1c3b8bfa 100755 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/SearchServiceTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/SearchServiceTest.java @@ -180,7 +180,7 @@ public class SearchServiceTest { new RegattaCreationParametersDTO(seriesCreationParams), /* persistent */ true, new LowPoint(), kielAlpha.getId(), /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, - RankingMetrics.ONE_DESIGN)); + /* autoRestartTrackingUponCompetitorSetChange */ false, RankingMetrics.ONE_DESIGN)); server.apply(new AddColumnToSeries(pfingstbusch29er.getRegattaIdentifier(), "Default", "R1")); server.apply(new AddColumnToSeries(pfingstbusch29er.getRegattaIdentifier(), "Default", "R2")); server.apply(new AddColumnToSeries(pfingstbusch29er.getRegattaIdentifier(), "Default", "R3")); @@ -193,7 +193,7 @@ public class SearchServiceTest { new RegattaCreationParametersDTO(seriesCreationParams), /* persistent */ true, new LowPoint(), kielBravo.getId(), /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, - RankingMetrics.ONE_DESIGN)); + /* autoRestartTrackingUponCompetitorSetChange */ false, RankingMetrics.ONE_DESIGN)); server.apply(new AddColumnToSeries(pfingstbusch470.getRegattaIdentifier(), "Default", "R1")); server.apply(new AddColumnToSeries(pfingstbusch470.getRegattaIdentifier(), "Default", "R2")); server.apply(new AddColumnToSeries(pfingstbusch470.getRegattaIdentifier(), "Default", "R3")); @@ -222,7 +222,7 @@ public class SearchServiceTest { new RegattaCreationParametersDTO(seriesCreationParams), /* persistent */ true, new LowPoint(), flensburgStandard.getId(), /* buoyZoneRadiusInHullLengths */2.0, /* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, - RankingMetrics.ONE_DESIGN)); + /* autoRestartTrackingUponCompetitorSetChange */ false, RankingMetrics.ONE_DESIGN)); server.apply(new AddColumnToSeries(aalRegatta.getRegattaIdentifier(), "Default", "R1")); server.apply(new AddColumnToSeries(aalRegatta.getRegattaIdentifier(), "Default", "R2")); RegattaLeaderboard aalRegattaLeaderboard = server.apply(new CreateRegattaLeaderboard(aalRegatta.getRegattaIdentifier(), diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java index 554b42f50f5..27d2b91e1ad 100644 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java @@ -1696,13 +1696,15 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes CompetitorRegistrationType competitorRegistrationType, String registrationLinkSecret, TimePoint startDate, TimePoint endDate, Serializable id, Iterable series, boolean persistent, ScoringScheme scoringScheme, Serializable defaultCourseAreaId, Double buoyZoneRadiusInHullLengths, boolean useStartTimeInference, boolean controlTrackingFromStartAndFinishTimes, - RankingMetricConstructor rankingMetricConstructor) { + boolean autoRestartTrackingUponCompetitorSetChange, RankingMetricConstructor rankingMetricConstructor) { if (useStartTimeInference && controlTrackingFromStartAndFinishTimes) { throw new IllegalArgumentException("Cannot set both of useStartTimeInference and controlTrackingFromStartAndFinishTimes to true"); } com.sap.sse.common.Util.Pair regattaWithCreatedFlag = getOrCreateRegattaWithoutReplication( - fullRegattaName, boatClassName, canBoatsOfCompetitorsChangePerRace, competitorRegistrationType, registrationLinkSecret, startDate, endDate, id, series, persistent, scoringScheme, - defaultCourseAreaId, buoyZoneRadiusInHullLengths, useStartTimeInference, controlTrackingFromStartAndFinishTimes, rankingMetricConstructor); + fullRegattaName, boatClassName, canBoatsOfCompetitorsChangePerRace, competitorRegistrationType, + registrationLinkSecret, startDate, endDate, id, series, persistent, scoringScheme, defaultCourseAreaId, + buoyZoneRadiusInHullLengths, useStartTimeInference, controlTrackingFromStartAndFinishTimes, + autoRestartTrackingUponCompetitorSetChange, rankingMetricConstructor); Regatta regatta = regattaWithCreatedFlag.getA(); if (regattaWithCreatedFlag.getB()) { onRegattaLikeAdded(regatta); @@ -1738,12 +1740,13 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes TimePoint endDate, Serializable id, Iterable series, boolean persistent, ScoringScheme scoringScheme, Serializable defaultCourseAreaId, Double buoyZoneRadiusInHullLengths, boolean useStartTimeInference, boolean controlTrackingFromStartAndFinishTimes, - RankingMetricConstructor rankingMetricConstructor) { + boolean autoRestartTrackingUponCompetitorSetChange, RankingMetricConstructor rankingMetricConstructor) { CourseArea courseArea = getCourseArea(defaultCourseAreaId); Regatta regatta = new RegattaImpl(getRaceLogStore(), getRegattaLogStore(), fullRegattaName, - getBaseDomainFactory().getOrCreateBoatClass(boatClassName), canBoatsOfCompetitorsChangePerRace, competitorRegistrationType, startDate, endDate, series, persistent, - scoringScheme, id, courseArea, buoyZoneRadiusInHullLengths, useStartTimeInference, - controlTrackingFromStartAndFinishTimes, rankingMetricConstructor, registrationLinkSecret); + getBaseDomainFactory().getOrCreateBoatClass(boatClassName), canBoatsOfCompetitorsChangePerRace, + competitorRegistrationType, startDate, endDate, series, persistent, scoringScheme, id, courseArea, + buoyZoneRadiusInHullLengths, useStartTimeInference, controlTrackingFromStartAndFinishTimes, + autoRestartTrackingUponCompetitorSetChange, rankingMetricConstructor, registrationLinkSecret); boolean wasCreated = addAndConnectRegatta(persistent, defaultCourseAreaId, regatta); if (wasCreated) { logger.info("Created regatta " + regatta.getName() + " (" + hashCode() + ") on " + this); @@ -1963,7 +1966,7 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes getSeriesWithoutRaceColumnsConstructionParametersAsMap(regatta), regatta.isPersistent(), regatta.getScoringScheme(), courseAreaId, regatta.getBuoyZoneRadiusInHullLengths(), regatta.useStartTimeInference(), regatta.isControlTrackingFromStartAndFinishTimes(), - regatta.getRankingMetricType())); + regatta.isAutoRestartTrackingUponCompetitorSetChange(), regatta.getRankingMetricType())); RegattaIdentifier regattaIdentifier = regatta.getRegattaIdentifier(); for (RaceDefinition race : regatta.getAllRaces()) { replicate(new AddRaceDefinition(regattaIdentifier, race)); @@ -2696,7 +2699,7 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes public Regatta updateRegatta(RegattaIdentifier regattaIdentifier, TimePoint startDate, TimePoint endDate, Serializable newDefaultCourseAreaId, RegattaConfiguration newRegattaConfiguration, Iterable series, Double buoyZoneRadiusInHullLengths, boolean useStartTimeInference, boolean controlTrackingFromStartAndFinishTimes, - String registrationLinkSecret, CompetitorRegistrationType registrationType) { + boolean autoRestartTrackingUponCompetitorSetChange, String registrationLinkSecret, CompetitorRegistrationType registrationType) { if (useStartTimeInference && controlTrackingFromStartAndFinishTimes) { throw new IllegalArgumentException("Cannot set both of useStartTimeInference and controlTrackingFromStartAndFinishTimes to true"); } @@ -2710,6 +2713,7 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes regatta.setEndDate(endDate); regatta.setBuoyZoneRadiusInHullLengths(buoyZoneRadiusInHullLengths); regatta.setControlTrackingFromStartAndFinishTimes(controlTrackingFromStartAndFinishTimes); + regatta.setAutoRestartTrackingUponCompetitorSetChange(autoRestartTrackingUponCompetitorSetChange); regatta.setRegistrationLinkSecret(registrationLinkSecret); regatta.setCompetitorRegistrationType(registrationType); if (regatta.useStartTimeInference() != useStartTimeInference) { From 57a216e1b32712115e4ef0a187c183bd5ed4c57e Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 15 Apr 2020 18:12:23 +0200 Subject: [PATCH 117/188] bug5219: fixed NPE during loading of existing regattas with the new field missing --- .../domain/persistence/impl/DomainObjectFactoryImpl.java | 3 +-- 1 file changed, 1 insertion(+), 2 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 d49ab6f2d19..33938635f67 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 @@ -1302,7 +1302,6 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { canBoatsOfCompetitorsChangePerRace = false; createMigratableRegatta = true; } - CompetitorRegistrationType competitorRegistrationType = CompetitorRegistrationType .valueOfOrDefault((String) dbRegatta.get(FieldNames.REGATTA_COMPETITOR_REGISTRATION_TYPE.name())); final RankingMetricConstructor rankingMetricConstructor = loadRankingMetricConstructor(dbRegatta); @@ -1324,7 +1323,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { : buoyZoneRadiusInHullLengths, useStartTimeInference == null ? true : useStartTimeInference, controlTrackingFromStartAndFinishTimes == null ? false : controlTrackingFromStartAndFinishTimes, - autoRestartTrackingUponCompetitorSetChange, rankingMetricConstructor, registrationLinkSecret); + autoRestartTrackingUponCompetitorSetChange == null ? false : autoRestartTrackingUponCompetitorSetChange, rankingMetricConstructor, registrationLinkSecret); } result.setRegattaConfiguration(configuration); } From ec4ee08b3024456bddb7ed8bb1fdcbe71ab970a5 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 15 Apr 2020 18:18:14 +0200 Subject: [PATCH 118/188] bug5219: added new flag to regatta detail panel --- .../gwt/ui/adminconsole/RegattaDetailsComposite.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaDetailsComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaDetailsComposite.java index 767bda207d4..f91f2fb56ac 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaDetailsComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaDetailsComposite.java @@ -72,6 +72,7 @@ public class RegattaDetailsComposite extends Composite { private final Label defaultCourseArea; private final Label useStartTimeInference; private final Label controlTrackingFromStartAndFinishTimes; + private final Label autoRestartTrackingUponCompetitorSetChange; private final Label canBoatsOfCompetitorsChangePerRace; private final Label competitorRegistrationType; private final Label configuration; @@ -95,11 +96,9 @@ public class RegattaDetailsComposite extends Composite { mainPanel = new CaptionPanel(stringMessages.regatta()); VerticalPanel vPanel = new VerticalPanel(); mainPanel.add(vPanel); - - int rows = 15; + int rows = 16; Grid grid = new Grid(rows, 2); vPanel.add(grid); - int currentRow = 0; regattaId = createLabelAndValueWidget(grid, currentRow++, stringMessages.id(), "RegattaIdLabel"); regattaName = createLabelAndValueWidget(grid, currentRow++, stringMessages.regattaName(), "NameLabel"); @@ -108,7 +107,8 @@ public class RegattaDetailsComposite extends Composite { boatClassName = createLabelAndValueWidget(grid, currentRow++, stringMessages.boatClass(), "BoatClassLabel"); defaultCourseArea = createLabelAndValueWidget(grid, currentRow++, stringMessages.courseArea(), "CourseAreaLabel"); useStartTimeInference = createLabelAndValueWidget(grid, currentRow++, stringMessages.useStartTimeInference(), "UseStartTimeInferenceLabel"); - controlTrackingFromStartAndFinishTimes = createLabelAndValueWidget(grid, currentRow++, stringMessages.controlTrackingFromStartAndFinishTimes(), "UseStartTimeInferenceLabel"); + controlTrackingFromStartAndFinishTimes = createLabelAndValueWidget(grid, currentRow++, stringMessages.controlTrackingFromStartAndFinishTimes(), "ControlTrackingFromStartAndFinishTimesLabel"); + autoRestartTrackingUponCompetitorSetChange = createLabelAndValueWidget(grid, currentRow++, stringMessages.autoRestartTrackingUponCompetitorSetChange(), "AutoRestartTrackingUponCompetitorSetChange"); canBoatsOfCompetitorsChangePerRace = createLabelAndValueWidget(grid, currentRow++, stringMessages.canBoatsOfCompetitorsChangePerRace(), "CanBoatsOfCompetitorsChangePerRaceLabel"); competitorRegistrationType = createLabelAndValueWidget(grid, currentRow++, stringMessages.competitorRegistrationType(), "CompetitorRegistrationTypeLabel"); buoyZoneRadiusInHullLengths = createLabelAndValueWidget(grid, currentRow++, stringMessages.buoyZoneRadiusInHullLengths(), "BuoyZoneRadiusInHullLengthsLabel"); @@ -448,6 +448,7 @@ public class RegattaDetailsComposite extends Composite { defaultCourseArea.setText(regatta.defaultCourseAreaUuid == null ? "" : regatta.defaultCourseAreaName); useStartTimeInference.setText(regatta.useStartTimeInference ? stringMessages.yes() : stringMessages.no()); controlTrackingFromStartAndFinishTimes.setText(regatta.controlTrackingFromStartAndFinishTimes ? stringMessages.yes() : stringMessages.no()); + autoRestartTrackingUponCompetitorSetChange.setText(regatta.autoRestartTrackingUponCompetitorSetChange ? stringMessages.yes() : stringMessages.no()); canBoatsOfCompetitorsChangePerRace.setText(regatta.canBoatsOfCompetitorsChangePerRace ? stringMessages.yes() : stringMessages.no()); competitorRegistrationType.setText(regatta.competitorRegistrationType.getLabel(stringMessages)); From a6c0335c2d41576e600adc5e521f278ebff5f2ae Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 15 Apr 2020 18:25:28 +0200 Subject: [PATCH 119/188] removed redundant empty lines --- .../AbstractRegattaWithSeriesAndFleetsDialog.java | 4 ---- .../adminconsole/RegattaWithSeriesAndFleetsEditDialog.java | 5 ----- 2 files changed, 9 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractRegattaWithSeriesAndFleetsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractRegattaWithSeriesAndFleetsDialog.java index 3ecb79559e9..1130e5c5de0 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractRegattaWithSeriesAndFleetsDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractRegattaWithSeriesAndFleetsDialog.java @@ -50,11 +50,9 @@ import com.sap.sse.gwt.client.dialog.DoubleBox; * @param */ public abstract class AbstractRegattaWithSeriesAndFleetsDialog extends DataEntryDialogWithDateTimeBox { - protected final SailingServiceAsync sailingService; protected StringMessages stringMessages; private final RegattaDTO regatta; - protected final DateAndTimeInput startDateBox; protected final DateAndTimeInput endDateBox; protected final ListBox scoringSchemeListBox; @@ -67,11 +65,9 @@ public abstract class AbstractRegattaWithSeriesAndFleetsDialog extends DataEn protected final ListEditorComposite seriesEditor; private final ListBox rankingMetricListBox; protected final ListBox competitorRegistrationTypeListBox; - protected final List existingEvents; private EventDTO defaultEvent; private RegistrationLinkWithQRCode registrationLinkWithQRCode; - protected final CaptionPanel secretPanel; public AbstractRegattaWithSeriesAndFleetsDialog(final SailingServiceAsync sailingService, RegattaDTO regatta, diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaWithSeriesAndFleetsEditDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaWithSeriesAndFleetsEditDialog.java index f049bf6bba1..a51f98d5cf7 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaWithSeriesAndFleetsEditDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaWithSeriesAndFleetsEditDialog.java @@ -39,14 +39,12 @@ public class RegattaWithSeriesAndFleetsEditDialog extends RegattaWithSeriesAndFl stringMessages.ok(), sailingService, stringMessages, new RegattaParameterValidator(stringMessages), callback); ensureDebugId("RegattaWithSeriesAndFleetsEditDialog"); currentRegattaConfiguration = regatta.configuration; - nameEntryField.setEnabled(false); boatClassEntryField.setEnabled(false); canBoatsOfCompetitorsChangePerRaceCheckBox.setEnabled(false); scoringSchemeListBox.setEnabled(false); sailingEventsListBox.setEnabled(true); courseAreaListBox.setEnabled(true); - regattaConfigurationCheckbox = createCheckbox(stringMessages.setRacingProcedureConfiguration()); regattaConfigurationCheckbox.ensureDebugId("RacingProcedureConfigurationCheckBox"); regattaConfigurationCheckbox.addValueChangeHandler(new ValueChangeHandler() { @@ -92,14 +90,11 @@ public class RegattaWithSeriesAndFleetsEditDialog extends RegattaWithSeriesAndFl protected void setupAdditionalWidgetsOnPanel(VerticalPanel panel, Grid formGrid) { super.setupAdditionalWidgetsOnPanel(panel, formGrid); VerticalPanel content = new VerticalPanel(); - Grid proceduresGrid = new Grid(1, 2); proceduresGrid.setWidget(0, 0, regattaConfigurationCheckbox); proceduresGrid.setWidget(0, 1, regattaConfigurationButton); - content.add(proceduresGrid); panel.add(content); - TabPanel tabPanel = new TabPanel(); tabPanel.setWidth("100%"); tabPanel.add(getSeriesEditor(), stringMessages.series()); From ed15e12dc2c2fb665a2c1b0e2b6df67f55ce446e Mon Sep 17 00:00:00 2001 From: Alexandr Timoshenko Date: Wed, 15 Apr 2020 18:52:16 +0200 Subject: [PATCH 120/188] code review fixes --- .../abstractlog/impl/AbstractLogImpl.java | 27 ++++++++++--------- .../race/analyzing/impl/RaceLogAnalyzer.java | 11 ++++++-- .../abstractlog/race/impl/RaceLogImpl.java | 17 +++++++----- 3 files changed, 33 insertions(+), 22 deletions(-) diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogImpl.java index 6dbbeafb110..25c18622715 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogImpl.java @@ -3,7 +3,7 @@ package com.sap.sailing.domain.abstractlog.impl; import java.io.IOException; import java.io.ObjectInputStream; import java.io.Serializable; -import java.util.Arrays; +import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; @@ -41,9 +41,10 @@ import com.sap.sse.util.impl.ArrayListNavigableSet; * {@link RaceLogEventComparator} for sorting when interface methods like * {@link Track#getFirstFixAfter(com.sap.sailing.domain.common.TimePoint)} are used. *

    + * */ public abstract class AbstractLogImpl, VisitorT> - extends TrackImpl implements AbstractLog { +extends TrackImpl implements AbstractLog { private static final long serialVersionUID = -176745401321893502L; private static final String DefaultLockName = AbstractLogImpl.class.getName() + ".lock"; private final static Logger logger = Logger.getLogger(AbstractLogImpl.class.getName()); @@ -69,7 +70,8 @@ public abstract class AbstractLogImpl, /** * Initializes a new {@link RaceLogImpl}. * - * @param nameForReadWriteLock name of lock. + * @param nameForReadWriteLock + * name of lock. */ public AbstractLogImpl(String nameForReadWriteLock, Serializable identifier, Comparator comparator) { super(new ArrayListNavigableSet(comparator), nameForReadWriteLock); @@ -147,9 +149,9 @@ public abstract class AbstractLogImpl, // it can happen that the event that has been revoked is not yet loaded - as we assume // that race log events never get removed we can safely continue and assume that // the event will be loaded later - logger.warning("RevokeEvent for " + revokeEvent.getShortInfo() + " added, that refers to non-existent event to be revoked. Could also happen that the revoke event is before the event to be revoked."); + logger.warning("RevokeEvent for "+revokeEvent.getShortInfo()+" added, that refers to non-existent event to be revoked. Could also happen that the revoke event is before the event to be revoked."); } else { - if (!(revokedEvent instanceof Revokable)) { + if (! (revokedEvent instanceof Revokable)) { throw new NotRevokableException("RevokeEvent trying to revoke non-revokable event"); } @@ -253,7 +255,7 @@ public abstract class AbstractLogImpl, try { for (EventT event : getRawFixes()) { if (event instanceof RevokeEvent) { - revokedEventIds.add(((RevokeEvent) event).getRevokedEventId()); + revokedEventIds.add(((RevokeEvent)event).getRevokedEventId()); } } } finally { @@ -314,12 +316,16 @@ public abstract class AbstractLogImpl, @Override public NavigableSet getUnrevokedEvents() { - return new FilteredPartialNavigableSetView(super.getInternalFixes(), new RevokedValidator(revokedEventIds)); + final List> validators = new ArrayList<>(); + validators.add(new RevokedValidator<>(revokedEventIds)); + return new FilteredPartialNavigableSetView<>(super.getInternalFixes(), validators); } @Override public NavigableSet getUnrevokedEventsDescending() { - return new FilteredPartialNavigableSetView(super.getInternalFixes().descendingSet(), new RevokedValidator(revokedEventIds)); + final List> validators = new ArrayList<>(); + validators.add(new RevokedValidator<>(revokedEventIds)); + return new FilteredPartialNavigableSetView(super.getInternalFixes().descendingSet(), validators); } @Override @@ -408,11 +414,6 @@ public abstract class AbstractLogImpl, this.validators = validators; } - public FilteredPartialNavigableSetView(NavigableSet set, final NavigableSetViewValidator... validators) { - super(set); - this.validators = Arrays.asList(validators); - } - @Override protected boolean isValid(T t) { for (NavigableSetViewValidator validator : validators) { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceLogAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceLogAnalyzer.java index 5d8ca4bd8c1..9955db9db88 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceLogAnalyzer.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceLogAnalyzer.java @@ -6,6 +6,9 @@ import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import java.util.ArrayList; +import java.util.List; + public abstract class RaceLogAnalyzer extends BaseLogAnalyzer { @@ -22,10 +25,14 @@ public abstract class RaceLogAnalyzer extends BaseLogAnalyzer } protected Iterable getPassUnrevokedEvents() { - return new AbstractLogImpl.FilteredPartialNavigableSetView<>(log.getUnrevokedEvents(), new RaceLog.PassValidator(log.getCurrentPassId())); + final List> validators = new ArrayList<>(); + validators.add(new RaceLog.PassValidator(log.getCurrentPassId())); + return new AbstractLogImpl.FilteredPartialNavigableSetView<>(log.getUnrevokedEvents(), validators); } protected Iterable getPassUnrevokedEventsDescending() { - return new AbstractLogImpl.FilteredPartialNavigableSetView<>(log.getUnrevokedEventsDescending(), new RaceLog.PassValidator(log.getCurrentPassId())); + final List> validators = new ArrayList<>(); + validators.add(new RaceLog.PassValidator(log.getCurrentPassId())); + return new AbstractLogImpl.FilteredPartialNavigableSetView<>(log.getUnrevokedEventsDescending(), validators); } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogImpl.java index cc9812a9a16..534fa32a198 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogImpl.java @@ -1,6 +1,8 @@ package com.sap.sailing.domain.abstractlog.race.impl; import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; import java.util.NavigableSet; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; @@ -9,22 +11,21 @@ import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; import com.sap.sailing.domain.tracking.Track; -import com.sap.sailing.domain.tracking.impl.PartialNavigableSetView; import com.sap.sailing.domain.tracking.impl.TrackImpl; /** * {@link Track} implementation for {@link RaceLogEvent}s. - * + * *

    * "Fix" validity is decided based on the {@link #getCurrentPassId() current pass}. The validity is not cached. *

    - * + * *

    * {@link TrackImpl#getDummyFix(com.sap.sailing.domain.common.TimePoint)} is not overridden, see * {@link RaceLogEventComparator} for sorting when interface methods like * {@link Track#getFirstFixAfter(com.sap.sailing.domain.common.TimePoint)} are used. *

    - * + * */ public class RaceLogImpl extends AbstractLogImpl implements RaceLog { private static final long serialVersionUID = 98032278604708475L; @@ -46,12 +47,12 @@ public class RaceLogImpl extends AbstractLogImpl getInternalFixes() { - return new FilteredPartialNavigableSetView<>(super.getInternalFixes(),new PassValidator(getCurrentPassId())); + final List> validators = new ArrayList<>(); + validators.add(new PassValidator(getCurrentPassId())); + return new FilteredPartialNavigableSetView<>(super.getInternalFixes(), validators); } From aae4217e8285e593fa9ac8450d95c1f9c54cf0b9 Mon Sep 17 00:00:00 2001 From: dmitry Date: Thu, 16 Apr 2020 14:00:26 +0300 Subject: [PATCH 121/188] bug5178: Added universal remove button funcionality to Connector panels --- .../SwissTimingEventManagementPanel.java | 46 +++++------ .../SwissTimingReplayConnectorPanel.java | 80 ++++++++++--------- .../TracTracEventManagementPanel.java | 78 +++++++++--------- .../coursecreation/CourseTemplatePanel.java | 3 +- .../coursecreation/MarkPropertiesPanel.java | 3 +- ...sTimingArchivedConnectionTableWrapper.java | 29 ++++--- .../SwissTimingConnectionTableWrapper.java | 9 ++- .../TracTracConnectionTableWrapper.java | 9 ++- .../sailing/gwt/ui/client/SailingService.java | 12 +-- .../gwt/ui/client/SailingServiceAsync.java | 8 +- .../gwt/ui/server/SailingServiceImpl.java | 50 ++++++------ 11 files changed, 163 insertions(+), 164 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java index 1cf2a4f4286..8eecdee8d97 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java @@ -118,34 +118,31 @@ public class SwissTimingEventManagementPanel extends AbstractEventManagementPane } }, userService, errorReporter).show()); - // Remove SwissTiming Connection - final Button removeButton = buttonPanel.addRemoveAction(stringMessages.remove(), - connectionsTable.getSelectionModel(), false, () -> { - sailingService.deleteSwissTimingConfiguration( - connectionsTable.getSelectionModel().getSelectedObject(), new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError( - "Exception trying to delete configuration in DB: " + caught.getMessage()); - } + // Remove SwissTiming Connection + buttonPanel.addRemoveAction(stringMessages.remove(), connectionsTable.getSelectionModel(), false, + () -> { + sailingService.deleteSwissTimingConfigurations( + connectionsTable.getSelectionModel().getSelectedSet(), new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError("Exception trying to delete configuration in DB: " + + caught.getMessage()); + } - @Override - public void onSuccess(Void result) { - connectionsTable.refreshSwissTimingConnectionList(); - } - }); - }); + @Override + public void onSuccess(Void result) { + connectionsTable.refreshSwissTimingConnectionList(); + } + }); + }); // List Races in SwissTiming Connection final Button listRacesButton = buttonPanel.addUnsecuredAction(stringMessages.listRaces(), () -> { fillRaces(sailingService); }); listRacesButton.setEnabled(false); - removeButton.setEnabled(false); connectionsTable.getSelectionModel().addSelectionChangeHandler(e -> { - final boolean objectSelected = connectionsTable.getSelectionModel().getSelectedObject() != null; - listRacesButton.setEnabled(objectSelected); - removeButton.setEnabled(objectSelected); + listRacesButton.setEnabled(connectionsTable.getSelectionModel().getSelectedSet().size() == 1); }); HorizontalPanel racesSplitPanel = new HorizontalPanel(); mainPanel.add(racesSplitPanel); @@ -310,7 +307,7 @@ public class SwissTimingEventManagementPanel extends AbstractEventManagementPane filterPanel.add(filterablePanelEvents); HorizontalPanel racesButtonPanel = new HorizontalPanel(); trackableRacesPanel.add(racesButtonPanel); - Button btnTrack = new Button(stringConstants.startTracking()); + final Button btnTrack = new Button(stringConstants.startTracking()); racesButtonPanel.add(btnTrack); racesButtonPanel.setSpacing(10); btnTrack.addClickHandler(new ClickHandler() { @@ -320,6 +317,9 @@ public class SwissTimingEventManagementPanel extends AbstractEventManagementPane useInternalMarkPassingAlgorithmCheckbox.getValue()); } }); + btnTrack.setEnabled(false); + connectionsTable.getSelectionModel().addSelectionChangeHandler( + e -> btnTrack.setEnabled(connectionsTable.getSelectionModel().getSelectedSet().size() == 1)); } @@ -387,7 +387,7 @@ public class SwissTimingEventManagementPanel extends AbstractEventManagementPane private void fillRaces(final SailingServiceAsync sailingService) { final SwissTimingConfigurationWithSecurityDTO selectedObject = connectionsTable.getSelectionModel() - .getSelectedObject(); + .getSelectedSet().iterator().next();; sailingService.getRacesOfSwissTimingEvent(selectedObject.getJsonUrl(), new AsyncCallback() { @Override @@ -428,7 +428,7 @@ public class SwissTimingEventManagementPanel extends AbstractEventManagementPane private void trackSelectedRaces(boolean trackWind, boolean correctWindByDeclination, boolean useInternalMarkPassingAlgorithm) { final SwissTimingConfigurationWithSecurityDTO selectedObject = connectionsTable.getSelectionModel() - .getSelectedObject(); + .getSelectedSet().iterator().next(); final String hostname = selectedObject.getHostname(); final Integer port = selectedObject.getPort(); final String updateURL = selectedObject.getUpdateURL(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingReplayConnectorPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingReplayConnectorPanel.java index ef19e687f3a..fe68e07e0f9 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingReplayConnectorPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingReplayConnectorPanel.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.List; +import java.util.Set; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; @@ -244,7 +245,9 @@ public class SwissTimingReplayConnectorPanel extends AbstractEventManagementPane useInternalMarkPassingAlgorithmCheckbox.getValue()); } }); - + btnTrack.setEnabled(false); + connectionsTable.getSelectionModel().addSelectionChangeHandler( + e -> btnTrack.setEnabled(connectionsTable.getSelectionModel().getSelectedSet().size() == 1)); } private AccessControlledButtonPanel createButtonPanel(final SailingServiceAsync sailingService, @@ -280,34 +283,34 @@ public class SwissTimingReplayConnectorPanel extends AbstractEventManagementPane public void cancel() { } }, userService, errorReporter).show()); - // Remove action - final Button removeButton = buttonPanel.addRemoveAction(stringMessages.remove(), - connectionsTable.getSelectionModel(), false, () -> { - sailingService.deleteSwissTimingArchiveConfiguration( - connectionsTable.getSelectionModel().getSelectedObject(), new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError( - "Exception trying to delete configuration in DB: " + caught.getMessage()); - } + // Remove action + buttonPanel.addRemoveAction(stringMessages.remove(), connectionsTable.getSelectionModel(), + false, () -> { + sailingService.deleteSwissTimingArchiveConfigurations( + connectionsTable.getSelectionModel().getSelectedSet(), + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError( + "Exception trying to delete configuration(s) in DB: " + + caught.getMessage()); + } - @Override - public void onSuccess(Void result) { - connectionsTable.refreshConnectionList(); - } - }); - }); + @Override + public void onSuccess(Void result) { + connectionsTable.refreshConnectionList(); + } + }); + }); // List Race action final Button listRacesButton = buttonPanel.addUnsecuredAction(stringMessages.listRaces(), () -> { fillRaces(sailingService); }); listRacesButton.setEnabled(false); - removeButton.setEnabled(false); // add change handlers to enable and disable List Races and Remove connectionsTable.getSelectionModel().addSelectionChangeHandler(e -> { - final boolean objectSelected = connectionsTable.getSelectionModel().getSelectedObject() != null; + final boolean objectSelected = connectionsTable.getSelectionModel().getSelectedSet().size() == 1; listRacesButton.setEnabled(objectSelected); - removeButton.setEnabled(objectSelected); }); return buttonPanel; } @@ -343,27 +346,28 @@ public class SwissTimingReplayConnectorPanel extends AbstractEventManagementPane } private void fillRaces(final SailingServiceAsync sailingService) { - final SwissTimingArchiveConfigurationWithSecurityDTO selectedObject = connectionsTable.getSelectionModel() - .getSelectedObject(); - if (selectedObject != null) { + final Set selectedObjects = connectionsTable.getSelectionModel() + .getSelectedSet(); + if (selectedObjects.size() == 1) { + SwissTimingArchiveConfigurationWithSecurityDTO selectedObject = selectedObjects.iterator().next(); sailingService.listSwissTiminigReplayRaces(selectedObject.getJsonUrl(), new AsyncCallback>() { - @Override - public void onFailure(Throwable caught) { - SwissTimingReplayConnectorPanel.this.errorReporter.reportError("Error trying to list SwissTiming races: " - + caught.getMessage()); - } + @Override + public void onFailure(Throwable caught) { + SwissTimingReplayConnectorPanel.this.errorReporter + .reportError("Error trying to list SwissTiming races: " + caught.getMessage()); + } - @Override - public void onSuccess(final List races) { - availableSwissTimingRaces.clear(); - availableSwissTimingRaces.addAll(races); - raceList.getList().clear(); - raceList.getList().addAll(availableSwissTimingRaces); - filterablePanelEvents.getTextBox().setText(null); - filterablePanelEvents.updateAll(races); - } - }); + @Override + public void onSuccess(final List races) { + availableSwissTimingRaces.clear(); + availableSwissTimingRaces.addAll(races); + raceList.getList().clear(); + raceList.getList().addAll(availableSwissTimingRaces); + filterablePanelEvents.getTextBox().setText(null); + filterablePanelEvents.updateAll(races); + } + }); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TracTracEventManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TracTracEventManagementPanel.java index a27424f2448..02cb41e7d2c 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TracTracEventManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TracTracEventManagementPanel.java @@ -151,13 +151,13 @@ public class TracTracEventManagementPanel extends AbstractEventManagementPanel { } }, userService, errorReporter).show()); addCreateAction.ensureDebugId("AddConnectionButton"); - final Button removeButton = buttonPanel.addRemoveAction(stringMessages.remove(), () -> { - sailingService.deleteTracTracConfiguration(connectionsTable.getSelectionModel().getSelectedObject(), + buttonPanel.addRemoveAction(stringMessages.remove(), connectionsTable.getSelectionModel(), false, () -> { + sailingService.deleteTracTracConfigurations(connectionsTable.getSelectionModel().getSelectedSet(), new AsyncCallback() { @Override public void onFailure(Throwable caught) { errorReporter.reportError( - "Exception trying to delete configuration in DB: " + caught.getMessage()); + "Exception trying to delete configuration(s) in DB: " + caught.getMessage()); } @Override @@ -173,7 +173,6 @@ public class TracTracEventManagementPanel extends AbstractEventManagementPanel { }); listRacesButton.ensureDebugId("ListRacesButton"); listRacesButton.setEnabled(false); - removeButton.setEnabled(false); buttonPanel.addUnsecuredWidget(loadingMessageLabel); connectionsTable.getSelectionModel().addSelectionChangeHandler(e -> { final boolean objectSelected = connectionsTable.getSelectionModel().getSelectedObject() != null; @@ -456,47 +455,48 @@ public class TracTracEventManagementPanel extends AbstractEventManagementPanel { sailingService.listTracTracRacesInEvent(selectedConnection.getJsonUrl(), listHiddenRaces, new MarkedAsyncCallback>>( - new AsyncCallback>>() { - @Override - public void onFailure(Throwable caught) { - loadingMessageLabel.setText(""); - reportError("Error trying to list races: " + caught.getMessage()); - } - - @Override - public void onSuccess(final com.sap.sse.common.Util.Pair> result) { - loadingMessageLabel.setText("Building resultset and saving configuration..."); - TracTracEventManagementPanel.this.availableTracTracRaces.clear(); - final TracTracConfigurationWithSecurityDTO updatedConnection = new TracTracConfigurationWithSecurityDTO( - selectedConnection, - result.getA()); - final List eventRaces = result.getB(); - if (eventRaces != null) { - TracTracEventManagementPanel.this.availableTracTracRaces.addAll(eventRaces); - racesFilterablePanel.updateAll(availableTracTracRaces); - } - List races = TracTracEventManagementPanel.this.raceList.getList(); - races.clear(); - races.addAll(TracTracEventManagementPanel.this.availableTracTracRaces); - TracTracEventManagementPanel.this.racesFilterablePanel.getTextBox().setText(""); - TracTracEventManagementPanel.this.racesTable.setPageSize(races.size()); - loadingMessageLabel.setText(""); - // store a successful configuration in the database for later retrieval - sailingService.updateTracTracConfiguration(updatedConnection, - new MarkedAsyncCallback( - new AsyncCallback() { + new AsyncCallback>>() { @Override public void onFailure(Throwable caught) { - reportError("Exception trying to store configuration in DB: " + caught.getMessage()); + loadingMessageLabel.setText(""); + reportError("Error trying to list races: " + caught.getMessage()); } - + @Override - public void onSuccess(Void voidResult) { - connectionsTable.refreshTracTracConnectionList(); + public void onSuccess( + final com.sap.sse.common.Util.Pair> result) { + loadingMessageLabel.setText("Building resultset and saving configuration..."); + TracTracEventManagementPanel.this.availableTracTracRaces.clear(); + final TracTracConfigurationWithSecurityDTO updatedConnection = new TracTracConfigurationWithSecurityDTO( + selectedConnection, result.getA()); + final List eventRaces = result.getB(); + if (eventRaces != null) { + TracTracEventManagementPanel.this.availableTracTracRaces.addAll(eventRaces); + racesFilterablePanel.updateAll(availableTracTracRaces); + } + List races = TracTracEventManagementPanel.this.raceList + .getList(); + races.clear(); + races.addAll(TracTracEventManagementPanel.this.availableTracTracRaces); + TracTracEventManagementPanel.this.racesFilterablePanel.getTextBox().setText(""); + TracTracEventManagementPanel.this.racesTable.setPageSize(races.size()); + loadingMessageLabel.setText(""); + // store a successful configuration in the database for later retrieval + sailingService.updateTracTracConfiguration(updatedConnection, + new MarkedAsyncCallback(new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + reportError("Exception trying to store configuration in DB: " + + caught.getMessage()); + } + + @Override + public void onSuccess(Void voidResult) { + connectionsTable.refreshTracTracConnectionList(); + } + })); } })); - } - })); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java index 31b9f6764d8..de5fdf98ffe 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java @@ -10,6 +10,7 @@ import static com.sap.sse.security.ui.client.component.DefaultActionsImagesBarCe import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.UUID; @@ -320,7 +321,7 @@ public class CourseTemplatePanel extends FlowPanel { stringMessages); actionsColumn.addAction(ACTION_DELETE, DELETE, e -> { if (Window.confirm(stringMessages.doYouReallyWantToRemoveCourseTemplate(e.getName()))) { - sailingService.removeCourseTemplate(e.getUuid(), new AsyncCallback() { + sailingService.removeCourseTemplates(Collections.singletonList(e.getUuid()), new AsyncCallback() { @Override public void onFailure(Throwable caught) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java index cb6e919de72..c385f6c17b4 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java @@ -11,6 +11,7 @@ import static com.sap.sse.security.ui.client.component.DefaultActionsImagesBarCe import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.UUID; @@ -340,7 +341,7 @@ public class MarkPropertiesPanel extends FlowPanel { stringMessages); actionsColumn.addAction(ACTION_DELETE, DELETE, e -> { if (Window.confirm(stringMessages.doYouReallyWantToRemoveMarkProperties(e.getName()))) { - sailingService.removeMarkProperties(e.getUuid(), new AsyncCallback() { + sailingService.removeMarkProperties(Collections.singletonList(e.getUuid()), new AsyncCallback() { @Override public void onFailure(Throwable caught) { errorReporter.reportError(stringMessages.couldNotRemoveMarkProperties(caught.getMessage())); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/swisstiming/SwissTimingArchivedConnectionTableWrapper.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/swisstiming/SwissTimingArchivedConnectionTableWrapper.java index 5230ac8ee61..5f5e58ebffb 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/swisstiming/SwissTimingArchivedConnectionTableWrapper.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/swisstiming/SwissTimingArchivedConnectionTableWrapper.java @@ -3,6 +3,7 @@ package com.sap.sailing.gwt.ui.adminconsole.swisstiming; import static com.sap.sse.security.ui.client.component.AccessControlledActionsColumn.create; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import com.google.gwt.user.cellview.client.AbstractCellTable; @@ -18,7 +19,7 @@ import com.sap.sse.gwt.client.async.MarkedAsyncCallback; import com.sap.sse.gwt.client.celltable.AbstractSortableTextColumn; import com.sap.sse.gwt.client.celltable.CellTableWithCheckboxResources; import com.sap.sse.gwt.client.celltable.EntityIdentityComparator; -import com.sap.sse.gwt.client.celltable.RefreshableSingleSelectionModel; +import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel; import com.sap.sse.gwt.client.celltable.TableWrapper; import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback; import com.sap.sse.gwt.client.panels.LabeledAbstractFilterablePanel; @@ -38,7 +39,7 @@ import com.sap.sse.security.ui.client.i18n.StringMessages; * or edit the associated ACL. */ public class SwissTimingArchivedConnectionTableWrapper extends - TableWrapper, StringMessages, CellTableWithCheckboxResources> { + TableWrapper, StringMessages, CellTableWithCheckboxResources> { private final LabeledAbstractFilterablePanel filterField; private final SailingServiceAsync sailingServiceAsync; private final com.sap.sailing.gwt.ui.client.StringMessages stringMessagesClient; @@ -46,7 +47,7 @@ public class SwissTimingArchivedConnectionTableWrapper extends public SwissTimingArchivedConnectionTableWrapper(final UserService userService, final SailingServiceAsync sailingServiceAsync, final com.sap.sailing.gwt.ui.client.StringMessages stringMessages, final ErrorReporter errorReporter, final boolean enablePager, final CellTableWithCheckboxResources tableResources, final Runnable refresher) { - super(stringMessages, errorReporter, false, enablePager, + super(stringMessages, errorReporter, true, enablePager, new EntityIdentityComparator() { @Override public boolean representSameEntity(SwissTimingArchiveConfigurationWithSecurityDTO dto1, @@ -98,17 +99,19 @@ public class SwissTimingArchivedConnectionTableWrapper extends }, userService, errorReporter).show(); }); actionColumn.addAction(DefaultActionsImagesBarCell.ACTION_DELETE, DefaultActions.DELETE, dto -> { - sailingServiceAsync.deleteSwissTimingArchiveConfiguration(dto, new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError("Exception trying to delete configuration in DB: " + caught.getMessage()); - } + sailingServiceAsync.deleteSwissTimingArchiveConfigurations(Collections.singletonList(dto), + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError( + "Exception trying to delete configuration(s) in DB: " + caught.getMessage()); + } - @Override - public void onSuccess(Void result) { - refreshConnectionList(); - } - }); + @Override + public void onSuccess(Void result) { + refreshConnectionList(); + } + }); }); final EditOwnershipDialog.DialogConfig configOwnership = EditOwnershipDialog .create(userService.getUserManagementService(), type, dto -> refreshConnectionList(), diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/swisstiming/SwissTimingConnectionTableWrapper.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/swisstiming/SwissTimingConnectionTableWrapper.java index 5d8f9fe8f23..5ef411d89ad 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/swisstiming/SwissTimingConnectionTableWrapper.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/swisstiming/SwissTimingConnectionTableWrapper.java @@ -3,6 +3,7 @@ package com.sap.sailing.gwt.ui.adminconsole.swisstiming; import static com.sap.sse.security.ui.client.component.AccessControlledActionsColumn.create; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import com.google.gwt.user.cellview.client.AbstractCellTable; @@ -18,7 +19,7 @@ import com.sap.sse.gwt.client.async.MarkedAsyncCallback; import com.sap.sse.gwt.client.celltable.AbstractSortableTextColumn; import com.sap.sse.gwt.client.celltable.CellTableWithCheckboxResources; import com.sap.sse.gwt.client.celltable.EntityIdentityComparator; -import com.sap.sse.gwt.client.celltable.RefreshableSingleSelectionModel; +import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel; import com.sap.sse.gwt.client.celltable.TableWrapper; import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback; import com.sap.sse.gwt.client.panels.LabeledAbstractFilterablePanel; @@ -40,7 +41,7 @@ import com.sap.sse.security.ui.client.i18n.StringMessages; * instance of {@link SwissTimingConnectionDialog}. */ public class SwissTimingConnectionTableWrapper extends - TableWrapper, StringMessages, CellTableWithCheckboxResources> { + TableWrapper, StringMessages, CellTableWithCheckboxResources> { private final LabeledAbstractFilterablePanel filterField; private final SailingServiceAsync sailingServiceAsync; private final com.sap.sailing.gwt.ui.client.StringMessages stringMessagesClient; @@ -48,7 +49,7 @@ public class SwissTimingConnectionTableWrapper extends public SwissTimingConnectionTableWrapper(final UserService userService, final SailingServiceAsync sailingServiceAsync, final com.sap.sailing.gwt.ui.client.StringMessages stringMessages, final ErrorReporter errorReporter, final boolean enablePager, final CellTableWithCheckboxResources tableResources, final Runnable refresher) { - super(stringMessages, errorReporter, false, enablePager, + super(stringMessages, errorReporter, true, enablePager, new EntityIdentityComparator() { @Override public boolean representSameEntity(SwissTimingConfigurationWithSecurityDTO dto1, @@ -113,7 +114,7 @@ public class SwissTimingConnectionTableWrapper extends }); actionColumn.addAction(DefaultActionsImagesBarCell.ACTION_DELETE, DefaultActions.DELETE, dto -> { - sailingServiceAsync.deleteSwissTimingConfiguration(dto, new AsyncCallback() { + sailingServiceAsync.deleteSwissTimingConfigurations(Collections.singletonList(dto), new AsyncCallback() { @Override public void onFailure(Throwable caught) { errorReporter.reportError("Exception trying to delete configuration in DB: " + caught.getMessage()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/tractrac/TracTracConnectionTableWrapper.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/tractrac/TracTracConnectionTableWrapper.java index 26781d39d13..95b0afe1c47 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/tractrac/TracTracConnectionTableWrapper.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/tractrac/TracTracConnectionTableWrapper.java @@ -3,6 +3,7 @@ package com.sap.sailing.gwt.ui.adminconsole.tractrac; import static com.sap.sse.security.ui.client.component.AccessControlledActionsColumn.create; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import com.google.gwt.core.client.Scheduler; @@ -19,7 +20,7 @@ import com.sap.sse.gwt.client.async.MarkedAsyncCallback; import com.sap.sse.gwt.client.celltable.AbstractSortableTextColumn; import com.sap.sse.gwt.client.celltable.CellTableWithCheckboxResources; import com.sap.sse.gwt.client.celltable.EntityIdentityComparator; -import com.sap.sse.gwt.client.celltable.RefreshableSingleSelectionModel; +import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel; import com.sap.sse.gwt.client.celltable.TableWrapper; import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback; import com.sap.sse.gwt.client.panels.LabeledAbstractFilterablePanel; @@ -41,7 +42,7 @@ import com.sap.sse.security.ui.client.i18n.StringMessages; * {@link TracTracConnectionDialog}. */ public class TracTracConnectionTableWrapper extends - TableWrapper, StringMessages, CellTableWithCheckboxResources> { + TableWrapper, StringMessages, CellTableWithCheckboxResources> { private final LabeledAbstractFilterablePanel filterField; private final SailingServiceAsync sailingServiceAsync; private final com.sap.sailing.gwt.ui.client.StringMessages stringMessagesClient; @@ -49,7 +50,7 @@ public class TracTracConnectionTableWrapper extends public TracTracConnectionTableWrapper(final UserService userService, final SailingServiceAsync sailingServiceAsync, final com.sap.sailing.gwt.ui.client.StringMessages stringMessages, final ErrorReporter errorReporter, final boolean enablePager, final CellTableWithCheckboxResources tableResources, final Runnable refresher) { - super(stringMessages, errorReporter, false, enablePager, + super(stringMessages, errorReporter, true, enablePager, new EntityIdentityComparator() { @Override public boolean representSameEntity(TracTracConfigurationWithSecurityDTO dto1, @@ -111,7 +112,7 @@ public class TracTracConnectionTableWrapper extends }); actionColumn.addAction(DefaultActionsImagesBarCell.ACTION_DELETE, DefaultActions.DELETE, dto -> { - sailingServiceAsync.deleteTracTracConfiguration(dto, new AsyncCallback() { + sailingServiceAsync.deleteTracTracConfigurations(Collections.singletonList(dto), new AsyncCallback() { @Override public void onFailure(Throwable caught) { errorReporter.reportError("Exception trying to delete configuration in DB: " + caught.getMessage()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java index 75ba0360372..ff08ba4abd5 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java @@ -169,7 +169,7 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS void updateTracTracConfiguration(TracTracConfigurationWithSecurityDTO tracTracConfiguration) throws UnauthorizedException, Exception; - void deleteTracTracConfiguration(TracTracConfigurationWithSecurityDTO tracTracConfiguration) + void deleteTracTracConfigurations(Collection tracTracConfigurations) throws UnauthorizedException, Exception; List getRegattas() throws UnauthorizedException; @@ -392,7 +392,7 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS void createSwissTimingConfiguration(String configName, String jsonURL, String hostname, Integer port, String updateURL, String updateUsername, String updatePassword) throws UnauthorizedException, Exception; - void deleteSwissTimingConfiguration(SwissTimingConfigurationWithSecurityDTO configuration) + void deleteSwissTimingConfigurations(Collection configurations) throws UnauthorizedException, Exception; void updateSwissTimingConfiguration(SwissTimingConfigurationWithSecurityDTO configuration) @@ -542,7 +542,7 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS void updateSwissTimingArchiveConfiguration(SwissTimingArchiveConfigurationWithSecurityDTO dto) throws UnauthorizedException, Exception; - void deleteSwissTimingArchiveConfiguration(SwissTimingArchiveConfigurationWithSecurityDTO dto) + void deleteSwissTimingArchiveConfigurations(Collection dtos) throws UnauthorizedException, Exception; void createCourseAreas(UUID eventId, String[] courseAreaNames) throws UnauthorizedException; @@ -1297,8 +1297,6 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS CourseTemplateDTO createOrUpdateCourseTemplate(CourseTemplateDTO courseTemplate); - void removeCourseTemplate(UUID uuid); - /** * Removes course templates list * @@ -1307,9 +1305,7 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS */ void removeCourseTemplates(Collection courseTemplatesUuids); - void removeMarkProperties(UUID uuid); - List getMarkRoles(); MarkRoleDTO createMarkRole(MarkRoleDTO markRole); -} \ No newline at end of file +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java index e7af7efb39c..67d7c8ccafd 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java @@ -389,7 +389,7 @@ public interface SailingServiceAsync extends FileStorageManagementGwtServiceAsyn void updateSwissTimingConfiguration(SwissTimingConfigurationWithSecurityDTO configuration, AsyncCallback asyncCallback); - void deleteSwissTimingConfiguration(SwissTimingConfigurationWithSecurityDTO configuration, + void deleteSwissTimingConfigurations(Collection configurations, AsyncCallback asyncCallback); void getCountryCodes(AsyncCallback callback); @@ -602,7 +602,7 @@ public interface SailingServiceAsync extends FileStorageManagementGwtServiceAsyn void updateSwissTimingArchiveConfiguration(SwissTimingArchiveConfigurationWithSecurityDTO dto, AsyncCallback asyncCallback); - void deleteSwissTimingArchiveConfiguration(SwissTimingArchiveConfigurationWithSecurityDTO dto, + void deleteSwissTimingArchiveConfigurations(Collection dtos, AsyncCallback asyncCallback); void updateRegatta(RegattaIdentifier regattaIdentifier, Date startDate, Date endDate, UUID defaultCourseAreaUuid, @@ -1236,8 +1236,6 @@ public interface SailingServiceAsync extends FileStorageManagementGwtServiceAsyn void createOrUpdateCourseTemplate(CourseTemplateDTO courseTemplate, AsyncCallback asyncCallback); - void removeCourseTemplate(UUID uuid, AsyncCallback asyncCallback); - /** * Remove course templates by UUIDs * @@ -1248,8 +1246,6 @@ public interface SailingServiceAsync extends FileStorageManagementGwtServiceAsyn */ void removeCourseTemplates(Collection courseTemplatesUuids, AsyncCallback asyncCallback); - void removeMarkProperties(UUID uuid, AsyncCallback asyncCallback); - /** * Remove mark properties by UUIDs * diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index d0c34ebc7c2..80e8d24906e 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -1529,12 +1529,13 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet } @Override - public void deleteTracTracConfiguration(TracTracConfigurationWithSecurityDTO tracTracConfiguration) { - getSecurityService().checkCurrentUserDeletePermission(tracTracConfiguration); - getSecurityService().checkPermissionAndDeleteOwnershipForObjectRemoval(tracTracConfiguration, - () -> - tractracMongoObjectFactory.deleteTracTracConfiguration(tracTracConfiguration.getCreatorName(), - tracTracConfiguration.getJsonUrl())); + public void deleteTracTracConfigurations(Collection tracTracConfigurations) { + for (TracTracConfigurationWithSecurityDTO tracTracConfiguration : tracTracConfigurations) { + getSecurityService().checkCurrentUserDeletePermission(tracTracConfiguration); + getSecurityService().checkPermissionAndDeleteOwnershipForObjectRemoval(tracTracConfiguration, + () -> tractracMongoObjectFactory.deleteTracTracConfiguration(tracTracConfiguration.getCreatorName(), + tracTracConfiguration.getJsonUrl())); + } } @Override @@ -3369,11 +3370,14 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet } @Override - public void deleteSwissTimingConfiguration(SwissTimingConfigurationWithSecurityDTO configuration) { - getSecurityService().checkCurrentUserDeletePermission(configuration); - getSecurityService().checkPermissionAndDeleteOwnershipForObjectRemoval(configuration, - () -> swissTimingAdapterPersistence.deleteSwissTimingConfiguration(configuration.getCreatorName(), - configuration.getJsonUrl())); + public void deleteSwissTimingConfigurations( + final Collection configurations) { + for (SwissTimingConfigurationWithSecurityDTO dto : configurations) { + getSecurityService().checkCurrentUserDeletePermission(dto); + getSecurityService().checkPermissionAndDeleteOwnershipForObjectRemoval(dto, + () -> swissTimingAdapterPersistence.deleteSwissTimingConfiguration(dto.getCreatorName(), + dto.getJsonUrl())); + } } @Override @@ -5438,11 +5442,13 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet } @Override - public void deleteSwissTimingArchiveConfiguration(SwissTimingArchiveConfigurationWithSecurityDTO dto) + public void deleteSwissTimingArchiveConfigurations(Collection dtos) throws Exception { - getSecurityService().checkPermissionAndDeleteOwnershipForObjectRemoval(dto.getIdentifier(), - () -> swissTimingAdapterPersistence.deleteSwissTimingArchiveConfiguration(swissTimingFactory - .createSwissTimingArchiveConfiguration(dto.getJsonUrl(), dto.getCreatorName()))); + for (SwissTimingArchiveConfigurationWithSecurityDTO dto : dtos) { + getSecurityService().checkPermissionAndDeleteOwnershipForObjectRemoval(dto.getIdentifier(), + () -> swissTimingAdapterPersistence.deleteSwissTimingArchiveConfiguration(swissTimingFactory + .createSwissTimingArchiveConfiguration(dto.getJsonUrl(), dto.getCreatorName()))); + } } protected com.sap.sailing.domain.base.DomainFactory getBaseDomainFactory() { @@ -9999,15 +10005,10 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet waypointTemplate.getPassingInstruction()); } - @Override - public void removeCourseTemplate(UUID uuid) { - getSharedSailingData().deleteCourseTemplate(getSharedSailingData().getCourseTemplateById(uuid)); - } - @Override public void removeCourseTemplates(Collection courseTemplateUuids) { for (UUID uuid : courseTemplateUuids) { - removeCourseTemplate(uuid); + getSharedSailingData().deleteCourseTemplate(getSharedSailingData().getCourseTemplateById(uuid)); } } @@ -10075,15 +10076,10 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet return result; } - @Override - public void removeMarkProperties(UUID uuid) { - getSharedSailingData().deleteMarkProperties(getSharedSailingData().getMarkPropertiesById(uuid)); - } - @Override public void removeMarkProperties(Collection markPropertiesUuids) { for (UUID uuid : markPropertiesUuids) { - removeMarkProperties(uuid); + getSharedSailingData().deleteMarkProperties(getSharedSailingData().getMarkPropertiesById(uuid)); } } From 2b34784ffa7577d08b51f49e572a4264a9d06d77 Mon Sep 17 00:00:00 2001 From: dmitry Date: Thu, 16 Apr 2020 14:01:19 +0300 Subject: [PATCH 122/188] bug5178: fixed remove remarks --- .../adminconsole/TracTracEventManagementPanel.java | 14 +++++++------- .../sailing/gwt/ui/client/SailingServiceAsync.java | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TracTracEventManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TracTracEventManagementPanel.java index 02cb41e7d2c..3459f7a3694 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TracTracEventManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TracTracEventManagementPanel.java @@ -175,9 +175,8 @@ public class TracTracEventManagementPanel extends AbstractEventManagementPanel { listRacesButton.setEnabled(false); buttonPanel.addUnsecuredWidget(loadingMessageLabel); connectionsTable.getSelectionModel().addSelectionChangeHandler(e -> { - final boolean objectSelected = connectionsTable.getSelectionModel().getSelectedObject() != null; + final boolean objectSelected = connectionsTable.getSelectionModel().getSelectedSet().size() == 1; listRacesButton.setEnabled(objectSelected); - removeButton.setEnabled(objectSelected); }); tableAndConfigurationPanel.add(buttonPanel); @@ -353,7 +352,7 @@ public class TracTracEventManagementPanel extends AbstractEventManagementPanel { final Button startTrackingButton = new Button(stringMessages.startTracking()); startTrackingButton.setEnabled(false); connectionsTable.getSelectionModel().addSelectionChangeHandler( - e -> startTrackingButton.setEnabled(connectionsTable.getSelectionModel().getSelectedObject() != null)); + e -> startTrackingButton.setEnabled(connectionsTable.getSelectionModel().getSelectedSet().size() == 1)); startTrackingButton.ensureDebugId("StartTrackingButton"); startTrackingButton.addClickHandler(new ClickHandler() { @Override @@ -449,10 +448,11 @@ public class TracTracEventManagementPanel extends AbstractEventManagementPanel { } private void fillRaces(final SailingServiceAsync sailingService, boolean listHiddenRaces) { - final TracTracConfigurationWithSecurityDTO selectedConnection = connectionsTable.getSelectionModel() - .getSelectedObject(); - if (selectedConnection != null) { + final Set selectedConnections = connectionsTable.getSelectionModel() + .getSelectedSet(); + if (selectedConnections.size() == 1) { + TracTracConfigurationWithSecurityDTO selectedConnection = selectedConnections.iterator().next(); sailingService.listTracTracRacesInEvent(selectedConnection.getJsonUrl(), listHiddenRaces, new MarkedAsyncCallback>>( new AsyncCallback>>() { @@ -504,7 +504,7 @@ public class TracTracEventManagementPanel extends AbstractEventManagementPanel { final Duration offsetToStartTimeOfSimulatedRace, boolean ignoreTracTracMarkPassings, boolean useOfficialResultsToUpdateRaceLogs) { final TracTracConfigurationWithSecurityDTO selectedConnection = connectionsTable.getSelectionModel() - .getSelectedObject(); + .getSelectedSet().iterator().next(); String liveURI = selectedConnection.getLiveDataURI(); String storedURI = selectedConnection.getStoredDataURI(); String courseDesignUpdateURI = selectedConnection.getCourseDesignUpdateURI(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java index 67d7c8ccafd..09141a6db4e 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java @@ -202,7 +202,7 @@ public interface SailingServiceAsync extends FileStorageManagementGwtServiceAsyn void createTracTracConfiguration(String name, String jsonURL, String liveDataURI, String storedDataURI, String courseDesignUpdateURI, String tracTracUsername, String tracTracPassword, AsyncCallback callback); - void deleteTracTracConfiguration(TracTracConfigurationWithSecurityDTO tracTracConfiguration, + void deleteTracTracConfigurations(Collection tracTracConfigurations, AsyncCallback callback); void updateTracTracConfiguration(TracTracConfigurationWithSecurityDTO tracTracConfiguration, From 62fc9482c5af6660cf5a1e57e698e0c28690f003 Mon Sep 17 00:00:00 2001 From: Alexandr Timoshenko Date: Thu, 16 Apr 2020 15:03:38 +0200 Subject: [PATCH 123/188] moved prev race detection to activity --- .../app/ui/activities/RacingActivity.java | 28 ++++++++++++++----- .../racelist/ManagedRaceListAdapter.java | 19 ------------- .../app/ui/fragments/RaceListFragment.java | 6 ++-- 3 files changed, 23 insertions(+), 30 deletions(-) diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java index e58ff6c3038..0a32ddbeee5 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java @@ -64,7 +64,6 @@ import com.sap.sailing.racecommittee.app.data.clients.LoadClient; import com.sap.sailing.racecommittee.app.data.loaders.DataLoaderResult; import com.sap.sailing.racecommittee.app.domain.ManagedRace; import com.sap.sailing.racecommittee.app.domain.configuration.impl.PreferencesRegattaConfigurationLoader; -import com.sap.sailing.racecommittee.app.domain.coursedesign.CourseDesign; import com.sap.sailing.racecommittee.app.logging.LogEvent; import com.sap.sailing.racecommittee.app.ui.adapters.racelist.RaceListDataType; import com.sap.sailing.racecommittee.app.ui.adapters.racelist.RaceListDataTypeHeader; @@ -303,24 +302,39 @@ public class RacingActivity extends SessionActivity implements RaceListCallbacks this.startTime = startTime; } + @Nullable + ManagedRace findPreviousRace(@NonNull final ManagedRace managedRace) { + final LinkedHashMap> fleetRaces = mRaceList.getRacesByGroup(); + for (RaceGroupSeriesFleet fleet : fleetRaces.keySet()) { + final List races = fleetRaces.get(fleet); + if (races == null) + continue; + final int index = races.indexOf(managedRace); + if (index > 1) { + return races.get(index - 1); + } + } + return null; + } + @Override - public void onRaceListItemSelected(RaceListDataType selectedItem, RaceListDataTypeRace prevRaceItem) { + public void onRaceListItemSelected(RaceListDataType selectedItem) { if (selectedItem instanceof RaceListDataTypeRace) { RaceListDataTypeRace selectedElement = (RaceListDataTypeRace) selectedItem; selectedElement.setUpdateIndicatorVisible(false); ManagedRace managedRace = selectedElement.getRace(); + ManagedRace prevRace = findPreviousRace(managedRace); ExLog.i(this, LogEvent.RACE_SELECTED_ELEMENT, managedRace.getId() + " " + managedRace.getStatus()); - if (prevRaceItem != null && managedRace.getStatus() == RaceLogRaceStatus.UNSCHEDULED) { - final ManagedRace prevRace = prevRaceItem.getRace(); + if (prevRace != null && managedRace.getStatus() == RaceLogRaceStatus.UNSCHEDULED) { final RaceState currentRaceState = managedRace.getState(); final RacingProcedure racingProcedure = prevRace.getState().getRacingProcedure(); currentRaceState.setRacingProcedure(MillisecondsTimePoint.now(), racingProcedure.getType()); final RacingProcedure newRacingProcedure = currentRaceState.getRacingProcedure(); - if (racingProcedure instanceof ConfigurableStartModeFlagRacingProcedure && newRacingProcedure instanceof ConfigurableStartModeFlagRacingProcedure){ - ConfigurableStartModeFlagRacingProcedure configurableFlag = (ConfigurableStartModeFlagRacingProcedure)racingProcedure; - ((ConfigurableStartModeFlagRacingProcedure)newRacingProcedure).setStartModeFlag(MillisecondsTimePoint.now(), configurableFlag.getStartModeFlag()); + if (racingProcedure instanceof ConfigurableStartModeFlagRacingProcedure && newRacingProcedure instanceof ConfigurableStartModeFlagRacingProcedure) { + ConfigurableStartModeFlagRacingProcedure configurableFlag = (ConfigurableStartModeFlagRacingProcedure) racingProcedure; + ((ConfigurableStartModeFlagRacingProcedure) newRacingProcedure).setStartModeFlag(MillisecondsTimePoint.now(), configurableFlag.getStartModeFlag()); } final CourseBase courseDesign = prevRace.getCourseDesign(); if (courseDesign != null) { diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/ManagedRaceListAdapter.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/ManagedRaceListAdapter.java index 06b8a5dce10..26181e3ac90 100755 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/ManagedRaceListAdapter.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/ManagedRaceListAdapter.java @@ -292,25 +292,6 @@ public class ManagedRaceListAdapter extends ArrayAdapter imple } } - - public RaceListDataTypeRace getPreviousRaceInSeries(RaceListDataType selectedItem) { - List races = getShownViewItems(new ArrayList<>(mAllRaces)); - int index = races.indexOf(selectedItem); - if (index >= 1 && selectedItem instanceof RaceListDataTypeRace) { - RaceListDataTypeRace currentRace = (RaceListDataTypeRace) selectedItem; - for (int i = index; i >= 0; i--) { - final RaceListDataType prevItem = races.get(i); - if (prevItem instanceof RaceListDataTypeRace) { - RaceListDataTypeRace prevRace = (RaceListDataTypeRace) prevItem; - if (prevRace.getFleet() == currentRace.getFleet()) { - return prevRace; - } - } - } - } - return null; - } - /** * For the {@code filteredRaces} ensure that exactly the required view items are in {@link #mShownViewItems}. This * encompasses the header items for all non-empty series and the race items for all races in their series. diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceListFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceListFragment.java index 2038e99c18d..4135a621f53 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceListFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceListFragment.java @@ -291,11 +291,9 @@ public class RaceListFragment extends LoggableFragment public void onItemClick(AdapterView parent, View view, int position, long id) { final RaceListDataType selectedItem = mAdapter.getItem(position); ExLog.i(getActivity(), TAG, "Touched " + selectedItem.toString()); - RaceListDataTypeRace prevRace = mAdapter.getPreviousRaceInSeries(selectedItem); - mDrawerLayout.closeDrawers(); mAdapter.setSelectedRace(selectedItem); - mCallbacks.onRaceListItemSelected(selectedItem, prevRace); + mCallbacks.onRaceListItemSelected(selectedItem); } @Override @@ -555,7 +553,7 @@ public class RaceListFragment extends LoggableFragment } public interface RaceListCallbacks { - void onRaceListItemSelected(RaceListDataType selectedItem, RaceListDataTypeRace prevRace); + void onRaceListItemSelected(RaceListDataType selectedItem); } private class IntentReceiver extends BroadcastReceiver { From 6dfe2ac8d560155f408921b9ba08f6239a6ec89c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20M=C3=BCnn?= Date: Thu, 16 Apr 2020 15:22:32 +0200 Subject: [PATCH 124/188] fix(AdminConsole): validate baseURL in event dialog --- .../gwt/ui/adminconsole/EventDialog.java | 20 ++++++++++++++++++- .../sailing/gwt/ui/client/StringMessages.java | 1 + .../gwt/ui/client/StringMessages.properties | 1 + .../ui/client/StringMessages_de.properties | 1 + 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventDialog.java index 37cbcc9ad67..050289be545 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventDialog.java @@ -12,6 +12,7 @@ import java.util.UUID; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; +import com.google.gwt.regexp.shared.RegExp; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.FocusWidget; import com.google.gwt.user.client.ui.Grid; @@ -58,7 +59,15 @@ public abstract class EventDialog extends DataEntryDialogWithDateTimeBox:/ + */ + private static RegExp REGEXP_URL = RegExp.compile( + "^(https?)://((?:[\\w-]+\\.)+[a-z]{2,}|localhost)(?::\\d+)?(/[\\w~:@_./$!%&=+*'\",;()-]*)?$", + "i"); + protected static class EventParameterValidator implements Validator { private StringMessages stringMessages; @@ -69,6 +78,13 @@ public abstract class EventDialog extends DataEntryDialogWithDateTimeBox(existingEvents); } + private boolean isValidURL(String input) { + if (input == null || input.isEmpty()) + return true; + else + return REGEXP_URL.test(input); + } + @Override public String getErrorMessage(EventDTO eventToValidate) { String errorMessage = null; @@ -115,6 +131,8 @@ public abstract class EventDialog extends DataEntryDialogWithDateTimeBox Date: Thu, 16 Apr 2020 15:59:04 +0200 Subject: [PATCH 125/188] refactor(EventDialog): avoid double negation --- .../gwt/ui/adminconsole/EventDialog.java | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventDialog.java index 050289be545..27a347a9518 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventDialog.java @@ -88,14 +88,18 @@ public abstract class EventDialog extends DataEntryDialogWithDateTimeBox 0; - boolean venueNotEmpty = eventToValidate.venue.getName() != null && eventToValidate.venue.getName().length() > 0; - boolean courseAreaNotEmpty = eventToValidate.venue.getCourseAreas() != null && eventToValidate.venue.getCourseAreas().size() > 0; - if (courseAreaNotEmpty) { + boolean emptyName = eventToValidate.getName() == null + || eventToValidate.getName().isEmpty(); + boolean emptyVenue = eventToValidate.venue.getName() == null + || eventToValidate.venue.getName().isEmpty(); + boolean emptyCourseArea = eventToValidate.venue.getCourseAreas() == null + || eventToValidate.venue.getCourseAreas().isEmpty(); + + if (!emptyCourseArea) { for (CourseAreaDTO courseArea : eventToValidate.venue.getCourseAreas()) { - courseAreaNotEmpty = courseArea.getName() != null && courseArea.getName().length() > 0; - if (!courseAreaNotEmpty) { + emptyCourseArea = courseArea.getName() == null || courseArea.getName().isEmpty(); + if (emptyCourseArea) { break; } } @@ -115,19 +119,19 @@ public abstract class EventDialog extends DataEntryDialogWithDateTimeBox Date: Thu, 16 Apr 2020 16:44:52 +0200 Subject: [PATCH 126/188] feat: inject scheme part (https://) in the event's base URL if missing --- .../java/com/sap/sailing/gwt/ui/shared/EventBaseDTO.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/EventBaseDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/EventBaseDTO.java index f4d2a7de531..115873d0513 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/EventBaseDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/EventBaseDTO.java @@ -135,7 +135,16 @@ public class EventBaseDTO extends NamedDTO implements WithID, IsSerializable { return baseURL; } + /** + * Assign the event's base URL. + * + * NOTE: https:// will be assumed if no protocol has been provided. + * + * @param baseURL + */ public void setBaseURL(String baseURL) { + if (baseURL != null && !baseURL.contains("://")) + baseURL = "https://" + baseURL; this.baseURL = baseURL; } From 092ea9220e93b92b4c8ed518a8ca87d6a8110838 Mon Sep 17 00:00:00 2001 From: "service.tip.git" Date: Thu, 16 Apr 2020 15:19:46 +0000 Subject: [PATCH 127/188] [INTERNAL] Translation delivery: commit by LX Lab Change-Id: I999b32ac0c6b35886c2bcbf4662423b55763f7e5 --- .../com/sap/sailing/gwt/ui/client/StringMessages_es.properties | 1 + .../com/sap/sailing/gwt/ui/client/StringMessages_fr.properties | 1 + .../com/sap/sailing/gwt/ui/client/StringMessages_it.properties | 1 + .../com/sap/sailing/gwt/ui/client/StringMessages_ja.properties | 1 + .../com/sap/sailing/gwt/ui/client/StringMessages_pt.properties | 1 + .../com/sap/sailing/gwt/ui/client/StringMessages_ru.properties | 1 + .../com/sap/sailing/gwt/ui/client/StringMessages_zh.properties | 1 + 7 files changed, 7 insertions(+) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_es.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_es.properties index eea42c1c0b8..4d8f06171fa 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_es.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_es.properties @@ -2377,3 +2377,4 @@ importTrackedRaces=Importando carreras rastreadas unsetPosition=Posición no fijada errorTryingToUpdateMarkProperties=Error al intentar actualizar las propiedades de la marca: {0} confirmUnsettingPositionForMarkProperties=¿Desea realmente eliminar la información de posicionamiento para las propiedades de la marca {0}? +useOfficialResultsForAutomaticUpdates=Actualizar automáticamente a partir de resultados "oficiales" publicados por TracTrac diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_fr.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_fr.properties index 70822765a60..46a1248395e 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_fr.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_fr.properties @@ -2377,3 +2377,4 @@ importTrackedRaces=Importation des courses suivies en cours unsetPosition=Réinitialiser la position errorTryingToUpdateMarkProperties=Erreur lors de la tentative de mise à jour des propriétés de marque : {0} confirmUnsettingPositionForMarkProperties=Voulez-vous vraiment effacer les informations de localisation pour les propriétés de marque {0} ? +useOfficialResultsForAutomaticUpdates=Mettre automatiquement à jour à partir des résultats "officiels" publiés par TracTrac diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_it.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_it.properties index 98653a95daf..a43d78e5541 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_it.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_it.properties @@ -2377,3 +2377,4 @@ importTrackedRaces=Importazione gare tracciate unsetPosition=Annulla parametrizzazione posizione errorTryingToUpdateMarkProperties=Errore durante il tentativo di aggiornare le proprietà segnale: {0} confirmUnsettingPositionForMarkProperties=Confermare l''eliminazione delle informazioni di posizione per le proprietà segnale {0}? +useOfficialResultsForAutomaticUpdates=Aggiorna automaticamente dai risultati "ufficiali" pubblicati da TracTrac diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ja.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ja.properties index 2e5764128fe..755527cd223 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ja.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ja.properties @@ -2377,3 +2377,4 @@ importTrackedRaces=追跡レースのインポート unsetPosition=位置の設定解除 errorTryingToUpdateMarkProperties=マークプロパティを更新しようとしてエラーが発生しました: {0} confirmUnsettingPositionForMarkProperties=マークプロパティ {0} の位置情報を削除しますか +useOfficialResultsForAutomaticUpdates=TracTrac が公開した "公式" の結果から自動的に更新 diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_pt.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_pt.properties index 40461ab888c..1cac9fa4d2a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_pt.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_pt.properties @@ -2377,3 +2377,4 @@ importTrackedRaces=Importando corridas rastreadas unsetPosition=Remover definição de posição errorTryingToUpdateMarkProperties=Erro ao tentar atualizar propriedades da marca: {0} confirmUnsettingPositionForMarkProperties=Remover informações de posicionamento para propriedades da marca {0}? +useOfficialResultsForAutomaticUpdates=Atualizar automaticamente a partir dos resultados "oficiais" publicados por TracTrac diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties index 69cca163c95..c6ae4e824b3 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties @@ -2377,3 +2377,4 @@ importTrackedRaces=Импорт отслеживаемых гонок unsetPosition=Неустановленная позиция errorTryingToUpdateMarkProperties=Ошибка при попытке обновить свойства знака: {0} confirmUnsettingPositionForMarkProperties=Действительно удалить информацию о положении для свойств знака {0}? +useOfficialResultsForAutomaticUpdates=Автоматически обновлять из "официальных" результатов, опубликованных TracTrac diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties index 313f5e10481..ab362ef5724 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties @@ -2377,3 +2377,4 @@ importTrackedRaces=导入跟踪的比赛轮次 unsetPosition=取消设置位置 errorTryingToUpdateMarkProperties=尝试更新标志属性时发生错误:{0} confirmUnsettingPositionForMarkProperties=是否确定移除标志属性 {0} 的位置信息? +useOfficialResultsForAutomaticUpdates=自动更新 TracTrac 发布的“官方”结果 From 8fc8c2da16adb4b84ac64fcd0833d327a5b7f09d Mon Sep 17 00:00:00 2001 From: Alexandr Timoshenko Date: Thu, 16 Apr 2020 18:14:49 +0200 Subject: [PATCH 128/188] fix mistype --- .../sailing/racecommittee/app/ui/activities/RacingActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java index 0a32ddbeee5..b5e5b0a4cb0 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java @@ -310,7 +310,7 @@ public class RacingActivity extends SessionActivity implements RaceListCallbacks if (races == null) continue; final int index = races.indexOf(managedRace); - if (index > 1) { + if (index >= 1) { return races.get(index - 1); } } From 40caef5a8efc2bf6a7c80d81e22b2bd081a75b31 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 16 Apr 2020 23:48:42 +0200 Subject: [PATCH 129/188] bug5178: trying to heal what looks like a copy/paste problem --- .../SwissTimingEventManagementPanel.java | 36 ++++++------------- 1 file changed, 10 insertions(+), 26 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java index 7e765875710..4267162d682 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java @@ -110,42 +110,26 @@ public class SwissTimingEventManagementPanel extends AbstractEventManagementPane })); } - @Override - public void cancel() { - } - }, userService, errorReporter).show()); - // Remove SwissTiming Connection - final Button removeButton = buttonPanel.addRemoveAction(stringMessages.remove(), () -> { - sailingService.deleteSwissTimingConfiguration(connectionsTable.getSelectionModel().getSelectedObject(), - new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError( - "Exception trying to delete configuration in DB: " + caught.getMessage()); - } @Override public void cancel() { } }, userService, errorReporter).show()); - - // Remove SwissTiming Connection - buttonPanel.addRemoveAction(stringMessages.remove(), connectionsTable.getSelectionModel(), false, - () -> { - sailingService.deleteSwissTimingConfigurations( - connectionsTable.getSelectionModel().getSelectedSet(), new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError("Exception trying to delete configuration in DB: " - + caught.getMessage()); - } + // Remove SwissTiming Connection + buttonPanel.addRemoveAction(stringMessages.remove(), connectionsTable.getSelectionModel(), false, () -> { + sailingService.deleteSwissTimingConfigurations( + connectionsTable.getSelectionModel().getSelectedSet(), new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError("Exception trying to delete configuration in DB: " + + caught.getMessage()); + } @Override public void onSuccess(Void result) { connectionsTable.refreshSwissTimingConnectionList(); } - }); + }); }); - // List Races in SwissTiming Connection final Button listRacesButton = buttonPanel.addUnsecuredAction(stringMessages.listRaces(), () -> { fillRaces(sailingService); From 44c224c07258d7448124f11490476d427abcd1cf Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 16 Apr 2020 23:51:05 +0200 Subject: [PATCH 130/188] added param name comment --- .../gwt/ui/adminconsole/SwissTimingEventManagementPanel.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/adminconsole/SwissTimingEventManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java index 4267162d682..b051ceec3b2 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java @@ -115,7 +115,7 @@ public class SwissTimingEventManagementPanel extends AbstractEventManagementPane } }, userService, errorReporter).show()); // Remove SwissTiming Connection - buttonPanel.addRemoveAction(stringMessages.remove(), connectionsTable.getSelectionModel(), false, () -> { + buttonPanel.addRemoveAction(stringMessages.remove(), connectionsTable.getSelectionModel(), /* with confirmation: */ false, () -> { sailingService.deleteSwissTimingConfigurations( connectionsTable.getSelectionModel().getSelectedSet(), new AsyncCallback() { @Override From b6f25a68c77d194bf1f93650aaebc3b3b4b1f71b Mon Sep 17 00:00:00 2001 From: dmitry Date: Fri, 17 Apr 2020 08:55:19 +0300 Subject: [PATCH 131/188] bug5178: fixed formatting --- .../SwissTimingEventManagementPanel.java | 29 +++++----- .../SwissTimingReplayConnectorPanel.java | 33 +++++------ .../TracTracEventManagementPanel.java | 58 ++++++++++--------- 3 files changed, 60 insertions(+), 60 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java index b051ceec3b2..5e3f8c41f0b 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java @@ -115,21 +115,22 @@ public class SwissTimingEventManagementPanel extends AbstractEventManagementPane } }, userService, errorReporter).show()); // Remove SwissTiming Connection - buttonPanel.addRemoveAction(stringMessages.remove(), connectionsTable.getSelectionModel(), /* with confirmation: */ false, () -> { - sailingService.deleteSwissTimingConfigurations( - connectionsTable.getSelectionModel().getSelectedSet(), new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError("Exception trying to delete configuration in DB: " - + caught.getMessage()); - } + buttonPanel.addRemoveAction(stringMessages.remove(), connectionsTable.getSelectionModel(), + /* with confirmation: */ false, () -> { + sailingService.deleteSwissTimingConfigurations( + connectionsTable.getSelectionModel().getSelectedSet(), new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError( + "Exception trying to delete configuration in DB: " + caught.getMessage()); + } - @Override - public void onSuccess(Void result) { - connectionsTable.refreshSwissTimingConnectionList(); - } - }); - }); + @Override + public void onSuccess(Void result) { + connectionsTable.refreshSwissTimingConnectionList(); + } + }); + }); // List Races in SwissTiming Connection final Button listRacesButton = buttonPanel.addUnsecuredAction(stringMessages.listRaces(), () -> { fillRaces(sailingService); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingReplayConnectorPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingReplayConnectorPanel.java index fe68e07e0f9..91d3746446f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingReplayConnectorPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingReplayConnectorPanel.java @@ -283,25 +283,22 @@ public class SwissTimingReplayConnectorPanel extends AbstractEventManagementPane public void cancel() { } }, userService, errorReporter).show()); - // Remove action - buttonPanel.addRemoveAction(stringMessages.remove(), connectionsTable.getSelectionModel(), - false, () -> { - sailingService.deleteSwissTimingArchiveConfigurations( - connectionsTable.getSelectionModel().getSelectedSet(), - new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError( - "Exception trying to delete configuration(s) in DB: " - + caught.getMessage()); - } + // Remove action + buttonPanel.addRemoveAction(stringMessages.remove(), connectionsTable.getSelectionModel(), false, () -> { + sailingService.deleteSwissTimingArchiveConfigurations(connectionsTable.getSelectionModel().getSelectedSet(), + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError( + "Exception trying to delete configuration(s) in DB: " + caught.getMessage()); + } - @Override - public void onSuccess(Void result) { - connectionsTable.refreshConnectionList(); - } - }); - }); + @Override + public void onSuccess(Void result) { + connectionsTable.refreshConnectionList(); + } + }); + }); // List Race action final Button listRacesButton = buttonPanel.addUnsecuredAction(stringMessages.listRaces(), () -> { fillRaces(sailingService); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TracTracEventManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TracTracEventManagementPanel.java index 3459f7a3694..3bf1cc9d500 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TracTracEventManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TracTracEventManagementPanel.java @@ -111,7 +111,8 @@ public class TracTracEventManagementPanel extends AbstractEventManagementPanel { connectionsPanel.setStyleName("bold"); VerticalPanel tableAndConfigurationPanel = new VerticalPanel(); connectionsTable = new TracTracConnectionTableWrapper(userService, sailingService, stringMessages, - errorReporter, true, tableResources, () -> {}); + errorReporter, true, tableResources, () -> { + }); connectionsTable.refreshTracTracConnectionList(); final Grid grid = new Grid(1, 2); @@ -120,36 +121,37 @@ public class TracTracEventManagementPanel extends AbstractEventManagementPanel { showHiddenRacesCheckbox.ensureDebugId("ShowHiddenRacesCheckBox"); grid.setWidget(0, 1, showHiddenRacesCheckbox); // Add TracTrac Connection - final AccessControlledButtonPanel buttonPanel = new AccessControlledButtonPanel(userService, SecuredDomainType.TRACKED_RACE); - buttonPanel.addUnsecuredAction(stringMessages.refresh(), () -> connectionsTable.refreshTracTracConnectionList()); + final AccessControlledButtonPanel buttonPanel = new AccessControlledButtonPanel(userService, + SecuredDomainType.TRACKED_RACE); + buttonPanel.addUnsecuredAction(stringMessages.refresh(), + () -> connectionsTable.refreshTracTracConnectionList()); Button addCreateAction = buttonPanel.addCreateAction(stringMessages.addTracTracConnection(), - () -> new TracTracConnectionDialog( - new DialogCallback() { - @Override - public void ok(TracTracConfigurationWithSecurityDTO editedConnection) { - sailingService.createTracTracConfiguration(editedConnection.getName(), - editedConnection.getJsonUrl(), editedConnection.getLiveDataURI(), - editedConnection.getStoredDataURI(), - editedConnection.getCourseDesignUpdateURI(), - editedConnection.getTracTracUsername(), editedConnection.getTracTracPassword(), - new MarkedAsyncCallback(new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - reportError("Exception trying to create configuration in DB: " - + caught.getMessage()); - } + () -> new TracTracConnectionDialog(new DialogCallback() { + @Override + public void ok(TracTracConfigurationWithSecurityDTO editedConnection) { + sailingService.createTracTracConfiguration(editedConnection.getName(), + editedConnection.getJsonUrl(), editedConnection.getLiveDataURI(), + editedConnection.getStoredDataURI(), editedConnection.getCourseDesignUpdateURI(), + editedConnection.getTracTracUsername(), editedConnection.getTracTracPassword(), + new MarkedAsyncCallback(new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + reportError("Exception trying to create configuration in DB: " + + caught.getMessage()); + } - @Override - public void onSuccess(Void voidResult) { - connectionsTable.refreshTracTracConnectionList(/* selectWhenDone */ editedConnection); - } - })); - } + @Override + public void onSuccess(Void voidResult) { + connectionsTable + .refreshTracTracConnectionList(/* selectWhenDone */ editedConnection); + } + })); + } - @Override - public void cancel() { - } - }, userService, errorReporter).show()); + @Override + public void cancel() { + } + }, userService, errorReporter).show()); addCreateAction.ensureDebugId("AddConnectionButton"); buttonPanel.addRemoveAction(stringMessages.remove(), connectionsTable.getSelectionModel(), false, () -> { sailingService.deleteTracTracConfigurations(connectionsTable.getSelectionModel().getSelectedSet(), From 2bdc529e56a8024f143fa065ecad825ee19c049b Mon Sep 17 00:00:00 2001 From: dmitry Date: Fri, 17 Apr 2020 10:25:48 +0300 Subject: [PATCH 132/188] bug5262: Added login with selected locale at once after sign up --- .../authentication/AuthenticationManagerImpl.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationManagerImpl.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationManagerImpl.java index f175c689253..48293d382e3 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationManagerImpl.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationManagerImpl.java @@ -146,7 +146,7 @@ public class AuthenticationManagerImpl implements AuthenticationManager { } }); } - + @Override public void login(String username, String password, final SuccessCallback callback) { userService.login(username, password, new AsyncCallback() { @@ -154,8 +154,9 @@ public class AuthenticationManagerImpl implements AuthenticationManager { public void onSuccess(SuccessInfo result) { if (result.isSuccessful()) { callback.onSuccess(result); - if (ExperimentalFeatures.REFRESH_ON_LOCALE_CHANGE_IN_USER_PROFILE) { - // when a user logs in we explicitly switch to the user's locale event if a locale is given by the URL + if (isUserLocaleChanged(result) || ExperimentalFeatures.REFRESH_ON_LOCALE_CHANGE_IN_USER_PROFILE) { + // when a user logs in we explicitly switch to the user's locale event if a locale is given by + // the URL redirectIfLocaleIsSetAndLocaleIsNotGivenInTheURL(result.getUserDTO().getA().getLocale()); } } else { @@ -166,14 +167,18 @@ public class AuthenticationManagerImpl implements AuthenticationManager { } } } - + + private boolean isUserLocaleChanged(SuccessInfo result) { + return !LocaleInfo.getCurrentLocale().getLocaleName().equals(result.getUserDTO().getA().getLocale()); + } + @Override public void onFailure(Throwable caught) { view.setErrorMessage(StringMessages.INSTANCE.failedToSignIn()); } }); } - + @Override public void logout() { userService.logout(); From 574f1d687a42a195443311cabf1963a86e0a84f2 Mon Sep 17 00:00:00 2001 From: dmitry Date: Fri, 17 Apr 2020 12:53:50 +0300 Subject: [PATCH 133/188] bug5178: fixed formatting issues --- .../AbstractLeaderboardConfigPanel.java | 2 +- .../ui/adminconsole/EventListComposite.java | 1 + .../adminconsole/LeaderboardConfigPanel.java | 7 +- .../RemoteServerInstancesManagementPanel.java | 2 +- .../SwissTimingEventManagementPanel.java | 79 +++++------ .../SwissTimingReplayConnectorPanel.java | 30 ++-- .../TracTracEventManagementPanel.java | 130 +++++++++--------- .../TrackedRacesListComposite.java | 4 +- .../coursecreation/MarkPropertiesPanel.java | 6 + ...sTimingArchivedConnectionTableWrapper.java | 22 ++- .../sailing/gwt/ui/client/SailingService.java | 2 +- .../gwt/ui/client/StringMessages.properties | 2 +- .../ui/client/StringMessages_de.properties | 2 +- 13 files changed, 146 insertions(+), 143 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractLeaderboardConfigPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractLeaderboardConfigPanel.java index 5469c749421..af440f0d7f8 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractLeaderboardConfigPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractLeaderboardConfigPanel.java @@ -902,4 +902,4 @@ public abstract class AbstractLeaderboardConfigPanel extends FormPanel } }); } -} +} \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java index ae5cee05c22..33747ee45d4 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java @@ -178,6 +178,7 @@ public class EventListComposite extends Composite implements EventsRefresher, Le } } remove.setEnabled(!selectedEvents.isEmpty() && canDeleteAll); + } }); panel.add(filterTextbox); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java index acfd4020671..76887132ab9 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java @@ -326,7 +326,8 @@ public class LeaderboardConfigPanel extends AbstractLeaderboardConfigPanel }); editCompetitorsDialog.show(); }); - leaderboardActionColumn.addAction(LeaderboardConfigImagesBarCell.ACTION_CONFIGURE_URL, READ, leaderboardDTO -> { + leaderboardActionColumn.addAction(LeaderboardConfigImagesBarCell.ACTION_CONFIGURE_URL, READ, + leaderboardDTO -> { sailingService.getAvailableDetailTypesForLeaderboard(leaderboardDTO.getName(), null, new AsyncCallback>() { @@ -850,8 +851,8 @@ public class LeaderboardConfigPanel extends AbstractLeaderboardConfigPanel raceColumnTable.getDataProvider().getList().clear(); for (RaceColumnDTO raceColumn : selectedLeaderboard.getRaceList()) { for (FleetDTO fleet : raceColumn.getFleets()) { - raceColumnTable.getDataProvider().getList().add( - new RaceColumnDTOAndFleetDTOWithNameBasedEquality(raceColumn, fleet, selectedLeaderboard)); + raceColumnTable.getDataProvider().getList().add(new RaceColumnDTOAndFleetDTOWithNameBasedEquality( + raceColumn, fleet, selectedLeaderboard)); } } selectedLeaderBoardPanel.setVisible(true); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RemoteServerInstancesManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RemoteServerInstancesManagementPanel.java index ecfd48ec3db..11df7be8e70 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RemoteServerInstancesManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RemoteServerInstancesManagementPanel.java @@ -114,7 +114,7 @@ public class RemoteServerInstancesManagementPanel extends SimplePanel { }); buttonPanel.add(new SelectedElementsCountingButton(stringMessages.remove(), - refreshableServerSelectionModel, true, (event) -> removeSelectedSailingServers())); + refreshableServerSelectionModel, true, (event) -> removeSelectedSailingServers())); Button refreshButton = new Button(stringMessages.refresh()); buttonPanel.add(refreshButton); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java index 5e3f8c41f0b..5d284e49768 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java @@ -88,49 +88,50 @@ public class SwissTimingEventManagementPanel extends AbstractEventManagementPane () -> connectionsTable.refreshSwissTimingConnectionList()); // Add SwissTiming Connection buttonPanel.addCreateAction(stringMessages.addSwissTimingConnection(), - () -> new SwissTimingConnectionDialog(new DialogCallback() { - @Override - public void ok(SwissTimingConfigurationWithSecurityDTO editedConnection) { - sailingService.createSwissTimingConfiguration(editedConnection.getName(), - editedConnection.getJsonUrl(), editedConnection.getHostname(), - editedConnection.getPort(), editedConnection.getUpdateURL(), - editedConnection.getUpdateUsername(), editedConnection.getUpdatePassword(), - new MarkedAsyncCallback(new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError("Exception trying to create configuration in DB: " - + caught.getMessage()); - } + () -> new SwissTimingConnectionDialog( + new DialogCallback() { + @Override + public void ok(SwissTimingConfigurationWithSecurityDTO editedConnection) { + sailingService.createSwissTimingConfiguration(editedConnection.getName(), + editedConnection.getJsonUrl(), editedConnection.getHostname(), + editedConnection.getPort(), editedConnection.getUpdateURL(), + editedConnection.getUpdateUsername(), editedConnection.getUpdatePassword(), + new MarkedAsyncCallback(new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + errorReporter + .reportError("Exception trying to create configuration in DB: " + + caught.getMessage()); + } - @Override - public void onSuccess(Void voidResult) { - connectionsTable.refreshSwissTimingConnectionList(); - connectionsTable.getFilterField().search(editedConnection.getJsonUrl()); - } - })); - } + @Override + public void onSuccess(Void voidResult) { + connectionsTable.refreshSwissTimingConnectionList(); + connectionsTable.getFilterField().search(editedConnection.getJsonUrl()); + } + })); + } - @Override - public void cancel() { - } - }, userService, errorReporter).show()); + @Override + public void cancel() { + } + }, userService, errorReporter).show()); // Remove SwissTiming Connection - buttonPanel.addRemoveAction(stringMessages.remove(), connectionsTable.getSelectionModel(), - /* with confirmation: */ false, () -> { - sailingService.deleteSwissTimingConfigurations( - connectionsTable.getSelectionModel().getSelectedSet(), new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError( - "Exception trying to delete configuration in DB: " + caught.getMessage()); - } + buttonPanel.addRemoveAction(stringMessages.remove(), connectionsTable.getSelectionModel(), false, () -> { + sailingService.deleteSwissTimingConfigurations(connectionsTable.getSelectionModel().getSelectedSet(), + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError( + "Exception trying to delete configuration in DB: " + caught.getMessage()); + } - @Override - public void onSuccess(Void result) { - connectionsTable.refreshSwissTimingConnectionList(); - } - }); - }); + @Override + public void onSuccess(Void result) { + connectionsTable.refreshSwissTimingConnectionList(); + } + }); + }); // List Races in SwissTiming Connection final Button listRacesButton = buttonPanel.addUnsecuredAction(stringMessages.listRaces(), () -> { fillRaces(sailingService); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingReplayConnectorPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingReplayConnectorPanel.java index 91d3746446f..0cebc51a6e7 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingReplayConnectorPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingReplayConnectorPanel.java @@ -349,22 +349,22 @@ public class SwissTimingReplayConnectorPanel extends AbstractEventManagementPane SwissTimingArchiveConfigurationWithSecurityDTO selectedObject = selectedObjects.iterator().next(); sailingService.listSwissTiminigReplayRaces(selectedObject.getJsonUrl(), new AsyncCallback>() { - @Override - public void onFailure(Throwable caught) { - SwissTimingReplayConnectorPanel.this.errorReporter - .reportError("Error trying to list SwissTiming races: " + caught.getMessage()); - } + @Override + public void onFailure(Throwable caught) { + SwissTimingReplayConnectorPanel.this.errorReporter.reportError("Error trying to list SwissTiming races: " + + caught.getMessage()); + } - @Override - public void onSuccess(final List races) { - availableSwissTimingRaces.clear(); - availableSwissTimingRaces.addAll(races); - raceList.getList().clear(); - raceList.getList().addAll(availableSwissTimingRaces); - filterablePanelEvents.getTextBox().setText(null); - filterablePanelEvents.updateAll(races); - } - }); + @Override + public void onSuccess(final List races) { + availableSwissTimingRaces.clear(); + availableSwissTimingRaces.addAll(races); + raceList.getList().clear(); + raceList.getList().addAll(availableSwissTimingRaces); + filterablePanelEvents.getTextBox().setText(null); + filterablePanelEvents.updateAll(races); + } + }); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TracTracEventManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TracTracEventManagementPanel.java index 3bf1cc9d500..151206e1139 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TracTracEventManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TracTracEventManagementPanel.java @@ -111,8 +111,7 @@ public class TracTracEventManagementPanel extends AbstractEventManagementPanel { connectionsPanel.setStyleName("bold"); VerticalPanel tableAndConfigurationPanel = new VerticalPanel(); connectionsTable = new TracTracConnectionTableWrapper(userService, sailingService, stringMessages, - errorReporter, true, tableResources, () -> { - }); + errorReporter, true, tableResources, () -> {}); connectionsTable.refreshTracTracConnectionList(); final Grid grid = new Grid(1, 2); @@ -121,37 +120,36 @@ public class TracTracEventManagementPanel extends AbstractEventManagementPanel { showHiddenRacesCheckbox.ensureDebugId("ShowHiddenRacesCheckBox"); grid.setWidget(0, 1, showHiddenRacesCheckbox); // Add TracTrac Connection - final AccessControlledButtonPanel buttonPanel = new AccessControlledButtonPanel(userService, - SecuredDomainType.TRACKED_RACE); - buttonPanel.addUnsecuredAction(stringMessages.refresh(), - () -> connectionsTable.refreshTracTracConnectionList()); + final AccessControlledButtonPanel buttonPanel = new AccessControlledButtonPanel(userService, SecuredDomainType.TRACKED_RACE); + buttonPanel.addUnsecuredAction(stringMessages.refresh(), () -> connectionsTable.refreshTracTracConnectionList()); Button addCreateAction = buttonPanel.addCreateAction(stringMessages.addTracTracConnection(), - () -> new TracTracConnectionDialog(new DialogCallback() { - @Override - public void ok(TracTracConfigurationWithSecurityDTO editedConnection) { - sailingService.createTracTracConfiguration(editedConnection.getName(), - editedConnection.getJsonUrl(), editedConnection.getLiveDataURI(), - editedConnection.getStoredDataURI(), editedConnection.getCourseDesignUpdateURI(), - editedConnection.getTracTracUsername(), editedConnection.getTracTracPassword(), - new MarkedAsyncCallback(new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - reportError("Exception trying to create configuration in DB: " - + caught.getMessage()); - } + () -> new TracTracConnectionDialog( + new DialogCallback() { + @Override + public void ok(TracTracConfigurationWithSecurityDTO editedConnection) { + sailingService.createTracTracConfiguration(editedConnection.getName(), + editedConnection.getJsonUrl(), editedConnection.getLiveDataURI(), + editedConnection.getStoredDataURI(), + editedConnection.getCourseDesignUpdateURI(), + editedConnection.getTracTracUsername(), editedConnection.getTracTracPassword(), + new MarkedAsyncCallback(new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + reportError("Exception trying to create configuration in DB: " + + caught.getMessage()); + } - @Override - public void onSuccess(Void voidResult) { - connectionsTable - .refreshTracTracConnectionList(/* selectWhenDone */ editedConnection); - } - })); - } + @Override + public void onSuccess(Void voidResult) { + connectionsTable.refreshTracTracConnectionList(/* selectWhenDone */ editedConnection); + } + })); + } - @Override - public void cancel() { - } - }, userService, errorReporter).show()); + @Override + public void cancel() { + } + }, userService, errorReporter).show()); addCreateAction.ensureDebugId("AddConnectionButton"); buttonPanel.addRemoveAction(stringMessages.remove(), connectionsTable.getSelectionModel(), false, () -> { sailingService.deleteTracTracConfigurations(connectionsTable.getSelectionModel().getSelectedSet(), @@ -454,51 +452,49 @@ public class TracTracEventManagementPanel extends AbstractEventManagementPanel { .getSelectedSet(); if (selectedConnections.size() == 1) { - TracTracConfigurationWithSecurityDTO selectedConnection = selectedConnections.iterator().next(); - sailingService.listTracTracRacesInEvent(selectedConnection.getJsonUrl(), listHiddenRaces, + TracTracConfigurationWithSecurityDTO selectedConnection = selectedConnections.iterator().next(); sailingService.listTracTracRacesInEvent(selectedConnection.getJsonUrl(), listHiddenRaces, new MarkedAsyncCallback>>( - new AsyncCallback>>() { + new AsyncCallback>>() { + @Override + public void onFailure(Throwable caught) { + loadingMessageLabel.setText(""); + reportError("Error trying to list races: " + caught.getMessage()); + } + + @Override + public void onSuccess(final com.sap.sse.common.Util.Pair> result) { + loadingMessageLabel.setText("Building resultset and saving configuration..."); + TracTracEventManagementPanel.this.availableTracTracRaces.clear(); + final TracTracConfigurationWithSecurityDTO updatedConnection = new TracTracConfigurationWithSecurityDTO( + selectedConnection, + result.getA()); + final List eventRaces = result.getB(); + if (eventRaces != null) { + TracTracEventManagementPanel.this.availableTracTracRaces.addAll(eventRaces); + racesFilterablePanel.updateAll(availableTracTracRaces); + } + List races = TracTracEventManagementPanel.this.raceList.getList(); + races.clear(); + races.addAll(TracTracEventManagementPanel.this.availableTracTracRaces); + TracTracEventManagementPanel.this.racesFilterablePanel.getTextBox().setText(""); + TracTracEventManagementPanel.this.racesTable.setPageSize(races.size()); + loadingMessageLabel.setText(""); + // store a successful configuration in the database for later retrieval + sailingService.updateTracTracConfiguration(updatedConnection, + new MarkedAsyncCallback( + new AsyncCallback() { @Override public void onFailure(Throwable caught) { - loadingMessageLabel.setText(""); - reportError("Error trying to list races: " + caught.getMessage()); + reportError("Exception trying to store configuration in DB: " + caught.getMessage()); } @Override - public void onSuccess( - final com.sap.sse.common.Util.Pair> result) { - loadingMessageLabel.setText("Building resultset and saving configuration..."); - TracTracEventManagementPanel.this.availableTracTracRaces.clear(); - final TracTracConfigurationWithSecurityDTO updatedConnection = new TracTracConfigurationWithSecurityDTO( - selectedConnection, result.getA()); - final List eventRaces = result.getB(); - if (eventRaces != null) { - TracTracEventManagementPanel.this.availableTracTracRaces.addAll(eventRaces); - racesFilterablePanel.updateAll(availableTracTracRaces); - } - List races = TracTracEventManagementPanel.this.raceList - .getList(); - races.clear(); - races.addAll(TracTracEventManagementPanel.this.availableTracTracRaces); - TracTracEventManagementPanel.this.racesFilterablePanel.getTextBox().setText(""); - TracTracEventManagementPanel.this.racesTable.setPageSize(races.size()); - loadingMessageLabel.setText(""); - // store a successful configuration in the database for later retrieval - sailingService.updateTracTracConfiguration(updatedConnection, - new MarkedAsyncCallback(new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - reportError("Exception trying to store configuration in DB: " - + caught.getMessage()); - } - - @Override - public void onSuccess(Void voidResult) { - connectionsTable.refreshTracTracConnectionList(); - } - })); + public void onSuccess(Void voidResult) { + connectionsTable.refreshTracTracConnectionList(); } })); + } + })); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java index 5d068a2d7c1..5b9d758a596 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java @@ -143,9 +143,9 @@ public class TrackedRacesListComposite extends AbstractTrackedRacesListComposite }); btnExport.setEnabled(false); trackedRacesButtonPanel.add(btnExport); + btnRemoveRace = new SelectedElementsCountingButton(stringMessages.remove(), - refreshableSelectionModel, - e -> e.getRegattaName() + " - " + e.getName(), + refreshableSelectionModel, e -> e.getRegattaName() + " - " + e.getName(), (event) -> removeAndUntrackRaces(refreshableSelectionModel.getSelectedSet())); btnRemoveRace.ensureDebugId("RemoveRaceButton"); trackedRacesButtonPanel.add(btnRemoveRace); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java index c385f6c17b4..7e219f30401 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java @@ -209,6 +209,7 @@ public class MarkPropertiesPanel extends FlowPanel { return columnIndex == 0; } })); + // Initialize the columns. initTableColumns(sortHandler, userService); markPropertiesListDataProvider.addDataDisplay(markPropertiesTable); @@ -232,6 +233,7 @@ public class MarkPropertiesPanel extends FlowPanel { }; markPropertiesTable.addColumn(checkColumn, SafeHtmlUtils.fromSafeConstant("
    ")); markPropertiesTable.setColumnWidth(checkColumn, 40, Unit.PX); + // id Column idColumn = new Column(new TextCell()) { @Override @@ -329,13 +331,17 @@ public class MarkPropertiesPanel extends FlowPanel { markPropertiesTable.addColumn(typeColumn, stringMessages.type()); markPropertiesTable.addColumn(positioningColumn, stringMessages.position()); markPropertiesTable.addColumn(tagsColumn, stringMessages.tags()); + SecuredDTOOwnerColumn.configureOwnerColumns(markPropertiesTable, sortHandler, stringMessages); + final HasPermissions type = SecuredDomainType.MARK_PROPERTIES; + final AccessControlledActionsColumn actionsColumn = create( new MarkPropertiesImagesbarCell(stringMessages), userService); final EditOwnershipDialog.DialogConfig configOwnership = EditOwnershipDialog .create(userService.getUserManagementService(), type, markProperties -> { /* no refresh action */}, stringMessages); + final EditACLDialog.DialogConfig configACL = EditACLDialog.create( userService.getUserManagementService(), type, markProperties -> markProperties.getAccessControlList(), stringMessages); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/swisstiming/SwissTimingArchivedConnectionTableWrapper.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/swisstiming/SwissTimingArchivedConnectionTableWrapper.java index 5f5e58ebffb..d28d682698a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/swisstiming/SwissTimingArchivedConnectionTableWrapper.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/swisstiming/SwissTimingArchivedConnectionTableWrapper.java @@ -99,19 +99,17 @@ public class SwissTimingArchivedConnectionTableWrapper extends }, userService, errorReporter).show(); }); actionColumn.addAction(DefaultActionsImagesBarCell.ACTION_DELETE, DefaultActions.DELETE, dto -> { - sailingServiceAsync.deleteSwissTimingArchiveConfigurations(Collections.singletonList(dto), - new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError( - "Exception trying to delete configuration(s) in DB: " + caught.getMessage()); - } + sailingServiceAsync.deleteSwissTimingArchiveConfigurations(Collections.singletonList(dto), new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError("Exception trying to delete configuration in DB: " + caught.getMessage()); + } - @Override - public void onSuccess(Void result) { - refreshConnectionList(); - } - }); + @Override + public void onSuccess(Void result) { + refreshConnectionList(); + } + }); }); final EditOwnershipDialog.DialogConfig configOwnership = EditOwnershipDialog .create(userService.getUserManagementService(), type, dto -> refreshConnectionList(), diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java index cbada72bcac..e5ed3d7be88 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java @@ -1308,4 +1308,4 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS List getMarkRoles(); MarkRoleDTO createMarkRole(MarkRoleDTO markRole); -} +} \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties index 24bf85e84f7..4e3d7031a9d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties @@ -2379,4 +2379,4 @@ unsetPosition=Unset position errorTryingToUpdateMarkProperties=Error trying to update mark properties: {0} confirmUnsettingPositionForMarkProperties=Really remove positioning information for mark properties {0}? useOfficialResultsForAutomaticUpdates=Automatically update from "official" results published by TracTrac -keepEmptyForDefaultUserAndPassword=If username and password are left empty the current user is used to log in on the remote server. If your user has the correct permission to do a master data import from the remote server there is no need to fill in those fields. Use only if you have separate user stores or if the data belongs to another user. +keepEmptyForDefaultUserAndPassword=If username and password are left empty the current user is used to log in on the remote server. If your user has the correct permission to do a master data import from the remote server there is no need to fill in those fields. Use only if you have separate user stores or if the data belongs to another user. \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties index aa9c36c6ae4..5336b7b6bc5 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties @@ -2389,4 +2389,4 @@ importTrackedRaces=Getrackte Rennen werden importiert errorTryingToUpdateMarkProperties=Fehler beim Ändern der Bahnmarkeneigenschaften: {0} confirmUnsettingPositionForMarkProperties=Positionierungsinformation für Bahnmarkeneigenschaften {0} wirklich entfernen? useOfficialResultsForAutomaticUpdates=Automatisch von "offiziellen" von TracTrac veröffentlichten Ergebnissen aktualisieren -keepEmptyForDefaultUserAndPassword=Wenn kein Benutzername und kein Kennwort eingetragen werden, wird der aktuelle Benutzer zum importieren verwendet. Wenn der aktuelle Nutzer die Berechtigung zum Exportieren der Daten auf dem Zielserver hat, können die Felder leer bleiben. Sollen jedoch die Daten eines anderen Benutzers importiert werden, sind Benutzername und Kennwort des Benutzers einzutragen. +keepEmptyForDefaultUserAndPassword=Wenn kein Benutzername und kein Kennwort eingetragen werden, wird der aktuelle Benutzer zum importieren verwendet. Wenn der aktuelle Nutzer die Berechtigung zum Exportieren der Daten auf dem Zielserver hat, können die Felder leer bleiben. Sollen jedoch die Daten eines anderen Benutzers importiert werden, sind Benutzername und Kennwort des Benutzers einzutragen. \ No newline at end of file From cea3c9ffb355dbb63e1bbff26a97c449b60b886d Mon Sep 17 00:00:00 2001 From: Dmitry Bilyk Date: Fri, 17 Apr 2020 10:09:11 +0000 Subject: [PATCH 134/188] Updated runtime environment (markdown) --- wiki/info/landscape/runtime-environment.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/wiki/info/landscape/runtime-environment.md b/wiki/info/landscape/runtime-environment.md index 8e9abf45297..f5276522110 100644 --- a/wiki/info/landscape/runtime-environment.md +++ b/wiki/info/landscape/runtime-environment.md @@ -21,6 +21,15 @@ We try to keep important styling information separate in CSS resources which can Java code can be shared between back-end and front-end. This is not only possible by using the com.sap.sailing.gwt.ui.shared package. GWT enables the sharing of an entire OSGi bundle between client and server. As a starting point for this powerful construct we have introduced the bundle com.sap.sailing.domain.common. It has a GWT module descriptor (SailingDomain.gwt.xml) which inside the element has to list the packages to expose, e.g., and currently (with GWT 2.4) has to adhere to the JDK 1.6 language capabilities, in particular disallowing multi-catch clauses and inferred generics. Also, it has to adhere to the rules for GWT's JRE emulation (see, e.g., https://developers.google.com/web-toolkit/doc/latest/DevGuide). The bundle at the same time is a regular OSGi Java bundle, with a regular manifest. Other GWT bundles can use it by including an inherits clause in their specification, as in . With this mechanism, code can easily be shared across client and back-end. +## Running Selenium Tests +To run Selenium Integration UI Tests please do the following: + +* in local-test-environment.xml file adjust the properties according to which browser and driver you'll be using (chromedriver, geckodriver) and what their file system locations are; +* make sure no "Sailing Server ..." launch configuration is currently running; +* start the "Sailing Server (No Proxy, winddbTest).launch" config, it will use a test database in MongoDB so as to not overwrite anything in your local "production" ("winddb") database; it furthermore includes a bundle in the OSGi configuration that enables massive "clear" operations that we don't want to deploy to our production landscape otherwise but which is used by the tests to ensure a clean fresh state when tests start to execute; +* start the "GWT Sailing SDM.launch"; +* start the "Sailing Domain Test (No Proxy" JUnit test launch configuration; + ## Tracking and Wind Sensor Connectors To receive GPS and wind data in near real time, some network programming becomes necessary. Depending on the technology and provider used, a combination of HTTP, TCP and UDP connections is required to obtain live data. Particularly the UDP connectivity was the reason why deploying our solution to SAP NetWeaver Cloud was and still is difficult. From 20ea1756b1038634c1745e94a4a7d274d0fd3d2d Mon Sep 17 00:00:00 2001 From: Dmitry Bilyk Date: Fri, 17 Apr 2020 10:12:14 +0000 Subject: [PATCH 135/188] Updated runtime environment (markdown) --- wiki/info/landscape/runtime-environment.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/wiki/info/landscape/runtime-environment.md b/wiki/info/landscape/runtime-environment.md index f5276522110..5db9b5162e4 100644 --- a/wiki/info/landscape/runtime-environment.md +++ b/wiki/info/landscape/runtime-environment.md @@ -26,9 +26,9 @@ To run Selenium Integration UI Tests please do the following: * in local-test-environment.xml file adjust the properties according to which browser and driver you'll be using (chromedriver, geckodriver) and what their file system locations are; * make sure no "Sailing Server ..." launch configuration is currently running; -* start the "Sailing Server (No Proxy, winddbTest).launch" config, it will use a test database in MongoDB so as to not overwrite anything in your local "production" ("winddb") database; it furthermore includes a bundle in the OSGi configuration that enables massive "clear" operations that we don't want to deploy to our production landscape otherwise but which is used by the tests to ensure a clean fresh state when tests start to execute; -* start the "GWT Sailing SDM.launch"; -* start the "Sailing Domain Test (No Proxy" JUnit test launch configuration; +* start the "Sailing Server (No Proxy, winddbTest)" config, it will use a test database in MongoDB so as to not overwrite anything in your local "production" ("winddb") database; it furthermore includes a bundle in the OSGi configuration that enables massive "clear" operations that we don't want to deploy to our production landscape otherwise but which is used by the tests to ensure a clean fresh state when tests start to execute; +* start the "GWT Sailing SDM" launch configuration; +* start the "Sailing Domain Test (No Proxy)" JUnit test launch configuration; ## Tracking and Wind Sensor Connectors To receive GPS and wind data in near real time, some network programming becomes necessary. Depending on the technology and provider used, a combination of HTTP, TCP and UDP connections is required to obtain live data. Particularly the UDP connectivity was the reason why deploying our solution to SAP NetWeaver Cloud was and still is difficult. From 8a93522f310865b4b94527062f874b59262d8109 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 17 Apr 2020 12:14:23 +0200 Subject: [PATCH 136/188] after TracTrac added eventJSON to all races' parameter sets, the code to obtain it was simplified --- .../impl/TracTracConnectivityParamsHandler.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/java/com.sap.sailing.domain.tractracadapter.persistence/src/com/sap/sailing/domain/tractracadapter/persistence/impl/TracTracConnectivityParamsHandler.java b/java/com.sap.sailing.domain.tractracadapter.persistence/src/com/sap/sailing/domain/tractracadapter/persistence/impl/TracTracConnectivityParamsHandler.java index 1e28e51757e..da03560e4a2 100644 --- a/java/com.sap.sailing.domain.tractracadapter.persistence/src/com/sap/sailing/domain/tractracadapter/persistence/impl/TracTracConnectivityParamsHandler.java +++ b/java/com.sap.sailing.domain.tractracadapter.persistence/src/com/sap/sailing/domain/tractracadapter/persistence/impl/TracTracConnectivityParamsHandler.java @@ -145,13 +145,7 @@ public class TracTracConnectivityParamsHandler extends AbstractRaceTrackingConne private void updatePersistentTracTracConfiguration(RaceTrackingConnectivityParametersImpl params) throws MalformedURLException, IOException, ParseException { - final String EVENT_MANAGER_HOSTNAME_PREFIX = "em."; - final URL paramsJsonUrl = new URL(params.getParamURL().getProtocol(), - params.getParamURL().getHost().startsWith(EVENT_MANAGER_HOSTNAME_PREFIX) ? params.getParamURL().getHost() : EVENT_MANAGER_HOSTNAME_PREFIX+params.getParamURL().getHost(), - "/events/"+params.getTractracRace().getEvent().getId().toString()+"/races/"+params.getTractracRace().getId().toString()+".json"); - final URLConnection conn = HttpUrlConnectionHelper.redirectConnection(paramsJsonUrl); - final JSONObject paramsJson = (JSONObject) new JSONParser().parse(new InputStreamReader(conn.getInputStream())); - final String jsonURL = (String) paramsJson.get("eventJSON"); + final String jsonURL = params.getTractracRace().getParameterSet().getParameter("eventJSON"); final String creatorName = SessionUtils.getPrincipal().toString(); final TracTracConfigurationImpl tracTracConfiguration = new TracTracConfigurationImpl(creatorName, params.getTractracRace().getEvent().getName(), jsonURL, /* live URI */ null, /* stored URI */ null, // we mainly want to enable the user to list the event's races again in case they are removed; live/stored stuff comes from the tracking params From 48ab213d215a69cc1b065335a1a8feb59bf72f07 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 17 Apr 2020 12:16:27 +0200 Subject: [PATCH 137/188] cleaned up warnings --- .../persistence/impl/TracTracConnectivityParamsHandler.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/java/com.sap.sailing.domain.tractracadapter.persistence/src/com/sap/sailing/domain/tractracadapter/persistence/impl/TracTracConnectivityParamsHandler.java b/java/com.sap.sailing.domain.tractracadapter.persistence/src/com/sap/sailing/domain/tractracadapter/persistence/impl/TracTracConnectivityParamsHandler.java index da03560e4a2..10feb5609f3 100644 --- a/java/com.sap.sailing.domain.tractracadapter.persistence/src/com/sap/sailing/domain/tractracadapter/persistence/impl/TracTracConnectivityParamsHandler.java +++ b/java/com.sap.sailing.domain.tractracadapter.persistence/src/com/sap/sailing/domain/tractracadapter/persistence/impl/TracTracConnectivityParamsHandler.java @@ -1,16 +1,12 @@ package com.sap.sailing.domain.tractracadapter.persistence.impl; import java.io.IOException; -import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URI; import java.net.URL; -import java.net.URLConnection; import java.util.HashMap; import java.util.Map; -import org.json.simple.JSONObject; -import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; import com.sap.sailing.domain.racelog.RaceLogStore; @@ -28,7 +24,6 @@ import com.sap.sse.common.impl.MillisecondsDurationImpl; import com.sap.sse.common.impl.MillisecondsTimePoint; import com.sap.sse.security.SecurityService; import com.sap.sse.security.SessionUtils; -import com.sap.sse.util.HttpUrlConnectionHelper; /** * Handles mapping TracTrac connectivity parameters from and to a map with {@link String} keys. The From bf5e06b31d1eb683de2fdea8bddaa7fc45650967 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 17 Apr 2020 13:00:43 +0200 Subject: [PATCH 138/188] refactored constructor cascade of TrackedEventPreference --- .../model/TrackedEventPreference.java | 43 ++++++++----------- .../src/com/sap/sse/common/Util.java | 12 ++++-- 2 files changed, 26 insertions(+), 29 deletions(-) diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/preferences/model/TrackedEventPreference.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/preferences/model/TrackedEventPreference.java index b91e26c82d1..c7b5ca9db43 100644 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/preferences/model/TrackedEventPreference.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/preferences/model/TrackedEventPreference.java @@ -1,7 +1,6 @@ package com.sap.sailing.server.impl.preferences.model; -import java.util.Collection; -import java.util.HashSet; +import java.util.Set; import java.util.UUID; import com.sap.sse.common.Util; @@ -27,38 +26,30 @@ public class TrackedEventPreference extends AbstractGenericSerializableSettings /** copy constructor */ public TrackedEventPreference(TrackedEventPreference other) { - this(); - eventId.setValue(other.getEventId()); - leaderboardName.setValue(other.getLeaderboardName()); - trackedElements.setValues(other.getTrackedElements()); - baseUrl.setValue(other.getBaseUrl()); - isArchived.setValue(other.getIsArchived()); - this.regattaSecret.setValue(other.getRegattaSecret()); + this(other.getEventId(), other.getLeaderboardName(), + other.getTrackedElements(), other.getBaseUrl(), + other.getIsArchived(), other.getRegattaSecret()); } /** copy constructor with new archived state */ public TrackedEventPreference(TrackedEventPreference other, boolean isArchived) { - this(); - eventId.setValue(other.getEventId()); - leaderboardName.setValue(other.getLeaderboardName()); - trackedElements.setValues(other.getTrackedElements()); - baseUrl.setValue(other.getBaseUrl()); - this.isArchived.setValue(isArchived); - this.regattaSecret.setValue(other.getRegattaSecret()); + this(other.getEventId(), other.getLeaderboardName(), + other.getTrackedElements(), other.getBaseUrl(), + isArchived, other.getRegattaSecret()); } /** copy constructor with additional tracked event */ public TrackedEventPreference(TrackedEventPreference other, TrackedElementWithDeviceId trackedElement) { - this(); - eventId.setValue(other.getEventId()); - leaderboardName.setValue(other.getLeaderboardName()); - final Collection trackedElements = new HashSet<>(); - Util.addAll(other.getTrackedElements(), trackedElements); - trackedElements.add(trackedElement); - this.trackedElements.setValues(trackedElements); - baseUrl.setValue(other.getBaseUrl()); - this.isArchived.setValue(other.getIsArchived()); - this.regattaSecret.setValue(other.getRegattaSecret()); + this(other.getEventId(), other.getLeaderboardName(), + addTrackedElement(other.getTrackedElements(), trackedElement), other.getBaseUrl(), + other.getIsArchived(), other.getRegattaSecret()); + } + + private static Iterable addTrackedElement( + Iterable trackedElements, TrackedElementWithDeviceId trackedElement) { + final Set result = Util.asSet(trackedElements); + result.add(trackedElement); + return result; } public TrackedEventPreference(UUID eventId, String leaderboardName, diff --git a/java/com.sap.sse.common/src/com/sap/sse/common/Util.java b/java/com.sap.sse.common/src/com/sap/sse/common/Util.java index 4a72f4cdd7c..eb420f8cff3 100755 --- a/java/com.sap.sse.common/src/com/sap/sse/common/Util.java +++ b/java/com.sap.sse.common/src/com/sap/sse/common/Util.java @@ -757,11 +757,17 @@ public class Util { return result; } - public static List asList(Iterable visibleCourseAreas) { - ArrayList list = new ArrayList(); - addAll(visibleCourseAreas, list); + public static List asList(Iterable iterable) { + final List list = new ArrayList<>(); + addAll(iterable, list); return list; } + + public static Set asSet(Iterable iterable) { + final Set result = new HashSet<>(); + addAll(iterable, result); + return result; + } public static List cloneListOrNull(List list) { final List result; From 75000816ab61fe40aab4b53bbc1cfb956e114403 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 17 Apr 2020 13:43:59 +0200 Subject: [PATCH 139/188] added missing locking for log event traversal in various places --- .../domain/abstractlog/AbstractLog.java | 20 ++++- .../domain/abstractlog/BaseLogAnalyzer.java | 3 + .../analyzing/impl/FinishedTimeFinder.java | 1 - .../analyzing/impl/FinishingTimeFinder.java | 1 - .../race/analyzing/impl/RaceLogAnalyzer.java | 22 +++++ .../abstractlog/race/impl/RaceLogImpl.java | 15 ++-- .../impl/RegattaLogDeviceMappingFinder.java | 24 ++++-- .../domain/base/impl/AbstractRaceColumn.java | 29 ++++--- .../gwt/ui/server/SailingServiceImpl.java | 82 ++++++++++++------- .../gateway/jaxrs/api/RegattasResource.java | 53 +++++++----- 10 files changed, 171 insertions(+), 79 deletions(-) diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/AbstractLog.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/AbstractLog.java index b7afeb40f43..de78553846f 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/AbstractLog.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/AbstractLog.java @@ -1,6 +1,7 @@ package com.sap.sailing.domain.abstractlog; import java.io.Serializable; +import java.util.ConcurrentModificationException; import java.util.HashSet; import java.util.NavigableSet; import java.util.UUID; @@ -57,8 +58,16 @@ extends Track, WithID { */ boolean isEmpty(); + /** + * Callers that want to iterate over the collection returned need to use {@link #lockForRead()} and + * {@link #unlockAfterRead()} to avoid {@link ConcurrentModificationException}s. + */ Iterable getRawFixesDescending(); + /** + * Callers that want to iterate over the collection returned need to use {@link #lockForRead()} and + * {@link #unlockAfterRead()} to avoid {@link ConcurrentModificationException}s. + */ Iterable getFixesDescending(); void addAllListeners(Iterable listeners); @@ -103,14 +112,17 @@ extends Track, WithID { EventT getEventById(Serializable id); /** - * Get a {@link NavigableSet} of unrevoked events regardless of the {@code pass}. Events are sorted by - * their {@link TimePoint} and the oldest is returned first. - * @return + * Get a {@link NavigableSet} of unrevoked events regardless of the {@code pass}. Events are sorted by their + * {@link TimePoint} and the oldest is returned first. Callers that want to iterate over the collection returned + * need to use {@link #lockForRead()} and {@link #unlockAfterRead()} to avoid + * {@link ConcurrentModificationException}s. */ NavigableSet getUnrevokedEvents(); /** - * Get a {@link NavigableSet} of unrevoked events regardless of the {@code pass}. + * Get a {@link NavigableSet} of unrevoked events regardless of the {@code pass}. Callers that want to iterate over + * the collection returned need to use {@link #lockForRead()} and {@link #unlockAfterRead()} to avoid + * {@link ConcurrentModificationException}s. */ NavigableSet getUnrevokedEventsDescending(); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/BaseLogAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/BaseLogAnalyzer.java index d6e33462b4a..d2b90eb52e2 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/BaseLogAnalyzer.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/BaseLogAnalyzer.java @@ -30,6 +30,9 @@ public abstract class BaseLogAnalyzer } } + /** + * Always called under the {@link #getLog() log's} read lock + */ protected abstract ResultT performAnalysis(); protected Iterable getAllEvents() { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/FinishedTimeFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/FinishedTimeFinder.java index 539ddd73683..07034e1211a 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/FinishedTimeFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/FinishedTimeFinder.java @@ -7,7 +7,6 @@ import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sse.common.TimePoint; public class FinishedTimeFinder extends RaceLogAnalyzer { - public FinishedTimeFinder(RaceLog raceLog) { super(raceLog); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/FinishingTimeFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/FinishingTimeFinder.java index 089cdb0f13c..79f32482732 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/FinishingTimeFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/FinishingTimeFinder.java @@ -39,7 +39,6 @@ public class FinishingTimeFinder extends RaceLogAnalyzer { } } } - return null; } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceLogAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceLogAnalyzer.java index 9955db9db88..148c7bf9d17 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceLogAnalyzer.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceLogAnalyzer.java @@ -5,8 +5,10 @@ import com.sap.sailing.domain.abstractlog.impl.AbstractLogImpl; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.tracking.Track; import java.util.ArrayList; +import java.util.ConcurrentModificationException; import java.util.List; public abstract class RaceLogAnalyzer extends BaseLogAnalyzer @@ -16,20 +18,40 @@ public abstract class RaceLogAnalyzer extends BaseLogAnalyzer super(raceLog); } + /** + * Callers that want to iterate over the collection returned need to use {@link Track#lockForRead()} and + * {@link Track#unlockAfterRead()} on the underlying {@link #getLog() log} to avoid + * {@link ConcurrentModificationException}s. + */ protected Iterable getPassEvents() { return log.getFixes(); } + /** + * Callers that want to iterate over the collection returned need to use {@link Track#lockForRead()} and + * {@link Track#unlockAfterRead()} on the underlying {@link #getLog() log} to avoid + * {@link ConcurrentModificationException}s. + */ protected Iterable getPassEventsDescending() { return log.getFixesDescending(); } + /** + * Callers that want to iterate over the collection returned need to use {@link Track#lockForRead()} and + * {@link Track#unlockAfterRead()} on the underlying {@link #getLog() log} to avoid + * {@link ConcurrentModificationException}s. + */ protected Iterable getPassUnrevokedEvents() { final List> validators = new ArrayList<>(); validators.add(new RaceLog.PassValidator(log.getCurrentPassId())); return new AbstractLogImpl.FilteredPartialNavigableSetView<>(log.getUnrevokedEvents(), validators); } + /** + * Callers that want to iterate over the collection returned need to use {@link Track#lockForRead()} and + * {@link Track#unlockAfterRead()} on the underlying {@link #getLog() log} to avoid + * {@link ConcurrentModificationException}s. + */ protected Iterable getPassUnrevokedEventsDescending() { final List> validators = new ArrayList<>(); validators.add(new RaceLog.PassValidator(log.getCurrentPassId())); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogImpl.java index 534fa32a198..82bc588d30c 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogImpl.java @@ -40,11 +40,16 @@ public class RaceLogImpl extends AbstractLogImpl protected void findUnrevokedMappingAndClosingEvents(Map>> events, Map closingEvents) { - for (RegattaLogEvent e : getLog().getUnrevokedEvents()) { - if (e instanceof RegattaLogDeviceMappingEvent && isValidMapping(((RegattaLogDeviceMappingEvent) e))) { - @SuppressWarnings("unchecked") - RegattaLogDeviceMappingEvent mappingEvent = (RegattaLogDeviceMappingEvent) e; - getMappingEventsForItem(events, mappingEvent.getMappedTo()).add(mappingEvent); - } else if (e instanceof RegattaLogCloseOpenEndedDeviceMappingEvent) { - //a higher priority closing events for the same mapping event overwrites the lower priority one - RegattaLogCloseOpenEndedDeviceMappingEvent closingEvent = (RegattaLogCloseOpenEndedDeviceMappingEvent) e; - closingEvents.put(closingEvent.getDeviceMappingEventId(), closingEvent); + final RegattaLog regattaLog = getLog(); + regattaLog.lockForRead(); + try { + for (RegattaLogEvent e : regattaLog.getUnrevokedEvents()) { + if (e instanceof RegattaLogDeviceMappingEvent && isValidMapping(((RegattaLogDeviceMappingEvent) e))) { + @SuppressWarnings("unchecked") + RegattaLogDeviceMappingEvent mappingEvent = (RegattaLogDeviceMappingEvent) e; + getMappingEventsForItem(events, mappingEvent.getMappedTo()).add(mappingEvent); + } else if (e instanceof RegattaLogCloseOpenEndedDeviceMappingEvent) { + //a higher priority closing events for the same mapping event overwrites the lower priority one + RegattaLogCloseOpenEndedDeviceMappingEvent closingEvent = (RegattaLogCloseOpenEndedDeviceMappingEvent) e; + closingEvents.put(closingEvent.getDeviceMappingEventId(), closingEvent); + } } + } finally { + regattaLog.unlockAfterRead(); } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java index 363c67afbf0..2e49291ab4e 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java @@ -389,19 +389,28 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem } Set competitorSet = new HashSet(); Util.addAll(competitors, competitorSet); - RaceLog raceLog = getRaceLog(fleet); - for (RaceLogEvent event : raceLog.getUnrevokedEventsDescending()) { - if (event instanceof RegisterCompetitorEvent) { - RegisterCompetitorEvent registerEvent = (RegisterCompetitorEvent) event; - if (competitorSet.contains(registerEvent.getCompetitor())) { - try { - raceLog.revokeEvent(raceLogEventAuthorForRaceColumn, event, - "unregistering competitor because no longer selected for registration"); - } catch (NotRevokableException e) { - logger.log(Level.WARNING, "could not unregister competitor by adding RevokeEvent", e); + final RaceLog raceLog = getRaceLog(fleet); + final Set competitorRegistrationEventsToRevoke = new HashSet<>(); + raceLog.lockForRead(); + try { + for (RaceLogEvent event : raceLog.getUnrevokedEventsDescending()) { + if (event instanceof RegisterCompetitorEvent) { + RegisterCompetitorEvent registerEvent = (RegisterCompetitorEvent) event; + if (competitorSet.contains(registerEvent.getCompetitor())) { + competitorRegistrationEventsToRevoke.add(event); } } } + } finally { + raceLog.unlockAfterRead(); + } + for (final RaceLogEvent eventToRevoke : competitorRegistrationEventsToRevoke) { + try { + raceLog.revokeEvent(raceLogEventAuthorForRaceColumn, eventToRevoke, + "unregistering competitor because no longer selected for registration"); + } catch (NotRevokableException e) { + logger.log(Level.WARNING, "could not unregister competitor by adding RevokeEvent", e); + } } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index d7ce0d26a00..feb8b2f22a6 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -6165,15 +6165,20 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet public boolean unlinkBoatFromCompetitorForRace(String leaderboardName, String raceColumnName, String fleetName, String competitorIdAsString) throws NotFoundException { getSecurityService().checkCurrentUserUpdatePermission(getLeaderboardByName(leaderboardName)); - boolean result = false; - Competitor existingCompetitor = getService().getCompetitorAndBoatStore().getExistingCompetitorByIdAsString(competitorIdAsString); - RaceLog raceLog = getService().getRaceLog(leaderboardName, raceColumnName, fleetName); + final boolean result; + final Competitor existingCompetitor = getService().getCompetitorAndBoatStore().getExistingCompetitorByIdAsString(competitorIdAsString); + final RaceLog raceLog = getService().getRaceLog(leaderboardName, raceColumnName, fleetName); if (raceLog != null && existingCompetitor != null) { - List linkEventsToRevoke = new ArrayList<>(); - for (RaceLogEvent event : raceLog.getUnrevokedEventsDescending()) { - if (event instanceof RaceLogRegisterCompetitorEvent) { - linkEventsToRevoke.add((RaceLogRegisterCompetitorEvent) event); + final List linkEventsToRevoke = new ArrayList<>(); + raceLog.lockForRead(); + try { + for (RaceLogEvent event : raceLog.getUnrevokedEventsDescending()) { + if (event instanceof RaceLogRegisterCompetitorEvent) { + linkEventsToRevoke.add((RaceLogRegisterCompetitorEvent) event); + } } + } finally { + raceLog.unlockAfterRead(); } try { for (RaceLogRegisterCompetitorEvent eventToRevoke : linkEventsToRevoke) { @@ -6182,9 +6187,10 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet } catch (NotRevokableException e) { logger.log(Level.WARNING, "Could not unlink competitor from boat by adding RevokeEvent", e); } - result = true; - } + } else { + result = false; + } return result; } @@ -7411,16 +7417,21 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet public void updateFixedMarkPassing(String leaderboardName, String raceColumnName, String fleetName, Integer indexOfWaypoint, Date dateOfMarkPassing, CompetitorDTO competitorDTO) throws NotFoundException { getSecurityService().checkCurrentUserUpdatePermission(getLeaderboardByName(leaderboardName)); - RaceLog raceLog = getService().getRaceLog(leaderboardName, raceColumnName, fleetName); - Competitor competitor = getCompetitor(competitorDTO); + final RaceLog raceLog = getService().getRaceLog(leaderboardName, raceColumnName, fleetName); + final Competitor competitor = getCompetitor(competitorDTO); RaceLogFixedMarkPassingEvent oldFixedMarkPassingEvent = null; - for (RaceLogEvent event : raceLog.getUnrevokedEvents()) { - if (event instanceof RaceLogFixedMarkPassingEventImpl && event.getInvolvedCompetitors().contains(competitor)) { - RaceLogFixedMarkPassingEvent fixedEvent = (RaceLogFixedMarkPassingEvent) event; - if (Util.equalsWithNull(fixedEvent.getZeroBasedIndexOfPassedWaypoint(), indexOfWaypoint)) { - oldFixedMarkPassingEvent = fixedEvent; + raceLog.lockForRead(); + try { + for (RaceLogEvent event : raceLog.getUnrevokedEvents()) { + if (event instanceof RaceLogFixedMarkPassingEventImpl && event.getInvolvedCompetitors().contains(competitor)) { + RaceLogFixedMarkPassingEvent fixedEvent = (RaceLogFixedMarkPassingEvent) event; + if (Util.equalsWithNull(fixedEvent.getZeroBasedIndexOfPassedWaypoint(), indexOfWaypoint)) { + oldFixedMarkPassingEvent = fixedEvent; + } } } + } finally { + raceLog.unlockAfterRead(); } if (oldFixedMarkPassingEvent != null) { try { @@ -7441,16 +7452,20 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet Integer newZeroBasedIndexOfSuppressedMarkPassing, CompetitorDTO competitorDTO) throws NotFoundException { getSecurityService().checkCurrentUserUpdatePermission(getLeaderboardByName(leaderboardName)); RaceLogSuppressedMarkPassingsEvent oldSuppressedMarkPassingEvent = null; - RaceLog raceLog = getService().getRaceLog(leaderboardName, raceColumnName, fleetName); - Competitor competitor = getCompetitor(competitorDTO); - NavigableSet unrevokedEvents = raceLog.getUnrevokedEvents(); - for (RaceLogEvent event : unrevokedEvents) { - if (event instanceof RaceLogSuppressedMarkPassingsEvent && event.getInvolvedCompetitors().contains(competitor)) { - oldSuppressedMarkPassingEvent = (RaceLogSuppressedMarkPassingsEvent) event; - break; + final RaceLog raceLog = getService().getRaceLog(leaderboardName, raceColumnName, fleetName); + final Competitor competitor = getCompetitor(competitorDTO); + raceLog.lockForRead(); + try { + final NavigableSet unrevokedEvents = raceLog.getUnrevokedEvents(); + for (RaceLogEvent event : unrevokedEvents) { + if (event instanceof RaceLogSuppressedMarkPassingsEvent && event.getInvolvedCompetitors().contains(competitor)) { + oldSuppressedMarkPassingEvent = (RaceLogSuppressedMarkPassingsEvent) event; + break; + } } + } finally { + raceLog.unlockAfterRead(); } - final boolean create; final boolean revoke; if (oldSuppressedMarkPassingEvent == null) { @@ -7476,6 +7491,7 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet try { raceLog.revokeEvent(getService().getServerAuthor(), oldSuppressedMarkPassingEvent); } catch (NotRevokableException e) { + logger.log(Level.SEVERE, "Unable to revoke event "+oldSuppressedMarkPassingEvent, e); } } if (create) { @@ -8458,13 +8474,19 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet result.clear(); for (RaceColumn raceColumn : leaderboard.getRaceColumns()) { for (Fleet fleet: raceColumn.getFleets()) { - NavigableSet set=raceColumn.getRaceLog(fleet).getUnrevokedEvents(); - for (RaceLogEvent raceLogEvent : set) { - if (raceLogEvent instanceof RaceLogDenoteForTrackingEvent) { - RaceLogDenoteForTrackingEvent denoteEvent = (RaceLogDenoteForTrackingEvent) raceLogEvent; - result.add(denoteEvent.getRaceName()); - break; + final RaceLog raceLog = raceColumn.getRaceLog(fleet); + raceLog.lockForRead(); + try { + final NavigableSet set = raceLog.getUnrevokedEvents(); + for (RaceLogEvent raceLogEvent : set) { + if (raceLogEvent instanceof RaceLogDenoteForTrackingEvent) { + RaceLogDenoteForTrackingEvent denoteEvent = (RaceLogDenoteForTrackingEvent) raceLogEvent; + result.add(denoteEvent.getRaceName()); + break; + } } + } finally { + raceLog.unlockAfterRead(); } } } diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RegattasResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RegattasResource.java index b4e7806be1f..f732ad6c93a 100755 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RegattasResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RegattasResource.java @@ -543,15 +543,20 @@ public class RegattasResource extends AbstractSailingServerResource { // Check regattalog if device has been already registered to this regatta boolean duplicateDeviceId = false; if (checkInCompetitor) { - RegattaLog regattaLog = regatta.getRegattaLog(); - duplicateDeviceId = regattaLog.getUnrevokedEvents().stream().anyMatch(event -> { - if (event instanceof RegattaLogDeviceCompetitorMappingEvent) { - return deviceUuid.equals( - ((RegattaLogDeviceCompetitorMappingEvent) event).getDevice().getStringRepresentation()); - } else { - return false; - } - }); + final RegattaLog regattaLog = regatta.getRegattaLog(); + regattaLog.lockForRead(); + try { + duplicateDeviceId = regattaLog.getUnrevokedEvents().stream().anyMatch(event -> { + if (event instanceof RegattaLogDeviceCompetitorMappingEvent) { + return deviceUuid.equals( + ((RegattaLogDeviceCompetitorMappingEvent) event).getDevice().getStringRepresentation()); + } else { + return false; + } + }); + } finally { + regattaLog.unlockAfterRead(); + } } if (duplicateDeviceId) { response = this.getAlreadyRegisteredDeviceErrorResponse(regattaName, deviceUuid); @@ -740,18 +745,28 @@ public class RegattasResource extends AbstractSailingServerResource { if (!regatta.getRegistrationLinkSecret().equals(registrationLinkSecret)) { return getBadRegattaRegistrationTypeErrorResponse(regattaName); } - for (RegattaLogEvent event : regatta.getRegattaLog().getUnrevokedEvents()) { - if (event instanceof RegattaLogDeviceCompetitorMappingEvent) { - try { - regatta.getRegattaLog().revokeEvent( - new LogEventAuthorImpl(user == null ? "anonymous" : user.getFullName(), 0), event, - "deregister device " + ((RegattaLogDeviceCompetitorMappingEvent) event).getDevice() - .getStringRepresentation()); - } catch (NotRevokableException e) { - return getDeregisterCompetitorErrorResponse(regattaName, competitorIdAsString, e.getMessage()); + final RegattaLog regattaLog = regatta.getRegattaLog(); + final Set eventsToRevoke = new HashSet<>(); + regattaLog.lockForRead(); + try { + for (RegattaLogEvent event : regattaLog.getUnrevokedEvents()) { + if (event instanceof RegattaLogDeviceCompetitorMappingEvent) { + eventsToRevoke.add((RegattaLogDeviceCompetitorMappingEvent) event); } } - }; + } finally { + regattaLog.unlockAfterRead(); + } + for (final RegattaLogDeviceCompetitorMappingEvent eventToRevoke : eventsToRevoke) { + try { + regattaLog.revokeEvent( + new LogEventAuthorImpl(user == null ? "anonymous" : user.getFullName(), 0), eventToRevoke, + "deregister device " + eventToRevoke.getDevice() + .getStringRepresentation()); + } catch (NotRevokableException e) { + return getDeregisterCompetitorErrorResponse(regattaName, competitorIdAsString, e.getMessage()); + } + } } else { subject.checkPermission( SecuredDomainType.REGATTA.getStringPermissionForObject(DefaultActions.UPDATE, regatta)); From ac18e93e4c39b408ec3754e4b812491b0c55150d Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 17 Apr 2020 13:57:38 +0200 Subject: [PATCH 140/188] relax check for tracked elements in TrackedEventsResource; can now be empty or missing --- .../jaxrs/api/TrackedEventsResource.java | 75 +++++-------------- 1 file changed, 19 insertions(+), 56 deletions(-) diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/TrackedEventsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/TrackedEventsResource.java index 1c13c74af26..8a0b4912a07 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/TrackedEventsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/TrackedEventsResource.java @@ -57,29 +57,22 @@ public class TrackedEventsResource extends AbstractSailingServerResource { @GET @Produces("application/json;charset=UTF-8") public Response getTrackedEvents(@QueryParam(KEY_QUERY_INCLUDE_ARCHIVED) String includeArchivedStr) { - final User currentUser = getSecurityService().getCurrentUser(); final ResponseBuilder builder; - // check if user logged in if (currentUser != null) { - // load tracked events from storage final TrackedEventPreferences prefs = getSecurityService().getPreferenceObject(currentUser.getName(), SailingPreferences.TRACKED_EVENTS_PREFERENCES); - final JSONArray result = new JSONArray(); final boolean includeArchived = Boolean.parseBoolean(includeArchivedStr); - if (prefs != null) { // iterate all stored tracked events for (final TrackedEventPreference pref : prefs.getTrackedEvents()) { - if (!includeArchived && pref.getIsArchived()) { // skip, if event is archived and should be filtered out continue; } - final JSONObject jsonEvent = new JSONObject(); jsonEvent.put(KEY_EVENT_ID, pref.getEventId().toString()); jsonEvent.put(KEY_EVENT_REGATTA_SECRET, pref.getRegattaSecret()); @@ -90,7 +83,6 @@ public class TrackedEventsResource extends AbstractSailingServerResource { result.add(jsonEvent); } } - // storage was empty -> respond with empty list final JSONObject resultEvents = new JSONObject(); resultEvents.put(KEY_TRACKED_EVENTS, result); @@ -127,9 +119,7 @@ public class TrackedEventsResource extends AbstractSailingServerResource { @PathParam(KEY_LEADERBOARD_NAME) String leaderboardName, String jsonBody) { ResponseBuilder responseBuilder = null; final User currentUser = getSecurityService().getCurrentUser(); - if (currentUser != null) { - try { final Object requestBody = JSONValue.parseWithException(jsonBody); final JSONObject requestObject = Helpers.toJSONObjectSafe(requestBody); @@ -139,75 +129,53 @@ public class TrackedEventsResource extends AbstractSailingServerResource { try { final UUID uuidEvent = UUID.fromString(eventId); final boolean isArchived = archived; - TrackedEventPreferences prefs = getSecurityService().getPreferenceObject(currentUser.getName(), SailingPreferences.TRACKED_EVENTS_PREFERENCES); - if (prefs == null) { prefs = new TrackedEventPreferences(); } - final JSONArray trackedElementsJson = (JSONArray) requestObject.get(KEY_EVENT_TRACKED_ELEMENTS); - - // check that exactly one trackedElement is in JSON - if (trackedElementsJson == null || trackedElementsJson.size() == 0) { - // too few children - responseBuilder = Response.status(Status.BAD_REQUEST) - .entity("Invalid JSON body in request: Tracked element is missing."); - } else { - - // Copy tracked event preference objects to new list while removing the changed - // event/leaderboard node - final Collection prefsNew = // - StreamSupport.stream(prefs.getTrackedEvents().spliterator(), false) - .filter(pref -> !(pref.getEventId().equals(uuidEvent) - && pref.getLeaderboardName().equals(leaderboardName))) - .collect(Collectors.toList()); - - // Create new tracked elements for this event/leaderboard from JSON body - final Collection trackedElements = new ArrayList<>(); - - for (int i = 0; i < trackedElementsJson.size(); i++) { - final JSONObject jsonTrackedElement = (JSONObject) trackedElementsJson.get(i); - + // Copy tracked event preference objects to new list while removing the changed + // event/leaderboard node + final Collection prefsNew = // + StreamSupport.stream(prefs.getTrackedEvents().spliterator(), false) + .filter(pref -> !(pref.getEventId().equals(uuidEvent) + && pref.getLeaderboardName().equals(leaderboardName))) + .collect(Collectors.toList()); + // Create new tracked elements for this event/leaderboard from JSON body + final Collection trackedElements = new ArrayList<>(); + if (trackedElementsJson != null) { + for (final Object trackedElementObject : trackedElementsJson) { + final JSONObject jsonTrackedElement = (JSONObject) trackedElementObject; // parse IDs final String deviceId = (String) jsonTrackedElement.get(KEY_TRACKED_ELEMENT_DEVICE_ID); final String competitorIdStr = (String) jsonTrackedElement .get(KEY_TRACKED_ELEMENT_COMPETITOR_ID); final String boatIdStr = (String) jsonTrackedElement.get(KEY_TRACKED_ELEMENT_BOAT_ID); final String markIdStr = (String) jsonTrackedElement.get(KEY_TRACKED_ELEMENT_MARK_ID); - // parse UUIDs of tracked element final UUID competitorId = parseUUID(competitorIdStr); final UUID boatId = parseUUID(boatIdStr); final UUID markId = parseUUID(markIdStr); - if (boatId != null ^ markId != null ^ competitorId != null) { - // create TrackedElementWithID holder final TrackedElementWithDeviceId newPrefElem = new TrackedElementWithDeviceId(deviceId, boatId, competitorId, markId); trackedElements.add(newPrefElem); - } else { // no boatId, competitorId or markId were specified responseBuilder = Response.status(Status.BAD_REQUEST) .entity("Invalid JSON body in request."); } - } - - final TrackedEventPreference newPreference = new TrackedEventPreference(uuidEvent, - leaderboardName, trackedElements, baseUrl, isArchived, regattaSecret); - prefsNew.add(newPreference); - - prefs.setTrackedEvents(prefsNew); - - getSecurityService().setPreferenceObject(currentUser.getName(), - SailingPreferences.TRACKED_EVENTS_PREFERENCES, prefs); - responseBuilder = Response.status(Status.ACCEPTED); } - + final TrackedEventPreference newPreference = new TrackedEventPreference(uuidEvent, + leaderboardName, trackedElements, baseUrl, isArchived, regattaSecret); + prefsNew.add(newPreference); + prefs.setTrackedEvents(prefsNew); + getSecurityService().setPreferenceObject(currentUser.getName(), + SailingPreferences.TRACKED_EVENTS_PREFERENCES, prefs); + responseBuilder = Response.status(Status.ACCEPTED); } catch (IllegalArgumentException | ClassCastException e) { responseBuilder = Response.status(Status.BAD_REQUEST) .entity("Invalid or missing attributes in JSON body."); @@ -258,21 +226,17 @@ public class TrackedEventsResource extends AbstractSailingServerResource { Function function) { ResponseBuilder responseBuilder; final User currentUser = getSecurityService().getCurrentUser(); - if (currentUser != null) { - final TrackedEventPreferences prefs = getSecurityService().getPreferenceObject(currentUser.getName(), SailingPreferences.TRACKED_EVENTS_PREFERENCES); try { // parse tracked event UUID final UUID eventUuid = UUID.fromString(eventId); - if (prefs == null) { // storage is empty responseBuilder = Response.status(Status.NOT_FOUND) .entity("No tracked events with this eventId found."); } else { - // iterate stored preferences until tracked event with corresponding eventId is found boolean found = false; final Collection newPrefs = new HashSet<>(); @@ -300,7 +264,6 @@ public class TrackedEventsResource extends AbstractSailingServerResource { SailingPreferences.TRACKED_EVENTS_PREFERENCES, prefs); responseBuilder = Response.status(Status.ACCEPTED); } - } } catch (IllegalArgumentException e) { // eventId parameter could not be parsed From af2209275acc2ef39841ff00a637950c8d89e96c Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 17 Apr 2020 14:27:31 +0200 Subject: [PATCH 141/188] use exactly one validator in FilteredPartialNavigableSetView --- .../test/FinishedTimeFinderTest.java | 8 ------ .../test/FinishingTimeFinderTest.java | 8 ------ .../abstractlog/impl/AbstractLogImpl.java | 27 +++++++------------ .../race/analyzing/impl/RaceLogAnalyzer.java | 14 +++------- .../abstractlog/race/impl/RaceLogImpl.java | 13 +-------- 5 files changed, 15 insertions(+), 55 deletions(-) diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/FinishedTimeFinderTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/FinishedTimeFinderTest.java index 4f758b0bade..b9f3abc2125 100644 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/FinishedTimeFinderTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/FinishedTimeFinderTest.java @@ -46,10 +46,8 @@ public class FinishedTimeFinderTest extends PassAwareRaceLogAnalyzerTest implements AbstractLog { @Override public NavigableSet getUnrevokedEvents() { - final List> validators = new ArrayList<>(); - validators.add(new RevokedValidator<>(revokedEventIds)); - return new FilteredPartialNavigableSetView<>(super.getInternalFixes(), validators); + return new FilteredPartialNavigableSetView<>(super.getInternalFixes(), new RevokedValidator<>(revokedEventIds)); } @Override public NavigableSet getUnrevokedEventsDescending() { - final List> validators = new ArrayList<>(); - validators.add(new RevokedValidator<>(revokedEventIds)); - return new FilteredPartialNavigableSetView(super.getInternalFixes().descendingSet(), validators); + return new FilteredPartialNavigableSetView(super.getInternalFixes().descendingSet(), new RevokedValidator<>(revokedEventIds)); } @Override @@ -389,6 +383,7 @@ extends TrackImpl implements AbstractLog { add(revokeEvent); } + @FunctionalInterface public interface NavigableSetViewValidator { boolean isValid(T item); } @@ -407,21 +402,19 @@ extends TrackImpl implements AbstractLog { } public static class FilteredPartialNavigableSetView extends PartialNavigableSetView { - private final List> validators; + private final NavigableSetViewValidator validator; - public FilteredPartialNavigableSetView(NavigableSet set, final List> validators) { + public FilteredPartialNavigableSetView(NavigableSet set, final NavigableSetViewValidator validator) { super(set); - this.validators = validators; + if (validator == null) { + throw new NullPointerException(); + } + this.validator = validator; } @Override protected boolean isValid(T t) { - for (NavigableSetViewValidator validator : validators) { - if (!validator.isValid(t)) { - return false; - } - } - return true; + return validator.isValid(t); } } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceLogAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceLogAnalyzer.java index 148c7bf9d17..3a737723c63 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceLogAnalyzer.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceLogAnalyzer.java @@ -1,5 +1,7 @@ package com.sap.sailing.domain.abstractlog.race.analyzing.impl; +import java.util.ConcurrentModificationException; + import com.sap.sailing.domain.abstractlog.BaseLogAnalyzer; import com.sap.sailing.domain.abstractlog.impl.AbstractLogImpl; import com.sap.sailing.domain.abstractlog.race.RaceLog; @@ -7,10 +9,6 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; import com.sap.sailing.domain.tracking.Track; -import java.util.ArrayList; -import java.util.ConcurrentModificationException; -import java.util.List; - public abstract class RaceLogAnalyzer extends BaseLogAnalyzer { @@ -42,9 +40,7 @@ public abstract class RaceLogAnalyzer extends BaseLogAnalyzer * {@link ConcurrentModificationException}s. */ protected Iterable getPassUnrevokedEvents() { - final List> validators = new ArrayList<>(); - validators.add(new RaceLog.PassValidator(log.getCurrentPassId())); - return new AbstractLogImpl.FilteredPartialNavigableSetView<>(log.getUnrevokedEvents(), validators); + return new AbstractLogImpl.FilteredPartialNavigableSetView<>(log.getUnrevokedEvents(), new RaceLog.PassValidator(log.getCurrentPassId())); } /** @@ -53,8 +49,6 @@ public abstract class RaceLogAnalyzer extends BaseLogAnalyzer * {@link ConcurrentModificationException}s. */ protected Iterable getPassUnrevokedEventsDescending() { - final List> validators = new ArrayList<>(); - validators.add(new RaceLog.PassValidator(log.getCurrentPassId())); - return new AbstractLogImpl.FilteredPartialNavigableSetView<>(log.getUnrevokedEventsDescending(), validators); + return new AbstractLogImpl.FilteredPartialNavigableSetView<>(log.getUnrevokedEventsDescending(), new RaceLog.PassValidator(log.getCurrentPassId())); } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogImpl.java index 82bc588d30c..140f89cd242 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogImpl.java @@ -1,8 +1,6 @@ package com.sap.sailing.domain.abstractlog.race.impl; import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; import java.util.NavigableSet; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; @@ -53,11 +51,6 @@ public class RaceLogImpl extends AbstractLogImpl getInternalFixes() { - final List> validators = new ArrayList<>(); - validators.add(new PassValidator(getCurrentPassId())); - return new FilteredPartialNavigableSetView<>(super.getInternalFixes(), validators); + return new FilteredPartialNavigableSetView<>(super.getInternalFixes(), new PassValidator(getCurrentPassId())); } - - } From 19560277ac7b811585dc2e58ba237bdac4006857 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 17 Apr 2020 15:02:51 +0200 Subject: [PATCH 142/188] added Javadoc --- .../sap/sailing/domain/abstractlog/impl/AbstractLogImpl.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogImpl.java index 3d15c2d772d..d9fc807d5c0 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogImpl.java @@ -388,6 +388,10 @@ extends TrackImpl implements AbstractLog { boolean isValid(T item); } + /** + * Considers an event valid if it is not a {@link RevokeEvent} and is not contained in the set of events passed to + * the constructor that have been revoked. + */ public static class RevokedValidator, VisitorT> implements NavigableSetViewValidator { final Set revokedEventIds; From 389acf2371488af7273a305b878603a7641845d4 Mon Sep 17 00:00:00 2001 From: Alexandr Timoshenko Date: Fri, 17 Apr 2020 17:08:51 +0200 Subject: [PATCH 143/188] code review fixes --- .../racecommittee/app/domain/ManagedRace.java | 2 +- .../app/domain/impl/ManagedRaceImpl.java | 38 ++++++++----------- .../raceinfo/RaceSummaryFragment.java | 3 +- 3 files changed, 17 insertions(+), 26 deletions(-) diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/ManagedRace.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/ManagedRace.java index 68f73ff8b9f..d5dbf587ea9 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/ManagedRace.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/ManagedRace.java @@ -120,5 +120,5 @@ public interface ManagedRace extends FilterableRace, ManagedRaceIdentifier, Name Result revokeFinishing(AbstractLogEventAuthor author); - Result revokeFinish(AbstractLogEventAuthor author); + Result revokeFinished(AbstractLogEventAuthor author); } \ No newline at end of file diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/ManagedRaceImpl.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/ManagedRaceImpl.java index 20b98c358d1..0f46c08bea0 100755 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/ManagedRaceImpl.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/ManagedRaceImpl.java @@ -31,8 +31,6 @@ import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; -import java.util.function.Function; - public class ManagedRaceImpl implements ManagedRace { private static final long serialVersionUID = -4936566684992524001L; private final ManagedRaceIdentifier identifier; @@ -45,28 +43,22 @@ public class ManagedRaceImpl implements ManagedRace { private final int zeroBasedIndexInFleet; /** - * @param zeroBasedIndexInFleet A Series offers a sequence of RaceColumns, each of them split - * according to the Fleets modeled for the - * Series. A {@link RaceCell} describes a "slot" in this grid, defined by the series, the fleet - * and the - * race column. While this object's {@link #getName() name} represents the race column's name, - * this - * doesn't tell anything about the "horizontal" position in the "grid" or in other words what - * the index - * is of the race column in which this cell lies. - *

    + * @param zeroBasedIndexInFleet + * A Series offers a sequence of RaceColumns, each of them split according to the Fleets modeled for the + * Series. A {@link RaceCell} describes a "slot" in this grid, defined by the series, the fleet and the + * race column. While this object's {@link #getName() name} represents the race column's name, this + * doesn't tell anything about the "horizontal" position in the "grid" or in other words what the index + * is of the race column in which this cell lies. + *

    * - * Indices returned by this method start with zero, meaning the first race column in the series. - * This - * corresponds to what one would get by asking {@link Util#indexOf(Iterable, Object) - * Util.indexOf(series.getRaceColumns(), thisCellsRaceColumn)}, except in case the first race - * column is a - * "virtual" one that holds a non-discardable carry-forward result. In this case, the second - * Race Column, - * which is the first "non-virtual" one, receives index 0. + * Indices returned by this method start with zero, meaning the first race column in the series. This + * corresponds to what one would get by asking {@link Util#indexOf(Iterable, Object) + * Util.indexOf(series.getRaceColumns(), thisCellsRaceColumn)}, except in case the first race column is a + * "virtual" one that holds a non-discardable carry-forward result. In this case, the second Race Column, + * which is the first "non-virtual" one, receives index 0. */ private ManagedRaceImpl(ManagedRaceIdentifier identifier, double factor, Double explicitFactor, - int zeroBasedIndexInFleet) { + int zeroBasedIndexInFleet) { this.identifier = identifier; this.competitorsAndBoats = new HashMap<>(); this.courseOnServer = null; @@ -81,7 +73,7 @@ public class ManagedRaceImpl implements ManagedRace { } public ManagedRaceImpl(ManagedRaceIdentifier identifier, ManagedRaceCalculator calculator, double factor, - Double explicitFactor, int zeroBasedIndexInFleet) { + Double explicitFactor, int zeroBasedIndexInFleet) { this(identifier, factor, explicitFactor, zeroBasedIndexInFleet); this.calculator = calculator; } @@ -178,7 +170,7 @@ public class ManagedRaceImpl implements ManagedRace { } @Override - public Result revokeFinish(AbstractLogEventAuthor author) { + public Result revokeFinished(AbstractLogEventAuthor author) { final Result result = new Result(); final FinishedTimeFinder ftf = new FinishedTimeFinder(getRaceLog()); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/RaceSummaryFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/RaceSummaryFragment.java index edd636c0df5..b3b0488c3b2 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/RaceSummaryFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/RaceSummaryFragment.java @@ -1,6 +1,5 @@ package com.sap.sailing.racecommittee.app.ui.fragments.raceinfo; -import com.sap.sailing.racecommittee.app.AppConstants; import com.sap.sse.common.impl.MillisecondsTimePoint; import java.util.Calendar; @@ -105,7 +104,7 @@ public class RaceSummaryFragment extends BaseFragment { revokeFinish.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - getRace().revokeFinish(preferences.getAuthor()); + getRace().revokeFinished(preferences.getAuthor()); } }); } From 21e5d63ccbcc7c9982bff440cf0c993646faea21 Mon Sep 17 00:00:00 2001 From: Alessandro Stolten Date: Fri, 17 Apr 2020 15:48:04 +0000 Subject: [PATCH 144/188] Updated support email (markdown) --- wiki/info/landscape/support-email.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/wiki/info/landscape/support-email.md b/wiki/info/landscape/support-email.md index ffd8995cb44..e95e5d17d33 100644 --- a/wiki/info/landscape/support-email.md +++ b/wiki/info/landscape/support-email.md @@ -1,15 +1,14 @@ # Set Up of Support E Mail Address support@sapsailing.com with AWS SES/SNS/Lambda -We use AWS SES for all e-mail services, inbound and outbound. See also [Amazon Simple Email Service (SES) Set-Up](wiki/info/landscape/mail-relaying) for details on the general SES set-up. We have established ``support@sapsailing.com`` now as another inbound e-mail address that forwards to an SNS topic named ``Support-Mail``. +We use AWS SES for all e-mail services, inbound and outbound. See also [Amazon Simple Email Service (SES) Set-Up](wiki/info/landscape/mail-relaying) for details on the general SES set-up. We have established ``support@sapsailing.com`` now as another inbound e-mail address that stores the incoming email messages in a S3 bucket called ``SupportMails``. After being stored, they will notify a SNS topic called ``SupportMailStoredInS3``. -The messages forwarded from SES to SNS are JSON-formatted wrappers around the original e-mail message augmented with various meta-data. Forwarding these messages with a straight SNS subscription of type EMAIL results in human-unreadable e-mails in JSON format with all the metadata included. +From there a Lambda function picks them up, modifies the original headers and sends out the Email to a JSON array of recipients, configurable in the ``MailRecipientsJSON`` environment variable of the ``support-email-forwarding-python`` Lambda. -Instead, we subscribe a Lambda function on the ``Support-Mail`` SNS topic that parses the original message from the JSON document and re-sends it through SES to a list of recipients that can be configured in the ``to_address`` environment variable used by the Lambda. The ``to_address`` environment variable needs to be a valid JSON array that contains the recipients' e-mail addresses as string objects. +The Lambda preserves the original ``From`` and ``To`` headers by adding the value to new headers called ``X-From`` and ``X-To``. In addition it sets the ``Reply-To`` header field to the initial ``From`` value if blank. The new ``From`` value is configured in the ``MailSender`` environment variable, currently set to: ``SES Email Forwarder ``. -The role that is created to execute the Lambda needs to have a policy set that can access SES and write logs. See also https://github.com/sirceljm/AWS-SES-simple-mail-forward/blob/master/mail_forward_policy.json. +The role that is created to execute the Lambda needs to have a policy set that can access SES and write logs. See also [https://aws.amazon.com/blogs/messaging-and-targeting/forward-incoming-email-to-an-external-destination/](https://aws.amazon.com/blogs/messaging-and-targeting/forward-incoming-email-to-an-external-destination/) -The relevant files have been committed to our git as ``configuration/mail_forward.js`` for the Lambda's code, and as ``configuration/mail_forward_policy.json`` for the security policy for the IAM role used for the Lambda. +The relevant files have been committed to our git as ``configuration/mail_forward.py`` for the Lambda's code, and as ``configuration/mail_forward_policy.json`` for the security policy for the IAM role used for the Lambda. ## Changing the List of Recipients - -Go to [https://eu-west-1.console.aws.amazon.com/lambda/home?region=eu-west-1#/functions/email-forward?tab=configuration](https://eu-west-1.console.aws.amazon.com/lambda/home?region=eu-west-1#/functions/email-forward?tab=configuration) and edit the ``to_address`` environment variable accordingly. \ No newline at end of file +Go to [https://eu-west-1.console.aws.amazon.com/lambda/home?region=eu-west-1#/functions/support-email-forwarding-python?tab=configuration](https://eu-west-1.console.aws.amazon.com/lambda/home?region=eu-west-1#/functions/support-email-forwarding-python?tab=configuration) and edit the ``MailRecipientsJSON`` environment variable accordingly. \ No newline at end of file From 69a3f36a473874383daed1fa8065123f6e39562d Mon Sep 17 00:00:00 2001 From: Alessandro Stoltenberg Date: Fri, 17 Apr 2020 17:48:17 +0200 Subject: [PATCH 145/188] AWS Lambda configuration --- configuration/mail_forward.js | 38 ---------- configuration/mail_forward.py | 98 ++++++++++++++++++++++++++ configuration/mail_forward_policy.json | 46 ++++++------ 3 files changed, 124 insertions(+), 58 deletions(-) delete mode 100644 configuration/mail_forward.js create mode 100644 configuration/mail_forward.py diff --git a/configuration/mail_forward.js b/configuration/mail_forward.js deleted file mode 100644 index 6bc037db681..00000000000 --- a/configuration/mail_forward.js +++ /dev/null @@ -1,38 +0,0 @@ -// Taken from https://github.com/sirceljm/AWS-SES-simple-mail-forward/blob/master/mail_forward.js -// Install as an AWS Lambda according to https://github.com/sirceljm/AWS-SES-simple-mail-forward -// and configure the to_address environment variable as a JSON array of strings representing -// the recipients' e-mail addresses. Subscribe the lambda to your SNS topic that receives the -// notification messages about your inbound e-mail. Use mail_forward_policy.json for the IAM role's -// security policy. -var AWS = require("aws-sdk"); -var ses = new AWS.SES(); - -exports.handler = (event, context, callback) => { - let data = JSON.parse(event.Records[0].Sns.Message); - let source = data.content; - - source = source.replace(/^DKIM-Signature/im, "X-Original-DKIM-Signature"); - // source = source.replace(/^From/im, "X-Original-From"); - // source = source.replace(/^Source/im, "X-Original-Source"); - // source = source.replace(/^Sender/im, "X-Original-Sender"); - // source = source.replace(/^Return-Path/im, "X-Original-Return-Path"); - source = source.replace(/^Domainkey-Signature/im, "X-Original-Domainkey-Signature"); - // source = `From: AWS SES Mail Forwarding <${data.mail.destination}>\n` + source; - - if (!process.env.to_address) { - console.log("You need to supply to_address enviromnent variable"); - } else if (data.mail.destination == process.env.to_address) { - console.log("MAIL SEND ABORTED! - Forwarded mail address and to_address are the same - THIS CAN CAUSE AN INFINITE LOOP!"); - } else { - ses.sendRawEmail({ - RawMessage: { - Data: source, - }, - Destinations: JSON.parse(process.env.to_address), - }, function (err, data) { - if (err) { - console.error(err, err.stack); - } - }); - } -}; diff --git a/configuration/mail_forward.py b/configuration/mail_forward.py new file mode 100644 index 00000000000..1c84d04b7a8 --- /dev/null +++ b/configuration/mail_forward.py @@ -0,0 +1,98 @@ +# Copyright 2010-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# This file is licensed under the Apache License, Version 2.0 (the "License"). +# You may not use this file except in compliance with the License. A copy of the +# License is located at +# +# http://aws.amazon.com/apache2.0/ +# +# This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS +# OF ANY KIND, either express or implied. See the License for the specific +# language governing permissions and limitations under the License. + +import os +import boto3 +import email +import re +import json +from botocore.exceptions import ClientError +from email.mime.multipart import MIMEMultipart +from email.mime.text import MIMEText +from email.mime.application import MIMEApplication + + +region = os.environ['Region'] + +def get_message_from_s3(bucket_name, object_key): + # Create a new S3 client. + client_s3 = boto3.client("s3") + # Get the email object from the S3 bucket. + object_s3 = client_s3.get_object(Bucket=bucket_name, Key=object_key) + # Read the content of the message. + file = object_s3['Body'].read() + return file + +def create_message(file): + sender = os.environ['MailSender'] + recipientList = json.loads(os.environ["MailRecipientsJSON"]) + mailobject = email.message_from_string(file.decode('utf-8')) + # Uncomment the following to print all available headers, if needed: + # print(mailobject.keys()) + # Set all X- headers + mailobject['X-From'] = mailobject['From'] + if not mailobject['Reply-To']: + mailobject['Reply-To'] = mailobject['From'] + mailobject['X-To'] = mailobject['To'] + mailobject['X-Return-Path'] = mailobject['Return-Path'] + # Remove original headers and set to SES Value + del mailobject['From'] + mailobject['From'] = sender + del mailobject['To'] + mailobject['To'] = ','.join(recipientList) + del mailobject['Return-Path'] + mailobject['Return-Path'] = sender + message = { + "Source": sender, + "Destinations": recipientList, + "Data" : mailobject.as_string() + } + return message + +def send_email(message): + aws_region = os.environ['Region'] + # Create a new SES client. + client_ses = boto3.client('ses', region) + # Send the email. + try: + #Provide the contents of the email. + response = client_ses.send_raw_email( + Source=message['Source'], + Destinations= + message['Destinations'] + , + RawMessage={ + 'Data':message['Data'] + } + ) + # Display an error if something goes wrong. + except ClientError as e: + output = e.response['Error']['Message'] + else: + output = "Email sent! Message ID: " + response['MessageId'] + return output + +def lambda_handler(event, context): + # Get the unique ID of the message. This corresponds to the name of the file + # in S3. + sns = event['Records'][0]['Sns'] + message = json.loads(sns['Message']) + bucket_name = message['receipt']['action']['bucketName'] + object_key = message['receipt']['action']['objectKey'] + print(f"Received message with object key {object_key} in bucket {bucket_name}") + # Retrieve the file from the S3 bucket. + file = get_message_from_s3(bucket_name, object_key) + # Create the message. + message = create_message(file) + # Send the email and print the result. + result = send_email(message) + print(result) diff --git a/configuration/mail_forward_policy.json b/configuration/mail_forward_policy.json index e586059e9e8..42c579ad12f 100644 --- a/configuration/mail_forward_policy.json +++ b/configuration/mail_forward_policy.json @@ -1,22 +1,28 @@ { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Action": [ - "logs:CreateLogGroup", - "logs:CreateLogStream", - "logs:PutLogEvents" - ], - "Resource": "arn:aws:logs:*:*:*" - }, - { - "Effect": "Allow", - "Action": [ - "ses:SendEmail", - "ses:SendRawEmail" - ], - "Resource": "*" - } - ] + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "VisualEditor0", + "Effect": "Allow", + "Action": [ + "logs:CreateLogStream", + "logs:CreateLogGroup", + "logs:PutLogEvents" + ], + "Resource": "*" + }, + { + "Sid": "VisualEditor1", + "Effect": "Allow", + "Action": [ + "s3:GetObject", + "ses:SendRawEmail" + ], + "Resource": [ + "arn:aws:s3:::support-emails-sapsailing-com/*", + "arn:aws:ses:eu-west-1:017363970217:identity/*" + ] + } + ] } + From d45da45a3ac0abc33df5bb55374b84ff4b7e10e5 Mon Sep 17 00:00:00 2001 From: Alessandro Stolten Date: Fri, 17 Apr 2020 15:53:40 +0000 Subject: [PATCH 146/188] Updated support email (markdown) --- wiki/info/landscape/support-email.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wiki/info/landscape/support-email.md b/wiki/info/landscape/support-email.md index e95e5d17d33..12a31cb452f 100644 --- a/wiki/info/landscape/support-email.md +++ b/wiki/info/landscape/support-email.md @@ -11,4 +11,4 @@ The role that is created to execute the Lambda needs to have a policy set that c The relevant files have been committed to our git as ``configuration/mail_forward.py`` for the Lambda's code, and as ``configuration/mail_forward_policy.json`` for the security policy for the IAM role used for the Lambda. ## Changing the List of Recipients -Go to [https://eu-west-1.console.aws.amazon.com/lambda/home?region=eu-west-1#/functions/support-email-forwarding-python?tab=configuration](https://eu-west-1.console.aws.amazon.com/lambda/home?region=eu-west-1#/functions/support-email-forwarding-python?tab=configuration) and edit the ``MailRecipientsJSON`` environment variable accordingly. \ No newline at end of file +Go to [https://eu-west-1.console.aws.amazon.com/lambda/home?region=eu-west-1#/functions/support-email-forwarding-python?tab=configuration](https://eu-west-1.console.aws.amazon.com/lambda/home?region=eu-west-1#/functions/support-email-forwarding-python?tab=configuration) and edit the ``MailRecipientsJSON`` environment variable accordingly. E.g.: ["yourfirstemail@yourdomain.com", "yoursecondemail@yourseconddomain.com"] \ No newline at end of file From 535220250aaa321c6215c873b6fc851c55922dff Mon Sep 17 00:00:00 2001 From: Alessandro Stolten Date: Fri, 17 Apr 2020 15:54:03 +0000 Subject: [PATCH 147/188] Updated support email (markdown) --- wiki/info/landscape/support-email.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wiki/info/landscape/support-email.md b/wiki/info/landscape/support-email.md index 12a31cb452f..2337917bec0 100644 --- a/wiki/info/landscape/support-email.md +++ b/wiki/info/landscape/support-email.md @@ -11,4 +11,4 @@ The role that is created to execute the Lambda needs to have a policy set that c The relevant files have been committed to our git as ``configuration/mail_forward.py`` for the Lambda's code, and as ``configuration/mail_forward_policy.json`` for the security policy for the IAM role used for the Lambda. ## Changing the List of Recipients -Go to [https://eu-west-1.console.aws.amazon.com/lambda/home?region=eu-west-1#/functions/support-email-forwarding-python?tab=configuration](https://eu-west-1.console.aws.amazon.com/lambda/home?region=eu-west-1#/functions/support-email-forwarding-python?tab=configuration) and edit the ``MailRecipientsJSON`` environment variable accordingly. E.g.: ["yourfirstemail@yourdomain.com", "yoursecondemail@yourseconddomain.com"] \ No newline at end of file +Go to [https://eu-west-1.console.aws.amazon.com/lambda/home?region=eu-west-1#/functions/support-email-forwarding-python?tab=configuration](https://eu-west-1.console.aws.amazon.com/lambda/home?region=eu-west-1#/functions/support-email-forwarding-python?tab=configuration) and edit the ``MailRecipientsJSON`` environment variable accordingly. E.g.: ``["yourfirstemail@yourdomain.com", "yoursecondemail@yourseconddomain.com"]`` \ No newline at end of file From b9672e2203c3a5c50e2049a305bc9f9adb99d9ca Mon Sep 17 00:00:00 2001 From: Alessandro Stolten Date: Fri, 17 Apr 2020 15:54:05 +0000 Subject: [PATCH 148/188] Updated support email (markdown) From 5e00be3bba453d99bbc59e31a9a810e86a0eb9d4 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 17 Apr 2020 19:02:25 +0200 Subject: [PATCH 149/188] bug5219: added RacingEventService.updateRaceCompetitors --- .../tracking/TrackedRegattaRegistry.java | 18 +++++++++++ .../domain/tracking/TrackerManager.java | 9 +++++- .../RemoveAndUntrackRace.java | 4 +-- .../server/impl/RacingEventServiceImpl.java | 31 +++++++++++++++++-- 4 files changed, 57 insertions(+), 5 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRegattaRegistry.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRegattaRegistry.java index 0a557343779..660ce53415e 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRegattaRegistry.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRegattaRegistry.java @@ -91,4 +91,22 @@ public interface TrackedRegattaRegistry { Regatta getOrCreateDefaultRegatta(String name, String boatClassName, Serializable id); + /** + * Does what is necessary to react to an external change in the {@code race}'s set of competitors. This can, e.g., + * entail removing and re-tracking that race which, however, has to be explicitly + * {@link Regatta#isAutoRestartTrackingUponCompetitorSetChange() permitted by the regatta} as it will lead to a + * temporary unavailability of the race and any information related to it such as the leaderboard scores. + *

    + * By and large, we assume that a race's {@link RaceDefinition#getCompetitors() set of competitors} remains + * unchanged once the race has been created. There are, however, scenarios in which this causes some trouble. For + * example, if tracking for a regatta shall be started early, so as to enable race officials to see the course + * geometry and wind data for the first race of the day, then especially in self-service scenarios there may be late + * competitors registrations that happen after tracking has been started. These competitors, depending on how the + * connector in use works, may make it into the regatta's leaderboard, but not into the {@link RaceDefinition}. + * This would be unfortunate as those competitors then would remain invisible until the race is reloaded.

    + * + * See also bug 5219 for a discussion. + * @return + */ + RaceHandle updateRaceCompetitors(Regatta regatta, RaceDefinition race) throws Exception; } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackerManager.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackerManager.java index d4e55b47316..e8c3942a619 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackerManager.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackerManager.java @@ -6,6 +6,7 @@ import java.net.URISyntaxException; import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.Regatta; +import com.sap.sailing.domain.base.RegattaListener; import com.sap.sailing.domain.common.RegattaIdentifier; public interface TrackerManager { @@ -14,7 +15,13 @@ public interface TrackerManager { * Creates a {@link RaceTracker} based on the {@code params}. If the {@code params} request * {@link RaceTrackingConnectivityParameters#isTrackWind() wind tracking}, a callback is * {@link RaceTracker#add(com.sap.sailing.domain.tracking.RaceTracker.RaceCreationListener) registered} with the - * {@link RaceTracker} that, when the race has been created by the tracker, will start wind tracking. + * {@link RaceTracker} that, when the race has been created by the tracker, will start wind tracking.

    + * + * The effects of calling this operation will be replicated by means of a listener that is notified when the connector + * has successfully loaded and installed the race. {@code RacingEventServiceImpl.raceAdded(...)} which is notified + * when the race definition has been added to the regatta (implementing {@link RegattaListener#raceAdded(Regatta, RaceDefinition)}), + * and {@code RacingEventServiceImpl.RaceAdditionListener.raceAdded(...)} which is called when the {@link TrackedRace} + * is added to the {@link TrackedRegatta}. * * @param regattaToAddTo * if null or no regatta by that identifier is found, the regatta into which the race has diff --git a/java/com.sap.sailing.server.interface/src/com/sap/sailing/server/operationaltransformation/RemoveAndUntrackRace.java b/java/com.sap.sailing.server.interface/src/com/sap/sailing/server/operationaltransformation/RemoveAndUntrackRace.java index 493cefaad84..91000352433 100755 --- a/java/com.sap.sailing.server.interface/src/com/sap/sailing/server/operationaltransformation/RemoveAndUntrackRace.java +++ b/java/com.sap.sailing.server.interface/src/com/sap/sailing/server/operationaltransformation/RemoveAndUntrackRace.java @@ -37,9 +37,9 @@ public class RemoveAndUntrackRace extends AbstractRaceOperation { @Override public Void internalApplyTo(RacingEventService toState) { - Regatta regatta = toState.getRegatta(getRaceIdentifier()); + final Regatta regatta = toState.getRegatta(getRaceIdentifier()); if (regatta != null) { - RaceDefinition race = regatta.getRaceByName(getRaceIdentifier().getRaceName()); + final RaceDefinition race = regatta.getRaceByName(getRaceIdentifier().getRaceName()); if (race != null) { try { toState.removeRace(regatta, race); diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java index 27d2b91e1ad..ea25ba5c4eb 100644 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java @@ -2102,11 +2102,9 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes TrackedRaceReplicatorAndNotifier trackedRaceReplicator = new TrackedRaceReplicatorAndNotifier(trackedRace); trackedRaceReplicators.put(trackedRace, trackedRaceReplicator); trackedRace.addListener(trackedRaceReplicator, /* fire wind already loaded */true, /* notifyAboutGPSFixesAlreadyLoaded */ true); - PolarFixCacheUpdater polarFixCacheUpdater = new PolarFixCacheUpdater(trackedRace); polarFixCacheUpdaters.put(trackedRace, polarFixCacheUpdater); trackedRace.addListener(polarFixCacheUpdater); - if (polarDataService != null) { trackedRace.setPolarDataService(polarDataService); } @@ -2744,6 +2742,35 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes } return regatta; } + + /** + * The current implementation uses {@link #removeRace(Regatta, RaceDefinition)} to remove the {@link TrackedRace} + * and the {@link RaceDefinition} and based on the {@link #connectivityParametersByRace} uses the connectivity + * parameters of the previously existing tracked race to restore the race by tracking it again after + * {@link #removeRace(Regatta, RaceDefinition)} has completed. + * + * @return {@code null} if it was not possible to re-load the race, either because the regatta doesn't allow for it, + * or because the connectivity parameters were not found; a {@link RaceHandle} for the re-started race + * otherwise. + */ + @Override + public RaceHandle updateRaceCompetitors(Regatta regatta, RaceDefinition race) throws Exception { + final RaceHandle result; + if (regatta.isAutoRestartTrackingUponCompetitorSetChange()) { + final RaceTrackingConnectivityParameters connectivityParams = connectivityParametersByRace.get(race); + if (connectivityParams != null) { + removeRace(regatta, race); + result = addRace(regatta.getRegattaIdentifier(), connectivityParams, RaceTracker.TIMEOUT_FOR_RECEIVING_RACE_DEFINITION_IN_MILLISECONDS); + } else { + result = null; + logger.warning("Unable to update race competitors for race "+race+" in regatta "+regatta+ + " because no connectivity params were found that we could use to start tracking again for that race."); + } + } else { + result = null; + } + return result; + } @Override public void removeRace(Regatta regatta, RaceDefinition race) throws MalformedURLException, IOException, From e5b0c7c9bfe2fd2ba13c8adf0d9a641315947de9 Mon Sep 17 00:00:00 2001 From: Alexandr Timoshenko Date: Fri, 17 Apr 2020 19:12:33 +0200 Subject: [PATCH 150/188] added rekove button to finished race with large font --- .../res/layout/race_summary_large_font.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/mobile/com.sap.sailing.racecommittee.app/res/layout/race_summary_large_font.xml b/mobile/com.sap.sailing.racecommittee.app/res/layout/race_summary_large_font.xml index 0b7533a425a..e075629ba2c 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/layout/race_summary_large_font.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/layout/race_summary_large_font.xml @@ -288,6 +288,7 @@ tools:text="AUT 553 GER 766 ITA 912" /> + \ No newline at end of file From 578bd3e6849173b4f870df1e3d8f3cb834a2f828 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Sat, 18 Apr 2020 13:57:25 +0200 Subject: [PATCH 151/188] fixed formatting --- java/com.sap.sailing.gwt.ui/GWT Sailing SDM.launch | 1 + .../ui/authentication/AuthenticationManagerImpl.java | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/GWT Sailing SDM.launch b/java/com.sap.sailing.gwt.ui/GWT Sailing SDM.launch index 05821f7f895..89172c5713f 100755 --- a/java/com.sap.sailing.gwt.ui/GWT Sailing SDM.launch +++ b/java/com.sap.sailing.gwt.ui/GWT Sailing SDM.launch @@ -116,6 +116,7 @@ + diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationManagerImpl.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationManagerImpl.java index 48293d382e3..80b5cc4c9b4 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationManagerImpl.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationManagerImpl.java @@ -209,7 +209,7 @@ public class AuthenticationManagerImpl implements AuthenticationManager { public void onSuccess(UserDTO result) { refreshUserInfo(); callback.onSuccess(result); - if(!Util.equalsWithNull(locale, localeName)) { + if (!Util.equalsWithNull(locale, localeName)) { redirectIfLocaleIsSetAndLocaleIsNotGivenInTheURL(localeName); } } @@ -221,19 +221,19 @@ public class AuthenticationManagerImpl implements AuthenticationManager { */ private void redirectWithLocaleForAuthenticatedUser() { final AuthenticationContext authenticationContext = getAuthenticationContext(); - if(authenticationContext.isLoggedIn()) { + if (authenticationContext.isLoggedIn()) { redirectIfLocaleIsSetAndLocaleIsNotGivenInTheURL(authenticationContext.getCurrentUser().getLocale()); } } private void redirectIfLocaleIsSetAndLocaleIsNotGivenInTheURL(String locale) { - if(shouldChangeLocale(locale)) { + if (shouldChangeLocale(locale)) { Window.Location.reload(); } } private boolean shouldChangeLocale(String locale) { - if(locale == null || locale.isEmpty()) { + if (locale == null || locale.isEmpty()) { // If the user currently has no locale preference, we do not refresh return false; } From 842f4498cf37468c68905dc33ccd34071e0190c2 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Sat, 18 Apr 2020 20:31:47 +0200 Subject: [PATCH 152/188] addressed a strange issue probably related to bug5269, making lambdas into anonymous inner classes --- .../ui/adminconsole/EventListComposite.java | 29 +++++-------------- .../adminconsole/LeaderboardConfigPanel.java | 11 ++++--- 2 files changed, 15 insertions(+), 25 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java index 33747ee45d4..24af44736a2 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java @@ -16,6 +16,8 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; +import java.util.function.Consumer; + import com.google.gwt.cell.client.AbstractCell; import com.google.gwt.cell.client.SafeHtmlCell; import com.google.gwt.cell.client.ValueUpdater; @@ -158,7 +160,6 @@ public class EventListComposite extends Composite implements EventsRefresher, Le final RefreshableMultiSelectionModel selectionModel = (RefreshableMultiSelectionModel) eventTable.getSelectionModel(); refreshableEventSelectionModel = selectionModel; eventTable.setVisible(false); - final Button refresh = buttonPanel.addUnsecuredAction(stringMessages.refresh(), this::fillEvents); refresh.ensureDebugId("RefreshEventsButton"); final Button create = buttonPanel.addCreateAction(stringMessages.actionAddEvent(), this::openCreateEventDialog); @@ -166,7 +167,6 @@ public class EventListComposite extends Composite implements EventsRefresher, Le final Button remove = buttonPanel.addRemoveAction(stringMessages.remove(), refreshableEventSelectionModel, true, () -> removeEvents(refreshableEventSelectionModel.getSelectedSet())); remove.ensureDebugId("RemoveEventsButton"); - this.refreshableEventSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() { @Override public void onSelectionChange(SelectionChangeEvent event) { @@ -196,7 +196,6 @@ public class EventListComposite extends Composite implements EventsRefresher, Le FlushableCellTable table = new FlushableCellTable(/* pageSize */10000, tableRes); eventListDataProvider.addDataDisplay(table); table.setWidth("100%"); - SelectionCheckboxColumn eventSelectionCheckboxColumn = new SelectionCheckboxColumn( tableRes.cellTableStyle().cellTableCheckboxSelected(), tableRes.cellTableStyle().cellTableCheckboxDeselected(), @@ -210,11 +209,9 @@ public class EventListComposite extends Composite implements EventsRefresher, Le return t.id.hashCode(); } },filterTextbox.getAllListDataProvider(),table); - AnchorCell anchorCell = new AnchorCell(); final TextColumn eventUUidColumn = new AbstractSortableTextColumn( event -> event.getId() == null ? "" : event.getId().toString()); - Column eventNameColumn = new Column(anchorCell) { @Override public SafeHtml getValue(EventDTO event) { @@ -225,14 +222,12 @@ public class EventListComposite extends Composite implements EventsRefresher, Le return ANCHORTEMPLATE.cell(UriUtils.fromString(link), event.getName()); } }; - TextColumn venueNameColumn = new TextColumn() { @Override public String getValue(EventDTO event) { return event.venue != null ? event.venue.getName() : ""; } }; - TextColumn startEndDateColumn = new TextColumn() { @Override public String getValue(EventDTO event) { @@ -246,7 +241,6 @@ public class EventListComposite extends Composite implements EventsRefresher, Le return event.isPublic ? stringMessages.yes() : stringMessages.no(); } }; - SafeHtmlCell courseAreasCell = new SafeHtmlCell(); Column courseAreasColumn = new Column(courseAreasCell) { @Override @@ -268,7 +262,6 @@ public class EventListComposite extends Composite implements EventsRefresher, Le return builder.toSafeHtml(); } }; - MultipleLinkCell leaderboardGroupsCell = new MultipleLinkCell(true); Column> leaderboardGroupsColumn = new Column>( leaderboardGroupsCell) { @@ -281,7 +274,6 @@ public class EventListComposite extends Composite implements EventsRefresher, Le return links; } }; - leaderboardGroupsCell.setOnLinkClickHandler(new ValueUpdater() { @Override public void update(String value) { @@ -291,7 +283,6 @@ public class EventListComposite extends Composite implements EventsRefresher, Le params); } }); - TextColumn imagesColumn = new TextColumn() { @Override public String getValue(EventDTO event) { @@ -303,7 +294,6 @@ public class EventListComposite extends Composite implements EventsRefresher, Le return result; } }; - TextColumn videosColumn = new TextColumn() { @Override public String getValue(EventDTO event) { @@ -315,7 +305,6 @@ public class EventListComposite extends Composite implements EventsRefresher, Le return result; } }; - final SecuredDTOOwnerColumn groupColumn = SecuredDTOOwnerColumn.getGroupOwnerColumn(); final SecuredDTOOwnerColumn userColumn = SecuredDTOOwnerColumn.getUserOwnerColumn(); @@ -330,12 +319,10 @@ public class EventListComposite extends Composite implements EventsRefresher, Le final DialogConfig config = EditOwnershipDialog.create(userService.getUserManagementService(), EVENT, event -> fillEvents(), stringMessages); actionsColumn.addAction(EventConfigImagesBarCell.ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, config::openDialog); - final EditACLDialog.DialogConfig configACL = EditACLDialog.create( userService.getUserManagementService(), EVENT, event -> fillEvents(), stringMessages); actionsColumn.addAction(EventConfigImagesBarCell.ACTION_CHANGE_ACL, DefaultActions.CHANGE_ACL, e -> configACL.openDialog(e)); - final MigrateGroupOwnershipDialog.DialogConfig migrateDialogConfig = MigrateGroupOwnershipDialog .create(userService.getUserManagementService(), (event, dto) -> { sailingService.updateGroupOwnerForEventHierarchy(event.id, dto, new AsyncCallback() { @@ -351,8 +338,12 @@ public class EventListComposite extends Composite implements EventsRefresher, Le }); }); actionsColumn.addAction(EventConfigImagesBarCell.ACTION_MIGRATE_GROUP_OWNERSHIP_HIERARCHY, CHANGE_OWNERSHIP, - migrateDialogConfig::openDialog); - + new Consumer() { + @Override + public void accept(EventDTO t) { + migrateDialogConfig.openDialog(t); + } + }); eventNameColumn.setSortable(true); venueNameColumn.setSortable(true); isPublicColumn.setSortable(true); @@ -361,11 +352,9 @@ public class EventListComposite extends Composite implements EventsRefresher, Le leaderboardGroupsColumn.setSortable(true); groupColumn.setSortable(true); userColumn.setSortable(true); - final ListHandler columnSortHandler = getEventTableColumnSortHandler(eventListDataProvider.getList(), eventSelectionCheckboxColumn, eventNameColumn, venueNameColumn, startEndDateColumn, isPublicColumn, courseAreasColumn, leaderboardGroupsColumn, groupColumn, userColumn); - table.addColumn(eventSelectionCheckboxColumn, eventSelectionCheckboxColumn.getHeader()); table.addColumn(eventNameColumn, stringMessages.event()); table.addColumn(venueNameColumn, stringMessages.venue()); @@ -380,10 +369,8 @@ public class EventListComposite extends Composite implements EventsRefresher, Le table.addColumn(eventUUidColumn, stringMessages.id()); table.addColumn(actionsColumn, stringMessages.actions()); table.setSelectionModel(eventSelectionCheckboxColumn.getSelectionModel(), eventSelectionCheckboxColumn.getSelectionManager()); - table.addColumnSortHandler(columnSortHandler); table.getColumnSortList().push(startEndDateColumn); - return table; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java index 76887132ab9..2ec0631f189 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java @@ -28,6 +28,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.function.Consumer; import java.util.function.Supplier; import java.util.logging.Level; import java.util.logging.Logger; @@ -358,19 +359,21 @@ public class LeaderboardConfigPanel extends AbstractLeaderboardConfigPanel this::createPairingListTemplate); leaderboardActionColumn.addAction(LeaderboardConfigImagesBarCell.ACTION_PRINT_PAIRINGLIST, READ, this::openPairingListEntryPoint); - final DialogConfig config = EditOwnershipDialog.create( userService.getUserManagementService(), type, leaderboardDTO -> reloadLeaderboardForTable(leaderboardDTO.getName()), stringMessages); leaderboardActionColumn.addAction(LeaderboardConfigImagesBarCell.ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, config::openDialog); - final EditACLDialog.DialogConfig configACL = EditACLDialog.create( userService.getUserManagementService(), type, leaderboardDTO -> reloadLeaderboardForTable(leaderboardDTO.getName()), stringMessages); leaderboardActionColumn.addAction(DefaultActionsImagesBarCell.ACTION_CHANGE_ACL, DefaultActions.CHANGE_ACL, - configACL::openDialog); - + new Consumer() { + @Override + public void accept(StrippedLeaderboardDTOWithSecurity t) { + configACL.openDialog(t); + } + }); leaderboardTable.addColumn(selectionCheckboxColumn, selectionCheckboxColumn.getHeader()); leaderboardTable.addColumn(linkColumn, stringMessages.name()); leaderboardTable.addColumn(leaderboardDisplayNameColumn, stringMessages.displayName()); From dc9e55b0850d634e1e3833e3aa170cb2af72f3af Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Sun, 19 Apr 2020 00:55:17 +0200 Subject: [PATCH 153/188] bug4319: added German translation for additional string messages --- java/com.sap.sailing.gwt.ui/GWT Sailing SDM.launch | 1 - .../res/values-de/strings.xml | 8 ++++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/GWT Sailing SDM.launch b/java/com.sap.sailing.gwt.ui/GWT Sailing SDM.launch index 37849240e83..682a0020893 100755 --- a/java/com.sap.sailing.gwt.ui/GWT Sailing SDM.launch +++ b/java/com.sap.sailing.gwt.ui/GWT Sailing SDM.launch @@ -34,7 +34,6 @@ - diff --git a/mobile/com.sap.sailing.racecommittee.app/res/values-de/strings.xml b/mobile/com.sap.sailing.racecommittee.app/res/values-de/strings.xml index 6ea5b0eadae..2109c07d684 100755 --- a/mobile/com.sap.sailing.racecommittee.app/res/values-de/strings.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/values-de/strings.xml @@ -537,7 +537,7 @@ Server ändern Dieser Teilnehmer wurde an einem anderen Gerät verändert und hat überschneidende Änderungen. Bitte stellen Sie sicher, dass die Daten korrekt sind. - Revoke - Cannot revoke finished time - Cannot revoke finishing time - \ No newline at end of file + Widerrufen + Widerruf des Zeitpunktes des Rennendes nicht möglich + Widerruf des Zeitpunktes des Beginns des Zieleinlaufs nicht möglich + From 848b52f4960de95dc9a7fa740749e41b2a241e93 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Sun, 19 Apr 2020 01:03:24 +0200 Subject: [PATCH 154/188] fixed compilation problems --- .../sailing/domain/test/DummyTrackedRegattaRegistry.java | 6 ++++++ .../com/sap/sailing/domain/test/LeaderboardOfflineTest.java | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/DummyTrackedRegattaRegistry.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/DummyTrackedRegattaRegistry.java index cdc1c355622..bfdfa2e6fc0 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/DummyTrackedRegattaRegistry.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/DummyTrackedRegattaRegistry.java @@ -9,6 +9,7 @@ import java.util.Map; import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.tracking.DynamicTrackedRegatta; +import com.sap.sailing.domain.tracking.RaceHandle; import com.sap.sailing.domain.tracking.RaceTracker; import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; import com.sap.sailing.domain.tracking.impl.DynamicTrackedRegattaImpl; @@ -72,4 +73,9 @@ public class DummyTrackedRegattaRegistry implements TrackedRegattaRegistry { public Regatta getOrCreateDefaultRegatta(String name, String boatClassName, Serializable id) { return null; } + + @Override + public RaceHandle updateRaceCompetitors(Regatta regatta, RaceDefinition race) throws Exception { + return null; + } } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardOfflineTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardOfflineTest.java index e43f4d80eb9..329e61de846 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardOfflineTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardOfflineTest.java @@ -40,6 +40,7 @@ import com.sap.sailing.domain.leaderboard.impl.ThresholdBasedResultDiscardingRul import com.sap.sailing.domain.test.mock.MockedTrackedRaceWithFixedRank; import com.sap.sailing.domain.test.mock.MockedTrackedRaceWithFixedRankAndManyCompetitors; import com.sap.sailing.domain.tracking.DynamicTrackedRegatta; +import com.sap.sailing.domain.tracking.RaceHandle; import com.sap.sailing.domain.tracking.RaceTracker; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; @@ -159,6 +160,10 @@ public class LeaderboardOfflineTest extends AbstractLeaderboardTest { public Regatta getOrCreateDefaultRegatta(String name, String boatClassName, Serializable id) { return null; } + @Override + public RaceHandle updateRaceCompetitors(Regatta regatta, RaceDefinition race) throws Exception { + return null; + } }; LeaderboardDTO leaderboardDTO = leaderboard.getLeaderboardDTO(now, emptySet, /* addOverallDetails */ true, trackedRegattaRegistry, DomainFactory.INSTANCE, /* fillTotalPointsUncorrected */ false); assertNotNull(leaderboardDTO); From 28e921d19f36b4d19eae35aa7a458232726409ed Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Sun, 19 Apr 2020 11:49:26 +0200 Subject: [PATCH 155/188] bug4319: added release notes --- .../desktop/places/whatsnew/resources/RaceCommitteeAppNotes.html | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/resources/RaceCommitteeAppNotes.html b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/resources/RaceCommitteeAppNotes.html index d3d3adbf9ff..4fcbd3fe2ac 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/resources/RaceCommitteeAppNotes.html +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/resources/RaceCommitteeAppNotes.html @@ -11,6 +11,7 @@

  • The app now accepts a date for the blue flag up and down event and is no longer limited to the current day.
  • We fixed an issue where the blue flag countdown in the navigation drawer was not running.
  • We have improved and unified the representations of times and countdowns.
  • +
  • Blue flag up and down events can now be revoked, e.g., after accidentally using it.
  • March 2020
      From 3da8780e1c1395f8e62d94af6a27b1f6dd02c0c3 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 20 Apr 2020 00:33:48 +0200 Subject: [PATCH 156/188] upgraded Dockerfile for SAP JVM to 8.1.062 --- docker/Dockerfile_sapjvm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile_sapjvm b/docker/Dockerfile_sapjvm index 53b15227628..3b8a44845ad 100644 --- a/docker/Dockerfile_sapjvm +++ b/docker/Dockerfile_sapjvm @@ -6,7 +6,7 @@ ENV JAVA_HOME=/opt/sapjvm_8 WORKDIR /opt RUN apt-get update \ && apt-get install -y wget unzip \ - && curl --cookie eula_3_1_agreed=tools.hana.ondemand.com/developer-license-3_1.txt "https://tools.hana.ondemand.com/additional/sapjvm-8.1.059-linux-x64.zip" --output sapjvm8-linux-x64.zip \ + && curl --cookie eula_3_1_agreed=tools.hana.ondemand.com/developer-license-3_1.txt "https://tools.hana.ondemand.com/additional/sapjvm-8.1.062-linux-x64.zip" --output sapjvm8-linux-x64.zip \ && unzip sapjvm8-linux-x64.zip \ && rm sapjvm8-linux-x64.zip \ && echo "export JAVA_HOME=/opt/sapjvm_8; export PATH=\${PATH}:/opt/sapjvm_8/bin" > /etc/profile.d/javahome.sh From 96e177a7e41d94cc22c15150db273606c16bac93 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 20 Apr 2020 01:02:33 +0200 Subject: [PATCH 157/188] build docker images based on SAP JVM 8.1.062 --- docker/Dockerfile.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile.tpl b/docker/Dockerfile.tpl index 302a49a5548..deb26fe8027 100755 --- a/docker/Dockerfile.tpl +++ b/docker/Dockerfile.tpl @@ -1,4 +1,4 @@ -FROM donaldduck70/sapjvm8:8.1.059 +FROM donaldduck70/sapjvm8:8.1.062 LABEL maintainer=axel.uhl@sap.com # Download and extract the release WORKDIR /home/sailing/servers/server From 31a768d29d2600ab7f2ae9d0b41a4fc1ca205f58 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 20 Apr 2020 07:56:42 +0000 Subject: [PATCH 158/188] upgraded Hudson Slave AMI ID --- configuration/launchhudsonslave | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configuration/launchhudsonslave b/configuration/launchhudsonslave index 7a70f7e4697..8d42303fa68 100755 --- a/configuration/launchhudsonslave +++ b/configuration/launchhudsonslave @@ -1,8 +1,8 @@ #!/bin/bash AWS=/root/.local/bin/aws REGION=eu-west-1 -#HUDSON_SLAVE_AMI_ID=ami-0812bc35c7464732e -HUDSON_SLAVE_AMI_ID=ami-04956fe5a5293da6f +#HUDSON_SLAVE_AMI_ID=ami-04956fe5a5293da6f +HUDSON_SLAVE_AMI_ID=ami-0251a199f8d4a4729 echo Launching instance... instanceid=`$AWS ec2 run-instances --image-id $HUDSON_SLAVE_AMI_ID --count 1 --instance-type c5d.4xlarge --key-name Axel --security-groups "Sailing Analytics App" --region $REGION --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=Hudson Ubuntu Slave}]' --instance-initiated-shutdown-behavior terminate | tee /tmp/slavelaunch.out | jq .Instances[0].InstanceId | sed -e 's/"//g'` if [ "$instanceid" = "" ]; then From 54530682f1b18e471e5e09495ec535edc5ce753c Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 20 Apr 2020 10:50:08 +0200 Subject: [PATCH 159/188] some comment changes in analyzeProduct.sh script --- .../scripts/analyzeProduct.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/java/com.sap.sailing.feature.p2build/scripts/analyzeProduct.sh b/java/com.sap.sailing.feature.p2build/scripts/analyzeProduct.sh index 5505bacaadb..ba710454640 100755 --- a/java/com.sap.sailing.feature.p2build/scripts/analyzeProduct.sh +++ b/java/com.sap.sailing.feature.p2build/scripts/analyzeProduct.sh @@ -1,9 +1,9 @@ #!/bin/bash # Call like this: analyzeProduct.sh [ ...] -# Updates Eclipse .launch files with the needed bundles for starting a SAP sailing server based on the current feature.xml. -# The .launch files must be in der workspace format that is introduced since Eclipse 2019-12. Script prints an error when no matching -# replacment section could be found. -# Will output two lines in format +# Updates Eclipse .launch files with the bundles needed for starting an SAP Sailing server based on the current feature.xml. +# The .launch files must be in the workspace format that was introduced with Eclipse 2019-12. The script prints an error when no matching +# replacement section could be found. +# Will output two sections in format # # # /dev/null"; do + while su - hudson -c "ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no hudson@$private_ip ls >/dev/null"; do echo SSH daemon not reachable yet. Trying again... done echo SSH daemon reached. State should be ready to connect to now. From 4b7c1df49664eaf46471222be080fda1d78e5439 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 21 Apr 2020 10:39:13 +0200 Subject: [PATCH 161/188] also fixed ssh option spec for Java11 Hudson launcher --- configuration/launchhudsonslave-java11 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configuration/launchhudsonslave-java11 b/configuration/launchhudsonslave-java11 index 6b02d18147f..1e06b77b531 100755 --- a/configuration/launchhudsonslave-java11 +++ b/configuration/launchhudsonslave-java11 @@ -16,7 +16,7 @@ else echo Instance $instanceid seems running now private_ip=`$AWS ec2 describe-instances --region $REGION --instance-ids $instanceid | jq .Reservations[0].Instances[0].PrivateIpAddress | sed -e 's/"//g'` echo Probing for SSH on private IP $private_ip - while su - hudson -c "ssh -o ConnectTimeout=10,StrictHostKeyChecking=no hudson@$private_ip ls >/dev/null"; do + while su - hudson -c "ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no hudson@$private_ip ls >/dev/null"; do echo SSH daemon not reachable yet. Trying again... done echo SSH daemon reached. State should be ready to connect to now. From 17c84d8b70c1fb8a060488f0945a6719ec2081d2 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 21 Apr 2020 11:44:41 +0200 Subject: [PATCH 162/188] bug4301 aftermath: formatting, coding convention, comment cleanup --- .../com/sap/sailing/gwt/ui/shared/EventBaseDTO.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/EventBaseDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/EventBaseDTO.java index 115873d0513..e2b31df53a4 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/EventBaseDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/EventBaseDTO.java @@ -139,13 +139,13 @@ public class EventBaseDTO extends NamedDTO implements WithID, IsSerializable { * Assign the event's base URL. * * NOTE: https:// will be assumed if no protocol has been provided. - * - * @param baseURL */ public void setBaseURL(String baseURL) { - if (baseURL != null && !baseURL.contains("://")) - baseURL = "https://" + baseURL; - this.baseURL = baseURL; + if (baseURL != null && !baseURL.contains("://")) { + this.baseURL = "https://" + baseURL; + } else { + this.baseURL = baseURL; + } } public Iterable getLeaderboardGroups() { From 36cef633c7ffddc90ae973a3772882d860071193 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 21 Apr 2020 12:28:45 +0200 Subject: [PATCH 163/188] bug5269: also removing .generated GWT directories upon cleaning --- configuration/buildAndUpdateProduct.sh | 55 ++++++++++++++------------ 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/configuration/buildAndUpdateProduct.sh b/configuration/buildAndUpdateProduct.sh index 7555e3d4c12..80289012902 100755 --- a/configuration/buildAndUpdateProduct.sh +++ b/configuration/buildAndUpdateProduct.sh @@ -27,6 +27,15 @@ find_project_home () echo $(correct_file_path "$1") } +clean_gwt_artifacts () +{ + cd $PROJECT_HOME/java + rm -rf com.sap.$PROJECT_TYPE.gwt.ui/com.sap.$PROJECT_TYPE.* com.sap.$PROJECT_TYPE.gwt.ui/.generated + rm -rf com.sap.sailing.dashboards.gwt/com.sap.sailing.dashboards.gwt.* com.sap.sailing.dashboards.gwt/.generated + rm -rf com.sap.sse.security.ui/com.sap.sse.security.ui.* com.sap.sse.security.ui/.generated + rm -rf com.sap.sse.gwt/com.sap.sse.gwt.* com.sap.sse.gwt/.generated +} + # this holds for default installation USER_HOME=~ START_DIR="`pwd`" @@ -207,10 +216,7 @@ if [[ "$@" == "clean" ]]; then if [[ $? != 0 ]]; then exit 100 fi - cd $PROJECT_HOME/java - rm -rf com.sap.$PROJECT_TYPE.gwt.ui/com.sap.$PROJECT_TYPE.* - rm -rf com.sap.sailing.dashboards.gwt/com.sap.sailing.dashboards.gwt.* - rm -rf com.sap.sse.security.ui/com.sap.sse.security.ui.* + clean_gwt_artifacts cd $PROJECT_HOME echo "Using following command: mvn $extra -DargLine=\"$APP_PARAMETERS\" -fae -s $MAVEN_SETTINGS $clean" echo "Maven version used: `mvn --version`" @@ -559,27 +565,26 @@ if [[ "$@" == "build" ]] || [[ "$@" == "all" ]]; then cd $PROJECT_HOME/java if [ $gwtcompile -eq 1 ] && [[ "$clean" == "clean" ]]; then echo "INFO: Compiling GWT (rm -rf com.sap.$PROJECT_TYPE.gwt.ui/com.sap.$PROJECT_TYPE.*)" - rm -rf com.sap.$PROJECT_TYPE.gwt.ui/com.sap.$PROJECT_TYPE.* - GWT_XML_FILES=`find . -name '*.gwt.xml'` - if [ $onegwtpermutationonly -eq 1 ]; then - echo "INFO: Patching .gwt.xml files such that only one GWT permutation needs to be compiled" - for i in $GWT_XML_FILES; do - echo "INFO: Patching $i files such that only one GWT permutation needs to be compiled" - cp $i $i.bak - cat $i | sed -e 's/AllPermutations/SinglePermutation/' >$i.sed - mv $i.sed $i - done - else - echo "INFO: Patching .gwt.xml files such that all GWT permutations are compiled" - for i in $GWT_XML_FILES; do - echo "INFO: Patching $i files such that all GWT permutations are compiled" - cp $i $i.bak - cat $i | sed -e 's/SinglePermutation/AllPermutations/' >$i.sed - mv $i.sed $i - - done - fi - + clean_gwt_artifacts + GWT_XML_FILES=`find . -name '*.gwt.xml'` + if [ $onegwtpermutationonly -eq 1 ]; then + echo "INFO: Patching .gwt.xml files such that only one GWT permutation needs to be compiled" + for i in $GWT_XML_FILES; do + echo "INFO: Patching $i files such that only one GWT permutation needs to be compiled" + cp $i $i.bak + cat $i | sed -e 's/AllPermutations/SinglePermutation/' >$i.sed + mv $i.sed $i + done + else + echo "INFO: Patching .gwt.xml files such that all GWT permutations are compiled" + for i in $GWT_XML_FILES; do + echo "INFO: Patching $i files such that all GWT permutations are compiled" + cp $i $i.bak + cat $i | sed -e 's/SinglePermutation/AllPermutations/' >$i.sed + mv $i.sed $i + + done + fi else echo "INFO: GWT Compilation disabled" extra="$extra -Pdebug.no-gwt-compile" From 63da7b95c22b19e16287e372e702865f27a4c797 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 21 Apr 2020 12:35:41 +0200 Subject: [PATCH 164/188] Revert "addressed a strange issue probably related to bug5269, making lambdas into anonymous inner classes" This reverts commit 842f4498cf37468c68905dc33ccd34071e0190c2. --- .../ui/adminconsole/EventListComposite.java | 29 ++++++++++++++----- .../adminconsole/LeaderboardConfigPanel.java | 11 +++---- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java index 24af44736a2..33747ee45d4 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java @@ -16,8 +16,6 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; -import java.util.function.Consumer; - import com.google.gwt.cell.client.AbstractCell; import com.google.gwt.cell.client.SafeHtmlCell; import com.google.gwt.cell.client.ValueUpdater; @@ -160,6 +158,7 @@ public class EventListComposite extends Composite implements EventsRefresher, Le final RefreshableMultiSelectionModel selectionModel = (RefreshableMultiSelectionModel) eventTable.getSelectionModel(); refreshableEventSelectionModel = selectionModel; eventTable.setVisible(false); + final Button refresh = buttonPanel.addUnsecuredAction(stringMessages.refresh(), this::fillEvents); refresh.ensureDebugId("RefreshEventsButton"); final Button create = buttonPanel.addCreateAction(stringMessages.actionAddEvent(), this::openCreateEventDialog); @@ -167,6 +166,7 @@ public class EventListComposite extends Composite implements EventsRefresher, Le final Button remove = buttonPanel.addRemoveAction(stringMessages.remove(), refreshableEventSelectionModel, true, () -> removeEvents(refreshableEventSelectionModel.getSelectedSet())); remove.ensureDebugId("RemoveEventsButton"); + this.refreshableEventSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() { @Override public void onSelectionChange(SelectionChangeEvent event) { @@ -196,6 +196,7 @@ public class EventListComposite extends Composite implements EventsRefresher, Le FlushableCellTable table = new FlushableCellTable(/* pageSize */10000, tableRes); eventListDataProvider.addDataDisplay(table); table.setWidth("100%"); + SelectionCheckboxColumn eventSelectionCheckboxColumn = new SelectionCheckboxColumn( tableRes.cellTableStyle().cellTableCheckboxSelected(), tableRes.cellTableStyle().cellTableCheckboxDeselected(), @@ -209,9 +210,11 @@ public class EventListComposite extends Composite implements EventsRefresher, Le return t.id.hashCode(); } },filterTextbox.getAllListDataProvider(),table); + AnchorCell anchorCell = new AnchorCell(); final TextColumn eventUUidColumn = new AbstractSortableTextColumn( event -> event.getId() == null ? "" : event.getId().toString()); + Column eventNameColumn = new Column(anchorCell) { @Override public SafeHtml getValue(EventDTO event) { @@ -222,12 +225,14 @@ public class EventListComposite extends Composite implements EventsRefresher, Le return ANCHORTEMPLATE.cell(UriUtils.fromString(link), event.getName()); } }; + TextColumn venueNameColumn = new TextColumn() { @Override public String getValue(EventDTO event) { return event.venue != null ? event.venue.getName() : ""; } }; + TextColumn startEndDateColumn = new TextColumn() { @Override public String getValue(EventDTO event) { @@ -241,6 +246,7 @@ public class EventListComposite extends Composite implements EventsRefresher, Le return event.isPublic ? stringMessages.yes() : stringMessages.no(); } }; + SafeHtmlCell courseAreasCell = new SafeHtmlCell(); Column courseAreasColumn = new Column(courseAreasCell) { @Override @@ -262,6 +268,7 @@ public class EventListComposite extends Composite implements EventsRefresher, Le return builder.toSafeHtml(); } }; + MultipleLinkCell leaderboardGroupsCell = new MultipleLinkCell(true); Column> leaderboardGroupsColumn = new Column>( leaderboardGroupsCell) { @@ -274,6 +281,7 @@ public class EventListComposite extends Composite implements EventsRefresher, Le return links; } }; + leaderboardGroupsCell.setOnLinkClickHandler(new ValueUpdater() { @Override public void update(String value) { @@ -283,6 +291,7 @@ public class EventListComposite extends Composite implements EventsRefresher, Le params); } }); + TextColumn imagesColumn = new TextColumn() { @Override public String getValue(EventDTO event) { @@ -294,6 +303,7 @@ public class EventListComposite extends Composite implements EventsRefresher, Le return result; } }; + TextColumn videosColumn = new TextColumn() { @Override public String getValue(EventDTO event) { @@ -305,6 +315,7 @@ public class EventListComposite extends Composite implements EventsRefresher, Le return result; } }; + final SecuredDTOOwnerColumn groupColumn = SecuredDTOOwnerColumn.getGroupOwnerColumn(); final SecuredDTOOwnerColumn userColumn = SecuredDTOOwnerColumn.getUserOwnerColumn(); @@ -319,10 +330,12 @@ public class EventListComposite extends Composite implements EventsRefresher, Le final DialogConfig config = EditOwnershipDialog.create(userService.getUserManagementService(), EVENT, event -> fillEvents(), stringMessages); actionsColumn.addAction(EventConfigImagesBarCell.ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, config::openDialog); + final EditACLDialog.DialogConfig configACL = EditACLDialog.create( userService.getUserManagementService(), EVENT, event -> fillEvents(), stringMessages); actionsColumn.addAction(EventConfigImagesBarCell.ACTION_CHANGE_ACL, DefaultActions.CHANGE_ACL, e -> configACL.openDialog(e)); + final MigrateGroupOwnershipDialog.DialogConfig migrateDialogConfig = MigrateGroupOwnershipDialog .create(userService.getUserManagementService(), (event, dto) -> { sailingService.updateGroupOwnerForEventHierarchy(event.id, dto, new AsyncCallback() { @@ -338,12 +351,8 @@ public class EventListComposite extends Composite implements EventsRefresher, Le }); }); actionsColumn.addAction(EventConfigImagesBarCell.ACTION_MIGRATE_GROUP_OWNERSHIP_HIERARCHY, CHANGE_OWNERSHIP, - new Consumer() { - @Override - public void accept(EventDTO t) { - migrateDialogConfig.openDialog(t); - } - }); + migrateDialogConfig::openDialog); + eventNameColumn.setSortable(true); venueNameColumn.setSortable(true); isPublicColumn.setSortable(true); @@ -352,9 +361,11 @@ public class EventListComposite extends Composite implements EventsRefresher, Le leaderboardGroupsColumn.setSortable(true); groupColumn.setSortable(true); userColumn.setSortable(true); + final ListHandler columnSortHandler = getEventTableColumnSortHandler(eventListDataProvider.getList(), eventSelectionCheckboxColumn, eventNameColumn, venueNameColumn, startEndDateColumn, isPublicColumn, courseAreasColumn, leaderboardGroupsColumn, groupColumn, userColumn); + table.addColumn(eventSelectionCheckboxColumn, eventSelectionCheckboxColumn.getHeader()); table.addColumn(eventNameColumn, stringMessages.event()); table.addColumn(venueNameColumn, stringMessages.venue()); @@ -369,8 +380,10 @@ public class EventListComposite extends Composite implements EventsRefresher, Le table.addColumn(eventUUidColumn, stringMessages.id()); table.addColumn(actionsColumn, stringMessages.actions()); table.setSelectionModel(eventSelectionCheckboxColumn.getSelectionModel(), eventSelectionCheckboxColumn.getSelectionManager()); + table.addColumnSortHandler(columnSortHandler); table.getColumnSortList().push(startEndDateColumn); + return table; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java index 2ec0631f189..76887132ab9 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java @@ -28,7 +28,6 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.function.Consumer; import java.util.function.Supplier; import java.util.logging.Level; import java.util.logging.Logger; @@ -359,21 +358,19 @@ public class LeaderboardConfigPanel extends AbstractLeaderboardConfigPanel this::createPairingListTemplate); leaderboardActionColumn.addAction(LeaderboardConfigImagesBarCell.ACTION_PRINT_PAIRINGLIST, READ, this::openPairingListEntryPoint); + final DialogConfig config = EditOwnershipDialog.create( userService.getUserManagementService(), type, leaderboardDTO -> reloadLeaderboardForTable(leaderboardDTO.getName()), stringMessages); leaderboardActionColumn.addAction(LeaderboardConfigImagesBarCell.ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, config::openDialog); + final EditACLDialog.DialogConfig configACL = EditACLDialog.create( userService.getUserManagementService(), type, leaderboardDTO -> reloadLeaderboardForTable(leaderboardDTO.getName()), stringMessages); leaderboardActionColumn.addAction(DefaultActionsImagesBarCell.ACTION_CHANGE_ACL, DefaultActions.CHANGE_ACL, - new Consumer() { - @Override - public void accept(StrippedLeaderboardDTOWithSecurity t) { - configACL.openDialog(t); - } - }); + configACL::openDialog); + leaderboardTable.addColumn(selectionCheckboxColumn, selectionCheckboxColumn.getHeader()); leaderboardTable.addColumn(linkColumn, stringMessages.name()); leaderboardTable.addColumn(leaderboardDisplayNameColumn, stringMessages.displayName()); From 9fdf410f46ad549604099b93333bc1bba5738a2a Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 21 Apr 2020 17:21:59 +0200 Subject: [PATCH 165/188] bug5219: a first successful test case for re-tracking a TracTrac race --- .../TracTracConnectivityParamsHandler.java | 5 +- .../domain/tractracadapter/DomainFactory.java | 7 +- .../impl/DomainFactoryImpl.java | 8 +- ...aceTrackingConnectivityParametersImpl.java | 20 +- .../impl/TracTracRaceTrackerImpl.java | 15 +- .../tracking/TrackedRegattaRegistry.java | 10 +- .../webservices/api/v2/leaderboardGetDoc.html | 3 +- .../org.eclipse.core.resources.prefs | 1 + ...ticRetrackUponCompetitorSetChangeTest.java | 183 ++++++++++++++++++ .../server/impl/RacingEventServiceImpl.java | 3 +- java/com.sap.sse.gwt/.project | 10 + .../GWT xdStorage Sample SDM.launch | 1 + java/com.sap.sse.gwt/META-INF/MANIFEST.MF | 3 - wiki/howto/onboarding.md | 1 + 14 files changed, 240 insertions(+), 30 deletions(-) create mode 100755 java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/AutomaticRetrackUponCompetitorSetChangeTest.java diff --git a/java/com.sap.sailing.domain.tractracadapter.persistence/src/com/sap/sailing/domain/tractracadapter/persistence/impl/TracTracConnectivityParamsHandler.java b/java/com.sap.sailing.domain.tractracadapter.persistence/src/com/sap/sailing/domain/tractracadapter/persistence/impl/TracTracConnectivityParamsHandler.java index 10feb5609f3..7306248e547 100644 --- a/java/com.sap.sailing.domain.tractracadapter.persistence/src/com/sap/sailing/domain/tractracadapter/persistence/impl/TracTracConnectivityParamsHandler.java +++ b/java/com.sap.sailing.domain.tractracadapter.persistence/src/com/sap/sailing/domain/tractracadapter/persistence/impl/TracTracConnectivityParamsHandler.java @@ -3,6 +3,7 @@ package com.sap.sailing.domain.tractracadapter.persistence.impl; import java.io.IOException; import java.net.MalformedURLException; import java.net.URI; +import java.net.URISyntaxException; import java.net.URL; import java.util.HashMap; import java.util.Map; @@ -24,6 +25,8 @@ import com.sap.sse.common.impl.MillisecondsDurationImpl; import com.sap.sse.common.impl.MillisecondsTimePoint; import com.sap.sse.security.SecurityService; import com.sap.sse.security.SessionUtils; +import com.tractrac.model.lib.api.event.CreateModelException; +import com.tractrac.util.lib.api.exceptions.TimeOutException; /** * Handles mapping TracTrac connectivity parameters from and to a map with {@link String} keys. The @@ -139,7 +142,7 @@ public class TracTracConnectivityParamsHandler extends AbstractRaceTrackingConne } private void updatePersistentTracTracConfiguration(RaceTrackingConnectivityParametersImpl params) - throws MalformedURLException, IOException, ParseException { + throws MalformedURLException, IOException, ParseException, CreateModelException, URISyntaxException, TimeOutException { final String jsonURL = params.getTractracRace().getParameterSet().getParameter("eventJSON"); final String creatorName = SessionUtils.getPrincipal().toString(); final TracTracConfigurationImpl tracTracConfiguration = new TracTracConfigurationImpl(creatorName, params.getTractracRace().getEvent().getName(), jsonURL, diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/DomainFactory.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/DomainFactory.java index 1ad3b41a51c..67db80c8ba2 100755 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/DomainFactory.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/DomainFactory.java @@ -65,6 +65,7 @@ import com.tractrac.model.lib.api.route.IControlPoint; import com.tractrac.subscription.lib.api.IEventSubscriber; import com.tractrac.subscription.lib.api.IRaceSubscriber; import com.tractrac.subscription.lib.api.SubscriberInitializationException; +import com.tractrac.util.lib.api.exceptions.TimeOutException; import difflib.PatchFailedException; @@ -152,8 +153,8 @@ public interface DomainFactory { WindStore windStore, TrackedRegattaRegistry trackedRegattaRegistry, RaceLogAndTrackedRaceResolver raceLogResolver, LeaderboardGroupResolver leaderboardGroupResolver, RaceTrackingConnectivityParametersImpl connectivityParams, long timeoutInMilliseconds, - RaceTrackingHandler raceTrackingHandler) - throws URISyntaxException, SubscriberInitializationException, IOException, InterruptedException; + RaceTrackingHandler raceTrackingHandler) throws URISyntaxException, SubscriberInitializationException, + IOException, InterruptedException, CreateModelException, TimeOutException; /** * Same as {@link #createRaceTracker(URL, URI, URI, URI, TimePoint, TimePoint, WindStore, TrackedRegattaRegistry)}, @@ -165,7 +166,7 @@ public interface DomainFactory { RaceTrackingConnectivityParametersImpl connectivityParams, long timeoutInMilliseconds, RaceTrackingHandler raceTrackingHandler) throws MalformedURLException, FileNotFoundException, URISyntaxException, CreateModelException, - SubscriberInitializationException, IOException, InterruptedException; + SubscriberInitializationException, IOException, InterruptedException, TimeOutException; BoatClass getOrCreateBoatClass(String competitorClassName); diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java index 490a229c015..63c90d7fbcc 100755 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java @@ -116,6 +116,7 @@ import com.tractrac.model.lib.api.route.IControlPoint; import com.tractrac.subscription.lib.api.IEventSubscriber; import com.tractrac.subscription.lib.api.IRaceSubscriber; import com.tractrac.subscription.lib.api.SubscriberInitializationException; +import com.tractrac.util.lib.api.exceptions.TimeOutException; import difflib.PatchFailedException; @@ -645,7 +646,8 @@ public class DomainFactoryImpl implements DomainFactory { try { raceDefinition = raceTrackingHandler.createRaceDefinition(trackedRegatta.getRegatta(), raceName, course, boatClass, competitorsAndBoats, raceId); } catch (RuntimeException exception) { - final String reasonForNotAddingRaceToRegatta = "Error while creating race " + raceDefinition + " for regatta " + trackedRegatta.getRegatta(); + final String reasonForNotAddingRaceToRegatta = "Error while creating race " + raceDefinition + + " for regatta " + trackedRegatta.getRegatta() + ": " + exception.getMessage(); errorWhileTryingToTrackRace(trackedRegatta, raceDefinitionSetToUpdate, raceDefinition, reasonForNotAddingRaceToRegatta); } } else { @@ -1029,7 +1031,7 @@ public class DomainFactoryImpl implements DomainFactory { LeaderboardGroupResolver leaderboardGroupResolver, RaceTrackingConnectivityParametersImpl connectivityParams, long timeoutInMilliseconds, RaceTrackingHandler raceTrackingHandler) - throws URISyntaxException, SubscriberInitializationException, IOException, InterruptedException { + throws URISyntaxException, SubscriberInitializationException, IOException, InterruptedException, CreateModelException, TimeOutException { return new TracTracRaceTrackerImpl(this, raceLogStore, regattaLogStore, windStore, trackedRegattaRegistry, raceLogResolver, leaderboardGroupResolver, connectivityParams, timeoutInMilliseconds, raceTrackingHandler); } @@ -1040,7 +1042,7 @@ public class DomainFactoryImpl implements DomainFactory { LeaderboardGroupResolver leaderboardGroupResolver, RaceTrackingConnectivityParametersImpl connectivityParams, long timeoutInMilliseconds, RaceTrackingHandler raceTrackingHandler) throws URISyntaxException, CreateModelException, - SubscriberInitializationException, IOException, InterruptedException { + SubscriberInitializationException, IOException, InterruptedException, TimeOutException { return new TracTracRaceTrackerImpl(regatta, this, raceLogStore, regattaLogStore, windStore, trackedRegattaRegistry, raceLogResolver, leaderboardGroupResolver, connectivityParams, timeoutInMilliseconds, raceTrackingHandler); } diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceTrackingConnectivityParametersImpl.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceTrackingConnectivityParametersImpl.java index 6e1257a58df..8307fb03296 100755 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceTrackingConnectivityParametersImpl.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceTrackingConnectivityParametersImpl.java @@ -25,6 +25,7 @@ import com.tractrac.model.lib.api.ModelLocator; import com.tractrac.model.lib.api.event.CreateModelException; import com.tractrac.model.lib.api.event.IRace; import com.tractrac.subscription.lib.api.SubscriberInitializationException; +import com.tractrac.util.lib.api.exceptions.TimeOutException; public class RaceTrackingConnectivityParametersImpl extends AbstractRaceTrackingConnectivityParameters { @@ -49,7 +50,6 @@ public class RaceTrackingConnectivityParametersImpl extends AbstractRaceTracking private final String raceVisibility; private final boolean useInternalMarkPassingAlgorithm; private final boolean preferReplayIfAvailable; - private final transient IRace tractracRace; private final int timeoutInMillis; private final boolean useOfficialEventsToUpdateRaceLog; @@ -78,11 +78,7 @@ public class RaceTrackingConnectivityParametersImpl extends AbstractRaceTracking this.useOfficialEventsToUpdateRaceLog = useOfficialEventsToUpdateRaceLog; this.paramURL = paramURL; this.timeoutInMillis = timeoutInMillis; - if (timeoutInMillis == -1) { - this.tractracRace = ModelLocator.getEventFactory().createRace(new URI(paramURL.toString())); - } else { - this.tractracRace = ModelLocator.getEventFactory().createRace(new URI(paramURL.toString()), timeoutInMillis); - } + final IRace tractracRace = getTractracRace(); if (preferReplayIfAvailable && isReplayRace(tractracRace) && (!Util.equalsWithNull(liveURI, tractracRace.getLiveURI()) || !Util.equalsWithNull(storedURI, tractracRace.getStoredURI()))) { logger.info("Replay format available and preferred for race " + tractracRace.getName() @@ -114,8 +110,14 @@ public class RaceTrackingConnectivityParametersImpl extends AbstractRaceTracking return tractracRace.getStoredURI() != null && tractracRace.getStoredURI().toString().toLowerCase().endsWith(".mtb"); } - public IRace getTractracRace() { - return tractracRace; + public IRace getTractracRace() throws CreateModelException, URISyntaxException, TimeOutException { + final IRace result; + if (getTimeoutInMillis() == -1) { + result = ModelLocator.getEventFactory().createRace(new URI(paramURL.toString())); + } else { + result = ModelLocator.getEventFactory().createRace(new URI(paramURL.toString()), getTimeoutInMillis()); + } + return result; } @Override @@ -127,7 +129,7 @@ public class RaceTrackingConnectivityParametersImpl extends AbstractRaceTracking public RaceTracker createRaceTracker(TrackedRegattaRegistry trackedRegattaRegistry, WindStore windStore, RaceLogAndTrackedRaceResolver raceLogResolver, LeaderboardGroupResolver leaderboardGroupResolver, long timeoutInMilliseconds, RaceTrackingHandler raceTrackingHandler) throws URISyntaxException, - CreateModelException, SubscriberInitializationException, IOException, InterruptedException { + CreateModelException, SubscriberInitializationException, IOException, InterruptedException, TimeOutException { RaceTracker tracker = domainFactory.createRaceTracker(raceLogStore, regattaLogStore, windStore, trackedRegattaRegistry, raceLogResolver, leaderboardGroupResolver, this, timeoutInMilliseconds, raceTrackingHandler); diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/TracTracRaceTrackerImpl.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/TracTracRaceTrackerImpl.java index 3f9d278809c..32c34f9e90d 100755 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/TracTracRaceTrackerImpl.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/TracTracRaceTrackerImpl.java @@ -56,6 +56,7 @@ import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.util.impl.ThreadFactoryWithPriority; +import com.tractrac.model.lib.api.event.CreateModelException; import com.tractrac.model.lib.api.event.DataSource; import com.tractrac.model.lib.api.event.ICompetitor; import com.tractrac.model.lib.api.event.IEvent; @@ -71,6 +72,7 @@ import com.tractrac.subscription.lib.api.event.IConnectionStatusListener; import com.tractrac.subscription.lib.api.event.ILiveDataEvent; import com.tractrac.subscription.lib.api.event.IStoredDataEvent; import com.tractrac.subscription.lib.api.race.IRacesListener; +import com.tractrac.util.lib.api.exceptions.TimeOutException; public class TracTracRaceTrackerImpl extends AbstractRaceTrackerImpl implements IConnectionStatusListener, TracTracRaceTracker, DynamicRaceDefinitionSet, TrackingDataLoader { @@ -270,11 +272,12 @@ public class TracTracRaceTrackerImpl extends AbstractRaceTrackerImpl * you expect things to have loaded; see also * {@link RaceTracker#TIMEOUT_FOR_RECEIVING_RACE_DEFINITION_IN_MILLISECONDS}. */ - TracTracRaceTrackerImpl(DomainFactory domainFactory, RaceLogStore raceLogStore, - RegattaLogStore regattaLogStore, WindStore windStore, TrackedRegattaRegistry trackedRegattaRegistry, - RaceLogAndTrackedRaceResolver raceLogResolver, LeaderboardGroupResolver leaderboardGroupResolver, RaceTrackingConnectivityParametersImpl connectivityParams, long timeoutInMilliseconds, - RaceTrackingHandler raceTrackingHandler) - throws URISyntaxException, SubscriberInitializationException, IOException, InterruptedException { + TracTracRaceTrackerImpl(DomainFactory domainFactory, RaceLogStore raceLogStore, RegattaLogStore regattaLogStore, + WindStore windStore, TrackedRegattaRegistry trackedRegattaRegistry, + RaceLogAndTrackedRaceResolver raceLogResolver, LeaderboardGroupResolver leaderboardGroupResolver, + RaceTrackingConnectivityParametersImpl connectivityParams, long timeoutInMilliseconds, + RaceTrackingHandler raceTrackingHandler) throws URISyntaxException, SubscriberInitializationException, + IOException, InterruptedException, CreateModelException, TimeOutException { this(/* regatta */ null, domainFactory, raceLogStore, regattaLogStore, windStore, trackedRegattaRegistry, raceLogResolver, leaderboardGroupResolver, connectivityParams, timeoutInMilliseconds, raceTrackingHandler); @@ -299,7 +302,7 @@ public class TracTracRaceTrackerImpl extends AbstractRaceTrackerImpl RaceLogAndTrackedRaceResolver raceLogResolver, LeaderboardGroupResolver leaderboardGroupResolver, RaceTrackingConnectivityParametersImpl connectivityParams, long timeoutInMilliseconds, RaceTrackingHandler raceTrackingHandler) - throws URISyntaxException, SubscriberInitializationException, IOException, InterruptedException { + throws URISyntaxException, SubscriberInitializationException, IOException, InterruptedException, CreateModelException, TimeOutException { super(connectivityParams); final URL paramURL = connectivityParams.getParamURL(); final URI liveURI = connectivityParams.getLiveURI(); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRegattaRegistry.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRegattaRegistry.java index 660ce53415e..d509d4aaf41 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRegattaRegistry.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRegattaRegistry.java @@ -102,11 +102,15 @@ public interface TrackedRegattaRegistry { * example, if tracking for a regatta shall be started early, so as to enable race officials to see the course * geometry and wind data for the first race of the day, then especially in self-service scenarios there may be late * competitors registrations that happen after tracking has been started. These competitors, depending on how the - * connector in use works, may make it into the regatta's leaderboard, but not into the {@link RaceDefinition}. - * This would be unfortunate as those competitors then would remain invisible until the race is reloaded.

      + * connector in use works, may make it into the regatta's leaderboard, but not into the {@link RaceDefinition}. This + * would be unfortunate as those competitors then would remain invisible until the race is reloaded. + *

      * * See also bug 5219 for a discussion. - * @return + * + * @return {@code null} if it was not possible to re-load the race, either because the regatta doesn't allow for it, + * or because the connectivity parameters were not found; a {@link RaceHandle} for the re-started race + * otherwise. */ RaceHandle updateRaceCompetitors(Regatta regatta, RaceDefinition race) throws Exception; } diff --git a/java/com.sap.sailing.server.gateway/webservices/api/v2/leaderboardGetDoc.html b/java/com.sap.sailing.server.gateway/webservices/api/v2/leaderboardGetDoc.html index 2da6202b5dd..6f961dd80d6 100644 --- a/java/com.sap.sailing.server.gateway/webservices/api/v2/leaderboardGetDoc.html +++ b/java/com.sap.sailing.server.gateway/webservices/api/v2/leaderboardGetDoc.html @@ -71,7 +71,8 @@ There is also the 'ALL' shortcut constant which can be used to get all available

    - + diff --git a/java/com.sap.sailing.server.test/.settings/org.eclipse.core.resources.prefs b/java/com.sap.sailing.server.test/.settings/org.eclipse.core.resources.prefs index 29bddf8ff60..954bc3db023 100755 --- a/java/com.sap.sailing.server.test/.settings/org.eclipse.core.resources.prefs +++ b/java/com.sap.sailing.server.test/.settings/org.eclipse.core.resources.prefs @@ -1,2 +1,3 @@ eclipse.preferences.version=1 +encoding//src/com/sap/sailing/server/test/AutomaticRetrackUponCompetitorSetChangeTest.java=UTF-8 encoding//src/com/sap/sailing/server/util/ShardingLeaderBoardEncodingTest.java=UTF-8 diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/AutomaticRetrackUponCompetitorSetChangeTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/AutomaticRetrackUponCompetitorSetChangeTest.java new file mode 100755 index 00000000000..8292cd87907 --- /dev/null +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/AutomaticRetrackUponCompetitorSetChangeTest.java @@ -0,0 +1,183 @@ +package com.sap.sailing.server.test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.fail; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.net.URI; +import java.net.URL; +import java.util.Arrays; +import java.util.Collections; +import java.util.GregorianCalendar; +import java.util.TimeZone; +import java.util.UUID; + +import org.mockito.Matchers; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.osgi.framework.BundleContext; + +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.CompetitorAndBoatStore; +import com.sap.sailing.domain.base.DomainFactory; +import com.sap.sailing.domain.base.RaceDefinition; +import com.sap.sailing.domain.base.Regatta; +import com.sap.sailing.domain.base.impl.DomainFactoryImpl; +import com.sap.sailing.domain.common.CompetitorRegistrationType; +import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; +import com.sap.sailing.domain.common.RegattaName; +import com.sap.sailing.domain.common.dto.FleetDTO; +import com.sap.sailing.domain.leaderboard.impl.LowPoint; +import com.sap.sailing.domain.persistence.DomainObjectFactory; +import com.sap.sailing.domain.persistence.MongoObjectFactory; +import com.sap.sailing.domain.persistence.PersistenceFactory; +import com.sap.sailing.domain.persistence.media.MediaDBFactory; +import com.sap.sailing.domain.racelog.RaceLogAndTrackedRaceResolver; +import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore; +import com.sap.sailing.domain.racelog.tracking.EmptySensorFixStore; +import com.sap.sailing.domain.ranking.OneDesignRankingMetric; +import com.sap.sailing.domain.regattalog.impl.EmptyRegattaLogStore; +import com.sap.sailing.domain.test.AbstractTracTracLiveTest; +import com.sap.sailing.domain.tracking.RaceHandle; +import com.sap.sailing.domain.tracking.RaceTracker; +import com.sap.sailing.domain.tracking.RaceTrackingConnectivityParameters; +import com.sap.sailing.domain.tracking.RaceTrackingHandler.DefaultRaceTrackingHandler; +import com.sap.sailing.domain.tracking.TrackedRace; +import com.sap.sailing.domain.tracking.impl.EmptyWindStore; +import com.sap.sailing.server.impl.RacingEventServiceImpl; +import com.sap.sailing.server.impl.RacingEventServiceImpl.ConstructorParameters; +import com.sap.sailing.server.interfaces.RacingEventService; +import com.sap.sailing.server.operationaltransformation.CreateTrackedRace; +import com.sap.sailing.server.operationaltransformation.UpdateSeries; +import com.sap.sailing.server.testsupport.SecurityBundleTestWrapper; +import com.sap.sse.common.Color; +import com.sap.sse.common.Util; +import com.sap.sse.common.impl.MillisecondsTimePoint; +import com.sap.sse.mongodb.MongoDBService; +import com.sap.sse.replication.FullyInitializedReplicableTracker; +import com.sap.sse.replication.OperationExecutionListener; +import com.sap.sse.replication.OperationWithResult; +import com.sap.sse.security.SecurityService; + +/** + * See also bug 5219 (https://bugzilla.sapsailing.com/bugzilla/show_bug.cgi?id=5219). + * + * @author Axel Uhl (D043530) + * + */ +public class AutomaticRetrackUponCompetitorSetChangeTest { + private TrackedRace trackedRace; + private RegattaAndRaceIdentifier raceIdentifier; + private RaceHandle racesHandle; + private final boolean[] notifier = new boolean[1]; + private RaceTrackingConnectivityParameters trackingParams; + private RacingEventServiceImpl service; + private MongoDBService mongoDBService; + private MongoObjectFactory mongoObjectFactory; + + @Before + public void setUp() throws Exception { + final BundleContext contextMock = mock(BundleContext.class); + when(contextMock.createFilter(Matchers.anyObject())).thenReturn(null); + mongoDBService = MongoDBService.INSTANCE; + mongoDBService.getDB().drop(); + mongoObjectFactory = PersistenceFactory.INSTANCE.getMongoObjectFactory(mongoDBService); + final SecurityService securityService = new SecurityBundleTestWrapper().initializeSecurityServiceForTesting(); + service = new RacingEventServiceImpl((final RaceLogAndTrackedRaceResolver raceLogResolver)-> { + return new ConstructorParameters() { + private final DomainFactory baseDomainFactory = new DomainFactoryImpl(raceLogResolver); + @Override public DomainObjectFactory getDomainObjectFactory() { return PersistenceFactory.INSTANCE.getDomainObjectFactory(mongoDBService, baseDomainFactory); } + @Override public MongoObjectFactory getMongoObjectFactory() { return mongoObjectFactory; } + @Override public DomainFactory getBaseDomainFactory() { return baseDomainFactory; } + @Override public CompetitorAndBoatStore getCompetitorAndBoatStore() { return getBaseDomainFactory().getCompetitorAndBoatStore(); } + }; + }, MediaDBFactory.INSTANCE.getMediaDB(mongoDBService), EmptyWindStore.INSTANCE, + EmptySensorFixStore.INSTANCE, null, null, /* sailingNotificationService */ null, + /* trackedRaceStatisticsCache */ null, /* restoreTrackedRaces */ false, + /* security service tracker */ new FullyInitializedReplicableTracker(contextMock, (String) "class", null, null) { + @Override + public SecurityService getInitializedService(long timeoutInMillis) throws InterruptedException { + return securityService; + } + }, /* sharedSailingData */ null, /* replicationServiceTracker */ null, + /* scoreCorrectionProviderServiceTracker */ null, /* resultUrlRegistryServiceTracker */ null); + URL paramURL = new URL("http://event.tractrac.com/events/event_20150818_Bundesliga/4c54e750-27c2-0133-5064-60a44ce903c3.txt"); + URI liveURI = AbstractTracTracLiveTest.getLiveURI(); + URI storedURI = new URI("http://event.tractrac.com/events/event_20150818_Bundesliga/datafiles/4c54e750-27c2-0133-5064-60a44ce903c3.mtb"); + URI courseDesignUpdateURI = AbstractTracTracLiveTest.getCourseDesignUpdateURI(); + String tracTracUsername = AbstractTracTracLiveTest.getTracTracUsername(); + String tracTracPassword = AbstractTracTracLiveTest.getTracTracPassword(); + GregorianCalendar cal = new GregorianCalendar(TimeZone.getTimeZone("UTC")); + cal.set(2015, 8, 22, 9, 23, 57); + MillisecondsTimePoint startOfTracking = new MillisecondsTimePoint(cal.getTimeInMillis()); + cal.set(2015, 8, 22, 15, 26, 34); + MillisecondsTimePoint endOfTracking = new MillisecondsTimePoint(cal.getTimeInMillis()); + service.addOperationExecutionListener(new OperationExecutionListener() { + @Override + public void executed(OperationWithResult operation) { + if (operation instanceof CreateTrackedRace) { + synchronized (notifier) { + notifier[0] = true; + notifier.notifyAll(); + } + } + } + }); + trackingParams = new com.sap.sailing.domain.tractracadapter.impl.DomainFactoryImpl(service.getBaseDomainFactory()) + .createTrackingConnectivityParameters(paramURL, liveURI, storedURI, courseDesignUpdateURI, + startOfTracking, endOfTracking, /* delayToLiveInMillis */ + 0l, /* offsetToStartTimeOfSimulatedRace */null, /*ignoreTracTracMarkPassings*/ false, EmptyRaceLogStore.INSTANCE, + EmptyRegattaLogStore.INSTANCE, tracTracUsername, tracTracPassword, "", "", /* trackWind */ false, /* correctWindDirectionByMagneticDeclination */ false, + /* preferReplayIfAvailable */ false, /* timeoutInMillis */ (int) RaceTracker.TIMEOUT_FOR_RECEIVING_RACE_DEFINITION_IN_MILLISECONDS, /* useOfficialEventsToUpdateRaceLog */ false); + } + + private void startTracking() throws Exception { + final Regatta regatta = service.createRegatta("Test regatta", "J/70", + /* canBoatsOfCompetitorsChangePerRace==true because it's a league race we're using for this test */ true, + CompetitorRegistrationType.CLOSED, /* registrationLinkSecret */ null, + /* startDate */ null, /* endDate */ null, UUID.randomUUID(), + /* start with no series */ Collections.emptySet(), + /* persistent */ true, new LowPoint(), /* defaultCourseAreaId */ UUID.randomUUID(), + /* buoyZoneRadiusInHullLengths */ 2., /* useStartTimeInference */ false, /* controlTrackingFromStartAndFinishTimes */ false, + /* autoRestartTrackingUponCompetitorSetChange */ true, /* rankingMetricConstructor */ OneDesignRankingMetric::new); + final RegattaName regattaIdentifier = new RegattaName(regatta.getName()); + service.apply(new UpdateSeries(regattaIdentifier, "Default", "Default", /* isMedal */ false, /* isFleetsCanRunInParallel */ false, + /* resultDiscardingThresholds */ null, /* startsWithZeroScore */ false, /* firstColumnIsNonDiscardableCarryForward */ false, + /* hasSplitFleetContiguousScoring */ false, /* maximumNumberOfDiscards */ null, + Arrays.asList(new FleetDTO("Red", 0, Color.RED), new FleetDTO("Green", 0, Color.GREEN), new FleetDTO("Blue", 0, Color.BLUE)))); + racesHandle = service.addRace(/* regattaToAddTo */ regattaIdentifier, trackingParams, /* timeoutInMilliseconds */ 60000, + new DefaultRaceTrackingHandler()); + // wait for the race to show up + RaceDefinition race = racesHandle.getRace(RaceTracker.TIMEOUT_FOR_RECEIVING_RACE_DEFINITION_IN_MILLISECONDS); + if (race == null) { + fail("Waiting for tracked race timed out"); + } + raceIdentifier = racesHandle.getRaceTracker().getRaceIdentifier(); + trackedRace = service.getTrackedRace(raceIdentifier); + } + + @Test + public void testStartTrackingAndRetrack() throws Exception { + startTracking(); + final RaceDefinition race = trackedRace.getRace(); + Iterable masterCompetitors = race.getCompetitors(); + assertEquals(Util.size(masterCompetitors), 6); + final RaceHandle newHandle = service.updateRaceCompetitors(trackedRace.getTrackedRegatta().getRegatta(), race); + final RaceDefinition newRace = newHandle.getRace(RaceTracker.TIMEOUT_FOR_RECEIVING_RACE_DEFINITION_IN_MILLISECONDS); + assertNotNull(newRace); + assertEquals(race.getId(), newRace.getId()); + assertNotSame(race, newRace); + racesHandle = newHandle; // ensure that tearDown tears down the correct tracker + } + + @After + public void tearDown() throws Exception { + if (racesHandle != null) { + racesHandle.getRaceTracker().stop(/* preemptive */ false); + } + } +} diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java index ea25ba5c4eb..da97bcfc946 100644 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java @@ -2760,7 +2760,8 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes final RaceTrackingConnectivityParameters connectivityParams = connectivityParametersByRace.get(race); if (connectivityParams != null) { removeRace(regatta, race); - result = addRace(regatta.getRegattaIdentifier(), connectivityParams, RaceTracker.TIMEOUT_FOR_RECEIVING_RACE_DEFINITION_IN_MILLISECONDS); + result = addRace(regatta.getRegattaIdentifier(), connectivityParams, RaceTracker.TIMEOUT_FOR_RECEIVING_RACE_DEFINITION_IN_MILLISECONDS, + new DefaultRaceTrackingHandler()); // no need for ownership setting here because we're only "re-tracking" an existing race } else { result = null; logger.warning("Unable to update race competitors for race "+race+" in regatta "+regatta+ diff --git a/java/com.sap.sse.gwt/.project b/java/com.sap.sse.gwt/.project index 34ac3ebf196..c975154713e 100644 --- a/java/com.sap.sse.gwt/.project +++ b/java/com.sap.sse.gwt/.project @@ -10,6 +10,16 @@ + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + com.gwtplugins.gdt.eclipse.core.webAppProjectValidator diff --git a/java/com.sap.sse.gwt/GWT xdStorage Sample SDM.launch b/java/com.sap.sse.gwt/GWT xdStorage Sample SDM.launch index dc16113d7db..572f6d4959c 100755 --- a/java/com.sap.sse.gwt/GWT xdStorage Sample SDM.launch +++ b/java/com.sap.sse.gwt/GWT xdStorage Sample SDM.launch @@ -51,6 +51,7 @@ + diff --git a/java/com.sap.sse.gwt/META-INF/MANIFEST.MF b/java/com.sap.sse.gwt/META-INF/MANIFEST.MF index 4c1cd5587c3..1b3bae5feba 100644 --- a/java/com.sap.sse.gwt/META-INF/MANIFEST.MF +++ b/java/com.sap.sse.gwt/META-INF/MANIFEST.MF @@ -59,11 +59,9 @@ Export-Package: com.google.gwt.user.client.rpc.core.java.util, com.sap.sse.gwt.client.useragent, com.sap.sse.gwt.client.xdstorage, com.sap.sse.gwt.common, - com.sap.sse.gwt.dispatch.client, com.sap.sse.gwt.dispatch.client.system, com.sap.sse.gwt.dispatch.client.system.batching, com.sap.sse.gwt.dispatch.client.system.caching, - com.sap.sse.gwt.dispatch.client.system.routing, com.sap.sse.gwt.dispatch.client.transport.gwtrpc, com.sap.sse.gwt.dispatch.servlets, com.sap.sse.gwt.dispatch.shared.caching, @@ -73,7 +71,6 @@ Export-Package: com.google.gwt.user.client.rpc.core.java.util, com.sap.sse.gwt.resources, com.sap.sse.gwt.server, com.sap.sse.gwt.server.filestorage, - com.sap.sse.gwt.server.replication, com.sap.sse.gwt.settings, com.sap.sse.gwt.shared, com.sap.sse.gwt.shared.filestorage, diff --git a/wiki/howto/onboarding.md b/wiki/howto/onboarding.md index 0c26244fcaa..6e44ca84b21 100644 --- a/wiki/howto/onboarding.md +++ b/wiki/howto/onboarding.md @@ -114,6 +114,7 @@ The primary Git repository for the project is hosted on sapsailing.com. It is mi 4. On clear workspace additional steps should be performed once: 1. Run "GWT Dashboards SDM" launch configuration. After successful start, launch configuration can be stopped. 2. Run "GWT Security SDM" launch configuration. After successful start, launch configuration can be stopped. + 3. Run "GWT xdStorage Sample SDM" launch configuration. After successful start, launch configuration can be stopped. 5. Run the Race Analysis Suite * Start the MongoDB (cd /somePathTo MongoDB/mongodb/bin; rm c:/data/SAP/sailing/mongodb/mongod.lock; ./mongod --dbpath c:/data/SAP/sailing/mongodb) * Start the appropriate Eclipse launch configuration (e.g. 'Sailing Server (no Proxy)') You´ll find this in the debug dropdown From f4dce2e7754635d7062c3f4e6b14617eac3e0300 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 21 Apr 2020 18:46:11 +0200 Subject: [PATCH 166/188] bug5219: added a failing test case for race log tracking automatic re-track after adding competitor to regatta log --- ...ticRetrackUponCompetitorSetChangeTest.java | 120 ++++++++++++------ 1 file changed, 83 insertions(+), 37 deletions(-) diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/AutomaticRetrackUponCompetitorSetChangeTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/AutomaticRetrackUponCompetitorSetChangeTest.java index 8292cd87907..2c958b00ddf 100755 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/AutomaticRetrackUponCompetitorSetChangeTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/AutomaticRetrackUponCompetitorSetChangeTest.java @@ -3,6 +3,8 @@ package com.sap.sailing.server.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -14,16 +16,24 @@ import java.util.Collections; import java.util.GregorianCalendar; import java.util.TimeZone; import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; -import org.mockito.Matchers; import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.mockito.Matchers; import org.osgi.framework.BundleContext; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; +import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogRegisterCompetitorEventImpl; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CompetitorAndBoatStore; +import com.sap.sailing.domain.base.CompetitorWithBoat; import com.sap.sailing.domain.base.DomainFactory; +import com.sap.sailing.domain.base.Fleet; +import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.impl.DomainFactoryImpl; @@ -31,6 +41,8 @@ import com.sap.sailing.domain.common.CompetitorRegistrationType; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.RegattaName; import com.sap.sailing.domain.common.dto.FleetDTO; +import com.sap.sailing.domain.common.racelog.tracking.NotDenotedForRaceLogTrackingException; +import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.impl.LowPoint; import com.sap.sailing.domain.persistence.DomainObjectFactory; import com.sap.sailing.domain.persistence.MongoObjectFactory; @@ -39,9 +51,12 @@ import com.sap.sailing.domain.persistence.media.MediaDBFactory; import com.sap.sailing.domain.racelog.RaceLogAndTrackedRaceResolver; import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore; import com.sap.sailing.domain.racelog.tracking.EmptySensorFixStore; +import com.sap.sailing.domain.racelogtracking.RaceLogTrackingAdapter; +import com.sap.sailing.domain.racelogtracking.RaceLogTrackingAdapterFactory; import com.sap.sailing.domain.ranking.OneDesignRankingMetric; import com.sap.sailing.domain.regattalog.impl.EmptyRegattaLogStore; import com.sap.sailing.domain.test.AbstractTracTracLiveTest; +import com.sap.sailing.domain.test.TrackBasedTest; import com.sap.sailing.domain.tracking.RaceHandle; import com.sap.sailing.domain.tracking.RaceTracker; import com.sap.sailing.domain.tracking.RaceTrackingConnectivityParameters; @@ -50,8 +65,8 @@ import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.impl.EmptyWindStore; import com.sap.sailing.server.impl.RacingEventServiceImpl; import com.sap.sailing.server.impl.RacingEventServiceImpl.ConstructorParameters; -import com.sap.sailing.server.interfaces.RacingEventService; -import com.sap.sailing.server.operationaltransformation.CreateTrackedRace; +import com.sap.sailing.server.operationaltransformation.AddColumnToSeries; +import com.sap.sailing.server.operationaltransformation.CreateRegattaLeaderboard; import com.sap.sailing.server.operationaltransformation.UpdateSeries; import com.sap.sailing.server.testsupport.SecurityBundleTestWrapper; import com.sap.sse.common.Color; @@ -59,8 +74,6 @@ import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; import com.sap.sse.mongodb.MongoDBService; import com.sap.sse.replication.FullyInitializedReplicableTracker; -import com.sap.sse.replication.OperationExecutionListener; -import com.sap.sse.replication.OperationWithResult; import com.sap.sse.security.SecurityService; /** @@ -70,14 +83,17 @@ import com.sap.sse.security.SecurityService; * */ public class AutomaticRetrackUponCompetitorSetChangeTest { + private static final String FIRST_RACE_COLUMN_NAME = "R1"; + private static final String BLUE_FLEET_NAME = "Blue"; + private static final String GREEN_FLEET_NAME = "Green"; + private static final String RED_FLEET_NAME = "Red"; private TrackedRace trackedRace; private RegattaAndRaceIdentifier raceIdentifier; private RaceHandle racesHandle; - private final boolean[] notifier = new boolean[1]; - private RaceTrackingConnectivityParameters trackingParams; private RacingEventServiceImpl service; private MongoDBService mongoDBService; private MongoObjectFactory mongoObjectFactory; + private RegattaName regattaIdentifier; @Before public void setUp() throws Exception { @@ -105,6 +121,25 @@ public class AutomaticRetrackUponCompetitorSetChangeTest { } }, /* sharedSailingData */ null, /* replicationServiceTracker */ null, /* scoreCorrectionProviderServiceTracker */ null, /* resultUrlRegistryServiceTracker */ null); + final Regatta regatta = service.createRegatta("Test regatta", "J/70", + /* canBoatsOfCompetitorsChangePerRace==true because it's a league race we're using for this test */ true, + CompetitorRegistrationType.CLOSED, /* registrationLinkSecret */ null, + /* startDate */ null, /* endDate */ null, UUID.randomUUID(), + /* start with no series */ Collections.emptySet(), + /* persistent */ true, new LowPoint(), /* defaultCourseAreaId */ UUID.randomUUID(), + /* buoyZoneRadiusInHullLengths */ 2., /* useStartTimeInference */ false, /* controlTrackingFromStartAndFinishTimes */ false, + /* autoRestartTrackingUponCompetitorSetChange */ true, /* rankingMetricConstructor */ OneDesignRankingMetric::new); + regattaIdentifier = new RegattaName(regatta.getName()); + final String seriesName = "Default"; + service.apply(new UpdateSeries(regattaIdentifier, seriesName, seriesName, /* isMedal */ false, /* isFleetsCanRunInParallel */ false, + /* resultDiscardingThresholds */ null, /* startsWithZeroScore */ false, /* firstColumnIsNonDiscardableCarryForward */ false, + /* hasSplitFleetContiguousScoring */ false, /* maximumNumberOfDiscards */ null, + Arrays.asList(new FleetDTO(RED_FLEET_NAME, 0, Color.RED), new FleetDTO(GREEN_FLEET_NAME, 0, Color.GREEN), new FleetDTO(BLUE_FLEET_NAME, 0, Color.BLUE)))); + service.apply(new CreateRegattaLeaderboard(regattaIdentifier, /* leaderboardDisplayName */ null, new int[0])); + service.apply(new AddColumnToSeries(regattaIdentifier, seriesName, FIRST_RACE_COLUMN_NAME)); + } + + private void startTrackingTracTrac() throws Exception { URL paramURL = new URL("http://event.tractrac.com/events/event_20150818_Bundesliga/4c54e750-27c2-0133-5064-60a44ce903c3.txt"); URI liveURI = AbstractTracTracLiveTest.getLiveURI(); URI storedURI = new URI("http://event.tractrac.com/events/event_20150818_Bundesliga/datafiles/4c54e750-27c2-0133-5064-60a44ce903c3.mtb"); @@ -116,41 +151,21 @@ public class AutomaticRetrackUponCompetitorSetChangeTest { MillisecondsTimePoint startOfTracking = new MillisecondsTimePoint(cal.getTimeInMillis()); cal.set(2015, 8, 22, 15, 26, 34); MillisecondsTimePoint endOfTracking = new MillisecondsTimePoint(cal.getTimeInMillis()); - service.addOperationExecutionListener(new OperationExecutionListener() { - @Override - public void executed(OperationWithResult operation) { - if (operation instanceof CreateTrackedRace) { - synchronized (notifier) { - notifier[0] = true; - notifier.notifyAll(); - } - } - } - }); - trackingParams = new com.sap.sailing.domain.tractracadapter.impl.DomainFactoryImpl(service.getBaseDomainFactory()) + final RaceTrackingConnectivityParameters trackingParams = new com.sap.sailing.domain.tractracadapter.impl.DomainFactoryImpl(service.getBaseDomainFactory()) .createTrackingConnectivityParameters(paramURL, liveURI, storedURI, courseDesignUpdateURI, startOfTracking, endOfTracking, /* delayToLiveInMillis */ 0l, /* offsetToStartTimeOfSimulatedRace */null, /*ignoreTracTracMarkPassings*/ false, EmptyRaceLogStore.INSTANCE, EmptyRegattaLogStore.INSTANCE, tracTracUsername, tracTracPassword, "", "", /* trackWind */ false, /* correctWindDirectionByMagneticDeclination */ false, /* preferReplayIfAvailable */ false, /* timeoutInMillis */ (int) RaceTracker.TIMEOUT_FOR_RECEIVING_RACE_DEFINITION_IN_MILLISECONDS, /* useOfficialEventsToUpdateRaceLog */ false); - } - - private void startTracking() throws Exception { - final Regatta regatta = service.createRegatta("Test regatta", "J/70", - /* canBoatsOfCompetitorsChangePerRace==true because it's a league race we're using for this test */ true, - CompetitorRegistrationType.CLOSED, /* registrationLinkSecret */ null, - /* startDate */ null, /* endDate */ null, UUID.randomUUID(), - /* start with no series */ Collections.emptySet(), - /* persistent */ true, new LowPoint(), /* defaultCourseAreaId */ UUID.randomUUID(), - /* buoyZoneRadiusInHullLengths */ 2., /* useStartTimeInference */ false, /* controlTrackingFromStartAndFinishTimes */ false, - /* autoRestartTrackingUponCompetitorSetChange */ true, /* rankingMetricConstructor */ OneDesignRankingMetric::new); - final RegattaName regattaIdentifier = new RegattaName(regatta.getName()); - service.apply(new UpdateSeries(regattaIdentifier, "Default", "Default", /* isMedal */ false, /* isFleetsCanRunInParallel */ false, - /* resultDiscardingThresholds */ null, /* startsWithZeroScore */ false, /* firstColumnIsNonDiscardableCarryForward */ false, - /* hasSplitFleetContiguousScoring */ false, /* maximumNumberOfDiscards */ null, - Arrays.asList(new FleetDTO("Red", 0, Color.RED), new FleetDTO("Green", 0, Color.GREEN), new FleetDTO("Blue", 0, Color.BLUE)))); racesHandle = service.addRace(/* regattaToAddTo */ regattaIdentifier, trackingParams, /* timeoutInMilliseconds */ 60000, new DefaultRaceTrackingHandler()); + waitForRace(); + } + + /** + * Waits for the race to show up and initializes {@link #raceIdentifier} and {@link #trackedRace}. + */ + private void waitForRace() { // wait for the race to show up RaceDefinition race = racesHandle.getRace(RaceTracker.TIMEOUT_FOR_RECEIVING_RACE_DEFINITION_IN_MILLISECONDS); if (race == null) { @@ -161,8 +176,8 @@ public class AutomaticRetrackUponCompetitorSetChangeTest { } @Test - public void testStartTrackingAndRetrack() throws Exception { - startTracking(); + public void testStartTracTracTrackingAndRetrack() throws Exception { + startTrackingTracTrac(); final RaceDefinition race = trackedRace.getRace(); Iterable masterCompetitors = race.getCompetitors(); assertEquals(Util.size(masterCompetitors), 6); @@ -173,6 +188,37 @@ public class AutomaticRetrackUponCompetitorSetChangeTest { assertNotSame(race, newRace); racesHandle = newHandle; // ensure that tearDown tears down the correct tracker } + + @Test + public void testStartRaceLogTrackingAndAddCompetitor() throws NotDenotedForRaceLogTrackingException, Exception { + final RaceLog raceLog = service.getRaceLog(regattaIdentifier.getRegattaName(), FIRST_RACE_COLUMN_NAME, RED_FLEET_NAME); + assertNotNull(raceLog); + final RegattaLog regattaLog = service.getRegatta(regattaIdentifier).getRegattaLog(); + final CompetitorWithBoat firstCompetitor = TrackBasedTest.createCompetitorWithBoat("First Competitor"); + final CompetitorWithBoat secondCompetitor = TrackBasedTest.createCompetitorWithBoat("Second Competitor"); + regattaLog.add(new RegattaLogRegisterCompetitorEventImpl(MillisecondsTimePoint.now(), service.getServerAuthor(), firstCompetitor)); + final RaceLogTrackingAdapter factory = RaceLogTrackingAdapterFactory.INSTANCE.getAdapter(service.getBaseDomainFactory()); + final Leaderboard leaderboard = service.getLeaderboardByName(regattaIdentifier.getRegattaName()); + final RaceColumn raceColumn = leaderboard.getRaceColumnByName(FIRST_RACE_COLUMN_NAME); + final Fleet redFleet = raceColumn.getFleetByName(RED_FLEET_NAME); + factory.denoteAllRacesForRaceLogTracking(service, leaderboard, /* prefix */ "R"); + racesHandle = factory.startTracking(service, leaderboard, raceColumn, redFleet, /* trackWind */ false, + /* correctWindDirectionByMagneticDeclination */ true, new DefaultRaceTrackingHandler()); + waitForRace(); + final RegattaAndRaceIdentifier raceIdentifier = trackedRace.getRaceIdentifier(); + assertEquals(1, Util.size(trackedRace.getRace().getCompetitors())); + assertSame(firstCompetitor, trackedRace.getRace().getCompetitors().iterator().next()); + regattaLog.add(new RegattaLogRegisterCompetitorEventImpl(MillisecondsTimePoint.now(), service.getServerAuthor(), firstCompetitor)); + // Now add a second competitor registration ("late-comer") to the regatta log and expect the race to reload: + regattaLog.add(new RegattaLogRegisterCompetitorEventImpl(MillisecondsTimePoint.now(), service.getServerAuthor(), secondCompetitor)); + final CompletableFuture raceTrackerFuture = new CompletableFuture<>(); + service.getRaceTrackerByRegattaAndRaceIdentifier(raceIdentifier, raceTracker->raceTrackerFuture.complete(raceTracker)); + final RaceTracker raceTracker = raceTrackerFuture.get(RaceTracker.TIMEOUT_FOR_RECEIVING_RACE_DEFINITION_IN_MILLISECONDS, TimeUnit.MILLISECONDS); + final RaceDefinition newRace = raceTracker.getRace(); + assertEquals(2, Util.size(newRace.getCompetitors())); + assertTrue(Util.contains(newRace.getCompetitors(), firstCompetitor)); + assertTrue(Util.contains(newRace.getCompetitors(), secondCompetitor)); + } @After public void tearDown() throws Exception { From c8c3f8da35d949a04f623d2b3792231bebbb5e2a Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 21 Apr 2020 19:10:50 +0200 Subject: [PATCH 167/188] bug5219: added logic to race log tracking that re-tracks race when competitors change; this makes the test case green that was previously red --- .../impl/RaceLogRaceTracker.java | 70 ++++++++++++++++--- ...ticRetrackUponCompetitorSetChangeTest.java | 1 - .../src/com/sap/sse/common/Util.java | 18 ++++- 3 files changed, 78 insertions(+), 11 deletions(-) diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java index 596e42a0509..f0280bd3dc5 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java @@ -20,6 +20,7 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogEndOfTrackingEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; import com.sap.sailing.domain.abstractlog.race.RaceLogRaceStatusEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogRevokeEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogStartOfTrackingEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.LastPublishedCourseDesignFinder; @@ -28,12 +29,18 @@ import com.sap.sailing.domain.abstractlog.race.impl.BaseRaceLogEventVisitor; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEndOfTrackingEventImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogStartOfTrackingEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceInformationFinder; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RegisteredCompetitorsAndBoatsAnalyzer; +import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogRegisterCompetitorEventImpl; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDefineMarkEvent; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogRegisterCompetitorEvent; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogRevokeEvent; +import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogRegisterCompetitorEventImpl; import com.sap.sailing.domain.abstractlog.regatta.impl.BaseRegattaLogEventVisitor; import com.sap.sailing.domain.base.Boat; import com.sap.sailing.domain.base.BoatClass; @@ -146,6 +153,26 @@ public class RaceLogRaceTracker extends AbstractRaceTrackerBaseImpl { trackedRace.updateStartAndEndOfTracking(/* waitForGPSFixesToLoad */ false); } } + + @Override + public void visit(RaceLogRevokeEvent event) { + if (event.getRevokedEventType().equals(RaceLogRegisterCompetitorEventImpl.class.getName())) { + try { + checkForChangeOfCompetitorSet(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } + + @Override + public void visit(RaceLogRegisterCompetitorEvent event) { + try { + checkForChangeOfCompetitorSet(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } }; visitors.put(log, visitor); ((RaceLog) log).addListener(visitor); @@ -155,6 +182,26 @@ public class RaceLogRaceTracker extends AbstractRaceTrackerBaseImpl { public void visit(RegattaLogDefineMarkEvent event) { RaceLogRaceTracker.this.onDefineMarkEvent(event); } + + @Override + public void visit(RegattaLogRevokeEvent event) { + if (event.getRevokedEventType().equals(RegattaLogRegisterCompetitorEventImpl.class.getName())) { + try { + checkForChangeOfCompetitorSet(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } + + @Override + public void visit(RegattaLogRegisterCompetitorEvent event) { + try { + checkForChangeOfCompetitorSet(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } }; visitors.put(log, visitor); ((RegattaLog) log).addListener(visitor); @@ -168,6 +215,13 @@ public class RaceLogRaceTracker extends AbstractRaceTrackerBaseImpl { } } + private void checkForChangeOfCompetitorSet() throws Exception { + final Map competitorsAndTheirBoats = new RegisteredCompetitorsAndBoatsAnalyzer(params.getRaceLog(), params.getRegattaLog()).analyze(); + if (!Util.setEquals(competitorsAndTheirBoats.keySet(), getRace().getCompetitors())) { + trackedRegattaRegistry.updateRaceCompetitors(getRegatta(), getRace()); + } + } + @Override protected void onStop(boolean preemptive, boolean willBeRemoved) { RaceLog raceLog = params.getRaceLog(); @@ -273,18 +327,18 @@ public class RaceLogRaceTracker extends AbstractRaceTrackerBaseImpl { } private void startTracking(RaceLogStartTrackingEvent event) { - RaceLog raceLog = params.getRaceLog(); - RaceColumn raceColumn = params.getRaceColumn(); - Fleet fleet = params.getFleet(); - RaceLogDenoteForTrackingEvent denoteEvent = new RaceInformationFinder(raceLog).analyze(); + final RaceLog raceLog = params.getRaceLog(); + final RaceColumn raceColumn = params.getRaceColumn(); + final Fleet fleet = params.getFleet(); + final RaceLogDenoteForTrackingEvent denoteEvent = new RaceInformationFinder(raceLog).analyze(); final Pair trackingTimes = new TrackingTimesFinder(raceLog).analyze(); if (!trackedRegatta.getRegatta().isControlTrackingFromStartAndFinishTimes() && (trackingTimes == null || trackingTimes.getA() == null || trackingTimes.getA().getTimePoint() == null)) { // the start of tracking interval is unset or set to null; enter "now" as start of tracking into the race log raceLog.add(new RaceLogStartOfTrackingEventImpl(MillisecondsTimePoint.now(), raceLogEventAuthor, raceLog.getCurrentPassId())); } - BoatClass boatClass = denoteEvent.getBoatClass(); - String raceName = denoteEvent.getRaceName(); + final BoatClass boatClass = denoteEvent.getBoatClass(); + final String raceName = denoteEvent.getRaceName(); CourseBase courseBase = new LastPublishedCourseDesignFinder(raceLog, /* onlyCoursesWithValidWaypointList */ true).analyze(); if (courseBase == null) { courseBase = new CourseDataImpl("Default course for " + raceName); @@ -303,8 +357,8 @@ public class RaceLogRaceTracker extends AbstractRaceTrackerBaseImpl { } throw new RaceNotCreatedException(String.format("Race for racelog (%s) has already been created", raceLog)); } - Map competitorsAndTheirBoats = raceColumn.getAllCompetitorsAndTheirBoats(params.getFleet()); - Serializable raceId = denoteEvent.getRaceId(); + final Map competitorsAndTheirBoats = raceColumn.getAllCompetitorsAndTheirBoats(params.getFleet()); + final Serializable raceId = denoteEvent.getRaceId(); try { final RaceDefinition raceDef = raceTrackingHandler.createRaceDefinition(trackedRegatta.getRegatta(), raceName, course, boatClass, competitorsAndTheirBoats, raceId); diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/AutomaticRetrackUponCompetitorSetChangeTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/AutomaticRetrackUponCompetitorSetChangeTest.java index 2c958b00ddf..0bc7c72e049 100755 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/AutomaticRetrackUponCompetitorSetChangeTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/AutomaticRetrackUponCompetitorSetChangeTest.java @@ -208,7 +208,6 @@ public class AutomaticRetrackUponCompetitorSetChangeTest { final RegattaAndRaceIdentifier raceIdentifier = trackedRace.getRaceIdentifier(); assertEquals(1, Util.size(trackedRace.getRace().getCompetitors())); assertSame(firstCompetitor, trackedRace.getRace().getCompetitors().iterator().next()); - regattaLog.add(new RegattaLogRegisterCompetitorEventImpl(MillisecondsTimePoint.now(), service.getServerAuthor(), firstCompetitor)); // Now add a second competitor registration ("late-comer") to the regatta log and expect the race to reload: regattaLog.add(new RegattaLogRegisterCompetitorEventImpl(MillisecondsTimePoint.now(), service.getServerAuthor(), secondCompetitor)); final CompletableFuture raceTrackerFuture = new CompletableFuture<>(); diff --git a/java/com.sap.sse.common/src/com/sap/sse/common/Util.java b/java/com.sap.sse.common/src/com/sap/sse/common/Util.java index eb420f8cff3..05a7de6b6da 100755 --- a/java/com.sap.sse.common/src/com/sap/sse/common/Util.java +++ b/java/com.sap.sse.common/src/com/sap/sse/common/Util.java @@ -764,8 +764,13 @@ public class Util { } public static Set asSet(Iterable iterable) { - final Set result = new HashSet<>(); - addAll(iterable, result); + final Set result; + if (iterable instanceof Set) { + result = (Set) iterable; + } else { + result = new HashSet<>(); + addAll(iterable, result); + } return result; } @@ -967,4 +972,13 @@ public class Util { } return result; } + + /** + * Compares two iterable sequences based on {@link Set} semantics. If both objects turn out to be {@link Set}s, + * the {@link Set#equals(Object)} method will be used. Otherwise, non-{@link Set} objects will be filled into + * temporary {@link Set} objects and then compared as sets. + */ + public static boolean setEquals(Iterable a, Iterable b) { + return asSet(a).equals(asSet(b)); + } } \ No newline at end of file From e1647bd1b0b9efe70e70c8053c57f90fa553f009 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 21 Apr 2020 19:16:46 +0200 Subject: [PATCH 168/188] bug5219: added test for revocation of competitor registration in regatta log --- ...ticRetrackUponCompetitorSetChangeTest.java | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/AutomaticRetrackUponCompetitorSetChangeTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/AutomaticRetrackUponCompetitorSetChangeTest.java index 0bc7c72e049..3a4536e4350 100755 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/AutomaticRetrackUponCompetitorSetChangeTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/AutomaticRetrackUponCompetitorSetChangeTest.java @@ -1,6 +1,7 @@ package com.sap.sailing.server.test; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertSame; @@ -17,7 +18,9 @@ import java.util.GregorianCalendar; import java.util.TimeZone; import java.util.UUID; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import org.junit.After; import org.junit.Before; @@ -196,7 +199,8 @@ public class AutomaticRetrackUponCompetitorSetChangeTest { final RegattaLog regattaLog = service.getRegatta(regattaIdentifier).getRegattaLog(); final CompetitorWithBoat firstCompetitor = TrackBasedTest.createCompetitorWithBoat("First Competitor"); final CompetitorWithBoat secondCompetitor = TrackBasedTest.createCompetitorWithBoat("Second Competitor"); - regattaLog.add(new RegattaLogRegisterCompetitorEventImpl(MillisecondsTimePoint.now(), service.getServerAuthor(), firstCompetitor)); + final RegattaLogRegisterCompetitorEventImpl firstCompetitorRegistrationEvent = new RegattaLogRegisterCompetitorEventImpl(MillisecondsTimePoint.now(), service.getServerAuthor(), firstCompetitor); + regattaLog.add(firstCompetitorRegistrationEvent); final RaceLogTrackingAdapter factory = RaceLogTrackingAdapterFactory.INSTANCE.getAdapter(service.getBaseDomainFactory()); final Leaderboard leaderboard = service.getLeaderboardByName(regattaIdentifier.getRegattaName()); final RaceColumn raceColumn = leaderboard.getRaceColumnByName(FIRST_RACE_COLUMN_NAME); @@ -208,15 +212,27 @@ public class AutomaticRetrackUponCompetitorSetChangeTest { final RegattaAndRaceIdentifier raceIdentifier = trackedRace.getRaceIdentifier(); assertEquals(1, Util.size(trackedRace.getRace().getCompetitors())); assertSame(firstCompetitor, trackedRace.getRace().getCompetitors().iterator().next()); - // Now add a second competitor registration ("late-comer") to the regatta log and expect the race to reload: regattaLog.add(new RegattaLogRegisterCompetitorEventImpl(MillisecondsTimePoint.now(), service.getServerAuthor(), secondCompetitor)); - final CompletableFuture raceTrackerFuture = new CompletableFuture<>(); - service.getRaceTrackerByRegattaAndRaceIdentifier(raceIdentifier, raceTracker->raceTrackerFuture.complete(raceTracker)); - final RaceTracker raceTracker = raceTrackerFuture.get(RaceTracker.TIMEOUT_FOR_RECEIVING_RACE_DEFINITION_IN_MILLISECONDS, TimeUnit.MILLISECONDS); + final RaceTracker raceTracker = getRaceTracker(raceIdentifier); final RaceDefinition newRace = raceTracker.getRace(); assertEquals(2, Util.size(newRace.getCompetitors())); assertTrue(Util.contains(newRace.getCompetitors(), firstCompetitor)); assertTrue(Util.contains(newRace.getCompetitors(), secondCompetitor)); + // now revoke the registration of the first competitor and verify that it disappears: + regattaLog.revokeEvent(service.getServerAuthor(), firstCompetitorRegistrationEvent); + final RaceTracker newRaceTracker = getRaceTracker(raceIdentifier); + final RaceDefinition newNewRace = newRaceTracker.getRace(); + assertEquals(1, Util.size(newNewRace.getCompetitors())); + assertFalse(Util.contains(newNewRace.getCompetitors(), firstCompetitor)); + assertTrue(Util.contains(newNewRace.getCompetitors(), secondCompetitor)); + } + + private RaceTracker getRaceTracker(final RegattaAndRaceIdentifier raceIdentifier) + throws InterruptedException, ExecutionException, TimeoutException { + final CompletableFuture raceTrackerFuture = new CompletableFuture<>(); + service.getRaceTrackerByRegattaAndRaceIdentifier(raceIdentifier, raceTracker->raceTrackerFuture.complete(raceTracker)); + final RaceTracker raceTracker = raceTrackerFuture.get(RaceTracker.TIMEOUT_FOR_RECEIVING_RACE_DEFINITION_IN_MILLISECONDS, TimeUnit.MILLISECONDS); + return raceTracker; } @After From 859a2b71ffca217e3324c1a30846458a8e430b9f Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 21 Apr 2020 19:20:36 +0200 Subject: [PATCH 169/188] bug5219: in the TracTrac connector wired [add|delete]Competitor to TrackedRegattaRegistry.updateRaceCompetitors(...) --- .../tractracadapter/impl/TracTracRaceTrackerImpl.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/TracTracRaceTrackerImpl.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/TracTracRaceTrackerImpl.java index 32c34f9e90d..eb87642d3b6 100755 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/TracTracRaceTrackerImpl.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/TracTracRaceTrackerImpl.java @@ -361,10 +361,20 @@ public class TracTracRaceTrackerImpl extends AbstractRaceTrackerImpl @Override public void deleteCompetitor(UUID competitorId) { + try { + trackedRegattaRegistry.updateRaceCompetitors(getRegatta(), getRace()); + } catch (Exception e) { + throw new RuntimeException(e); + } } @Override public void addCompetitor(ICompetitor competitor) { + try { + trackedRegattaRegistry.updateRaceCompetitors(getRegatta(), getRace()); + } catch (Exception e) { + throw new RuntimeException(e); + } } }; eventSubscriber.subscribeCompetitors(competitorsListener); From ec9371f82b2dd16bbe1f4c443b83fd9c97157916 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 21 Apr 2020 19:35:54 +0200 Subject: [PATCH 170/188] bug5219: wired SwissTiming connector to TrackedRegattaRegistry.updateRaceCompetitors --- .../domain/swisstimingadapter/DomainFactory.java | 2 ++ .../swisstimingadapter/impl/DomainFactoryImpl.java | 3 ++- .../impl/SwissTimingRaceTrackerImpl.java | 13 ++++++++++++- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/DomainFactory.java b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/DomainFactory.java index 85dbc373119..a49609626b5 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/DomainFactory.java +++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/DomainFactory.java @@ -92,4 +92,6 @@ public interface DomainFactory { */ void addUpdateHandlers(String updateURL, String username, String password, Serializable eventId, RaceDefinition raceDefinition, DynamicTrackedRace trackedRace) throws URISyntaxException; + + Map createCompetitorsAndBoats(StartList startList, String raceId, BoatClass boatClass, RaceTrackingHandler raceTrackHandler); } diff --git a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java index 20229dd6b72..8f84c702e45 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java +++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java @@ -291,7 +291,8 @@ public class DomainFactoryImpl implements DomainFactory { return result; } - private Map createCompetitorsAndBoats(StartList startList, String raceId, BoatClass boatClass, + @Override + public Map createCompetitorsAndBoats(StartList startList, String raceId, BoatClass boatClass, RaceTrackingHandler raceTrackHandler) { Map result = new LinkedHashMap<>(); for (com.sap.sailing.domain.swisstimingadapter.Competitor swissTimingCompetitor : startList.getCompetitors()) { diff --git a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingRaceTrackerImpl.java b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingRaceTrackerImpl.java index 94289ae02a9..6d61ce4a071 100644 --- a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingRaceTrackerImpl.java +++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingRaceTrackerImpl.java @@ -18,6 +18,7 @@ import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; +import com.sap.sailing.domain.base.Boat; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CompetitorAndBoatStore; @@ -65,6 +66,7 @@ import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; import com.sap.sailing.domain.tracking.TrackingDataLoader; import com.sap.sailing.domain.tracking.WindStore; import com.sap.sailing.domain.tracking.WindTrack; +import com.sap.sailing.domain.tracking.RaceTrackingHandler.DefaultRaceTrackingHandler; import com.sap.sailing.domain.tracking.impl.TrackedRaceStatusImpl; import com.sap.sailing.domain.tracking.impl.TrackingConnectorInfoImpl; import com.sap.sailing.domain.tracking.impl.UpdateHandler; @@ -443,6 +445,15 @@ public class SwissTimingRaceTrackerImpl extends AbstractRaceTrackerImpl this.startList = startList; if (oldStartList == null && course != null) { createRaceDefinition(course); + } else if (trackedRace != null) { + final Map competitorsAndTheirBoats = domainFactory.createCompetitorsAndBoats(startList, raceID, boatClass, new DefaultRaceTrackingHandler()); + if (!Util.setEquals(competitorsAndTheirBoats.keySet(), getRace().getCompetitors())) { + try { + trackedRegattaRegistry.updateRaceCompetitors(getRegatta(), getRace()); + } catch (Exception e) { + throw new RuntimeException(e); + } + } } } } @@ -470,7 +481,7 @@ public class SwissTimingRaceTrackerImpl extends AbstractRaceTrackerImpl assert startList != null; assert course != null; // now we can create the RaceDefinition and most other things - Race swissTimingRace = new RaceImpl(raceID, raceName, raceDescription, boatClass); + final Race swissTimingRace = new RaceImpl(raceID, raceName, raceDescription, boatClass); try { synchronized (this) { race = domainFactory.createRaceDefinition(regatta, swissTimingRace, startList, course, From dfcd2e5557aaf6f0747328916f034c208e8f6625 Mon Sep 17 00:00:00 2001 From: Robert Benedikt Date: Wed, 22 Apr 2020 10:00:37 +0200 Subject: [PATCH 171/188] refactor: listener for selecting a race --- .../app/ui/activities/RacingActivity.java | 65 +++++++------------ .../app/ui/fragments/RaceListFragment.java | 15 +++-- 2 files changed, 35 insertions(+), 45 deletions(-) diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java index b5e5b0a4cb0..4eaacd8b28c 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java @@ -65,9 +65,6 @@ import com.sap.sailing.racecommittee.app.data.loaders.DataLoaderResult; import com.sap.sailing.racecommittee.app.domain.ManagedRace; import com.sap.sailing.racecommittee.app.domain.configuration.impl.PreferencesRegattaConfigurationLoader; import com.sap.sailing.racecommittee.app.logging.LogEvent; -import com.sap.sailing.racecommittee.app.ui.adapters.racelist.RaceListDataType; -import com.sap.sailing.racecommittee.app.ui.adapters.racelist.RaceListDataTypeHeader; -import com.sap.sailing.racecommittee.app.ui.adapters.racelist.RaceListDataTypeRace; import com.sap.sailing.racecommittee.app.ui.fragments.RaceFragment; import com.sap.sailing.racecommittee.app.ui.fragments.RaceInfoFragment; import com.sap.sailing.racecommittee.app.ui.fragments.RaceListFragment; @@ -303,12 +300,11 @@ public class RacingActivity extends SessionActivity implements RaceListCallbacks } @Nullable - ManagedRace findPreviousRace(@NonNull final ManagedRace managedRace) { - final LinkedHashMap> fleetRaces = mRaceList.getRacesByGroup(); - for (RaceGroupSeriesFleet fleet : fleetRaces.keySet()) { - final List races = fleetRaces.get(fleet); - if (races == null) - continue; + private ManagedRace findPreviousRace(@NonNull final ManagedRace managedRace) { + final LinkedHashMap> racesByGroup = mRaceList.getRacesByGroup(); + final RaceGroupSeriesFleet group = new RaceGroupSeriesFleet(managedRace); + final List races = racesByGroup.get(group); + if (races != null) { final int index = races.indexOf(managedRace); if (index >= 1) { return races.get(index - 1); @@ -318,40 +314,29 @@ public class RacingActivity extends SessionActivity implements RaceListCallbacks } @Override - public void onRaceListItemSelected(RaceListDataType selectedItem) { + public void onRaceSelected(ManagedRace race) { + ManagedRace previousRace = findPreviousRace(race); + ExLog.i(this, LogEvent.RACE_SELECTED_ELEMENT, race.getId() + " " + race.getStatus()); + if (previousRace != null && race.getStatus() == RaceLogRaceStatus.UNSCHEDULED) { + final RaceState currentRaceState = race.getState(); + final RacingProcedure racingProcedure = previousRace.getState().getRacingProcedure(); + currentRaceState.setRacingProcedure(MillisecondsTimePoint.now(), racingProcedure.getType()); + final RacingProcedure newRacingProcedure = currentRaceState.getRacingProcedure(); + if (racingProcedure instanceof ConfigurableStartModeFlagRacingProcedure && newRacingProcedure instanceof ConfigurableStartModeFlagRacingProcedure) { + ConfigurableStartModeFlagRacingProcedure configurableFlag = (ConfigurableStartModeFlagRacingProcedure) racingProcedure; + ((ConfigurableStartModeFlagRacingProcedure) newRacingProcedure).setStartModeFlag(MillisecondsTimePoint.now(), configurableFlag.getStartModeFlag()); + } + final CourseBase courseDesign = previousRace.getCourseDesign(); + if (courseDesign != null) { + currentRaceState.setCourseDesign(MillisecondsTimePoint.now(), courseDesign, CourseDesignerMode.BY_NAME); + } - if (selectedItem instanceof RaceListDataTypeRace) { - RaceListDataTypeRace selectedElement = (RaceListDataTypeRace) selectedItem; - selectedElement.setUpdateIndicatorVisible(false); - - ManagedRace managedRace = selectedElement.getRace(); - ManagedRace prevRace = findPreviousRace(managedRace); - ExLog.i(this, LogEvent.RACE_SELECTED_ELEMENT, managedRace.getId() + " " + managedRace.getStatus()); - if (prevRace != null && managedRace.getStatus() == RaceLogRaceStatus.UNSCHEDULED) { - final RaceState currentRaceState = managedRace.getState(); - final RacingProcedure racingProcedure = prevRace.getState().getRacingProcedure(); - currentRaceState.setRacingProcedure(MillisecondsTimePoint.now(), racingProcedure.getType()); - final RacingProcedure newRacingProcedure = currentRaceState.getRacingProcedure(); - if (racingProcedure instanceof ConfigurableStartModeFlagRacingProcedure && newRacingProcedure instanceof ConfigurableStartModeFlagRacingProcedure) { - ConfigurableStartModeFlagRacingProcedure configurableFlag = (ConfigurableStartModeFlagRacingProcedure) racingProcedure; - ((ConfigurableStartModeFlagRacingProcedure) newRacingProcedure).setStartModeFlag(MillisecondsTimePoint.now(), configurableFlag.getStartModeFlag()); - } - final CourseBase courseDesign = prevRace.getCourseDesign(); - if (courseDesign != null) { - currentRaceState.setCourseDesign(MillisecondsTimePoint.now(), courseDesign, CourseDesignerMode.BY_NAME); - } - - final Wind windFix = prevRace.getState().getWindFix(); - if (windFix != null) { - currentRaceState.setWindFix(MillisecondsTimePoint.now(), windFix, preferences.isMagnetic()); - } + final Wind windFix = previousRace.getState().getWindFix(); + if (windFix != null) { + currentRaceState.setWindFix(MillisecondsTimePoint.now(), windFix, preferences.isMagnetic()); } - onRaceItemClicked(managedRace); - } else if (selectedItem instanceof RaceListDataTypeHeader) { - // This is for logging purposes only! - RaceListDataTypeHeader selectedTitle = (RaceListDataTypeHeader) selectedItem; - ExLog.i(this, LogEvent.RACE_SELECTED_TITLE, selectedTitle.toString()); } + onRaceItemClicked(race); } private void onRaceItemClicked(ManagedRace managedRace) { diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceListFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceListFragment.java index 4135a621f53..51ea2b5f5e4 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceListFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceListFragment.java @@ -290,10 +290,15 @@ public class RaceListFragment extends LoggableFragment @Override public void onItemClick(AdapterView parent, View view, int position, long id) { final RaceListDataType selectedItem = mAdapter.getItem(position); - ExLog.i(getActivity(), TAG, "Touched " + selectedItem.toString()); - mDrawerLayout.closeDrawers(); - mAdapter.setSelectedRace(selectedItem); - mCallbacks.onRaceListItemSelected(selectedItem); + if (selectedItem != null) { + ExLog.i(getContext(), TAG, "Touched " + selectedItem.toString()); + mDrawerLayout.closeDrawers(); + mAdapter.setSelectedRace(selectedItem); + if (selectedItem instanceof RaceListDataTypeRace) { + final ManagedRace race = ((RaceListDataTypeRace) selectedItem).getRace(); + mCallbacks.onRaceSelected(race); + } + } } @Override @@ -553,7 +558,7 @@ public class RaceListFragment extends LoggableFragment } public interface RaceListCallbacks { - void onRaceListItemSelected(RaceListDataType selectedItem); + void onRaceSelected(ManagedRace race); } private class IntentReceiver extends BroadcastReceiver { From 8d2738071afcd4db97749412e0dc26435730ae9c Mon Sep 17 00:00:00 2001 From: Alessandro Stoltenberg Date: Wed, 22 Apr 2020 17:41:48 +0200 Subject: [PATCH 172/188] AWS Email Forwarder: use replace_header instead of delete and create for email headers. --- configuration/mail_forward.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/configuration/mail_forward.py b/configuration/mail_forward.py index 1c84d04b7a8..99039cd68be 100644 --- a/configuration/mail_forward.py +++ b/configuration/mail_forward.py @@ -45,12 +45,9 @@ def create_message(file): mailobject['X-To'] = mailobject['To'] mailobject['X-Return-Path'] = mailobject['Return-Path'] # Remove original headers and set to SES Value - del mailobject['From'] - mailobject['From'] = sender - del mailobject['To'] - mailobject['To'] = ','.join(recipientList) - del mailobject['Return-Path'] - mailobject['Return-Path'] = sender + mailobject.replace_header('From', sender) + mailobject.replace_header('Return-Path', sender) + mailobject.replace_header('To', ','.join(recipientList)) message = { "Source": sender, "Destinations": recipientList, From 5ac1470b8bc713ee72a636d5d39805b423c7a527 Mon Sep 17 00:00:00 2001 From: Alessandro Stoltenberg Date: Wed, 22 Apr 2020 20:07:44 +0200 Subject: [PATCH 173/188] AWS Email Forwarder: Refactored python code to be reusable for list of senders and recipients. --- configuration/mail_forward.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/configuration/mail_forward.py b/configuration/mail_forward.py index 99039cd68be..da98dd6135b 100644 --- a/configuration/mail_forward.py +++ b/configuration/mail_forward.py @@ -16,10 +16,8 @@ import email import re import json from botocore.exceptions import ClientError -from email.mime.multipart import MIMEMultipart -from email.mime.text import MIMEText -from email.mime.application import MIMEApplication - +from email.parser import Parser +from email.policy import default region = os.environ['Region'] @@ -33,18 +31,24 @@ def get_message_from_s3(bucket_name, object_key): return file def create_message(file): - sender = os.environ['MailSender'] - recipientList = json.loads(os.environ["MailRecipientsJSON"]) + senderMap = json.loads(os.environ["MailSenderJSON"]) + recipientMap = json.loads(os.environ["MailRecipientsJSON"]) mailobject = email.message_from_string(file.decode('utf-8')) # Uncomment the following to print all available headers, if needed: # print(mailobject.keys()) + # Get values for sender and recipient(s) + toHeader = Parser(policy=default).parsestr('To: ' + mailobject['To']) + toAddressSpec = toHeader['to'].addresses[0].addr_spec + recipientList = recipientMap[toAddressSpec] + sender = senderMap[toAddressSpec] # Set all X- headers mailobject['X-From'] = mailobject['From'] if not mailobject['Reply-To']: mailobject['Reply-To'] = mailobject['From'] mailobject['X-To'] = mailobject['To'] mailobject['X-Return-Path'] = mailobject['Return-Path'] - # Remove original headers and set to SES Value + # Replace original headers and set to SES Value + del mailobject['DKIM-Signature'] mailobject.replace_header('From', sender) mailobject.replace_header('Return-Path', sender) mailobject.replace_header('To', ','.join(recipientList)) @@ -75,7 +79,7 @@ def send_email(message): except ClientError as e: output = e.response['Error']['Message'] else: - output = "Email sent! Message ID: " + response['MessageId'] + output = "Email for: " + ','.join(re.findall(r'\<(.*?)\>', message['Source'])) + " forwarded to: " + ','.join(message['Destinations']) + "! Message ID: " + response['MessageId'] return output def lambda_handler(event, context): From 7ab2a5f7541994c1bca9a1e23836ad41b4b8983d Mon Sep 17 00:00:00 2001 From: Alessandro Stoltenberg Date: Wed, 22 Apr 2020 20:50:37 +0200 Subject: [PATCH 174/188] AWS Email Forwarder: Creating a meaningfull log message. Error fixing. --- configuration/mail_forward.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/configuration/mail_forward.py b/configuration/mail_forward.py index da98dd6135b..fbc04a1e07d 100644 --- a/configuration/mail_forward.py +++ b/configuration/mail_forward.py @@ -36,11 +36,12 @@ def create_message(file): mailobject = email.message_from_string(file.decode('utf-8')) # Uncomment the following to print all available headers, if needed: # print(mailobject.keys()) - # Get values for sender and recipient(s) + # Get values for recipient(s) toHeader = Parser(policy=default).parsestr('To: ' + mailobject['To']) toAddressSpec = toHeader['to'].addresses[0].addr_spec - recipientList = recipientMap[toAddressSpec] - sender = senderMap[toAddressSpec] + recipientList = recipientMap.get(toAddressSpec) + # Set sender according to provided value or use received mail header field + sender = senderMap.get(toAddressSpec, mailobject['To']) # Set all X- headers mailobject['X-From'] = mailobject['From'] if not mailobject['Reply-To']: @@ -75,11 +76,16 @@ def send_email(message): 'Data':message['Data'] } ) + # Modify output message + if re.search(r'\<(.*?)\>', message['Source']): + fromString = ','.join(re.findall(r'\<(.*?)\>', message['Source'])) + else: + fromString = message['Source'] # Display an error if something goes wrong. except ClientError as e: output = e.response['Error']['Message'] else: - output = "Email for: " + ','.join(re.findall(r'\<(.*?)\>', message['Source'])) + " forwarded to: " + ','.join(message['Destinations']) + "! Message ID: " + response['MessageId'] + output = "Email for: " + fromString + " forwarded to: " + ','.join(message['Destinations']) + "! Message ID: " + response['MessageId'] return output def lambda_handler(event, context): From b4404280dc0f1718ef4efb8896d33f3df8aee11a Mon Sep 17 00:00:00 2001 From: Alessandro Stoltenberg Date: Wed, 22 Apr 2020 23:01:35 +0200 Subject: [PATCH 175/188] AWS Email Forwarder: Allow multiple values in 'To' header. --- configuration/mail_forward.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/configuration/mail_forward.py b/configuration/mail_forward.py index fbc04a1e07d..56b6cd27f05 100644 --- a/configuration/mail_forward.py +++ b/configuration/mail_forward.py @@ -38,11 +38,11 @@ def create_message(file): # print(mailobject.keys()) # Get values for recipient(s) toHeader = Parser(policy=default).parsestr('To: ' + mailobject['To']) - toAddressSpec = toHeader['to'].addresses[0].addr_spec - recipientList = recipientMap.get(toAddressSpec) - # Set sender according to provided value or use received mail header field - sender = senderMap.get(toAddressSpec, mailobject['To']) - # Set all X- headers + for x in toHeader['to'].addresses: + if x.addr_spec in recipientMap: + recipientList = recipientMap.get(x.addr_spec) + sender = senderMap.get(x.addr_spec, mailobject['To']) + correctEmailAddress = True mailobject['X-From'] = mailobject['From'] if not mailobject['Reply-To']: mailobject['Reply-To'] = mailobject['From'] @@ -76,16 +76,16 @@ def send_email(message): 'Data':message['Data'] } ) - # Modify output message - if re.search(r'\<(.*?)\>', message['Source']): - fromString = ','.join(re.findall(r'\<(.*?)\>', message['Source'])) - else: - fromString = message['Source'] # Display an error if something goes wrong. except ClientError as e: output = e.response['Error']['Message'] else: - output = "Email for: " + fromString + " forwarded to: " + ','.join(message['Destinations']) + "! Message ID: " + response['MessageId'] + # Modify output message + if re.search(r'\<(.*?)\>', message['Source']): + fromString = ','.join(re.findall(r'\<(.*?)\>', message['Source'])) + else: + fromString = message['Source'] + output = "Email for: " + fromString + " forwarded to: " + ', '.join(message['Destinations']) + "! Message ID: " + response['MessageId'] return output def lambda_handler(event, context): @@ -103,3 +103,4 @@ def lambda_handler(event, context): # Send the email and print the result. result = send_email(message) print(result) + From e30fd79ff544cff04ba19ec13824120dc4ea57f0 Mon Sep 17 00:00:00 2001 From: Alessandro Stoltenberg Date: Wed, 22 Apr 2020 23:17:18 +0200 Subject: [PATCH 176/188] AWS Email Forwarder: Support multiple to-address without specifying sender. --- configuration/mail_forward.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/configuration/mail_forward.py b/configuration/mail_forward.py index 56b6cd27f05..458a75ef242 100644 --- a/configuration/mail_forward.py +++ b/configuration/mail_forward.py @@ -41,8 +41,7 @@ def create_message(file): for x in toHeader['to'].addresses: if x.addr_spec in recipientMap: recipientList = recipientMap.get(x.addr_spec) - sender = senderMap.get(x.addr_spec, mailobject['To']) - correctEmailAddress = True + sender = senderMap.get(x.addr_spec, x.addr_spec) mailobject['X-From'] = mailobject['From'] if not mailobject['Reply-To']: mailobject['Reply-To'] = mailobject['From'] From 4071a17471cf97c2123391672506b4005f28244e Mon Sep 17 00:00:00 2001 From: Alessandro Stoltenberg Date: Thu, 23 Apr 2020 09:53:21 +0200 Subject: [PATCH 177/188] AWS Email Forwarder: Added support for cc header. --- configuration/mail_forward.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/configuration/mail_forward.py b/configuration/mail_forward.py index 458a75ef242..04cb9340b31 100644 --- a/configuration/mail_forward.py +++ b/configuration/mail_forward.py @@ -36,12 +36,21 @@ def create_message(file): mailobject = email.message_from_string(file.decode('utf-8')) # Uncomment the following to print all available headers, if needed: # print(mailobject.keys()) - # Get values for recipient(s) + sender = None + # Check to header toHeader = Parser(policy=default).parsestr('To: ' + mailobject['To']) for x in toHeader['to'].addresses: if x.addr_spec in recipientMap: recipientList = recipientMap.get(x.addr_spec) sender = senderMap.get(x.addr_spec, x.addr_spec) + # Check cc header + if sender is None: + ccHeader = Parser(policy=default).parsestr('Cc: ' + mailobject['Cc']) + for x in ccHeader['cc'].addresses: + if x.addr_spec in recipientMap: + recipientList = recipientMap.get(x.addr_spec) + sender = senderMap.get(x.addr_spec, x.addr_spec) + mailobject['X-From'] = mailobject['From'] if not mailobject['Reply-To']: mailobject['Reply-To'] = mailobject['From'] From b2c33bc8171f7e57f443059e34d9741a482d139f Mon Sep 17 00:00:00 2001 From: Alessandro Stoltenberg Date: Thu, 23 Apr 2020 13:50:50 +0200 Subject: [PATCH 178/188] AWS Email Forwarder: Added support for bcc. Removed unused variable. --- configuration/mail_forward.py | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/configuration/mail_forward.py b/configuration/mail_forward.py index 04cb9340b31..e2a70820af6 100644 --- a/configuration/mail_forward.py +++ b/configuration/mail_forward.py @@ -34,23 +34,29 @@ def create_message(file): senderMap = json.loads(os.environ["MailSenderJSON"]) recipientMap = json.loads(os.environ["MailRecipientsJSON"]) mailobject = email.message_from_string(file.decode('utf-8')) - # Uncomment the following to print all available headers, if needed: - # print(mailobject.keys()) + # Define sender, either from 'To'-Header or from 'Cc'-Header sender = None - # Check to header + # Check 'To'-Header toHeader = Parser(policy=default).parsestr('To: ' + mailobject['To']) for x in toHeader['to'].addresses: if x.addr_spec in recipientMap: recipientList = recipientMap.get(x.addr_spec) sender = senderMap.get(x.addr_spec, x.addr_spec) - # Check cc header + # Check 'Cc'-Header if sender is None: - ccHeader = Parser(policy=default).parsestr('Cc: ' + mailobject['Cc']) - for x in ccHeader['cc'].addresses: - if x.addr_spec in recipientMap: - recipientList = recipientMap.get(x.addr_spec) - sender = senderMap.get(x.addr_spec, x.addr_spec) - + if mailobject['Cc']: + ccHeader = Parser(policy=default).parsestr('Cc: ' + mailobject['Cc']) + for x in ccHeader['cc'].addresses: + if x.addr_spec in recipientMap: + recipientList = recipientMap.get(x.addr_spec) + sender = senderMap.get(x.addr_spec, x.addr_spec) + # Bcc mail, there is no header so find address from 'Received'-Header + else: + receivedString = re.search(r'\<(.*?)\>', ''.join(mailobject.get_all('Received'))).group(1) + if receivedString in recipientMap: + recipientList = recipientMap.get(receivedString) + sender = senderMap.get(receivedString, receivedString) + # Change original headers to X-headers mailobject['X-From'] = mailobject['From'] if not mailobject['Reply-To']: mailobject['Reply-To'] = mailobject['From'] @@ -97,8 +103,7 @@ def send_email(message): return output def lambda_handler(event, context): - # Get the unique ID of the message. This corresponds to the name of the file - # in S3. + # Get the unique ID of the message. This corresponds to the name of the file in S3. sns = event['Records'][0]['Sns'] message = json.loads(sns['Message']) bucket_name = message['receipt']['action']['bucketName'] @@ -111,4 +116,3 @@ def lambda_handler(event, context): # Send the email and print the result. result = send_email(message) print(result) - From 4cfca6b0b8dd8ab9761f9710cf09286d818dc661 Mon Sep 17 00:00:00 2001 From: Alessandro Stoltenberg Date: Thu, 23 Apr 2020 13:53:20 +0200 Subject: [PATCH 179/188] AWS Email Forwarder: removed unused variable. --- configuration/mail_forward.py | 1 - 1 file changed, 1 deletion(-) diff --git a/configuration/mail_forward.py b/configuration/mail_forward.py index e2a70820af6..49a549b3eb2 100644 --- a/configuration/mail_forward.py +++ b/configuration/mail_forward.py @@ -75,7 +75,6 @@ def create_message(file): return message def send_email(message): - aws_region = os.environ['Region'] # Create a new SES client. client_ses = boto3.client('ses', region) # Send the email. From d80a7a7eae71ae6ec7ea99d67aa0329414548c49 Mon Sep 17 00:00:00 2001 From: "service.tip.git" Date: Thu, 23 Apr 2020 15:23:41 +0000 Subject: [PATCH 180/188] [INTERNAL] Translation delivery: commit by LX Lab Change-Id: If049d0ae075fb0a507d8847fa7916b3a944ab901 --- .../com/sap/sailing/gwt/ui/client/StringMessages_es.properties | 1 + .../com/sap/sailing/gwt/ui/client/StringMessages_fr.properties | 1 + .../com/sap/sailing/gwt/ui/client/StringMessages_it.properties | 1 + .../com/sap/sailing/gwt/ui/client/StringMessages_ja.properties | 1 + .../com/sap/sailing/gwt/ui/client/StringMessages_pt.properties | 1 + .../com/sap/sailing/gwt/ui/client/StringMessages_ru.properties | 1 + .../com/sap/sailing/gwt/ui/client/StringMessages_zh.properties | 1 + .../sap/sse/security/ui/client/i18n/StringMessages_es.properties | 1 + .../sap/sse/security/ui/client/i18n/StringMessages_fr.properties | 1 + .../sap/sse/security/ui/client/i18n/StringMessages_it.properties | 1 + .../sap/sse/security/ui/client/i18n/StringMessages_ja.properties | 1 + .../sap/sse/security/ui/client/i18n/StringMessages_pt.properties | 1 + .../sap/sse/security/ui/client/i18n/StringMessages_ru.properties | 1 + .../sap/sse/security/ui/client/i18n/StringMessages_zh.properties | 1 + 14 files changed, 14 insertions(+) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_es.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_es.properties index 4d8f06171fa..ec9c502cd53 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_es.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_es.properties @@ -2378,3 +2378,4 @@ unsetPosition=Posición no fijada errorTryingToUpdateMarkProperties=Error al intentar actualizar las propiedades de la marca: {0} confirmUnsettingPositionForMarkProperties=¿Desea realmente eliminar la información de posicionamiento para las propiedades de la marca {0}? useOfficialResultsForAutomaticUpdates=Actualizar automáticamente a partir de resultados "oficiales" publicados por TracTrac +keepEmptyForDefaultUserAndPassword=Si el nombre de usuario se deja en blanco, el usuario actual se utiliza para iniciar sesión en el servidor remoto. Si su usuario tiene el permiso correcto para realizar una importación de datos maestros desde el servidor remoto, no se requiere completar estos campos. Utilícelos solo si dispone de diferentes archivos de usuario o si los datos pertenecen a otro usuario. diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_fr.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_fr.properties index 46a1248395e..bfe90380781 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_fr.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_fr.properties @@ -2378,3 +2378,4 @@ unsetPosition=Réinitialiser la position errorTryingToUpdateMarkProperties=Erreur lors de la tentative de mise à jour des propriétés de marque : {0} confirmUnsettingPositionForMarkProperties=Voulez-vous vraiment effacer les informations de localisation pour les propriétés de marque {0} ? useOfficialResultsForAutomaticUpdates=Mettre automatiquement à jour à partir des résultats "officiels" publiés par TracTrac +keepEmptyForDefaultUserAndPassword=Si le nom d''utilisateur et le mot de passe ne sont pas renseignés, l''utilisateur actuel est utilisé pour se connecter au serveur distant. Si votre utilisateur dispose des autorisations adéquates pour effectuer une importation de données de base à partir du serveur distant, il n''est pas nécessaire de renseigner ces zones. À utiliser seulement si les archives utilisateur sont séparées ou si les données appartiennent à un autre utilisateur. diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_it.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_it.properties index a43d78e5541..020cc44bfae 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_it.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_it.properties @@ -2378,3 +2378,4 @@ unsetPosition=Annulla parametrizzazione posizione errorTryingToUpdateMarkProperties=Errore durante il tentativo di aggiornare le proprietà segnale: {0} confirmUnsettingPositionForMarkProperties=Confermare l''eliminazione delle informazioni di posizione per le proprietà segnale {0}? useOfficialResultsForAutomaticUpdates=Aggiorna automaticamente dai risultati "ufficiali" pubblicati da TracTrac +keepEmptyForDefaultUserAndPassword=Se il nome utente e la password vengono lasciati vuoti, per accedere al server remoto viene utilizzato l''utente attuale. Se il proprio utente dispone dell''autorizzazione corretta per eseguire un''importazione dei dati anagrafici dal server remoto non occorre alimentare i campi sopra menzionati. Utilizzarli solo se si hanno archivi utenti separati o se i dati appartengono a un altro utente. diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ja.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ja.properties index 755527cd223..ea9c972f163 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ja.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ja.properties @@ -2378,3 +2378,4 @@ unsetPosition=位置の設定解除 errorTryingToUpdateMarkProperties=マークプロパティを更新しようとしてエラーが発生しました: {0} confirmUnsettingPositionForMarkProperties=マークプロパティ {0} の位置情報を削除しますか useOfficialResultsForAutomaticUpdates=TracTrac が公開した "公式" の結果から自動的に更新 +keepEmptyForDefaultUserAndPassword=ユーザ名とパスワードが空白のままである場合は、リモートサーバへのログインには現在のユーザが使用されます。リモートサーバからマスタデータインポートを行う適切な権限がユーザにある場合には、それらの項目に入力する必要はありません。個別のユーザストアがある場合、またはデータが別のユーザに属している場合にのみ使用します。 diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_pt.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_pt.properties index 1cac9fa4d2a..3a13e2db63c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_pt.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_pt.properties @@ -2378,3 +2378,4 @@ unsetPosition=Remover definição de posição errorTryingToUpdateMarkProperties=Erro ao tentar atualizar propriedades da marca: {0} confirmUnsettingPositionForMarkProperties=Remover informações de posicionamento para propriedades da marca {0}? useOfficialResultsForAutomaticUpdates=Atualizar automaticamente a partir dos resultados "oficiais" publicados por TracTrac +keepEmptyForDefaultUserAndPassword=Se o nome do usuário e a senha forem deixados em branco, o usuário atual é utilizado para fazer o logon no servidor remoto. Se seu usuário tiver a autorização correta para efetuar uma importação de dados mestre do servidor remoto, não é necessário preencher esses campos. Utilize somente se você tiver arquivos do usuário separados ou se os dados pertencerem a outro usuário. diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties index c6ae4e824b3..e9f363d4aab 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties @@ -2378,3 +2378,4 @@ unsetPosition=Неустановленная позиция errorTryingToUpdateMarkProperties=Ошибка при попытке обновить свойства знака: {0} confirmUnsettingPositionForMarkProperties=Действительно удалить информацию о положении для свойств знака {0}? useOfficialResultsForAutomaticUpdates=Автоматически обновлять из "официальных" результатов, опубликованных TracTrac +keepEmptyForDefaultUserAndPassword=Если имя пользователя и пароль не заполнены, для входа на дистанционный сервер используется текущий пользователь. Если у вашего пользователя есть необходимые полномочия для импорта основных данных с дистанционного сервера, заполнять эти поля необязательно. Использовать, только если у вас есть отдельное хранилище пользователя или если данные принадлежат другому пользователю. diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties index ab362ef5724..932b17fe58d 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties @@ -2378,3 +2378,4 @@ unsetPosition=取消设置位置 errorTryingToUpdateMarkProperties=尝试更新标志属性时发生错误:{0} confirmUnsettingPositionForMarkProperties=是否确定移除标志属性 {0} 的位置信息? useOfficialResultsForAutomaticUpdates=自动更新 TracTrac 发布的“官方”结果 +keepEmptyForDefaultUserAndPassword=如果用户名和密码留为空白,当前用户用于登录远程服务器。如果您的用户有从远程服务器导入主数据的权限,无需填写这些字段。仅在您有独立的用户存储或数据属于另一用户时使用。 diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_es.properties b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_es.properties index 638c4c381fc..d9bb67080ec 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_es.properties +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_es.properties @@ -1,4 +1,5 @@ name=Nombre +locale=Configuración regional company=Empresa password=Clave de acceso passwordRepeat=Repetir clave de acceso diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_fr.properties b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_fr.properties index 967833cd319..9513df4d4a4 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_fr.properties +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_fr.properties @@ -1,4 +1,5 @@ name=Nom +locale=Paramètres régionaux company=Entreprise password=Mot de passe passwordRepeat=Confirmer mot de passe diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_it.properties b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_it.properties index 8b8cb1ed92d..56d85f802ab 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_it.properties +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_it.properties @@ -1,4 +1,5 @@ name=Nome +locale=Impostazioni locali company=Società password=Password passwordRepeat=Ripeti la password diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_ja.properties b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_ja.properties index 72a43d9e693..19ac27d1e39 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_ja.properties +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_ja.properties @@ -1,4 +1,5 @@ name=名前 +locale=ロケール company=会社 password=パスワード passwordRepeat=パスワード再入力 diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_pt.properties b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_pt.properties index 0229763faf1..54635a6813b 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_pt.properties +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_pt.properties @@ -1,4 +1,5 @@ name=Nome +locale=Localização company=Empresa password=Senha passwordRepeat=Repetir senha diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_ru.properties b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_ru.properties index 2bdeecc16f4..6d333e463f8 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_ru.properties +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_ru.properties @@ -1,4 +1,5 @@ name=Имя +locale=Региональные параметры company=Компания password=Пароль passwordRepeat=Повторите пароль diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_zh.properties b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_zh.properties index 9e852c9c6ca..6b86b3c3d81 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_zh.properties +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_zh.properties @@ -1,4 +1,5 @@ name=名称 +locale=区域设置 company=公司 password=密码 passwordRepeat=重复密码 From da0e3a9512738814bdd2d4eaec46e1e2a4050064 Mon Sep 17 00:00:00 2001 From: Alessandro Stoltenberg Date: Thu, 23 Apr 2020 17:29:22 +0200 Subject: [PATCH 181/188] AWS Email Forwarder: Changed policy. --- configuration/mail_forward.py | 2 +- configuration/mail_forward_policy.json | 47 +++++++++++++------------- 2 files changed, 24 insertions(+), 25 deletions(-) diff --git a/configuration/mail_forward.py b/configuration/mail_forward.py index 49a549b3eb2..d986da6e81a 100644 --- a/configuration/mail_forward.py +++ b/configuration/mail_forward.py @@ -56,7 +56,7 @@ def create_message(file): if receivedString in recipientMap: recipientList = recipientMap.get(receivedString) sender = senderMap.get(receivedString, receivedString) - # Change original headers to X-headers + # Change original headers to X- mailobject['X-From'] = mailobject['From'] if not mailobject['Reply-To']: mailobject['Reply-To'] = mailobject['From'] diff --git a/configuration/mail_forward_policy.json b/configuration/mail_forward_policy.json index 42c579ad12f..18bfd2e3fa4 100644 --- a/configuration/mail_forward_policy.json +++ b/configuration/mail_forward_policy.json @@ -1,28 +1,27 @@ { "Version": "2012-10-17", "Statement": [ - { - "Sid": "VisualEditor0", - "Effect": "Allow", - "Action": [ - "logs:CreateLogStream", - "logs:CreateLogGroup", - "logs:PutLogEvents" - ], - "Resource": "*" - }, - { - "Sid": "VisualEditor1", - "Effect": "Allow", - "Action": [ - "s3:GetObject", - "ses:SendRawEmail" - ], - "Resource": [ - "arn:aws:s3:::support-emails-sapsailing-com/*", - "arn:aws:ses:eu-west-1:017363970217:identity/*" - ] - } + { + "Sid": "VisualEditor0", + "Effect": "Allow", + "Action": [ + "logs:CreateLogStream", + "logs:CreateLogGroup", + "logs:PutLogEvents" + ], + "Resource": "*" + }, + { + "Sid": "VisualEditor1", + "Effect": "Allow", + "Action": [ + "s3:GetObject", + "ses:SendRawEmail" + ], + "Resource": [ + "arn:aws:s3:::emails-for-sapsailing-com/*", + "arn:aws:ses:eu-west-1:017363970217:identity/*" + ] + } ] -} - +} \ No newline at end of file From 13a34494b7196048ed3c8519e99f38da05463329 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 23 Apr 2020 18:17:59 +0200 Subject: [PATCH 182/188] bug5269: renaming the two conflicting openDialog messages, bowing to GWTs problems with method references --- .../AbstractTrackedRacesListComposite.java | 4 +- .../gwt/ui/adminconsole/BoatTableWrapper.java | 4 +- .../adminconsole/CompetitorTableWrapper.java | 4 +- .../DeviceConfigurationListComposite.java | 4 +- .../ui/adminconsole/EventListComposite.java | 4 +- .../ui/adminconsole/IgtimiAccountsPanel.java | 4 +- .../adminconsole/LeaderboardConfigPanel.java | 13 +- .../LeaderboardGroupConfigPanel.java | 4 +- .../LocalServerManagementPanel.java | 4 +- .../gwt/ui/adminconsole/MediaPanel.java | 4 +- .../ui/adminconsole/RegattaListComposite.java | 4 +- .../ResultImportUrlsTableWrapper.java | 4 +- ...martphoneTrackingEventManagementPanel.java | 4 +- .../coursecreation/CourseTemplatePanel.java | 4 +- .../coursecreation/MarkPropertiesPanel.java | 4 +- .../coursecreation/MarkRolePanel.java | 4 +- .../coursecreation/MarkTemplatePanel.java | 4 +- ...sTimingArchivedConnectionTableWrapper.java | 4 +- .../SwissTimingConnectionTableWrapper.java | 4 +- .../TracTracConnectionTableWrapper.java | 4 +- .../SailingServer (No Proxy).launch | 182 +++++++++++++++++- .../client/component/EditOwnershipDialog.java | 4 +- .../component/RoleDefinitionsPanel.java | 4 +- .../component/UserGroupTableWrapper.java | 4 +- .../component/editacl/EditACLDialog.java | 4 +- .../usermanagement/UserTableWrapper.java | 4 +- ...PermissionWithSecurityDTOTableWrapper.java | 4 +- .../RoleWithSecurityDTOTableWrapper.java | 4 +- 28 files changed, 234 insertions(+), 65 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractTrackedRacesListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractTrackedRacesListComposite.java index d17389ff728..ad3deb9c396 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractTrackedRacesListComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractTrackedRacesListComposite.java @@ -421,13 +421,13 @@ public abstract class AbstractTrackedRacesListComposite extends AbstractComposit new RegattaConfigImagesBarCell(stringMessages), userService); final DialogConfig config = EditOwnershipDialog.create(userService.getUserManagementService(), type, race -> regattaRefresher.fillRegattas(), stringMessages); - actionsColumn.addAction(EventConfigImagesBarCell.ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, config::openDialog); + actionsColumn.addAction(EventConfigImagesBarCell.ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, config::openOwnershipDialog); final EditACLDialog.DialogConfig configACL = EditACLDialog.create( userService.getUserManagementService(), type, regatta -> regattaRefresher.fillRegattas(), stringMessages); actionsColumn.addAction(RegattaConfigImagesBarCell.ACTION_CHANGE_ACL, DefaultActions.CHANGE_ACL, - configACL::openDialog); + configACL::openACLDialog); actionsColumn.addAction(RegattaConfigImagesBarCell.ACTION_DELETE, DefaultActions.DELETE, this::removeAndUntrackRace); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/BoatTableWrapper.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/BoatTableWrapper.java index bfe72621fd0..6e0a9c0dc4a 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/BoatTableWrapper.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/BoatTableWrapper.java @@ -180,12 +180,12 @@ public class BoatTableWrapper> exte final DialogConfig editOwnerShipDialog = EditOwnershipDialog.create( userService.getUserManagementService(), SecuredDomainType.BOAT, null, stringMessages); boatActionColumn.addAction(BoatConfigImagesBarCell.ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, - editOwnerShipDialog::openDialog); + editOwnerShipDialog::openOwnershipDialog); final EditACLDialog.DialogConfig configACL = EditACLDialog .create(userService.getUserManagementService(), type, null, stringMessages); boatActionColumn.addAction(BoatConfigImagesBarCell.ACTION_CHANGE_ACL, DefaultActions.CHANGE_ACL, - configACL::openDialog); + configACL::openACLDialog); mainPanel.insert(filterField, 0); table.addColumnSortHandler(boatColumnListHandler); 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 9013b6802e9..040f346ada6 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 @@ -333,11 +333,11 @@ public class CompetitorTableWrapper editOwnerShipDialog = EditOwnershipDialog.create(userService.getUserManagementService(), SecuredDomainType.COMPETITOR, null, stringMessages); competitorActionColumn.addAction(CompetitorConfigImagesBarCell.ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, - editOwnerShipDialog::openDialog); + editOwnerShipDialog::openOwnershipDialog); final EditACLDialog.DialogConfig configACL = EditACLDialog .create(userService.getUserManagementService(), type, null, stringMessages); competitorActionColumn.addAction(CompetitorConfigImagesBarCell.ACTION_CHANGE_ACL, DefaultActions.CHANGE_ACL, - configACL::openDialog); + configACL::openACLDialog); mainPanel.insert(filterField, 0); table.addColumnSortHandler(competitorColumnListHandler); table.addColumn(competitorNameColumn, getStringMessages().name()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationListComposite.java index e5e00d4cace..2a60a4430d0 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationListComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationListComposite.java @@ -159,9 +159,9 @@ public class DeviceConfigurationListComposite extends Composite { final EditACLDialog.DialogConfig configACL = EditACLDialog.create( userService.getUserManagementService(), type, user -> user.getAccessControlList(), stringMessages); actionColumn.addAction(DefaultActionsImagesBarCell.ACTION_CHANGE_OWNERSHIP, DefaultActions.CHANGE_OWNERSHIP, - configOwnership::openDialog); + configOwnership::openOwnershipDialog); actionColumn.addAction(DefaultActionsImagesBarCell.ACTION_CHANGE_ACL, DefaultActions.CHANGE_ACL, - u -> configACL.openDialog(u)); + u -> configACL.openACLDialog(u)); SecuredDTOOwnerColumn.configureOwnerColumns(table, columnSortHandler, stringMessages); table.addColumn(deviceConfigurationUUidColumn, stringMessages.id()); table.addColumn(actionColumn, stringMessages.actions()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java index 33747ee45d4..5afbea89d6b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java @@ -329,12 +329,12 @@ public class EventListComposite extends Composite implements EventsRefresher, Le }); final DialogConfig config = EditOwnershipDialog.create(userService.getUserManagementService(), EVENT, event -> fillEvents(), stringMessages); - actionsColumn.addAction(EventConfigImagesBarCell.ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, config::openDialog); + actionsColumn.addAction(EventConfigImagesBarCell.ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, config::openOwnershipDialog); final EditACLDialog.DialogConfig configACL = EditACLDialog.create( userService.getUserManagementService(), EVENT, event -> fillEvents(), stringMessages); actionsColumn.addAction(EventConfigImagesBarCell.ACTION_CHANGE_ACL, DefaultActions.CHANGE_ACL, - e -> configACL.openDialog(e)); + e -> configACL.openACLDialog(e)); final MigrateGroupOwnershipDialog.DialogConfig migrateDialogConfig = MigrateGroupOwnershipDialog .create(userService.getUserManagementService(), (event, dto) -> { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/IgtimiAccountsPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/IgtimiAccountsPanel.java index 3a194c5c2a1..3391017118e 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/IgtimiAccountsPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/IgtimiAccountsPanel.java @@ -237,11 +237,11 @@ public class IgtimiAccountsPanel extends FlowPanel { }); final DialogConfig config = EditOwnershipDialog .create(userService.getUserManagementService(), type, roleDefinition -> refresh(), stringMessages); - roleActionColumn.addAction(ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, config::openDialog); + roleActionColumn.addAction(ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, config::openOwnershipDialog); final EditACLDialog.DialogConfig configACL = EditACLDialog .create(userService.getUserManagementService(), type, roleDefinition -> refresh(), stringMessages); roleActionColumn.addAction(DefaultActionsImagesBarCell.ACTION_CHANGE_ACL, DefaultActions.CHANGE_ACL, - configACL::openDialog); + configACL::openACLDialog); table.addColumn(accountSelectionCheckboxColumn, accountSelectionCheckboxColumn.getHeader()); table.addColumn(accountNameColumn, stringMessages.name()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java index 76887132ab9..951953d93c4 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java @@ -207,7 +207,6 @@ public class LeaderboardConfigPanel extends AbstractLeaderboardConfigPanel return sortList.size() > 0 & sortList.get(0).isAscending(); } }); - TextColumn leaderboardDisplayNameColumn = new TextColumn() { @Override public String getValue(StrippedLeaderboardDTOWithSecurity leaderboard) { @@ -233,7 +232,6 @@ public class LeaderboardConfigPanel extends AbstractLeaderboardConfigPanel leaderboardColumnListHandler.setComparator(leaderboardCanBoatsOfCompetitorsChangePerRaceColumn, (l1, l2) -> Boolean.valueOf(l1.canBoatsOfCompetitorsChangePerRace) .compareTo(Boolean.valueOf(l2.canBoatsOfCompetitorsChangePerRace))); - TextColumn discardingOptionsColumn = new TextColumn() { @Override public String getValue(StrippedLeaderboardDTOWithSecurity leaderboard) { @@ -262,7 +260,6 @@ public class LeaderboardConfigPanel extends AbstractLeaderboardConfigPanel } return new NaturalComparator().compare(s1, s2); }); - TextColumn leaderboardTypeColumn = new TextColumn() { @Override public String getValue(StrippedLeaderboardDTOWithSecurity leaderboard) { @@ -271,7 +268,6 @@ public class LeaderboardConfigPanel extends AbstractLeaderboardConfigPanel }; leaderboardTypeColumn.setSortable(true); leaderboardColumnListHandler.setComparator(leaderboardTypeColumn, (o1, o2) -> o1.type.compareTo(o2.type)); - TextColumn scoringSystemColumn = new TextColumn() { @Override public String getValue(StrippedLeaderboardDTOWithSecurity leaderboard) { @@ -285,7 +281,6 @@ public class LeaderboardConfigPanel extends AbstractLeaderboardConfigPanel String s2 = o2.scoringScheme == null ? null : o2.scoringScheme.toString(); return new NaturalComparator().compare(s1, s2); }); - TextColumn courseAreaColumn = new TextColumn() { @Override public String getValue(StrippedLeaderboardDTOWithSecurity leaderboard) { @@ -330,7 +325,6 @@ public class LeaderboardConfigPanel extends AbstractLeaderboardConfigPanel leaderboardDTO -> { sailingService.getAvailableDetailTypesForLeaderboard(leaderboardDTO.getName(), null, new AsyncCallback>() { - @Override public void onFailure(Throwable caught) { logger.log(Level.WARNING, "Could not load detailtypes for leaderboard", caught); @@ -358,19 +352,16 @@ public class LeaderboardConfigPanel extends AbstractLeaderboardConfigPanel this::createPairingListTemplate); leaderboardActionColumn.addAction(LeaderboardConfigImagesBarCell.ACTION_PRINT_PAIRINGLIST, READ, this::openPairingListEntryPoint); - final DialogConfig config = EditOwnershipDialog.create( userService.getUserManagementService(), type, leaderboardDTO -> reloadLeaderboardForTable(leaderboardDTO.getName()), stringMessages); leaderboardActionColumn.addAction(LeaderboardConfigImagesBarCell.ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, - config::openDialog); - + config::openOwnershipDialog); final EditACLDialog.DialogConfig configACL = EditACLDialog.create( userService.getUserManagementService(), type, leaderboardDTO -> reloadLeaderboardForTable(leaderboardDTO.getName()), stringMessages); leaderboardActionColumn.addAction(DefaultActionsImagesBarCell.ACTION_CHANGE_ACL, DefaultActions.CHANGE_ACL, - configACL::openDialog); - + configACL::openACLDialog); leaderboardTable.addColumn(selectionCheckboxColumn, selectionCheckboxColumn.getHeader()); leaderboardTable.addColumn(linkColumn, stringMessages.name()); leaderboardTable.addColumn(leaderboardDisplayNameColumn, stringMessages.displayName()); 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 cd47bf68099..40a2ca965b7 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 @@ -596,13 +596,13 @@ public class LeaderboardGroupConfigPanel extends AbstractRegattaPanel userService.getUserManagementService(), type, group -> leaderboardGroupsRefresher.fillLeaderboardGroups(), stringMessages); actionsColumn.addAction(LeaderboardGroupConfigImagesBarCell.ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, - e -> config.openDialog(e)); + e -> config.openOwnershipDialog(e)); final EditACLDialog.DialogConfig configACL = EditACLDialog.create( userService.getUserManagementService(), type, group -> leaderboardGroupsRefresher.fillLeaderboardGroups(), stringMessages); actionsColumn.addAction(LeaderboardGroupConfigImagesBarCell.ACTION_CHANGE_ACL, DefaultActions.CHANGE_ACL, - e -> configACL.openDialog(e)); + e -> configACL.openACLDialog(e)); final MigrateGroupOwnershipDialog.DialogConfig migrateDialogConfig = MigrateGroupOwnershipDialog .create(userService.getUserManagementService(), (lg, dto) -> { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LocalServerManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LocalServerManagementPanel.java index 02edf7d669e..647a4f743e6 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LocalServerManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LocalServerManagementPanel.java @@ -95,9 +95,9 @@ public class LocalServerManagementPanel extends SimplePanel { final AccessControlledButtonPanel buttonPanel = new AccessControlledButtonPanel(userService, type); buttonPanel.addAction(stringMessages.actionChangeOwnership(), () -> permissionCheck.test(CHANGE_OWNERSHIP), - () -> configOwner.openDialog(currentServerInfo)); + () -> configOwner.openOwnershipDialog(currentServerInfo)); buttonPanel.addAction(stringMessages.actionChangeACL(), () -> permissionCheck.test(CHANGE_ACL), - () -> configACL.openDialog(currentServerInfo)); + () -> configACL.openACLDialog(currentServerInfo)); return buttonPanel; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/MediaPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/MediaPanel.java index bfa425ca318..8fb424e5ab2 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/MediaPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/MediaPanel.java @@ -588,9 +588,9 @@ public class MediaPanel extends FlowPanel implements MediaTracksRefresher { final EditACLDialog.DialogConfig configACL = EditACLDialog.create( userService.getUserManagementService(), type, mediaTrack -> mediaTrack.getAccessControlList(), stringMessages); - actionsColumn.addAction(ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, configOwnership::openDialog); + actionsColumn.addAction(ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, configOwnership::openOwnershipDialog); actionsColumn.addAction(DefaultActionsImagesBarCell.ACTION_CHANGE_ACL, DefaultActions.CHANGE_ACL, - mediaTrack -> configACL.openDialog(mediaTrack)); + mediaTrack -> configACL.openACLDialog(mediaTrack)); mediaTracksTable.addColumn(actionsColumn, stringMessages.actions()); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaListComposite.java index b129e6b607f..7d70b40cfb9 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaListComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaListComposite.java @@ -277,12 +277,12 @@ public class RegattaListComposite extends Composite implements RegattasDisplayer final DialogConfig config = EditOwnershipDialog.create(userService.getUserManagementService(), type, regatta -> regattaRefresher.fillRegattas(), stringMessages); actionsColumn.addAction(RegattaConfigImagesBarCell.ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, - regattaDTO -> config.openDialog(regattaDTO)); + regattaDTO -> config.openOwnershipDialog(regattaDTO)); final EditACLDialog.DialogConfig configACL = EditACLDialog.create( userService.getUserManagementService(), type, regatta -> regattaRefresher.fillRegattas(), stringMessages); actionsColumn.addAction(RegattaConfigImagesBarCell.ACTION_CHANGE_ACL, DefaultActions.CHANGE_ACL, - regattaDTO -> configACL.openDialog(regattaDTO)); + regattaDTO -> configACL.openACLDialog(regattaDTO)); table.addColumn(regattaSelectionCheckboxColumn, regattaSelectionCheckboxColumn.getHeader()); table.addColumn(regattaNameColumn, stringMessages.regattaName()); table.addColumn(regattaCanBoatsOfCompetitorsChangePerRaceColumn, stringMessages.canBoatsChange()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/ResultImportUrlsTableWrapper.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/ResultImportUrlsTableWrapper.java index ef505ba702e..cd8e5d18e2c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/ResultImportUrlsTableWrapper.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/ResultImportUrlsTableWrapper.java @@ -57,12 +57,12 @@ public class ResultImportUrlsTableWrapper config = EditOwnershipDialog.create(userService.getUserManagementService(), SecuredDomainType.RESULT_IMPORT_URL, event -> update(), stringMessages); actionsColumn.addAction(DefaultActionsImagesBarCell.ACTION_CHANGE_OWNERSHIP, DefaultActions.CHANGE_OWNERSHIP, - config::openDialog); + config::openOwnershipDialog); EditACLDialog.DialogConfig configACL = EditACLDialog.create(userService.getUserManagementService(), SecuredDomainType.RESULT_IMPORT_URL, event -> update(), stringMessages); actionsColumn.addAction(DefaultActionsImagesBarCell.ACTION_CHANGE_ACL, DefaultActions.CHANGE_ACL, - e -> configACL.openDialog(e)); + e -> configACL.openACLDialog(e)); super.table.addColumn(urlColumn, stringMessages.url()); SecuredDTOOwnerColumn.configureOwnerColumns(super.table, listHandler, stringMessages); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SmartphoneTrackingEventManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SmartphoneTrackingEventManagementPanel.java index 04aaf699e9f..2e4ec1fbc1c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SmartphoneTrackingEventManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SmartphoneTrackingEventManagementPanel.java @@ -215,9 +215,9 @@ public class SmartphoneTrackingEventManagementPanel leaderboardActionColumn.addAction(RaceLogTrackingEventManagementImagesBarCell.ACTION_SHOW_REGATTA_LOG, DefaultActions.UPDATE, t -> showRegattaLog()); leaderboardActionColumn.addAction(DefaultActionsImagesBarCell.ACTION_CHANGE_OWNERSHIP, DefaultActions.UPDATE, - configOwnership::openDialog); + configOwnership::openOwnershipDialog); leaderboardActionColumn.addAction(DefaultActionsImagesBarCell.ACTION_CHANGE_ACL, DefaultActions.UPDATE, - configACL::openDialog); + configACL::openACLDialog); leaderboardTable.addColumn(selectionCheckboxColumn, selectionCheckboxColumn.getHeader()); leaderboardTable.addColumn(leaderboardNameColumn, stringMessages.name()); leaderboardTable.addColumn(leaderboardDisplayNameColumn, stringMessages.displayName()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java index de5fdf98ffe..6bea48c22cd 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/CourseTemplatePanel.java @@ -336,9 +336,9 @@ public class CourseTemplatePanel extends FlowPanel { } }); actionsColumn.addAction(ACTION_UPDATE, UPDATE, e -> openEditCourseTemplateDialog(e, userService, false)); - actionsColumn.addAction(ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, configOwnership::openDialog); + actionsColumn.addAction(ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, configOwnership::openOwnershipDialog); actionsColumn.addAction(DefaultActionsImagesBarCell.ACTION_CHANGE_ACL, DefaultActions.CHANGE_ACL, - courseTemplate -> configACL.openDialog(courseTemplate)); + courseTemplate -> configACL.openACLDialog(courseTemplate)); courseTemplateTable.addColumn(idColumn, stringMessages.id()); courseTemplateTable.addColumn(actionsColumn, stringMessages.actions()); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java index 7e219f30401..47b1790cd90 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkPropertiesPanel.java @@ -367,9 +367,9 @@ public class MarkPropertiesPanel extends FlowPanel { this::openEditMarkPropertiesPositionDialog); actionsColumn.addAction(MarkPropertiesImagesbarCell.ACTION_UNSET_POSITION, this::unsetPosition); - actionsColumn.addAction(ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, configOwnership::openDialog); + actionsColumn.addAction(ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, configOwnership::openOwnershipDialog); actionsColumn.addAction(DefaultActionsImagesBarCell.ACTION_CHANGE_ACL, DefaultActions.CHANGE_ACL, - markProperties -> configACL.openDialog(markProperties)); + markProperties -> configACL.openACLDialog(markProperties)); markPropertiesTable.addColumn(idColumn, stringMessages.id()); markPropertiesTable.addColumn(actionsColumn, stringMessages.actions()); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkRolePanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkRolePanel.java index 5abb9d4d477..faa15fb4643 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkRolePanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkRolePanel.java @@ -243,9 +243,9 @@ public class MarkRolePanel extends FlowPanel { final EditACLDialog.DialogConfig configACL = EditACLDialog.create( userService.getUserManagementService(), SecuredDomainType.MARK_ROLE, markRole -> markRole.getAccessControlList(), stringMessages); - actionsColumn.addAction(ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, configOwnership::openDialog); + actionsColumn.addAction(ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, configOwnership::openOwnershipDialog); actionsColumn.addAction(DefaultActionsImagesBarCell.ACTION_CHANGE_ACL, DefaultActions.CHANGE_ACL, - markRole -> configACL.openDialog(markRole)); + markRole -> configACL.openACLDialog(markRole)); markRolesTable.addColumn(idColumn, stringMessages.id()); markRolesTable.addColumn(actionsColumn, stringMessages.actions()); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkTemplatePanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkTemplatePanel.java index 4fcac55cb6f..c322b4fa47f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkTemplatePanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/coursecreation/MarkTemplatePanel.java @@ -292,9 +292,9 @@ public class MarkTemplatePanel extends FlowPanel { final EditACLDialog.DialogConfig configACL = EditACLDialog.create( userService.getUserManagementService(), type, markTemplate -> markTemplate.getAccessControlList(), stringMessages); - actionsColumn.addAction(ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, configOwnership::openDialog); + actionsColumn.addAction(ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, configOwnership::openOwnershipDialog); actionsColumn.addAction(DefaultActionsImagesBarCell.ACTION_CHANGE_ACL, DefaultActions.CHANGE_ACL, - markTemplate -> configACL.openDialog(markTemplate)); + markTemplate -> configACL.openACLDialog(markTemplate)); markTemplateTable.addColumn(idColumn, stringMessages.id()); markTemplateTable.addColumn(actionsColumn, stringMessages.actions()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/swisstiming/SwissTimingArchivedConnectionTableWrapper.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/swisstiming/SwissTimingArchivedConnectionTableWrapper.java index d28d682698a..451d59907fb 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/swisstiming/SwissTimingArchivedConnectionTableWrapper.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/swisstiming/SwissTimingArchivedConnectionTableWrapper.java @@ -118,9 +118,9 @@ public class SwissTimingArchivedConnectionTableWrapper extends .create( userService.getUserManagementService(), type, dto -> dto.getAccessControlList(), stringMessages); actionColumn.addAction(DefaultActionsImagesBarCell.ACTION_CHANGE_OWNERSHIP, DefaultActions.CHANGE_OWNERSHIP, - configOwnership::openDialog); + configOwnership::openOwnershipDialog); actionColumn.addAction(DefaultActionsImagesBarCell.ACTION_CHANGE_ACL, DefaultActions.CHANGE_ACL, - u -> configACL.openDialog(u)); + u -> configACL.openACLDialog(u)); filterField = new LabeledAbstractFilterablePanel( new Label(stringMessages.filterSwissTimingAchivedConnections()), new ArrayList(), dataProvider, stringMessages) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/swisstiming/SwissTimingConnectionTableWrapper.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/swisstiming/SwissTimingConnectionTableWrapper.java index 5ef411d89ad..9bcc5a2c66a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/swisstiming/SwissTimingConnectionTableWrapper.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/swisstiming/SwissTimingConnectionTableWrapper.java @@ -135,9 +135,9 @@ public class SwissTimingConnectionTableWrapper extends userService.getUserManagementService(), type, dto -> dto.getAccessControlList(), stringMessages); actionColumn.addAction(DefaultActionsImagesBarCell.ACTION_CHANGE_OWNERSHIP, DefaultActions.CHANGE_OWNERSHIP, - configOwnership::openDialog); + configOwnership::openOwnershipDialog); actionColumn.addAction(DefaultActionsImagesBarCell.ACTION_CHANGE_ACL, DefaultActions.CHANGE_ACL, - u -> configACL.openDialog(u)); + u -> configACL.openACLDialog(u)); filterField = new LabeledAbstractFilterablePanel( new Label(stringMessagesClient.filterSwissTimingConnections()), diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/tractrac/TracTracConnectionTableWrapper.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/tractrac/TracTracConnectionTableWrapper.java index 79b858d9a55..35942bfd2f2 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/tractrac/TracTracConnectionTableWrapper.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/tractrac/TracTracConnectionTableWrapper.java @@ -129,9 +129,9 @@ public class TracTracConnectionTableWrapper extends final EditACLDialog.DialogConfig configACL = EditACLDialog.create( userService.getUserManagementService(), type, dto -> dto.getAccessControlList(), stringMessages); actionColumn.addAction(DefaultActionsImagesBarCell.ACTION_CHANGE_OWNERSHIP, DefaultActions.CHANGE_OWNERSHIP, - configOwnership::openDialog); + configOwnership::openOwnershipDialog); actionColumn.addAction(DefaultActionsImagesBarCell.ACTION_CHANGE_ACL, DefaultActions.CHANGE_ACL, - u -> configACL.openDialog(u)); + u -> configACL.openACLDialog(u)); filterField = new LabeledAbstractFilterablePanel( new Label(stringMessages.filterTracTracConnections()), new ArrayList(), dataProvider, stringMessages) { diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy).launch b/java/com.sap.sailing.server/SailingServer (No Proxy).launch index f1bacabfbff..b30d4ab46e6 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy).launch @@ -32,8 +32,186 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/EditOwnershipDialog.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/EditOwnershipDialog.java index e10a2fc46b2..bf9921c89fe 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/EditOwnershipDialog.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/EditOwnershipDialog.java @@ -244,7 +244,7 @@ public class EditOwnershipDialog extends DataEntryDialog /** * Creates a new {@link DialogConfig dialog configuration} instance which can be (re-)used to - * {@link DialogConfig#openDialog(Named) open} a {@link EditOwnershipDialog dialog}. + * {@link DialogConfig#openOwnershipDialog(Named) open} a {@link EditOwnershipDialog dialog}. * * @param userManagementService * {@link UserManagementServiceAsync} to use to set the secured object's ownership @@ -285,7 +285,7 @@ public class EditOwnershipDialog extends DataEntryDialog * @param securedObject * {@link Named} {@link SecuredObject} instance to edit ownerships for */ - public void openDialog(final T securedObject) { + public void openOwnershipDialog(final T securedObject) { final QualifiedObjectIdentifier identifier = securedObject.getIdentifier(); final String permissionType = identifier.getTypeIdentifier(); final String id = identifier.getTypeRelativeObjectIdentifier().toString(); diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/RoleDefinitionsPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/RoleDefinitionsPanel.java index 249a4926fc8..5001aaedd59 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/RoleDefinitionsPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/RoleDefinitionsPanel.java @@ -211,12 +211,12 @@ public class RoleDefinitionsPanel extends VerticalPanel { }); final DialogConfig config = EditOwnershipDialog.create(userManagementService, type, roleDefinition -> updateRoleDefinitions(), stringMessages); - roleActionColumn.addAction(ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, config::openDialog); + roleActionColumn.addAction(ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, config::openOwnershipDialog); final EditACLDialog.DialogConfig configACL = EditACLDialog.create( userService.getUserManagementService(), type, roleDefinition -> updateRoleDefinitions(), stringMessages); roleActionColumn.addAction(DefaultActionsImagesBarCell.ACTION_CHANGE_ACL, DefaultActions.CHANGE_ACL, - configACL::openDialog); + configACL::openACLDialog); table.addColumn(roleSelectionCheckboxColumn, roleSelectionCheckboxColumn.getHeader()); table.addColumn(roleDefinitionNameColumn, stringMessages.name()); diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupTableWrapper.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupTableWrapper.java index e6c6ceeee61..fa821b522d8 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupTableWrapper.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupTableWrapper.java @@ -100,9 +100,9 @@ public class UserGroupTableWrapper extends stringMessages); actionColumn.addAction(DefaultActionsImagesBarCell.ACTION_CHANGE_OWNERSHIP, DefaultActions.CHANGE_OWNERSHIP, - configOwnership::openDialog); + configOwnership::openOwnershipDialog); actionColumn.addAction(DefaultActionsImagesBarCell.ACTION_CHANGE_ACL, DefaultActions.CHANGE_ACL, - u -> configACL.openDialog(u)); + u -> configACL.openACLDialog(u)); filterField = new LabeledAbstractFilterablePanel(new Label(stringMessages.filterUserGroups()), new ArrayList(), dataProvider, stringMessages) { diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/editacl/EditACLDialog.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/editacl/EditACLDialog.java index cca31a30935..31542683288 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/editacl/EditACLDialog.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/editacl/EditACLDialog.java @@ -83,7 +83,7 @@ public class EditACLDialog extends DataEntryDialog { /** * Creates a new {@link DialogConfig dialog configuration} instance which can be (re-)used to - * {@link DialogConfig#openDialog(Named) open} a {@link EditACLDialog dialog}. + * {@link DialogConfig#openACLDialog(Named) open} a {@link EditACLDialog dialog}. * * @param userManagementService * {@link UserManagementServiceAsync} to use to set the secured object's ownership @@ -126,7 +126,7 @@ public class EditACLDialog extends DataEntryDialog { * @param securedObject * {@link Named} {@link SecuredObject} instance to edit ownerships for */ - public void openDialog(final T securedObject) { + public void openACLDialog(final T securedObject) { new EditACLDialog(userManagementService, identifierFactory.apply(securedObject), availableActionsFactory.get(), stringMessages, new EditAclDialogCallback(securedObject)).show(); } diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/usermanagement/UserTableWrapper.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/usermanagement/UserTableWrapper.java index c3ef7877c82..410b427db17 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/usermanagement/UserTableWrapper.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/usermanagement/UserTableWrapper.java @@ -190,9 +190,9 @@ extends TableWrapper { final EditACLDialog.DialogConfig configACL = EditACLDialog.create( userService.getUserManagementService(), type, user -> user.getAccessControlList(), stringMessages); - userActionColumn.addAction(ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, configOwnership::openDialog); + userActionColumn.addAction(ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, configOwnership::openOwnershipDialog); userActionColumn.addAction(DefaultActionsImagesBarCell.ACTION_CHANGE_ACL, DefaultActions.CHANGE_ACL, - u -> configACL.openDialog(u)); + u -> configACL.openACLDialog(u)); filterField = new LabeledAbstractFilterablePanel(new Label(stringMessages.filterUsers()), new ArrayList(), dataProvider, stringMessages) { diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/usermanagement/permissions/WildcardPermissionWithSecurityDTOTableWrapper.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/usermanagement/permissions/WildcardPermissionWithSecurityDTOTableWrapper.java index f922d0b38ac..b3ee38a44c0 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/usermanagement/permissions/WildcardPermissionWithSecurityDTOTableWrapper.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/usermanagement/permissions/WildcardPermissionWithSecurityDTOTableWrapper.java @@ -105,9 +105,9 @@ public class WildcardPermissionWithSecurityDTOTableWrapper extends stringMessages); final EditACLDialog.DialogConfig configACL = EditACLDialog.create( userService.getUserManagementService(), type, user -> user.getAccessControlList(), stringMessages); - userActionColumn.addAction(ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, configOwnership::openDialog); + userActionColumn.addAction(ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, configOwnership::openOwnershipDialog); userActionColumn.addAction(DefaultActionsImagesBarCell.ACTION_CHANGE_ACL, DefaultActions.CHANGE_ACL, - permission -> configACL.openDialog(permission)); + permission -> configACL.openACLDialog(permission)); // filter field configuration filterField = new LabeledAbstractFilterablePanel( new Label(stringMessages.filterPermission()), new ArrayList(), diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/usermanagement/roles/RoleWithSecurityDTOTableWrapper.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/usermanagement/roles/RoleWithSecurityDTOTableWrapper.java index c0afb3b1912..9204c3bd360 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/usermanagement/roles/RoleWithSecurityDTOTableWrapper.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/usermanagement/roles/RoleWithSecurityDTOTableWrapper.java @@ -107,9 +107,9 @@ public class RoleWithSecurityDTOTableWrapper extends .create(userService.getUserManagementService(), type, permission -> refreshRoleList(), stringMessages); final EditACLDialog.DialogConfig configACL = EditACLDialog.create( userService.getUserManagementService(), type, user -> user.getAccessControlList(), stringMessages); - userActionColumn.addAction(ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, configOwnership::openDialog); + userActionColumn.addAction(ACTION_CHANGE_OWNERSHIP, CHANGE_OWNERSHIP, configOwnership::openOwnershipDialog); userActionColumn.addAction(DefaultActionsImagesBarCell.ACTION_CHANGE_ACL, DefaultActions.CHANGE_ACL, - permission -> configACL.openDialog(permission)); + permission -> configACL.openACLDialog(permission)); // filter field configuration filterField = new LabeledAbstractFilterablePanel(new Label(stringMessages.filterRoles()), new ArrayList(), dataProvider, stringMessages) { From 99c81af6b95017f5e6f3b47626f9dbed396016a3 Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Fri, 24 Apr 2020 09:10:13 +0200 Subject: [PATCH 183/188] remove unneeded caputuring group, remove unneeded regex modifier g as each pattern occurrs only once in the file, delete .bak files which are created when doing inline replacement, updated doc bug5255 --- .../scripts/analyzeProduct.sh | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.feature.p2build/scripts/analyzeProduct.sh b/java/com.sap.sailing.feature.p2build/scripts/analyzeProduct.sh index ba710454640..7d29ac1f10f 100755 --- a/java/com.sap.sailing.feature.p2build/scripts/analyzeProduct.sh +++ b/java/com.sap.sailing.feature.p2build/scripts/analyzeProduct.sh @@ -88,8 +88,15 @@ while [ "$2" != "" ]; do fi selected_target_bundles="${target_bundles}${NL}<\/setAttribute>" patched_workspace_bundles="${patched_workspace_bundles}${NL}<\/setAttribute>" - perl -i -p0e "s/(.*?)<\/setAttribute>/${selected_target_bundles}/sg" "$2" - perl -i -p0e "s/(.*?)<\/setAttribute>/${patched_workspace_bundles}/sg" "$2" + # Used Perl CLI options: + #0 -> specifies the record separator, as you alread found out, it defaults to \0 so it does not terminate before the end of the text file. Ensures that the regular expression is applied over the whole file. + #p -> apply looping wrapper, see perl man page + #e -> denotes the (regular) expression that is goint ot be applied. + #i -> inplace editing of files + perl -i -p0e "s/.*?<\/setAttribute>/${selected_target_bundles}/s" "$2" + perl -i -p0e "s/.*?<\/setAttribute>/${patched_workspace_bundles}/s" "$2" + # remove eventuelly created bak files (this happens at least on windows platform) + rm "$2.bak" fi shift done From 7612b9666477d9e2253c25251caa600c73cea134 Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Fri, 24 Apr 2020 09:36:28 +0200 Subject: [PATCH 184/188] fix interpretation of @ as perl list parameter force deletion to get no error when file does not exist bug5255 --- .../scripts/analyzeProduct.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/java/com.sap.sailing.feature.p2build/scripts/analyzeProduct.sh b/java/com.sap.sailing.feature.p2build/scripts/analyzeProduct.sh index 7d29ac1f10f..0d570e4ec2e 100755 --- a/java/com.sap.sailing.feature.p2build/scripts/analyzeProduct.sh +++ b/java/com.sap.sailing.feature.p2build/scripts/analyzeProduct.sh @@ -58,9 +58,9 @@ for feature in $features; do if [ "$?" == "0" ]; then # found a configuration for the bundle echo ' *** Found a non-default configuration for bundle '${bundle}' ***' - bundle_spec_for_launch=$(echo "$autostart_bundles" | grep '^'${bundle}' [^ ]* [^ ]*$' | sed -e 's/^\([^ ]*\) \([^ ]*\) \([^ ]*\)$/\1@\2:\3/') + bundle_spec_for_launch=$(echo "$autostart_bundles" | grep '^'${bundle}' [^ ]* [^ ]*$' | sed -e 's/^\([^ ]*\) \([^ ]*\) \([^ ]*\)$/\1\\@\2:\3/') else - bundle_spec_for_launch="${bundle}@default:default" + bundle_spec_for_launch="${bundle}\@default:default" fi if [[ $feature =~ .runtime$ ]]; then # contribute to target_bundles @@ -96,7 +96,7 @@ while [ "$2" != "" ]; do perl -i -p0e "s/.*?<\/setAttribute>/${selected_target_bundles}/s" "$2" perl -i -p0e "s/.*?<\/setAttribute>/${patched_workspace_bundles}/s" "$2" # remove eventuelly created bak files (this happens at least on windows platform) - rm "$2.bak" + rm -f "$2.bak" fi shift done From 1209d1de619340985f5831b8d7ff3ccc615d3910 Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Fri, 24 Apr 2020 09:42:00 +0200 Subject: [PATCH 185/188] fix conversion errors with new script bug5255 --- .../SailingServer (No Proxy OSX).launch | 354 +++++++++--------- .../SailingServer (No Proxy).launch | 352 +++++++++-------- ...ailingServer (No Proxy, Cached MTB).launch | 350 ++++++++--------- ...erver (No Proxy, Igtimi Local Test).launch | 352 +++++++++-------- .../SailingServer (No Proxy, Java11).launch | 354 +++++++++--------- ...r (No Proxy, Java11, JFR Recording).launch | 354 +++++++++--------- ...ingServer (No Proxy, Jetty on 8889).launch | 354 +++++++++--------- ...o Proxy, Jetty on 8889, Cached MTB).launch | 354 +++++++++--------- ...on 8889, auto-replicate SS and SSD).launch | 354 +++++++++--------- ... Jetty on 8889, auto-replicate dev).launch | 354 +++++++++--------- ...oxy, Jetty on 8889, auto-replicate).launch | 352 +++++++++-------- ...ingServer (No Proxy, Jetty on 8890).launch | 354 +++++++++--------- ...uto-replicate from replica at 8889).launch | 354 +++++++++--------- ...ver (No Proxy, Remote Debug SAP VM).launch | 354 +++++++++--------- ...ver (No Proxy, bundesliga2-2017 DB).launch | 352 +++++++++-------- ...ailingServer (No Proxy, winddbTest).launch | 185 +-------- ...& Wind estimation Import from 8888).launch | 354 +++++++++--------- 17 files changed, 2824 insertions(+), 3013 deletions(-) diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy OSX).launch b/java/com.sap.sailing.server/SailingServer (No Proxy OSX).launch index 514e6b4db56..fc7231c481b 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy OSX).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy OSX).launch @@ -31,185 +31,185 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy).launch b/java/com.sap.sailing.server/SailingServer (No Proxy).launch index 6d1556bc3f5..6d414531eb2 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy).launch @@ -33,185 +33,183 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch index be0b845003c..20923280a11 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch @@ -30,183 +30,183 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Igtimi Local Test).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Igtimi Local Test).launch index 500bb2d2841..19afc483949 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Igtimi Local Test).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Igtimi Local Test).launch @@ -33,185 +33,183 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Java11).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Java11).launch index 6dbd9c9253e..b558d5baf59 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Java11).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Java11).launch @@ -33,185 +33,185 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Java11, JFR Recording).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Java11, JFR Recording).launch index e6fd2cb8d12..52cf9323af1 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Java11, JFR Recording).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Java11, JFR Recording).launch @@ -33,185 +33,185 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch index bc6585d53c8..ad288e7825d 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch @@ -24,185 +24,185 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch index 4324ebd4707..21019e8f2ef 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch @@ -24,185 +24,185 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate SS and SSD).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate SS and SSD).launch index 827c8c54833..aacb6a54d1a 100644 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate SS and SSD).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate SS and SSD).launch @@ -26,185 +26,185 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate dev).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate dev).launch index cf54bc7bc24..22ff3992831 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate dev).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate dev).launch @@ -24,185 +24,185 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate).launch index d63e8715553..6f8bae8f53f 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate).launch @@ -26,185 +26,183 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch index 72c1c8e2a62..aba8db73bc8 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch @@ -24,185 +24,185 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890, auto-replicate from replica at 8889).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890, auto-replicate from replica at 8889).launch index 638bdceebdb..e1861029066 100644 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890, auto-replicate from replica at 8889).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890, auto-replicate from replica at 8889).launch @@ -24,185 +24,185 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch index fd4e018d6dc..96b709cd1ce 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch @@ -24,185 +24,185 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, bundesliga2-2017 DB).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, bundesliga2-2017 DB).launch index d5939e93a16..4e13b4ad317 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, bundesliga2-2017 DB).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, bundesliga2-2017 DB).launch @@ -33,185 +33,183 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch index 9bd3ee99481..a12bcc8ad2d 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch @@ -29,189 +29,8 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889, Polar & Wind estimation Import from 8888).launch b/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889, Polar & Wind estimation Import from 8888).launch index bbe51f9b30f..17cf95efbee 100755 --- a/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889, Polar & Wind estimation Import from 8888).launch +++ b/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889, Polar & Wind estimation Import from 8888).launch @@ -24,185 +24,185 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From ef3c0d3e364693eff6f023f91b3e3cc04f1311cf Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Fri, 24 Apr 2020 10:01:31 +0200 Subject: [PATCH 186/188] apply migration script after updating branch with changes from master bug5255 --- .../SailingServer (No Proxy OSX).launch | 1 + .../SailingServer (No Proxy).launch | 274 ++++++++--------- ...ailingServer (No Proxy, Cached MTB).launch | 275 +++++++++--------- ...erver (No Proxy, Igtimi Local Test).launch | 275 +++++++++--------- .../SailingServer (No Proxy, Java11).launch | 1 + ...r (No Proxy, Java11, JFR Recording).launch | 1 + ...ingServer (No Proxy, Jetty on 8889).launch | 1 + ...o Proxy, Jetty on 8889, Cached MTB).launch | 1 + ...on 8889, auto-replicate SS and SSD).launch | 1 + ... Jetty on 8889, auto-replicate dev).launch | 1 + ...oxy, Jetty on 8889, auto-replicate).launch | 275 +++++++++--------- ...ingServer (No Proxy, Jetty on 8890).launch | 1 + ...uto-replicate from replica at 8889).launch | 1 + ...ver (No Proxy, Remote Debug SAP VM).launch | 1 + ...ver (No Proxy, bundesliga2-2017 DB).launch | 275 +++++++++--------- ...erver (No Proxy, debranding active).launch | 184 +++++++++++- ...ailingServer (No Proxy, winddbTest).launch | 186 +++++++++++- ...& Wind estimation Import from 8888).launch | 1 + 18 files changed, 1071 insertions(+), 684 deletions(-) diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy OSX).launch b/java/com.sap.sailing.server/SailingServer (No Proxy OSX).launch index fc7231c481b..d34379bb2bf 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy OSX).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy OSX).launch @@ -180,6 +180,7 @@ + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy).launch b/java/com.sap.sailing.server/SailingServer (No Proxy).launch index b30d4ab46e6..42808cb45d2 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy).launch @@ -33,66 +33,38 @@ - - - - - - - - - - - - - - - - - - - - - - - + - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - @@ -102,115 +74,145 @@ - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + - - - - - + + + + + + + + + - - - + - - - - - - - - - - - - - - - - - - - + + + + - + + + + + + + + + + + + + + - - - - - - - - - - + + + + + - - - + + + + - - - - - + + + + + + + + + + + + - + + + + - - + - - - - - - - - - - - + + - - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch index 20923280a11..50b10dfac5b 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch @@ -30,66 +30,38 @@ - - - - - - - - - - - - - - - - - - - - - - - + - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - @@ -99,114 +71,145 @@ - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + - - - - - + + + + + + + + + - - - + - - - - - - - - - - - - - - - - - - - + + + + - + + + + + + + + + + + + + + - - - - - - - - - - + + + + + - - - + + + + - - - - - + + + + + + + + + + + + - - - + + + + + + - - - - - - - - - - - + + - - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Igtimi Local Test).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Igtimi Local Test).launch index 19afc483949..b326e25c44c 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Igtimi Local Test).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Igtimi Local Test).launch @@ -33,66 +33,38 @@ - - - - - - - - - - - - - - - - - - - - - - - + - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - @@ -102,114 +74,145 @@ - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + - - - - - + + + + + + + + + - - - + - - - - - - - - - - - - - - - - - - - + + + + - + + + + + + + + + + + + + + - - - - - - - - - - + + + + + - - - + + + + - - - - - + + + + + + + + + + + + - - - + + + + + + - - - - - - - - - - - + + - - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Java11).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Java11).launch index b558d5baf59..fce25b08c24 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Java11).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Java11).launch @@ -182,6 +182,7 @@ + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Java11, JFR Recording).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Java11, JFR Recording).launch index 52cf9323af1..05d3c43b7f5 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Java11, JFR Recording).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Java11, JFR Recording).launch @@ -182,6 +182,7 @@ + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch index ad288e7825d..9139de66fbd 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch @@ -173,6 +173,7 @@ + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch index 21019e8f2ef..b58daa90cbf 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch @@ -173,6 +173,7 @@ + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate SS and SSD).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate SS and SSD).launch index aacb6a54d1a..22ffc1f1a82 100644 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate SS and SSD).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate SS and SSD).launch @@ -175,6 +175,7 @@ + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate dev).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate dev).launch index 22ff3992831..0d221db0fc3 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate dev).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate dev).launch @@ -173,6 +173,7 @@ + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate).launch index 6f8bae8f53f..7eb9565a3af 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate).launch @@ -26,66 +26,38 @@ - - - - - - - - - - - - - - - - - - - - - - - + - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - @@ -95,114 +67,145 @@ - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + - - - - - + + + + + + + + + - - - + - - - - - - - - - - - - - - - - - - - + + + + - + + + + + + + + + + + + + + - - - - - - - - - - + + + + + - - - + + + + - - - - - + + + + + + + + + + + + - - - + + + + + + - - - - - - - - - - - + + - - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch index aba8db73bc8..5444b6685ad 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch @@ -173,6 +173,7 @@ + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890, auto-replicate from replica at 8889).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890, auto-replicate from replica at 8889).launch index e1861029066..ab138f0480b 100644 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890, auto-replicate from replica at 8889).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890, auto-replicate from replica at 8889).launch @@ -173,6 +173,7 @@ + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch index 96b709cd1ce..b54719ae7a2 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch @@ -173,6 +173,7 @@ + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, bundesliga2-2017 DB).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, bundesliga2-2017 DB).launch index 4e13b4ad317..dd88fcea688 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, bundesliga2-2017 DB).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, bundesliga2-2017 DB).launch @@ -33,66 +33,38 @@ - - - - - - - - - - - - - - - - - - - - - - - + - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - @@ -102,114 +74,145 @@ - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + - - - - - + + + + + + + + + - - - + - - - - - - - - - - - - - - - - - - - + + + + - + + + + + + + + + + + + + + - - - - - - - - - - + + + + + - - - + + + + - - - - - + + + + + + + + + + + + - - - + + + + + + - - - - - - - - - - - + + - - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, debranding active).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, debranding active).launch index 2a78e4b10bc..88ff4d1cdff 100644 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, debranding active).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, debranding active).launch @@ -32,8 +32,188 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch index a12bcc8ad2d..f2f6cd6b2eb 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch @@ -29,8 +29,190 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889, Polar & Wind estimation Import from 8888).launch b/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889, Polar & Wind estimation Import from 8888).launch index 17cf95efbee..530a86a56ef 100755 --- a/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889, Polar & Wind estimation Import from 8888).launch +++ b/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889, Polar & Wind estimation Import from 8888).launch @@ -173,6 +173,7 @@ + From 82ca02cdc336c44cacf04eb45608f0356a04a27f Mon Sep 17 00:00:00 2001 From: Georg Herdt Date: Fri, 24 Apr 2020 10:03:11 +0200 Subject: [PATCH 187/188] reordering of generated entries after using them in eclipse the first time bug5255 --- .../SailingServer (No Proxy OSX).launch | 272 +++++++++-------- .../SailingServer (No Proxy).launch | 272 +++++++++-------- ...ailingServer (No Proxy, Cached MTB).launch | 272 +++++++++-------- ...erver (No Proxy, Igtimi Local Test).launch | 272 +++++++++-------- .../SailingServer (No Proxy, Java11).launch | 272 +++++++++-------- ...r (No Proxy, Java11, JFR Recording).launch | 272 +++++++++-------- ...ingServer (No Proxy, Jetty on 8889).launch | 272 +++++++++-------- ...o Proxy, Jetty on 8889, Cached MTB).launch | 272 +++++++++-------- ...on 8889, auto-replicate SS and SSD).launch | 272 +++++++++-------- ... Jetty on 8889, auto-replicate dev).launch | 272 +++++++++-------- ...oxy, Jetty on 8889, auto-replicate).launch | 272 +++++++++-------- ...ingServer (No Proxy, Jetty on 8890).launch | 272 +++++++++-------- ...uto-replicate from replica at 8889).launch | 272 +++++++++-------- ...ver (No Proxy, Remote Debug SAP VM).launch | 272 +++++++++-------- ...ver (No Proxy, bundesliga2-2017 DB).launch | 272 +++++++++-------- ...erver (No Proxy, debranding active).launch | 272 +++++++++-------- ...ailingServer (No Proxy, winddbTest).launch | 274 +++++++++--------- ...& Wind estimation Import from 8888).launch | 272 +++++++++-------- 18 files changed, 2430 insertions(+), 2468 deletions(-) diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy OSX).launch b/java/com.sap.sailing.server/SailingServer (No Proxy OSX).launch index d34379bb2bf..d0830cc69e6 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy OSX).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy OSX).launch @@ -31,38 +31,66 @@ - - - - - - - - - - - - + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -72,145 +100,115 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + + - + + + - - - - - - - + + + + + + - - + + + + - - + - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + - - - - + + - - - - - - - - + + + + + + + + + + + + - + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy).launch b/java/com.sap.sailing.server/SailingServer (No Proxy).launch index 42808cb45d2..d66051e767f 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy).launch @@ -33,38 +33,66 @@ - - - - - - - - - - - - + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -74,145 +102,115 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + + - + + + - - - - - - - + + + + + + - - + + + + - - + - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + - - - - + + - - - - - - - - + + + + + + + + + + + + - + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch index 50b10dfac5b..e65dccb16c4 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch @@ -30,38 +30,66 @@ - - - - - - - - - - - - + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -71,145 +99,115 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + + - + + + - - - - - - - + + + + + + - - + + + + - - + - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + - - - - + + - - - - - - - - + + + + + + + + + + + + - + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Igtimi Local Test).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Igtimi Local Test).launch index b326e25c44c..3c0aafb3106 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Igtimi Local Test).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Igtimi Local Test).launch @@ -33,38 +33,66 @@ - - - - - - - - - - - - + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -74,145 +102,115 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + + - + + + - - - - - - - + + + + + + - - + + + + - - + - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + - - - - + + - - - - - - - - + + + + + + + + + + + + - + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Java11).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Java11).launch index fce25b08c24..5854cf79900 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Java11).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Java11).launch @@ -33,38 +33,66 @@ - - - - - - - - - - - - + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -74,145 +102,115 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + + - + + + - - - - - - - + + + + + + - - + + + + - - + - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + - - - - + + - - - - - - - - + + + + + + + + + + + + - + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Java11, JFR Recording).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Java11, JFR Recording).launch index 05d3c43b7f5..43978fc09fc 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Java11, JFR Recording).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Java11, JFR Recording).launch @@ -33,38 +33,66 @@ - - - - - - - - - - - - + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -74,145 +102,115 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + + - + + + - - - - - - - + + + + + + - - + + + + - - + - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + - - - - + + - - - - - - - - + + + + + + + + + + + + - + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch index 9139de66fbd..ff559808c02 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch @@ -24,38 +24,66 @@ - - - - - - - - - - - - + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -65,145 +93,115 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + + - + + + - - - - - - - + + + + + + - - + + + + - - + - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + - - - - + + - - - - - - - - + + + + + + + + + + + + - + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch index b58daa90cbf..f26cf4efd5c 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch @@ -24,38 +24,66 @@ - - - - - - - - - - - - + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -65,145 +93,115 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + + - + + + - - - - - - - + + + + + + - - + + + + - - + - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + - - - - + + - - - - - - - - + + + + + + + + + + + + - + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate SS and SSD).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate SS and SSD).launch index 22ffc1f1a82..510ebc647ef 100644 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate SS and SSD).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate SS and SSD).launch @@ -26,38 +26,66 @@ - - - - - - - - - - - - + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -67,145 +95,115 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + + - + + + - - - - - - - + + + + + + - - + + + + - - + - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + - - - - + + - - - - - - - - + + + + + + + + + + + + - + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate dev).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate dev).launch index 0d221db0fc3..02e1cbf2026 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate dev).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate dev).launch @@ -24,38 +24,66 @@ - - - - - - - - - - - - + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -65,145 +93,115 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + + - + + + - - - - - - - + + + + + + - - + + + + - - + - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + - - - - + + - - - - - - - - + + + + + + + + + + + + - + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate).launch index 7eb9565a3af..26dbf774ddf 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate).launch @@ -26,38 +26,66 @@ - - - - - - - - - - - - + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -67,145 +95,115 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + + - + + + - - - - - - - + + + + + + - - + + + + - - + - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + - - - - + + - - - - - - - - + + + + + + + + + + + + - + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch index 5444b6685ad..7317010a924 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch @@ -24,38 +24,66 @@ - - - - - - - - - - - - + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -65,145 +93,115 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + + - + + + - - - - - - - + + + + + + - - + + + + - - + - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + - - - - + + - - - - - - - - + + + + + + + + + + + + - + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890, auto-replicate from replica at 8889).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890, auto-replicate from replica at 8889).launch index ab138f0480b..d57783947ac 100644 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890, auto-replicate from replica at 8889).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890, auto-replicate from replica at 8889).launch @@ -24,38 +24,66 @@ - - - - - - - - - - - - + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -65,145 +93,115 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + + - + + + - - - - - - - + + + + + + - - + + + + - - + - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + - - - - + + - - - - - - - - + + + + + + + + + + + + - + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch index b54719ae7a2..9637715c717 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch @@ -24,38 +24,66 @@ - - - - - - - - - - - - + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -65,145 +93,115 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + + - + + + - - - - - - - + + + + + + - - + + + + - - + - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + - - - - + + - - - - - - - - + + + + + + + + + + + + - + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, bundesliga2-2017 DB).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, bundesliga2-2017 DB).launch index dd88fcea688..8406d2ac3fd 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, bundesliga2-2017 DB).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, bundesliga2-2017 DB).launch @@ -33,38 +33,66 @@ - - - - - - - - - - - - + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -74,145 +102,115 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + + - + + + - - - - - - - + + + + + + - - + + + + - - + - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + - - - - + + - - - - - - - - + + + + + + + + + + + + - + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, debranding active).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, debranding active).launch index 88ff4d1cdff..ae0761f4488 100644 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, debranding active).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, debranding active).launch @@ -33,38 +33,66 @@ - - - - - - - - - - - - + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -74,145 +102,115 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + + - + + + - - - - - - - + + + + + + - - + + + + - - + - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + - - - - + + - - - - - - - - + + + + + + + + + + + + - + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch index f2f6cd6b2eb..576879a8311 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch @@ -30,38 +30,66 @@ - - - - - - - - - - - - + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -71,147 +99,115 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + + - + + + - - - - - - - + + + + + + - - + + + + - - + - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + - - - - + + - - - - - - - - + + + + + + + + + + + + - + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889, Polar & Wind estimation Import from 8888).launch b/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889, Polar & Wind estimation Import from 8888).launch index 530a86a56ef..cbcf53593b5 100755 --- a/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889, Polar & Wind estimation Import from 8888).launch +++ b/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889, Polar & Wind estimation Import from 8888).launch @@ -24,38 +24,66 @@ - - - - - - - - - - - - + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -65,145 +93,115 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + + - + + + - - - - - - - + + + + + + - - + + + + - - + - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + - - - - + + - - - - - - - - + + + + + + + + + + + + - + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + From cf65ea90dec5ab41381aae896fcf0f19d37b9314 Mon Sep 17 00:00:00 2001 From: Alessandro Stoltenberg Date: Fri, 24 Apr 2020 10:40:16 +0200 Subject: [PATCH 188/188] AWS Email Forwarder: Updated wiki page. --- wiki/info/landscape/support-email.md | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/wiki/info/landscape/support-email.md b/wiki/info/landscape/support-email.md index 2337917bec0..fd2fecd41d5 100644 --- a/wiki/info/landscape/support-email.md +++ b/wiki/info/landscape/support-email.md @@ -1,14 +1,22 @@ # Set Up of Support E Mail Address support@sapsailing.com with AWS SES/SNS/Lambda -We use AWS SES for all e-mail services, inbound and outbound. See also [Amazon Simple Email Service (SES) Set-Up](wiki/info/landscape/mail-relaying) for details on the general SES set-up. We have established ``support@sapsailing.com`` now as another inbound e-mail address that stores the incoming email messages in a S3 bucket called ``SupportMails``. After being stored, they will notify a SNS topic called ``SupportMailStoredInS3``. +We use AWS SES for all e-mail services, inbound and outbound. See also [Amazon Simple Email Service (SES) Set-Up](wiki/info/landscape/mail-relaying) for details on the general SES set-up. We have established ``support@sapsailing.com`` now as another inbound e-mail address that stores the incoming email messages in a S3 bucket called ``emails-for-sapsailing-com`` and has ``support@sapsailing.com`` as object prefix. After being stored, they will notify a SNS topic called ``email-forwarder-for-sapsailing-com``. -From there a Lambda function picks them up, modifies the original headers and sends out the Email to a JSON array of recipients, configurable in the ``MailRecipientsJSON`` environment variable of the ``support-email-forwarding-python`` Lambda. +From there a Lambda function picks them up, modifies the original headers and sends out the Email to a JSON array of recipients, configurable in the ``MailRecipientsJSON`` environment variable of the ``email-forwarder-python`` Lambda. -The Lambda preserves the original ``From`` and ``To`` headers by adding the value to new headers called ``X-From`` and ``X-To``. In addition it sets the ``Reply-To`` header field to the initial ``From`` value if blank. The new ``From`` value is configured in the ``MailSender`` environment variable, currently set to: ``SES Email Forwarder ``. +The Lambda preserves the original ``From`` and ``To`` headers by adding the value to new headers called ``X-From`` and ``X-To``. In addition it sets the ``Reply-To`` header field to the initial ``From`` value if blank. The new ``From`` value is configurable in the ``MailSender`` environment variable. -The role that is created to execute the Lambda needs to have a policy set that can access SES and write logs. See also [https://aws.amazon.com/blogs/messaging-and-targeting/forward-incoming-email-to-an-external-destination/](https://aws.amazon.com/blogs/messaging-and-targeting/forward-incoming-email-to-an-external-destination/) +The role ``lambda-email-forwarder-role`` is created to execute the Lambda. The policy ``lambda-email-forward-policy`` is attached to that role. See also [https://aws.amazon.com/blogs/messaging-and-targeting/forward-incoming-email-to-an-external-destination/](https://aws.amazon.com/blogs/messaging-and-targeting/forward-incoming-email-to-an-external-destination/) for further information about the whole setup. The relevant files have been committed to our git as ``configuration/mail_forward.py`` for the Lambda's code, and as ``configuration/mail_forward_policy.json`` for the security policy for the IAM role used for the Lambda. -## Changing the List of Recipients -Go to [https://eu-west-1.console.aws.amazon.com/lambda/home?region=eu-west-1#/functions/support-email-forwarding-python?tab=configuration](https://eu-west-1.console.aws.amazon.com/lambda/home?region=eu-west-1#/functions/support-email-forwarding-python?tab=configuration) and edit the ``MailRecipientsJSON`` environment variable accordingly. E.g.: ``["yourfirstemail@yourdomain.com", "yoursecondemail@yourseconddomain.com"]`` \ No newline at end of file +## Change the list of recipients +Go to [https://eu-west-1.console.aws.amazon.com/lambda/home?region=eu-west-1#/functions/email-forwarder-python?tab=configuration](https://eu-west-1.console.aws.amazon.com/lambda/home?region=eu-west-1#/functions/email-forwarder-python?tab=configuration) and edit the ``MailRecipientsJSON`` environment variable accordingly. So if you want to change the recipient list for support@sapsailing.com change the JSON array to the desired list. +``{"support@sapsailing.com": ["oldrecipient1@abc.de", "newrecipient2@abc.de"]}`` + +## Add a new forwarded address +The method described above is extensible. You can configure new email addresses to be forwarded by the forwarder. To do so you need to create a new rule in the default rule set for Email Receiving in the SES console [https://eu-west-1.console.aws.amazon.com/ses/home?region=eu-west-1#rule-set:default-rule-set](https://eu-west-1.console.aws.amazon.com/ses/home?region=eu-west-1#rule-set:default-rule-set). You need to specify the email address that you want to forward, store it in the S3 bucket mentioned above and use the address as object prefix. After that you need to add the desired recipients for that address to the MailRecipientsJSON in the lambda configuration. You may also add a key,value pair in the MailSenderJSON to specify a name from which you want to send the email, however this is not mandatory as the forwarder will default to the forwarded address. + +## Limitations +The email forwarder forwards 'To', 'Cc' and 'Bcc' headers, however not every use case for normal emails is handled. Keep in mind that this is not a email account, but rather a simple forwarder to be used for service accounts. +A known limitation is that the forwarding is not working correct if the original email handled by the fowarder contains two different email addresses handled by the forwarder in the recipients.
     raceDetails [Default = RACE_GAP_TO_LEADER_IN_SECONDS, RACE_AVERAGE_SPEED_OVER_GROUND_IN_KNOTS, RACE_CURRENT_SPEED_OVER_GROUND_IN_KNOTS, RACE_DISTANCE_TO_COMPETITOR_FARTHEST_AHEAD_IN_METERS, CURRENT_LEG]raceDetails [Default = RACE_GAP_TO_LEADER_IN_SECONDS, RACE_AVERAGE_SPEED_OVER_GROUND_IN_KNOTS, RACE_CURRENT_SPEED_OVER_GROUND_IN_KNOTS, RACE_DISTANCE_TO_COMPETITOR_FARTHEST_AHEAD_IN_METERS, CURRENT_LEG]; + use "ALL" to get all detail types supported.