From 2f3a8856ae76cc48a38547855a7b5dabdf3fd96e Mon Sep 17 00:00:00 2001 From: Cleverson Sacramento Date: Wed, 13 Aug 2014 07:02:30 -0300 Subject: [PATCH] Melhoria no tratamente de exceções --- archetype/html-rest/src/main/resources/archetype-resources/src/main/java/rest/BookmarkREST.java | 12 ++++++------ archetype/html-rest/src/main/resources/archetype-resources/src/main/webapp/js/controller/bookmark-edit.js | 2 +- archetype/html-rest/src/main/resources/archetype-resources/src/main/webapp/js/controller/login.js | 10 +++++----- archetype/html-rest/src/main/resources/archetype-resources/src/test/java/rest/BookmarkRESTTest.java | 27 ++++++++++++++------------- impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/ForbiddenException.java | 4 +--- impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/NotFoundException.java | 4 +--- impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConstraintViolationExceptionMapper.java | 5 ++--- impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/HTTPExceptionMapper.java | 15 --------------- impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/HttpViolationExceptionMapper.java | 8 +++++++- impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/security/AbstractHTTPAuthorizationFilter.java | 11 +++++++---- impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/security/BasicAuthFilter.java | 5 +++++ impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/security/TokenAuthFilter.java | 5 +++++ 12 files changed, 54 insertions(+), 54 deletions(-) delete mode 100644 impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/HTTPExceptionMapper.java diff --git a/archetype/html-rest/src/main/resources/archetype-resources/src/main/java/rest/BookmarkREST.java b/archetype/html-rest/src/main/resources/archetype-resources/src/main/java/rest/BookmarkREST.java index 22f0de0..5deb8b6 100644 --- a/archetype/html-rest/src/main/resources/archetype-resources/src/main/java/rest/BookmarkREST.java +++ b/archetype/html-rest/src/main/resources/archetype-resources/src/main/java/rest/BookmarkREST.java @@ -49,7 +49,7 @@ public class BookmarkREST { @GET @Path("{id}") @Produces("application/json") - public Bookmark load(@PathParam("id") Long id) { + public Bookmark load(@PathParam("id") Long id) throws Exception { Bookmark result = bc.load(id); if (result == null) { @@ -65,7 +65,7 @@ public class BookmarkREST { @ValidatePayload @Produces("application/json") @Consumes("application/json") - public Response insert(Bookmark entity, @Context UriInfo uriInfo) { + public Response insert(Bookmark entity, @Context UriInfo uriInfo) throws Exception { checkId(entity); String id = bc.insert(entity).getId().toString(); @@ -81,7 +81,7 @@ public class BookmarkREST { @ValidatePayload @Produces("application/json") @Consumes("application/json") - public void update(@PathParam("id") Long id, Bookmark entity) { + public void update(@PathParam("id") Long id, Bookmark entity) throws Exception { checkId(entity); load(id); @@ -93,7 +93,7 @@ public class BookmarkREST { @LoggedIn @Path("{id}") @Transactional - public void delete(@PathParam("id") Long id) { + public void delete(@PathParam("id") Long id) throws Exception { load(id); bc.delete(id); } @@ -101,11 +101,11 @@ public class BookmarkREST { @DELETE @LoggedIn @Transactional - public void delete(List ids) { + public void delete(List ids) throws Exception { bc.delete(ids); } - private void checkId(Bookmark entity) { + private void checkId(Bookmark entity) throws Exception { if (entity.getId() != null) { throw new BadRequestException(); } diff --git a/archetype/html-rest/src/main/resources/archetype-resources/src/main/webapp/js/controller/bookmark-edit.js b/archetype/html-rest/src/main/resources/archetype-resources/src/main/webapp/js/controller/bookmark-edit.js index 1e3d0c7..3db9695 100644 --- a/archetype/html-rest/src/main/resources/archetype-resources/src/main/webapp/js/controller/bookmark-edit.js +++ b/archetype/html-rest/src/main/resources/archetype-resources/src/main/webapp/js/controller/bookmark-edit.js @@ -68,7 +68,7 @@ function saveOk(data) { function saveFailed(request) { switch (request.status) { - case 412: + case 422: $($("form input").get().reverse()).each(function() { var id = $(this).attr('id'); var message = null; diff --git a/archetype/html-rest/src/main/resources/archetype-resources/src/main/webapp/js/controller/login.js b/archetype/html-rest/src/main/resources/archetype-resources/src/main/webapp/js/controller/login.js index 8d46ca2..a3bdbc6 100644 --- a/archetype/html-rest/src/main/resources/archetype-resources/src/main/webapp/js/controller/login.js +++ b/archetype/html-rest/src/main/resources/archetype-resources/src/main/webapp/js/controller/login.js @@ -3,14 +3,14 @@ $(function() { $("form").submit(function(event) { event.preventDefault(); - + $("[id$='-message']").hide(); - + var form = { 'username' : $("#username").val().trim(), 'password' : $("#password").val().trim() }; - + AuthProxy.login(form).done(loginOk).fail(loginFail); }); }); @@ -32,7 +32,7 @@ function loginFail(request) { $("#global-message").html("Usuário ou senha inválidos.").show(); break; - case 412: + case 422: $($("form input").get().reverse()).each(function() { var id = $(this).attr('id'); var message = null; @@ -54,4 +54,4 @@ function loginFail(request) { }); break; } -} \ No newline at end of file +} diff --git a/archetype/html-rest/src/main/resources/archetype-resources/src/test/java/rest/BookmarkRESTTest.java b/archetype/html-rest/src/main/resources/archetype-resources/src/test/java/rest/BookmarkRESTTest.java index 87fc078..28612bd 100644 --- a/archetype/html-rest/src/main/resources/archetype-resources/src/test/java/rest/BookmarkRESTTest.java +++ b/archetype/html-rest/src/main/resources/archetype-resources/src/test/java/rest/BookmarkRESTTest.java @@ -35,7 +35,8 @@ import org.junit.Before; import org.junit.Test; import ${package}.entity.Bookmark; -import br.gov.frameworkdemoiselle.PreconditionFailedException; +import br.gov.frameworkdemoiselle.HttpViolationException; +import br.gov.frameworkdemoiselle.UnprocessableEntityException; public class BookmarkRESTTest { @@ -169,8 +170,8 @@ public class BookmarkRESTTest { HttpPost request; CloseableHttpResponse response; Bookmark bookmark; - Set violations; - PreconditionFailedException expected; + Set violations; + HttpViolationException expected; bookmark = new Bookmark(); bookmark.setDescription("Google"); @@ -191,9 +192,9 @@ public class BookmarkRESTTest { response.close(); assertEquals(SC_PRECONDITION_FAILED, response.getStatusLine().getStatusCode()); violations = mapper.readValue(response.getEntity().getContent(), - new TypeReference>() { + new TypeReference>() { }); - expected = new PreconditionFailedException(); + expected = new UnprocessableEntityException(); expected.addViolation("description", "não pode ser nulo"); expected.addViolation("link", "não pode ser nulo"); assertEquals(expected.getViolations(), violations); @@ -209,9 +210,9 @@ public class BookmarkRESTTest { response.close(); assertEquals(SC_PRECONDITION_FAILED, response.getStatusLine().getStatusCode()); violations = mapper.readValue(response.getEntity().getContent(), - new TypeReference>() { + new TypeReference>() { }); - expected = new PreconditionFailedException().addViolation("link", "formato inválido"); + expected = new UnprocessableEntityException().addViolation("link", "formato inválido"); assertEquals(expected.getViolations(), violations); bookmark = new Bookmark(); @@ -266,8 +267,8 @@ public class BookmarkRESTTest { response.close(); Long id = parseEntity(response.getEntity(), Long.class); Bookmark bookmark; - Set violations; - PreconditionFailedException expected; + Set violations; + HttpViolationException expected; bookmark = new Bookmark(); bookmark.setDescription("Google"); @@ -288,9 +289,9 @@ public class BookmarkRESTTest { response.close(); assertEquals(SC_PRECONDITION_FAILED, response.getStatusLine().getStatusCode()); violations = mapper.readValue(response.getEntity().getContent(), - new TypeReference>() { + new TypeReference>() { }); - expected = new PreconditionFailedException(); + expected = new UnprocessableEntityException(); expected.addViolation("description", "não pode ser nulo"); expected.addViolation("link", "não pode ser nulo"); assertEquals(expected.getViolations(), violations); @@ -306,9 +307,9 @@ public class BookmarkRESTTest { response.close(); assertEquals(SC_PRECONDITION_FAILED, response.getStatusLine().getStatusCode()); violations = mapper.readValue(response.getEntity().getContent(), - new TypeReference>() { + new TypeReference>() { }); - expected = new PreconditionFailedException().addViolation("link", "formato inválido"); + expected = new UnprocessableEntityException().addViolation("link", "formato inválido"); assertEquals(expected.getViolations(), violations); bookmark = new Bookmark(); diff --git a/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/ForbiddenException.java b/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/ForbiddenException.java index 427829c..628fe5a 100644 --- a/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/ForbiddenException.java +++ b/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/ForbiddenException.java @@ -2,9 +2,7 @@ package br.gov.frameworkdemoiselle; import static javax.servlet.http.HttpServletResponse.SC_FORBIDDEN; -import javax.xml.ws.http.HTTPException; - -public class ForbiddenException extends HTTPException { +public class ForbiddenException extends HttpViolationException { private static final long serialVersionUID = 1L; diff --git a/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/NotFoundException.java b/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/NotFoundException.java index 167ec15..3656675 100644 --- a/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/NotFoundException.java +++ b/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/NotFoundException.java @@ -2,9 +2,7 @@ package br.gov.frameworkdemoiselle; import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND; -import javax.xml.ws.http.HTTPException; - -public class NotFoundException extends HTTPException { +public class NotFoundException extends HttpViolationException { private static final long serialVersionUID = 1L; 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 b87942d..b975178 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 @@ -1,7 +1,5 @@ package br.gov.frameworkdemoiselle.internal.implementation; -import static javax.ws.rs.core.Response.Status.PRECONDITION_FAILED; - import java.util.Iterator; import javax.validation.ConstraintViolation; @@ -24,6 +22,7 @@ public class ConstraintViolationExceptionMapper implements ExceptionMapper { - - @Override - public Response toResponse(HTTPException exception) { - return Response.status(exception.getStatusCode()).build(); - } -} 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 49e5aab..4505700 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,16 +1,22 @@ package br.gov.frameworkdemoiselle.internal.implementation; +import java.util.Set; + import javax.ws.rs.core.Response; import javax.ws.rs.ext.ExceptionMapper; import javax.ws.rs.ext.Provider; import br.gov.frameworkdemoiselle.HttpViolationException; +import br.gov.frameworkdemoiselle.HttpViolationException.Violation; @Provider public class HttpViolationExceptionMapper implements ExceptionMapper { @Override public Response toResponse(HttpViolationException exception) { - return Response.status(exception.getStatusCode()).entity(exception.getViolations()).build(); + Set violations = exception.getViolations(); + violations = violations.isEmpty() ? null : violations; + + return Response.status(exception.getStatusCode()).entity(violations).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 a73a452..f523af3 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 @@ -51,9 +51,6 @@ import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import br.gov.frameworkdemoiselle.security.AuthenticationException; -import br.gov.frameworkdemoiselle.security.InvalidCredentialsException; -import br.gov.frameworkdemoiselle.security.SecurityContext; import br.gov.frameworkdemoiselle.util.Beans; import br.gov.frameworkdemoiselle.util.Strings; @@ -70,7 +67,11 @@ public abstract class AbstractHTTPAuthorizationFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { - if (request instanceof HttpServletRequest && isSupported(getAuthHeader((HttpServletRequest) request))) { + + RESTSecurityConfig config = Beans.getReference(RESTSecurityConfig.class); + + if (request instanceof HttpServletRequest && isActive(config) + && isSupported(getAuthHeader((HttpServletRequest) request))) { try { performLogin((HttpServletRequest) request); chain.doFilter((HttpServletRequest) request, (HttpServletResponse) response); @@ -92,6 +93,8 @@ public abstract class AbstractHTTPAuthorizationFilter implements Filter { protected abstract boolean isSupported(String authHeader); + protected abstract boolean isActive(RESTSecurityConfig config); + protected abstract void prepareForLogin(); private void performLogin(HttpServletRequest request) { diff --git a/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/security/BasicAuthFilter.java b/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/security/BasicAuthFilter.java index 556761e..417395c 100644 --- a/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/security/BasicAuthFilter.java +++ b/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/security/BasicAuthFilter.java @@ -52,6 +52,11 @@ public class BasicAuthFilter extends AbstractHTTPAuthorizationFilter { } @Override + protected boolean isActive(RESTSecurityConfig config) { + return config.isBasicFilterActive(); + } + + @Override protected void prepareForLogin() { String[] basicCredentials = getCredentials(credentials); diff --git a/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/security/TokenAuthFilter.java b/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/security/TokenAuthFilter.java index f67add7..8b6c35e 100644 --- a/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/security/TokenAuthFilter.java +++ b/impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/security/TokenAuthFilter.java @@ -49,6 +49,11 @@ public class TokenAuthFilter extends AbstractHTTPAuthorizationFilter { } @Override + protected boolean isActive(RESTSecurityConfig config) { + return config.isTokenFilterActive(); + } + + @Override protected void prepareForLogin() { Beans.getReference(Token.class).setValue(token); } -- libgit2 0.21.2