001/*-
002 * #%L
003 * HAPI FHIR JPA Server
004 * %%
005 * Copyright (C) 2014 - 2023 Smile CDR, Inc.
006 * %%
007 * Licensed under the Apache License, Version 2.0 (the "License");
008 * you may not use this file except in compliance with the License.
009 * You may obtain a copy of the License at
010 *
011 *      http://www.apache.org/licenses/LICENSE-2.0
012 *
013 * Unless required by applicable law or agreed to in writing, software
014 * distributed under the License is distributed on an "AS IS" BASIS,
015 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
016 * See the License for the specific language governing permissions and
017 * limitations under the License.
018 * #L%
019 */
020package ca.uhn.fhir.jpa.term.loinc;
021
022import ca.uhn.fhir.jpa.entity.TermCodeSystemVersion;
023import ca.uhn.fhir.jpa.entity.TermConcept;
024import ca.uhn.fhir.jpa.term.api.ITermLoaderSvc;
025import org.apache.commons.csv.CSVRecord;
026import org.hl7.fhir.r4.model.ConceptMap;
027import org.hl7.fhir.r4.model.ValueSet;
028
029import java.util.List;
030import java.util.Map;
031import java.util.Properties;
032
033import static ca.uhn.fhir.jpa.term.loinc.LoincUploadPropertiesEnum.*;
034import static org.apache.commons.lang3.StringUtils.isNotBlank;
035import static org.apache.commons.lang3.StringUtils.trim;
036
037public class LoincAnswerListHandler extends BaseLoincHandler {
038
039        private final Map<String, TermConcept> myCode2Concept;
040        private final TermCodeSystemVersion myCodeSystemVersion;
041
042        public LoincAnswerListHandler(TermCodeSystemVersion theCodeSystemVersion, Map<String, TermConcept> theCode2concept,
043                        List<ValueSet> theValueSets, List<ConceptMap> theConceptMaps, Properties theUploadProperties, String theCopyrightStatement) {
044                super(theCode2concept, theValueSets, theConceptMaps, theUploadProperties, theCopyrightStatement);
045                myCodeSystemVersion = theCodeSystemVersion;
046                myCode2Concept = theCode2concept;
047        }
048
049        @Override
050        public void accept(CSVRecord theRecord) {
051
052                // this is the code for the list (will repeat)
053                String answerListId = trim(theRecord.get("AnswerListId"));
054                String answerListName = trim(theRecord.get("AnswerListName"));
055                String answerListOid = trim(theRecord.get("AnswerListOID"));
056                String externallyDefined = trim(theRecord.get("ExtDefinedYN"));
057                String extenrallyDefinedCs = trim(theRecord.get("ExtDefinedAnswerListCodeSystem"));
058                String externallyDefinedLink = trim(theRecord.get("ExtDefinedAnswerListLink"));
059                // this is the code for the actual answer (will not repeat)
060                String answerString = trim(theRecord.get("AnswerStringId"));
061                String sequenceNumber = trim(theRecord.get("SequenceNumber"));
062                String displayText = trim(theRecord.get("DisplayText"));
063                String extCodeId = trim(theRecord.get("ExtCodeId"));
064                String extCodeDisplayName = trim(theRecord.get("ExtCodeDisplayName"));
065                String extCodeSystem = trim(theRecord.get("ExtCodeSystem"));
066                String extCodeSystemVersion = trim(theRecord.get("ExtCodeSystemVersion"));
067
068
069                // Answer list code
070                if (!myCode2Concept.containsKey(answerListId)) {
071                        TermConcept concept = new TermConcept(myCodeSystemVersion, answerListId);
072                        concept.setDisplay(answerListName);
073                        myCode2Concept.put(answerListId, concept);
074                }
075
076                // Answer list ValueSet
077                String valueSetId;
078                String codeSystemVersionId = myUploadProperties.getProperty(LOINC_CODESYSTEM_VERSION.getCode());
079                if (codeSystemVersionId != null) {
080                        valueSetId = answerListId + "-" + codeSystemVersionId;
081                } else {
082                        valueSetId = answerListId;
083                }
084                ValueSet vs = getValueSet(valueSetId, "http://loinc.org/vs/" + answerListId, answerListName, LOINC_ANSWERLIST_VERSION.getCode());
085                if (vs.getIdentifier().isEmpty()) {
086                        vs.addIdentifier()
087                                .setSystem("urn:ietf:rfc:3986")
088                                .setValue("urn:oid:" + answerListOid);
089                }
090
091                if (isNotBlank(answerString)) {
092
093                        // Answer code
094                        if (!myCode2Concept.containsKey(answerString)) {
095                                TermConcept concept = new TermConcept(myCodeSystemVersion, answerString);
096                                concept.setDisplay(displayText);
097                                if (isNotBlank(sequenceNumber) && sequenceNumber.matches("^[0-9]$")) {
098                                        concept.setSequence(Integer.parseInt(sequenceNumber));
099                                }
100                                myCode2Concept.put(answerString, concept);
101                        }
102
103                        vs
104                                .getCompose()
105                                .getIncludeFirstRep()
106                                .setSystem(ITermLoaderSvc.LOINC_URI)
107                                .setVersion(codeSystemVersionId)
108                                .addConcept()
109                                .setCode(answerString)
110                                .setDisplay(displayText);
111
112                }
113
114        }
115
116}