Skip to content
Snippets Groups Projects
Commit 71087ac6 authored by Nicola Fulvio Calabria's avatar Nicola Fulvio Calabria
Browse files

Refactoring for error detail endpoint development

parent 84f6c57e
No related branches found
No related tags found
No related merge requests found
Showing
with 136 additions and 52 deletions
...@@ -6,7 +6,7 @@ import net.ivoa.xml.uws.v1.ExecutionPhase; ...@@ -6,7 +6,7 @@ import net.ivoa.xml.uws.v1.ExecutionPhase;
import net.ivoa.xml.uws.v1.JobSummary; import net.ivoa.xml.uws.v1.JobSummary;
import net.ivoa.xml.vospace.v2.Protocol; import net.ivoa.xml.vospace.v2.Protocol;
import net.ivoa.xml.vospace.v2.Transfer; import net.ivoa.xml.vospace.v2.Transfer;
import net.ivoa.xml.uws.v1.ErrorSummaryFactory; import it.inaf.oats.vospace.exception.ErrorSummaryFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import it.inaf.oats.vospace.exception.VoSpaceErrorSummarizableException; import it.inaf.oats.vospace.exception.VoSpaceErrorSummarizableException;
...@@ -67,7 +67,12 @@ public class JobService { ...@@ -67,7 +67,12 @@ public class JobService {
} catch (VoSpaceErrorSummarizableException e) { } catch (VoSpaceErrorSummarizableException e) {
job.setPhase(ExecutionPhase.ERROR); job.setPhase(ExecutionPhase.ERROR);
job.setErrorSummary(ErrorSummaryFactory.newErrorSummary(e.getFault())); job.setErrorSummary(ErrorSummaryFactory.newErrorSummary(e));
jobDAO.updateJob(job);
} catch (Exception e) {
job.setPhase(ExecutionPhase.ERROR);
job.setErrorSummary(ErrorSummaryFactory.newErrorSummary(
new InternalFaultException(e)));
jobDAO.updateJob(job); jobDAO.updateJob(job);
} }
} }
...@@ -115,7 +120,12 @@ public class JobService { ...@@ -115,7 +120,12 @@ public class JobService {
} catch (VoSpaceErrorSummarizableException e) { } catch (VoSpaceErrorSummarizableException e) {
job.setPhase(ExecutionPhase.ERROR); job.setPhase(ExecutionPhase.ERROR);
uriService.getTransfer(job).getProtocols().clear(); uriService.getTransfer(job).getProtocols().clear();
job.setErrorSummary(ErrorSummaryFactory.newErrorSummary(e.getFault())); job.setErrorSummary(ErrorSummaryFactory.newErrorSummary(e));
} catch (Exception e) {
job.setPhase(ExecutionPhase.ERROR);
uriService.getTransfer(job).getProtocols().clear();
job.setErrorSummary(ErrorSummaryFactory.newErrorSummary(
new InternalFaultException(e)));
} finally { } finally {
jobDAO.createJob(job); jobDAO.createJob(job);
} }
......
package it.inaf.oats.vospace.exception; package it.inaf.oats.vospace.exception;
import net.ivoa.xml.uws.v1.ErrorSummaryFactory;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.ResponseStatus;
...@@ -8,7 +7,7 @@ import org.springframework.web.bind.annotation.ResponseStatus; ...@@ -8,7 +7,7 @@ import org.springframework.web.bind.annotation.ResponseStatus;
public class ContainerNotFoundException extends VoSpaceErrorSummarizableException { public class ContainerNotFoundException extends VoSpaceErrorSummarizableException {
public ContainerNotFoundException(String path) { public ContainerNotFoundException(String path) {
super("Container Not Found at path: " + path, super("Path: " + path,
ErrorSummaryFactory.VOSpaceFault.NODE_NOT_FOUND); VOSpaceFaultEnum.NODE_NOT_FOUND);
} }
} }
package it.inaf.oats.vospace.exception; package it.inaf.oats.vospace.exception;
import net.ivoa.xml.uws.v1.ErrorSummaryFactory;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.ResponseStatus;
...@@ -8,7 +7,7 @@ import org.springframework.web.bind.annotation.ResponseStatus; ...@@ -8,7 +7,7 @@ import org.springframework.web.bind.annotation.ResponseStatus;
public class DuplicateNodeException extends VoSpaceErrorSummarizableException { public class DuplicateNodeException extends VoSpaceErrorSummarizableException {
public DuplicateNodeException(String path) { public DuplicateNodeException(String path) {
super("Duplicate Node at path: " + path, super("Path: " + path,
ErrorSummaryFactory.VOSpaceFault.DUPLICATE_NODE); VOSpaceFaultEnum.DUPLICATE_NODE);
} }
} }
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());
}
}
package it.inaf.oats.vospace.exception; package it.inaf.oats.vospace.exception;
import net.ivoa.xml.uws.v1.ErrorSummaryFactory;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
...@@ -12,13 +11,13 @@ public class InternalFaultException extends VoSpaceErrorSummarizableException { ...@@ -12,13 +11,13 @@ public class InternalFaultException extends VoSpaceErrorSummarizableException {
private static final Logger LOG = LoggerFactory.getLogger(InternalFaultException.class); private static final Logger LOG = LoggerFactory.getLogger(InternalFaultException.class);
public InternalFaultException(String msg) { public InternalFaultException(String msg) {
super("InternalFaultException: " + msg, super("Description: " + msg,
ErrorSummaryFactory.VOSpaceFault.INTERNAL_FAULT); VOSpaceFaultEnum.INTERNAL_FAULT);
} }
public InternalFaultException(Throwable cause) { public InternalFaultException(Throwable cause) {
super("InternalFaultException: " + getMessage(cause), super("Description: " + getMessage(cause),
ErrorSummaryFactory.VOSpaceFault.INTERNAL_FAULT); VOSpaceFaultEnum.INTERNAL_FAULT);
} }
private static String getMessage(Throwable cause) { private static String getMessage(Throwable cause) {
......
package it.inaf.oats.vospace.exception; package it.inaf.oats.vospace.exception;
import net.ivoa.xml.uws.v1.ErrorSummaryFactory;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.ResponseStatus;
...@@ -8,6 +7,6 @@ import org.springframework.web.bind.annotation.ResponseStatus; ...@@ -8,6 +7,6 @@ import org.springframework.web.bind.annotation.ResponseStatus;
public class InvalidArgumentException extends VoSpaceErrorSummarizableException { public class InvalidArgumentException extends VoSpaceErrorSummarizableException {
public InvalidArgumentException(String message) { public InvalidArgumentException(String message) {
super(message, ErrorSummaryFactory.VOSpaceFault.NODE_NOT_FOUND); super("Description: " + message, VOSpaceFaultEnum.NODE_NOT_FOUND);
} }
} }
package it.inaf.oats.vospace.exception; package it.inaf.oats.vospace.exception;
import net.ivoa.xml.uws.v1.ErrorSummaryFactory;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.ResponseStatus;
...@@ -8,18 +7,18 @@ import org.springframework.web.bind.annotation.ResponseStatus; ...@@ -8,18 +7,18 @@ import org.springframework.web.bind.annotation.ResponseStatus;
public class InvalidURIException extends VoSpaceErrorSummarizableException { public class InvalidURIException extends VoSpaceErrorSummarizableException {
public InvalidURIException(String URI, String path) { public InvalidURIException(String URI, String path) {
super("InvalidURI. Payload node URI: " + URI super("Payload node URI: " + URI
+ " is not consistent with request path: " + path, + " is not consistent with request path: " + path,
ErrorSummaryFactory.VOSpaceFault.INVALID_URI); VOSpaceFaultEnum.INVALID_URI);
} }
public InvalidURIException(String URI) { public InvalidURIException(String URI) {
super("InvalidURI. URI: " + URI + " is not in a valid format", super("URI: " + URI + " is not in a valid format",
ErrorSummaryFactory.VOSpaceFault.INVALID_URI); VOSpaceFaultEnum.INVALID_URI);
} }
public InvalidURIException(IllegalArgumentException ex) { public InvalidURIException(IllegalArgumentException ex) {
super("InvalidURI. " + ex.getMessage(), super("Description: " + ex.getMessage(),
ErrorSummaryFactory.VOSpaceFault.INVALID_URI); VOSpaceFaultEnum.INVALID_URI);
} }
} }
package it.inaf.oats.vospace.exception; package it.inaf.oats.vospace.exception;
import net.ivoa.xml.uws.v1.ErrorSummaryFactory;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.ResponseStatus;
...@@ -8,7 +7,7 @@ import org.springframework.web.bind.annotation.ResponseStatus; ...@@ -8,7 +7,7 @@ import org.springframework.web.bind.annotation.ResponseStatus;
public class LinkFoundException extends VoSpaceErrorSummarizableException { public class LinkFoundException extends VoSpaceErrorSummarizableException {
public LinkFoundException(String path) { public LinkFoundException(String path) {
super("Link Found at path: " + path, super("Link Node found at path: " + path,
ErrorSummaryFactory.VOSpaceFault.INVALID_URI); VOSpaceFaultEnum.INVALID_URI);
} }
} }
package it.inaf.oats.vospace.exception; package it.inaf.oats.vospace.exception;
import net.ivoa.xml.uws.v1.ErrorSummaryFactory;
public class NodeBusyException extends VoSpaceErrorSummarizableException { public class NodeBusyException extends VoSpaceErrorSummarizableException {
public NodeBusyException(String path) { public NodeBusyException(String path) {
super("Node Busy: at path " + path, super("Path: " + path,
ErrorSummaryFactory.VOSpaceFault.NODE_BUSY); VOSpaceFaultEnum.NODE_BUSY);
} }
} }
package it.inaf.oats.vospace.exception; package it.inaf.oats.vospace.exception;
import net.ivoa.xml.uws.v1.ErrorSummaryFactory;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.ResponseStatus;
...@@ -8,7 +7,7 @@ import org.springframework.web.bind.annotation.ResponseStatus; ...@@ -8,7 +7,7 @@ import org.springframework.web.bind.annotation.ResponseStatus;
public class NodeNotFoundException extends VoSpaceErrorSummarizableException { public class NodeNotFoundException extends VoSpaceErrorSummarizableException {
public NodeNotFoundException(String path) { public NodeNotFoundException(String path) {
super("NodeNotFound: " + path, super("Path: " + path,
ErrorSummaryFactory.VOSpaceFault.NODE_NOT_FOUND); VOSpaceFaultEnum.NODE_NOT_FOUND);
} }
} }
package it.inaf.oats.vospace.exception; package it.inaf.oats.vospace.exception;
import net.ivoa.xml.uws.v1.ErrorSummaryFactory;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.ResponseStatus;
...@@ -8,7 +7,7 @@ import org.springframework.web.bind.annotation.ResponseStatus; ...@@ -8,7 +7,7 @@ import org.springframework.web.bind.annotation.ResponseStatus;
public class PermissionDeniedException extends VoSpaceErrorSummarizableException { public class PermissionDeniedException extends VoSpaceErrorSummarizableException {
public PermissionDeniedException(String path) { public PermissionDeniedException(String path) {
super("Permission Denied at path: " + path, super("Path: " + path,
ErrorSummaryFactory.VOSpaceFault.PERMISSION_DENIED); VOSpaceFaultEnum.PERMISSION_DENIED);
} }
} }
package it.inaf.oats.vospace.exception; package it.inaf.oats.vospace.exception;
import net.ivoa.xml.uws.v1.ErrorSummaryFactory;
public class ProtocolNotSupportedException extends VoSpaceErrorSummarizableException{ public class ProtocolNotSupportedException extends VoSpaceErrorSummarizableException{
public ProtocolNotSupportedException(String protocol) { public ProtocolNotSupportedException(String protocol) {
super("Protocol Not Supported: " + protocol, super("Protocol: " + protocol,
ErrorSummaryFactory.VOSpaceFault.PROTOCOL_NOT_SUPPORTED); VOSpaceFaultEnum.PROTOCOL_NOT_SUPPORTED);
} }
} }
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;
}
}
package it.inaf.oats.vospace.exception; package it.inaf.oats.vospace.exception;
import net.ivoa.xml.uws.v1.ErrorSummaryFactory;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.ResponseStatus;
@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR) @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, public VoSpaceErrorSummarizableException(String message, VOSpaceFaultEnum fault)
ErrorSummaryFactory.VOSpaceFault fault)
{ {
super(message); super(message);
this.fault = fault; this.fault = fault;
} }
public ErrorSummaryFactory.VOSpaceFault getFault() public VOSpaceFaultEnum getFault()
{ {
return this.fault; return this.fault;
} }
public String getDetailMessage()
{
return this.getMessage();
}
} }
...@@ -20,8 +20,9 @@ import java.util.Optional; ...@@ -20,8 +20,9 @@ import java.util.Optional;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.Month; import java.time.Month;
import net.ivoa.xml.uws.v1.ErrorSummary; import net.ivoa.xml.uws.v1.ErrorSummary;
import net.ivoa.xml.uws.v1.ErrorSummaryFactory;
import net.ivoa.xml.uws.v1.Jobs; import net.ivoa.xml.uws.v1.Jobs;
import it.inaf.oats.vospace.exception.ErrorSummaryFactory;
import it.inaf.oats.vospace.exception.VOSpaceFaultEnum;
@ExtendWith(SpringExtension.class) @ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {DataSourceConfig.class}) @ContextConfiguration(classes = {DataSourceConfig.class})
...@@ -85,7 +86,7 @@ public class JobDAOTest { ...@@ -85,7 +86,7 @@ public class JobDAOTest {
// A generic picked randomly // A generic picked randomly
ErrorSummary errorSummary ErrorSummary errorSummary
= ErrorSummaryFactory.newErrorSummary( = ErrorSummaryFactory.newErrorSummary(
ErrorSummaryFactory.VOSpaceFault.PERMISSION_DENIED); VOSpaceFaultEnum.PERMISSION_DENIED);
job.setErrorSummary(errorSummary); job.setErrorSummary(errorSummary);
...@@ -111,7 +112,7 @@ public class JobDAOTest { ...@@ -111,7 +112,7 @@ public class JobDAOTest {
// A generic picked randomly // A generic picked randomly
ErrorSummary errorSummary ErrorSummary errorSummary
= ErrorSummaryFactory.newErrorSummary( = ErrorSummaryFactory.newErrorSummary(
ErrorSummaryFactory.VOSpaceFault.PERMISSION_DENIED); VOSpaceFaultEnum.PERMISSION_DENIED);
job.setErrorSummary(errorSummary); job.setErrorSummary(errorSummary);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment