package br.usp.nds.agualastro.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.UriInfo; import javax.ws.rs.core.Response.ResponseBuilder; import org.jboss.resteasy.annotations.providers.jaxb.Formatted; import br.usp.nds.agualastro.persistencia.Entidade; import br.usp.nds.agualastro.persistencia.Persistencia; @Path("{entidade}/{operacao}") public class ServicoFacade { @Context private HttpServletRequest request; @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(); 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); objeto.setResposta(metodo.invoke(objeto)); retorno = Retorno.criar(objeto.getResposta(), params); em.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if (e.getCause() != null) { retorno = Retorno.criarErro(e.getCause().getMessage()); return Response.ok(retorno, "application/json").build(); } } finally { if (t.isActive()) t.rollback(); } } finally { em.close(); } ResponseBuilder rb = Response.ok(metodo.getAnnotation(MediaType.class) != null ? retorno.getItem().get(0) : retorno, metodo.getAnnotation(MediaType.class) != null ? metodo.getAnnotation(MediaType.class).mediaType() : "application/json"); if (metodo.getAnnotation(MediaType.class) != null) { rb.header("Content-Disposition", "attachment;filename=" + metodo.getAnnotation(MediaType.class).arquivo()); } return rb.build(); } @GET @Formatted public Response executar(@PathParam("entidade") String entidade, @PathParam("operacao") String operacao, @Context UriInfo info) { return executar(entidade, operacao, info.getQueryParameters()); } }