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();
+ }
}