From 18a016c65315d27544b6eb1e91c7fa3eabd5adff Mon Sep 17 00:00:00 2001 From: Nicola Fulvio Calabria <nicola.calabria@inaf.it> Date: Sat, 17 Apr 2021 00:02:28 +0200 Subject: [PATCH] Refactoring for error detail endpoint development --- .../exception/ContainerNotFoundException.java | 5 +- .../exception/DuplicateNodeException.java | 5 +- .../exception/ErrorSummaryFactory.java | 32 ++++++++++++ .../exception/InternalFaultException.java | 9 ++-- .../exception/InvalidArgumentException.java | 3 +- .../exception/InvalidURIException.java | 13 +++-- .../vospace/exception/LinkFoundException.java | 5 +- .../vospace/exception/NodeBusyException.java | 6 +-- .../exception/NodeNotFoundException.java | 5 +- .../exception/PermissionDeniedException.java | 5 +- .../ProtocolNotSupportedException.java | 6 +-- .../vospace/exception/VOSpaceFaultEnum.java | 50 +++++++++++++++++++ .../VoSpaceErrorSummarizableException.java | 17 ++++--- 13 files changed, 117 insertions(+), 44 deletions(-) create mode 100644 src/main/java/it/inaf/oats/vospace/exception/ErrorSummaryFactory.java create mode 100644 src/main/java/it/inaf/oats/vospace/exception/VOSpaceFaultEnum.java diff --git a/src/main/java/it/inaf/oats/vospace/exception/ContainerNotFoundException.java b/src/main/java/it/inaf/oats/vospace/exception/ContainerNotFoundException.java index d284787..4024705 100644 --- a/src/main/java/it/inaf/oats/vospace/exception/ContainerNotFoundException.java +++ b/src/main/java/it/inaf/oats/vospace/exception/ContainerNotFoundException.java @@ -1,6 +1,5 @@ package it.inaf.oats.vospace.exception; -import net.ivoa.xml.uws.v1.ErrorSummaryFactory; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; @@ -8,7 +7,7 @@ import org.springframework.web.bind.annotation.ResponseStatus; public class ContainerNotFoundException extends VoSpaceErrorSummarizableException { public ContainerNotFoundException(String path) { - super("Container Not Found at path: " + path, - ErrorSummaryFactory.VOSpaceFault.NODE_NOT_FOUND); + super("Path: " + path, + VOSpaceFaultEnum.NODE_NOT_FOUND); } } diff --git a/src/main/java/it/inaf/oats/vospace/exception/DuplicateNodeException.java b/src/main/java/it/inaf/oats/vospace/exception/DuplicateNodeException.java index 0b09d37..e8f1c46 100644 --- a/src/main/java/it/inaf/oats/vospace/exception/DuplicateNodeException.java +++ b/src/main/java/it/inaf/oats/vospace/exception/DuplicateNodeException.java @@ -1,6 +1,5 @@ package it.inaf.oats.vospace.exception; -import net.ivoa.xml.uws.v1.ErrorSummaryFactory; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; @@ -8,7 +7,7 @@ import org.springframework.web.bind.annotation.ResponseStatus; public class DuplicateNodeException extends VoSpaceErrorSummarizableException { public DuplicateNodeException(String path) { - super("Duplicate Node at path: " + path, - ErrorSummaryFactory.VOSpaceFault.DUPLICATE_NODE); + super("Path: " + path, + VOSpaceFaultEnum.DUPLICATE_NODE); } } diff --git a/src/main/java/it/inaf/oats/vospace/exception/ErrorSummaryFactory.java b/src/main/java/it/inaf/oats/vospace/exception/ErrorSummaryFactory.java new file mode 100644 index 0000000..f50eade --- /dev/null +++ b/src/main/java/it/inaf/oats/vospace/exception/ErrorSummaryFactory.java @@ -0,0 +1,32 @@ +package it.inaf.oats.vospace.exception; + +import net.ivoa.xml.uws.v1.ErrorSummary; + +public class ErrorSummaryFactory { + + public static ErrorSummary newErrorSummary(VOSpaceFaultEnum error, String detailMessage) { + ErrorSummary result = new ErrorSummary(); + result.setMessage(error.getFaultRepresentation()); + result.setType(error.getType()); + + if (detailMessage == null || detailMessage.isBlank()) { + result.setHasDetail(false); + } else { + result.setHasDetail(true); + result.setDetailMessage(error.getFaultCaptionForDetails() + + ". " + + detailMessage); + } + + return result; + } + + public static ErrorSummary newErrorSummary(VOSpaceFaultEnum error) { + return newErrorSummary(error, null); + } + + public static ErrorSummary newErrorSummary(VoSpaceErrorSummarizableException e) + { + return newErrorSummary(e.getFault(), e.getDetailMessage()); + } +} diff --git a/src/main/java/it/inaf/oats/vospace/exception/InternalFaultException.java b/src/main/java/it/inaf/oats/vospace/exception/InternalFaultException.java index 05d702e..8ae2feb 100644 --- a/src/main/java/it/inaf/oats/vospace/exception/InternalFaultException.java +++ b/src/main/java/it/inaf/oats/vospace/exception/InternalFaultException.java @@ -1,6 +1,5 @@ package it.inaf.oats.vospace.exception; -import net.ivoa.xml.uws.v1.ErrorSummaryFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; @@ -12,13 +11,13 @@ public class InternalFaultException extends VoSpaceErrorSummarizableException { private static final Logger LOG = LoggerFactory.getLogger(InternalFaultException.class); public InternalFaultException(String msg) { - super("InternalFaultException: " + msg, - ErrorSummaryFactory.VOSpaceFault.INTERNAL_FAULT); + super("Description: " + msg, + VOSpaceFaultEnum.INTERNAL_FAULT); } public InternalFaultException(Throwable cause) { - super("InternalFaultException: " + getMessage(cause), - ErrorSummaryFactory.VOSpaceFault.INTERNAL_FAULT); + super("Description: " + getMessage(cause), + VOSpaceFaultEnum.INTERNAL_FAULT); } private static String getMessage(Throwable cause) { diff --git a/src/main/java/it/inaf/oats/vospace/exception/InvalidArgumentException.java b/src/main/java/it/inaf/oats/vospace/exception/InvalidArgumentException.java index d24af64..67fbab6 100644 --- a/src/main/java/it/inaf/oats/vospace/exception/InvalidArgumentException.java +++ b/src/main/java/it/inaf/oats/vospace/exception/InvalidArgumentException.java @@ -1,6 +1,5 @@ package it.inaf.oats.vospace.exception; -import net.ivoa.xml.uws.v1.ErrorSummaryFactory; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; @@ -8,6 +7,6 @@ import org.springframework.web.bind.annotation.ResponseStatus; public class InvalidArgumentException extends VoSpaceErrorSummarizableException { public InvalidArgumentException(String message) { - super(message, ErrorSummaryFactory.VOSpaceFault.NODE_NOT_FOUND); + super("Description: " + message, VOSpaceFaultEnum.NODE_NOT_FOUND); } } diff --git a/src/main/java/it/inaf/oats/vospace/exception/InvalidURIException.java b/src/main/java/it/inaf/oats/vospace/exception/InvalidURIException.java index e91e3f5..74b155c 100644 --- a/src/main/java/it/inaf/oats/vospace/exception/InvalidURIException.java +++ b/src/main/java/it/inaf/oats/vospace/exception/InvalidURIException.java @@ -1,6 +1,5 @@ package it.inaf.oats.vospace.exception; -import net.ivoa.xml.uws.v1.ErrorSummaryFactory; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; @@ -8,18 +7,18 @@ import org.springframework.web.bind.annotation.ResponseStatus; public class InvalidURIException extends VoSpaceErrorSummarizableException { public InvalidURIException(String URI, String path) { - super("InvalidURI. Payload node URI: " + URI + super("Payload node URI: " + URI + " is not consistent with request path: " + path, - ErrorSummaryFactory.VOSpaceFault.INVALID_URI); + VOSpaceFaultEnum.INVALID_URI); } public InvalidURIException(String URI) { - super("InvalidURI. URI: " + URI + " is not in a valid format", - ErrorSummaryFactory.VOSpaceFault.INVALID_URI); + super("URI: " + URI + " is not in a valid format", + VOSpaceFaultEnum.INVALID_URI); } public InvalidURIException(IllegalArgumentException ex) { - super("InvalidURI. " + ex.getMessage(), - ErrorSummaryFactory.VOSpaceFault.INVALID_URI); + super("Description: " + ex.getMessage(), + VOSpaceFaultEnum.INVALID_URI); } } diff --git a/src/main/java/it/inaf/oats/vospace/exception/LinkFoundException.java b/src/main/java/it/inaf/oats/vospace/exception/LinkFoundException.java index dc4946e..2eb0128 100644 --- a/src/main/java/it/inaf/oats/vospace/exception/LinkFoundException.java +++ b/src/main/java/it/inaf/oats/vospace/exception/LinkFoundException.java @@ -1,6 +1,5 @@ package it.inaf.oats.vospace.exception; -import net.ivoa.xml.uws.v1.ErrorSummaryFactory; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; @@ -8,7 +7,7 @@ import org.springframework.web.bind.annotation.ResponseStatus; public class LinkFoundException extends VoSpaceErrorSummarizableException { public LinkFoundException(String path) { - super("Link Found at path: " + path, - ErrorSummaryFactory.VOSpaceFault.INVALID_URI); + super("Link Node found at path: " + path, + VOSpaceFaultEnum.INVALID_URI); } } diff --git a/src/main/java/it/inaf/oats/vospace/exception/NodeBusyException.java b/src/main/java/it/inaf/oats/vospace/exception/NodeBusyException.java index 2586ac6..2ed84fa 100644 --- a/src/main/java/it/inaf/oats/vospace/exception/NodeBusyException.java +++ b/src/main/java/it/inaf/oats/vospace/exception/NodeBusyException.java @@ -1,12 +1,10 @@ package it.inaf.oats.vospace.exception; -import net.ivoa.xml.uws.v1.ErrorSummaryFactory; - public class NodeBusyException extends VoSpaceErrorSummarizableException { public NodeBusyException(String path) { - super("Node Busy: at path " + path, - ErrorSummaryFactory.VOSpaceFault.NODE_BUSY); + super("Path: " + path, + VOSpaceFaultEnum.NODE_BUSY); } } diff --git a/src/main/java/it/inaf/oats/vospace/exception/NodeNotFoundException.java b/src/main/java/it/inaf/oats/vospace/exception/NodeNotFoundException.java index a7bb797..d4066fe 100644 --- a/src/main/java/it/inaf/oats/vospace/exception/NodeNotFoundException.java +++ b/src/main/java/it/inaf/oats/vospace/exception/NodeNotFoundException.java @@ -1,6 +1,5 @@ package it.inaf.oats.vospace.exception; -import net.ivoa.xml.uws.v1.ErrorSummaryFactory; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; @@ -8,7 +7,7 @@ import org.springframework.web.bind.annotation.ResponseStatus; public class NodeNotFoundException extends VoSpaceErrorSummarizableException { public NodeNotFoundException(String path) { - super("NodeNotFound: " + path, - ErrorSummaryFactory.VOSpaceFault.NODE_NOT_FOUND); + super("Path: " + path, + VOSpaceFaultEnum.NODE_NOT_FOUND); } } diff --git a/src/main/java/it/inaf/oats/vospace/exception/PermissionDeniedException.java b/src/main/java/it/inaf/oats/vospace/exception/PermissionDeniedException.java index 31194db..6563a89 100644 --- a/src/main/java/it/inaf/oats/vospace/exception/PermissionDeniedException.java +++ b/src/main/java/it/inaf/oats/vospace/exception/PermissionDeniedException.java @@ -1,6 +1,5 @@ package it.inaf.oats.vospace.exception; -import net.ivoa.xml.uws.v1.ErrorSummaryFactory; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; @@ -8,7 +7,7 @@ import org.springframework.web.bind.annotation.ResponseStatus; public class PermissionDeniedException extends VoSpaceErrorSummarizableException { public PermissionDeniedException(String path) { - super("Permission Denied at path: " + path, - ErrorSummaryFactory.VOSpaceFault.PERMISSION_DENIED); + super("Path: " + path, + VOSpaceFaultEnum.PERMISSION_DENIED); } } diff --git a/src/main/java/it/inaf/oats/vospace/exception/ProtocolNotSupportedException.java b/src/main/java/it/inaf/oats/vospace/exception/ProtocolNotSupportedException.java index d13d941..205e0f8 100644 --- a/src/main/java/it/inaf/oats/vospace/exception/ProtocolNotSupportedException.java +++ b/src/main/java/it/inaf/oats/vospace/exception/ProtocolNotSupportedException.java @@ -1,12 +1,10 @@ package it.inaf.oats.vospace.exception; -import net.ivoa.xml.uws.v1.ErrorSummaryFactory; - public class ProtocolNotSupportedException extends VoSpaceErrorSummarizableException{ public ProtocolNotSupportedException(String protocol) { - super("Protocol Not Supported: " + protocol, - ErrorSummaryFactory.VOSpaceFault.PROTOCOL_NOT_SUPPORTED); + super("Protocol: " + protocol, + VOSpaceFaultEnum.PROTOCOL_NOT_SUPPORTED); } } diff --git a/src/main/java/it/inaf/oats/vospace/exception/VOSpaceFaultEnum.java b/src/main/java/it/inaf/oats/vospace/exception/VOSpaceFaultEnum.java new file mode 100644 index 0000000..6aeb655 --- /dev/null +++ b/src/main/java/it/inaf/oats/vospace/exception/VOSpaceFaultEnum.java @@ -0,0 +1,50 @@ +package it.inaf.oats.vospace.exception; + +// NFC: ErrorType usage is not covered in documentation, as far as I can see +// these are tentative default values. +import net.ivoa.xml.uws.v1.ErrorType; + +public enum VOSpaceFaultEnum { + // pushto + OPERATION_NOT_SUPPORTED("Operation Not Supported", ErrorType.FATAL, "OperationNotSupported"), + INTERNAL_FAULT("Internal Fault", ErrorType.TRANSIENT, "InternalFault"), + PERMISSION_DENIED("Permission Denied", ErrorType.FATAL, "PermissionDenied"), + VIEW_NOT_SUPPORTED("View Not Supported", ErrorType.FATAL, "ViewNotSupported"), + PROTOCOL_NOT_SUPPORTED("Protocol Not Supported", ErrorType.FATAL, "ProtocolNotSupported"), + INVALID_ARGUMENT("Invalid Argument", ErrorType.FATAL, "InvalidArgument"), + NODE_BUSY("Node Busy", ErrorType.TRANSIENT, "NodeBusy"), + // additional for pullto + INVALID_URI("Invalid URI", ErrorType.FATAL, "InvalidURI"), + INVALID_DATA("Invalid Data", ErrorType.FATAL, "InvalidData"), + // additional for pullfrom + NODE_NOT_FOUND("Node Not Found", ErrorType.FATAL, "NodeNotFound"), + // additional for pushfrom + TRANSFER_FAILED("Transfer Failed", ErrorType.FATAL, "TransferFailed"), + // additional for movenode/copynode + DUPLICATE_NODE("Duplicate Node", ErrorType.FATAL, "DuplicateNode"); + + private final String faultRepresentation; + private final ErrorType type; + private final String faultCaptionForDetails; + + private VOSpaceFaultEnum(String faultRepresentation, + ErrorType type, + String faultCaptionForDetails) { + this.faultRepresentation = faultRepresentation; + this.type = type; + this.faultCaptionForDetails = faultCaptionForDetails; + } + + public String getFaultRepresentation() { + return this.faultRepresentation; + } + + public ErrorType getType() { + return this.type; + } + + public String getFaultCaptionForDetails() { + return faultCaptionForDetails; + } + +} diff --git a/src/main/java/it/inaf/oats/vospace/exception/VoSpaceErrorSummarizableException.java b/src/main/java/it/inaf/oats/vospace/exception/VoSpaceErrorSummarizableException.java index caed42e..be0f0d1 100644 --- a/src/main/java/it/inaf/oats/vospace/exception/VoSpaceErrorSummarizableException.java +++ b/src/main/java/it/inaf/oats/vospace/exception/VoSpaceErrorSummarizableException.java @@ -1,23 +1,26 @@ package it.inaf.oats.vospace.exception; -import net.ivoa.xml.uws.v1.ErrorSummaryFactory; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR) -public class VoSpaceErrorSummarizableException extends VoSpaceException { +public abstract class VoSpaceErrorSummarizableException extends VoSpaceException { - ErrorSummaryFactory.VOSpaceFault fault; + VOSpaceFaultEnum fault; - public VoSpaceErrorSummarizableException(String message, - ErrorSummaryFactory.VOSpaceFault fault) + public VoSpaceErrorSummarizableException(String message, VOSpaceFaultEnum fault) { super(message); this.fault = fault; } - - public ErrorSummaryFactory.VOSpaceFault getFault() + + public VOSpaceFaultEnum getFault() { return this.fault; } + + public String getDetailMessage() + { + return this.getMessage(); + } } -- GitLab