Search in sources :

Example 1 with IDomainResource

use of org.hl7.fhir.instance.model.api.IDomainResource in project CRD by HL7-DaVinci.

the class QuestionnaireController method getNextQuestionOperation.

/**
 * Returns the next question based on the request.
 * @param body
 * @param request
 * @return
 */
private ResponseEntity<String> getNextQuestionOperation(String body, HttpServletRequest request) {
    logger.info("POST /Questionnaire/$next-question fhir+");
    FhirContext ctx = new FhirComponents().getFhirContext();
    IParser parser = ctx.newJsonParser();
    // Parses the body.
    IDomainResource domainResource = (IDomainResource) parser.parseResource(QuestionnaireResponse.class, body);
    if (!domainResource.fhirType().equalsIgnoreCase("QuestionnaireResponse")) {
        logger.warning("unsupported resource type: ");
        HttpStatus status = HttpStatus.BAD_REQUEST;
        MediaType contentType = MediaType.TEXT_PLAIN;
        return ResponseEntity.status(status).contentType(contentType).body("Bad Request");
    } else {
        logger.info(" ---- Resource received " + domainResource.toString());
        QuestionnaireResponse inputQuestionnaireResponse = (QuestionnaireResponse) domainResource;
        String fragmentId = inputQuestionnaireResponse.getQuestionnaire();
        List<Resource> containedResource = inputQuestionnaireResponse.getContained();
        Questionnaire inputQuestionnaireFromRequest = null;
        for (int i = 0; i < containedResource.size(); i++) {
            Resource item = containedResource.get(i);
            if (item.getResourceType().equals(ResourceType.Questionnaire)) {
                Questionnaire checkInputQuestionnaire = (Questionnaire) item;
                if (checkInputQuestionnaire.getId().equals(fragmentId)) {
                    inputQuestionnaireFromRequest = checkInputQuestionnaire;
                    break;
                }
            }
        }
        logger.info("--- Received questionnaire response: " + ctx.newJsonParser().encodeResourceToString(inputQuestionnaireResponse));
        // Check that there are no duplicates in the recieved set of questions.
        if ((new HashSet(((Questionnaire) inputQuestionnaireResponse.getContained().get(0)).getItem().stream().map(item -> item.getLinkId()).collect(Collectors.toList()))).size() != ((Questionnaire) inputQuestionnaireResponse.getContained().get(0)).getItem().size()) {
            throw new RuntimeException("Received a set of questions with duplicates.");
        }
        String questionnaireId = ((Reference) inputQuestionnaireResponse.getExtensionByUrl("http://hl7.org/fhir/StructureDefinition/contained-id").getValue()).getReference();
        System.out.println("Input Questionnaire: " + questionnaireId);
        if (inputQuestionnaireFromRequest != null) {
            if (!questionnaireTrees.containsKey(questionnaireId)) {
                // If there is not already a tree that matches the requested questionnaire id, build it.
                // Import the requested CDS-Library Questionnaire.
                Questionnaire cdsQuestionnaire = importCdsAdaptiveQuestionnaire(request, parser, fileStore, questionnaireId);
                // Build the tree.
                AdaptiveQuestionnaireTree newTree = new AdaptiveQuestionnaireTree(cdsQuestionnaire);
                questionnaireTrees.put(questionnaireId, newTree);
                logger.info("--- Built Questionnaire Tree for " + questionnaireId);
            }
            // Pull the tree for the requested questionnaire id.
            AdaptiveQuestionnaireTree currentTree = questionnaireTrees.get(questionnaireId);
            // Get the request's set of answer responses.
            List<QuestionnaireResponseItemComponent> allResponses = inputQuestionnaireResponse.getItem();
            // Pull the resulting next question that the recieved responses and answers point to from the tree without including its children.
            List<QuestionnaireItemComponent> nextQuestionSetResults = currentTree.getNextQuestionsForAnswers(allResponses, inputQuestionnaireResponse);
            // Add the next set of questions to the response.
            QuestionnaireController.addQuestionSetToQuestionnaireResponse(inputQuestionnaireResponse, nextQuestionSetResults);
            // Check that there no duplicates in the set of questions.
            if ((new HashSet(((Questionnaire) inputQuestionnaireResponse.getContained().get(0)).getItem().stream().map(item -> item.getLinkId()).collect(Collectors.toList()))).size() != ((Questionnaire) inputQuestionnaireResponse.getContained().get(0)).getItem().size()) {
                throw new RuntimeException("Attempted to send a set of questions with duplicates. Question IDs are: " + (((Questionnaire) inputQuestionnaireResponse.getContained().get(0)).getItem().stream().map(item -> item.getLinkId()).collect(Collectors.toList())));
            }
            logger.info("--- Added next question set for questionnaire \'" + questionnaireId + "\' for responses \'" + allResponses + "\'.");
            // Build and send the response.
            String formattedResourceString = ctx.newJsonParser().encodeResourceToString(inputQuestionnaireResponse);
            logger.info("--- Sending questionnaire response: " + formattedResourceString);
            return ResponseEntity.status(HttpStatus.ACCEPTED).contentType(MediaType.APPLICATION_JSON).header(HttpHeaders.CONTENT_TYPE, "application/fhir+json" + "; charset=utf-8").body(formattedResourceString);
        } else {
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).contentType(MediaType.APPLICATION_JSON).header(HttpHeaders.CONTENT_TYPE, "application/fhir+json" + "; charset=utf-8").body("Input questionnaire from the request does not exist.");
        }
    }
}
Also used : Application(org.hl7.davinci.endpoint.Application) QuestionnaireItemComponent(org.hl7.fhir.r4.model.Questionnaire.QuestionnaireItemComponent) DataFormatException(ca.uhn.fhir.parser.DataFormatException) Autowired(org.springframework.beans.factory.annotation.Autowired) HashMap(java.util.HashMap) FhirComponents(org.hl7.davinci.r4.FhirComponents) Reference(org.hl7.fhir.r4.model.Reference) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) FhirContext(ca.uhn.fhir.context.FhirContext) HttpServletRequest(javax.servlet.http.HttpServletRequest) Map(java.util.Map) QuestionnaireEmbeddedCQLProcessor(org.hl7.davinci.endpoint.files.QuestionnaireEmbeddedCQLProcessor) QuestionnaireResponseStatus(org.hl7.fhir.r4.model.QuestionnaireResponse.QuestionnaireResponseStatus) IParser(ca.uhn.fhir.parser.IParser) HttpHeaders(org.springframework.http.HttpHeaders) QuestionnaireResponseItemAnswerComponent(org.hl7.fhir.r4.model.QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent) MediaType(org.springframework.http.MediaType) FileResource(org.hl7.davinci.endpoint.files.FileResource) Resource(org.hl7.fhir.r4.model.Resource) FileStore(org.hl7.davinci.endpoint.files.FileStore) IOException(java.io.IOException) Logger(java.util.logging.Logger) Collectors(java.util.stream.Collectors) FileNotFoundException(java.io.FileNotFoundException) HttpStatus(org.springframework.http.HttpStatus) ResourceType(org.hl7.fhir.r4.model.ResourceType) QuestionnaireResponseItemComponent(org.hl7.fhir.r4.model.QuestionnaireResponse.QuestionnaireResponseItemComponent) HttpEntity(org.springframework.http.HttpEntity) List(java.util.List) QuestionnaireResponse(org.hl7.fhir.r4.model.QuestionnaireResponse) IDomainResource(org.hl7.fhir.instance.model.api.IDomainResource) org.springframework.web.bind.annotation(org.springframework.web.bind.annotation) ResponseEntity(org.springframework.http.ResponseEntity) QuestionnaireItemAnswerOptionComponent(org.hl7.fhir.r4.model.Questionnaire.QuestionnaireItemAnswerOptionComponent) Questionnaire(org.hl7.fhir.r4.model.Questionnaire) FhirContext(ca.uhn.fhir.context.FhirContext) QuestionnaireItemComponent(org.hl7.fhir.r4.model.Questionnaire.QuestionnaireItemComponent) Questionnaire(org.hl7.fhir.r4.model.Questionnaire) HttpStatus(org.springframework.http.HttpStatus) Reference(org.hl7.fhir.r4.model.Reference) FileResource(org.hl7.davinci.endpoint.files.FileResource) Resource(org.hl7.fhir.r4.model.Resource) IDomainResource(org.hl7.fhir.instance.model.api.IDomainResource) QuestionnaireResponse(org.hl7.fhir.r4.model.QuestionnaireResponse) IDomainResource(org.hl7.fhir.instance.model.api.IDomainResource) QuestionnaireResponseItemComponent(org.hl7.fhir.r4.model.QuestionnaireResponse.QuestionnaireResponseItemComponent) MediaType(org.springframework.http.MediaType) FhirComponents(org.hl7.davinci.r4.FhirComponents) IParser(ca.uhn.fhir.parser.IParser) HashSet(java.util.HashSet)

Aggregations

FhirContext (ca.uhn.fhir.context.FhirContext)1 DataFormatException (ca.uhn.fhir.parser.DataFormatException)1 IParser (ca.uhn.fhir.parser.IParser)1 FileNotFoundException (java.io.FileNotFoundException)1 IOException (java.io.IOException)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 HashSet (java.util.HashSet)1 List (java.util.List)1 Map (java.util.Map)1 Logger (java.util.logging.Logger)1 Collectors (java.util.stream.Collectors)1 HttpServletRequest (javax.servlet.http.HttpServletRequest)1 Application (org.hl7.davinci.endpoint.Application)1 FileResource (org.hl7.davinci.endpoint.files.FileResource)1 FileStore (org.hl7.davinci.endpoint.files.FileStore)1 QuestionnaireEmbeddedCQLProcessor (org.hl7.davinci.endpoint.files.QuestionnaireEmbeddedCQLProcessor)1 FhirComponents (org.hl7.davinci.r4.FhirComponents)1 IDomainResource (org.hl7.fhir.instance.model.api.IDomainResource)1 Questionnaire (org.hl7.fhir.r4.model.Questionnaire)1