From d1bc46ad26ab8747cd5bb735620356c6f845c541 Mon Sep 17 00:00:00 2001 From: Udo Wessels Date: Mon, 4 Mar 2024 17:40:59 +0100 Subject: [PATCH] bug5774: mainly fixed the implementation so that no exception occurs any more when using the new secured settings. - Added a new documentation page under HowTo -> Development -> Secured Settings - Cleaned up some RaceMapSetting initializations by using the newly introduced builder - Added a PaywallResolverProxy - Used the PaywallResolverProxy and SecuredDTOProxy to make it possible to add the underlying objects to a later time - Refactored some field naming, especially the name of setting fields - Changed the getValue() method of a setting to return the default value if value is null (background was the casting of NULL values to atomar return parameters like boolean or int, also a default value was set) - Added a setValue method without permission check to be used for reset to default method, which will not be overwritten by other implementations of the AbstractValueSetting, which causes some exceptions before. - Added log messages if a value of an secured value setting is used without paywall resolver or secured DTO --- home.md | 3 +- .../startanalysis/card/StartAnalysisCard.java | 21 +- .../autoplay/client/utils/AutoplayHelper.java | 6 +- .../settingtypes/SecuredDistanceSetting.java | 10 +- .../settingtypes/SecuredDurationSetting.java | 10 +- .../shared/racemap/CombinedWindPanel.java | 13 +- .../gwt/ui/client/shared/racemap/RaceMap.java | 25 +- .../shared/racemap/RaceMapLifecycle.java | 6 +- .../shared/racemap/RaceMapSettings.java | 286 +++++++++++------- .../racemap/TrueNorthIndicatorPanel.java | 10 +- .../EmbeddedMapAndWindChartEntryPoint.java | 66 ++-- .../gwt/ui/raceboard/RaceBoardPanel.java | 4 +- .../gwt/ui/raceboard/StartAnalysisMode.java | 6 +- .../gwt/ui/raceboard/WinningLanesMode.java | 7 +- .../AbstractGenericSerializableSettings.java | 6 +- .../generic/base/AbstractValueSetting.java | 19 +- .../client/premium/PaywallResolverProxy.java | 18 ++ .../settings/AbstractSecuredValueSetting.java | 40 ++- .../settings/SecuredBooleanSetting.java | 12 +- .../settings/SecuredDecimalSetting.java | 10 +- .../settings/SecuredDoubleSetting.java | 10 +- .../premium/settings/SecuredEnumSetting.java | 10 +- .../settings/SecuredIntegerSetting.java | 10 +- .../premium/settings/SecuredLongSetting.java | 10 +- .../settings/SecuredStringSetting.java | 10 +- .../premium/settings/SecuredUUIDSetting.java | 10 +- wiki/howto/development/secured-settings.md | 25 ++ 27 files changed, 403 insertions(+), 260 deletions(-) create mode 100644 java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/PaywallResolverProxy.java create mode 100644 wiki/howto/development/secured-settings.md diff --git a/home.md b/home.md index 035732c5339..bb8e9ad7647 100644 --- a/home.md +++ b/home.md @@ -1,4 +1,4 @@ -# Welcome to the SAP Sailing Wiki +# Welcome to the SAP Sailing Wiki This is the Wiki where useful information regarding this project can be found. @@ -125,6 +125,7 @@ SAP is at the center of today’s technology revolution, developing innovations * [[Training of internal Wind Estimation models|wiki/howto/windestimation]] * [[Whitelabelling|wiki/howto/whitelabelling]] * [[Downloading and Archiving TracTrac Events|wiki/howto/downloading-and-archiving-tractrac-events]] +* [[Secured Settings|wiki/howto/development/secured-settings]] ### For Event Managers diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/widgets/startanalysis/card/StartAnalysisCard.java b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/widgets/startanalysis/card/StartAnalysisCard.java index b7c0c355a71..7eaf261ea0b 100644 --- a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/widgets/startanalysis/card/StartAnalysisCard.java +++ b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/widgets/startanalysis/card/StartAnalysisCard.java @@ -48,7 +48,6 @@ import com.sap.sse.gwt.client.player.Timer.PlayModes; import com.sap.sse.security.ui.client.UserService; import com.sap.sse.security.ui.client.premium.PaywallResolver; import com.sap.sse.security.ui.client.premium.PaywallResolverImpl; -import com.sap.sse.security.ui.client.premium.SecuredDTOProxy; import com.sap.sse.security.ui.client.subscription.SubscriptionServiceFactory; public class StartAnalysisCard extends Composite implements HasWidgets, StartAnalysisPageChangeListener { @@ -170,25 +169,19 @@ public class StartAnalysisCard extends Composite implements HasWidgets, StartAna zoomTypes.add(ZoomTypes.BUOYS); } final PaywallResolver paywallResolver = new PaywallResolverImpl(userService, subscriptionServiceFactory); - //TODO bug5774 fill dtoContext - final SecuredDTOProxy dtoContext = new SecuredDTOProxy(); + //TODO bug5774 fill dtoContext on setting objects final RaceMapZoomSettings raceMapZoomSettings = new RaceMapZoomSettings(zoomTypes, false); final AsyncActionsExecutor asyncActionsExecutor = new AsyncActionsExecutor(); final RaceMapSettings defaultRaceMapSettings = RaceMapSettings.readSettingsFromURL( /* defaultForShowMapControls */ true, /* defaultForShowCourseGeometry */ false, /* defaultForMapOrientationWindUp */ false, /* defaultForViewShowStreamlets */ false, /* defaultForViewShowStreamletColors */ false, /* defaultForViewShowSimulation */ false, - /* defaultForTailLengthInMilliseconds */ null, paywallResolver, dtoContext); - final RaceMapSettings raceMapSettings = new RaceMapSettings(raceMapZoomSettings, getHelpLineSettings(), - defaultRaceMapSettings.getTransparentHoverlines(), defaultRaceMapSettings.getHoverlineStrokeWeight(), - startAnalysisDTO.tailLenghtInMilliseconds, defaultRaceMapSettings.isWindUp(), - defaultRaceMapSettings.getBuoyZoneRadius(), defaultRaceMapSettings.isShowOnlySelectedCompetitors(), - defaultRaceMapSettings.isShowSelectedCompetitorsInfo(), defaultRaceMapSettings.isShowWindStreamletColors(), - defaultRaceMapSettings.isShowWindStreamletOverlay(), defaultRaceMapSettings.isShowSimulationOverlay(), - defaultRaceMapSettings.isShowMapControls(), defaultRaceMapSettings.getManeuverTypesToShow(), - defaultRaceMapSettings.isShowDouglasPeuckerPoints(), defaultRaceMapSettings.isShowEstimatedDuration(), - defaultRaceMapSettings.getStartCountDownFontSizeScaling(), defaultRaceMapSettings.isShowManeuverLossVisualization(), - defaultRaceMapSettings.isShowSatelliteLayer(), defaultRaceMapSettings.isShowWindLadder(), paywallResolver, dtoContext); + /* defaultForTailLengthInMilliseconds */ null, paywallResolver, null); + final RaceMapSettings raceMapSettings = new RaceMapSettings.RaceMapSettingsBuilder(defaultRaceMapSettings, null, paywallResolver) + .withTailLengthInMilliseconds(startAnalysisDTO.tailLenghtInMilliseconds) + .withHelpLinesSettings(getHelpLineSettings()) + .withZoomSettings(raceMapZoomSettings) + .build(); final RaceTimesInfoProvider raceTimesInfoProvider = new RaceTimesInfoProvider(sailingServiceAsync, asyncActionsExecutor, errorReporter, Collections.singletonList(startAnalysisDTO.regattaAndRaceIdentifier), 5000l /* requestInterval */); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/utils/AutoplayHelper.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/utils/AutoplayHelper.java index 30a4fc8b33e..af7caffcbda 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/utils/AutoplayHelper.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/utils/AutoplayHelper.java @@ -48,7 +48,6 @@ import com.sap.sse.security.shared.dto.SecuredDTO; import com.sap.sse.security.ui.client.UserService; import com.sap.sse.security.ui.client.premium.PaywallResolver; import com.sap.sse.security.ui.client.premium.PaywallResolverImpl; -import com.sap.sse.security.ui.client.premium.SecuredDTOProxy; import com.sap.sse.security.ui.client.subscription.SubscriptionServiceFactory; public class AutoplayHelper { @@ -292,17 +291,16 @@ public class AutoplayHelper { typesToConsiderOnZoom.add(ZoomTypes.BOATS); RaceMapZoomSettings autoFollowRace = new RaceMapZoomSettings(typesToConsiderOnZoom, true); final PaywallResolver paywallResolver = new PaywallResolverImpl(userService, subscriptionServiceFactory); - final SecuredDTOProxy dtoContext = new SecuredDTOProxy(); RaceMapSettings settings = new RaceMapSettings(autoFollowRace, new RaceMapHelpLinesSettings(), false, 15, 100000l, false, RaceMapSettings.DEFAULT_BUOY_ZONE_RADIUS, false, true, false, false, false, false, RaceMapSettings.getDefaultManeuvers(), false, false, /* startCountDownFontSizeScaling */ 1.5, /* showManeuverLossVisualization */ false, /* showSatelliteLayer */ false, /* showWindLadder */ false, - paywallResolver, dtoContext); + paywallResolver, null); userService.createEssentialSecuredDTOByIdAndType(currentLiveRace.getPermissionType(), currentLiveRace.getName(), currentLiveRace.getTypeRelativeObjectIdentifier(), new AsyncCallback() { @Override public void onSuccess(SecuredDTO raceDtoProxy) { - dtoContext.setSecuredDTO(raceDtoProxy); + settings.setSecuredDTO(raceDtoProxy); RaceMapLifecycle raceMapLifecycle = new RaceMapLifecycle(StringMessages.INSTANCE, paywallResolver, raceDtoProxy); final CompetitorColorProvider colorProvider = new CompetitorColorProviderImpl(currentLiveRace, diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/settings/client/settingtypes/SecuredDistanceSetting.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/settings/client/settingtypes/SecuredDistanceSetting.java index 854e0b1132f..c255f5e6809 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/settings/client/settingtypes/SecuredDistanceSetting.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/settings/client/settingtypes/SecuredDistanceSetting.java @@ -4,19 +4,19 @@ import com.sap.sailing.gwt.settings.client.settingtypes.converter.DistanceConver import com.sap.sse.common.Distance; import com.sap.sse.common.settings.generic.AbstractGenericSerializableSettings; import com.sap.sse.security.shared.HasPermissions.Action; -import com.sap.sse.security.ui.client.premium.PaywallResolver; +import com.sap.sse.security.ui.client.premium.PaywallResolverProxy; import com.sap.sse.security.ui.client.premium.SecuredDTOProxy; import com.sap.sse.security.ui.client.premium.settings.AbstractSecuredValueSetting; public class SecuredDistanceSetting extends AbstractSecuredValueSetting { public SecuredDistanceSetting(String name, AbstractGenericSerializableSettings settings, - PaywallResolver paywallResolver, Action action, SecuredDTOProxy dtoContext) { - this(name, settings, null, paywallResolver, action, dtoContext); + PaywallResolverProxy paywallResolverProxy, Action action, SecuredDTOProxy dtoContext) { + this(name, settings, null, paywallResolverProxy, action, dtoContext); } public SecuredDistanceSetting(String name, AbstractGenericSerializableSettings settings, Distance defaultValue, - PaywallResolver paywallResolver, Action action, SecuredDTOProxy dtoContext) { - super(name, settings, defaultValue, DistanceConverter.INSTANCE, paywallResolver, action, dtoContext); + PaywallResolverProxy paywallResolverProxy, Action action, SecuredDTOProxy dtoContext) { + super(name, settings, defaultValue, DistanceConverter.INSTANCE, paywallResolverProxy, action, dtoContext); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/settings/client/settingtypes/SecuredDurationSetting.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/settings/client/settingtypes/SecuredDurationSetting.java index 09290d19c93..f54a31a5850 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/settings/client/settingtypes/SecuredDurationSetting.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/settings/client/settingtypes/SecuredDurationSetting.java @@ -4,19 +4,19 @@ import com.sap.sailing.gwt.settings.client.settingtypes.converter.DurationConver import com.sap.sse.common.Duration; import com.sap.sse.common.settings.generic.AbstractGenericSerializableSettings; import com.sap.sse.security.shared.HasPermissions.Action; -import com.sap.sse.security.ui.client.premium.PaywallResolver; +import com.sap.sse.security.ui.client.premium.PaywallResolverProxy; import com.sap.sse.security.ui.client.premium.SecuredDTOProxy; import com.sap.sse.security.ui.client.premium.settings.AbstractSecuredValueSetting; public class SecuredDurationSetting extends AbstractSecuredValueSetting { public SecuredDurationSetting(String name, AbstractGenericSerializableSettings settings, - PaywallResolver paywallResolver, Action action, SecuredDTOProxy dtoContext) { - this(name, settings, null, paywallResolver, action, dtoContext); + PaywallResolverProxy paywallResolverProxy, Action action, SecuredDTOProxy dtoContext) { + this(name, settings, null, paywallResolverProxy, action, dtoContext); } public SecuredDurationSetting(String name, AbstractGenericSerializableSettings settings, Duration defaultValue, - PaywallResolver paywallResolver, Action action, SecuredDTOProxy dtoContext) { - super(name, settings, defaultValue, DurationConverter.INSTANCE, paywallResolver, action, dtoContext); + PaywallResolverProxy paywallResolverProxy, Action action, SecuredDTOProxy dtoContext) { + super(name, settings, defaultValue, DurationConverter.INSTANCE, paywallResolverProxy, action, dtoContext); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/CombinedWindPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/CombinedWindPanel.java index b0e786839b3..5acff604cda 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/CombinedWindPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/CombinedWindPanel.java @@ -76,14 +76,14 @@ public class CombinedWindPanel extends FlowPanel { removeStyleName(raceMapStyle.premiumActive()); addStyleName(raceMapStyle.premiumReady()); } - updateSettings(map, hasPermission); + updateSettings(map, hasPermission, paywallResolver, raceDTO); } }); canvas.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { final boolean hasPermission = paywallResolver.hasPermission(SecuredDomainType.TrackedRaceActions.VIEWSTREAMLETS, raceDTO); - updateSettings(map, hasPermission); + updateSettings(map, hasPermission, paywallResolver, raceDTO); if(!hasPermission) { subscribeDialog.center(); subscribeDialog.show(); @@ -95,7 +95,7 @@ public class CombinedWindPanel extends FlowPanel { add(textLabel); } - private void updateSettings(final RaceMap map, boolean hasPermission) { + private void updateSettings(final RaceMap map, boolean hasPermission, PaywallResolver paywallResolver, SecuredDTO raceDTO) { final RaceMapSettings oldRaceMapSettings = map.getSettings(); // when off, turn on; when on and no color, turn on color; when on with color, turn off; Only clickable, if permissions granted final boolean newShowStreamletsOverlaySetting = (oldRaceMapSettings.isShowWindStreamletOverlay() ? @@ -103,9 +103,10 @@ public class CombinedWindPanel extends FlowPanel { final boolean newShowWindStreamletColors = (oldRaceMapSettings.isShowWindStreamletOverlay() ? !oldRaceMapSettings.isShowWindStreamletColors() : false) && hasPermission; - final RaceMapSettings newRaceMapSettings = new RaceMapSettings.RaceMapSettingsBuilder(oldRaceMapSettings) - .withShowWindStreamletOverlay(newShowStreamletsOverlaySetting) - .withShowWindStreamletColors(newShowWindStreamletColors).build(); + final RaceMapSettings newRaceMapSettings = new RaceMapSettings.RaceMapSettingsBuilder(oldRaceMapSettings, + raceDTO, paywallResolver) + .withShowWindStreamletOverlay(newShowStreamletsOverlaySetting) + .withShowWindStreamletColors(newShowWindStreamletColors).build(); if (map.getComponentContext() != null && map.getComponentContext().isStorageSupported(map)) { map.getComponentContext().storeSettingsForContext(map, newRaceMapSettings, 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 0c19c68fc47..bb86c1e033b 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 @@ -696,14 +696,14 @@ public class RaceMap extends AbstractCompositeComponent impleme lastTimeChangeBeforeInitialization = null; isMapInitialized = false; mapInitializedListener = new ArrayList<>(); - this.hasPolar = false; + hasPolar = false; headerPanel = new FlowPanel(); headerPanel.setStyleName("RaceMap-HeaderPanel"); raceMapStyle = raceMapResources.raceMapStyle(); raceMapStyle.ensureInjected(); combinedWindPanel = new CombinedWindPanel(this, raceMapImageManager, raceMapStyle, stringMessages, coordinateSystem, paywallResolver, raceMapLifecycle.getRaceDTO()); combinedWindPanel.setVisible(false); - trueNorthIndicatorPanel = new TrueNorthIndicatorPanel(this, raceMapImageManager, raceMapStyle, stringMessages, coordinateSystem); + trueNorthIndicatorPanel = new TrueNorthIndicatorPanel(this, raceMapImageManager, raceMapStyle, stringMessages, coordinateSystem, raceMapLifecycle.getRaceDTO(), paywallResolver); trueNorthIndicatorPanel.setVisible(false); topLeftControlsWrapperPanel = new FlowPanel(); topLeftControlsWrapperPanel.addStyleName(raceMapStyle.topLeftControlsWrapperPanel()); @@ -712,7 +712,7 @@ public class RaceMap extends AbstractCompositeComponent impleme orientationChangeInProgress = false; mapFirstZoomDone = false; addVideoToRaceButton = createAddVideoToRaceButton(); - this.trueNorthIndicatorButtonButtonGroup = createTrueNorthIndicatorButton(); + trueNorthIndicatorButtonButtonGroup = createTrueNorthIndicatorButton(); // TODO bug 494: reset zoom settings to user preferences initWidget(rootPanel); initializeData(settings.isShowMapControls(), showHeaderPanel); @@ -863,7 +863,10 @@ public class RaceMap extends AbstractCompositeComponent impleme final List emptyList = Collections.emptyList(); RaceMapZoomSettings clearedZoomSettings = new RaceMapZoomSettings(emptyList, settings.getZoomSettings().isZoomToSelectedCompetitors()); - settings = new RaceMapSettings.RaceMapSettingsBuilder(settings).withZoomSettings(clearedZoomSettings).build(); + settings = new RaceMapSettings + .RaceMapSettingsBuilder(settings, raceMapLifecycle.getRaceDTO(), paywallResolver) + .withZoomSettings(clearedZoomSettings) + .build(); simulationOverlay.setVisible(false); showLayoutsAfterAnimationFinishes(); } @@ -895,7 +898,9 @@ public class RaceMap extends AbstractCompositeComponent impleme final List emptyList = Collections.emptyList(); RaceMapZoomSettings clearedZoomSettings = new RaceMapZoomSettings(emptyList, settings.getZoomSettings().isZoomToSelectedCompetitors()); - settings = new RaceMapSettings.RaceMapSettingsBuilder(settings).withZoomSettings(clearedZoomSettings).build(); + settings = new RaceMapSettings + .RaceMapSettingsBuilder(settings, raceMapLifecycle.getRaceDTO(), paywallResolver) + .withZoomSettings(clearedZoomSettings).build(); refreshMapWithoutAnimation(); if (streamletOverlay != null && settings.isShowWindStreamletOverlay() @@ -984,7 +989,7 @@ public class RaceMap extends AbstractCompositeComponent impleme // initialize simulation canvas simulationOverlay = new RaceSimulationOverlay(getMap(), /* zIndex */ 0, raceIdentifier, sailingService, stringMessages, asyncActionsExecutor, coordinateSystem, - () -> updateSettings(new RaceMapSettings.RaceMapSettingsBuilder(settings) + () -> updateSettings(new RaceMapSettings.RaceMapSettingsBuilder(settings, raceMapLifecycle.getRaceDTO(), paywallResolver) .withShowSimulationOverlay(false).build())); simulationOverlay.addToMap(); showSimulationOverlay(settings.isShowSimulationOverlay() && paywallResolver @@ -1235,7 +1240,6 @@ public class RaceMap extends AbstractCompositeComponent impleme fullScreenButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { - GWT.log("Click fullscreen"); hideAdvancedFunctionsPopup(); FullscreenUtil.requestFullScreenToggle("googleMapsArea"); } @@ -2546,7 +2550,8 @@ public class RaceMap extends AbstractCompositeComponent impleme autoZoomLatLngBounds = newBounds; RaceMapZoomSettings restoredZoomSettings = new RaceMapZoomSettings(oldZoomTypesToConsiderSettings, settings.getZoomSettings().isZoomToSelectedCompetitors()); - settings = new RaceMapSettings.RaceMapSettingsBuilder(settings).withZoomSettings(restoredZoomSettings) + settings = new RaceMapSettings.RaceMapSettingsBuilder(settings, raceMapLifecycle.getRaceDTO(), paywallResolver) + .withZoomSettings(restoredZoomSettings) .build(); setAutoZoomInProgress(false); mapFirstZoomDone = true; @@ -3756,9 +3761,7 @@ public class RaceMap extends AbstractCompositeComponent impleme } public void addMediaPlayerManagerComponent(final MediaPlayerManagerComponent mediaPlayerManagerComponent) { - GWT.log("addMediaPlayerManagerComponent"); - this.addVideoToRaceButton.addClickHandler(clickEvent->{ - GWT.log("clicked addVideoToRaceButton"); + this.addVideoToRaceButton.addClickHandler(clickEvent -> { mediaPlayerManagerComponent.addMediaTrack(); }); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapLifecycle.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapLifecycle.java index e5e8e8eee9d..28aa7136e1b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapLifecycle.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapLifecycle.java @@ -25,6 +25,10 @@ public class RaceMapLifecycle implements ComponentLifecycle { public SecuredDTO getRaceDTO() { return raceDTO; } + + public PaywallResolver getPaywallResolver() { + return paywallResolver; + } @Override public RaceMapSettingsDialogComponent getSettingsDialogComponent(RaceMapSettings settings) { @@ -34,7 +38,7 @@ public class RaceMapLifecycle implements ComponentLifecycle { @Override public RaceMapSettings createDefaultSettings() { - return new RaceMapSettings(); + return new RaceMapSettings(paywallResolver, raceDTO); } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapSettings.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapSettings.java index 48d48b988a7..236dc09d083 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapSettings.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapSettings.java @@ -20,7 +20,9 @@ import com.sap.sse.common.settings.generic.EnumSetSetting; import com.sap.sse.common.settings.generic.IntegerSetting; import com.sap.sse.common.settings.generic.LongSetting; import com.sap.sse.gwt.shared.GwtHttpRequestUtils; +import com.sap.sse.security.shared.dto.SecuredDTO; import com.sap.sse.security.ui.client.premium.PaywallResolver; +import com.sap.sse.security.ui.client.premium.PaywallResolverProxy; import com.sap.sse.security.ui.client.premium.SecuredDTOProxy; import com.sap.sse.security.ui.client.premium.settings.SecuredBooleanSetting; @@ -55,37 +57,37 @@ public class RaceMapSettings extends AbstractGenericSerializableSettings { private static final long DEFAULT_TAIL_LENGTH_IN_MILLISECONDS = Duration.ONE_SECOND.times(100l).asMillis(); - private BooleanSetting showSatelliteLayer; + private BooleanSetting showSatelliteLayerSetting; - private BooleanSetting showDouglasPeuckerPoints; + private BooleanSetting showDouglasPeuckerPointsSetting; - private EnumSetSetting maneuverTypesToShow; + private EnumSetSetting maneuverTypesToShowSetting; - private BooleanSetting showOnlySelectedCompetitors; + private BooleanSetting showOnlySelectedCompetitorsSetting; private RaceMapZoomSettings zoomSettings; private RaceMapHelpLinesSettings helpLinesSettings; - private BooleanSetting transparentHoverlines; + private BooleanSetting transparentHoverlinesSetting; - private IntegerSetting hoverlineStrokeWeight; + private IntegerSetting hoverlineStrokeWeightSetting; - private LongSetting tailLengthInMilliseconds; + private LongSetting tailLengthInMillisecondsSetting; - private DistanceSetting buoyZoneRadius; + private DistanceSetting buoyZoneRadiusSetting; - private BooleanSetting showSelectedCompetitorsInfo; + private BooleanSetting showSelectedCompetitorsInfoSetting; - private SecuredBooleanSetting showWindStreamletColors; + private SecuredBooleanSetting showWindStreamletColorsSetting; - private SecuredBooleanSetting showWindStreamletOverlay; + private SecuredBooleanSetting showWindStreamletOverlaySetting; - private BooleanSetting showSimulationOverlay; + private BooleanSetting showSimulationOverlaySetting; - private BooleanSetting showMapControls; + private BooleanSetting showMapControlsSetting; - private BooleanSetting showManeuverLossVisualization; + private BooleanSetting showManeuverLossVisualizationSetting; /** * If true, all map contents will be transformed to a water-only environment, rotating all directions / @@ -95,47 +97,51 @@ public class RaceMapSettings extends AbstractGenericSerializableSettings { * positions to any other coordinate space that is translated and rotated compared to the original * coordinate space. */ - private BooleanSetting windUp; + private BooleanSetting windUpSetting; - private BooleanSetting showEstimatedDuration; + private BooleanSetting showEstimatedDurationSetting; - private BooleanSetting showWindLadder; + private BooleanSetting showWindLadderSetting; /** * The factor by which the start count down shown at one side of the start line shall be scaled compared to the * other small info overlays such as the course geometry. Defaults to 1.0. */ - private DoubleSetting startCountDownFontSizeScaling; + private DoubleSetting startCountDownFontSizeScalingSetting; - private SecuredDTOProxy securedDTO; + private SecuredDTOProxy securedDTOProxy; + + private PaywallResolverProxy paywallResolverProxy; - private PaywallResolver paywallResolver; - @Override protected void addChildSettings() { - showSatelliteLayer = new BooleanSetting(PARAM_SHOW_SATELLITE_LAYER, this, false); - showMapControls = new BooleanSetting(PARAM_SHOW_MAPCONTROLS, this, true); + // The addCildSettings is called in AbstractGenericSerializableSettings constructor. + // This lazy initialization is needed, because it's not possible in GWT context to initialize the field before. + lazySettingOfPaywallresolverAndSecuredDTO(null, null); + showSatelliteLayerSetting = new BooleanSetting(PARAM_SHOW_SATELLITE_LAYER, this, false); + showMapControlsSetting = new BooleanSetting(PARAM_SHOW_MAPCONTROLS, this, true); helpLinesSettings = new RaceMapHelpLinesSettings(HELP_LINES_SETTINGS, this); - windUp = new BooleanSetting(PARAM_MAP_ORIENTATION_WIND_UP, this, false); - buoyZoneRadius = new DistanceSetting(PARAM_BUOY_ZONE_RADIUS_IN_METERS, this, DEFAULT_BUOY_ZONE_RADIUS); - showWindStreamletOverlay = new SecuredBooleanSetting(PARAM_VIEW_SHOW_STREAMLETS, this, false, paywallResolver, TrackedRaceActions.VIEWSTREAMLETS, getSecuredDTO()); - showWindStreamletColors = new SecuredBooleanSetting(PARAM_VIEW_SHOW_STREAMLET_COLORS, this, false, paywallResolver, TrackedRaceActions.VIEWSTREAMLETS, getSecuredDTO()); - showSimulationOverlay = new BooleanSetting(PARAM_VIEW_SHOW_SIMULATION, this, false); - showWindLadder = new BooleanSetting(PARAM_SHOW_WIND_LADDER, this, false); + windUpSetting = new BooleanSetting(PARAM_MAP_ORIENTATION_WIND_UP, this, false); + buoyZoneRadiusSetting = new DistanceSetting(PARAM_BUOY_ZONE_RADIUS_IN_METERS, this, DEFAULT_BUOY_ZONE_RADIUS); + showWindStreamletOverlaySetting = new SecuredBooleanSetting(PARAM_VIEW_SHOW_STREAMLETS, this, false, paywallResolverProxy, TrackedRaceActions.VIEWSTREAMLETS, securedDTOProxy); + showWindStreamletColorsSetting = new SecuredBooleanSetting(PARAM_VIEW_SHOW_STREAMLET_COLORS, this, false, paywallResolverProxy, TrackedRaceActions.VIEWSTREAMLETS, securedDTOProxy); + showSimulationOverlaySetting = new BooleanSetting(PARAM_VIEW_SHOW_SIMULATION, this, false); + showWindLadderSetting = new BooleanSetting(PARAM_SHOW_WIND_LADDER, this, false); zoomSettings = new RaceMapZoomSettings(ZOOM_SETTINGS, this); - transparentHoverlines = new BooleanSetting(TRANSPARENT_HOVERLINES, this, false); - hoverlineStrokeWeight = new IntegerSetting(HOVERLINE_STROKE_WEIGHT, this, 15); - tailLengthInMilliseconds = new LongSetting(TAIL_LENGTH_IN_MILLISECONDS, this, DEFAULT_TAIL_LENGTH_IN_MILLISECONDS); - showOnlySelectedCompetitors = new BooleanSetting(SHOW_ONLY_SELECTED_COMPETITORS, this, false); - showSelectedCompetitorsInfo = new BooleanSetting(SHOW_SELECTED_COMPETITORS_INFO, this, true); - maneuverTypesToShow = new EnumSetSetting<>(MANEUVER_TYPES_TO_SHOW, this, getDefaultManeuvers(), ManeuverType::valueOf); - showDouglasPeuckerPoints = new BooleanSetting(SHOW_DOUGLAS_PEUCKER_POINTS, this, false); - showEstimatedDuration = new BooleanSetting(SHOW_ESTIMATED_DURATION, this, false); - startCountDownFontSizeScaling = new DoubleSetting(START_COUNT_DOWN_FONT_SIZE_SCALING, this, 1.0); - showManeuverLossVisualization = new BooleanSetting(SHOW_MANEUVER_LOSS_VISUALIZATION, this, false); + transparentHoverlinesSetting = new BooleanSetting(TRANSPARENT_HOVERLINES, this, false); + hoverlineStrokeWeightSetting = new IntegerSetting(HOVERLINE_STROKE_WEIGHT, this, 15); + tailLengthInMillisecondsSetting = new LongSetting(TAIL_LENGTH_IN_MILLISECONDS, this, DEFAULT_TAIL_LENGTH_IN_MILLISECONDS); + showOnlySelectedCompetitorsSetting = new BooleanSetting(SHOW_ONLY_SELECTED_COMPETITORS, this, false); + showSelectedCompetitorsInfoSetting = new BooleanSetting(SHOW_SELECTED_COMPETITORS_INFO, this, true); + maneuverTypesToShowSetting = new EnumSetSetting<>(MANEUVER_TYPES_TO_SHOW, this, getDefaultManeuvers(), ManeuverType::valueOf); + showDouglasPeuckerPointsSetting = new BooleanSetting(SHOW_DOUGLAS_PEUCKER_POINTS, this, false); + showEstimatedDurationSetting = new BooleanSetting(SHOW_ESTIMATED_DURATION, this, false); + startCountDownFontSizeScalingSetting = new DoubleSetting(START_COUNT_DOWN_FONT_SIZE_SCALING, this, 1.0); + showManeuverLossVisualizationSetting = new BooleanSetting(SHOW_MANEUVER_LOSS_VISUALIZATION, this, false); } - - public RaceMapSettings() { + + public RaceMapSettings(PaywallResolver paywallResolver, SecuredDTO securedDTO) { + lazySettingOfPaywallresolverAndSecuredDTO(paywallResolver, securedDTO); } public RaceMapSettings(RaceMapZoomSettings zoomSettings, RaceMapHelpLinesSettings helpLinesSettings, @@ -144,34 +150,52 @@ public class RaceMapSettings extends AbstractGenericSerializableSettings { Boolean showWindStreamletColors, Boolean showWindStreamletOverlay, Boolean showSimulationOverlay, Boolean showMapControls, Collection maneuverTypesToShow, Boolean showDouglasPeuckerPoints, Boolean showEstimatedDuration, Double startCountDownFontSizeScaling, Boolean showManeuverLossVisualization, - Boolean showSatelliteLayer, Boolean showWindLadder, PaywallResolver paywallResolver, SecuredDTOProxy securedDTO) { + Boolean showSatelliteLayer, Boolean showWindLadder, PaywallResolver paywallResolver, SecuredDTO securedDTO) { + lazySettingOfPaywallresolverAndSecuredDTO(paywallResolver, securedDTO); this.zoomSettings.init(zoomSettings); this.helpLinesSettings.init(helpLinesSettings); - this.transparentHoverlines.setValue(transparentHoverlines); - this.hoverlineStrokeWeight.setValue(hoverlineStrokeWeight); - this.tailLengthInMilliseconds.setValue(tailLengthInMilliseconds); - this.windUp.setValue(windUp); - this.buoyZoneRadius.setValue(buoyZoneRadius); - this.showOnlySelectedCompetitors.setValue(showOnlySelectedCompetitors); - this.showSelectedCompetitorsInfo.setValue(showSelectedCompetitorsInfo); - this.showWindStreamletColors.setValue(showWindStreamletColors); - this.showWindStreamletOverlay.setValue(showWindStreamletOverlay); - this.showSimulationOverlay.setValue(showSimulationOverlay); - this.showMapControls.setValue(showMapControls); - this.maneuverTypesToShow.setValues(maneuverTypesToShow); - this.showDouglasPeuckerPoints.setValue(showDouglasPeuckerPoints); - this.showEstimatedDuration.setValue(showEstimatedDuration); - this.startCountDownFontSizeScaling.setValue(startCountDownFontSizeScaling); - this.showManeuverLossVisualization.setValue(showManeuverLossVisualization); - this.showSatelliteLayer.setValue(showSatelliteLayer); - this.showWindLadder.setValue(showWindLadder); - this.paywallResolver = paywallResolver; - this.securedDTO = securedDTO; + this.transparentHoverlinesSetting.setValue(transparentHoverlines); + this.hoverlineStrokeWeightSetting.setValue(hoverlineStrokeWeight); + this.tailLengthInMillisecondsSetting.setValue(tailLengthInMilliseconds); + this.windUpSetting.setValue(windUp); + this.buoyZoneRadiusSetting.setValue(buoyZoneRadius); + this.showOnlySelectedCompetitorsSetting.setValue(showOnlySelectedCompetitors); + this.showSelectedCompetitorsInfoSetting.setValue(showSelectedCompetitorsInfo); + this.showWindStreamletColorsSetting.setValue(showWindStreamletColors); + this.showWindStreamletOverlaySetting.setValue(showWindStreamletOverlay); + this.showSimulationOverlaySetting.setValue(showSimulationOverlay); + this.showMapControlsSetting.setValue(showMapControls); + this.maneuverTypesToShowSetting.setValues(maneuverTypesToShow); + this.showDouglasPeuckerPointsSetting.setValue(showDouglasPeuckerPoints); + this.showEstimatedDurationSetting.setValue(showEstimatedDuration); + this.startCountDownFontSizeScalingSetting.setValue(startCountDownFontSizeScaling); + this.showManeuverLossVisualizationSetting.setValue(showManeuverLossVisualization); + this.showSatelliteLayerSetting.setValue(showSatelliteLayer); + this.showWindLadderSetting.setValue(showWindLadder); } - + + /** + * Set the paywall resolver and secured DTO to it's proxy holder. Proxy objects will be created if they are not + * already initialized. + */ + private void lazySettingOfPaywallresolverAndSecuredDTO(PaywallResolver paywallResolver, SecuredDTO securedDTO) { + setPaywallResolver(paywallResolver); + setSecuredDTO(securedDTO); + } + + /** + * Return an empty {@link RaceMapSettings}, but set the showMapControlls already. The {@link PaywallResolver} and + * {@link SecuredDTO} are initializes with NULL. Before using the settings the values has to be set with + * {@link RaceMapSettings#setPaywallResolver(PaywallResolver)} and + * {@link RaceMapSettings#setSecuredDTO(SecuredDTO)}. + * + * @param showMapControlls + * initial value for showMapControlls of the settings object. + * @return empty default setting with showMapControlls already set. + */ public static RaceMapSettings getDefaultWithShowMapControls(boolean showMapControlls) { - RaceMapSettings raceMapSetting = new RaceMapSettings(); - raceMapSetting.showMapControls.setValue(showMapControlls); + RaceMapSettings raceMapSetting = new RaceMapSettings(null, null); + raceMapSetting.showMapControlsSetting.setValue(showMapControlls); return raceMapSetting; } @@ -198,31 +222,31 @@ public class RaceMapSettings extends AbstractGenericSerializableSettings { * {@link #isShowTails()} is true. */ public long getTailLengthInMilliseconds() { - return tailLengthInMilliseconds.getValue(); + return tailLengthInMillisecondsSetting.getValue(); } public boolean isShowDouglasPeuckerPoints() { - return showDouglasPeuckerPoints.getValue(); + return showDouglasPeuckerPointsSetting.getValue(); } public boolean isShowWindStreamletOverlay() { - return showWindStreamletOverlay.getValue(); + return showWindStreamletOverlaySetting.getValue(); } public boolean isShowWindStreamletColors() { - return showWindStreamletColors.getValue(); + return showWindStreamletColorsSetting.getValue(); } public boolean isShowSimulationOverlay() { - return showSimulationOverlay.getValue(); + return showSimulationOverlaySetting.getValue(); } public boolean isShowManeuverType(ManeuverType maneuverType) { - return Util.contains(maneuverTypesToShow.getValues(), maneuverType); + return Util.contains(maneuverTypesToShowSetting.getValues(), maneuverType); } public boolean isShowOnlySelectedCompetitors() { - return showOnlySelectedCompetitors.getValue(); + return showOnlySelectedCompetitorsSetting.getValue(); } public RaceMapZoomSettings getZoomSettings() { @@ -234,47 +258,55 @@ public class RaceMapSettings extends AbstractGenericSerializableSettings { } public boolean getTransparentHoverlines() { - return this.transparentHoverlines.getValue(); + return transparentHoverlinesSetting.getValue(); } public int getHoverlineStrokeWeight() { - return this.hoverlineStrokeWeight.getValue(); + return hoverlineStrokeWeightSetting.getValue(); } public boolean isShowSelectedCompetitorsInfo() { - return showSelectedCompetitorsInfo.getValue(); + return showSelectedCompetitorsInfoSetting.getValue(); } public Distance getBuoyZoneRadius() { - return buoyZoneRadius.getValue(); + return buoyZoneRadiusSetting.getValue(); } public boolean isBuoyZoneRadiusDefaultValue() { - return buoyZoneRadius.isDefaultValue(); + return buoyZoneRadiusSetting.isDefaultValue(); } public double getStartCountDownFontSizeScaling() { - return startCountDownFontSizeScaling.getValue(); + return startCountDownFontSizeScalingSetting.getValue(); } public boolean isShowManeuverLossVisualization() { - return showManeuverLossVisualization.getValue(); + return showManeuverLossVisualizationSetting.getValue(); } public boolean isWindUp() { - return windUp.getValue(); + return windUpSetting.getValue(); } public boolean isShowMapControls() { - return showMapControls.getValue(); + return showMapControlsSetting.getValue(); } public boolean isShowSatelliteLayer() { - return showSatelliteLayer.getValue(); + return showSatelliteLayerSetting.getValue(); } public boolean isShowWindLadder() { - return showWindLadder.getValue(); + return showWindLadderSetting.getValue(); + } + + public Set getManeuverTypesToShow() { + return Util.asSet(maneuverTypesToShowSetting.getValues()); + } + + public boolean isShowEstimatedDuration() { + return showEstimatedDurationSetting.getValue(); } public static HashSet getDefaultManeuvers() { @@ -288,7 +320,7 @@ public class RaceMapSettings extends AbstractGenericSerializableSettings { public static RaceMapSettings readSettingsFromURL(boolean defaultForShowMapControls, boolean defaultForShowCourseGeometry, boolean defaultForMapOrientationWindUp, boolean defaultForViewShowStreamlets, boolean defaultForViewShowStreamletColors, - boolean defaultForViewShowSimulation, Long defaultForTailLengthInMilliseconds, PaywallResolver paywallResolver, SecuredDTOProxy securedDTO) { + boolean defaultForViewShowSimulation, Long defaultForTailLengthInMilliseconds, PaywallResolver paywallResolver, SecuredDTO securedDTO) { final boolean showSatelliteLayer = GwtHttpRequestUtils.getBooleanParameter(PARAM_SHOW_SATELLITE_LAYER, false /* default */); final boolean showMapControls = GwtHttpRequestUtils.getBooleanParameter(PARAM_SHOW_MAPCONTROLS, defaultForShowMapControls /* default */); final boolean showCourseGeometry = GwtHttpRequestUtils.getBooleanParameter(PARAM_SHOW_COURSE_GEOMETRY, defaultForShowCourseGeometry /* default */); @@ -301,30 +333,55 @@ public class RaceMapSettings extends AbstractGenericSerializableSettings { final double buoyZoneRadiusInMeters = GwtHttpRequestUtils.getDoubleParameter(PARAM_BUOY_ZONE_RADIUS_IN_METERS, DEFAULT_BUOY_ZONE_RADIUS.getMeters() /* default */); final MeterDistance meterDistance = new MeterDistance(buoyZoneRadiusInMeters); - return new RaceMapSettingsBuilder().withShowSatelliteLayer(showSatelliteLayer).withShowMapControls(showMapControls) - .withHelpLinesSettings(raceMapHelpLinesSettings).withWindUp(windUp).withBuoyZoneRadius(meterDistance) + return new RaceMapSettingsBuilder(securedDTO, paywallResolver) + .withShowSatelliteLayer(showSatelliteLayer) + .withShowMapControls(showMapControls) + .withHelpLinesSettings(raceMapHelpLinesSettings) + .withWindUp(windUp) + .withBuoyZoneRadius(meterDistance) .withShowWindStreamletOverlay(showWindStreamletOverlay) - .withShowWindStreamletColors(showWindStreamletColors).withShowSimulationOverlay(showSimulationOverlay) - .withTailLengthInMilliseconds(tailLengthInMilliseconds).withPaywallResolver(paywallResolver) - .withSecuredDTO(securedDTO).build(); - } - - public Set getManeuverTypesToShow() { - return Util.asSet(maneuverTypesToShow.getValues()); - } - - public boolean isShowEstimatedDuration() { - return showEstimatedDuration.getValue(); + .withShowWindStreamletColors(showWindStreamletColors) + .withShowSimulationOverlay(showSimulationOverlay) + .withTailLengthInMilliseconds(tailLengthInMilliseconds) + .build(); } protected PaywallResolver getPaywallResolver() { - return this.paywallResolver; + final PaywallResolver paywallResolver; + if (paywallResolverProxy == null) { + paywallResolver = null; + } else { + paywallResolver = paywallResolverProxy.getPaywallResolver(); + } + return paywallResolver; } - - protected SecuredDTOProxy getSecuredDTO() { + + public void setPaywallResolver(PaywallResolver paywallResolver) { + if (paywallResolverProxy == null) { + paywallResolverProxy = new PaywallResolverProxy(paywallResolver); + } else { + paywallResolverProxy.setPaywallResolver(paywallResolver); + } + } + + protected SecuredDTO getSecuredDTO() { + final SecuredDTO securedDTO; + if (securedDTOProxy == null) { + securedDTO = null; + } else { + securedDTO = securedDTOProxy.getSecuredDTO(); + } return securedDTO; } - + + public void setSecuredDTO(SecuredDTO securedDTO) { + if (securedDTOProxy == null) { + securedDTOProxy = new SecuredDTOProxy(securedDTO); + } else { + securedDTOProxy.setSecuredDTO(securedDTO); + } + } + public static class RaceMapSettingsBuilder { private Boolean showSatelliteLayer; private Boolean showDouglasPeuckerPoints; @@ -346,17 +403,28 @@ public class RaceMapSettings extends AbstractGenericSerializableSettings { private Boolean showEstimatedDuration; private Boolean showWindLadder; private Double startCountDownFontSizeScaling; - private SecuredDTOProxy securedDTO; + private SecuredDTO securedDTO; private PaywallResolver paywallResolver; - - public RaceMapSettingsBuilder() { + + public RaceMapSettingsBuilder(SecuredDTO securedDTO, PaywallResolver paywallResolver) { + this.securedDTO = securedDTO; + this.paywallResolver = paywallResolver; } - - public RaceMapSettingsBuilder(RaceMapSettings settings) { + + public RaceMapSettingsBuilder(RaceMapSettings settings, SecuredDTO securedDTO, PaywallResolver paywallResolver) { + this(securedDTO, paywallResolver); copyValues(settings); } - + private void copyValues(RaceMapSettings settings) { + // if the paywall resolver and secured DTO are not set already in the origin settings, we have to set them now + // to the origin object as well, because we will need them in the copy process later, when we call the getter. + if (settings.getPaywallResolver() == null) { + settings.setPaywallResolver(paywallResolver); + } + if (settings.getSecuredDTO() != null && settings.getSecuredDTO() == null) { + settings.setSecuredDTO(securedDTO); + } this.showSatelliteLayer = settings.isShowSatelliteLayer(); this.showDouglasPeuckerPoints = settings.isShowDouglasPeuckerPoints(); this.maneuverTypesToShow = settings.getManeuverTypesToShow(); @@ -377,8 +445,6 @@ public class RaceMapSettings extends AbstractGenericSerializableSettings { this.showEstimatedDuration = settings.isShowEstimatedDuration(); this.showWindLadder = settings.isShowWindLadder(); this.startCountDownFontSizeScaling = settings.getStartCountDownFontSizeScaling(); - this.securedDTO = settings.getSecuredDTO(); - this.paywallResolver = settings.getPaywallResolver(); } public RaceMapSettings build() { @@ -500,7 +566,7 @@ public class RaceMapSettings extends AbstractGenericSerializableSettings { return this; } - public RaceMapSettingsBuilder withSecuredDTO(SecuredDTOProxy securedDTO) { + public RaceMapSettingsBuilder withSecuredDTO(SecuredDTO securedDTO) { this.securedDTO = securedDTO; return this; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/TrueNorthIndicatorPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/TrueNorthIndicatorPanel.java index 35405c3754d..43d985a5230 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/TrueNorthIndicatorPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/TrueNorthIndicatorPanel.java @@ -6,6 +6,8 @@ import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.ui.FlowPanel; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sse.gwt.client.shared.settings.DummyOnSettingsStoredCallback; +import com.sap.sse.security.shared.dto.SecuredDTO; +import com.sap.sse.security.ui.client.premium.PaywallResolver; /** * A true north indicator that can be added as a control to the map. Clicking / tapping the control toggles @@ -26,14 +28,18 @@ public class TrueNorthIndicatorPanel extends FlowPanel { private RaceMapStyle raceMapStyle; private final CoordinateSystem coordinateSystem; + private final SecuredDTO securedDTO; + private final PaywallResolver paywallResolver; public TrueNorthIndicatorPanel(final RaceMap map, RaceMapImageManager theRaceMapResources, RaceMapStyle raceMapStyle, - final StringMessages stringMessages, CoordinateSystem coordinateSystem) { + final StringMessages stringMessages, CoordinateSystem coordinateSystem, SecuredDTO securedDTO, PaywallResolver paywallResolver) { this.stringMessages = stringMessages; this.coordinateSystem = coordinateSystem; this.raceMapResources = theRaceMapResources; this.raceMapStyle = raceMapStyle; this.map = map; + this.securedDTO = securedDTO; + this.paywallResolver = paywallResolver; addStyleName(raceMapStyle.raceMapIndicatorPanel()); addStyleName(raceMapStyle.trueNorthIndicatorPanel()); transformer = raceMapResources.getTrueNorthIndicatorIconTransformer(); @@ -51,7 +57,7 @@ public class TrueNorthIndicatorPanel extends FlowPanel { public void toggle() { RaceMapSettings oldRaceMapSettings = map.getSettings(); boolean newWindUpSettings = !oldRaceMapSettings.isWindUp(); - final RaceMapSettings newRaceMapSettings = new RaceMapSettings.RaceMapSettingsBuilder() + final RaceMapSettings newRaceMapSettings = new RaceMapSettings.RaceMapSettingsBuilder(securedDTO, paywallResolver) .withWindUp(newWindUpSettings).build(); if (map.getComponentContext() != null && map.getComponentContext().isStorageSupported(map)) { map.getComponentContext().storeSettingsForContext(map, newRaceMapSettings, diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java index d0ac198627f..deb898e9143 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java @@ -72,7 +72,6 @@ import com.sap.sse.security.shared.dto.SecuredDTO; import com.sap.sse.security.ui.authentication.generic.sapheader.SAPHeaderWithAuthentication; import com.sap.sse.security.ui.client.premium.PaywallResolver; import com.sap.sse.security.ui.client.premium.PaywallResolverImpl; -import com.sap.sse.security.ui.client.premium.SecuredDTOProxy; public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingReadEntryPoint implements ProvidesLeaderboardRouting { @@ -86,8 +85,6 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingReadEntryP @Override protected void doOnModuleLoad() { final PaywallResolver paywallResolver = new PaywallResolverImpl(getUserService(), getSubscriptionServiceFactory()); - //TODO: bug5774 get securedDTO later with callback - final SecuredDTOProxy securedDTO = new SecuredDTOProxy(); super.doOnModuleLoad(); // read mandatory parameters contextDefinition = SERIALIZER.deserializeFromCurrentLocation(new EmbeddedMapAndWindChartContextDefinition()); @@ -105,7 +102,7 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingReadEntryP /* defaultForShowMapControls */ true, /* defaultForShowCourseGeometry */ true, /* defaultForMapOrientationWindUp */ true, /* defaultForViewShowStreamlets */ false, /* defaultForViewShowStreamletColors */ false, /* defaultForViewShowSimulation */ false, - /* defaultForTailLengthInMilliseconds */ 1l, paywallResolver, securedDTO); + /* defaultForTailLengthInMilliseconds */ 1l, paywallResolver, null); settings = SERIALIZER.deserializeFromCurrentLocation(new EmbeddedMapAndWindChartSettings()); RaceMapZoomSettings raceMapZoomSettings = new RaceMapZoomSettings(Arrays.asList(ZoomTypes.BUOYS), /* zoom to selection */ false); Set helpLineTypes = new HashSet<>(); @@ -114,49 +111,46 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingReadEntryP helpLineTypes.add(HelpLineTypes.COURSEGEOMETRY); } RaceMapHelpLinesSettings raceMapHelpLinesSettings = new RaceMapHelpLinesSettings(helpLineTypes); - final RaceMapSettings raceMapSettings = new RaceMapSettings(raceMapZoomSettings, raceMapHelpLinesSettings, - defaultRaceMapSettings.getTransparentHoverlines(), defaultRaceMapSettings.getHoverlineStrokeWeight(), - defaultRaceMapSettings.getTailLengthInMilliseconds(), settings.isWindUp(), - defaultRaceMapSettings.getBuoyZoneRadius(), defaultRaceMapSettings.isShowOnlySelectedCompetitors(), - defaultRaceMapSettings.isShowSelectedCompetitorsInfo(), defaultRaceMapSettings.isShowWindStreamletColors(), - defaultRaceMapSettings.isShowWindStreamletOverlay(), defaultRaceMapSettings.isShowSimulationOverlay(), - defaultRaceMapSettings.isShowMapControls(), defaultRaceMapSettings.getManeuverTypesToShow(), - defaultRaceMapSettings.isShowDouglasPeuckerPoints(), /* show estimated duration */ true, - defaultRaceMapSettings.getStartCountDownFontSizeScaling(), - defaultRaceMapSettings.isShowManeuverLossVisualization(), - defaultRaceMapSettings.isShowSatelliteLayer(), - defaultRaceMapSettings.isShowWindLadder(), - paywallResolver, - securedDTO); + final RaceMapSettings raceMapSettings = new RaceMapSettings.RaceMapSettingsBuilder(defaultRaceMapSettings, null, paywallResolver) + .withHelpLinesSettings(raceMapHelpLinesSettings) + .withZoomSettings(raceMapZoomSettings) + .withShowEstimatedDuration(true) + .withWindUp(settings.isWindUp()) + .build(); final String regattaLikeName = contextDefinition.getRegattaLikeName(); final String raceColumnName = contextDefinition.getRaceColumnName(); final String fleetName = contextDefinition.getFleetName(); getSailingService().getRaceIdentifierAndTrackedRaceSecuredDTO(regattaLikeName, raceColumnName, fleetName, new AsyncCallback>() { - @Override - public void onSuccess(final Pair selectedRaceIdentifierAndTrackedRaceSecuredDTO) { - final RegattaAndRaceIdentifier selectedRaceIdentifier = selectedRaceIdentifierAndTrackedRaceSecuredDTO.getA(); + @Override + public void onSuccess( + final Pair selectedRaceIdentifierAndTrackedRaceSecuredDTO) { + final RegattaAndRaceIdentifier selectedRaceIdentifier = selectedRaceIdentifierAndTrackedRaceSecuredDTO + .getA(); final SecuredDTO raceDTOProxy = selectedRaceIdentifierAndTrackedRaceSecuredDTO.getB(); + raceMapSettings.setSecuredDTO(raceDTOProxy); if (selectedRaceIdentifier == null) { createErrorPage(getStringMessages().couldNotObtainRace(regattaLikeName, raceColumnName, fleetName, /* technicalErrorMessage */ ""), paywallResolver); } else { - securedDTO.setSecuredDTO(raceDTOProxy); - getSailingService().getCompetitorBoats(selectedRaceIdentifier, new AsyncCallback>() { - @Override - public void onSuccess(Map competitorsAndTheirBoats) { - createEmbeddedMap(selectedRaceIdentifier, competitorsAndTheirBoats, raceboardPerspectiveSettings, raceMapSettings, raceDTOProxy); + getSailingService().getCompetitorBoats(selectedRaceIdentifier, + new AsyncCallback>() { + @Override + public void onSuccess(Map competitorsAndTheirBoats) { + createEmbeddedMap(selectedRaceIdentifier, competitorsAndTheirBoats, + raceboardPerspectiveSettings, raceMapSettings, raceDTOProxy); + } + + @Override + public void onFailure(Throwable caught) { + reportError(getStringMessages() + .errorTryingToCreateEmbeddedMap(caught.getMessage())); + } + }); } - - @Override - public void onFailure(Throwable caught) { - reportError(getStringMessages().errorTryingToCreateEmbeddedMap(caught.getMessage())); - } - }); - } - } - - @Override + } + + @Override public void onFailure(Throwable caught) { createErrorPage(getStringMessages().couldNotObtainRace(regattaLikeName, raceColumnName, fleetName, caught.getMessage()), paywallResolver); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java index e90ca15552c..2dfb2afe5e1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java @@ -360,7 +360,9 @@ public class RaceBoardPanel if (existingMapSettings.isBuoyZoneRadiusDefaultValue() && !Util.equalsWithNull(buoyZoneRadius, existingMapSettings.getBuoyZoneRadius())) { final RaceMapSettings newRaceMapSettings = new RaceMapSettings.RaceMapSettingsBuilder( - existingMapSettings).withBuoyZoneRadius(buoyZoneRadius).build(); + existingMapSettings, regattaDTO, paywallResolverRace) + .withBuoyZoneRadius(buoyZoneRadius) + .build(); raceMap.updateSettings(newRaceMapSettings); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/StartAnalysisMode.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/StartAnalysisMode.java index 26695ba7dd6..c9a18b6758f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/StartAnalysisMode.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/StartAnalysisMode.java @@ -65,7 +65,11 @@ public class StartAnalysisMode extends RaceBoardModeWithPerRaceCompetitors { final RaceMapSettings defaultSettings = raceMap.getLifecycle().createDefaultSettings(); RaceMapZoomSettings raceMapZoomSettings = new RaceMapZoomSettings(Collections.singleton(ZoomTypes.BOATS), /* zoomToSelected */ false); boolean isWindUp = true; - final RaceMapSettings additiveSettings = new RaceMapSettings.RaceMapSettingsBuilder(defaultSettings).withZoomSettings(raceMapZoomSettings).withWindUp(isWindUp).build(); + final RaceMapSettings additiveSettings = new RaceMapSettings + .RaceMapSettingsBuilder(defaultSettings, raceMap.getLifecycle().getRaceDTO(), raceMap.getLifecycle().getPaywallResolver()) + .withZoomSettings(raceMapZoomSettings) + .withWindUp(isWindUp) + .build(); ((RaceBoardComponentContext) raceMap.getComponentContext()).addModesPatching(raceMap, additiveSettings, new OnSettingsReloadedCallback() { @Override public void onSettingsReloaded(RaceMapSettings patchedSettings) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/WinningLanesMode.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/WinningLanesMode.java index 9405e131ad6..b8ba3ac7366 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/WinningLanesMode.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/WinningLanesMode.java @@ -59,9 +59,10 @@ public class WinningLanesMode extends RaceBoardModeWithPerRaceCompetitors { private void adjustMapSettings() { RaceMap raceMap = getRaceBoardPanel().getMap(); final RaceMapSettings defaultSettings = raceMap.getLifecycle().createDefaultSettings(); - final RaceMapSettings additiveSettings = new RaceMapSettings.RaceMapSettingsBuilder(defaultSettings) - .withTailLengthInMilliseconds(tailLength.asMillis()).withWindUp(true) - .withShowOnlySelectedCompetitors(true).build(); + final RaceMapSettings additiveSettings = new RaceMapSettings.RaceMapSettingsBuilder(defaultSettings, + raceMap.getLifecycle().getRaceDTO(), raceMap.getLifecycle().getPaywallResolver()) + .withTailLengthInMilliseconds(tailLength.asMillis()).withWindUp(true) + .withShowOnlySelectedCompetitors(true).build(); ((RaceBoardComponentContext) raceMap.getComponentContext()).addModesPatching(raceMap, additiveSettings, new OnSettingsReloadedCallback() { @Override public void onSettingsReloaded(RaceMapSettings patchedSettings) { diff --git a/java/com.sap.sse.common/src/com/sap/sse/common/settings/generic/AbstractGenericSerializableSettings.java b/java/com.sap.sse.common/src/com/sap/sse/common/settings/generic/AbstractGenericSerializableSettings.java index 3cc28e6fc3f..f462d2b59ff 100644 --- a/java/com.sap.sse.common/src/com/sap/sse/common/settings/generic/AbstractGenericSerializableSettings.java +++ b/java/com.sap.sse.common/src/com/sap/sse/common/settings/generic/AbstractGenericSerializableSettings.java @@ -140,13 +140,11 @@ public abstract class AbstractGenericSerializableSettings extends AbstractSettin * */ protected abstract void addChildSettings(); - - // TODO make protected + public Value getValue(String settingName) { return value.getValue(settingName); } - - // TODO make protected + public void setValue(String settingName, Value value) { this.value.setValue(settingName, value); } diff --git a/java/com.sap.sse.common/src/com/sap/sse/common/settings/generic/base/AbstractValueSetting.java b/java/com.sap.sse.common/src/com/sap/sse/common/settings/generic/base/AbstractValueSetting.java index bdeaa306ba9..b7a17d900b5 100644 --- a/java/com.sap.sse.common/src/com/sap/sse/common/settings/generic/base/AbstractValueSetting.java +++ b/java/com.sap.sse.common/src/com/sap/sse/common/settings/generic/base/AbstractValueSetting.java @@ -16,18 +16,26 @@ public abstract class AbstractValueSetting extends AbstractHasValueSetting resetToDefault(); } } - + @Override public T getValue() { + T result = null; Value value = settings.getValue(settingName); - if (value == null) { - return null; + if (value != null) { + result = getValueConverter().fromValue(value); } - return getValueConverter().fromValue(value); + if (result == null) { + result = defaultValue; + } + return result; } @Override public void setValue(T value) { + setValueWithoutPermittionCheck(value); + } + + private void setValueWithoutPermittionCheck(T value) { settings.setValue(settingName, getValueConverter().toValue(value)); } @@ -46,7 +54,8 @@ public abstract class AbstractValueSetting extends AbstractHasValueSetting @Override public void resetToDefault() { - this.setValue(defaultValue); + //setValue(defaultValue); + setValueWithoutPermittionCheck(defaultValue); } @Override diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/PaywallResolverProxy.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/PaywallResolverProxy.java new file mode 100644 index 00000000000..a37cfb9ae78 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/PaywallResolverProxy.java @@ -0,0 +1,18 @@ +package com.sap.sse.security.ui.client.premium; + +public class PaywallResolverProxy { + + public PaywallResolverProxy(PaywallResolver paywallResolver) { + this.paywallResolver = paywallResolver; + } + + PaywallResolver paywallResolver; + + public PaywallResolver getPaywallResolver() { + return paywallResolver; + } + + public void setPaywallResolver(PaywallResolver paywallResolver) { + this.paywallResolver = paywallResolver; + } +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/AbstractSecuredValueSetting.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/AbstractSecuredValueSetting.java index 56b5f9d237c..2506a686cfd 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/AbstractSecuredValueSetting.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/AbstractSecuredValueSetting.java @@ -1,30 +1,39 @@ package com.sap.sse.security.ui.client.premium.settings; +import com.google.gwt.core.client.GWT; import com.sap.sse.common.settings.generic.AbstractGenericSerializableSettings; import com.sap.sse.common.settings.generic.ValueConverter; import com.sap.sse.common.settings.generic.base.AbstractValueSetting; import com.sap.sse.security.shared.HasPermissions.Action; import com.sap.sse.security.ui.client.premium.PaywallResolver; +import com.sap.sse.security.ui.client.premium.PaywallResolverProxy; import com.sap.sse.security.ui.client.premium.SecuredDTOProxy; public abstract class AbstractSecuredValueSetting extends AbstractValueSetting { - private final PaywallResolver paywallResolver; + private final PaywallResolverProxy paywallResolverProxy; private final Action action; - private final SecuredDTOProxy dtoContext; + private final SecuredDTOProxy dtoContextProxy; protected AbstractSecuredValueSetting(String name, AbstractGenericSerializableSettings settings, T defaultValue, - ValueConverter valueConverter, PaywallResolver paywallResolver, Action action, - SecuredDTOProxy dtoContext) { + ValueConverter valueConverter, PaywallResolverProxy paywallResolverProxy, Action action, + SecuredDTOProxy dtoContextProxy) { super(name, settings, defaultValue, valueConverter); - this.paywallResolver = paywallResolver; + this.paywallResolverProxy = paywallResolverProxy; this.action = action; - this.dtoContext = dtoContext; + this.dtoContextProxy = dtoContextProxy; } @Override public T getValue() { - if (dtoContext != null && dtoContext.isPresent() && paywallResolver.hasPermission(action, dtoContext.getSecuredDTO())) { + if (paywallResolverProxy.getPaywallResolver() == null) { + GWT.log("getValue paywall resolver not available."); + } + if (dtoContextProxy.getSecuredDTO() == null) { + GWT.log("getValue securedDTO context not available!"); + } + if (dtoContextProxy != null && dtoContextProxy.isPresent() && paywallResolverProxy != null + && paywallResolverProxy.getPaywallResolver().hasPermission(action, dtoContextProxy.getSecuredDTO())) { return super.getValue(); } else { return super.getDefaultValue(); @@ -33,13 +42,24 @@ public abstract class AbstractSecuredValueSetting extends AbstractValueSettin @Override public void setValue(T value) { - if (dtoContext != null && dtoContext.isPresent() && paywallResolver.hasPermission(action, dtoContext.getSecuredDTO())) { + if (paywallResolverProxy.getPaywallResolver() == null) { + GWT.log("setValue Paywall resolver not available."); + } + if (dtoContextProxy == null) { + GWT.log("setValue DTOContext not set!"); + } + if (dtoContextProxy != null && dtoContextProxy.isPresent() && paywallResolverProxy.getPaywallResolver() != null + && paywallResolverProxy.getPaywallResolver().hasPermission(action, dtoContextProxy.getSecuredDTO())) { super.setValue(value); } } public PaywallResolver getPaywallResolver() { - return paywallResolver; + return paywallResolverProxy.getPaywallResolver(); + } + + public void setPaywallResolver(PaywallResolver paywallResolver) { + paywallResolverProxy.setPaywallResolver(paywallResolver); } public Action getAction() { @@ -47,6 +67,6 @@ public abstract class AbstractSecuredValueSetting extends AbstractValueSettin } public SecuredDTOProxy getDtoContext() { - return dtoContext; + return dtoContextProxy; } } diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredBooleanSetting.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredBooleanSetting.java index a77b93de482..7324d7ff7c6 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredBooleanSetting.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredBooleanSetting.java @@ -3,18 +3,18 @@ package com.sap.sse.security.ui.client.premium.settings; import com.sap.sse.common.settings.generic.AbstractGenericSerializableSettings; import com.sap.sse.common.settings.generic.converter.BooleanConverter; import com.sap.sse.security.shared.HasPermissions.Action; -import com.sap.sse.security.ui.client.premium.PaywallResolver; +import com.sap.sse.security.ui.client.premium.PaywallResolverProxy; import com.sap.sse.security.ui.client.premium.SecuredDTOProxy; public class SecuredBooleanSetting extends AbstractSecuredValueSetting { - public SecuredBooleanSetting(String name, AbstractGenericSerializableSettings settings, PaywallResolver paywallResolver, - Action action, SecuredDTOProxy dtoContext) { - this(name, settings, null, paywallResolver, action, dtoContext); + public SecuredBooleanSetting(String name, AbstractGenericSerializableSettings settings, + PaywallResolverProxy paywallResolverProxy, Action action, SecuredDTOProxy dtoContext) { + this(name, settings, null, paywallResolverProxy, action, dtoContext); } public SecuredBooleanSetting(String name, AbstractGenericSerializableSettings settings, Boolean defaultValue, - PaywallResolver paywallResolver, Action action, SecuredDTOProxy securedDTO) { - super(name, settings, defaultValue, BooleanConverter.INSTANCE, paywallResolver, action, securedDTO); + PaywallResolverProxy paywallResolverProxy, Action action, SecuredDTOProxy securedDTO) { + super(name, settings, defaultValue, BooleanConverter.INSTANCE, paywallResolverProxy, action, securedDTO); } } diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredDecimalSetting.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredDecimalSetting.java index ad6c1a068b5..e517762278e 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredDecimalSetting.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredDecimalSetting.java @@ -5,18 +5,18 @@ import java.math.BigDecimal; import com.sap.sse.common.settings.generic.AbstractGenericSerializableSettings; import com.sap.sse.common.settings.generic.converter.DecimalConverter; import com.sap.sse.security.shared.HasPermissions.Action; -import com.sap.sse.security.ui.client.premium.PaywallResolver; +import com.sap.sse.security.ui.client.premium.PaywallResolverProxy; import com.sap.sse.security.ui.client.premium.SecuredDTOProxy; public class SecuredDecimalSetting extends AbstractSecuredValueSetting { - public SecuredDecimalSetting(String name, AbstractGenericSerializableSettings settings, PaywallResolver paywallResolver, + public SecuredDecimalSetting(String name, AbstractGenericSerializableSettings settings, PaywallResolverProxy paywallResolverProxy, Action action, SecuredDTOProxy dtoContext) { - this(name, settings, null, paywallResolver, action, dtoContext); + this(name, settings, null, paywallResolverProxy, action, dtoContext); } public SecuredDecimalSetting(String name, AbstractGenericSerializableSettings settings, BigDecimal defaultValue, - PaywallResolver paywallResolver, Action action, SecuredDTOProxy dtoContext) { - super(name, settings, defaultValue, DecimalConverter.INSTANCE, paywallResolver, action, dtoContext); + PaywallResolverProxy paywallResolverProxy, Action action, SecuredDTOProxy dtoContext) { + super(name, settings, defaultValue, DecimalConverter.INSTANCE, paywallResolverProxy, action, dtoContext); } } diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredDoubleSetting.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredDoubleSetting.java index 49881e6265f..b9a82edc896 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredDoubleSetting.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredDoubleSetting.java @@ -3,18 +3,18 @@ package com.sap.sse.security.ui.client.premium.settings; import com.sap.sse.common.settings.generic.AbstractGenericSerializableSettings; import com.sap.sse.common.settings.generic.converter.DoubleConverter; import com.sap.sse.security.shared.HasPermissions.Action; -import com.sap.sse.security.ui.client.premium.PaywallResolver; +import com.sap.sse.security.ui.client.premium.PaywallResolverProxy; import com.sap.sse.security.ui.client.premium.SecuredDTOProxy; public class SecuredDoubleSetting extends AbstractSecuredValueSetting { public SecuredDoubleSetting(String name, AbstractGenericSerializableSettings settings, - PaywallResolver paywallResolver, Action action, SecuredDTOProxy dtoContext) { - this(name, settings, null, paywallResolver, action, dtoContext); + PaywallResolverProxy paywallResolverProxy, Action action, SecuredDTOProxy dtoContext) { + this(name, settings, null, paywallResolverProxy, action, dtoContext); } public SecuredDoubleSetting(String name, AbstractGenericSerializableSettings settings, Double defaultValue, - PaywallResolver paywallResolver, Action action, SecuredDTOProxy dtoContext) { - super(name, settings, defaultValue, DoubleConverter.INSTANCE, paywallResolver, action, dtoContext); + PaywallResolverProxy paywallResolverProxy, Action action, SecuredDTOProxy dtoContext) { + super(name, settings, defaultValue, DoubleConverter.INSTANCE, paywallResolverProxy, action, dtoContext); } } diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredEnumSetting.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredEnumSetting.java index 4cb0b79d127..92c034097c8 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredEnumSetting.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredEnumSetting.java @@ -4,21 +4,21 @@ import com.sap.sse.common.settings.generic.AbstractGenericSerializableSettings; import com.sap.sse.common.settings.generic.StringToEnumConverter; import com.sap.sse.common.settings.generic.converter.EnumConverter; import com.sap.sse.security.shared.HasPermissions.Action; -import com.sap.sse.security.ui.client.premium.PaywallResolver; +import com.sap.sse.security.ui.client.premium.PaywallResolverProxy; import com.sap.sse.security.ui.client.premium.SecuredDTOProxy; public class SecuredEnumSetting> extends AbstractSecuredValueSetting { public SecuredEnumSetting(String name, AbstractGenericSerializableSettings settings, - StringToEnumConverter stringToEnumConverter, PaywallResolver paywallResolver, Action action, + StringToEnumConverter stringToEnumConverter, PaywallResolverProxy paywallResolverProxy, Action action, SecuredDTOProxy dtoContext) { - this(name, settings, null, stringToEnumConverter, paywallResolver, action, dtoContext); + this(name, settings, null, stringToEnumConverter, paywallResolverProxy, action, dtoContext); } public SecuredEnumSetting(String name, AbstractGenericSerializableSettings settings, T defaultValue, - StringToEnumConverter stringToEnumConverter, PaywallResolver paywallResolver, Action action, + StringToEnumConverter stringToEnumConverter, PaywallResolverProxy paywallResolverProxy, Action action, SecuredDTOProxy dtoContext) { - super(name, settings, defaultValue, new EnumConverter<>(stringToEnumConverter), paywallResolver, action, + super(name, settings, defaultValue, new EnumConverter<>(stringToEnumConverter), paywallResolverProxy, action, dtoContext); } } diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredIntegerSetting.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredIntegerSetting.java index 1a72e1ae64b..ea415405235 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredIntegerSetting.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredIntegerSetting.java @@ -3,18 +3,18 @@ package com.sap.sse.security.ui.client.premium.settings; import com.sap.sse.common.settings.generic.AbstractGenericSerializableSettings; import com.sap.sse.common.settings.generic.converter.IntegerConverter; import com.sap.sse.security.shared.HasPermissions.Action; -import com.sap.sse.security.ui.client.premium.PaywallResolver; +import com.sap.sse.security.ui.client.premium.PaywallResolverProxy; import com.sap.sse.security.ui.client.premium.SecuredDTOProxy; public class SecuredIntegerSetting extends AbstractSecuredValueSetting { public SecuredIntegerSetting(String name, AbstractGenericSerializableSettings settings, - PaywallResolver paywallResolver, Action action, SecuredDTOProxy dtoContext) { - this(name, settings, null, paywallResolver, action, dtoContext); + PaywallResolverProxy paywallResolverProxy, Action action, SecuredDTOProxy dtoContext) { + this(name, settings, null, paywallResolverProxy, action, dtoContext); } public SecuredIntegerSetting(String name, AbstractGenericSerializableSettings settings, Integer defaultValue, - PaywallResolver paywallResolver, Action action, SecuredDTOProxy dtoContext) { - super(name, settings, defaultValue, IntegerConverter.INSTANCE, paywallResolver, action, dtoContext); + PaywallResolverProxy paywallResolverProxy, Action action, SecuredDTOProxy dtoContext) { + super(name, settings, defaultValue, IntegerConverter.INSTANCE, paywallResolverProxy, action, dtoContext); } } diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredLongSetting.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredLongSetting.java index b2fbd8b4fab..30cb1ff6ce5 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredLongSetting.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredLongSetting.java @@ -3,18 +3,18 @@ package com.sap.sse.security.ui.client.premium.settings; import com.sap.sse.common.settings.generic.AbstractGenericSerializableSettings; import com.sap.sse.common.settings.generic.converter.LongConverter; import com.sap.sse.security.shared.HasPermissions.Action; -import com.sap.sse.security.ui.client.premium.PaywallResolver; +import com.sap.sse.security.ui.client.premium.PaywallResolverProxy; import com.sap.sse.security.ui.client.premium.SecuredDTOProxy; public class SecuredLongSetting extends AbstractSecuredValueSetting { public SecuredLongSetting(String name, AbstractGenericSerializableSettings settings, - PaywallResolver paywallResolver, Action action, SecuredDTOProxy dtoContext) { - this(name, settings, null, paywallResolver, action, dtoContext); + PaywallResolverProxy paywallResolverProxy, Action action, SecuredDTOProxy dtoContext) { + this(name, settings, null, paywallResolverProxy, action, dtoContext); } public SecuredLongSetting(String name, AbstractGenericSerializableSettings settings, Long defaultValue, - PaywallResolver paywallResolver, Action action, SecuredDTOProxy dtoContext) { - super(name, settings, defaultValue, LongConverter.INSTANCE, paywallResolver, action, dtoContext); + PaywallResolverProxy paywallResolverProxy, Action action, SecuredDTOProxy dtoContext) { + super(name, settings, defaultValue, LongConverter.INSTANCE, paywallResolverProxy, action, dtoContext); } } diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredStringSetting.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredStringSetting.java index f79212b5066..4ef56fa3fd2 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredStringSetting.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredStringSetting.java @@ -3,19 +3,19 @@ package com.sap.sse.security.ui.client.premium.settings; import com.sap.sse.common.settings.generic.AbstractGenericSerializableSettings; import com.sap.sse.common.settings.generic.converter.StringConverter; import com.sap.sse.security.shared.HasPermissions.Action; -import com.sap.sse.security.ui.client.premium.PaywallResolver; +import com.sap.sse.security.ui.client.premium.PaywallResolverProxy; import com.sap.sse.security.ui.client.premium.SecuredDTOProxy; public class SecuredStringSetting extends AbstractSecuredValueSetting { public SecuredStringSetting(final String name, final AbstractGenericSerializableSettings settings, - PaywallResolver paywallResolver, Action action, SecuredDTOProxy dtoContext) { - this(name, settings, null, paywallResolver, action, dtoContext); + PaywallResolverProxy paywallResolverProxy, Action action, SecuredDTOProxy dtoContext) { + this(name, settings, null, paywallResolverProxy, action, dtoContext); } public SecuredStringSetting(final String name, final AbstractGenericSerializableSettings settings, - final String defaultValue, PaywallResolver paywallResolver, Action action, SecuredDTOProxy dtoContext) { - super(name, settings, defaultValue, StringConverter.INSTANCE, paywallResolver, action, dtoContext); + final String defaultValue, PaywallResolverProxy paywallResolverProxy, Action action, SecuredDTOProxy dtoContext) { + super(name, settings, defaultValue, StringConverter.INSTANCE, paywallResolverProxy, action, dtoContext); } public boolean isNotBlank() { diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredUUIDSetting.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredUUIDSetting.java index 3ffddef8f94..a4b6bafe20d 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredUUIDSetting.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/premium/settings/SecuredUUIDSetting.java @@ -5,18 +5,18 @@ import java.util.UUID; import com.sap.sse.common.settings.generic.AbstractGenericSerializableSettings; import com.sap.sse.common.settings.generic.converter.UUIDConverter; import com.sap.sse.security.shared.HasPermissions.Action; -import com.sap.sse.security.ui.client.premium.PaywallResolver; +import com.sap.sse.security.ui.client.premium.PaywallResolverProxy; import com.sap.sse.security.ui.client.premium.SecuredDTOProxy; public class SecuredUUIDSetting extends AbstractSecuredValueSetting { public SecuredUUIDSetting(String name, AbstractGenericSerializableSettings settings, - PaywallResolver paywallResolver, Action action, SecuredDTOProxy dtoContext) { - this(name, settings, null, paywallResolver, action, dtoContext); + PaywallResolverProxy paywallResolverProxy, Action action, SecuredDTOProxy dtoContext) { + this(name, settings, null, paywallResolverProxy, action, dtoContext); } public SecuredUUIDSetting(String name, AbstractGenericSerializableSettings settings, UUID defaultValue, - PaywallResolver paywallResolver, Action action, SecuredDTOProxy dtoContext) { - super(name, settings, defaultValue, UUIDConverter.INSTANCE, paywallResolver, action, dtoContext); + PaywallResolverProxy paywallResolverProxy, Action action, SecuredDTOProxy dtoContext) { + super(name, settings, defaultValue, UUIDConverter.INSTANCE, paywallResolverProxy, action, dtoContext); } } diff --git a/wiki/howto/development/secured-settings.md b/wiki/howto/development/secured-settings.md new file mode 100644 index 00000000000..a8d2bb3ce99 --- /dev/null +++ b/wiki/howto/development/secured-settings.md @@ -0,0 +1,25 @@ +# How to use Secured Settings + +We introduced a special type of settings, which are automatically check the accessebility of setting property by paywall resolver and the secured DTO in context. + +## Usage + +In the Settings class (e.g. ``RaceMapSettings.java``) the specific setting fields are implemented usually as one of the ``AbstractValueSetting<>`` classes (see common SSE project under ``com.sap.sse.common.settings.generic``). + +The initialization is done in the ``addChildSettings()`` method of an ``AbstractGenericSerializableSettings``, which is called before the constructor of the specific setting class is processed and before any field initialization in the setting class is done. Therefore, some potentially final fields like ``PaywallResolverProxy`` or ``SecuredDTOProxy`` are not declaired as final and are initialized in a lazy way to make sure they are always available for reading but will not be overwritten by another init step. + +To enable security features directly when setting or reading a property, there are now other implementations of the value settings available (see SSE security UI project under ``com.sap.sse.security.ui.client.premium.settings``): + + SecuredBooleanSetting.java + SecuredDecimalSetting.java + SecuredDoubleSetting.java + SecuredEnumSetting.java + SecuredIntegerSetting.java + SecuredLongSetting.java + SecuredStringSetting.java + SecuredUUIDSetting.java + +They can be used instead of the 'traditional' settings with additional requirements: The PaywallResolver and a SecuredDTO have to be set. + +Because often the settings have been defined before the respective secured DTO is available, the paywall resolver and the secured DTO are wrapped into proxy objects, so they can (have to be) set in a later time with ``.setPaywallResolver(paywallResolver)`` or ``.setSecuredDTO(securedDTO)``. +