You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by as...@apache.org on 2013/01/23 14:33:22 UTC

svn commit: r1437386 - in /syncope/trunk: client/src/main/java/org/apache/syncope/client/rest/utils/RestClientExceptionMapper.java core/src/main/java/org/apache/syncope/core/rest/utils/RestServiceExceptionMapper.java

Author: ashakirin
Date: Wed Jan 23 13:33:22 2013
New Revision: 1437386

URL: http://svn.apache.org/viewvc?rev=1437386&view=rev
Log:
[SYNCOPE-256] Refactoring and updates in exception mappers

Modified:
    syncope/trunk/client/src/main/java/org/apache/syncope/client/rest/utils/RestClientExceptionMapper.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/utils/RestServiceExceptionMapper.java

Modified: syncope/trunk/client/src/main/java/org/apache/syncope/client/rest/utils/RestClientExceptionMapper.java
URL: http://svn.apache.org/viewvc/syncope/trunk/client/src/main/java/org/apache/syncope/client/rest/utils/RestClientExceptionMapper.java?rev=1437386&r1=1437385&r2=1437386&view=diff
==============================================================================
--- syncope/trunk/client/src/main/java/org/apache/syncope/client/rest/utils/RestClientExceptionMapper.java (original)
+++ syncope/trunk/client/src/main/java/org/apache/syncope/client/rest/utils/RestClientExceptionMapper.java Wed Jan 23 13:33:22 2013
@@ -38,64 +38,63 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Provider
-public class RestClientExceptionMapper implements ExceptionMapper<Exception>, ResponseExceptionMapper<Exception> {
+public class RestClientExceptionMapper implements ExceptionMapper<Exception>,
+		ResponseExceptionMapper<Exception> {
 
     private static final Logger LOG = LoggerFactory.getLogger(RestClientExceptionMapper.class);
 
     @Override
-    public Response toResponse(final Exception e) {
-        throw new UnsupportedOperationException(
-                "Call of toResponse() method is not expected in RestClientExceptionnMapper");
-    }
-
-    @Override
-    public Exception fromResponse(final Response response) {
-        Exception ex = null;
-        int statusCode = response.getStatus();
-
-        // 1. Check for composite exception in HTTP header
-        SyncopeClientCompositeErrorException scce = checkCompositeException(response);
-        if (scce != null) {
-            ex = scce;
-
-            // 2. TODO Map SC_FORBIDDEN
-            // } else if (statusCode == HttpStatus.SC_FORBIDDEN) {
-            // ex = new UnauthorizedRoleException(-1L);
-
-            // 3. Map SC_UNAUTHORIZED
-        } else if (statusCode == HttpStatus.SC_UNAUTHORIZED) {
-            ex = new AccessControlException("Remote unauthorized exception");
-
-        } else {
-            // 3. All other codes are mapped to runtime exception with HTTP code information
-            ex = new RuntimeException(String.format("Remote exception with status code: %s", Response.Status
-                    .fromStatusCode(statusCode).name()));
-        }
+	public Response toResponse(Exception e) {
+		throw new UnsupportedOperationException("Call of toResponse() method is not expected in RestClientExceptionnMapper");
+	}
+
+	@Override
+	public Exception fromResponse(Response response) {
+		Exception ex = null;
+		int statusCode = response.getStatus();
+		
+		// 1. Check for composite exception in HTTP header 
+		SyncopeClientCompositeErrorException scce = checkCompositeException(response);
+		if (scce != null) {
+			ex = scce;
+			
+			// TODO reduce SCCEE to really composite ones and use normal exception for others
+//		} else if (statusCode == HttpStatus.SC_FORBIDDEN) {
+//			ex = new UnauthorizedRoleException(-1L);
+			
+			// 2. Map  SC_UNAUTHORIZED
+		} else if (statusCode == HttpStatus.SC_UNAUTHORIZED) {
+			ex = new AccessControlException("Remote unauthorized exception");
+			
+		} else {
+			// 3. All other codes are mapped to runtime exception with HTTP code information 
+			ex = new RuntimeException(String.format(
+					"Remote exception with status code: %s",
+					Response.Status.fromStatusCode(statusCode).name()));
+		}
         LOG.error("Exception thrown by REST methods: " + ex.getMessage(), ex);
-        return ex;
-    }
-
-    private SyncopeClientCompositeErrorException checkCompositeException(final Response response) {
-        int statusCode = response.getStatus();
-        List<Object> exceptionTypesInHeaders = response.getHeaders().get(
-                SyncopeClientErrorHandler.EXCEPTION_TYPE_HEADER);
+		return ex;
+	}
+	
+	private SyncopeClientCompositeErrorException checkCompositeException(Response response) {
+		int statusCode = response.getStatus();
+        List<Object> exceptionTypesInHeaders = response.getHeaders().get(SyncopeClientErrorHandler.EXCEPTION_TYPE_HEADER);
         if (exceptionTypesInHeaders == null) {
             LOG.debug("No " + SyncopeClientErrorHandler.EXCEPTION_TYPE_HEADER + " provided");
             return null;
         }
 
-        SyncopeClientCompositeErrorException compositeException = new SyncopeClientCompositeErrorException(
-                org.springframework.http.HttpStatus.valueOf(statusCode));
+		SyncopeClientCompositeErrorException compositeException = new SyncopeClientCompositeErrorException(
+				org.springframework.http.HttpStatus.valueOf(statusCode));
 
         Set<String> handledExceptions = new HashSet<String>();
         for (Object exceptionTypeValue : exceptionTypesInHeaders) {
-            String exceptionTypeAsString = (String) exceptionTypeValue;
+        	String exceptionTypeAsString = (String) exceptionTypeValue; 
             SyncopeClientExceptionType exceptionType = null;
             try {
                 exceptionType = SyncopeClientExceptionType.getFromHeaderValue(exceptionTypeAsString);
             } catch (IllegalArgumentException e) {
-                LOG.error("Unexpected value of " + SyncopeClientErrorHandler.EXCEPTION_TYPE_HEADER + ": "
-                        + exceptionTypeAsString, e);
+                LOG.error("Unexpected value of " + SyncopeClientErrorHandler.EXCEPTION_TYPE_HEADER + ": " + exceptionTypeAsString, e);
             }
             if (exceptionType != null) {
                 handledExceptions.add(exceptionTypeAsString);
@@ -104,14 +103,14 @@ public class RestClientExceptionMapper i
                 clientException.setType(exceptionType);
                 if (response.getHeaders().get(exceptionType.getElementHeaderName()) != null
                         && !response.getHeaders().get(exceptionType.getElementHeaderName()).isEmpty()) {
-                    // TODO update clientException to support list of objects
-                    List<Object> elementsObjectList = response.getHeaders().get(exceptionType.getElementHeaderName());
-                    List<String> elementsStringList = new ArrayList<String>();
-                    for (Object elementObject : elementsObjectList) {
-                        if (elementObject instanceof String) {
-                            elementsStringList.add((String) elementObject);
-                        }
-                    }
+                	// TODO: update clientException to support list of objects
+                	List<Object> elementsObjectList = response.getHeaders().get(exceptionType.getElementHeaderName());
+                	List<String> elementsStringList = new ArrayList<String>();
+                	for (Object elementObject : elementsObjectList) {
+                		if (elementObject instanceof String) {
+                			elementsStringList.add((String) elementObject);
+                		}
+                	}
                     clientException.setElements(elementsStringList);
                 }
                 compositeException.addException(clientException);
@@ -126,7 +125,7 @@ public class RestClientExceptionMapper i
         if (compositeException.hasExceptions()) {
             return compositeException;
         }
-
+        
         return null;
-    }
+	}
 }

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/utils/RestServiceExceptionMapper.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/utils/RestServiceExceptionMapper.java?rev=1437386&r1=1437385&r2=1437386&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/utils/RestServiceExceptionMapper.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/utils/RestServiceExceptionMapper.java Wed Jan 23 13:33:22 2013
@@ -139,10 +139,7 @@ public class RestServiceExceptionMapper 
         ResponseBuilder responseBuilder = Response.status(Response.Status.FORBIDDEN);
 
         if (ex instanceof UnauthorizedRoleException) {
-            responseBuilder.header(SyncopeClientErrorHandler.EXCEPTION_TYPE_HEADER,
-                    SyncopeClientExceptionType.UnauthorizedRole.getHeaderValue());
-            responseBuilder.header(SyncopeClientExceptionType.UnauthorizedRole.getElementHeaderName(), ex.getMessage());
-            response = responseBuilder.build();
+            response = buildResponse(responseBuilder, SyncopeClientExceptionType.UnauthorizedRole, ex, null);
         }
         return response;
     }
@@ -162,13 +159,7 @@ public class RestServiceExceptionMapper 
         ResponseBuilder responseBuilder = Response.status(Response.Status.CONFLICT);
 
         if (ex instanceof DataIntegrityViolationException) {
-            responseBuilder.header(SyncopeClientErrorHandler.EXCEPTION_TYPE_HEADER,
-                    SyncopeClientExceptionType.DataIntegrityViolation.getHeaderValue());
-            responseBuilder.header(SyncopeClientExceptionType.DataIntegrityViolation.getElementHeaderName(),
-                    ex.getCause() == null
-                            ? ex.getMessage()
-                            : ex.getCause().getMessage());
-            response = responseBuilder.build();
+            response = buildResponse(responseBuilder, SyncopeClientExceptionType.DataIntegrityViolation, ex, null);
         }
         return response;
     }
@@ -178,29 +169,14 @@ public class RestServiceExceptionMapper 
         ResponseBuilder responseBuilder = Response.status(Response.Status.INTERNAL_SERVER_ERROR);
 
         if (ex instanceof org.apache.ibatis.exceptions.PersistenceException) {
-            responseBuilder.header(SyncopeClientErrorHandler.EXCEPTION_TYPE_HEADER,
-                    SyncopeClientExceptionType.Workflow.getHeaderValue());
-            responseBuilder.header(SyncopeClientExceptionType.Workflow.getElementHeaderName(),
+            response = buildResponse(responseBuilder, SyncopeClientExceptionType.Workflow, ex,
                     "Currently unavailable. Please try later.");
-            response = responseBuilder.build();
 
         } else if (ex instanceof JpaSystemException) {
-            responseBuilder.header(SyncopeClientErrorHandler.EXCEPTION_TYPE_HEADER,
-                    SyncopeClientExceptionType.DataIntegrityViolation.getHeaderValue());
-            responseBuilder.header(SyncopeClientExceptionType.DataIntegrityViolation.getElementHeaderName(),
-                    ex.getCause() == null
-                            ? ex.getMessage()
-                            : ex.getCause().getMessage());
-            response = responseBuilder.build();
+            response = buildResponse(responseBuilder, SyncopeClientExceptionType.DataIntegrityViolation, ex, null);
 
         } else if (ex instanceof ConfigurationException) {
-            responseBuilder.header(SyncopeClientErrorHandler.EXCEPTION_TYPE_HEADER,
-                    SyncopeClientExceptionType.InvalidExternalResource.getHeaderValue());
-            responseBuilder.header(SyncopeClientExceptionType.InvalidExternalResource.getElementHeaderName(),
-                    ex.getCause() == null
-                            ? ex.getMessage()
-                            : ex.getCause().getMessage());
-            response = responseBuilder.build();
+            response = buildResponse(responseBuilder, SyncopeClientExceptionType.InvalidExternalResource, ex, null);
         }
 
         return response;
@@ -211,17 +187,11 @@ public class RestServiceExceptionMapper 
         ResponseBuilder responseBuilder = Response.status(Response.Status.NOT_FOUND);
 
         if (ex instanceof NotFoundException) {
-            responseBuilder.header(SyncopeClientErrorHandler.EXCEPTION_TYPE_HEADER,
-                    SyncopeClientExceptionType.NotFound.getHeaderValue());
-            responseBuilder.header(SyncopeClientExceptionType.NotFound.getElementHeaderName(), ex.getMessage());
-            response = responseBuilder.build();
+            response = buildResponse(responseBuilder, SyncopeClientExceptionType.NotFound, ex, null);
 
         } else if (ex instanceof MissingConfKeyException) {
-            responseBuilder.header(SyncopeClientErrorHandler.EXCEPTION_TYPE_HEADER,
-                    SyncopeClientExceptionType.NotFound.getHeaderValue());
-            responseBuilder.header(SyncopeClientExceptionType.NotFound.getElementHeaderName(),
+            response = buildResponse(responseBuilder, SyncopeClientExceptionType.NotFound, ex,
                     ((MissingConfKeyException) ex).getConfKey());
-            response = responseBuilder.build();
         }
 
         return response;
@@ -248,34 +218,32 @@ public class RestServiceExceptionMapper 
             response = responseBuilder.build();
 
         } else if (ex instanceof WorkflowException) {
-            responseBuilder.header(SyncopeClientErrorHandler.EXCEPTION_TYPE_HEADER,
-                    SyncopeClientExceptionType.Workflow.getHeaderValue());
-            responseBuilder.header(SyncopeClientExceptionType.Workflow.getElementHeaderName(), ex.getCause()
+            response = buildResponse(responseBuilder, SyncopeClientExceptionType.Workflow, ex, ex.getCause()
                     .getMessage());
-            response = responseBuilder.build();
 
         } else if (ex instanceof PropagationException) {
-            responseBuilder.header(SyncopeClientErrorHandler.EXCEPTION_TYPE_HEADER,
-                    SyncopeClientExceptionType.Propagation.getHeaderValue());
-            responseBuilder.header(SyncopeClientExceptionType.Propagation.getElementHeaderName(),
+            response = buildResponse(responseBuilder, SyncopeClientExceptionType.Propagation, ex,
                     ((PropagationException) ex).getResourceName());
-            response = responseBuilder.build();
 
         } else if (ex instanceof InvalidSearchConditionException) {
-            responseBuilder.header(SyncopeClientErrorHandler.EXCEPTION_TYPE_HEADER,
-                    SyncopeClientExceptionType.InvalidSearchCondition.getHeaderValue());
-            response = responseBuilder.build();
+            response = buildResponse(responseBuilder, SyncopeClientExceptionType.InvalidSearchCondition, ex, null);
+
         } else if (ex instanceof PersistenceException) {
-            responseBuilder.header(SyncopeClientErrorHandler.EXCEPTION_TYPE_HEADER,
-                    SyncopeClientExceptionType.GenericPersistence.getHeaderValue());
-            responseBuilder.header(SyncopeClientExceptionType.GenericPersistence.getElementHeaderName(),
-                    ex.getCause() == null
-                            ? ex.getMessage()
-                            : ex.getCause().getMessage());
-            response = responseBuilder.build();
+            response = buildResponse(responseBuilder, SyncopeClientExceptionType.GenericPersistence, ex, null);
         }
 
         return response;
     }
 
+    private Response buildResponse(ResponseBuilder responseBuilder, SyncopeClientExceptionType hType, Throwable ex,
+            String msg) {
+        responseBuilder.header(SyncopeClientErrorHandler.EXCEPTION_TYPE_HEADER, hType.getHeaderValue());
+        String exMsg = ex.getCause() == null
+                ? ex.getMessage()
+                : ex.getCause().getMessage();
+        responseBuilder.header(hType.getElementHeaderName(), (msg != null)
+                ? msg
+                : exMsg);
+        return responseBuilder.build();
+    }
 }