org.openmrs.module.casereport.CdaDocumentGenerator.java Source code

Java tutorial

Introduction

Here is the source code for org.openmrs.module.casereport.CdaDocumentGenerator.java

Source

/**
 * This Source Code Form is subject to the terms of the Mozilla Public License,
 * v. 2.0. If a copy of the MPL was not distributed with this file, You can
 * obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under
 * the terms of the Healthcare Disclaimer located at http://openmrs.org/license.
 * 
 * Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS
 * graphic logo is a trademark of OpenMRS Inc.
 */
package org.openmrs.module.casereport;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.marc.everest.datatypes.II;
import org.marc.everest.datatypes.generic.CE;
import org.marc.everest.datatypes.generic.CS;
import org.marc.everest.datatypes.generic.SET;
import org.marc.everest.formatters.xml.datatypes.r1.DatatypeFormatter;
import org.marc.everest.formatters.xml.datatypes.r1.R1FormatterCompatibilityMode;
import org.marc.everest.formatters.xml.its1.XmlIts1Formatter;
import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalDocument;
import org.marc.everest.rmim.uv.cdar2.vocabulary.BindingRealm;
import org.marc.everest.rmim.uv.cdar2.vocabulary.x_BasicConfidentialityKind;
import org.w3c.dom.Document;

/**
 * Generates a CDA document
 */
public final class CdaDocumentGenerator {

    protected final Log log = LogFactory.getLog(this.getClass());

    public static final DateFormat DATE_FORMATTER = new SimpleDateFormat("yyyyMMddHHmmss.SSSZ");

    public static final String TYPE_ID_ROOT = "2.16.840.1.113883.1.3";

    public static final String EXTENSION = "POCD_HD000040";

    public static final String TEMPLATE_ID_ROOT = "1.3.6.1.4.1.19376.1.5.3.1.1.18.1.2";

    public static final String TITLE = "Case Based Report for HIV";

    //Should this be system locale or a constant?
    public static final String LANGUAGE_CODE = "en-US";

    public static final String CODE_SYSTEM_LOINC = "2.16.840.1.113883.6.1";

    public static final String DOCUMENT_CODE = "55751-2";

    public static final String PATIENT_ID_ROOT = "1.3.6.1.4.1.21367.2010.1.2.300";

    public static final String SECTION_TEMPLATE_ID_ROOT1 = "2.16.840.1.113883.10.20.1.6";

    public static final String SECTION_TEMPLATE_ID_ROOT2 = "1.3.6.1.4.1.19376.1.5.3.1.3.23";

    public static final String CODE_SYSTEM_NAME_LOINC = "LOINC";

    public static final String LOINC_DOCUMENT_NAME = "Public health Case report";

    private static CdaDocumentGenerator instance;

    private CdaDocumentGenerator() {
    }

    public synchronized static CdaDocumentGenerator getInstance() {
        if (instance == null) {
            instance = new CdaDocumentGenerator();
        }
        return instance;
    }

    /**
     * Generates and returns a CDA document for the specified report form
     * 
     * @param reportForm
     * @return the generated CDA document
     * @should generate a CDA document
     */
    public String generate(CaseReportForm reportForm) throws Exception {
        //cdaMessage = StringUtils.replace(cdaMessage, getPlaceHolder("triggerList"), triggerList);
        //cdaMessage = StringUtils.replace(cdaMessage, getPlaceHolder("dateSubmitted"), DATE_FORMATTER.format(new Date()));
        //String oid1 = "2.25." + new BigInteger(reportForm.getReportUuid().getBytes());
        //String oid2 = "2.25." + new BigInteger(UUID.randomUUID().toString().getBytes())
        ClinicalDocument cdaDocument = new ClinicalDocument();
        cdaDocument.setRealmCode(new SET<CS<BindingRealm>>(
                new CS<BindingRealm>(BindingRealm.UniversalRealmOrContextUsedInEveryInstance)));
        cdaDocument.setTypeId(TYPE_ID_ROOT, EXTENSION);
        cdaDocument.setTemplateId(Arrays.asList(new II(TEMPLATE_ID_ROOT)));
        cdaDocument.setId(reportForm.getReportUuid());
        cdaDocument.setCode(new CE<String>(DOCUMENT_CODE, CODE_SYSTEM_LOINC, CODE_SYSTEM_NAME_LOINC, null,
                LOINC_DOCUMENT_NAME, null));
        cdaDocument.setTitle(TITLE);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(reportForm.getReportDate());
        cdaDocument.setEffectiveTime(calendar);
        cdaDocument.setConfidentialityCode(x_BasicConfidentialityKind.Normal);
        cdaDocument.setLanguageCode(LANGUAGE_CODE);
        cdaDocument.getRecordTarget().add(CdaUtil.createRecordTarget(reportForm));
        cdaDocument.getAuthor().add(CdaUtil.createAuthor(reportForm));
        cdaDocument.setComponent(CdaUtil.createComponent(reportForm));

        XmlIts1Formatter fmtr = new XmlIts1Formatter();
        //This instructs the XML ITS1 Formatter we want to use CDA datatypes
        fmtr.getGraphAides().add(new DatatypeFormatter(R1FormatterCompatibilityMode.ClinicalDocumentArchitecture));
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        fmtr.graph(out, cdaDocument);

        //Use a Transformer for output the cda in a pretty format
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        InputStream inputStream = new ByteArrayInputStream(out.toByteArray());
        Document doc = builder.parse(inputStream);

        TransformerFactory tFactory = TransformerFactory.newInstance();
        Transformer transformer = tFactory.newTransformer();
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");

        StreamResult result = new StreamResult(new ByteArrayOutputStream());
        transformer.transform(new DOMSource(doc), result);

        return result.getOutputStream().toString();
    }
}