br.com.modoagil.asr.rest.AirSafetyReportWebService.java Source code

Java tutorial

Introduction

Here is the source code for br.com.modoagil.asr.rest.AirSafetyReportWebService.java

Source

/*
 *     Copyright 2014 Modo ?gil
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */
package br.com.modoagil.asr.rest;

import static org.springframework.web.bind.annotation.RequestMethod.DELETE;
import static org.springframework.web.bind.annotation.RequestMethod.GET;
import static org.springframework.web.bind.annotation.RequestMethod.POST;
import static org.springframework.web.bind.annotation.RequestMethod.PUT;

import java.util.List;

import javax.validation.Valid;

import lombok.Getter;

import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import br.com.modoagil.asr.model.AirSafetyAnswer;
import br.com.modoagil.asr.model.AirSafetyObservation;
import br.com.modoagil.asr.model.AirSafetyReport;
import br.com.modoagil.asr.model.Forwarding;
import br.com.modoagil.asr.model.RecommendedAction;
import br.com.modoagil.asr.model.RiskClassification;
import br.com.modoagil.asr.model.SectorOpinion;
import br.com.modoagil.asr.model.support.AbstractEntity;
import br.com.modoagil.asr.repository.AirSafetyAnswerRepository;
import br.com.modoagil.asr.repository.AirSafetyObservationRepository;
import br.com.modoagil.asr.repository.AirSafetyReportRepository;
import br.com.modoagil.asr.repository.ForwardingRepository;
import br.com.modoagil.asr.repository.RecommendedActionRepository;
import br.com.modoagil.asr.repository.RiskClassificationRepository;
import br.com.modoagil.asr.repository.SectorOpinionRepository;
import br.com.modoagil.asr.repository.support.GenericRepository;
import br.com.modoagil.asr.rest.support.GenericWebService;
import br.com.modoagil.asr.rest.support.Response;
import br.com.modoagil.asr.rest.support.ResponseBuilder;
import br.com.modoagil.asr.rest.support.ResponseMessages;
import br.com.modoagil.asr.rest.support.WebServicesURL;

/**
 * REST services for {@link RelatorioPrevencao}
 *
 * @created 18/12/2014
 * @author Bruno Csar Ribeiro e Silva - <a href="mailto:bruno@brunocesar.com">bruno@brunocesar.com</a>
 * @see GenericWebService
 */
@RestController
@RequestMapping(value = WebServicesURL.URL_RELPREV)
public class AirSafetyReportWebService extends GenericWebService<AirSafetyReport, AirSafetyReportRepository> {

    private static final String IDRELPREV = "idRelPrev";

    @Getter
    @Autowired
    private AirSafetyReportRepository repository;

    @Autowired
    private RecommendedActionRepository acaoRecomendadaRepository;

    @Autowired
    private RiskClassificationRepository classificacaoRiscoRepository;

    @Autowired
    private ForwardingRepository encaminhamentoRepository;

    @Autowired
    private AirSafetyObservationRepository observacaoRepository;

    @Autowired
    private SectorOpinionRepository parecerSetorRepository;

    @Autowired
    private AirSafetyAnswerRepository respostaRepository;

    /**
     * Busca por relatrios de preveno que possuam o local informado
     *
     * @param local
     *            local a ser pesquisado nos relatrios de preveno
     * @return {@link Response}
     */
    @ResponseBody
    @RequestMapping(value = WebServicesURL.URL_RELPREV_FIND_LOCAL + "/{local}", method = { GET,
            POST }, produces = APPLICATION_JSON)
    public Response<AirSafetyReport> findRelPrevByLocal(@PathVariable("local") final String local) {
        Response<AirSafetyReport> response;
        getLogger().debug("listando relatrios de preveno por local '" + local + "'");
        try {
            final List<AirSafetyReport> dataList = getRepository().findByLocalIgnoreCase(local);
            response = new ResponseBuilder<AirSafetyReport>().success(true).data(dataList)
                    .message(String.format(ResponseMessages.LIST_MESSAGE, dataList.size())).status(HttpStatus.OK)
                    .build();
            getLogger().debug("sucesso ao listar relatrios de preveno por local '" + local + "'");
        } catch (final Exception e) {
            final String message = ExceptionUtils.getRootCauseMessage(e);
            response = new ResponseBuilder<AirSafetyReport>().success(false).message(message)
                    .status(HttpStatus.BAD_REQUEST).build();
            getLogger().error("erro ao listar relatrios de preveno por local '" + local + "'", e);
        }
        return response;
    }

    /**
     * Busca por relatrios de preveno que possuam a descrio informada
     *
     * @param descricao
     *            descrio a ser pesquisada nos relatrios de preveno
     * @return {@link Response}
     */
    @ResponseBody
    @RequestMapping(value = WebServicesURL.URL_RELPREV_FIND_DESCRICAO + "/{descricao}", method = { GET,
            POST }, produces = APPLICATION_JSON)
    public Response<AirSafetyReport> findRelPrevByDescricao(@PathVariable("descricao") final String descricao) {
        Response<AirSafetyReport> response;
        getLogger().debug("listando relatrios de preveno por descrio '" + descricao + "'");
        try {
            final List<AirSafetyReport> dataList = getRepository()
                    .findByDescricaoSituacaoPerigosaContainsIgnoreCase(descricao);
            response = new ResponseBuilder<AirSafetyReport>().success(true).data(dataList)
                    .message(String.format(ResponseMessages.LIST_MESSAGE, dataList.size())).status(HttpStatus.OK)
                    .build();
            getLogger().debug("sucesso ao listar relatrios de preveno por descrio '" + descricao + "'");
        } catch (final Exception e) {
            final String message = ExceptionUtils.getRootCauseMessage(e);
            response = new ResponseBuilder<AirSafetyReport>().success(false).message(message)
                    .status(HttpStatus.BAD_REQUEST).build();
            getLogger().error("erro ao listar relatrios de preveno por descrio '" + descricao + "'", e);
        }
        return response;
    }

    /**
     * Adiciona a um relatrio de preveno uma ao recomendada
     *
     * @param id
     *            id do relprev a ter a ao recomendada includa
     * @param acaoRecomendada
     *            ao recomendada a ser includa
     * @return {@link Response}
     */
    @ResponseBody
    @RequestMapping(value = "/{id}/acao", method = POST, consumes = APPLICATION_JSON, produces = APPLICATION_JSON)
    public Response<AirSafetyReport> addAcaoRecomendada(@PathVariable("id") final Long id,
            @Valid @RequestBody final RecommendedAction acaoRecomendada) {
        return this.createInterationObject(id, acaoRecomendada, acaoRecomendadaRepository);
    }

    /**
     * Atualiza uma ao recomendada de um relatrio de preveno
     *
     * @param id
     *            id do relprev a ter a ao recomendada atualizada
     * @param acaoRecomendada
     *            ao recomendada a ser atualizada
     * @return {@link Response}
     */
    @ResponseBody
    @RequestMapping(value = "/{id}/acao", method = PUT, consumes = APPLICATION_JSON, produces = APPLICATION_JSON)
    public Response<AirSafetyReport> updateAcaoRecomendada(@PathVariable("id") final Long id,
            @RequestBody final RecommendedAction acaoRecomendada) {
        return this.updateInterationObject(id, acaoRecomendada, acaoRecomendadaRepository);
    }

    /**
     * Exclui uma ao recomendada de um relatrio de preveno
     *
     * @param id
     *            id do relprev a ter a ao recomendada excluida
     * @param acaoRecomendada
     *            ao recomendada a ser excluida
     * @return {@link Response}
     */
    @ResponseBody
    @RequestMapping(value = "/{idRelPrev}/acao/{id}", method = DELETE, produces = APPLICATION_JSON)
    public Response<AirSafetyReport> deleteAcaoRecomendada(@PathVariable(IDRELPREV) final Long idRelPrev,
            @PathVariable("id") final Long id) {
        return this.deleteInterationObject(idRelPrev, id, acaoRecomendadaRepository);
    }

    /**
     * Adiciona a um relatrio de preveno uma classifcao
     *
     * @param id
     *            id do relprev a ter a classifcao includa
     * @param classificacao
     *            classifcao a ser includa
     * @return {@link Response}
     */
    @ResponseBody
    @RequestMapping(value = "/{id}/classificacao", method = POST, consumes = APPLICATION_JSON, produces = APPLICATION_JSON)
    public Response<AirSafetyReport> addClassificacaoDeRisco(@PathVariable("id") final Long id,
            @RequestBody final RiskClassification classificacaoRisco) {
        return this.createInterationObject(id, classificacaoRisco, classificacaoRiscoRepository);
    }

    /**
     * Atualiza uma classificao de um relatrio de preveno
     *
     * @param id
     *            id do relprev a ter a classifcao atualizada
     * @param classificacao
     *            classifcao a ser atualizada
     * @return {@link Response}
     */
    @ResponseBody
    @RequestMapping(value = "/{id}/classificacao", method = PUT, consumes = APPLICATION_JSON, produces = APPLICATION_JSON)
    public Response<AirSafetyReport> updateClassificacaoDeRisco(@PathVariable("id") final Long id,
            @RequestBody final RiskClassification classificacaoRisco) {
        return this.updateInterationObject(id, classificacaoRisco, classificacaoRiscoRepository);
    }

    /**
     * Exclui uma classificao de um relatrio de preveno
     *
     * @param id
     *            id do relprev a ter a classifcao excluida
     * @param classificacao
     *            classifcao a ser excluida
     * @return {@link Response}
     */
    @ResponseBody
    @RequestMapping(value = "/{idRelPrev}/classificacao/{id}", method = DELETE, produces = APPLICATION_JSON)
    public Response<AirSafetyReport> deleteClassificacaoDeRisco(@PathVariable(IDRELPREV) final Long idRelPrev,
            @PathVariable("id") final Long id) {
        return this.deleteInterationObject(idRelPrev, id, classificacaoRiscoRepository);
    }

    /**
     * Atualiza um encaminhamento de um relatrio de preveno
     *
     * @param id
     *            id do relprev a ter o encaminhamento includo
     * @param encaminhamento
     *            encaminhamento a ser includo
     * @return {@link Response}
     */
    @ResponseBody
    @RequestMapping(value = "/{id}/encaminhamento", method = POST, consumes = APPLICATION_JSON, produces = APPLICATION_JSON)
    public Response<AirSafetyReport> addEncaminhamento(@PathVariable("id") final Long id,
            @RequestBody final Forwarding encaminhamento) {
        return this.createInterationObject(id, encaminhamento, encaminhamentoRepository);
    }

    /**
     * Adiciona a um relatrio de preveno um encaminhamento
     *
     * @param id
     *            id do relprev a ter o encaminhamento atualizado
     * @param encaminhamento
     *            encaminhamento a ser atualizado
     * @return {@link Response}
     */
    @ResponseBody
    @RequestMapping(value = "/{id}/encaminhamento", method = PUT, consumes = APPLICATION_JSON, produces = APPLICATION_JSON)
    public Response<AirSafetyReport> updateEncaminhamento(@PathVariable("id") final Long id,
            @RequestBody final Forwarding encaminhamento) {
        return this.updateInterationObject(id, encaminhamento, encaminhamentoRepository);
    }

    /**
     * Exclui a um relatrio de preveno um encaminhamento
     *
     * @param id
     *            id do relprev a ter o encaminhamento excluido
     * @param encaminhamento
     *            encaminhamento a ser excluido
     * @return {@link Response}
     */
    @ResponseBody
    @RequestMapping(value = "/{idRelPrev}/encaminhamento/{id}", method = DELETE, produces = APPLICATION_JSON)
    public Response<AirSafetyReport> deleteEncaminhamento(@PathVariable(IDRELPREV) final Long idRelPrev,
            @PathVariable("id") final Long id) {
        return this.deleteInterationObject(idRelPrev, id, encaminhamentoRepository);
    }

    /**
     * Adiciona a um relatrio de preveno uma observao
     *
     * @param id
     *            id do relprev a ter a observao includa
     * @param observacao
     *            observao a ser includa
     * @return {@link Response}
     */
    @ResponseBody
    @RequestMapping(value = "/{id}/observacao", method = POST, consumes = APPLICATION_JSON, produces = APPLICATION_JSON)
    public Response<AirSafetyReport> addObservacao(@PathVariable("id") final Long id,
            @RequestBody final AirSafetyObservation observacao) {
        return this.createInterationObject(id, observacao, observacaoRepository);
    }

    /**
     * Atualiza a observao de um relatrio de preveno
     *
     * @param id
     *            id do relprev a ter a observao atualizada
     * @param observacao
     *            observao a ser atualizada
     * @return {@link Response}
     */
    @ResponseBody
    @RequestMapping(value = "/{id}/observacao", method = PUT, consumes = APPLICATION_JSON, produces = APPLICATION_JSON)
    public Response<AirSafetyReport> updateObservacao(@PathVariable("id") final Long id,
            @RequestBody final AirSafetyObservation observacao) {
        return this.updateInterationObject(id, observacao, observacaoRepository);
    }

    /**
     * Exclui a observao de um relatrio de preveno
     *
     * @param id
     *            id do relprev a ter a observao excluda
     * @param observacao
     *            observao a ser excluda
     * @return {@link Response}
     */
    @ResponseBody
    @RequestMapping(value = "/{idRelPrev}/observacao/{id}", method = DELETE, produces = APPLICATION_JSON)
    public Response<AirSafetyReport> deleteObservacao(@PathVariable(IDRELPREV) final Long idRelPrev,
            @PathVariable("id") final Long id) {
        return this.deleteInterationObject(idRelPrev, id, observacaoRepository);
    }

    /**
     * Adiciona a um relatrio de preveno o parecer do setor
     *
     * @param id
     *            id do relprev a ter o parecer do setor includo
     * @param parecerSetor
     *            parecer do setor a ser includo
     * @return {@link Response}
     */
    @ResponseBody
    @RequestMapping(value = "/{id}/parecer", method = POST, consumes = APPLICATION_JSON, produces = APPLICATION_JSON)
    public Response<AirSafetyReport> addParecerSetor(@PathVariable("id") final Long id,
            @RequestBody final SectorOpinion parecerSetor) {
        return this.createInterationObject(id, parecerSetor, parecerSetorRepository);
    }

    /**
     * Atualiza o parecer do setor de um relatrio de preveno
     *
     * @param id
     *            id do relprev a ter o parecer do setor atualizado
     * @param parecerSetor
     *            parecer do setor a ser atualizado
     * @return {@link Response}
     */
    @ResponseBody
    @RequestMapping(value = "/{id}/parecer", method = PUT, consumes = APPLICATION_JSON, produces = APPLICATION_JSON)
    public Response<AirSafetyReport> updateParecerSetor(@PathVariable("id") final Long id,
            @RequestBody final SectorOpinion parecerSetor) {
        return this.updateInterationObject(id, parecerSetor, parecerSetorRepository);
    }

    /**
     * Exclui o parecer do setor de um relatrio de preveno
     *
     * @param id
     *            id do relprev a ter o parecer do setor excludo
     * @param parecerSetor
     *            parecer do setor a ser excludo
     * @return {@link Response}
     */
    @ResponseBody
    @RequestMapping(value = "/{idRelPrev}/parecer/{id}", method = DELETE, produces = APPLICATION_JSON)
    public Response<AirSafetyReport> deleteParecerSetor(@PathVariable(IDRELPREV) final Long idRelPrev,
            @PathVariable("id") final Long id) {
        return this.deleteInterationObject(idRelPrev, id, parecerSetorRepository);
    }

    /**
     * Adiciona a um relatrio de preveno uma resposta
     *
     * @param id
     *            id do relprev a ter a resposta includa
     * @param resposta
     *            resposta a ser includa
     * @return {@link Response}
     */
    @ResponseBody
    @RequestMapping(value = "/{id}/resposta", method = POST, consumes = APPLICATION_JSON, produces = APPLICATION_JSON)
    public Response<AirSafetyReport> addResposta(@PathVariable("id") final Long id,
            @RequestBody final AirSafetyAnswer resposta) {
        return this.createInterationObject(id, resposta, respostaRepository);
    }

    /**
     * Atualiza a resposta de um relatrio de preveno
     *
     * @param id
     *            id do relprev a ter a resposta atualizada
     * @param resposta
     *            resposta a ser atualizada
     * @return {@link Response}
     */
    @ResponseBody
    @RequestMapping(value = "/{id}/resposta", method = PUT, consumes = APPLICATION_JSON, produces = APPLICATION_JSON)
    public Response<AirSafetyReport> updateResposta(@PathVariable("id") final Long id,
            @RequestBody final AirSafetyAnswer resposta) {
        return this.updateInterationObject(id, resposta, respostaRepository);
    }

    /**
     * Exclui a resposta de um relatrio de preveno
     *
     * @param id
     *            id do relprev a ter a resposta excluda
     * @param resposta
     *            resposta a ser excluda
     * @return {@link Response}
     */
    @ResponseBody
    @RequestMapping(value = "/{idRelPrev}/resposta/{id}", method = DELETE, produces = APPLICATION_JSON)
    public Response<AirSafetyReport> deleteResposta(@PathVariable(IDRELPREV) final Long idRelPrev,
            @PathVariable("id") final Long id) {
        return this.deleteInterationObject(idRelPrev, id, respostaRepository);
    }

    /**
     * Cria o objeto da interao com o relatrio de preveno. A interao pode ser uma das seguintes:
     * <ul>
     * <li>{@link AcaoRecomendada}</li>
     * <li>{@link ClassificacaoRisco}</li>
     * <li>{@link Encaminhamento}</li>
     * <li>{@link Observacao}</li>
     * <li>{@link ParecerSetor}</li>
     * <li>{@link Resposta}</li>
     * </ul>
     *
     * @param relPrevID
     *            id do relatrio de preveno a ter a interao persistida
     * @param entity
     *            entidade da interao do relatrio de preveno a ser persistida
     * @param targetRepository
     *            repositrio de dados da interao do relatrio de preveno
     * @return {@link Response}
     */
    private <E extends AbstractEntity, R extends GenericRepository<E, Long>> Response<AirSafetyReport> createInterationObject(
            final Long relPrevID, final E entity, final R targetRepository) {
        return this.persistInterationObject(relPrevID, entity, targetRepository);
    }

    /**
     * Atualiza o objeto da interao com o relatrio de preveno. A interao pode ser uma das seguintes:
     * <ul>
     * <li>{@link AcaoRecomendada}</li>
     * <li>{@link ClassificacaoRisco}</li>
     * <li>{@link Encaminhamento}</li>
     * <li>{@link Observacao}</li>
     * <li>{@link ParecerSetor}</li>
     * <li>{@link Resposta}</li>
     * </ul>
     *
     * @param relPrevID
     *            id do relatrio de preveno a ter a interao persistida
     * @param entity
     *            entidade da interao do relatrio de preveno a ser persistida
     * @param targetRepository
     *            repositrio de dados da interao do relatrio de preveno
     * @return {@link Response}
     */
    private <E extends AbstractEntity, R extends GenericRepository<E, Long>> Response<AirSafetyReport> updateInterationObject(
            final Long relPrevID, final E entity, final R targetRepository) {
        return this.persistInterationObject(relPrevID, entity, targetRepository);
    }

    /**
     * Exclui o objeto da interao com o relatrio de preveno. A interao pode ser uma das seguintes:
     * <ul>
     * <li>{@link AcaoRecomendada}</li>
     * <li>{@link ClassificacaoRisco}</li>
     * <li>{@link Encaminhamento}</li>
     * <li>{@link Observacao}</li>
     * <li>{@link ParecerSetor}</li>
     * <li>{@link Resposta}</li>
     * </ul>
     *
     * @param idRelPrev
     *            id do relatrio de preveno
     * @param id
     *            id do objeto da entidade da interao do relatrio de preveno a ser excludo
     * @param targetRepository
     *            repositrio de dados da interao do relatrio de preveno
     */
    private <E extends AbstractEntity, R extends GenericRepository<E, Long>> Response<AirSafetyReport> deleteInterationObject(
            final Long idRelPrev, final Long id, final R targetRepository) {
        // TODO implements
        return null;
    }

    private <E extends AbstractEntity, R extends GenericRepository<E, Long>> Response<AirSafetyReport> persistInterationObject(
            final Long relPrevID, @Valid final E entity, final R targetRepository) {
        // TODO implements
        return null;
    }

}