package br.usp.nds.remote.servico; import java.lang.reflect.Method; import javax.persistence.EntityManager; import javax.persistence.EntityTransaction; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.ResponseBuilder; import javax.ws.rs.core.UriInfo; import org.jboss.resteasy.annotations.providers.jaxb.Formatted; import br.usp.nds.remote.persistencia.Auditoria; import br.usp.nds.remote.persistencia.Entidade; import br.usp.nds.remote.persistencia.Persistencia; @Path("") public class ServicoFacade { @Context private HttpServletRequest request; @Path("{entidade}/{operacao}") @POST public Response executar(@PathParam("entidade") String entidade, @PathParam("operacao") String operacao, MultivaluedMap params) { Entidade objeto = null; Method metodo = null; Retorno retorno = null; EntityManager em = Persistencia.getInstance().getEMF().createEntityManager(); String mediaType = "application/json"; try { EntityTransaction t = em.getTransaction(); try { t.begin(); objeto = Entidade.fromMultivaluedMap(entidade, params, em); objeto.setRequest(request); objeto.injetar(em); metodo = objeto.getClass().getMethod(operacao); if (metodo.getAnnotation(TipoRetorno.class) != null) { mediaType = metodo.getAnnotation(TipoRetorno.class).mediaType(); } objeto.setResposta(metodo.invoke(objeto)); if (objeto.getMediaType() != null && !objeto.getMediaType().isEmpty()) { mediaType = objeto.getMediaType(); } retorno = Retorno.criar(objeto.getResposta(), params); Auditoria.gravar(em, request.getUserPrincipal() != null ? request.getUserPrincipal().getName() : null, entidade, operacao, params.toString()); em.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); Throwable t2 = e; while (t2.getCause() != null) { t2 = t2.getCause(); } return Response.ok(Retorno.criarErro(t2.getMessage()), mediaType).build(); } finally { if (t.isActive()) t.rollback(); } } finally { em.close(); } if ("application/json".equals(mediaType)) { return Response.ok(retorno, mediaType).build(); } else { ResponseBuilder rb = Response.ok(retorno.getItem().get(0), mediaType); if (!metodo.getAnnotation(TipoRetorno.class).arquivo().isEmpty()) { rb.header("Content-Disposition", "attachment;filename=" + metodo.getAnnotation(TipoRetorno.class).arquivo()); } return rb.build(); } } @Path("{entidade}/{operacao}") @GET @Formatted public Response executar(@PathParam("entidade") String entidade, @PathParam("operacao") String operacao, @Context UriInfo info) { return executar(entidade, operacao, info.getQueryParameters()); } }