From a4ecfaacfb0a52144be9c13017608f84bbf6c29c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kai=20B=C3=B6rnert?= Date: Tue, 11 Dec 2018 15:51:49 +0100 Subject: [PATCH 1/5] added required endpoints and documentation to allow migration via restservices --- .../gateway/jaxrs/api/EventsResource.java | 3 +- .../jaxrs/api/LeaderboardGroupsResource.java | 3 +- .../jaxrs/api/LeaderboardsResourceV2.java | 3 +- .../gateway/jaxrs/api/RestApiApplication.java | 1 + .../gateway/jaxrs/api/UserGroupsResource.java | 41 ++++++++++++++++ .../webservices/api/v1/eventMigrate.html | 49 +++++++++++++++++++ .../webservices/api/v1/index.html | 18 ++++++- .../api/v1/leaderboardGroupMigrate.html | 49 +++++++++++++++++++ .../api/v1/leaderboardMigrate.html | 49 +++++++++++++++++++ .../webservices/api/v1/usergroupsGet.html | 41 ++++++++++++++++ 10 files changed, 253 insertions(+), 4 deletions(-) create mode 100644 java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/UserGroupsResource.java create mode 100644 java/com.sap.sailing.server.gateway/webservices/api/v1/eventMigrate.html create mode 100644 java/com.sap.sailing.server.gateway/webservices/api/v1/leaderboardGroupMigrate.html create mode 100644 java/com.sap.sailing.server.gateway/webservices/api/v1/leaderboardMigrate.html create mode 100644 java/com.sap.sailing.server.gateway/webservices/api/v1/usergroupsGet.html 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 71ecf8dfe33..c7725cbb9b0 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 @@ -105,7 +105,8 @@ public class EventsResource extends AbstractSailingServerResource { } @POST - public Response migrateOwnershipForEvent(@QueryParam("eventId") UUID eventId, + @Path("/{eventId}/migrate") + public Response migrateOwnershipForEvent(@PathParam("eventId") UUID eventId, @QueryParam("createNewGroup") Boolean createNewGroup, @QueryParam("existingGroupId") UUID existingGroupIdOrNull, @QueryParam("newGroupName") String newGroupName, @QueryParam("migrateCompetitors") Boolean migrateCompetitors, diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardGroupsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardGroupsResource.java index ce10126bf16..5c06421ac09 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardGroupsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardGroupsResource.java @@ -45,7 +45,8 @@ import com.sap.sse.common.impl.MillisecondsTimePoint; @Path("/v1/leaderboardgroups") public class LeaderboardGroupsResource extends AbstractSailingServerResource { @POST - public Response migrateOwnershipForLeaderboardGroup(@QueryParam("leaderboardGroupName") String leaderboardGroupName, + @Path("/{name}/migrate") + public Response migrateOwnershipForLeaderboardGroup(@PathParam("name") String leaderboardGroupName, @QueryParam("createNewGroup") Boolean createNewGroup, @QueryParam("existingGroupId") UUID existingGroupIdOrNull, @QueryParam("newGroupName") String newGroupName, @QueryParam("migrateCompetitors") Boolean migrateCompetitors, diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java index c2227122889..f2c84428a1e 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java @@ -56,7 +56,8 @@ import com.sap.sse.common.Util.Pair; @Path("/v2/leaderboards") public class LeaderboardsResourceV2 extends AbstractLeaderboardsResource { @POST - public Response migrateOwnershipForLeaderboard(@QueryParam("leaderboardName") String leaderboardName, + @Path("/{name}/migrate") + public Response migrateOwnershipForLeaderboard(@PathParam("name") String leaderboardName, @QueryParam("createNewGroup") Boolean createNewGroup, @QueryParam("existingGroupId") UUID existingGroupIdOrNull, @QueryParam("newGroupName") String newGroupName, @QueryParam("migrateCompetitors") Boolean migrateCompetitors, diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RestApiApplication.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RestApiApplication.java index e921bf51d3d..378bafed13d 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RestApiApplication.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RestApiApplication.java @@ -32,6 +32,7 @@ public class RestApiApplication extends Application { classes.add(MarkRessource.class); classes.add(PreferencesResource.class); classes.add(TagsResource.class); + classes.add(UserGroupsResource.class); // Exception Mappers classes.add(ShiroAuthorizationExceptionTo401ResponseMapper.class); diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/UserGroupsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/UserGroupsResource.java new file mode 100644 index 00000000000..72fde1d5626 --- /dev/null +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/UserGroupsResource.java @@ -0,0 +1,41 @@ +package com.sap.sailing.server.gateway.jaxrs.api; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Response; + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.parser.ParseException; + +import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; +import com.sap.sailing.server.gateway.jaxrs.AbstractSailingServerResource; +import com.sap.sse.security.shared.impl.User; +import com.sap.sse.security.shared.impl.UserGroup; + +@Path("/v1/usergroups") +public class UserGroupsResource extends AbstractSailingServerResource { + @GET + @Produces("application/json;charset=UTF-8") + public Response getUserGroupsCurrentUserIsPartOf() + throws ParseException, JsonDeserializationException { + Response response = null; + User user = getService().getSecurityService().getCurrentUser(); + if (user != null) { + JSONObject root = new JSONObject(); + JSONArray groups = new JSONArray(); + root.put("groupsUserIsPartOf", groups); + for (UserGroup group : user.getUserGroups()) { + JSONObject groupJson = new JSONObject(); + groupJson.put("uuid", group.getId().toString()); + groupJson.put("name", group.getName()); + groups.add(groupJson); + } + response = Response.ok(root.toJSONString()).build(); + } else { + response = Response.status(401).build(); + } + return response; + } +} \ No newline at end of file diff --git a/java/com.sap.sailing.server.gateway/webservices/api/v1/eventMigrate.html b/java/com.sap.sailing.server.gateway/webservices/api/v1/eventMigrate.html new file mode 100644 index 00000000000..8c21448ca9e --- /dev/null +++ b/java/com.sap.sailing.server.gateway/webservices/api/v1/eventMigrate.html @@ -0,0 +1,49 @@ + + + + + + + + SAP Sailing Analytics Webservices API Version 1.0 + + +

SAP Sailing Analytics Webservices API Version 1.0

+

URL: /api/v1/events/{event-id}/migrate

+ +Description: +

Migrates the given object to a new owner, it will also attempt to update the related structure of other domain objects, to ensure a consistent result

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Webservice Type:PUT
Output format:empty
Mandatory parameters:migrateCompetitors should the competitors be migrated as wellmigrateBoats should the boats be migrated as wellcreateNewGroup determines if the migration will happen into a group that will be created (also required for currently unowned objects)
Optional parameters:existingGroupId group that should be changed, required for createNewGroup = falsenewGroupName name of the new group, required for createNewGroup = true
Request method:POST
Example:curl -X POST -H "Authorization: Bearer w9YSIfr/Zf6a127SZDddkhdAtQuuv0Jm1PSXlo1Yvd0=" "http://127.0.0.1:8888/sailingserver/api/v1/events/123456789-2975-42c8-a31b-365d0bca6197/migrate?existingGroupId=4bc6747a-2975-42c8-a31b-365d0bca6197&createNewGroup=false&migrateCompetitors=false&migrateBoats=false"
+
+
+Back to Web Service Overview + + diff --git a/java/com.sap.sailing.server.gateway/webservices/api/v1/index.html b/java/com.sap.sailing.server.gateway/webservices/api/v1/index.html index 00cb798fc7c..7714ea56b06 100644 --- a/java/com.sap.sailing.server.gateway/webservices/api/v1/index.html +++ b/java/com.sap.sailing.server.gateway/webservices/api/v1/index.html @@ -37,9 +37,13 @@ name to make sure you get to the event you're interested in. Creates a new event - /api/v1/events/{event-id}/update + /api/v1/events/{event-id}/update Updates an existing event + + /api/v1/events/{event-id}/migrate + Migrates an existing event + /api/v1/events Gets all events @@ -165,6 +169,10 @@ name to make sure you get to the event you're interested in. /api/v1/leaderboardgroups/{name} Gets the details of a group of leaderboards + + /api/v1/leaderboardgroups/{name}/migrate + Migrates an existing leaderboardGroup + /api/v1/leaderboards Gets all leaderboards @@ -220,6 +228,10 @@ name to make sure you get to the event you're interested in. /api/v1/leaderboards/{name}/leaderboardRaceEnableRaceLogForCompetitorRegistration Enables racelog useage for competitor registration + + + /api/v1/leaderboards/{name}/migrate + Migrates an existing leaderboard /api/v1/leaderboards/{name}/marks/{id}/gps_fixes @@ -308,6 +320,10 @@ name to make sure you get to the event you're interested in. /api/v1/preferences/{SETTINGS_KEY} Removes a document from the preferences of a user + + /api/v1/usergroups/ + Lists all usergroups and their id's the current user is part of, required to obtain id's for migration for example +
diff --git a/java/com.sap.sailing.server.gateway/webservices/api/v1/leaderboardGroupMigrate.html b/java/com.sap.sailing.server.gateway/webservices/api/v1/leaderboardGroupMigrate.html new file mode 100644 index 00000000000..4f5bd6df950 --- /dev/null +++ b/java/com.sap.sailing.server.gateway/webservices/api/v1/leaderboardGroupMigrate.html @@ -0,0 +1,49 @@ + + + + + + + + SAP Sailing Analytics Webservices API Version 1.0 + + +

SAP Sailing Analytics Webservices API Version 1.0

+

URL: /api/v1/leaderboardgroups/{name}/migrate

+ +Description: +

Migrates the given object to a new owner, it will also attempt to update the related structure of other domain objects, to ensure a consistent result

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Webservice Type:PUT
Output format:empty
Mandatory parameters:migrateCompetitors should the competitors be migrated as wellmigrateBoats should the boats be migrated as wellcreateNewGroup determines if the migration will happen into a group that will be created (also required for currently unowned objects)
Optional parameters:existingGroupId group that should be changed, required for createNewGroup = falsenewGroupName name of the new group, required for createNewGroup = true
Request method:POST
Example:curl -X POST -H "Authorization: Bearer w9YSIfr/Zf6a127SZDddkhdAtQuuv0Jm1PSXlo1Yvd0=" "http://127.0.0.1:8888/sailingserver/api/v1/leaderboardgroups/Extreme Sailing Series 2016/migrate?existingGroupId=4bc6747a-2975-42c8-a31b-365d0bca6197&createNewGroup=false&migrateCompetitors=false&migrateBoats=false"
+
+
+Back to Web Service Overview + + diff --git a/java/com.sap.sailing.server.gateway/webservices/api/v1/leaderboardMigrate.html b/java/com.sap.sailing.server.gateway/webservices/api/v1/leaderboardMigrate.html new file mode 100644 index 00000000000..3a23a0abb68 --- /dev/null +++ b/java/com.sap.sailing.server.gateway/webservices/api/v1/leaderboardMigrate.html @@ -0,0 +1,49 @@ + + + + + + + + SAP Sailing Analytics Webservices API Version 1.0 + + +

SAP Sailing Analytics Webservices API Version 1.0

+

URL: /api/v2/leaderboard/{name}/migrate

+ +Description: +

Migrates the given object to a new owner, it will also attempt to update the related structure of other domain objects, to ensure a consistent result

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Webservice Type:PUT
Output format:empty
Mandatory parameters:migrateCompetitors should the competitors be migrated as wellmigrateBoats should the boats be migrated as wellcreateNewGroup determines if the migration will happen into a group that will be created (also required for currently unowned objects)
Optional parameters:existingGroupId group that should be changed, required for createNewGroup = falsenewGroupName name of the new group, required for createNewGroup = true
Request method:POST
Example:curl -X POST -H "Authorization: Bearer w9YSIfr/Zf6a127SZDddkhdAtQuuv0Jm1PSXlo1Yvd0=" "http://127.0.0.1:8888/sailingserver/api/v1/leaderboard/Extreme Sailing Series 2016 Cardiff/migrate?existingGroupId=4bc6747a-2975-42c8-a31b-365d0bca6197&createNewGroup=false&migrateCompetitors=false&migrateBoats=false"
+
+
+Back to Web Service Overview + + diff --git a/java/com.sap.sailing.server.gateway/webservices/api/v1/usergroupsGet.html b/java/com.sap.sailing.server.gateway/webservices/api/v1/usergroupsGet.html new file mode 100644 index 00000000000..44020be718b --- /dev/null +++ b/java/com.sap.sailing.server.gateway/webservices/api/v1/usergroupsGet.html @@ -0,0 +1,41 @@ + + + + + + + + SAP Sailing Analytics Webservices API Version 1.0 + + +

SAP Sailing Analytics Webservices API Version 1.0

+

URL: /api/v1/usergroups/

+ +Description: +

Gets the usergroup names and id's the currently logged in user is part of

+
+ + + + + + + + + + + + + + + + + +
Webservice Type:REST
Output format:Json
Mandatory parameters:none
Examples: + Get @ http://sapsailing.com/sailingserver/api/v1/usergroups/ +
+
+
+Back to Web Service Overview + + From 6ae2b2e86822ae6d4db08bcc83cbfacf3e182427 Mon Sep 17 00:00:00 2001 From: Thomas Wiese Date: Tue, 11 Dec 2018 15:59:58 +0100 Subject: [PATCH 2/5] add ampersand betweeen query parameters of branchio-url --- .../src/com/sap/sailing/domain/common/BranchIO.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/BranchIO.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/BranchIO.java index 36672f7589b..a7c146ba131 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/BranchIO.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/BranchIO.java @@ -23,8 +23,13 @@ public class BranchIO { if (parameters != null && parameters.size() > 0) { deepLinkUrl.append("?"); } + boolean first = true; for (Entry param : parameters.entrySet()) { + if (!first) { + deepLinkUrl.append("&"); + } deepLinkUrl.append(param.getKey()).append(("=")).append(urlEncoder.attributeEncode(param.getValue())); + first = false; } return deepLinkUrl.toString(); } From ababe1ceea0c554ce2d3476c8c2a8478b8ac5204 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Tue, 11 Dec 2018 15:23:12 +0100 Subject: [PATCH 3/5] Also include Regattas when migrating group ownership in hierarchy --- .../server/hierarchy/SailingHierarchyOwnershipUpdater.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/hierarchy/SailingHierarchyOwnershipUpdater.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/hierarchy/SailingHierarchyOwnershipUpdater.java index 48de9ebc92b..fe324b09955 100644 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/hierarchy/SailingHierarchyOwnershipUpdater.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/hierarchy/SailingHierarchyOwnershipUpdater.java @@ -11,6 +11,7 @@ import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Event; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.LeaderboardGroup; +import com.sap.sailing.domain.leaderboard.RegattaLeaderboard; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.server.RacingEventService; import com.sap.sse.security.SecurityService; @@ -113,6 +114,10 @@ public class SailingHierarchyOwnershipUpdater { public void updateGroupOwnershipForLeaderboardHierarchy(Leaderboard leaderboard) { updateGroupOwner(leaderboard.getIdentifier()); + if (leaderboard instanceof RegattaLeaderboard) { + RegattaLeaderboard regattaLeaderboard = (RegattaLeaderboard) leaderboard; + updateGroupOwner(regattaLeaderboard.getRegatta().getIdentifier()); + } SailingHierarchyWalker.walkFromLeaderboard(leaderboard, new LeaderboardHierarchyVisitor() { @Override public void visit(TrackedRace race) { From f5ed139fb0888c00fe98224f8275447882f1ee2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kai=20B=C3=B6rnert?= Date: Tue, 11 Dec 2018 17:21:47 +0100 Subject: [PATCH 4/5] fixed test to conform to changes made for permission-vertical --- .../src/com/sap/sailing/server/test/RemoveLeaderboardTest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RemoveLeaderboardTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RemoveLeaderboardTest.java index 709c629de66..7bf5f2e9d2e 100755 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RemoveLeaderboardTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RemoveLeaderboardTest.java @@ -46,6 +46,7 @@ import com.sap.sailing.domain.tracking.TrackedRegatta; import com.sap.sailing.domain.tracking.impl.EmptyWindStore; import com.sap.sailing.server.impl.RacingEventServiceImpl; import com.sap.sailing.server.operationaltransformation.CreateFlexibleLeaderboard; +import com.sap.sailing.server.operationaltransformation.RemoveAndUntrackRace; import com.sap.sailing.server.operationaltransformation.RemoveEvent; import com.sap.sailing.server.operationaltransformation.RemoveLeaderboard; import com.sap.sailing.server.operationaltransformation.RemoveLeaderboardGroup; @@ -119,6 +120,8 @@ public class RemoveLeaderboardTest { public void testRaceLogOfRaceColumnInSeriesDetachedWhenRegattaIsRemoved() { regatta.getRaceColumnByName(R1).setTrackedRace(defaultFleet, trackedRace); assertEquals(1, Util.size(trackedRace.getAttachedRaceLogs())); + // removal of races is no longer done automatically, due to restrictions based on permission-vertical + server.apply(new RemoveAndUntrackRace(trackedRace.getRaceIdentifier())); server.apply(new RemoveRegatta(new RegattaName(regatta.getName()))); assertTrue(Util.isEmpty(trackedRace.getAttachedRaceLogs())); } From 3b695b80bd14f5f4f4640a2af36e8d1fd5bbbf23 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Tue, 11 Dec 2018 18:17:42 +0100 Subject: [PATCH 5/5] Added permission to competitor's and boat's admin console tabs --- .../common/security/SecuredDomainType.java | 3 +++ .../adminconsole/AdminConsoleEntryPoint.java | 24 ++++++++----------- .../gwt/adminconsole/AdminConsolePanel.java | 8 +++---- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/security/SecuredDomainType.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/security/SecuredDomainType.java index 12650f28312..2d09ea555fb 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/security/SecuredDomainType.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/security/SecuredDomainType.java @@ -72,6 +72,9 @@ public class SecuredDomainType extends HasPermissionsImpl { private static final Action[] ALL_ACTIONS = new Action[] { READ_PUBLIC, DefaultActions.READ, DefaultActions.CREATE, DefaultActions.UPDATE, DefaultActions.CHANGE_OWNERSHIP, DefaultActions.CHANGE_ACL }; + + public static final Action[] MUTATION_ACTIONS = new Action[] { DefaultActions.CREATE, DefaultActions.UPDATE, + DefaultActions.CHANGE_OWNERSHIP, DefaultActions.CHANGE_ACL }; }; /** diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleEntryPoint.java index 8b943f80dfc..766d3b1bb9b 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleEntryPoint.java @@ -13,6 +13,7 @@ import com.google.gwt.user.client.ui.HeaderPanel; import com.google.gwt.user.client.ui.RootLayoutPanel; import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.domain.common.security.SecuredDomainType; +import com.sap.sailing.domain.common.security.SecuredDomainType.CompetitorAndBoatActions; import com.sap.sailing.gwt.common.authentication.FixedSailingAuthentication; import com.sap.sailing.gwt.common.authentication.SAPSailingHeaderWithAuthentication; import com.sap.sailing.gwt.ui.client.AbstractSailingEntryPoint; @@ -119,7 +120,9 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint leaderboardsDisplayers = new HashSet<>(); leaderboardGroupsDisplayers = new HashSet<>(); - final EventManagementPanel eventManagementPanel = new EventManagementPanel(getSailingService(), getUserService(), this, this, getStringMessages(), panel); + /* EVENTS */ + final EventManagementPanel eventManagementPanel = new EventManagementPanel(getSailingService(), + getUserService(), this, this, getStringMessages(), panel); eventManagementPanel.ensureDebugId("EventManagement"); panel.addToVerticalTabPanel(new DefaultRefreshableAdminConsolePanel(eventManagementPanel) { @Override @@ -127,11 +130,10 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint getWidget().fillEvents(); fillLeaderboardGroups(); } - }, getStringMessages().events()); // no permissions required; we show those events the user may read + }, getStringMessages().events(), SecuredDomainType.EVENT.getPermission(DefaultActions.MUTATION_ACTIONS)); leaderboardGroupsDisplayers.add(eventManagementPanel); /* REGATTAS */ - RegattaManagementPanel regattaManagementPanel = new RegattaManagementPanel( getSailingService(), getUserService(), this, getStringMessages(), this, eventManagementPanel); regattaManagementPanel.ensureDebugId("RegattaStructureManagement"); @@ -140,11 +142,10 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint public void refreshAfterBecomingVisible() { fillRegattas(); } - }, getStringMessages().regattas(), SecuredDomainType.EVENT.getPermission(DefaultActions.MUTATION_ACTIONS)); + }, getStringMessages().regattas(), SecuredDomainType.REGATTA.getPermission(DefaultActions.MUTATION_ACTIONS)); regattasDisplayers.add(regattaManagementPanel); /* LEADERBOARDS */ - final HorizontalTabLayoutPanel leaderboardTabPanel = panel.addVerticalTab(getStringMessages().leaderboards(), "LeaderboardPanel"); final LeaderboardConfigPanel leaderboardConfigPanel = new LeaderboardConfigPanel(getSailingService(), getUserService(), this, this, getStringMessages(), /* showRaceDetails */true, this); @@ -179,9 +180,7 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint leaderboardsDisplayers.add(leaderboardGroupConfigPanel); /* RACES */ - final HorizontalTabLayoutPanel racesTabPanel = panel.addVerticalTab(getStringMessages().trackedRaces(), "RacesPanel"); - racesTabPanel.ensureDebugId("RacesPanel"); final TrackedRacesManagementPanel trackedRacesManagementPanel = new TrackedRacesManagementPanel( getSailingService(), getUserService(), this, this, getStringMessages()); @@ -201,7 +200,7 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint public void refreshAfterBecomingVisible() { getWidget().refreshCompetitorList(); } - }, getStringMessages().competitors()); // no permissions required; we show those competitors the user may read + }, getStringMessages().competitors(), SecuredDomainType.COMPETITOR.getPermission(CompetitorAndBoatActions.MUTATION_ACTIONS)); final BoatPanel boatPanel = new BoatPanel(getSailingService(), getUserService(), getStringMessages(), this); boatPanel.ensureDebugId("BoatPanel"); @@ -210,7 +209,7 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint public void refreshAfterBecomingVisible() { getWidget().refreshBoatList(); } - }, getStringMessages().boats()); // no permissions required; we show those boats the user may read + }, getStringMessages().boats(), SecuredDomainType.BOAT.getPermission(CompetitorAndBoatActions.MUTATION_ACTIONS)); RaceCourseManagementPanel raceCourseManagementPanel = new RaceCourseManagementPanel(getSailingService(), this, this, getStringMessages()); panel.addToTabPanel(racesTabPanel, new DefaultRefreshableAdminConsolePanel(raceCourseManagementPanel), getStringMessages().courseLayout()); @@ -231,7 +230,6 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint }, getStringMessages().mediaPanel()); // no permissions required; we show those media the user may read /* RACE COMMITTEE APP */ - final HorizontalTabLayoutPanel raceCommitteeTabPanel = panel.addVerticalTab(getStringMessages().raceCommitteeApp(), "RaceCommiteeAppPanel"); final DeviceConfigurationUserPanel deviceConfigurationUserPanel = new DeviceConfigurationUserPanel(getSailingService(), getUserService(), getStringMessages(), this); @@ -239,7 +237,6 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint getStringMessages().deviceConfiguration()); // no permissions required; we show those device configurations the user may read /* CONNECTORS */ - final HorizontalTabLayoutPanel connectorsTabPanel = panel.addVerticalTab(getStringMessages().connectors(), "TrackingProviderPanel"); TracTracEventManagementPanel tractracEventManagementPanel = new TracTracEventManagementPanel(getSailingService(), this, this, getStringMessages()); @@ -297,9 +294,8 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint SecuredDomainType.REGATTA.getPermission(DefaultActions.CREATE)); // TODO bug4763 provide the default CREATE ownership for REGATTA / EVENT /* ADVANCED */ - - final HorizontalTabLayoutPanel advancedTabPanel = panel.addVerticalTab(getStringMessages().advanced(), "AdvancedPanel"); - advancedTabPanel.ensureDebugId("AdvancedTab"); + final HorizontalTabLayoutPanel advancedTabPanel = panel.addVerticalTab(getStringMessages().advanced(), + "AdvancedTab"); final ReplicationPanel replicationPanel = new ReplicationPanel(getSailingService(), this, getStringMessages()); panel.addToTabPanel(advancedTabPanel, new DefaultRefreshableAdminConsolePanel(replicationPanel) { @Override 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 d406a24ce2b..31eb4997cd8 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 @@ -98,7 +98,7 @@ public class AdminConsolePanel extends HeaderPanel implements HandleTabSelectabl /** * If {@code null}, any permission will be accepted by - * {@link #remeberWidgetLocationAndPermissions(VerticalOrHorizontalTabLayoutPanel, Widget, String, HasPermissions...)} + * {@link #rememberWidgetLocationAndPermissions(VerticalOrHorizontalTabLayoutPanel, Widget, String, HasPermissions...)} * which is used by all methods that add a panel and optionally specify permissions required to see that panel. * If this field holds a valid permission collection, only permissions from this collection will be accepted. * This can be used to keep a central repository of all such permissions which in turn may be used to @@ -278,7 +278,7 @@ public class AdminConsolePanel extends HeaderPanel implements HandleTabSelectabl AbstractEntryPoint.setTabPanelSize(newTabPanel, "100%", "100%"); newTabPanel.addSelectionHandler(tabSelectionHandler); newTabPanel.ensureDebugId(tabDebugId); - remeberWidgetLocationAndPermissions(topLevelTabPanelWrapper, newTabPanel, tabTitle, requiresAnyOfThesePermissions); + rememberWidgetLocationAndPermissions(topLevelTabPanelWrapper, newTabPanel, tabTitle, requiresAnyOfThesePermissions); return newTabPanel; } @@ -341,7 +341,7 @@ public class AdminConsolePanel extends HeaderPanel implements HandleTabSelectabl * method can be called. */ private void addToTabPanel(VerticalOrHorizontalTabLayoutPanel tabPanel, RefreshableAdminConsolePanel panelToAdd, String tabTitle, WildcardPermission... requiresAnyOfThesePermissions) { - remeberWidgetLocationAndPermissions(tabPanel, wrapInScrollPanel(panelToAdd.getWidget()), tabTitle, requiresAnyOfThesePermissions); + rememberWidgetLocationAndPermissions(tabPanel, wrapInScrollPanel(panelToAdd.getWidget()), tabTitle, requiresAnyOfThesePermissions); panelsByWidget.put(panelToAdd.getWidget(), panelToAdd); } @@ -356,7 +356,7 @@ public class AdminConsolePanel extends HeaderPanel implements HandleTabSelectabl * widget. Otherwise, if any of these permissions implies any of the permissions the user has, the user * will be shown the widget. */ - private void remeberWidgetLocationAndPermissions(VerticalOrHorizontalTabLayoutPanel tabPanel, Widget widgetToAdd, + private void rememberWidgetLocationAndPermissions(VerticalOrHorizontalTabLayoutPanel tabPanel, Widget widgetToAdd, String tabTitle, WildcardPermission... requiresAnyOfThesePermissions) { if (acceptablePermissionsRequiredToSeeWidgets != null) { for (final WildcardPermission requiredPermission : requiresAnyOfThesePermissions) {