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