use of org.hl7.fhir.r4.model.QuestionnaireResponse 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.");
}
}
}
use of org.hl7.fhir.r4.model.QuestionnaireResponse in project CRD by HL7-DaVinci.
the class Metadata method buildCapabilityStatement.
/**
* Builds the CapabilityStatement describing the Coverage Requirements Discovery Reference
* Implementation.
*
* @return CapabilityStatement - the CapabilityStatement.
*/
private CapabilityStatement buildCapabilityStatement(String baseUrl) {
CapabilityStatement metadata = new CapabilityStatement();
metadata.setTitle("Da Vinci Coverage Requirements Discovery (CRD) Reference Implementation");
metadata.setStatus(PublicationStatus.DRAFT);
metadata.setExperimental(true);
Calendar calendar = Calendar.getInstance();
calendar.set(2019, 4, 28, 0, 0, 0);
metadata.setDate(calendar.getTime());
metadata.setPublisher("Da Vinci");
metadata.setKind(CapabilityStatementKind.INSTANCE);
CapabilityStatementSoftwareComponent software = new CapabilityStatementSoftwareComponent();
software.setName("https://github.com/HL7-DaVinci/CRD");
metadata.setSoftware(software);
CapabilityStatementImplementationComponent implementation = new CapabilityStatementImplementationComponent();
implementation.setDescription(metadata.getTitle());
implementation.setUrl(baseUrl + "metadata");
metadata.setImplementation(implementation);
metadata.setFhirVersion(FHIRVersion._4_0_1);
metadata.addFormat("json");
metadata.addExtension("http://hl7.org/fhir/StructureDefinition/capabilitystatement-websocket", new StringType("/fhir/r4"));
metadata.addImplementationGuide("https://build.fhir.org/ig/HL7/davinci-crd/index.html");
CapabilityStatementRestComponent rest = new CapabilityStatementRestComponent();
rest.setMode(RestfulCapabilityMode.SERVER);
CapabilityStatementRestSecurityComponent security = new CapabilityStatementRestSecurityComponent();
security.setCors(true);
rest.setSecurity(security);
// Library Resource
CapabilityStatementRestResourceComponent library = new CapabilityStatementRestResourceComponent();
library.setType("Library");
library.addInteraction().setCode(TypeRestfulInteraction.READ);
library.addInteraction().setCode(TypeRestfulInteraction.SEARCHTYPE);
library.addInteraction().setCode(TypeRestfulInteraction.CREATE);
rest.addResource(library);
// Questionnaire Resource
CapabilityStatementRestResourceComponent questionnaire = new CapabilityStatementRestResourceComponent();
questionnaire.setType("Questionnaire");
questionnaire.addInteraction().setCode(TypeRestfulInteraction.READ);
questionnaire.addInteraction().setCode(TypeRestfulInteraction.SEARCHTYPE);
questionnaire.addInteraction().setCode(TypeRestfulInteraction.CREATE);
CapabilityStatementRestResourceOperationComponent questionnairePackageOperation = new CapabilityStatementRestResourceOperationComponent();
questionnairePackageOperation.setName("questionnaire-package");
questionnairePackageOperation.setDefinition("http://hl7.org/fhir/us/davinci-dtr/OperationDefinition/Questionnaire-package");
questionnairePackageOperation.setDocumentation("Retrieve the Questionnaire(s), Libraries, and Valuesets for a given order and coverage. This operation is to support HL7 DaVinci DTR.");
questionnaire.addOperation(questionnairePackageOperation);
rest.addResource(questionnaire);
// QuestionnaireResponse Resource
CapabilityStatementRestResourceComponent questionnaireResponse = new CapabilityStatementRestResourceComponent();
questionnaireResponse.setType("QuestionnaireResponse");
questionnaireResponse.addInteraction().setCode(TypeRestfulInteraction.READ);
questionnaireResponse.addInteraction().setCode(TypeRestfulInteraction.SEARCHTYPE);
questionnaireResponse.addInteraction().setCode(TypeRestfulInteraction.CREATE);
rest.addResource(questionnaireResponse);
// ValueSet Resource
CapabilityStatementRestResourceComponent valueset = new CapabilityStatementRestResourceComponent();
valueset.setType("ValueSet");
valueset.addInteraction().setCode(TypeRestfulInteraction.READ);
valueset.addInteraction().setCode(TypeRestfulInteraction.SEARCHTYPE);
valueset.addInteraction().setCode(TypeRestfulInteraction.CREATE);
// ValueSet $expand Operator
CapabilityStatementRestResourceOperationComponent expandOperator = new CapabilityStatementRestResourceOperationComponent();
expandOperator.setName("expand");
expandOperator.setDefinition("http://hl7.org/fhir/OperationDefinition/ValueSet-expand");
expandOperator.setDocumentation("Only works at the ValueSet type level with a 'url' query parameter. Will only return expansions that are pre-cached on this server.");
valueset.addOperation(expandOperator);
rest.addResource(valueset);
metadata.addRest(rest);
return metadata;
}
Aggregations