Commit 4724a696d7bf3ab7ce267eae58848ec21514c35f
1 parent
50340724
Estrutura de pacotes do REST renomeada.
Showing
22 changed files
with
411 additions
and
410 deletions
Show diff stats
demoiselle-core/src/main/java/org/demoiselle/jee/core/message/DemoiselleMessage.java
| ... | ... | @@ -46,7 +46,7 @@ public interface DemoiselleMessage { |
| 46 | 46 | String takingOff(); |
| 47 | 47 | |
| 48 | 48 | @MessageTemplate("{engine-off}") |
| 49 | - String engineOff(String ex); | |
| 49 | + String engineOff(); | |
| 50 | 50 | |
| 51 | 51 | @MessageTemplate("{setting-up-bean-manager}") |
| 52 | 52 | String settingUpBeanManagerException(String util); | ... | ... |
demoiselle-rest/src/main/java/org/demoiselle/jee/rest/annotation/Cache.java
0 → 100644
| ... | ... | @@ -0,0 +1,29 @@ |
| 1 | +/* | |
| 2 | + * To change this license header, choose License Headers in Project Properties. | |
| 3 | + * To change this template file, choose Tools | Templates | |
| 4 | + * and open the template in the editor. | |
| 5 | + */ | |
| 6 | +package org.demoiselle.jee.rest.annotation; | |
| 7 | + | |
| 8 | +import static java.lang.annotation.ElementType.METHOD; | |
| 9 | +import static java.lang.annotation.ElementType.TYPE; | |
| 10 | +import java.lang.annotation.Inherited; | |
| 11 | +import java.lang.annotation.Retention; | |
| 12 | +import static java.lang.annotation.RetentionPolicy.RUNTIME; | |
| 13 | +import java.lang.annotation.Target; | |
| 14 | +import javax.enterprise.util.Nonbinding; | |
| 15 | +import javax.interceptor.InterceptorBinding; | |
| 16 | + | |
| 17 | +/** | |
| 18 | + * | |
| 19 | + * @author 70744416353 | |
| 20 | + */ | |
| 21 | +@Inherited | |
| 22 | +@InterceptorBinding | |
| 23 | +@Target({ METHOD, TYPE }) | |
| 24 | +@Retention(RUNTIME) | |
| 25 | +public @interface Cache { | |
| 26 | + | |
| 27 | + @Nonbinding | |
| 28 | + String value() default "max-age=0"; | |
| 29 | +} | ... | ... |
demoiselle-rest/src/main/java/org/demoiselle/jee/rest/annotation/CorsAllowMethods.java
0 → 100644
| ... | ... | @@ -0,0 +1,26 @@ |
| 1 | +/* | |
| 2 | + * To change this license header, choose License Headers in Project Properties. | |
| 3 | + * To change this template file, choose Tools | Templates | |
| 4 | + * and open the template in the editor. | |
| 5 | + */ | |
| 6 | +package org.demoiselle.jee.rest.annotation; | |
| 7 | + | |
| 8 | +import static java.lang.annotation.ElementType.METHOD; | |
| 9 | +import static java.lang.annotation.ElementType.TYPE; | |
| 10 | +import java.lang.annotation.Inherited; | |
| 11 | +import java.lang.annotation.Retention; | |
| 12 | +import static java.lang.annotation.RetentionPolicy.RUNTIME; | |
| 13 | +import java.lang.annotation.Target; | |
| 14 | +import javax.enterprise.util.Nonbinding; | |
| 15 | +import javax.interceptor.InterceptorBinding; | |
| 16 | + | |
| 17 | +/** | |
| 18 | + * | |
| 19 | + * @author 70744416353 | |
| 20 | + */ | |
| 21 | +@Inherited | |
| 22 | +@InterceptorBinding | |
| 23 | +@Target({METHOD, TYPE}) | |
| 24 | +@Retention(RUNTIME) | |
| 25 | +public @interface CorsAllowMethods { | |
| 26 | +} | ... | ... |
demoiselle-rest/src/main/java/org/demoiselle/jee/rest/annotation/CorsAllowOrigin.java
0 → 100644
| ... | ... | @@ -0,0 +1,29 @@ |
| 1 | +/* | |
| 2 | + * To change this license header, choose License Headers in Project Properties. | |
| 3 | + * To change this template file, choose Tools | Templates | |
| 4 | + * and open the template in the editor. | |
| 5 | + */ | |
| 6 | +package org.demoiselle.jee.rest.annotation; | |
| 7 | + | |
| 8 | +import static java.lang.annotation.ElementType.METHOD; | |
| 9 | +import static java.lang.annotation.ElementType.TYPE; | |
| 10 | +import java.lang.annotation.Inherited; | |
| 11 | +import java.lang.annotation.Retention; | |
| 12 | +import static java.lang.annotation.RetentionPolicy.RUNTIME; | |
| 13 | +import java.lang.annotation.Target; | |
| 14 | +import javax.enterprise.util.Nonbinding; | |
| 15 | +import javax.interceptor.InterceptorBinding; | |
| 16 | + | |
| 17 | +/** | |
| 18 | + * | |
| 19 | + * @author 70744416353 | |
| 20 | + */ | |
| 21 | +@Inherited | |
| 22 | +@InterceptorBinding | |
| 23 | +@Target({METHOD, TYPE}) | |
| 24 | +@Retention(RUNTIME) | |
| 25 | +public @interface CorsAllowOrigin { | |
| 26 | + | |
| 27 | + @Nonbinding | |
| 28 | + String value() default "*"; | |
| 29 | +} | ... | ... |
demoiselle-rest/src/main/java/org/demoiselle/jee/rest/annotation/CorsMaxAge.java
0 → 100644
| ... | ... | @@ -0,0 +1,29 @@ |
| 1 | +/* | |
| 2 | + * To change this license header, choose License Headers in Project Properties. | |
| 3 | + * To change this template file, choose Tools | Templates | |
| 4 | + * and open the template in the editor. | |
| 5 | + */ | |
| 6 | +package org.demoiselle.jee.rest.annotation; | |
| 7 | + | |
| 8 | +import static java.lang.annotation.ElementType.METHOD; | |
| 9 | +import static java.lang.annotation.ElementType.TYPE; | |
| 10 | +import java.lang.annotation.Inherited; | |
| 11 | +import java.lang.annotation.Retention; | |
| 12 | +import static java.lang.annotation.RetentionPolicy.RUNTIME; | |
| 13 | +import java.lang.annotation.Target; | |
| 14 | +import javax.enterprise.util.Nonbinding; | |
| 15 | +import javax.interceptor.InterceptorBinding; | |
| 16 | + | |
| 17 | +/** | |
| 18 | + * | |
| 19 | + * @author 70744416353 | |
| 20 | + */ | |
| 21 | +@Inherited | |
| 22 | +@InterceptorBinding | |
| 23 | +@Target({METHOD, TYPE}) | |
| 24 | +@Retention(RUNTIME) | |
| 25 | +public @interface CorsMaxAge { | |
| 26 | + | |
| 27 | + @Nonbinding | |
| 28 | + String value() default "0"; | |
| 29 | +} | ... | ... |
demoiselle-rest/src/main/java/org/demoiselle/jee/rest/annotation/ValidatePayload.java
0 → 100644
| ... | ... | @@ -0,0 +1,25 @@ |
| 1 | +/* | |
| 2 | + * Demoiselle Framework | |
| 3 | + * | |
| 4 | + * License: GNU Lesser General Public License (LGPL), version 3 or later. | |
| 5 | + * See the lgpl.txt file in the root directory or <https://www.gnu.org/licenses/lgpl.html>. | |
| 6 | + */ | |
| 7 | +package org.demoiselle.jee.rest.annotation; | |
| 8 | + | |
| 9 | +import static java.lang.annotation.ElementType.METHOD; | |
| 10 | +import static java.lang.annotation.ElementType.TYPE; | |
| 11 | +import static java.lang.annotation.RetentionPolicy.RUNTIME; | |
| 12 | + | |
| 13 | +import java.lang.annotation.Inherited; | |
| 14 | +import java.lang.annotation.Retention; | |
| 15 | +import java.lang.annotation.Target; | |
| 16 | + | |
| 17 | +import javax.interceptor.InterceptorBinding; | |
| 18 | + | |
| 19 | +@Inherited | |
| 20 | +@InterceptorBinding | |
| 21 | +@Target({ METHOD, TYPE }) | |
| 22 | +@Retention(RUNTIME) | |
| 23 | +public @interface ValidatePayload { | |
| 24 | + | |
| 25 | +} | |
| 0 | 26 | \ No newline at end of file | ... | ... |
demoiselle-rest/src/main/java/org/demoiselle/jee/rest/crud/package-info.java
0 → 100644
| ... | ... | @@ -0,0 +1,11 @@ |
| 1 | +/* | |
| 2 | + * Demoiselle Framework | |
| 3 | + * | |
| 4 | + * License: GNU Lesser General Public License (LGPL), version 3 or later. | |
| 5 | + * See the lgpl.txt file in the root directory or <https://www.gnu.org/licenses/lgpl.html>. | |
| 6 | + */ | |
| 7 | +/** | |
| 8 | + * Esta pacote tem o objetivo de conter as classes relacionadas aos | |
| 9 | + * facilitadores de CRUD do framework Demoiselle. | |
| 10 | + */ | |
| 11 | +package org.demoiselle.jee.rest.crud; | |
| 0 | 12 | \ No newline at end of file | ... | ... |
demoiselle-rest/src/main/java/org/demoiselle/jee/rest/exception/DemoiselleRESTException.java
0 → 100644
| ... | ... | @@ -0,0 +1,41 @@ |
| 1 | +/* | |
| 2 | + * Demoiselle Framework | |
| 3 | + * | |
| 4 | + * License: GNU Lesser General Public License (LGPL), version 3 or later. | |
| 5 | + * See the lgpl.txt file in the root directory or <https://www.gnu.org/licenses/lgpl.html>. | |
| 6 | + */ | |
| 7 | +package org.demoiselle.jee.rest.exception; | |
| 8 | + | |
| 9 | +import java.util.HashMap; | |
| 10 | + | |
| 11 | +import org.demoiselle.jee.core.exception.DemoiselleException; | |
| 12 | + | |
| 13 | +public class DemoiselleRESTException extends DemoiselleException { | |
| 14 | + | |
| 15 | + private static final long serialVersionUID = 519965615171844237L; | |
| 16 | + | |
| 17 | + private HashMap<String, String> messages = new HashMap<>(); | |
| 18 | + | |
| 19 | + private int statusCode; | |
| 20 | + | |
| 21 | + public DemoiselleRESTException() { | |
| 22 | + | |
| 23 | + } | |
| 24 | + | |
| 25 | + public DemoiselleRESTException(String string) { | |
| 26 | + super(string); | |
| 27 | + } | |
| 28 | + | |
| 29 | + public int getStatusCode() { | |
| 30 | + return statusCode; | |
| 31 | + } | |
| 32 | + | |
| 33 | + public void addMessage(String field, String msg) { | |
| 34 | + this.statusCode = 422; | |
| 35 | + messages.put(field, msg); | |
| 36 | + } | |
| 37 | + | |
| 38 | + public HashMap<String, String> getMessages() { | |
| 39 | + return messages; | |
| 40 | + } | |
| 41 | +} | ... | ... |
demoiselle-rest/src/main/java/org/demoiselle/jee/rest/exception/mapper/GenericExceptionMapper.java
0 → 100644
| ... | ... | @@ -0,0 +1,78 @@ |
| 1 | +/* | |
| 2 | + * Demoiselle Framework | |
| 3 | + * | |
| 4 | + * License: GNU Lesser General Public License (LGPL), version 3 or later. | |
| 5 | + * See the lgpl.txt file in the root directory or <https://www.gnu.org/licenses/lgpl.html>. | |
| 6 | + */ | |
| 7 | +package org.demoiselle.jee.rest.exception.mapper; | |
| 8 | + | |
| 9 | +import java.io.PrintWriter; | |
| 10 | +import java.io.StringWriter; | |
| 11 | +import java.util.HashMap; | |
| 12 | + | |
| 13 | +import javax.ws.rs.WebApplicationException; | |
| 14 | +import javax.ws.rs.core.MediaType; | |
| 15 | +import static javax.ws.rs.core.MediaType.APPLICATION_JSON; | |
| 16 | +import javax.ws.rs.core.Response; | |
| 17 | +import static javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR; | |
| 18 | +import static javax.ws.rs.core.Response.status; | |
| 19 | +import static javax.ws.rs.core.Response.status; | |
| 20 | +import static javax.ws.rs.core.Response.status; | |
| 21 | +import static javax.ws.rs.core.Response.status; | |
| 22 | +import javax.ws.rs.ext.ExceptionMapper; | |
| 23 | +import javax.ws.rs.ext.Provider; | |
| 24 | + | |
| 25 | +import org.demoiselle.jee.rest.exception.DemoiselleRESTException; | |
| 26 | + | |
| 27 | +@Provider | |
| 28 | +public class GenericExceptionMapper implements ExceptionMapper<Exception> { | |
| 29 | + | |
| 30 | + public Response toResponse(Exception ex) { | |
| 31 | + | |
| 32 | + StringWriter errorStackTrace = new StringWriter(); | |
| 33 | + ex.printStackTrace(new PrintWriter(errorStackTrace)); | |
| 34 | + | |
| 35 | + // Verifica se a exception é de validação de PAYLOAD do REST | |
| 36 | + if (ex instanceof DemoiselleRESTException) { | |
| 37 | + DemoiselleRESTException exDemoiselleREST = (DemoiselleRESTException) ex; | |
| 38 | + if (!exDemoiselleREST.getMessages().isEmpty()) { | |
| 39 | + return status(exDemoiselleREST.getStatusCode()).entity(exDemoiselleREST.getMessages()) | |
| 40 | + .type(APPLICATION_JSON).build(); | |
| 41 | + } else if (exDemoiselleREST.getStatusCode() > 0){ | |
| 42 | + return status(exDemoiselleREST.getStatusCode()).entity(exDemoiselleREST.getMessage()) | |
| 43 | + .type(APPLICATION_JSON).build(); | |
| 44 | + } | |
| 45 | + | |
| 46 | + } | |
| 47 | + | |
| 48 | + HashMap<String, String> entity = new HashMap<>(); | |
| 49 | + | |
| 50 | + // No caso de existir message ele mostra a MESSAGE da Exception | |
| 51 | + if (ex.getMessage() != null) { | |
| 52 | + entity.put("error", ex.getMessage()); | |
| 53 | + | |
| 54 | + // Pega toda as mensagens da stacktrace | |
| 55 | + int level = 1; | |
| 56 | + while (ex.getCause() != null) { | |
| 57 | + ex = (Exception) ex.getCause(); | |
| 58 | + if (!ex.getMessage().isEmpty()) { | |
| 59 | + entity.put("inner_cause_" + level, ex.getMessage()); | |
| 60 | + } | |
| 61 | + level += 1; | |
| 62 | + } | |
| 63 | + | |
| 64 | + // Por padrão retorna SERVER ERROR, mas tenta encontrar o status do RESPONSE se for WebApplicationException | |
| 65 | + // http://docs.oracle.com/javaee/7/api/javax/ws/rs/WebApplicationException.html | |
| 66 | + int responseCode = INTERNAL_SERVER_ERROR.getStatusCode(); | |
| 67 | + if (ex instanceof WebApplicationException) { | |
| 68 | + responseCode = ((WebApplicationException) ex).getResponse().getStatus(); | |
| 69 | + } | |
| 70 | + | |
| 71 | + return status(responseCode).entity(entity).type(APPLICATION_JSON).build(); | |
| 72 | + } | |
| 73 | + | |
| 74 | + entity.put("error", "Erro interno desconhecido no servidor."); | |
| 75 | + return status(500).entity(entity).type(APPLICATION_JSON).build(); | |
| 76 | + } | |
| 77 | + | |
| 78 | +} | ... | ... |
demoiselle-rest/src/main/java/org/demoiselle/jee/rest/filter/JaxRsFilter.java
0 → 100644
| ... | ... | @@ -0,0 +1,74 @@ |
| 1 | +/* | |
| 2 | + * Demoiselle Framework | |
| 3 | + * | |
| 4 | + * License: GNU Lesser General Public License (LGPL), version 3 or later. | |
| 5 | + * See the lgpl.txt file in the root directory or <https://www.gnu.org/licenses/lgpl.html>. | |
| 6 | + */ | |
| 7 | +package org.demoiselle.jee.rest.filter; | |
| 8 | + | |
| 9 | +import java.util.logging.Logger; | |
| 10 | +import javax.annotation.PostConstruct; | |
| 11 | +import javax.inject.Inject; | |
| 12 | +import javax.ws.rs.container.ContainerRequestContext; | |
| 13 | +import javax.ws.rs.container.ContainerRequestFilter; | |
| 14 | +import javax.ws.rs.container.ContainerResponseContext; | |
| 15 | +import javax.ws.rs.container.ContainerResponseFilter; | |
| 16 | +import javax.ws.rs.container.PreMatching; | |
| 17 | +import javax.ws.rs.container.ResourceInfo; | |
| 18 | +import javax.ws.rs.core.Context; | |
| 19 | +import javax.ws.rs.ext.Provider; | |
| 20 | + | |
| 21 | +import org.demoiselle.jee.rest.annotation.Cache; | |
| 22 | +import org.demoiselle.jee.rest.annotation.CorsAllowMethods; | |
| 23 | +import org.demoiselle.jee.rest.annotation.CorsAllowOrigin; | |
| 24 | + | |
| 25 | +/** | |
| 26 | + * | |
| 27 | + * @author 70744416353 | |
| 28 | + */ | |
| 29 | +@Provider | |
| 30 | +@PreMatching | |
| 31 | +public class JaxRsFilter implements ContainerRequestFilter, ContainerResponseFilter { | |
| 32 | + | |
| 33 | + @Inject | |
| 34 | + private Logger LOG; | |
| 35 | + | |
| 36 | + @Context | |
| 37 | + private ResourceInfo info; | |
| 38 | + | |
| 39 | + @Override | |
| 40 | + public void filter(ContainerRequestContext requestContext) { | |
| 41 | + } | |
| 42 | + | |
| 43 | + @Override | |
| 44 | + public void filter(ContainerRequestContext requestContext, ContainerResponseContext response) { | |
| 45 | + | |
| 46 | + response.getHeaders().putSingle("Demoiselle", "3.0.0"); | |
| 47 | + response.getHeaders().putSingle("Access-Control-Allow-Origin", "*"); | |
| 48 | + response.getHeaders().putSingle("Access-Control-Allow-Methods", "OPTIONS, GET, POST, PUT, DELETE"); | |
| 49 | + response.getHeaders().putSingle("Access-Control-Allow-Headers", "Content-Type"); | |
| 50 | + | |
| 51 | + if (requestContext.getMethod().equals("GET")) { | |
| 52 | + Cache max = info.getResourceMethod().getAnnotation(Cache.class); | |
| 53 | + if (max != null) { | |
| 54 | + response.getHeaders().putSingle("Cache-Control", max.value()); | |
| 55 | + } | |
| 56 | + } | |
| 57 | + | |
| 58 | +// CorsAllowMethods corsAllowMethods = info.getResourceMethod().getAnnotation(CorsAllowMethods.class); | |
| 59 | +// if (corsAllowMethods != null) { | |
| 60 | +// response.getHeaders().putSingle("Access-Control-Allow-Methods", requestContext.getMethod()); | |
| 61 | +// } | |
| 62 | +// | |
| 63 | +// CorsAllowOrigin corsAllowOrigin = info.getResourceMethod().getAnnotation(CorsAllowOrigin.class); | |
| 64 | +// if (corsAllowOrigin != null) { | |
| 65 | +// response.getHeaders().putSingle("Access-Control-Allow-Origin", corsAllowOrigin.value()); | |
| 66 | +// } | |
| 67 | + } | |
| 68 | + | |
| 69 | + @PostConstruct | |
| 70 | + public void init() { | |
| 71 | + LOG.info("Demoiselle Module - Rest"); | |
| 72 | + } | |
| 73 | + | |
| 74 | +} | ... | ... |
demoiselle-rest/src/main/java/org/demoiselle/jee/rest/interceptor/ValidatePayloadInterceptor.java
0 → 100644
| ... | ... | @@ -0,0 +1,67 @@ |
| 1 | +/* | |
| 2 | + * Demoiselle Framework | |
| 3 | + * | |
| 4 | + * License: GNU Lesser General Public License (LGPL), version 3 or later. | |
| 5 | + * See the lgpl.txt file in the root directory or <https://www.gnu.org/licenses/lgpl.html>. | |
| 6 | + */ | |
| 7 | +package org.demoiselle.jee.rest.interceptor; | |
| 8 | + | |
| 9 | +import static javax.interceptor.Interceptor.Priority.APPLICATION; | |
| 10 | +import static javax.validation.Validation.buildDefaultValidatorFactory; | |
| 11 | + | |
| 12 | +import java.io.Serializable; | |
| 13 | +import java.util.HashSet; | |
| 14 | +import java.util.Set; | |
| 15 | + | |
| 16 | +import javax.annotation.Priority; | |
| 17 | +import javax.interceptor.AroundInvoke; | |
| 18 | +import javax.interceptor.Interceptor; | |
| 19 | +import javax.interceptor.InvocationContext; | |
| 20 | +import javax.validation.ConstraintViolation; | |
| 21 | +import javax.validation.UnexpectedTypeException; | |
| 22 | +import javax.validation.Validator; | |
| 23 | +import javax.validation.ValidatorFactory; | |
| 24 | + | |
| 25 | +import org.demoiselle.jee.rest.annotation.ValidatePayload; | |
| 26 | +import org.demoiselle.jee.rest.exception.DemoiselleRESTException; | |
| 27 | + | |
| 28 | +@Interceptor | |
| 29 | +@ValidatePayload | |
| 30 | +@Priority(APPLICATION) | |
| 31 | +public class ValidatePayloadInterceptor implements Serializable { | |
| 32 | + | |
| 33 | + private static final long serialVersionUID = 1L; | |
| 34 | + | |
| 35 | + @AroundInvoke | |
| 36 | + public Object manage(final InvocationContext ic) throws Exception { | |
| 37 | + DemoiselleRESTException ex = new DemoiselleRESTException(); | |
| 38 | + Set<ConstraintViolation<?>> violations = new HashSet<>(); | |
| 39 | + for (Object params : ic.getParameters()) { | |
| 40 | + if (params != null) { | |
| 41 | + ValidatorFactory dfv = buildDefaultValidatorFactory(); | |
| 42 | + Validator validator = dfv.getValidator(); | |
| 43 | + try { | |
| 44 | + violations.addAll(validator.validate(params)); | |
| 45 | + for (ConstraintViolation<?> violation : violations) { | |
| 46 | + String field = (violation.getRootBeanClass().getSimpleName() + "_" | |
| 47 | + + violation.getPropertyPath()).toLowerCase(); | |
| 48 | + // GPMessage msg = | |
| 49 | + // GPMessage.INVALID_FIELD_P1.setSufix(violation.getConstraintDescriptor() | |
| 50 | + // .getAnnotation().annotationType().getSimpleName().toLowerCase()); | |
| 51 | + | |
| 52 | + ex.addMessage(field, violation.getMessage()); | |
| 53 | + } | |
| 54 | + } catch (UnexpectedTypeException cause) { | |
| 55 | + // GPMessage msg = GPMessage.GENERAL_ERROR_P1; | |
| 56 | + // msg.setParam(cause.getMessage()); | |
| 57 | + throw new DemoiselleRESTException("ERRO GENERICO -> ALTERAR"); | |
| 58 | + } | |
| 59 | + } | |
| 60 | + } | |
| 61 | + | |
| 62 | + if (!violations.isEmpty() && !ex.getMessages().isEmpty()) { | |
| 63 | + throw ex; | |
| 64 | + } | |
| 65 | + return ic.proceed(); | |
| 66 | + } | |
| 67 | +} | ... | ... |
demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/annotation/Cache.java
| ... | ... | @@ -1,29 +0,0 @@ |
| 1 | -/* | |
| 2 | - * To change this license header, choose License Headers in Project Properties. | |
| 3 | - * To change this template file, choose Tools | Templates | |
| 4 | - * and open the template in the editor. | |
| 5 | - */ | |
| 6 | -package org.demoiselle.jee.ws.jaxrs.annotation; | |
| 7 | - | |
| 8 | -import static java.lang.annotation.ElementType.METHOD; | |
| 9 | -import static java.lang.annotation.ElementType.TYPE; | |
| 10 | -import java.lang.annotation.Inherited; | |
| 11 | -import java.lang.annotation.Retention; | |
| 12 | -import static java.lang.annotation.RetentionPolicy.RUNTIME; | |
| 13 | -import java.lang.annotation.Target; | |
| 14 | -import javax.enterprise.util.Nonbinding; | |
| 15 | -import javax.interceptor.InterceptorBinding; | |
| 16 | - | |
| 17 | -/** | |
| 18 | - * | |
| 19 | - * @author 70744416353 | |
| 20 | - */ | |
| 21 | -@Inherited | |
| 22 | -@InterceptorBinding | |
| 23 | -@Target({ METHOD, TYPE }) | |
| 24 | -@Retention(RUNTIME) | |
| 25 | -public @interface Cache { | |
| 26 | - | |
| 27 | - @Nonbinding | |
| 28 | - String value() default "max-age=0"; | |
| 29 | -} |
demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/annotation/CorsAllowMethods.java
| ... | ... | @@ -1,26 +0,0 @@ |
| 1 | -/* | |
| 2 | - * To change this license header, choose License Headers in Project Properties. | |
| 3 | - * To change this template file, choose Tools | Templates | |
| 4 | - * and open the template in the editor. | |
| 5 | - */ | |
| 6 | -package org.demoiselle.jee.ws.jaxrs.annotation; | |
| 7 | - | |
| 8 | -import static java.lang.annotation.ElementType.METHOD; | |
| 9 | -import static java.lang.annotation.ElementType.TYPE; | |
| 10 | -import java.lang.annotation.Inherited; | |
| 11 | -import java.lang.annotation.Retention; | |
| 12 | -import static java.lang.annotation.RetentionPolicy.RUNTIME; | |
| 13 | -import java.lang.annotation.Target; | |
| 14 | -import javax.enterprise.util.Nonbinding; | |
| 15 | -import javax.interceptor.InterceptorBinding; | |
| 16 | - | |
| 17 | -/** | |
| 18 | - * | |
| 19 | - * @author 70744416353 | |
| 20 | - */ | |
| 21 | -@Inherited | |
| 22 | -@InterceptorBinding | |
| 23 | -@Target({METHOD, TYPE}) | |
| 24 | -@Retention(RUNTIME) | |
| 25 | -public @interface CorsAllowMethods { | |
| 26 | -} |
demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/annotation/CorsAllowOrigin.java
| ... | ... | @@ -1,29 +0,0 @@ |
| 1 | -/* | |
| 2 | - * To change this license header, choose License Headers in Project Properties. | |
| 3 | - * To change this template file, choose Tools | Templates | |
| 4 | - * and open the template in the editor. | |
| 5 | - */ | |
| 6 | -package org.demoiselle.jee.ws.jaxrs.annotation; | |
| 7 | - | |
| 8 | -import static java.lang.annotation.ElementType.METHOD; | |
| 9 | -import static java.lang.annotation.ElementType.TYPE; | |
| 10 | -import java.lang.annotation.Inherited; | |
| 11 | -import java.lang.annotation.Retention; | |
| 12 | -import static java.lang.annotation.RetentionPolicy.RUNTIME; | |
| 13 | -import java.lang.annotation.Target; | |
| 14 | -import javax.enterprise.util.Nonbinding; | |
| 15 | -import javax.interceptor.InterceptorBinding; | |
| 16 | - | |
| 17 | -/** | |
| 18 | - * | |
| 19 | - * @author 70744416353 | |
| 20 | - */ | |
| 21 | -@Inherited | |
| 22 | -@InterceptorBinding | |
| 23 | -@Target({METHOD, TYPE}) | |
| 24 | -@Retention(RUNTIME) | |
| 25 | -public @interface CorsAllowOrigin { | |
| 26 | - | |
| 27 | - @Nonbinding | |
| 28 | - String value() default "*"; | |
| 29 | -} |
demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/annotation/CorsMaxAge.java
| ... | ... | @@ -1,29 +0,0 @@ |
| 1 | -/* | |
| 2 | - * To change this license header, choose License Headers in Project Properties. | |
| 3 | - * To change this template file, choose Tools | Templates | |
| 4 | - * and open the template in the editor. | |
| 5 | - */ | |
| 6 | -package org.demoiselle.jee.ws.jaxrs.annotation; | |
| 7 | - | |
| 8 | -import static java.lang.annotation.ElementType.METHOD; | |
| 9 | -import static java.lang.annotation.ElementType.TYPE; | |
| 10 | -import java.lang.annotation.Inherited; | |
| 11 | -import java.lang.annotation.Retention; | |
| 12 | -import static java.lang.annotation.RetentionPolicy.RUNTIME; | |
| 13 | -import java.lang.annotation.Target; | |
| 14 | -import javax.enterprise.util.Nonbinding; | |
| 15 | -import javax.interceptor.InterceptorBinding; | |
| 16 | - | |
| 17 | -/** | |
| 18 | - * | |
| 19 | - * @author 70744416353 | |
| 20 | - */ | |
| 21 | -@Inherited | |
| 22 | -@InterceptorBinding | |
| 23 | -@Target({METHOD, TYPE}) | |
| 24 | -@Retention(RUNTIME) | |
| 25 | -public @interface CorsMaxAge { | |
| 26 | - | |
| 27 | - @Nonbinding | |
| 28 | - String value() default "0"; | |
| 29 | -} |
demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/annotation/ValidatePayload.java
| ... | ... | @@ -1,25 +0,0 @@ |
| 1 | -/* | |
| 2 | - * Demoiselle Framework | |
| 3 | - * | |
| 4 | - * License: GNU Lesser General Public License (LGPL), version 3 or later. | |
| 5 | - * See the lgpl.txt file in the root directory or <https://www.gnu.org/licenses/lgpl.html>. | |
| 6 | - */ | |
| 7 | -package org.demoiselle.jee.ws.jaxrs.annotation; | |
| 8 | - | |
| 9 | -import static java.lang.annotation.ElementType.METHOD; | |
| 10 | -import static java.lang.annotation.ElementType.TYPE; | |
| 11 | -import static java.lang.annotation.RetentionPolicy.RUNTIME; | |
| 12 | - | |
| 13 | -import java.lang.annotation.Inherited; | |
| 14 | -import java.lang.annotation.Retention; | |
| 15 | -import java.lang.annotation.Target; | |
| 16 | - | |
| 17 | -import javax.interceptor.InterceptorBinding; | |
| 18 | - | |
| 19 | -@Inherited | |
| 20 | -@InterceptorBinding | |
| 21 | -@Target({ METHOD, TYPE }) | |
| 22 | -@Retention(RUNTIME) | |
| 23 | -public @interface ValidatePayload { | |
| 24 | - | |
| 25 | -} | |
| 26 | 0 | \ No newline at end of file |
demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/crud/package-info.java
| ... | ... | @@ -1,11 +0,0 @@ |
| 1 | -/* | |
| 2 | - * Demoiselle Framework | |
| 3 | - * | |
| 4 | - * License: GNU Lesser General Public License (LGPL), version 3 or later. | |
| 5 | - * See the lgpl.txt file in the root directory or <https://www.gnu.org/licenses/lgpl.html>. | |
| 6 | - */ | |
| 7 | -/** | |
| 8 | - * Esta pacote tem o objetivo de conter as classes relacionadas aos | |
| 9 | - * facilitadores de CRUD do framework Demoiselle. | |
| 10 | - */ | |
| 11 | -package org.demoiselle.jee.ws.jaxrs.crud; | |
| 12 | 0 | \ No newline at end of file |
demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/exception/DemoiselleRESTException.java
| ... | ... | @@ -1,41 +0,0 @@ |
| 1 | -/* | |
| 2 | - * Demoiselle Framework | |
| 3 | - * | |
| 4 | - * License: GNU Lesser General Public License (LGPL), version 3 or later. | |
| 5 | - * See the lgpl.txt file in the root directory or <https://www.gnu.org/licenses/lgpl.html>. | |
| 6 | - */ | |
| 7 | -package org.demoiselle.jee.ws.jaxrs.exception; | |
| 8 | - | |
| 9 | -import java.util.HashMap; | |
| 10 | - | |
| 11 | -import org.demoiselle.jee.core.exception.DemoiselleException; | |
| 12 | - | |
| 13 | -public class DemoiselleRESTException extends DemoiselleException { | |
| 14 | - | |
| 15 | - private static final long serialVersionUID = 519965615171844237L; | |
| 16 | - | |
| 17 | - private HashMap<String, String> messages = new HashMap<>(); | |
| 18 | - | |
| 19 | - private int statusCode; | |
| 20 | - | |
| 21 | - public DemoiselleRESTException() { | |
| 22 | - | |
| 23 | - } | |
| 24 | - | |
| 25 | - public DemoiselleRESTException(String string) { | |
| 26 | - super(string); | |
| 27 | - } | |
| 28 | - | |
| 29 | - public int getStatusCode() { | |
| 30 | - return statusCode; | |
| 31 | - } | |
| 32 | - | |
| 33 | - public void addMessage(String field, String msg) { | |
| 34 | - this.statusCode = 422; | |
| 35 | - messages.put(field, msg); | |
| 36 | - } | |
| 37 | - | |
| 38 | - public HashMap<String, String> getMessages() { | |
| 39 | - return messages; | |
| 40 | - } | |
| 41 | -} |
demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/exception/mapper/GenericExceptionMapper.java
| ... | ... | @@ -1,78 +0,0 @@ |
| 1 | -/* | |
| 2 | - * Demoiselle Framework | |
| 3 | - * | |
| 4 | - * License: GNU Lesser General Public License (LGPL), version 3 or later. | |
| 5 | - * See the lgpl.txt file in the root directory or <https://www.gnu.org/licenses/lgpl.html>. | |
| 6 | - */ | |
| 7 | -package org.demoiselle.jee.ws.jaxrs.exception.mapper; | |
| 8 | - | |
| 9 | -import java.io.PrintWriter; | |
| 10 | -import java.io.StringWriter; | |
| 11 | -import java.util.HashMap; | |
| 12 | - | |
| 13 | -import javax.ws.rs.WebApplicationException; | |
| 14 | -import javax.ws.rs.core.MediaType; | |
| 15 | -import static javax.ws.rs.core.MediaType.APPLICATION_JSON; | |
| 16 | -import javax.ws.rs.core.Response; | |
| 17 | -import static javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR; | |
| 18 | -import static javax.ws.rs.core.Response.status; | |
| 19 | -import static javax.ws.rs.core.Response.status; | |
| 20 | -import static javax.ws.rs.core.Response.status; | |
| 21 | -import static javax.ws.rs.core.Response.status; | |
| 22 | -import javax.ws.rs.ext.ExceptionMapper; | |
| 23 | -import javax.ws.rs.ext.Provider; | |
| 24 | - | |
| 25 | -import org.demoiselle.jee.ws.jaxrs.exception.DemoiselleRESTException; | |
| 26 | - | |
| 27 | -@Provider | |
| 28 | -public class GenericExceptionMapper implements ExceptionMapper<Exception> { | |
| 29 | - | |
| 30 | - public Response toResponse(Exception ex) { | |
| 31 | - | |
| 32 | - StringWriter errorStackTrace = new StringWriter(); | |
| 33 | - ex.printStackTrace(new PrintWriter(errorStackTrace)); | |
| 34 | - | |
| 35 | - // Verifica se a exception é de validação de PAYLOAD do REST | |
| 36 | - if (ex instanceof DemoiselleRESTException) { | |
| 37 | - DemoiselleRESTException exDemoiselleREST = (DemoiselleRESTException) ex; | |
| 38 | - if (!exDemoiselleREST.getMessages().isEmpty()) { | |
| 39 | - return status(exDemoiselleREST.getStatusCode()).entity(exDemoiselleREST.getMessages()) | |
| 40 | - .type(APPLICATION_JSON).build(); | |
| 41 | - } else if (exDemoiselleREST.getStatusCode() > 0){ | |
| 42 | - return status(exDemoiselleREST.getStatusCode()).entity(exDemoiselleREST.getMessage()) | |
| 43 | - .type(APPLICATION_JSON).build(); | |
| 44 | - } | |
| 45 | - | |
| 46 | - } | |
| 47 | - | |
| 48 | - HashMap<String, String> entity = new HashMap<>(); | |
| 49 | - | |
| 50 | - // No caso de existir message ele mostra a MESSAGE da Exception | |
| 51 | - if (ex.getMessage() != null) { | |
| 52 | - entity.put("error", ex.getMessage()); | |
| 53 | - | |
| 54 | - // Pega toda as mensagens da stacktrace | |
| 55 | - int level = 1; | |
| 56 | - while (ex.getCause() != null) { | |
| 57 | - ex = (Exception) ex.getCause(); | |
| 58 | - if (!ex.getMessage().isEmpty()) { | |
| 59 | - entity.put("inner_cause_" + level, ex.getMessage()); | |
| 60 | - } | |
| 61 | - level += 1; | |
| 62 | - } | |
| 63 | - | |
| 64 | - // Por padrão retorna SERVER ERROR, mas tenta encontrar o status do RESPONSE se for WebApplicationException | |
| 65 | - // http://docs.oracle.com/javaee/7/api/javax/ws/rs/WebApplicationException.html | |
| 66 | - int responseCode = INTERNAL_SERVER_ERROR.getStatusCode(); | |
| 67 | - if (ex instanceof WebApplicationException) { | |
| 68 | - responseCode = ((WebApplicationException) ex).getResponse().getStatus(); | |
| 69 | - } | |
| 70 | - | |
| 71 | - return status(responseCode).entity(entity).type(APPLICATION_JSON).build(); | |
| 72 | - } | |
| 73 | - | |
| 74 | - entity.put("error", "Erro interno desconhecido no servidor."); | |
| 75 | - return status(500).entity(entity).type(APPLICATION_JSON).build(); | |
| 76 | - } | |
| 77 | - | |
| 78 | -} |
demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/filter/JaxRsFilter.java
| ... | ... | @@ -1,73 +0,0 @@ |
| 1 | -/* | |
| 2 | - * Demoiselle Framework | |
| 3 | - * | |
| 4 | - * License: GNU Lesser General Public License (LGPL), version 3 or later. | |
| 5 | - * See the lgpl.txt file in the root directory or <https://www.gnu.org/licenses/lgpl.html>. | |
| 6 | - */ | |
| 7 | -package org.demoiselle.jee.ws.jaxrs.filter; | |
| 8 | - | |
| 9 | -import java.util.logging.Logger; | |
| 10 | -import javax.annotation.PostConstruct; | |
| 11 | -import javax.inject.Inject; | |
| 12 | -import javax.ws.rs.container.ContainerRequestContext; | |
| 13 | -import javax.ws.rs.container.ContainerRequestFilter; | |
| 14 | -import javax.ws.rs.container.ContainerResponseContext; | |
| 15 | -import javax.ws.rs.container.ContainerResponseFilter; | |
| 16 | -import javax.ws.rs.container.PreMatching; | |
| 17 | -import javax.ws.rs.container.ResourceInfo; | |
| 18 | -import javax.ws.rs.core.Context; | |
| 19 | -import javax.ws.rs.ext.Provider; | |
| 20 | -import org.demoiselle.jee.ws.jaxrs.annotation.Cache; | |
| 21 | -import org.demoiselle.jee.ws.jaxrs.annotation.CorsAllowMethods; | |
| 22 | -import org.demoiselle.jee.ws.jaxrs.annotation.CorsAllowOrigin; | |
| 23 | - | |
| 24 | -/** | |
| 25 | - * | |
| 26 | - * @author 70744416353 | |
| 27 | - */ | |
| 28 | -@Provider | |
| 29 | -@PreMatching | |
| 30 | -public class JaxRsFilter implements ContainerRequestFilter, ContainerResponseFilter { | |
| 31 | - | |
| 32 | - @Inject | |
| 33 | - private Logger LOG; | |
| 34 | - | |
| 35 | - @Context | |
| 36 | - private ResourceInfo info; | |
| 37 | - | |
| 38 | - @Override | |
| 39 | - public void filter(ContainerRequestContext requestContext) { | |
| 40 | - } | |
| 41 | - | |
| 42 | - @Override | |
| 43 | - public void filter(ContainerRequestContext requestContext, ContainerResponseContext response) { | |
| 44 | - | |
| 45 | - response.getHeaders().putSingle("Demoiselle", "3.0.0"); | |
| 46 | - response.getHeaders().putSingle("Access-Control-Allow-Origin", "*"); | |
| 47 | - response.getHeaders().putSingle("Access-Control-Allow-Methods", "OPTIONS, GET, POST, PUT, DELETE"); | |
| 48 | - response.getHeaders().putSingle("Access-Control-Allow-Headers", "Content-Type"); | |
| 49 | - | |
| 50 | - if (requestContext.getMethod().equals("GET")) { | |
| 51 | - Cache max = info.getResourceMethod().getAnnotation(Cache.class); | |
| 52 | - if (max != null) { | |
| 53 | - response.getHeaders().putSingle("Cache-Control", max.value()); | |
| 54 | - } | |
| 55 | - } | |
| 56 | - | |
| 57 | -// CorsAllowMethods corsAllowMethods = info.getResourceMethod().getAnnotation(CorsAllowMethods.class); | |
| 58 | -// if (corsAllowMethods != null) { | |
| 59 | -// response.getHeaders().putSingle("Access-Control-Allow-Methods", requestContext.getMethod()); | |
| 60 | -// } | |
| 61 | -// | |
| 62 | -// CorsAllowOrigin corsAllowOrigin = info.getResourceMethod().getAnnotation(CorsAllowOrigin.class); | |
| 63 | -// if (corsAllowOrigin != null) { | |
| 64 | -// response.getHeaders().putSingle("Access-Control-Allow-Origin", corsAllowOrigin.value()); | |
| 65 | -// } | |
| 66 | - } | |
| 67 | - | |
| 68 | - @PostConstruct | |
| 69 | - public void init() { | |
| 70 | - LOG.info("Demoiselle Module - Rest"); | |
| 71 | - } | |
| 72 | - | |
| 73 | -} |
demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/interceptor/ValidatePayloadInterceptor.java
| ... | ... | @@ -1,67 +0,0 @@ |
| 1 | -/* | |
| 2 | - * Demoiselle Framework | |
| 3 | - * | |
| 4 | - * License: GNU Lesser General Public License (LGPL), version 3 or later. | |
| 5 | - * See the lgpl.txt file in the root directory or <https://www.gnu.org/licenses/lgpl.html>. | |
| 6 | - */ | |
| 7 | -package org.demoiselle.jee.ws.jaxrs.interceptor; | |
| 8 | - | |
| 9 | -import org.demoiselle.jee.ws.jaxrs.annotation.ValidatePayload; | |
| 10 | -import java.io.Serializable; | |
| 11 | -import java.util.HashSet; | |
| 12 | -import java.util.Set; | |
| 13 | -import javax.annotation.Priority; | |
| 14 | - | |
| 15 | -import javax.interceptor.AroundInvoke; | |
| 16 | -import javax.interceptor.Interceptor; | |
| 17 | -import static javax.interceptor.Interceptor.Priority.APPLICATION; | |
| 18 | -import javax.interceptor.InvocationContext; | |
| 19 | -import javax.validation.ConstraintViolation; | |
| 20 | -import javax.validation.UnexpectedTypeException; | |
| 21 | -import javax.validation.Validation; | |
| 22 | -import static javax.validation.Validation.buildDefaultValidatorFactory; | |
| 23 | -import javax.validation.Validator; | |
| 24 | -import javax.validation.ValidatorFactory; | |
| 25 | - | |
| 26 | -import org.demoiselle.jee.ws.jaxrs.exception.DemoiselleRESTException; | |
| 27 | - | |
| 28 | -@Interceptor | |
| 29 | -@ValidatePayload | |
| 30 | -@Priority(APPLICATION) | |
| 31 | -public class ValidatePayloadInterceptor implements Serializable { | |
| 32 | - | |
| 33 | - private static final long serialVersionUID = 1L; | |
| 34 | - | |
| 35 | - @AroundInvoke | |
| 36 | - public Object manage(final InvocationContext ic) throws Exception { | |
| 37 | - DemoiselleRESTException ex = new DemoiselleRESTException(); | |
| 38 | - Set<ConstraintViolation<?>> violations = new HashSet<>(); | |
| 39 | - for (Object params : ic.getParameters()) { | |
| 40 | - if (params != null) { | |
| 41 | - ValidatorFactory dfv = buildDefaultValidatorFactory(); | |
| 42 | - Validator validator = dfv.getValidator(); | |
| 43 | - try { | |
| 44 | - violations.addAll(validator.validate(params)); | |
| 45 | - for (ConstraintViolation<?> violation : violations) { | |
| 46 | - String field = (violation.getRootBeanClass().getSimpleName() + "_" | |
| 47 | - + violation.getPropertyPath()).toLowerCase(); | |
| 48 | - // GPMessage msg = | |
| 49 | - // GPMessage.INVALID_FIELD_P1.setSufix(violation.getConstraintDescriptor() | |
| 50 | - // .getAnnotation().annotationType().getSimpleName().toLowerCase()); | |
| 51 | - | |
| 52 | - ex.addMessage(field, violation.getMessage()); | |
| 53 | - } | |
| 54 | - } catch (UnexpectedTypeException cause) { | |
| 55 | - // GPMessage msg = GPMessage.GENERAL_ERROR_P1; | |
| 56 | - // msg.setParam(cause.getMessage()); | |
| 57 | - throw new DemoiselleRESTException("ERRO GENERICO -> ALTERAR"); | |
| 58 | - } | |
| 59 | - } | |
| 60 | - } | |
| 61 | - | |
| 62 | - if (!violations.isEmpty() && !ex.getMessages().isEmpty()) { | |
| 63 | - throw ex; | |
| 64 | - } | |
| 65 | - return ic.proceed(); | |
| 66 | - } | |
| 67 | -} |
demoiselle-security/src/main/java/org/demoiselle/jee/security/exception/DemoiselleSecurityException.java
| ... | ... | @@ -8,7 +8,7 @@ package org.demoiselle.jee.security.exception; |
| 8 | 8 | |
| 9 | 9 | import java.util.HashMap; |
| 10 | 10 | |
| 11 | -import org.demoiselle.jee.ws.jaxrs.exception.DemoiselleRESTException; | |
| 11 | +import org.demoiselle.jee.rest.exception.DemoiselleRESTException; | |
| 12 | 12 | |
| 13 | 13 | public class DemoiselleSecurityException extends DemoiselleRESTException { |
| 14 | 14 | ... | ... |