package net.sf.gazpachoquest.rest.resources;
import java.io.IOException;
import java.io.InputStream;
import javax.validation.constraints.NotNull;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import net.sf.gazpachoquest.dto.QuestionnaireDefinitionDTO;
import net.sf.gazpachoquest.dto.support.PageDTO;
import net.sf.gazpachoquest.facades.QuestionnaireDefinitionAccessorFacade;
import org.apache.cxf.io.CachedOutputStream;
import org.apache.cxf.jaxrs.ext.multipart.Multipart;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.oxm.XmlMappingException;
import com.wordnik.swagger.annotations.Api;
import com.wordnik.swagger.annotations.ApiImplicitParam;
import com.wordnik.swagger.annotations.ApiImplicitParams;
import com.wordnik.swagger.annotations.ApiOperation;
import com.wordnik.swagger.annotations.ApiParam;
import com.wordnik.swagger.annotations.ApiResponse;
import com.wordnik.swagger.annotations.ApiResponses;
@Path("/questionnaire-definitions")
@Api(value = "questionnaire-definitions", description = "Questionnaire Definition Interface")
public class QuestionnaireDefinitionResource {
private static final Logger logger = LoggerFactory.getLogger(QuestionnaireDefinitionResource.class);
@Autowired
private QuestionnaireDefinitionAccessorFacade questionnaireDefinitionAccessorFacade;
@GET
@ApiOperation(value = "Returns questionnaire definitions available", response = PageDTO.class)
@ApiResponses(value = { @ApiResponse(code = 404, message = "Not enough access rights"),
@ApiResponse(code = 200, message = "Questionnaire Definitions available") })
@Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public PageDTO<QuestionnaireDefinitionDTO> getQuestionnaireDefinitions(
@NotNull @ApiParam(name = "pageNumber", value = "Refers page number", required = true) @QueryParam("pageNumber") Integer pageNumber,
@NotNull @ApiParam(name = "size", value = "Refers page size", required = true) @QueryParam("size") Integer size)
throws XmlMappingException, IOException {
logger.info("New getQuestionnairDefinitions petition received ");
return questionnaireDefinitionAccessorFacade.findPaginated(pageNumber, size);
}
@POST
@Path("/import")
@Consumes("multipart/form-data")
@ApiOperation(value = "Import questionnaire definition", notes = "Only xml format supported", response = QuestionnaireDefinitionDTO.class)
@ApiResponses(value = { @ApiResponse(code = 415, message = "Unsupported format"),
@ApiResponse(code = 200, message = "Imported questionnaire definition") })
@ApiImplicitParams(@ApiImplicitParam(dataType = "file", name = "content", paramType = "body"))
@Produces(MediaType.APPLICATION_JSON)
public QuestionnaireDefinitionDTO importQuestionnairDefinition(
@Multipart(value = "content", type = "text/xml") @ApiParam(access = "internal") InputStream content)
throws Exception {
logger.info("New import QuestionnaireDefinition petition received");
QuestionnaireDefinitionDTO imported = questionnaireDefinitionAccessorFacade
.importQuestionnaireDefinition(content);
logger.info("QuestionnaireDefinition imported with id = {}", imported.getId());
return imported;
}
@GET
@Path("/{questionnaireDefinitionId}/export")
@ApiOperation(value = "Export given questionnaire definition into xml", response = QuestionnaireDefinitionDTO.class, produces = "application/xml")
@ApiResponses(value = { @ApiResponse(code = 404, message = "Not enough access rights"),
@ApiResponse(code = 200, message = "Questionnaire Definition available") })
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
public InputStream exportQuestionnairDefinition(
@NotNull @PathParam("questionnaireDefinitionId") @ApiParam(value = "Questionnaire DefinitionId id", required = true) Integer questionnairDefinitionId)
throws XmlMappingException, IOException {
logger.info("New exporting petition received for QuestionnairDefinitionId {}", questionnairDefinitionId);
CachedOutputStream outputStream = new CachedOutputStream();
questionnaireDefinitionAccessorFacade.exportQuestionnaireDefinition(questionnairDefinitionId, outputStream);
logger.info("QuestionnaireDefinition with id = {} exported succesfully", questionnairDefinitionId);
return outputStream.getInputStream();
}
}