diff --git a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/EventResourceTest.java b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/EventResourceTest.java index 464c6b71235..6515497ec7e 100644 --- a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/EventResourceTest.java +++ b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/EventResourceTest.java @@ -40,6 +40,7 @@ public class EventResourceTest extends AbstractJaxRsApiTest @Test public void testCreateEvent() throws Exception { + // cave: using null as parameters overrides @DefaultValue Annotation Response eventResponse = eventsResource.createEvent(randomName, randomName, null, null, randomName, null, null, null, null, null, null, null); assertTrue(isValidEventResponse(eventResponse)); } @@ -49,7 +50,7 @@ public class EventResourceTest extends AbstractJaxRsApiTest Response eventResponse = eventsResource.createEvent(randomName, randomName, null, null, randomName, null, null, null, null, "true", null, null); assertTrue(isValidEventResponse(eventResponse)); - JSONObject objEvent = getEvent(getEntityAsString(eventResponse)); + JSONObject objEvent = getEvent(getIdFromResponse(eventResponse)); assertTrue(hasDefaultLeaderboardGroup(objEvent)); } @@ -59,7 +60,7 @@ public class EventResourceTest extends AbstractJaxRsApiTest Response eventResponse = eventsResource.createEvent(randomName, randomName, null, null, randomName, null, null, null, null, "true", "true", "A_CAT"); assert(isValidEventResponse(eventResponse)); - JSONObject objEvent = getEvent(getEntityAsString(eventResponse)); + JSONObject objEvent = getEvent(getIdFromResponse(eventResponse)); assertTrue(hasDefaultLeaderboardGroup(objEvent)); assertTrue(hasAtLeastOneCourseArea(objEvent)); @@ -88,10 +89,10 @@ public class EventResourceTest extends AbstractJaxRsApiTest String eventName = randomName(); Response eventResponse = eventsResource.createEvent(eventName, eventName, null, null, eventName, null, null, null, null, null, null, null); - String strEventId = getEntityAsString(eventResponse); + String strEventId = getIdFromResponse(eventResponse); Response addLeaderboardGroupResponse = eventsResource.addLeaderboardGroup(strEventId, eventName, eventName, null, null, null, null, null); - String strLeaderboardGroupId = getEntityAsString(addLeaderboardGroupResponse); + String strLeaderboardGroupId = getIdFromResponse(addLeaderboardGroupResponse); assertTrue(isValidLeaderboardGroupResponse(addLeaderboardGroupResponse)); JSONObject objEvent = getEvent(strEventId); @@ -108,8 +109,8 @@ public class EventResourceTest extends AbstractJaxRsApiTest Response eventResponse = eventsResource.createEvent(eventName, eventName, null, null, eventName, null, null, null, null, null, null, null); assertTrue(isValidEventResponse(eventResponse)); - String strEventId = getEntityAsString(eventResponse); - Response regattaResponse = eventsResource.addRegatta(eventName, "A_CAT", null, strEventId, null,"true", "LOW_POINT", null, "3.0", "true", "false", "ONE_DESIGN"); + String strEventId = getIdFromResponse(eventResponse); + Response regattaResponse = eventsResource.addRegatta(eventName, "A_CAT", null, strEventId, null, null, null, null, null, null, null, "ONE_DESIGN"); assertTrue(isValidRegattaResponse(regattaResponse)); JSONObject regatta = getRegatta(eventName); @@ -134,7 +135,7 @@ public class EventResourceTest extends AbstractJaxRsApiTest Response eventResponse = eventsResource.createEvent(eventName, eventName, null, null, eventName, null, null, null, null, "true", null, null); assertTrue(isValidEventResponse(eventResponse)); - String strEventId = getEntityAsString(eventResponse); + String strEventId = getIdFromResponse(eventResponse); Response regattaResponse = eventsResource.addRegatta(eventName, "A_CAT", null, strEventId, null,"true", "LOW_POINT", null, "3.0", "true", "false", "ONE_DESIGN"); assertTrue(isValidRegattaResponse(regattaResponse)); @@ -182,21 +183,21 @@ public class EventResourceTest extends AbstractJaxRsApiTest private JSONObject getRegatta(String eventName) { Response regattasResponse = regattasResource.getRegatta(eventName); - return toJSONObject(getEntityAsString(regattasResponse)); + return toJSONObject(getIdFromResponse(regattasResponse)); } private boolean isValidEventResponse(Response response) { - String id = getEntityAsString(response); + String id = getIdFromResponse(response); return validateUUID(id); } private boolean isValidLeaderboardGroupResponse(Response response) { - String id = getEntityAsString(response); + String id = getIdFromResponse(response); return validateUUID(id); } private boolean isValidRegattaResponse(Response response) { - String id = getEntityAsString(response); + String id = getIdFromResponse(response); return validateUUID(id); } @@ -222,14 +223,14 @@ public class EventResourceTest extends AbstractJaxRsApiTest private JSONObject getEntityAsObject(Response leaderboardGroupsResponse) { - String strLeaderboardGroup = getEntityAsString(leaderboardGroupsResponse); + String strLeaderboardGroup = getIdFromResponse(leaderboardGroupsResponse); JSONObject objLeaderboardGroup = toJSONObject(strLeaderboardGroup); return objLeaderboardGroup; } private JSONObject getLeaderboardGroup(String strDefaultLeaderboardGroupName) { Response leaderboardGroupsResponse = leaderboardGroupsResource.getLeaderboardGroup(strDefaultLeaderboardGroupName); - return toJSONObject(getEntityAsString(leaderboardGroupsResponse)); + return toJSONObject(getIdFromResponse(leaderboardGroupsResponse)); } private JSONArray getLeaderboardGroups(JSONObject objEvent) { @@ -256,7 +257,7 @@ public class EventResourceTest extends AbstractJaxRsApiTest } - private String getEntityAsString(Response eventResponse) { + private String getIdFromResponse(Response eventResponse) { return (String) eventResponse.getEntity(); } @@ -266,7 +267,7 @@ public class EventResourceTest extends AbstractJaxRsApiTest private String getEventAsString(String eventId) { - return getEntityAsString(eventsResource.getEvent(eventId)); + return getIdFromResponse(eventsResource.getEvent(eventId)); } 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 74b58a36f76..5fc7282a291 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 @@ -21,7 +21,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import java.util.stream.StreamSupport; -import javax.validation.constraints.NotNull; import javax.ws.rs.Consumes; import javax.ws.rs.DefaultValue; import javax.ws.rs.FormParam; @@ -36,6 +35,7 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import org.apache.commons.lang.StringEscapeUtils; +import org.apache.shiro.SecurityUtils; import org.json.simple.JSONArray; import org.json.simple.JSONObject; @@ -44,17 +44,21 @@ import com.sap.sailing.domain.base.Event; import com.sap.sailing.domain.base.EventBase; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.common.BoatClassMasterdata; +import com.sap.sailing.domain.common.NotFoundException; import com.sap.sailing.domain.common.RankingMetrics; import com.sap.sailing.domain.common.RegattaName; import com.sap.sailing.domain.common.ScoringSchemeType; import com.sap.sailing.domain.common.dto.FleetDTO; import com.sap.sailing.domain.common.dto.RegattaCreationParametersDTO; import com.sap.sailing.domain.common.dto.SeriesCreationParametersDTO; +import com.sap.sailing.domain.common.security.Permission; +import com.sap.sailing.domain.common.security.Permission.Mode; 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.leaderboard.ScoringScheme; import com.sap.sailing.server.gateway.jaxrs.AbstractSailingServerResource; +import com.sap.sailing.server.gateway.jaxrs.exceptions.ExceptionManager; import com.sap.sailing.server.gateway.serialization.JsonSerializer; import com.sap.sailing.server.gateway.serialization.impl.CourseAreaJsonSerializer; import com.sap.sailing.server.gateway.serialization.impl.EventBaseJsonSerializer; @@ -64,7 +68,6 @@ import com.sap.sailing.server.gateway.serialization.impl.VenueJsonSerializer; import com.sap.sailing.server.operationaltransformation.AddCourseAreas; import com.sap.sailing.server.operationaltransformation.AddSpecificRegatta; import com.sap.sailing.server.operationaltransformation.CreateEvent; -import com.sap.sailing.server.operationaltransformation.CreateLeaderboardGroup; import com.sap.sailing.server.operationaltransformation.CreateRegattaLeaderboard; import com.sap.sse.common.Duration; import com.sap.sse.common.Util.Pair; @@ -77,84 +80,143 @@ import com.sap.sse.shared.media.VideoDescriptor; public class EventsResource extends AbstractSailingServerResource { private static final SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy"); - + private static final boolean DEBUG_SECURITY_CHECK = false; + @POST @Path("/createEvent") @Consumes("text/plain") @Produces("text/plain") - public Response createEvent(@FormParam("eventName") String eventName, - @FormParam("eventDescription") String eventDescription, - @FormParam("startDate") String startDateString, - @FormParam("endDate") String endDateString, - @FormParam("venueName") String venueName, + public Response createEvent(@FormParam("eventName") String eventNameParam, + @FormParam("eventDescription") String eventDescriptionParam, + @FormParam("startDate") String startDateParam, + @FormParam("endDate") String endDateParam, + @FormParam("venueName") String venueNameParam, @FormParam("isPublic") @DefaultValue("false") String isPublicParam, - @FormParam("officialWebsiteURL") String officialWebsiteURLString, - @FormParam("baseURL") String baseURLString, - @FormParam("leaderboardGroupIds") List leaderboardGroupIdsList, + @FormParam("officialWebsiteURL") String officialWebsiteURLParam, + @FormParam("baseURL") String baseURLParam, + @FormParam("leaderboardGroupIds") List leaderboardGroupIdsListParam, @FormParam("createLeaderboardGroup") @DefaultValue("false") String createLeaderboardGroupParam, @FormParam("createRegatta") @DefaultValue("false") String createRegattaParam, - @FormParam("boatClassName") String boatClassName) + @FormParam("boatClassName") String boatClassNameParam) throws MalformedURLException, ParseException, NotFoundException { -// SecurityUtils.getSubject().checkPermission(Permission.EVENT.getStringPermission(Mode.CREATE)); + if(DEBUG_SECURITY_CHECK) SecurityUtils.getSubject().checkPermission(Permission.EVENT.getStringPermission(Mode.CREATE)); + + Event event = validateAndCreateEvent(eventNameParam, eventDescriptionParam, startDateParam, endDateParam, venueNameParam, + isPublicParam, officialWebsiteURLParam, baseURLParam, leaderboardGroupIdsListParam, + createLeaderboardGroupParam, createRegattaParam, boatClassNameParam); + + return ok(event.getId().toString(), MediaType.TEXT_PLAIN); + } + + @POST + @Path("/addRegatta") + @Consumes("text/plain") + @Produces("text/plain") + public Response addRegatta(@FormParam("regattaName") String regattaNameParam, + @FormParam("boatClassName") String boatClassNameParam, + @FormParam("startDate") String startDateParam, + @FormParam("eventId") String eventIdParam, + @FormParam("endDate") String endDateParam, + @FormParam("persistent") @DefaultValue("true") String isPersistentParam, + @FormParam("scoringScheme") @DefaultValue("LOW_POINT") String scoringSchemeParam, + @FormParam("courseAreaId") String courseAreaIdParam, + @FormParam("buoyZoneRadiusInHullLengths") @DefaultValue("3.0") String buoyZoneRadiusInHullLengthsParam, + @FormParam("useStartTimeInterference") @DefaultValue("true") String useStartTimeInterferenceParam, + @FormParam("controlTrackingFromStartAndFinishTimes") @DefaultValue("false") String controlTrackingFromStartAndFinishTimesParam, + @FormParam("rankingMetric") @DefaultValue("ONE_DESIGN") String rankingMetricParam) throws ParseException, NotFoundException + { + if(DEBUG_SECURITY_CHECK) SecurityUtils.getSubject().checkPermission(Permission.REGATTA.getStringPermissionForObjects(Mode.CREATE, regattaNameParam)); + if(DEBUG_SECURITY_CHECK) SecurityUtils.getSubject().checkPermission(Permission.EVENT.getStringPermission(Mode.READ)); + + Regatta regatta = validateAndCreateRegatta(regattaNameParam, boatClassNameParam, startDateParam, eventIdParam, endDateParam, + isPersistentParam, scoringSchemeParam, courseAreaIdParam, buoyZoneRadiusInHullLengthsParam, + useStartTimeInterferenceParam, controlTrackingFromStartAndFinishTimesParam, rankingMetricParam); + return ok(regatta.getId().toString(), MediaType.TEXT_PLAIN); + } + + + + @POST + @Path("/addCourseArea") + @Consumes("text/plain") + @Produces("text/plain") + public Response addCourseArea(@FormParam("eventId") String eventIdParam, + @FormParam("courseAreaName") @DefaultValue("Default") String courseAreaNameParam) + { + if(DEBUG_SECURITY_CHECK) SecurityUtils.getSubject().checkPermission(Permission.EVENT.getStringPermission(Mode.CREATE)); + + if(eventIdParam == null) throw new IllegalArgumentException(ExceptionManager.parameterRequiredMsg("eventId")); + if(courseAreaNameParam == null) throw new IllegalArgumentException(ExceptionManager.parameterRequiredMsg("courseAreaName")); + + UUID eventId = toUUID(eventIdParam); + CourseArea courseArea = addCourseArea(eventId, courseAreaNameParam); + + return ok(courseArea.getId().toString(), MediaType.TEXT_PLAIN); + } + + @POST + @Path("/addLeaderboard") + @Consumes("text/plain") + @Produces("text/plain") + public Response addLeaderboard(@FormParam("regattaName") String regattaNameParam, + @FormParam("discardThreshold") List discardThresholdsParam) + { + if(DEBUG_SECURITY_CHECK) SecurityUtils.getSubject().checkPermission(Permission.LEADERBOARD.getStringPermissionForObjects(Mode.CREATE, regattaNameParam)); + + if(regattaNameParam == null) throw new IllegalArgumentException(ExceptionManager.parameterRequiredMsg("regattaName")); + + int[] discardThresholds = discardThresholdsParam == null ? new int[0] : discardThresholdsParam.stream().mapToInt(i -> i).toArray(); + + RegattaLeaderboard leaderboard = addLeaderboard(regattaNameParam, discardThresholds); + + return ok(leaderboard.getName(), MediaType.TEXT_PLAIN); + } + + @POST + @Path("/addLeaderboardGroup") + @Consumes("text/plain") + @Produces("text/plain") + public Response addLeaderboardGroup(@FormParam("eventId") String eventIdParam, + @FormParam("leaderboardGroupName") String leaderboardGroupNameParam, + @FormParam("leaderboardGroupDescription") String leaderboardGroupDescriptionParam, + @FormParam("leaderboardGroupDisplayName") String leaderboardGroupDisplayNameParam, + @FormParam("displayGroupsInReverseOrder") String displayGroupsInReverseOrderParam, + @FormParam("leaderboardNames") List leaderboardNamesParam, + @FormParam("overallLeaderboardDiscardThresholds") List overallLeaderboardDiscardThresholdsParam, + @FormParam("overallLeaderboardScoringSchemeType") @DefaultValue("LOW_POINT") String overallLeaderboardScoringSchemeTypeParam) throws NotFoundException + { + if(DEBUG_SECURITY_CHECK) SecurityUtils.getSubject().checkPermission(Permission.LEADERBOARD_GROUP.getStringPermissionForObjects(Mode.CREATE, leaderboardGroupNameParam)); + + LeaderboardGroup leaderboardGroup = validateAndAddLeaderboardGroup(eventIdParam, leaderboardGroupNameParam, + leaderboardGroupDescriptionParam, leaderboardGroupDescriptionParam, displayGroupsInReverseOrderParam, + leaderboardNamesParam, overallLeaderboardDiscardThresholdsParam, + overallLeaderboardScoringSchemeTypeParam); + + return ok(leaderboardGroup.getId().toString(), MediaType.TEXT_PLAIN); + } + + private Event validateAndCreateEvent(String eventNameParam, String eventDescriptionParam, String startDateParam, String endDateParam, String venueNameParam, + String isPublicParam, String officialWebsiteURLParam, String baseURLParam, ListleaderboardGroupIdsListParam, + String createLeaderboardGroupParam, String createRegattaParam, String boatClassNameParam) throws ParseException, MalformedURLException, NotFoundException{ + boolean isPublic = Boolean.parseBoolean(isPublicParam); boolean createRegatta = Boolean.parseBoolean(createRegattaParam); boolean createLeaderboardGroup = Boolean.parseBoolean(createLeaderboardGroupParam); - if (eventName == null) { - return getParameterMissingResponse("eventName"); - } - - if (venueName == null) { - return getParameterMissingResponse("venueName"); - } + if(eventNameParam == null) throw new IllegalArgumentException(ExceptionManager.parameterRequiredMsg("eventName")); + if(venueNameParam == null) throw new IllegalArgumentException(ExceptionManager.parameterRequiredMsg("venueName")); + if(createRegatta && boatClassNameParam == null) throw new IllegalArgumentException(ExceptionManager.parameterRequiredMsg("boatClassName")); - if (createRegatta) { - if (boatClassName == null) { - return getParameterMissingResponse("boatClassName"); - } - } - - if (eventDescription == null) { - eventDescription = eventName; - } - - MillisecondsTimePoint startDate = null; - try { - startDate = startDateString != null ? new MillisecondsTimePoint(df.parse(startDateString)) - : new MillisecondsTimePoint(new Date()); - } catch (ParseException e) { - return getInvalidDateFormatResponse(startDateString); - } - - MillisecondsTimePoint endDate = null; - try { - endDate = endDateString != null ? new MillisecondsTimePoint(df.parse(endDateString)) - : new MillisecondsTimePoint(addOneWeek(startDate.asDate())); - } catch (ParseException e) { - return getInvalidDateFormatResponse(endDateString); - } - - URL officialWebsiteURL = null; - try { - officialWebsiteURL = officialWebsiteURLString != null ? new URL(officialWebsiteURLString) : null; - } catch (MalformedURLException e) { - return getInvalidURLFormatResponse(officialWebsiteURLString); - } - - URL baseURL = null; - try { - baseURL = baseURLString != null ? new URL(baseURLString) : null; - } catch (MalformedURLException e) { - return getInvalidURLFormatResponse(baseURLString); - } - - List leaderboardGroupIds = new ArrayList(); - if(leaderboardGroupIdsList != null){ - leaderboardGroupIds = leaderboardGroupIdsList.stream().map(id -> UUID.fromString(id)) - .collect(Collectors.toList()); - } - + String eventName = eventNameParam; + String venueName = venueNameParam; + String boatClassName = boatClassNameParam; + String eventDescription = eventDescriptionParam == null ? eventNameParam : eventDescriptionParam; + MillisecondsTimePoint startDate = startDateParam == null ? now() : toMillisecondsTimePoint(startDateParam); + MillisecondsTimePoint endDate = endDateParam == null ? new MillisecondsTimePoint(addOneWeek(startDate.asDate())): toMillisecondsTimePoint(endDateParam) ; + URL officialWebsiteURL = officialWebsiteURLParam == null ? null : toURL(officialWebsiteURLParam); + URL baseURL = baseURLParam == null ? null : toURL(baseURLParam); + List leaderboardGroupIds = leaderboardGroupIdsListParam == null ? new ArrayList() : toUUIDList(leaderboardGroupIdsListParam); UUID eventId = UUID.randomUUID(); // ignoring sailorsInfoWebsiteURLs, images, videos @@ -168,277 +230,73 @@ public class EventsResource extends AbstractSailingServerResource { CourseArea courseArea = addCourseArea(event.getId(), "Default"); if (createLeaderboardGroup) { - addLeaderboardGroup(event.getName(), event.getDescription(), null, new ArrayList(), false, event, ScoringSchemeType.LOW_POINT, new int[0]); + addLeaderboardGroup(event.getId().toString(), event.getName(), event.getName(), null, null, null, null, null); } if (createRegatta) { - addRegatta(event.getName(), true, false, true, 3.0, courseArea.getId(), boatClassName, new MillisecondsTimePoint(new Date()), new MillisecondsTimePoint(addOneWeek(new Date())), getService().getBaseDomainFactory().createScoringScheme(ScoringSchemeType.LOW_POINT), RankingMetrics.ONE_DESIGN, UUID.randomUUID(), new RegattaCreationParametersDTO( - createDefaultSeriesCreationParameters())); - + addRegatta(event.getName(), boatClassName, startDateParam, null, endDateParam, null, null, + courseArea.getId().toString(), null, null, null, null); } - - return ok(event.getId().toString(), MediaType.TEXT_PLAIN); + + return event; } - - @POST - @Path("/addRegatta") - @Consumes("text/plain") - @Produces("text/plain") - public Response addRegatta(@FormParam("regattaName") String regattaName, - @FormParam("boatClassName") String boatClassNameParam, - @FormParam("startDate") String startDateString, - @FormParam("eventId") String eventIdParam, - @FormParam("endDate") String endDateString, - @FormParam("persistent") @DefaultValue("true") String isPersistentParam, - @FormParam("scoringScheme") @DefaultValue("LOW_POINT") String scoringSchemeParam, - @FormParam("courseAreaId") String courseAreaIdParam, - @FormParam("buoyZoneRadiusInHullLengths") @DefaultValue("3.0") String buoyZoneRadiusInHullLengthsParam, - @FormParam("useStartTimeInterference") @DefaultValue("true") String useStartTimeInterferenceParam, - @FormParam("controlTrackingFromStartAndFinishTimes") @DefaultValue("false") String controlTrackingFromStartAndFinishTimesParam, - @FormParam("rankingMetric") @DefaultValue("ONE_DESIGN") String rankingMetricParam) - { -// SecurityUtils.getSubject().checkPermission(Permission.REGATTA.getStringPermissionForObjects(Mode.CREATE, regattaName)); -// SecurityUtils.getSubject().checkPermission(Permission.EVENT.getStringPermission(Mode.READ)); + private Regatta validateAndCreateRegatta(String regattaNameParam, String boatClassNameParam, String startDateParam, + String eventIdParam, String endDateParam, String isPersistentParam, String scoringSchemeParam, String courseAreaIdParam, String buoyZoneRadiusInHullLengthsParam, + String useStartTimeInterferenceParam, String controlTrackingFromStartAndFinishTimesParam, String rankingMetricParam) throws ParseException, NotFoundException{ - boolean isPersistent = Boolean.parseBoolean(isPersistentParam); - boolean controlTrackingFromStartAndFinishTimes = Boolean.parseBoolean(controlTrackingFromStartAndFinishTimesParam); - boolean useStartTimeInterference = Boolean.parseBoolean(useStartTimeInterferenceParam); - double buoyZoneRadiusInHullLengths = Double.parseDouble(buoyZoneRadiusInHullLengthsParam); + boolean isPersistent = isPersistentParam == null ? true : Boolean.parseBoolean(isPersistentParam); + boolean controlTrackingFromStartAndFinishTimes = controlTrackingFromStartAndFinishTimesParam == null ? false : Boolean.parseBoolean(controlTrackingFromStartAndFinishTimesParam); + boolean useStartTimeInterference = useStartTimeInterferenceParam == null ? true : Boolean.parseBoolean(useStartTimeInterferenceParam); + double buoyZoneRadiusInHullLengths = buoyZoneRadiusInHullLengthsParam == null ? 3.0 : Double.parseDouble(buoyZoneRadiusInHullLengthsParam); - if (regattaName == null) { - return getParameterMissingResponse("regattaName"); - } - - if (boatClassNameParam == null) { - return getParameterMissingResponse("boatClassName"); - } - - if (eventIdParam == null && courseAreaIdParam == null) { - return getMissingParametersResponse(Arrays.asList("eventId", "courseAreaId")); - } - - UUID courseAreaId = null; - - if (eventIdParam != null) { - UUID eventId = null; - Event event = null; - try { - eventId = UUID.fromString(eventIdParam); - } catch (IllegalArgumentException e) { - return getInvalidIdFormatResponse(eventIdParam); - } - - event = getService().getEvent(eventId); - if (event == null){ - return getBadEventErrorResponse(eventIdParam); - } - - CourseArea courseArea = getDefaultCourseArea(event); - courseAreaId = courseArea != null ? courseArea.getId() : null; - } - - if (courseAreaIdParam != null) { - try { - courseAreaId = UUID.fromString(courseAreaIdParam); - } catch (IllegalArgumentException e) { - return getInvalidIdFormatResponse(courseAreaIdParam); - } - } - - String boatClassName = null; - try { - boatClassName = BoatClassMasterdata.valueOf(boatClassNameParam).getDisplayName(); - } catch (IllegalArgumentException e) { - String correctValues = getBoatClassDisplayNames(); - return getValueUnknownResponse(boatClassNameParam, correctValues); - } - - MillisecondsTimePoint startDate = null; - try { startDate = startDateString != null ? new MillisecondsTimePoint(df.parse(startDateString)) : new MillisecondsTimePoint(new Date());; - } catch (ParseException e) { - return getInvalidDateFormatResponse(startDateString); - } - - MillisecondsTimePoint endDate = null; - try { - endDate = endDateString != null ? new MillisecondsTimePoint(df.parse(endDateString)) : new MillisecondsTimePoint(addOneWeek(startDate.asDate()));; - } catch (ParseException e) { - return getInvalidDateFormatResponse(endDateString); - } - - ScoringScheme scoringScheme = null; - ScoringSchemeType type = null; - if (scoringSchemeParam != null) { - try { - type = ScoringSchemeType.valueOf(scoringSchemeParam); - scoringScheme = getService().getBaseDomainFactory().createScoringScheme(type); - } catch (IllegalArgumentException e) { - String correctValues = getEnumValuesAsString(ScoringSchemeType.class); - return getValueUnknownResponse(scoringSchemeParam, correctValues); - } - } - - RankingMetrics rankingMetric = null; - if (rankingMetricParam != null) { - try { - rankingMetric = RankingMetrics.valueOf(rankingMetricParam); - } catch (IllegalArgumentException e) { - String correctValues = getEnumValuesAsString(RankingMetrics.class); - return getValueUnknownResponse(rankingMetricParam, correctValues); - } - } - + if(regattaNameParam == null) throw new IllegalArgumentException(ExceptionManager.parameterRequiredMsg("regattaName")); + if(boatClassNameParam == null) throw new IllegalArgumentException(ExceptionManager.parameterRequiredMsg("boatClassName")); + if(eventIdParam == null && courseAreaIdParam == null) throw new IllegalArgumentException(ExceptionManager.atLeastOneParameterRequiredMsg("eventId", "courseAreaId")); + + String regattaName = regattaNameParam; + UUID eventId = eventIdParam == null ? null : toUUID(eventIdParam); + UUID courseAreaId = courseAreaIdParam == null ? null : toUUID(courseAreaIdParam); + String boatClassName = boatClassNameParam == null ? null : getBoatClassDisplayName(boatClassNameParam); + MillisecondsTimePoint startDate = startDateParam == null ? now() : toMillisecondsTimePoint(startDateParam); + MillisecondsTimePoint endDate = endDateParam == null ? new MillisecondsTimePoint(addOneWeek(startDate.asDate())): toMillisecondsTimePoint(endDateParam) ; + ScoringScheme scoringScheme = scoringSchemeParam == null ? createScoringScheme("LOW_POINT") : createScoringScheme(scoringSchemeParam); + RankingMetrics rankingMetric = rankingMetricParam == null ? createRankingMetric("ONE_DESIGN") : createRankingMetric(rankingMetricParam); + RegattaCreationParametersDTO regattaCreationParametersDTO = new RegattaCreationParametersDTO(createDefaultSeriesCreationParameters()); UUID regattaId = UUID.randomUUID(); - - // using default seriesCreationParameters - RegattaCreationParametersDTO regattaCreationParametersDTO = new RegattaCreationParametersDTO( - createDefaultSeriesCreationParameters()); + + // if courseAreaId not provided then get it from eventId + if(eventId != null && courseAreaId == null) courseAreaId = getDefaultCourseArea(getEvent(eventId)).getId(); Regatta regatta = addRegatta(regattaName, isPersistent, controlTrackingFromStartAndFinishTimes, useStartTimeInterference, buoyZoneRadiusInHullLengths, courseAreaId, boatClassName, startDate, endDate, scoringScheme, rankingMetric, regattaId, regattaCreationParametersDTO); - - return ok(regatta.getId().toString(), MediaType.TEXT_PLAIN); + return regatta; } - @POST - @Path("/addCourseArea") - @Consumes("text/plain") - @Produces("text/plain") - public Response addCourseArea(@FormParam("eventId") String eventIdParam, - @FormParam("courseAreaName") @DefaultValue("Default") String courseAreaName) { - -// SecurityUtils.getSubject().checkPermission(Permission.COURSE_AREA.getStringPermission(Mode.CREATE)); -// SecurityUtils.getSubject().checkPermission(Permission.EVENT.getStringPermission(Mode.CREATE)); + private LeaderboardGroup validateAndAddLeaderboardGroup(String eventIdParam, String leaderboardGroupNameParam, + String leaderboardGroupDescriptionParam, String leaderboardGroupDisplayNameParam, String displayGroupsInReverseOrderParam, + List leaderboardNamesParam, List overallLeaderboardDiscardThresholdsParam, String overallLeaderboardScoringSchemeTypeParam) throws NotFoundException{ - if (eventIdParam == null) { - return getParameterMissingResponse("eventId"); - } - - if (courseAreaName == null) { - return getParameterMissingResponse("courseAreaName"); - } - - UUID eventId = null; - try { - eventId = UUID.fromString(eventIdParam); - } catch (IllegalArgumentException e) { - return getInvalidIdFormatResponse(eventIdParam); - } - - CourseArea result = addCourseArea(eventId, courseAreaName); - - return ok(result.getId().toString(), MediaType.TEXT_PLAIN); - } - - private CourseArea addCourseArea(UUID eventId, String courseAreaName) { - String[] courseAreaNames = new String[] { courseAreaName }; - UUID[] courseAreaIds = new UUID[] { UUID.randomUUID() }; - CourseArea[] courseAreas = null; - CourseArea result = null; - try { - courseAreas = getService().apply(new AddCourseAreas(eventId, courseAreaNames, courseAreaIds)); - result = courseAreas[0]; - } catch (IllegalArgumentException e) { -// return getBadEventErrorResponse(eventId.toString()); - } - return result; - } - - @POST - @Path("/addLeaderboard") - @Consumes("text/plain") - @Produces("text/plain") - public Response addLeaderboard(@FormParam("regattaName") String regattaName, - @FormParam("discardThreshold") List discardThresholdsParam) { - -// SecurityUtils.getSubject().checkPermission(Permission.LEADERBOARD.getStringPermissionForObjects(Mode.CREATE, regattaName)); + if(eventIdParam == null) throw new IllegalArgumentException(ExceptionManager.parameterRequiredMsg("eventId")); - if (regattaName == null) { - return getParameterMissingResponse("regattaName"); - } - - if (getService().getRegatta(new RegattaName(regattaName)) == null) { - return getBadObjectErrorResponse(Regatta.class.getSimpleName(), regattaName); - } - - int[] discardThresholds = discardThresholdsParam != null - ? discardThresholdsParam.stream().mapToInt(i -> i).toArray() : null; - - final RegattaLeaderboard leaderboard = addLeaderboard(regattaName, discardThresholds); - - return ok(leaderboard.getName(), MediaType.TEXT_PLAIN); + UUID eventId = toUUID(eventIdParam); + Event event = getEvent(eventId); + boolean displayGroupsInReverseOrder = displayGroupsInReverseOrderParam == null ? false : Boolean.parseBoolean(displayGroupsInReverseOrderParam); + String leaderboardGroupDescription = leaderboardGroupDescriptionParam == null ? leaderboardGroupNameParam : leaderboardGroupDescriptionParam; + String leaderboardGroupDisplayName = leaderboardGroupDisplayNameParam == null ? null : leaderboardGroupDisplayNameParam; + String leaderboardGroupName = leaderboardGroupNameParam == null ? event.getName() : leaderboardGroupNameParam; + ScoringSchemeType overallLeaderboardScoringSchemeType = overallLeaderboardScoringSchemeTypeParam == null ? getScoringSchemeType("LOW_POINT") : getScoringSchemeType(overallLeaderboardScoringSchemeTypeParam); + int[] overallLeaderboardDiscardThresholds = overallLeaderboardDiscardThresholdsParam == null ? new int[0] : overallLeaderboardDiscardThresholdsParam.stream().mapToInt(i -> i).toArray(); + List leaderboardNames = leaderboardNamesParam == null ? new ArrayList() : leaderboardNamesParam; + + LeaderboardGroup leaderboardGroup = getService().addLeaderboardGroup(event.getId(), leaderboardGroupName, leaderboardGroupDescription, leaderboardGroupDisplayName, displayGroupsInReverseOrder, leaderboardNames, overallLeaderboardDiscardThresholds, overallLeaderboardScoringSchemeType); + updateEvent(event, leaderboardGroup); + + return leaderboardGroup; } - - @POST - @Path("/addLeaderboardGroup") - @Consumes("text/plain") - @Produces("text/plain") - public Response addLeaderboardGroup(@FormParam("eventId") String eventIdParam, - @FormParam("leaderboardGroupName") String leaderboardGroupName, - @FormParam("leaderboardGroupDescription") String leaderboardGroupDescription, - @FormParam("leaderboardGroupDisplayName") String leaderboardGroupDisplayName, - @FormParam("displayGroupsInReverseOrder") String displayGroupsInReverseOrderParam, - @FormParam("leaderboardNames") List leaderboardNames, - @FormParam("overallLeaderboardDiscardThresholds") List overallLeaderboardDiscardThresholdsParam, - @FormParam("overallLeaderboardScoringSchemeType") String overallLeaderboardScoringSchemeTypeParam) { - -// SecurityUtils.getSubject().checkPermission(Permission.LEADERBOARD_GROUP.getStringPermissionForObjects(Mode.CREATE, leaderboardGroupName)); - - if (eventIdParam == null) { - return getParameterMissingResponse("eventId"); - } - - if (leaderboardGroupDescription == null) { - leaderboardGroupDescription = leaderboardGroupName; - } - - boolean displayGroupsInReverseOrder = Boolean.parseBoolean(displayGroupsInReverseOrderParam); - UUID eventId = null; - try { - eventId = UUID.fromString(eventIdParam); - } catch (IllegalArgumentException e) { - return getInvalidIdFormatResponse(eventIdParam); - } - - Event event = getService().getEvent(eventId); - if (event == null) { - return getBadEventErrorResponse(eventId.toString()); - } - - if (leaderboardGroupName == null) { - leaderboardGroupName = event.getName(); - } - - ScoringSchemeType overallLeaderboardScoringSchemeType = null; - if (overallLeaderboardScoringSchemeTypeParam != null) { - try { - overallLeaderboardScoringSchemeType = ScoringSchemeType - .valueOf(overallLeaderboardScoringSchemeTypeParam); - } catch (IllegalArgumentException e) { - String correctValues = getEnumValuesAsString(ScoringSchemeType.class); - return getValueUnknownResponse(overallLeaderboardScoringSchemeTypeParam, correctValues); - } - } - - int[] overallLeaderboardDiscardThresholds = overallLeaderboardDiscardThresholdsParam != null - ? overallLeaderboardDiscardThresholdsParam.stream().mapToInt(i -> i).toArray() : new int[0]; - - if(leaderboardNames == null){ - leaderboardNames = new ArrayList(); - } - - LeaderboardGroup leaderboardGroup = addLeaderboardGroup(leaderboardGroupName, leaderboardGroupDescription, - leaderboardGroupDisplayName, leaderboardNames, displayGroupsInReverseOrder, event, - overallLeaderboardScoringSchemeType, overallLeaderboardDiscardThresholds); - - return ok(leaderboardGroup.getId().toString(), MediaType.TEXT_PLAIN); - } - - private Event createEvent(String eventName, String eventDescription, String venueName, boolean isPublic, MillisecondsTimePoint startDate, MillisecondsTimePoint endDate, URL officialWebsiteURL, URL baseURL, List leaderboardGroupIds, UUID eventId, Map sailorsInfoWebsiteURLs, @@ -447,13 +305,23 @@ public class EventsResource extends AbstractSailingServerResource { .apply(new CreateEvent(eventName, eventDescription, startDate, endDate, venueName, isPublic, eventId, officialWebsiteURL, baseURL, sailorsInfoWebsiteURLs, images, videos, leaderboardGroupIds)); } - + + private CourseArea addCourseArea(UUID eventId, String courseAreaName) { + String[] courseAreaNames = new String[] { courseAreaName }; + UUID[] courseAreaIds = new UUID[] { UUID.randomUUID() }; + try { + return getService().apply(new AddCourseAreas(eventId, courseAreaNames, courseAreaIds))[0]; + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException("Course area could not be added to event."); + } + } private Regatta addRegatta(String regattaName, boolean isPersistent, boolean controlTrackingFromStartAndFinishTimes, boolean useStartTimeInterference, double buoyZoneRadiusInHullLengths, UUID courseAreaId, String boatClassName, MillisecondsTimePoint startDate, MillisecondsTimePoint endDate, ScoringScheme scoringScheme, RankingMetrics rankingMetric, UUID regattaId, RegattaCreationParametersDTO regattaCreationParametersDTO) { + AddSpecificRegatta operation = new AddSpecificRegatta(regattaName, boatClassName, startDate, endDate, regattaId, regattaCreationParametersDTO, isPersistent, scoringScheme, courseAreaId, buoyZoneRadiusInHullLengths, useStartTimeInterference, controlTrackingFromStartAndFinishTimes, rankingMetric); @@ -461,6 +329,7 @@ public class EventsResource extends AbstractSailingServerResource { Regatta regatta = getService().apply(operation); addLeaderboard(regattaName, new int[0]); + return regatta; } @@ -469,31 +338,6 @@ public class EventsResource extends AbstractSailingServerResource { .filter(c -> c.getName().equals("Default")).findFirst().orElse(null); } - private LeaderboardGroup addLeaderboardGroup(String leaderboardGroupName, String leaderboardGroupDescription, - String leaderboardGroupDisplayName, List leaderboardNames, boolean displayGroupsInReverseOrder, - Event event, ScoringSchemeType overallLeaderboardScoringSchemeType, - int[] overallLeaderboardDiscardThresholds) { - LeaderboardGroup leaderboardGroup = createLeaderboardGroup(leaderboardGroupName, leaderboardGroupDescription, - leaderboardGroupDisplayName, leaderboardNames, displayGroupsInReverseOrder, - overallLeaderboardScoringSchemeType, overallLeaderboardDiscardThresholds); - - updateEvent(event, leaderboardGroup); - return leaderboardGroup; - } - - private LeaderboardGroup createLeaderboardGroup(String leaderboardGroupName, String leaderboardGroupDescription, - String leaderboardGroupDisplayName, List leaderboardNames, boolean displayGroupsInReverseOrder, - ScoringSchemeType overallLeaderboardScoringSchemeType, int[] overallLeaderboardDiscardThresholds) { - LeaderboardGroup leaderboardGroup = null; - try { - leaderboardGroup = getService().apply(new CreateLeaderboardGroup(leaderboardGroupName, - leaderboardGroupDescription, leaderboardGroupDisplayName, displayGroupsInReverseOrder, - leaderboardNames, overallLeaderboardDiscardThresholds, overallLeaderboardScoringSchemeType)); - } catch (IllegalArgumentException e) { - return null; - } - return leaderboardGroup; - } private void updateEvent(Event event, LeaderboardGroup leaderboardGroup){ List newLeaderboardGroupIds = new ArrayList<>(); @@ -508,17 +352,16 @@ public class EventsResource extends AbstractSailingServerResource { } private RegattaLeaderboard addLeaderboard(String regattaName, int[] discardThresholds) { - final RegattaLeaderboard leaderboard = createRegattaLeaderboard(regattaName, discardThresholds); - - if(leaderboard == null){ -// return getObjectAlreadyExistsResponse(RegattaLeaderboard.class, regattaName); + RegattaLeaderboard leaderboard = null; + try { + leaderboard = createRegattaLeaderboard(regattaName, discardThresholds); + } catch (IllegalArgumentException e) { + throw e; } - addLeaderboardToDefaultLeaderboardGroup(leaderboard); return leaderboard; } - private RegattaLeaderboard createRegattaLeaderboard(String regattaName, int[] discardThresholds) { return getService() .apply(new CreateRegattaLeaderboard(new RegattaName(regattaName), regattaName, discardThresholds)); @@ -559,10 +402,7 @@ public class EventsResource extends AbstractSailingServerResource { private > String getEnumValuesAsString(Class e) { return EnumSet.allOf(e).stream().map(en -> en.name()).collect(Collectors.joining(", ")); } - - private String getBoatClassDisplayNames() { - return EnumSet.allOf(BoatClassMasterdata.class).stream().map(en -> en.getDisplayName()).collect(Collectors.joining(", ")); - } + private LinkedHashMap createDefaultSeriesCreationParameters() { final LinkedHashMap seriesCreationParameters = new LinkedHashMap<>(); @@ -604,7 +444,7 @@ public class EventsResource extends AbstractSailingServerResource { Response response; UUID eventUuid; try { - eventUuid = UUID.fromString(eventId); + eventUuid = toUUID(eventId); } catch (IllegalArgumentException e) { return getBadEventErrorResponse(eventId); } @@ -637,7 +477,7 @@ public class EventsResource extends AbstractSailingServerResource { Response response; UUID eventUuid; try { - eventUuid = UUID.fromString(eventId); + eventUuid = toUUID(eventId); } catch (IllegalArgumentException e) { return getBadEventErrorResponse(eventId); } @@ -671,67 +511,92 @@ public class EventsResource extends AbstractSailingServerResource { .type(MediaType.TEXT_PLAIN).build(); } - private Response getBadObjectErrorResponse(String className, String id) { - return Response.status(Status.NOT_FOUND).entity("Could not find object of type " + className - + " with identifier '" + StringEscapeUtils.escapeHtml(id) + "'.").type(MediaType.TEXT_PLAIN).build(); - } - - private Response getObjectAlreadyExistsResponse(Object object, String id) { - return Response - .status(Status.BAD_REQUEST).entity("The object of type " + object.getClass().getSimpleName() - + " with id '" + StringEscapeUtils.escapeHtml(id) + "' already exists.") - .type(MediaType.TEXT_PLAIN).build(); - } - - private Response getParameterMissingResponse(String parameter) { - return Response.status(Status.BAD_REQUEST) - .entity("The parameter " + StringEscapeUtils.escapeHtml(parameter) + " is required.") - .type(MediaType.TEXT_PLAIN).build(); - } - - private Response getInvalidDateFormatResponse(String date) { - return Response.status(Status.BAD_REQUEST).entity( - "The date " + StringEscapeUtils.escapeHtml(date) + " does not follow the date pattern \"dd-MM-yyyy\".") - .type(MediaType.TEXT_PLAIN).build(); - } - - private Response getInvalidURLFormatResponse(String url) { - return Response.status(Status.BAD_REQUEST) - .entity("The format of the url " + StringEscapeUtils.escapeHtml(url) + " is incorrect.") - .type(MediaType.TEXT_PLAIN).build(); - } - - private Response getInvalidIdFormatResponse(String id) { - return Response.status(Status.BAD_REQUEST) - .entity("The format of the id " + StringEscapeUtils.escapeHtml(id) + " is incorrect.") - .type(MediaType.TEXT_PLAIN).build(); - } - - private Response getValueUnknownResponse(String value, String correctValues) { - return Response.status(Status.BAD_REQUEST) - .entity("The value \"" + StringEscapeUtils.escapeHtml(value) - + "\" is not recognized. Correct values are: " + correctValues) - .type(MediaType.TEXT_PLAIN).build(); - } - - private Response getLeaderboardNotFoundResponse(List leaderboardNames) { - return Response.status(Status.BAD_REQUEST) - .entity("One of the following leaderboards was not found: \"" - + StringEscapeUtils.escapeHtml(leaderboardNames.toString()) + "\" was not found.") - .type(MediaType.TEXT_PLAIN).build(); - } - - private Response getMissingParametersResponse(List parameters) { - return Response.status(Status.BAD_REQUEST) - .entity("At least one of the following parameters must be provided: " - + parameters.stream().collect(Collectors.joining(", ")) + "\" was not found.") - .type(MediaType.TEXT_PLAIN).build(); - } - private Date addOneWeek(Date date) { Calendar c = Calendar.getInstance(); c.setTime(date); c.add(Calendar.WEEK_OF_MONTH, 1); return c.getTime(); } + + private MillisecondsTimePoint toMillisecondsTimePoint(String startDateParam) throws ParseException { + try { + return new MillisecondsTimePoint(df.parse(startDateParam)); + } catch (ParseException e) { + throw new ParseException(ExceptionManager.invalidDateFormatMsg(startDateParam),0); + } + } + + private MillisecondsTimePoint now() { + return new MillisecondsTimePoint(new Date()); + } + + private URL toURL(String url) throws MalformedURLException{ + try { + return new URL(url); + } catch (MalformedURLException e) { + throw new MalformedURLException(ExceptionManager.invalidURLFormatMsg(url)); + } + } + + private List toUUIDList(List list){ + return list.stream().map(id -> toUUID(id)) + .collect(Collectors.toList()); + } + + + private UUID toUUID(String id) { + try{ + return UUID.fromString(id); + } + catch(IllegalArgumentException e){ + throw new IllegalArgumentException(ExceptionManager.invalidIdFormatMsg(id)); + } + } + + private Event getEvent(UUID eventId) throws NotFoundException{ + Event event = getService().getEvent(eventId); + if(event != null){ + return event; + } + throw new NotFoundException(ExceptionManager.objectNotFoundMsg(Event.class.getSimpleName(), eventId)); + } + + private RankingMetrics createRankingMetric(String rankingMetricParam) { + try{ + return RankingMetrics.valueOf(rankingMetricParam); + } + catch(IllegalArgumentException e){ + throw new IllegalArgumentException(ExceptionManager.incorrectParameterValue(rankingMetricParam, getEnumValuesAsString(RankingMetrics.class))); + } + } + + + private ScoringScheme createScoringScheme(String scoringSchemeParam) { + ScoringScheme scoringScheme = getService().getBaseDomainFactory().createScoringScheme(getScoringSchemeType(scoringSchemeParam)); + return scoringScheme; + } + + private ScoringSchemeType getScoringSchemeType(String scoringSchemeTypeParam) { + try{ + return ScoringSchemeType.valueOf(scoringSchemeTypeParam); + } + catch(IllegalArgumentException e){ + throw new IllegalArgumentException(ExceptionManager.incorrectParameterValue(scoringSchemeTypeParam, getEnumValuesAsString(ScoringSchemeType.class))); + } + } + + + private String getBoatClassDisplayName(String boatClassNameParam) { + try{ + return BoatClassMasterdata.valueOf(boatClassNameParam).getDisplayName(); + } + catch(IllegalArgumentException e){ + throw new IllegalArgumentException(ExceptionManager.incorrectParameterValue(boatClassNameParam, getEnumValuesAsString(BoatClassMasterdata.class))); + } + } + + private Regatta getRegatta(String regattaNameParam) { + return getService().getRegatta(new RegattaName(regattaNameParam)); + } + } 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 607a9eb3938..1f86cd7f479 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 @@ -5,6 +5,7 @@ import java.util.Set; import javax.ws.rs.core.Application; +import com.sap.sailing.server.gateway.jaxrs.exceptions.ExceptionManager; import com.sap.sse.security.jaxrs.ShiroAuthorizationExceptionTo401ResponseMapper; @@ -26,8 +27,9 @@ public class RestApiApplication extends Application { classes.add(TrackedRaceListResource.class); classes.add(StatisticsResource.class); - // Exception Mapper + // Exception Mappers classes.add(ShiroAuthorizationExceptionTo401ResponseMapper.class); + classes.add(ExceptionManager.class); return classes; } } diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/exceptions/ExceptionManager.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/exceptions/ExceptionManager.java new file mode 100644 index 00000000000..d21c047fa7f --- /dev/null +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/exceptions/ExceptionManager.java @@ -0,0 +1,51 @@ +package com.sap.sailing.server.gateway.jaxrs.exceptions; + +import java.util.Arrays; +import java.util.UUID; +import java.util.stream.Collectors; + +import javax.ws.rs.core.Response; +import javax.ws.rs.ext.ExceptionMapper; +import javax.ws.rs.ext.Provider; + +import org.apache.commons.lang.StringEscapeUtils; + + @Provider + public class ExceptionManager implements ExceptionMapper{ + public Response toResponse(Exception exception) { + if(exception instanceof IllegalArgumentException){ + return Response.status(400).entity("IllegalArgumentException: "+exception.getMessage()).type("text/plain").build(); + } + return Response.status(300).entity("Internal Server Error").type("text/plain").build(); + } + + public static String invalidDateFormatMsg(String date) { + return "The date " + StringEscapeUtils.escapeHtml(date) + " does not follow the date pattern \"dd-MM-yyyy\"."; + } + + public static String invalidURLFormatMsg(String url) { + return "The format of the url " + StringEscapeUtils.escapeHtml(url) + " is incorrect."; + } + + public static String parameterRequiredMsg(String param) { + return "The parameter \"" + StringEscapeUtils.escapeHtml(param) + "\" is required."; + } + + public static String atLeastOneParameterRequiredMsg(String... params) { + return "Please provide at least one of the following parameters: "+Arrays.stream(params).collect(Collectors.joining(", ")); + } + + public static String invalidIdFormatMsg(String id){ + return "The format of the id " + StringEscapeUtils.escapeHtml(id) + " is incorrect."; + } + + public static String objectNotFoundMsg(String name, UUID id){ + return "The "+name+" with id " + id + " was not found."; + } + + public static String incorrectParameterValue(String value, String correctValues){ + return "The value \"" + StringEscapeUtils.escapeHtml(value) +"\" is not recognized. Correct values are: " + correctValues; + } + } + +