package br.com.centralit.citsmart.rest.resource; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.nio.charset.Charset; import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import javax.xml.bind.JAXB; import javax.xml.bind.JAXBException; import org.apache.commons.lang.StringUtils; import br.com.centralit.citsmart.rest.bean.RestExecutionDTO; import br.com.centralit.citsmart.rest.bean.RestOperationDTO; import br.com.centralit.citsmart.rest.bean.RestSessionDTO; import br.com.centralit.citsmart.rest.schema.CtAddServiceRequest; import br.com.centralit.citsmart.rest.schema.CtAddServiceRequestResp; import br.com.centralit.citsmart.rest.schema.CtError; import br.com.centralit.citsmart.rest.schema.CtLogin; import br.com.centralit.citsmart.rest.schema.CtLoginResp; import br.com.centralit.citsmart.rest.schema.CtMessage; import br.com.centralit.citsmart.rest.service.RestSessionService; import br.com.centralit.citsmart.rest.service.RestSessionServiceEjb; import br.com.centralit.citsmart.rest.util.RestEnum; import br.com.centralit.citsmart.rest.util.RestOperationUtil; import br.com.centralit.citsmart.rest.util.RestUtil; import br.com.citframework.excecao.ServiceException; import br.com.citframework.util.Reflexao; import br.com.citframework.util.UtilDatas; import br.com.citframework.util.UtilI18N; import br.com.citframework.util.UtilXMLDate; @Path("/services") public class RestOperationResources { private static final Logger LOGGER = Logger.getLogger(RestOperationResources.class.getName()); @Context protected HttpServletRequest httpRequest; @POST @Path("/login") public Response login(final CtLogin login) throws JAXBException { final CtLoginResp resp = new CtLoginResp(); try { final RestSessionDTO session = this.makeRESTSession(login); final String sessionID = session.getSessionID(); if (StringUtils.isNotBlank(sessionID)) { resp.setSessionID(sessionID); } else { return Response.status(Status.PRECONDITION_FAILED).entity(resp).build(); } } catch (final Exception e) { final CtError error = RestOperationUtil.buildError(RestEnum.SESSION_ERROR, e.getMessage()); resp.setError(error); return Response.status(Status.PRECONDITION_FAILED).entity(resp).build(); } return Response.status(Status.OK).entity(resp).build(); } protected RestSessionDTO makeRESTSession(final CtLogin login) throws ServiceException, Exception { httpRequest.getSession().setAttribute("locale", UtilI18N.getLocale()); return this.getRESTSessionService().newSession(httpRequest, login); } @POST @Path("/xml/login") public Response login(final String xml) throws JAXBException { final InputStream ioos = new ByteArrayInputStream(xml.getBytes(Charset.defaultCharset())); final CtLogin login = JAXB.unmarshal(ioos, CtLogin.class); return this.login(login); } @POST @Path("/addServiceRequest") public Response addServiceRequest(final br.com.centralit.citsmart.rest.schema.old.CtAddServiceRequest addServiceRequest) throws JAXBException { final CtAddServiceRequestResp resp = new CtAddServiceRequestResp(); resp.setDateTime(UtilXMLDate.toXMLGregorianCalendar(UtilDatas.getDataHoraAtual())); final CtAddServiceRequest input = new CtAddServiceRequest(); try { Reflexao.copyPropertyValues(addServiceRequest, input); } catch (final Exception e) { LOGGER.log(Level.WARNING, e.getMessage(), e); final CtError error = RestOperationUtil.buildError(RestEnum.INTERNAL_ERROR, e.getMessage()); resp.setError(error); return Response.status(Status.PRECONDITION_FAILED).entity(resp).build(); } input.setMessageID("addServiceRequest"); input.setServiceRequestSource(addServiceRequest.getServiceRequestSource()); final RestSessionDTO restSession = RestUtil.getRestSessionService(null).getSession(input.getSessionID()); if (!RestUtil.isValidSession(restSession)) { final CtError error = RestOperationUtil.buildError(RestEnum.SESSION_ERROR, "Sess�o n�o existe ou est� expirada"); resp.setError(error); return Response.status(Status.PRECONDITION_FAILED).entity(resp).build(); } final RestOperationDTO restOperation = RestUtil.getRestOperationService(restSession).findByName(input.getMessageID()); if (restOperation == null) { final CtError error = RestOperationUtil.buildError(RestEnum.PARAM_ERROR, "Opera��o n�o cadastrada"); resp.setError(error); return Response.status(Status.PRECONDITION_FAILED).entity(resp).build(); } if (!RestUtil.getRestPermissionService(restSession).allowedAccess(restSession, restOperation)) { final CtError error = RestOperationUtil.buildError(RestEnum.PARAM_ERROR, "Usu�rio n�o tem acesso � opera��o"); resp.setError(error); return Response.status(Status.PRECONDITION_FAILED).entity(resp).build(); } RestExecutionDTO restExecution = null; try { restExecution = RestOperationUtil.initialize(restSession, restOperation, input); } catch (final Exception e) { LOGGER.log(Level.WARNING, e.getMessage(), e); final CtError error = RestOperationUtil.buildError(RestEnum.INTERNAL_ERROR, RestUtil.stackToString(e)); resp.setError(error); return Response.status(Status.PRECONDITION_FAILED).entity(resp).build(); } try { final CtAddServiceRequestResp result = (CtAddServiceRequestResp) RestOperationUtil.execute(restSession, restOperation, input); resp.setDateTime(result.getDateTime()); resp.setError(result.getError()); resp.setOperationID(result.getOperationID()); resp.setServiceRequestDest(result.getServiceRequestDest()); RestOperationUtil.finalize(restOperation, restExecution, restSession, result); if (resp.getError() == null) { return Response.status(Status.OK).entity(resp).build(); } return Response.status(Status.PRECONDITION_FAILED).entity(resp).build(); } catch (final Exception e) { LOGGER.log(Level.WARNING, e.getMessage(), e); final CtError error = RestUtil.getRestLogService(restSession).create(restExecution, e); resp.setError(error); return Response.status(Status.PRECONDITION_FAILED).entity(resp).build(); } } @POST @Path("/xml/addServiceRequest") public Response addServiceRequest(final String xml) throws JAXBException { final InputStream ioos = new ByteArrayInputStream(xml.getBytes(Charset.defaultCharset())); final br.com.centralit.citsmart.rest.schema.old.CtAddServiceRequest addServiceRequest = JAXB.unmarshal(ioos, br.com.centralit.citsmart.rest.schema.old.CtAddServiceRequest.class); return this.addServiceRequest(addServiceRequest); } @POST @Path("/execute") public Response execute(final CtMessage input) { return RestOperationUtil.execute(input); } private RestSessionService restSessionService; private RestSessionService getRESTSessionService() throws Exception { if (restSessionService == null) { restSessionService = new RestSessionServiceEjb(); } return restSessionService; } }