From f116ffba646d6617d480108a2ab9a0035163f0dd Mon Sep 17 00:00:00 2001 From: Cleverson Sacramento Date: Wed, 26 Nov 2014 15:05:27 -0200 Subject: [PATCH] FWK-206: Logando as exceptions tratadas automaticamente pelos ExceptionMappers internos --- impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/AuthenticationExceptionMapper.java | 21 ++++++++++++++++++--- impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/AuthorizationExceptionMapper.java | 21 ++++++++++++++++++--- impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConstraintViolationExceptionMapper.java | 3 ++- impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/DefaultExceptionMapper.java | 4 ++-- impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/EOFExceptionMapper.java | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/HttpViolationExceptionMapper.java | 6 ++++-- impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/IllegalArgumentExceptionMapper.java | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/NotLoggedInExceptionMapper.java | 31 ------------------------------- impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/security/AbstractHTTPAuthorizationFilter.java | 27 +++++++++++++++++++++++++++ impl/extension/rest/src/main/resources/demoiselle-rest-bundle.properties | 5 +++-- impl/extension/rest/src/test/java/test/Tests.java | 5 +++-- 11 files changed, 208 insertions(+), 46 deletions(-) create mode 100644 impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/EOFExceptionMapper.java create mode 100644 impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/IllegalArgumentExceptionMapper.java delete mode 100644 impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/NotLoggedInExceptionMapper.java diff --git a/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/AuthenticationExceptionMapper.java b/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/AuthenticationExceptionMapper.java index eb28f92..3f28c25 100644 --- a/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/AuthenticationExceptionMapper.java +++ b/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/AuthenticationExceptionMapper.java @@ -1,5 +1,6 @@ package br.gov.frameworkdemoiselle.internal.implementation; +import static java.util.logging.Level.FINE; import static javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED; import java.util.logging.Logger; @@ -11,21 +12,35 @@ import javax.ws.rs.ext.Provider; import br.gov.frameworkdemoiselle.security.AuthenticationException; import br.gov.frameworkdemoiselle.util.Beans; import br.gov.frameworkdemoiselle.util.NameQualifier; +import br.gov.frameworkdemoiselle.util.ResourceBundle; @Provider public class AuthenticationExceptionMapper implements ExceptionMapper { + private transient ResourceBundle bundle; + private transient Logger logger; @Override public Response toResponse(AuthenticationException exception) { - getLogger().warning(exception.getMessage()); - return Response.status(SC_UNAUTHORIZED).entity(exception.getMessage()).type("text/plain").build(); + int status = SC_UNAUTHORIZED; + String message = getBundle().getString("mapping-violations", status); + getLogger().log(FINE, message, exception); + + return Response.status(status).build(); + } + + private ResourceBundle getBundle() { + if (bundle == null) { + bundle = Beans.getReference(ResourceBundle.class, new NameQualifier("demoiselle-rest-bundle")); + } + + return bundle; } private Logger getLogger() { if (logger == null) { - logger = Beans.getReference(Logger.class, new NameQualifier(AuthenticationExceptionMapper.class.getName())); + logger = Beans.getReference(Logger.class, new NameQualifier("br.gov.frameworkdemoiselle.exception")); } return logger; diff --git a/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/AuthorizationExceptionMapper.java b/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/AuthorizationExceptionMapper.java index 1372003..2e0a80e 100644 --- a/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/AuthorizationExceptionMapper.java +++ b/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/AuthorizationExceptionMapper.java @@ -1,5 +1,6 @@ package br.gov.frameworkdemoiselle.internal.implementation; +import static java.util.logging.Level.FINE; import static javax.servlet.http.HttpServletResponse.SC_FORBIDDEN; import java.util.logging.Logger; @@ -11,21 +12,35 @@ import javax.ws.rs.ext.Provider; import br.gov.frameworkdemoiselle.security.AuthorizationException; import br.gov.frameworkdemoiselle.util.Beans; import br.gov.frameworkdemoiselle.util.NameQualifier; +import br.gov.frameworkdemoiselle.util.ResourceBundle; @Provider public class AuthorizationExceptionMapper implements ExceptionMapper { + private transient ResourceBundle bundle; + private transient Logger logger; @Override public Response toResponse(AuthorizationException exception) { - getLogger().warning(exception.getMessage()); - return Response.status(SC_FORBIDDEN).build(); + int status = SC_FORBIDDEN; + String message = getBundle().getString("mapping-violations", status); + getLogger().log(FINE, message, exception); + + return Response.status(status).build(); + } + + private ResourceBundle getBundle() { + if (bundle == null) { + bundle = Beans.getReference(ResourceBundle.class, new NameQualifier("demoiselle-rest-bundle")); + } + + return bundle; } private Logger getLogger() { if (logger == null) { - logger = Beans.getReference(Logger.class, new NameQualifier(AuthorizationExceptionMapper.class.getName())); + logger = Beans.getReference(Logger.class, new NameQualifier("br.gov.frameworkdemoiselle.exception")); } return logger; diff --git a/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConstraintViolationExceptionMapper.java b/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConstraintViolationExceptionMapper.java index 112e6da..2fb9eb6 100644 --- a/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConstraintViolationExceptionMapper.java +++ b/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConstraintViolationExceptionMapper.java @@ -32,6 +32,7 @@ public class ConstraintViolationExceptionMapper implements ExceptionMapper { @Override public Response toResponse(Throwable exception) { - String message = getBundle().getString("internal.server.error"); + String message = getBundle().getString("internal-server-error"); getLogger().log(SEVERE, message, exception); return Response.status(INTERNAL_SERVER_ERROR).entity(message).build(); @@ -38,7 +38,7 @@ public class DefaultExceptionMapper implements ExceptionMapper { private Logger getLogger() { if (logger == null) { - logger = Beans.getReference(Logger.class, new NameQualifier(DefaultExceptionMapper.class.getName())); + logger = Beans.getReference(Logger.class, new NameQualifier("br.gov.frameworkdemoiselle.exception")); } return logger; diff --git a/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/EOFExceptionMapper.java b/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/EOFExceptionMapper.java new file mode 100644 index 0000000..5b95091 --- /dev/null +++ b/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/EOFExceptionMapper.java @@ -0,0 +1,48 @@ +package br.gov.frameworkdemoiselle.internal.implementation; + +import static java.util.logging.Level.FINE; +import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST; + +import java.io.EOFException; +import java.util.logging.Logger; + +import javax.ws.rs.core.Response; +import javax.ws.rs.ext.ExceptionMapper; +import javax.ws.rs.ext.Provider; + +import br.gov.frameworkdemoiselle.util.Beans; +import br.gov.frameworkdemoiselle.util.NameQualifier; +import br.gov.frameworkdemoiselle.util.ResourceBundle; + +@Provider +public class EOFExceptionMapper implements ExceptionMapper { + + private transient ResourceBundle bundle; + + private transient Logger logger; + + @Override + public Response toResponse(EOFException exception) { + int status = SC_BAD_REQUEST; + String message = getBundle().getString("mapping-violations", status); + getLogger().log(FINE, message, exception); + + return Response.status(status).build(); + } + + private ResourceBundle getBundle() { + if (bundle == null) { + bundle = Beans.getReference(ResourceBundle.class, new NameQualifier("demoiselle-rest-bundle")); + } + + return bundle; + } + + private Logger getLogger() { + if (logger == null) { + logger = Beans.getReference(Logger.class, new NameQualifier("br.gov.frameworkdemoiselle.exception")); + } + + return logger; + } +} diff --git a/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/HttpViolationExceptionMapper.java b/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/HttpViolationExceptionMapper.java index 291d62c..3c99143 100644 --- a/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/HttpViolationExceptionMapper.java +++ b/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/HttpViolationExceptionMapper.java @@ -1,5 +1,7 @@ package br.gov.frameworkdemoiselle.internal.implementation; +import static java.util.logging.Level.FINE; + import java.util.Set; import java.util.logging.Logger; @@ -28,7 +30,7 @@ public class HttpViolationExceptionMapper implements ExceptionMapper + * or write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + * ---------------------------------------------------------------------------- + * Este arquivo é parte do SERPRO Artifacts. + * + * O SERPRO Artifacts é um software livre; você pode redistribuí-lo e/ou + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação + * do Software Livre (FSF). + * + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português + * para maiores detalhes. + * + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título + * "LICENCA.txt", junto com esse programa. Se não, acesse + * ou escreva para a Fundação do Software Livre (FSF) Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. + */ +package br.gov.frameworkdemoiselle.internal.implementation; + +import static java.util.logging.Level.FINE; +import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST; + +import java.util.logging.Logger; + +import javax.ws.rs.core.Response; +import javax.ws.rs.ext.ExceptionMapper; +import javax.ws.rs.ext.Provider; + +import br.gov.frameworkdemoiselle.util.Beans; +import br.gov.frameworkdemoiselle.util.NameQualifier; +import br.gov.frameworkdemoiselle.util.ResourceBundle; + +@Provider +public class IllegalArgumentExceptionMapper implements ExceptionMapper { + + private transient ResourceBundle bundle; + + private transient Logger logger; + + @Override + public Response toResponse(IllegalArgumentException exception) { + int status = SC_BAD_REQUEST; + String message = getBundle().getString("mapping-violations", status); + getLogger().log(FINE, message, exception); + + return Response.status(status).build(); + } + + private ResourceBundle getBundle() { + if (bundle == null) { + bundle = Beans.getReference(ResourceBundle.class, new NameQualifier("demoiselle-rest-bundle")); + } + + return bundle; + } + + private Logger getLogger() { + if (logger == null) { + logger = Beans.getReference(Logger.class, new NameQualifier("br.gov.frameworkdemoiselle.exception")); + } + + return logger; + } +} diff --git a/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/NotLoggedInExceptionMapper.java b/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/NotLoggedInExceptionMapper.java deleted file mode 100644 index bdc18a8..0000000 --- a/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/NotLoggedInExceptionMapper.java +++ /dev/null @@ -1,31 +0,0 @@ -package br.gov.frameworkdemoiselle.internal.implementation; - -import static javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED; - -import javax.ws.rs.core.Response; -import javax.ws.rs.ext.ExceptionMapper; -import javax.ws.rs.ext.Provider; - -import br.gov.frameworkdemoiselle.security.NotLoggedInException; - -@Provider -public class NotLoggedInExceptionMapper implements ExceptionMapper { - - @Override - public Response toResponse(NotLoggedInException exception) { - // HttpServletRequest request = Beans.getReference(HttpServletRequest.class); - // String path = request.getRequestURI().substring(request.getContextPath().length()); - // - // Response response; - // - // if (path.indexOf("/api") > -1) { - // response = Response.status(SC_UNAUTHORIZED).header("WWW-Authenticate", "Basic realm=default").build(); - // } else { - // response = Response.status(SC_UNAUTHORIZED).build(); - // } - // - // return response; - - return Response.status(SC_UNAUTHORIZED).build(); - } -} diff --git a/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/security/AbstractHTTPAuthorizationFilter.java b/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/security/AbstractHTTPAuthorizationFilter.java index ddbc23b..29096f3 100644 --- a/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/security/AbstractHTTPAuthorizationFilter.java +++ b/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/security/AbstractHTTPAuthorizationFilter.java @@ -36,11 +36,13 @@ */ package br.gov.frameworkdemoiselle.security; +import static java.util.logging.Level.FINE; import static java.util.regex.Pattern.CASE_INSENSITIVE; import static javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED; import java.io.IOException; import java.util.Enumeration; +import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -54,10 +56,16 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import br.gov.frameworkdemoiselle.util.Beans; +import br.gov.frameworkdemoiselle.util.NameQualifier; +import br.gov.frameworkdemoiselle.util.ResourceBundle; import br.gov.frameworkdemoiselle.util.Strings; public abstract class AbstractHTTPAuthorizationFilter implements Filter { + private transient ResourceBundle bundle; + + private transient Logger logger; + @Override public void init(FilterConfig filterConfig) throws ServletException { } @@ -86,6 +94,9 @@ public abstract class AbstractHTTPAuthorizationFilter implements Filter { performLogout(request, response); } catch (InvalidCredentialsException cause) { + String message = getBundle().getString("authentication-failed"); + getLogger().log(FINE, message, cause); + setUnauthorizedStatus(response, cause); } @@ -151,4 +162,20 @@ public abstract class AbstractHTTPAuthorizationFilter implements Filter { response.setContentType("text/plain; charset=UTF-8"); response.getWriter().write(cause.getMessage()); } + + private ResourceBundle getBundle() { + if (bundle == null) { + bundle = Beans.getReference(ResourceBundle.class, new NameQualifier("demoiselle-rest-bundle")); + } + + return bundle; + } + + private Logger getLogger() { + if (logger == null) { + logger = Beans.getReference(Logger.class, new NameQualifier("br.gov.frameworkdemoiselle.security")); + } + + return logger; + } } diff --git a/impl/extension/rest/src/main/resources/demoiselle-rest-bundle.properties b/impl/extension/rest/src/main/resources/demoiselle-rest-bundle.properties index bbbd6fe..caaee22 100644 --- a/impl/extension/rest/src/main/resources/demoiselle-rest-bundle.properties +++ b/impl/extension/rest/src/main/resources/demoiselle-rest-bundle.properties @@ -33,5 +33,6 @@ # ou escreva para a Fundação do Software Livre (FSF) Inc., # 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. -internal.server.error=Erro interno do servidor -mapping-violations=Mapeando viola\u00E7\u00F5es com o status HTTP {0}\: {1} +internal-server-error=Erro interno do servidor +mapping-violations=Mapeando viola\u00E7\u00F5es com o status HTTP {0} +authentication-failed=Falha na autentica\u00E7\u00E3o diff --git a/impl/extension/rest/src/test/java/test/Tests.java b/impl/extension/rest/src/test/java/test/Tests.java index adeee97..00b8223 100644 --- a/impl/extension/rest/src/test/java/test/Tests.java +++ b/impl/extension/rest/src/test/java/test/Tests.java @@ -56,7 +56,7 @@ import br.gov.frameworkdemoiselle.internal.implementation.AuthorizationException import br.gov.frameworkdemoiselle.internal.implementation.ConstraintViolationExceptionMapper; import br.gov.frameworkdemoiselle.internal.implementation.DefaultExceptionMapper; import br.gov.frameworkdemoiselle.internal.implementation.HttpViolationExceptionMapper; -import br.gov.frameworkdemoiselle.internal.implementation.NotLoggedInExceptionMapper; +import br.gov.frameworkdemoiselle.internal.implementation.IllegalArgumentExceptionMapper; import br.gov.frameworkdemoiselle.internal.implementation.SessionNotPermittedListener; import br.gov.frameworkdemoiselle.security.AbstractHTTPAuthorizationFilter; import br.gov.frameworkdemoiselle.security.BasicAuthFilter; @@ -94,9 +94,10 @@ public final class Tests { .addClass(AuthenticationExceptionMapper.class) .addClass(AuthorizationExceptionMapper.class) .addClass(ConstraintViolationExceptionMapper.class) + .addClass(ConstraintViolationExceptionMapper.class) + .addClass(IllegalArgumentExceptionMapper.class) .addClass(DefaultExceptionMapper.class) .addClass(HttpViolationExceptionMapper.class) - .addClass(NotLoggedInExceptionMapper.class) .addClass(SessionNotPermittedListener.class) .addClass(AbstractHTTPAuthorizationFilter.class) .addClass(BasicAuthFilter.class) -- libgit2 0.21.2