Commit 2f3a8856ae76cc48a38547855a7b5dabdf3fd96e
1 parent
3d44961e
Exists in
master
Melhoria no tratamente de exceções
Showing
12 changed files
with
54 additions
and
54 deletions
Show diff stats
archetype/html-rest/src/main/resources/archetype-resources/src/main/java/rest/BookmarkREST.java
| ... | ... | @@ -49,7 +49,7 @@ public class BookmarkREST { |
| 49 | 49 | @GET |
| 50 | 50 | @Path("{id}") |
| 51 | 51 | @Produces("application/json") |
| 52 | - public Bookmark load(@PathParam("id") Long id) { | |
| 52 | + public Bookmark load(@PathParam("id") Long id) throws Exception { | |
| 53 | 53 | Bookmark result = bc.load(id); |
| 54 | 54 | |
| 55 | 55 | if (result == null) { |
| ... | ... | @@ -65,7 +65,7 @@ public class BookmarkREST { |
| 65 | 65 | @ValidatePayload |
| 66 | 66 | @Produces("application/json") |
| 67 | 67 | @Consumes("application/json") |
| 68 | - public Response insert(Bookmark entity, @Context UriInfo uriInfo) { | |
| 68 | + public Response insert(Bookmark entity, @Context UriInfo uriInfo) throws Exception { | |
| 69 | 69 | checkId(entity); |
| 70 | 70 | |
| 71 | 71 | String id = bc.insert(entity).getId().toString(); |
| ... | ... | @@ -81,7 +81,7 @@ public class BookmarkREST { |
| 81 | 81 | @ValidatePayload |
| 82 | 82 | @Produces("application/json") |
| 83 | 83 | @Consumes("application/json") |
| 84 | - public void update(@PathParam("id") Long id, Bookmark entity) { | |
| 84 | + public void update(@PathParam("id") Long id, Bookmark entity) throws Exception { | |
| 85 | 85 | checkId(entity); |
| 86 | 86 | load(id); |
| 87 | 87 | |
| ... | ... | @@ -93,7 +93,7 @@ public class BookmarkREST { |
| 93 | 93 | @LoggedIn |
| 94 | 94 | @Path("{id}") |
| 95 | 95 | @Transactional |
| 96 | - public void delete(@PathParam("id") Long id) { | |
| 96 | + public void delete(@PathParam("id") Long id) throws Exception { | |
| 97 | 97 | load(id); |
| 98 | 98 | bc.delete(id); |
| 99 | 99 | } |
| ... | ... | @@ -101,11 +101,11 @@ public class BookmarkREST { |
| 101 | 101 | @DELETE |
| 102 | 102 | @LoggedIn |
| 103 | 103 | @Transactional |
| 104 | - public void delete(List<Long> ids) { | |
| 104 | + public void delete(List<Long> ids) throws Exception { | |
| 105 | 105 | bc.delete(ids); |
| 106 | 106 | } |
| 107 | 107 | |
| 108 | - private void checkId(Bookmark entity) { | |
| 108 | + private void checkId(Bookmark entity) throws Exception { | |
| 109 | 109 | if (entity.getId() != null) { |
| 110 | 110 | throw new BadRequestException(); |
| 111 | 111 | } | ... | ... |
archetype/html-rest/src/main/resources/archetype-resources/src/main/webapp/js/controller/bookmark-edit.js
archetype/html-rest/src/main/resources/archetype-resources/src/main/webapp/js/controller/login.js
| ... | ... | @@ -3,14 +3,14 @@ $(function() { |
| 3 | 3 | |
| 4 | 4 | $("form").submit(function(event) { |
| 5 | 5 | event.preventDefault(); |
| 6 | - | |
| 6 | + | |
| 7 | 7 | $("[id$='-message']").hide(); |
| 8 | - | |
| 8 | + | |
| 9 | 9 | var form = { |
| 10 | 10 | 'username' : $("#username").val().trim(), |
| 11 | 11 | 'password' : $("#password").val().trim() |
| 12 | 12 | }; |
| 13 | - | |
| 13 | + | |
| 14 | 14 | AuthProxy.login(form).done(loginOk).fail(loginFail); |
| 15 | 15 | }); |
| 16 | 16 | }); |
| ... | ... | @@ -32,7 +32,7 @@ function loginFail(request) { |
| 32 | 32 | $("#global-message").html("Usuário ou senha inválidos.").show(); |
| 33 | 33 | break; |
| 34 | 34 | |
| 35 | - case 412: | |
| 35 | + case 422: | |
| 36 | 36 | $($("form input").get().reverse()).each(function() { |
| 37 | 37 | var id = $(this).attr('id'); |
| 38 | 38 | var message = null; |
| ... | ... | @@ -54,4 +54,4 @@ function loginFail(request) { |
| 54 | 54 | }); |
| 55 | 55 | break; |
| 56 | 56 | } |
| 57 | -} | |
| 58 | 57 | \ No newline at end of file |
| 58 | +} | ... | ... |
archetype/html-rest/src/main/resources/archetype-resources/src/test/java/rest/BookmarkRESTTest.java
| ... | ... | @@ -35,7 +35,8 @@ import org.junit.Before; |
| 35 | 35 | import org.junit.Test; |
| 36 | 36 | |
| 37 | 37 | import ${package}.entity.Bookmark; |
| 38 | -import br.gov.frameworkdemoiselle.PreconditionFailedException; | |
| 38 | +import br.gov.frameworkdemoiselle.HttpViolationException; | |
| 39 | +import br.gov.frameworkdemoiselle.UnprocessableEntityException; | |
| 39 | 40 | |
| 40 | 41 | public class BookmarkRESTTest { |
| 41 | 42 | |
| ... | ... | @@ -169,8 +170,8 @@ public class BookmarkRESTTest { |
| 169 | 170 | HttpPost request; |
| 170 | 171 | CloseableHttpResponse response; |
| 171 | 172 | Bookmark bookmark; |
| 172 | - Set<PreconditionFailedException.Violation> violations; | |
| 173 | - PreconditionFailedException expected; | |
| 173 | + Set<UnprocessableEntityException.Violation> violations; | |
| 174 | + HttpViolationException expected; | |
| 174 | 175 | |
| 175 | 176 | bookmark = new Bookmark(); |
| 176 | 177 | bookmark.setDescription("Google"); |
| ... | ... | @@ -191,9 +192,9 @@ public class BookmarkRESTTest { |
| 191 | 192 | response.close(); |
| 192 | 193 | assertEquals(SC_PRECONDITION_FAILED, response.getStatusLine().getStatusCode()); |
| 193 | 194 | violations = mapper.readValue(response.getEntity().getContent(), |
| 194 | - new TypeReference<Set<PreconditionFailedException.Violation>>() { | |
| 195 | + new TypeReference<Set<UnprocessableEntityException.Violation>>() { | |
| 195 | 196 | }); |
| 196 | - expected = new PreconditionFailedException(); | |
| 197 | + expected = new UnprocessableEntityException(); | |
| 197 | 198 | expected.addViolation("description", "não pode ser nulo"); |
| 198 | 199 | expected.addViolation("link", "não pode ser nulo"); |
| 199 | 200 | assertEquals(expected.getViolations(), violations); |
| ... | ... | @@ -209,9 +210,9 @@ public class BookmarkRESTTest { |
| 209 | 210 | response.close(); |
| 210 | 211 | assertEquals(SC_PRECONDITION_FAILED, response.getStatusLine().getStatusCode()); |
| 211 | 212 | violations = mapper.readValue(response.getEntity().getContent(), |
| 212 | - new TypeReference<Set<PreconditionFailedException.Violation>>() { | |
| 213 | + new TypeReference<Set<UnprocessableEntityException.Violation>>() { | |
| 213 | 214 | }); |
| 214 | - expected = new PreconditionFailedException().addViolation("link", "formato inválido"); | |
| 215 | + expected = new UnprocessableEntityException().addViolation("link", "formato inválido"); | |
| 215 | 216 | assertEquals(expected.getViolations(), violations); |
| 216 | 217 | |
| 217 | 218 | bookmark = new Bookmark(); |
| ... | ... | @@ -266,8 +267,8 @@ public class BookmarkRESTTest { |
| 266 | 267 | response.close(); |
| 267 | 268 | Long id = parseEntity(response.getEntity(), Long.class); |
| 268 | 269 | Bookmark bookmark; |
| 269 | - Set<PreconditionFailedException.Violation> violations; | |
| 270 | - PreconditionFailedException expected; | |
| 270 | + Set<UnprocessableEntityException.Violation> violations; | |
| 271 | + HttpViolationException expected; | |
| 271 | 272 | |
| 272 | 273 | bookmark = new Bookmark(); |
| 273 | 274 | bookmark.setDescription("Google"); |
| ... | ... | @@ -288,9 +289,9 @@ public class BookmarkRESTTest { |
| 288 | 289 | response.close(); |
| 289 | 290 | assertEquals(SC_PRECONDITION_FAILED, response.getStatusLine().getStatusCode()); |
| 290 | 291 | violations = mapper.readValue(response.getEntity().getContent(), |
| 291 | - new TypeReference<Set<PreconditionFailedException.Violation>>() { | |
| 292 | + new TypeReference<Set<UnprocessableEntityException.Violation>>() { | |
| 292 | 293 | }); |
| 293 | - expected = new PreconditionFailedException(); | |
| 294 | + expected = new UnprocessableEntityException(); | |
| 294 | 295 | expected.addViolation("description", "não pode ser nulo"); |
| 295 | 296 | expected.addViolation("link", "não pode ser nulo"); |
| 296 | 297 | assertEquals(expected.getViolations(), violations); |
| ... | ... | @@ -306,9 +307,9 @@ public class BookmarkRESTTest { |
| 306 | 307 | response.close(); |
| 307 | 308 | assertEquals(SC_PRECONDITION_FAILED, response.getStatusLine().getStatusCode()); |
| 308 | 309 | violations = mapper.readValue(response.getEntity().getContent(), |
| 309 | - new TypeReference<Set<PreconditionFailedException.Violation>>() { | |
| 310 | + new TypeReference<Set<UnprocessableEntityException.Violation>>() { | |
| 310 | 311 | }); |
| 311 | - expected = new PreconditionFailedException().addViolation("link", "formato inválido"); | |
| 312 | + expected = new UnprocessableEntityException().addViolation("link", "formato inválido"); | |
| 312 | 313 | assertEquals(expected.getViolations(), violations); |
| 313 | 314 | |
| 314 | 315 | bookmark = new Bookmark(); | ... | ... |
impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/ForbiddenException.java
| ... | ... | @@ -2,9 +2,7 @@ package br.gov.frameworkdemoiselle; |
| 2 | 2 | |
| 3 | 3 | import static javax.servlet.http.HttpServletResponse.SC_FORBIDDEN; |
| 4 | 4 | |
| 5 | -import javax.xml.ws.http.HTTPException; | |
| 6 | - | |
| 7 | -public class ForbiddenException extends HTTPException { | |
| 5 | +public class ForbiddenException extends HttpViolationException { | |
| 8 | 6 | |
| 9 | 7 | private static final long serialVersionUID = 1L; |
| 10 | 8 | ... | ... |
impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/NotFoundException.java
| ... | ... | @@ -2,9 +2,7 @@ package br.gov.frameworkdemoiselle; |
| 2 | 2 | |
| 3 | 3 | import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND; |
| 4 | 4 | |
| 5 | -import javax.xml.ws.http.HTTPException; | |
| 6 | - | |
| 7 | -public class NotFoundException extends HTTPException { | |
| 5 | +public class NotFoundException extends HttpViolationException { | |
| 8 | 6 | |
| 9 | 7 | private static final long serialVersionUID = 1L; |
| 10 | 8 | ... | ... |
impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConstraintViolationExceptionMapper.java
| 1 | 1 | package br.gov.frameworkdemoiselle.internal.implementation; |
| 2 | 2 | |
| 3 | -import static javax.ws.rs.core.Response.Status.PRECONDITION_FAILED; | |
| 4 | - | |
| 5 | 3 | import java.util.Iterator; |
| 6 | 4 | |
| 7 | 5 | import javax.validation.ConstraintViolation; |
| ... | ... | @@ -24,6 +22,7 @@ public class ConstraintViolationExceptionMapper implements ExceptionMapper<Const |
| 24 | 22 | failed.addViolation(violation.getPropertyPath().toString(), violation.getMessage()); |
| 25 | 23 | } |
| 26 | 24 | |
| 27 | - return Response.status(PRECONDITION_FAILED).entity(failed.getViolations()).build(); | |
| 25 | + int status = new UnprocessableEntityException().getStatusCode(); | |
| 26 | + return Response.status(status).entity(failed.getViolations()).build(); | |
| 28 | 27 | } |
| 29 | 28 | } | ... | ... |
impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/HTTPExceptionMapper.java
| ... | ... | @@ -1,15 +0,0 @@ |
| 1 | -package br.gov.frameworkdemoiselle.internal.implementation; | |
| 2 | - | |
| 3 | -import javax.ws.rs.core.Response; | |
| 4 | -import javax.ws.rs.ext.ExceptionMapper; | |
| 5 | -import javax.ws.rs.ext.Provider; | |
| 6 | -import javax.xml.ws.http.HTTPException; | |
| 7 | - | |
| 8 | -@Provider | |
| 9 | -public class HTTPExceptionMapper implements ExceptionMapper<HTTPException> { | |
| 10 | - | |
| 11 | - @Override | |
| 12 | - public Response toResponse(HTTPException exception) { | |
| 13 | - return Response.status(exception.getStatusCode()).build(); | |
| 14 | - } | |
| 15 | -} |
impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/HttpViolationExceptionMapper.java
| 1 | 1 | package br.gov.frameworkdemoiselle.internal.implementation; |
| 2 | 2 | |
| 3 | +import java.util.Set; | |
| 4 | + | |
| 3 | 5 | import javax.ws.rs.core.Response; |
| 4 | 6 | import javax.ws.rs.ext.ExceptionMapper; |
| 5 | 7 | import javax.ws.rs.ext.Provider; |
| 6 | 8 | |
| 7 | 9 | import br.gov.frameworkdemoiselle.HttpViolationException; |
| 10 | +import br.gov.frameworkdemoiselle.HttpViolationException.Violation; | |
| 8 | 11 | |
| 9 | 12 | @Provider |
| 10 | 13 | public class HttpViolationExceptionMapper implements ExceptionMapper<HttpViolationException> { |
| 11 | 14 | |
| 12 | 15 | @Override |
| 13 | 16 | public Response toResponse(HttpViolationException exception) { |
| 14 | - return Response.status(exception.getStatusCode()).entity(exception.getViolations()).build(); | |
| 17 | + Set<Violation> violations = exception.getViolations(); | |
| 18 | + violations = violations.isEmpty() ? null : violations; | |
| 19 | + | |
| 20 | + return Response.status(exception.getStatusCode()).entity(violations).build(); | |
| 15 | 21 | } |
| 16 | 22 | } | ... | ... |
impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/security/AbstractHTTPAuthorizationFilter.java
| ... | ... | @@ -51,9 +51,6 @@ import javax.servlet.ServletResponse; |
| 51 | 51 | import javax.servlet.http.HttpServletRequest; |
| 52 | 52 | import javax.servlet.http.HttpServletResponse; |
| 53 | 53 | |
| 54 | -import br.gov.frameworkdemoiselle.security.AuthenticationException; | |
| 55 | -import br.gov.frameworkdemoiselle.security.InvalidCredentialsException; | |
| 56 | -import br.gov.frameworkdemoiselle.security.SecurityContext; | |
| 57 | 54 | import br.gov.frameworkdemoiselle.util.Beans; |
| 58 | 55 | import br.gov.frameworkdemoiselle.util.Strings; |
| 59 | 56 | |
| ... | ... | @@ -70,7 +67,11 @@ public abstract class AbstractHTTPAuthorizationFilter implements Filter { |
| 70 | 67 | @Override |
| 71 | 68 | public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, |
| 72 | 69 | ServletException { |
| 73 | - if (request instanceof HttpServletRequest && isSupported(getAuthHeader((HttpServletRequest) request))) { | |
| 70 | + | |
| 71 | + RESTSecurityConfig config = Beans.getReference(RESTSecurityConfig.class); | |
| 72 | + | |
| 73 | + if (request instanceof HttpServletRequest && isActive(config) | |
| 74 | + && isSupported(getAuthHeader((HttpServletRequest) request))) { | |
| 74 | 75 | try { |
| 75 | 76 | performLogin((HttpServletRequest) request); |
| 76 | 77 | chain.doFilter((HttpServletRequest) request, (HttpServletResponse) response); |
| ... | ... | @@ -92,6 +93,8 @@ public abstract class AbstractHTTPAuthorizationFilter implements Filter { |
| 92 | 93 | |
| 93 | 94 | protected abstract boolean isSupported(String authHeader); |
| 94 | 95 | |
| 96 | + protected abstract boolean isActive(RESTSecurityConfig config); | |
| 97 | + | |
| 95 | 98 | protected abstract void prepareForLogin(); |
| 96 | 99 | |
| 97 | 100 | private void performLogin(HttpServletRequest request) { | ... | ... |
impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/security/BasicAuthFilter.java
| ... | ... | @@ -52,6 +52,11 @@ public class BasicAuthFilter extends AbstractHTTPAuthorizationFilter { |
| 52 | 52 | } |
| 53 | 53 | |
| 54 | 54 | @Override |
| 55 | + protected boolean isActive(RESTSecurityConfig config) { | |
| 56 | + return config.isBasicFilterActive(); | |
| 57 | + } | |
| 58 | + | |
| 59 | + @Override | |
| 55 | 60 | protected void prepareForLogin() { |
| 56 | 61 | String[] basicCredentials = getCredentials(credentials); |
| 57 | 62 | ... | ... |
impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/security/TokenAuthFilter.java
| ... | ... | @@ -49,6 +49,11 @@ public class TokenAuthFilter extends AbstractHTTPAuthorizationFilter { |
| 49 | 49 | } |
| 50 | 50 | |
| 51 | 51 | @Override |
| 52 | + protected boolean isActive(RESTSecurityConfig config) { | |
| 53 | + return config.isTokenFilterActive(); | |
| 54 | + } | |
| 55 | + | |
| 56 | + @Override | |
| 52 | 57 | protected void prepareForLogin() { |
| 53 | 58 | Beans.getReference(Token.class).setValue(token); |
| 54 | 59 | } | ... | ... |