diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/ErrorResponse.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/ErrorResponse.java new file mode 100644 index 000000000..fa91aa3e6 --- /dev/null +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/ErrorResponse.java @@ -0,0 +1,18 @@ +package edu.internet2.tier.shibboleth.admin.ui.controller; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +/** + * @author Bill Smith (wsmith@unicon.net) + */ +@AllArgsConstructor +@Getter +@Setter +@ToString +public class ErrorResponse { + private String errorCode; + private String errorMessage; +} diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversController.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversController.java index ae75b3f6d..5b24f5788 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversController.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversController.java @@ -1,15 +1,16 @@ package edu.internet2.tier.shibboleth.admin.ui.controller; +import com.fasterxml.jackson.databind.exc.InvalidTypeIdException; import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolver; import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolverValidationService; -import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolverValidator; import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository; - import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -19,6 +20,7 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.support.ServletUriComponentsBuilder; +import java.io.IOException; import java.net.URI; import static edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolverValidator.ValidationResult; @@ -34,6 +36,11 @@ public class MetadataResolversController { @Autowired MetadataResolverValidationService metadataResolverValidationService; + @ExceptionHandler({InvalidTypeIdException.class, IOException.class, HttpMessageNotReadableException.class}) + public ResponseEntity unableToParseJson(Exception ex) { + return ResponseEntity.badRequest().body(new ErrorResponse(HttpStatus.BAD_REQUEST.toString(), ex.getMessage())); + } + @GetMapping("/MetadataResolvers") @Transactional(readOnly = true) public ResponseEntity getAll() { @@ -56,6 +63,10 @@ public ResponseEntity getOne(@PathVariable String resourceId) { @PostMapping("/MetadataResolvers") @Transactional public ResponseEntity create(@RequestBody MetadataResolver newResolver) { + if (resolverRepository.findByName(newResolver.getName()) != null) { + return ResponseEntity.status(HttpStatus.CONFLICT).build(); + } + //TODO: we are disregarding attached filters if any sent from UI. //Only deal with filters via filters endpoints? newResolver.clearAllFilters(); diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolverValidationService.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolverValidationService.java index 26039b81b..4151faeb6 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolverValidationService.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolverValidationService.java @@ -8,7 +8,7 @@ /** * A facade that aggregates {@link MetadataResolverValidator}s available to call just one of them supporting the type of a given resolver. - * If no {@link MetadataResolverValidator}s are configured, conciders provided MetadataResolver as valid. + * If no {@link MetadataResolverValidator}s are configured, considers provided MetadataResolver as valid. *

* Uses chain-of-responsibility design pattern * @@ -22,7 +22,7 @@ public MetadataResolverValidationService(List> vali this.validators = validators != null ? validators : new ArrayList<>(); } - @SuppressWarnings("Uncheked") + @SuppressWarnings("Unchecked") public ValidationResult validateIfNecessary(T metadataResolver) { Optional> validator = this.validators