diff --git a/demoiselle-core/src/main/java/org/demoiselle/jee/core/message/DemoiselleMessage.java b/demoiselle-core/src/main/java/org/demoiselle/jee/core/message/DemoiselleMessage.java index 420fbab..4c7c74d 100644 --- a/demoiselle-core/src/main/java/org/demoiselle/jee/core/message/DemoiselleMessage.java +++ b/demoiselle-core/src/main/java/org/demoiselle/jee/core/message/DemoiselleMessage.java @@ -46,7 +46,7 @@ public interface DemoiselleMessage { String takingOff(); @MessageTemplate("{engine-off}") - String engineOff(String ex); + String engineOff(); @MessageTemplate("{setting-up-bean-manager}") String settingUpBeanManagerException(String util); diff --git a/demoiselle-rest/src/main/java/org/demoiselle/jee/rest/annotation/Cache.java b/demoiselle-rest/src/main/java/org/demoiselle/jee/rest/annotation/Cache.java new file mode 100644 index 0000000..5cd7e77 --- /dev/null +++ b/demoiselle-rest/src/main/java/org/demoiselle/jee/rest/annotation/Cache.java @@ -0,0 +1,29 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.demoiselle.jee.rest.annotation; + +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.TYPE; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import java.lang.annotation.Target; +import javax.enterprise.util.Nonbinding; +import javax.interceptor.InterceptorBinding; + +/** + * + * @author 70744416353 + */ +@Inherited +@InterceptorBinding +@Target({ METHOD, TYPE }) +@Retention(RUNTIME) +public @interface Cache { + + @Nonbinding + String value() default "max-age=0"; +} diff --git a/demoiselle-rest/src/main/java/org/demoiselle/jee/rest/annotation/CorsAllowMethods.java b/demoiselle-rest/src/main/java/org/demoiselle/jee/rest/annotation/CorsAllowMethods.java new file mode 100644 index 0000000..5209d08 --- /dev/null +++ b/demoiselle-rest/src/main/java/org/demoiselle/jee/rest/annotation/CorsAllowMethods.java @@ -0,0 +1,26 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.demoiselle.jee.rest.annotation; + +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.TYPE; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import java.lang.annotation.Target; +import javax.enterprise.util.Nonbinding; +import javax.interceptor.InterceptorBinding; + +/** + * + * @author 70744416353 + */ +@Inherited +@InterceptorBinding +@Target({METHOD, TYPE}) +@Retention(RUNTIME) +public @interface CorsAllowMethods { +} diff --git a/demoiselle-rest/src/main/java/org/demoiselle/jee/rest/annotation/CorsAllowOrigin.java b/demoiselle-rest/src/main/java/org/demoiselle/jee/rest/annotation/CorsAllowOrigin.java new file mode 100644 index 0000000..ca58d59 --- /dev/null +++ b/demoiselle-rest/src/main/java/org/demoiselle/jee/rest/annotation/CorsAllowOrigin.java @@ -0,0 +1,29 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.demoiselle.jee.rest.annotation; + +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.TYPE; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import java.lang.annotation.Target; +import javax.enterprise.util.Nonbinding; +import javax.interceptor.InterceptorBinding; + +/** + * + * @author 70744416353 + */ +@Inherited +@InterceptorBinding +@Target({METHOD, TYPE}) +@Retention(RUNTIME) +public @interface CorsAllowOrigin { + + @Nonbinding + String value() default "*"; +} diff --git a/demoiselle-rest/src/main/java/org/demoiselle/jee/rest/annotation/CorsMaxAge.java b/demoiselle-rest/src/main/java/org/demoiselle/jee/rest/annotation/CorsMaxAge.java new file mode 100644 index 0000000..36cc859 --- /dev/null +++ b/demoiselle-rest/src/main/java/org/demoiselle/jee/rest/annotation/CorsMaxAge.java @@ -0,0 +1,29 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.demoiselle.jee.rest.annotation; + +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.TYPE; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import java.lang.annotation.Target; +import javax.enterprise.util.Nonbinding; +import javax.interceptor.InterceptorBinding; + +/** + * + * @author 70744416353 + */ +@Inherited +@InterceptorBinding +@Target({METHOD, TYPE}) +@Retention(RUNTIME) +public @interface CorsMaxAge { + + @Nonbinding + String value() default "0"; +} diff --git a/demoiselle-rest/src/main/java/org/demoiselle/jee/rest/annotation/ValidatePayload.java b/demoiselle-rest/src/main/java/org/demoiselle/jee/rest/annotation/ValidatePayload.java new file mode 100644 index 0000000..c45cba8 --- /dev/null +++ b/demoiselle-rest/src/main/java/org/demoiselle/jee/rest/annotation/ValidatePayload.java @@ -0,0 +1,25 @@ +/* + * Demoiselle Framework + * + * License: GNU Lesser General Public License (LGPL), version 3 or later. + * See the lgpl.txt file in the root directory or . + */ +package org.demoiselle.jee.rest.annotation; + +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import javax.interceptor.InterceptorBinding; + +@Inherited +@InterceptorBinding +@Target({ METHOD, TYPE }) +@Retention(RUNTIME) +public @interface ValidatePayload { + +} \ No newline at end of file diff --git a/demoiselle-rest/src/main/java/org/demoiselle/jee/rest/crud/package-info.java b/demoiselle-rest/src/main/java/org/demoiselle/jee/rest/crud/package-info.java new file mode 100644 index 0000000..73aa076 --- /dev/null +++ b/demoiselle-rest/src/main/java/org/demoiselle/jee/rest/crud/package-info.java @@ -0,0 +1,11 @@ +/* + * Demoiselle Framework + * + * License: GNU Lesser General Public License (LGPL), version 3 or later. + * See the lgpl.txt file in the root directory or . + */ +/** + * Esta pacote tem o objetivo de conter as classes relacionadas aos + * facilitadores de CRUD do framework Demoiselle. + */ +package org.demoiselle.jee.rest.crud; \ No newline at end of file diff --git a/demoiselle-rest/src/main/java/org/demoiselle/jee/rest/exception/DemoiselleRESTException.java b/demoiselle-rest/src/main/java/org/demoiselle/jee/rest/exception/DemoiselleRESTException.java new file mode 100644 index 0000000..44936af --- /dev/null +++ b/demoiselle-rest/src/main/java/org/demoiselle/jee/rest/exception/DemoiselleRESTException.java @@ -0,0 +1,41 @@ +/* + * Demoiselle Framework + * + * License: GNU Lesser General Public License (LGPL), version 3 or later. + * See the lgpl.txt file in the root directory or . + */ +package org.demoiselle.jee.rest.exception; + +import java.util.HashMap; + +import org.demoiselle.jee.core.exception.DemoiselleException; + +public class DemoiselleRESTException extends DemoiselleException { + + private static final long serialVersionUID = 519965615171844237L; + + private HashMap messages = new HashMap<>(); + + private int statusCode; + + public DemoiselleRESTException() { + + } + + public DemoiselleRESTException(String string) { + super(string); + } + + public int getStatusCode() { + return statusCode; + } + + public void addMessage(String field, String msg) { + this.statusCode = 422; + messages.put(field, msg); + } + + public HashMap getMessages() { + return messages; + } +} diff --git a/demoiselle-rest/src/main/java/org/demoiselle/jee/rest/exception/mapper/GenericExceptionMapper.java b/demoiselle-rest/src/main/java/org/demoiselle/jee/rest/exception/mapper/GenericExceptionMapper.java new file mode 100644 index 0000000..20f79ac --- /dev/null +++ b/demoiselle-rest/src/main/java/org/demoiselle/jee/rest/exception/mapper/GenericExceptionMapper.java @@ -0,0 +1,78 @@ +/* + * Demoiselle Framework + * + * License: GNU Lesser General Public License (LGPL), version 3 or later. + * See the lgpl.txt file in the root directory or . + */ +package org.demoiselle.jee.rest.exception.mapper; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.HashMap; + +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.MediaType; +import static javax.ws.rs.core.MediaType.APPLICATION_JSON; +import javax.ws.rs.core.Response; +import static javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR; +import static javax.ws.rs.core.Response.status; +import static javax.ws.rs.core.Response.status; +import static javax.ws.rs.core.Response.status; +import static javax.ws.rs.core.Response.status; +import javax.ws.rs.ext.ExceptionMapper; +import javax.ws.rs.ext.Provider; + +import org.demoiselle.jee.rest.exception.DemoiselleRESTException; + +@Provider +public class GenericExceptionMapper implements ExceptionMapper { + + public Response toResponse(Exception ex) { + + StringWriter errorStackTrace = new StringWriter(); + ex.printStackTrace(new PrintWriter(errorStackTrace)); + + // Verifica se a exception é de validação de PAYLOAD do REST + if (ex instanceof DemoiselleRESTException) { + DemoiselleRESTException exDemoiselleREST = (DemoiselleRESTException) ex; + if (!exDemoiselleREST.getMessages().isEmpty()) { + return status(exDemoiselleREST.getStatusCode()).entity(exDemoiselleREST.getMessages()) + .type(APPLICATION_JSON).build(); + } else if (exDemoiselleREST.getStatusCode() > 0){ + return status(exDemoiselleREST.getStatusCode()).entity(exDemoiselleREST.getMessage()) + .type(APPLICATION_JSON).build(); + } + + } + + HashMap entity = new HashMap<>(); + + // No caso de existir message ele mostra a MESSAGE da Exception + if (ex.getMessage() != null) { + entity.put("error", ex.getMessage()); + + // Pega toda as mensagens da stacktrace + int level = 1; + while (ex.getCause() != null) { + ex = (Exception) ex.getCause(); + if (!ex.getMessage().isEmpty()) { + entity.put("inner_cause_" + level, ex.getMessage()); + } + level += 1; + } + + // Por padrão retorna SERVER ERROR, mas tenta encontrar o status do RESPONSE se for WebApplicationException + // http://docs.oracle.com/javaee/7/api/javax/ws/rs/WebApplicationException.html + int responseCode = INTERNAL_SERVER_ERROR.getStatusCode(); + if (ex instanceof WebApplicationException) { + responseCode = ((WebApplicationException) ex).getResponse().getStatus(); + } + + return status(responseCode).entity(entity).type(APPLICATION_JSON).build(); + } + + entity.put("error", "Erro interno desconhecido no servidor."); + return status(500).entity(entity).type(APPLICATION_JSON).build(); + } + +} diff --git a/demoiselle-rest/src/main/java/org/demoiselle/jee/rest/filter/JaxRsFilter.java b/demoiselle-rest/src/main/java/org/demoiselle/jee/rest/filter/JaxRsFilter.java new file mode 100644 index 0000000..8fb9cfc --- /dev/null +++ b/demoiselle-rest/src/main/java/org/demoiselle/jee/rest/filter/JaxRsFilter.java @@ -0,0 +1,74 @@ +/* + * Demoiselle Framework + * + * License: GNU Lesser General Public License (LGPL), version 3 or later. + * See the lgpl.txt file in the root directory or . + */ +package org.demoiselle.jee.rest.filter; + +import java.util.logging.Logger; +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.container.ContainerRequestFilter; +import javax.ws.rs.container.ContainerResponseContext; +import javax.ws.rs.container.ContainerResponseFilter; +import javax.ws.rs.container.PreMatching; +import javax.ws.rs.container.ResourceInfo; +import javax.ws.rs.core.Context; +import javax.ws.rs.ext.Provider; + +import org.demoiselle.jee.rest.annotation.Cache; +import org.demoiselle.jee.rest.annotation.CorsAllowMethods; +import org.demoiselle.jee.rest.annotation.CorsAllowOrigin; + +/** + * + * @author 70744416353 + */ +@Provider +@PreMatching +public class JaxRsFilter implements ContainerRequestFilter, ContainerResponseFilter { + + @Inject + private Logger LOG; + + @Context + private ResourceInfo info; + + @Override + public void filter(ContainerRequestContext requestContext) { + } + + @Override + public void filter(ContainerRequestContext requestContext, ContainerResponseContext response) { + + response.getHeaders().putSingle("Demoiselle", "3.0.0"); + response.getHeaders().putSingle("Access-Control-Allow-Origin", "*"); + response.getHeaders().putSingle("Access-Control-Allow-Methods", "OPTIONS, GET, POST, PUT, DELETE"); + response.getHeaders().putSingle("Access-Control-Allow-Headers", "Content-Type"); + + if (requestContext.getMethod().equals("GET")) { + Cache max = info.getResourceMethod().getAnnotation(Cache.class); + if (max != null) { + response.getHeaders().putSingle("Cache-Control", max.value()); + } + } + +// CorsAllowMethods corsAllowMethods = info.getResourceMethod().getAnnotation(CorsAllowMethods.class); +// if (corsAllowMethods != null) { +// response.getHeaders().putSingle("Access-Control-Allow-Methods", requestContext.getMethod()); +// } +// +// CorsAllowOrigin corsAllowOrigin = info.getResourceMethod().getAnnotation(CorsAllowOrigin.class); +// if (corsAllowOrigin != null) { +// response.getHeaders().putSingle("Access-Control-Allow-Origin", corsAllowOrigin.value()); +// } + } + + @PostConstruct + public void init() { + LOG.info("Demoiselle Module - Rest"); + } + +} diff --git a/demoiselle-rest/src/main/java/org/demoiselle/jee/rest/interceptor/ValidatePayloadInterceptor.java b/demoiselle-rest/src/main/java/org/demoiselle/jee/rest/interceptor/ValidatePayloadInterceptor.java new file mode 100644 index 0000000..234c262 --- /dev/null +++ b/demoiselle-rest/src/main/java/org/demoiselle/jee/rest/interceptor/ValidatePayloadInterceptor.java @@ -0,0 +1,67 @@ +/* + * Demoiselle Framework + * + * License: GNU Lesser General Public License (LGPL), version 3 or later. + * See the lgpl.txt file in the root directory or . + */ +package org.demoiselle.jee.rest.interceptor; + +import static javax.interceptor.Interceptor.Priority.APPLICATION; +import static javax.validation.Validation.buildDefaultValidatorFactory; + +import java.io.Serializable; +import java.util.HashSet; +import java.util.Set; + +import javax.annotation.Priority; +import javax.interceptor.AroundInvoke; +import javax.interceptor.Interceptor; +import javax.interceptor.InvocationContext; +import javax.validation.ConstraintViolation; +import javax.validation.UnexpectedTypeException; +import javax.validation.Validator; +import javax.validation.ValidatorFactory; + +import org.demoiselle.jee.rest.annotation.ValidatePayload; +import org.demoiselle.jee.rest.exception.DemoiselleRESTException; + +@Interceptor +@ValidatePayload +@Priority(APPLICATION) +public class ValidatePayloadInterceptor implements Serializable { + + private static final long serialVersionUID = 1L; + + @AroundInvoke + public Object manage(final InvocationContext ic) throws Exception { + DemoiselleRESTException ex = new DemoiselleRESTException(); + Set> violations = new HashSet<>(); + for (Object params : ic.getParameters()) { + if (params != null) { + ValidatorFactory dfv = buildDefaultValidatorFactory(); + Validator validator = dfv.getValidator(); + try { + violations.addAll(validator.validate(params)); + for (ConstraintViolation violation : violations) { + String field = (violation.getRootBeanClass().getSimpleName() + "_" + + violation.getPropertyPath()).toLowerCase(); + // GPMessage msg = + // GPMessage.INVALID_FIELD_P1.setSufix(violation.getConstraintDescriptor() + // .getAnnotation().annotationType().getSimpleName().toLowerCase()); + + ex.addMessage(field, violation.getMessage()); + } + } catch (UnexpectedTypeException cause) { + // GPMessage msg = GPMessage.GENERAL_ERROR_P1; + // msg.setParam(cause.getMessage()); + throw new DemoiselleRESTException("ERRO GENERICO -> ALTERAR"); + } + } + } + + if (!violations.isEmpty() && !ex.getMessages().isEmpty()) { + throw ex; + } + return ic.proceed(); + } +} diff --git a/demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/annotation/Cache.java b/demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/annotation/Cache.java deleted file mode 100644 index 6d9dccb..0000000 --- a/demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/annotation/Cache.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package org.demoiselle.jee.ws.jaxrs.annotation; - -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.TYPE; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import static java.lang.annotation.RetentionPolicy.RUNTIME; -import java.lang.annotation.Target; -import javax.enterprise.util.Nonbinding; -import javax.interceptor.InterceptorBinding; - -/** - * - * @author 70744416353 - */ -@Inherited -@InterceptorBinding -@Target({ METHOD, TYPE }) -@Retention(RUNTIME) -public @interface Cache { - - @Nonbinding - String value() default "max-age=0"; -} diff --git a/demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/annotation/CorsAllowMethods.java b/demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/annotation/CorsAllowMethods.java deleted file mode 100644 index 364dd5f..0000000 --- a/demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/annotation/CorsAllowMethods.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package org.demoiselle.jee.ws.jaxrs.annotation; - -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.TYPE; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import static java.lang.annotation.RetentionPolicy.RUNTIME; -import java.lang.annotation.Target; -import javax.enterprise.util.Nonbinding; -import javax.interceptor.InterceptorBinding; - -/** - * - * @author 70744416353 - */ -@Inherited -@InterceptorBinding -@Target({METHOD, TYPE}) -@Retention(RUNTIME) -public @interface CorsAllowMethods { -} diff --git a/demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/annotation/CorsAllowOrigin.java b/demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/annotation/CorsAllowOrigin.java deleted file mode 100644 index 7acea38..0000000 --- a/demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/annotation/CorsAllowOrigin.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package org.demoiselle.jee.ws.jaxrs.annotation; - -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.TYPE; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import static java.lang.annotation.RetentionPolicy.RUNTIME; -import java.lang.annotation.Target; -import javax.enterprise.util.Nonbinding; -import javax.interceptor.InterceptorBinding; - -/** - * - * @author 70744416353 - */ -@Inherited -@InterceptorBinding -@Target({METHOD, TYPE}) -@Retention(RUNTIME) -public @interface CorsAllowOrigin { - - @Nonbinding - String value() default "*"; -} diff --git a/demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/annotation/CorsMaxAge.java b/demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/annotation/CorsMaxAge.java deleted file mode 100644 index d1a332c..0000000 --- a/demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/annotation/CorsMaxAge.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package org.demoiselle.jee.ws.jaxrs.annotation; - -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.TYPE; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import static java.lang.annotation.RetentionPolicy.RUNTIME; -import java.lang.annotation.Target; -import javax.enterprise.util.Nonbinding; -import javax.interceptor.InterceptorBinding; - -/** - * - * @author 70744416353 - */ -@Inherited -@InterceptorBinding -@Target({METHOD, TYPE}) -@Retention(RUNTIME) -public @interface CorsMaxAge { - - @Nonbinding - String value() default "0"; -} diff --git a/demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/annotation/ValidatePayload.java b/demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/annotation/ValidatePayload.java deleted file mode 100644 index 0942d74..0000000 --- a/demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/annotation/ValidatePayload.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Demoiselle Framework - * - * License: GNU Lesser General Public License (LGPL), version 3 or later. - * See the lgpl.txt file in the root directory or . - */ -package org.demoiselle.jee.ws.jaxrs.annotation; - -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.RUNTIME; - -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import javax.interceptor.InterceptorBinding; - -@Inherited -@InterceptorBinding -@Target({ METHOD, TYPE }) -@Retention(RUNTIME) -public @interface ValidatePayload { - -} \ No newline at end of file diff --git a/demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/crud/package-info.java b/demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/crud/package-info.java deleted file mode 100644 index d7ae709..0000000 --- a/demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/crud/package-info.java +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Demoiselle Framework - * - * License: GNU Lesser General Public License (LGPL), version 3 or later. - * See the lgpl.txt file in the root directory or . - */ -/** - * Esta pacote tem o objetivo de conter as classes relacionadas aos - * facilitadores de CRUD do framework Demoiselle. - */ -package org.demoiselle.jee.ws.jaxrs.crud; \ No newline at end of file diff --git a/demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/exception/DemoiselleRESTException.java b/demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/exception/DemoiselleRESTException.java deleted file mode 100644 index 0d01bb8..0000000 --- a/demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/exception/DemoiselleRESTException.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Demoiselle Framework - * - * License: GNU Lesser General Public License (LGPL), version 3 or later. - * See the lgpl.txt file in the root directory or . - */ -package org.demoiselle.jee.ws.jaxrs.exception; - -import java.util.HashMap; - -import org.demoiselle.jee.core.exception.DemoiselleException; - -public class DemoiselleRESTException extends DemoiselleException { - - private static final long serialVersionUID = 519965615171844237L; - - private HashMap messages = new HashMap<>(); - - private int statusCode; - - public DemoiselleRESTException() { - - } - - public DemoiselleRESTException(String string) { - super(string); - } - - public int getStatusCode() { - return statusCode; - } - - public void addMessage(String field, String msg) { - this.statusCode = 422; - messages.put(field, msg); - } - - public HashMap getMessages() { - return messages; - } -} diff --git a/demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/exception/mapper/GenericExceptionMapper.java b/demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/exception/mapper/GenericExceptionMapper.java deleted file mode 100644 index 9884fd0..0000000 --- a/demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/exception/mapper/GenericExceptionMapper.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Demoiselle Framework - * - * License: GNU Lesser General Public License (LGPL), version 3 or later. - * See the lgpl.txt file in the root directory or . - */ -package org.demoiselle.jee.ws.jaxrs.exception.mapper; - -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.HashMap; - -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON; -import javax.ws.rs.core.Response; -import static javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR; -import static javax.ws.rs.core.Response.status; -import static javax.ws.rs.core.Response.status; -import static javax.ws.rs.core.Response.status; -import static javax.ws.rs.core.Response.status; -import javax.ws.rs.ext.ExceptionMapper; -import javax.ws.rs.ext.Provider; - -import org.demoiselle.jee.ws.jaxrs.exception.DemoiselleRESTException; - -@Provider -public class GenericExceptionMapper implements ExceptionMapper { - - public Response toResponse(Exception ex) { - - StringWriter errorStackTrace = new StringWriter(); - ex.printStackTrace(new PrintWriter(errorStackTrace)); - - // Verifica se a exception é de validação de PAYLOAD do REST - if (ex instanceof DemoiselleRESTException) { - DemoiselleRESTException exDemoiselleREST = (DemoiselleRESTException) ex; - if (!exDemoiselleREST.getMessages().isEmpty()) { - return status(exDemoiselleREST.getStatusCode()).entity(exDemoiselleREST.getMessages()) - .type(APPLICATION_JSON).build(); - } else if (exDemoiselleREST.getStatusCode() > 0){ - return status(exDemoiselleREST.getStatusCode()).entity(exDemoiselleREST.getMessage()) - .type(APPLICATION_JSON).build(); - } - - } - - HashMap entity = new HashMap<>(); - - // No caso de existir message ele mostra a MESSAGE da Exception - if (ex.getMessage() != null) { - entity.put("error", ex.getMessage()); - - // Pega toda as mensagens da stacktrace - int level = 1; - while (ex.getCause() != null) { - ex = (Exception) ex.getCause(); - if (!ex.getMessage().isEmpty()) { - entity.put("inner_cause_" + level, ex.getMessage()); - } - level += 1; - } - - // Por padrão retorna SERVER ERROR, mas tenta encontrar o status do RESPONSE se for WebApplicationException - // http://docs.oracle.com/javaee/7/api/javax/ws/rs/WebApplicationException.html - int responseCode = INTERNAL_SERVER_ERROR.getStatusCode(); - if (ex instanceof WebApplicationException) { - responseCode = ((WebApplicationException) ex).getResponse().getStatus(); - } - - return status(responseCode).entity(entity).type(APPLICATION_JSON).build(); - } - - entity.put("error", "Erro interno desconhecido no servidor."); - return status(500).entity(entity).type(APPLICATION_JSON).build(); - } - -} diff --git a/demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/filter/JaxRsFilter.java b/demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/filter/JaxRsFilter.java deleted file mode 100644 index 34797f2..0000000 --- a/demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/filter/JaxRsFilter.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Demoiselle Framework - * - * License: GNU Lesser General Public License (LGPL), version 3 or later. - * See the lgpl.txt file in the root directory or . - */ -package org.demoiselle.jee.ws.jaxrs.filter; - -import java.util.logging.Logger; -import javax.annotation.PostConstruct; -import javax.inject.Inject; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.container.ContainerRequestFilter; -import javax.ws.rs.container.ContainerResponseContext; -import javax.ws.rs.container.ContainerResponseFilter; -import javax.ws.rs.container.PreMatching; -import javax.ws.rs.container.ResourceInfo; -import javax.ws.rs.core.Context; -import javax.ws.rs.ext.Provider; -import org.demoiselle.jee.ws.jaxrs.annotation.Cache; -import org.demoiselle.jee.ws.jaxrs.annotation.CorsAllowMethods; -import org.demoiselle.jee.ws.jaxrs.annotation.CorsAllowOrigin; - -/** - * - * @author 70744416353 - */ -@Provider -@PreMatching -public class JaxRsFilter implements ContainerRequestFilter, ContainerResponseFilter { - - @Inject - private Logger LOG; - - @Context - private ResourceInfo info; - - @Override - public void filter(ContainerRequestContext requestContext) { - } - - @Override - public void filter(ContainerRequestContext requestContext, ContainerResponseContext response) { - - response.getHeaders().putSingle("Demoiselle", "3.0.0"); - response.getHeaders().putSingle("Access-Control-Allow-Origin", "*"); - response.getHeaders().putSingle("Access-Control-Allow-Methods", "OPTIONS, GET, POST, PUT, DELETE"); - response.getHeaders().putSingle("Access-Control-Allow-Headers", "Content-Type"); - - if (requestContext.getMethod().equals("GET")) { - Cache max = info.getResourceMethod().getAnnotation(Cache.class); - if (max != null) { - response.getHeaders().putSingle("Cache-Control", max.value()); - } - } - -// CorsAllowMethods corsAllowMethods = info.getResourceMethod().getAnnotation(CorsAllowMethods.class); -// if (corsAllowMethods != null) { -// response.getHeaders().putSingle("Access-Control-Allow-Methods", requestContext.getMethod()); -// } -// -// CorsAllowOrigin corsAllowOrigin = info.getResourceMethod().getAnnotation(CorsAllowOrigin.class); -// if (corsAllowOrigin != null) { -// response.getHeaders().putSingle("Access-Control-Allow-Origin", corsAllowOrigin.value()); -// } - } - - @PostConstruct - public void init() { - LOG.info("Demoiselle Module - Rest"); - } - -} diff --git a/demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/interceptor/ValidatePayloadInterceptor.java b/demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/interceptor/ValidatePayloadInterceptor.java deleted file mode 100644 index 3721743..0000000 --- a/demoiselle-rest/src/main/java/org/demoiselle/jee/ws/jaxrs/interceptor/ValidatePayloadInterceptor.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Demoiselle Framework - * - * License: GNU Lesser General Public License (LGPL), version 3 or later. - * See the lgpl.txt file in the root directory or . - */ -package org.demoiselle.jee.ws.jaxrs.interceptor; - -import org.demoiselle.jee.ws.jaxrs.annotation.ValidatePayload; -import java.io.Serializable; -import java.util.HashSet; -import java.util.Set; -import javax.annotation.Priority; - -import javax.interceptor.AroundInvoke; -import javax.interceptor.Interceptor; -import static javax.interceptor.Interceptor.Priority.APPLICATION; -import javax.interceptor.InvocationContext; -import javax.validation.ConstraintViolation; -import javax.validation.UnexpectedTypeException; -import javax.validation.Validation; -import static javax.validation.Validation.buildDefaultValidatorFactory; -import javax.validation.Validator; -import javax.validation.ValidatorFactory; - -import org.demoiselle.jee.ws.jaxrs.exception.DemoiselleRESTException; - -@Interceptor -@ValidatePayload -@Priority(APPLICATION) -public class ValidatePayloadInterceptor implements Serializable { - - private static final long serialVersionUID = 1L; - - @AroundInvoke - public Object manage(final InvocationContext ic) throws Exception { - DemoiselleRESTException ex = new DemoiselleRESTException(); - Set> violations = new HashSet<>(); - for (Object params : ic.getParameters()) { - if (params != null) { - ValidatorFactory dfv = buildDefaultValidatorFactory(); - Validator validator = dfv.getValidator(); - try { - violations.addAll(validator.validate(params)); - for (ConstraintViolation violation : violations) { - String field = (violation.getRootBeanClass().getSimpleName() + "_" - + violation.getPropertyPath()).toLowerCase(); - // GPMessage msg = - // GPMessage.INVALID_FIELD_P1.setSufix(violation.getConstraintDescriptor() - // .getAnnotation().annotationType().getSimpleName().toLowerCase()); - - ex.addMessage(field, violation.getMessage()); - } - } catch (UnexpectedTypeException cause) { - // GPMessage msg = GPMessage.GENERAL_ERROR_P1; - // msg.setParam(cause.getMessage()); - throw new DemoiselleRESTException("ERRO GENERICO -> ALTERAR"); - } - } - } - - if (!violations.isEmpty() && !ex.getMessages().isEmpty()) { - throw ex; - } - return ic.proceed(); - } -} diff --git a/demoiselle-security/src/main/java/org/demoiselle/jee/security/exception/DemoiselleSecurityException.java b/demoiselle-security/src/main/java/org/demoiselle/jee/security/exception/DemoiselleSecurityException.java index d590dfb..ba7b25e 100644 --- a/demoiselle-security/src/main/java/org/demoiselle/jee/security/exception/DemoiselleSecurityException.java +++ b/demoiselle-security/src/main/java/org/demoiselle/jee/security/exception/DemoiselleSecurityException.java @@ -8,7 +8,7 @@ package org.demoiselle.jee.security.exception; import java.util.HashMap; -import org.demoiselle.jee.ws.jaxrs.exception.DemoiselleRESTException; +import org.demoiselle.jee.rest.exception.DemoiselleRESTException; public class DemoiselleSecurityException extends DemoiselleRESTException { -- libgit2 0.21.2