org.openmrs.module.radiology.legacyui.RadiologyProperties.java Source code

Java tutorial

Introduction

Here is the source code for org.openmrs.module.radiology.legacyui.RadiologyProperties.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.radiology.legacyui;

import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;

import org.apache.commons.lang3.StringUtils;
import org.openmrs.CareSetting;
import org.openmrs.ConceptClass;
import org.openmrs.EncounterRole;
import org.openmrs.EncounterType;
import org.openmrs.OrderType;
import org.openmrs.VisitType;
import org.openmrs.api.AdministrationService;
import org.openmrs.api.ConceptService;
import org.openmrs.api.EncounterService;
import org.openmrs.api.OrderService;
import org.openmrs.api.VisitService;
import org.openmrs.module.radiology.legacyui.RadiologyConstants;
import org.openmrs.util.OpenmrsUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

/**
 * Properties, mostly configured via GPs for this module.
 */
@Component
public class RadiologyProperties {

    @Autowired
    @Qualifier("adminService")
    private AdministrationService administrationService;

    @Autowired
    private OrderService orderService;

    @Autowired
    private ConceptService conceptService;

    @Autowired
    private EncounterService encounterService;

    @Autowired
    private VisitService visitService;

    /**
     * Return DICOM UID component used to identify the org root.
     * 
     * @return dicom uid org root
     * @throws IllegalStateException if global property for dicom uid org root cannot be found
     * @should return dicom uid org root
     * @should throw illegal state exception if global property for dicom uid org root cannot be found
     */
    public String getDicomUIDOrgRoot() {
        return getGlobalProperty(RadiologyConstants.GP_DICOM_UID_ORG_ROOT, true);
    }

    /**
     * Return DICOM web viewer address.
     * 
     * @return DICOM web viewer address
     * @throws IllegalStateException if global property for dicom web viewer address cannot be found
     * @should return dicom web viewer address
     * @should throw illegal state exception if global property for dicom web viewer address cannot
     *         be found
     */
    public String getDicomWebViewerAddress() {
        return getGlobalProperty(RadiologyConstants.GP_DICOM_WEB_VIEWER_ADDRESS, true);
    }

    /**
     * Return DICOM web viewer port.
     * 
     * @return DICOM web viewer port
     * @throws IllegalStateException if global property for dicom web viewer port cannot be found
     * @should return dicom web viewer port
     * @should throw illegal state exception if global property for dicom web viewer port cannot be
     *         found
     */
    public String getDicomWebViewerPort() {
        return getGlobalProperty(RadiologyConstants.GP_DICOM_WEB_VIEWER_PORT, true);
    }

    /**
     * Return DICOM web viewer base url.
     * 
     * @return DICOM web viewer base url
     * @throws IllegalStateException if global property for dicom web viewer base url cannot be
     *         found
     * @should return dicom web viewer base url
     * @should throw illegal state exception if global property for dicom web viewer base url cannot
     *         be found
     */
    public String getDicomWebViewerBaseUrl() {
        return getGlobalProperty(RadiologyConstants.GP_DICOM_WEB_VIEWER_BASE_URL, true);
    }

    /**
     * Return DICOM web viewer local server name.
     * 
     * @return DICOM web viewer local server name
     * @should return dicom web viewer local server name
     */
    public String getDicomWebViewerLocalServerName() {
        return getGlobalProperty(RadiologyConstants.GP_DICOM_WEB_VIEWER_LOCAL_SERVER_NAME, false);
    }

    /**
     * Get CareSetting for RadiologyOrder's
     * 
     * @return CareSetting for radiology orders
     * @should return radiology care setting
     * @should throw illegal state exception if global property for radiology care setting cannot be
     *         found
     * @should throw illegal state exception if radiology care setting cannot be found
     */
    public CareSetting getRadiologyCareSetting() {
        final CareSetting result = orderService
                .getCareSettingByUuid(getGlobalProperty(RadiologyConstants.GP_RADIOLOGY_CARE_SETTING, true));
        if (result == null) {
            throw new IllegalStateException(
                    "No existing care setting for uuid: " + RadiologyConstants.GP_RADIOLOGY_CARE_SETTING);
        }
        return result;
    }

    /**
     * Test order type for radiology order
     * 
     * @return test order type for radiology order
     * @should return order type for radiology test orders
     * @should throw illegal state exception for non existing radiology test order type
     */
    public OrderType getRadiologyTestOrderType() {
        return orderService
                .getOrderTypeByUuid(getGlobalProperty(RadiologyConstants.GP_RADIOLOGY_TEST_ORDER_TYPE, true));
    }

    /**
     * Get EncounterType for RadiologyOrder's
     * 
     * @return EncounterType for radiology orders
     * @should return encounter type for radiology orders
     * @should throw illegal state exception for non existing radiology encounter type
     */
    public EncounterType getRadiologyOrderEncounterType() {
        return encounterService.getEncounterTypeByUuid(
                getGlobalProperty(RadiologyConstants.GP_RADIOLOGY_ORDER_ENCOUNTER_TYPE, true));
    }

    /**
     * Get EncounterRole for the ordering provider
     * 
     * @return EncounterRole for ordering provider
     * @should return encounter role for ordering provider
     * @should throw illegal state exception for non existing ordering provider encounter role
     */
    public EncounterRole getRadiologyOrderingProviderEncounterRole() {
        return encounterService.getEncounterRoleByUuid(
                getGlobalProperty(RadiologyConstants.GP_RADIOLOGY_ORDERING_PROVIDER_ENCOUNTER_ROLE, true));
    }

    /**
     * Get VisitType for RadiologyOrder's
     * 
     * @return visitType for radiology orders
     * @should return visit type for radiology orders
     * @should throw illegal state exception for non existing radiology visit type
     */
    public VisitType getRadiologyVisitType() {
        return visitService.getVisitTypeByUuid(getGlobalProperty(RadiologyConstants.GP_RADIOLOGY_VISIT_TYPE, true));
    }

    /**
     * Gets the names of the concept classes for the UUIDs from the config
     *
     * @return a string that contains the names of the concept classes seperated by a comma
     * @throws IllegalStateException if global property radiologyConceptClasses is null
     * @throws IllegalStateException if global property radiologyConceptClasses is an empty string
     * @throws IllegalStateException if global property radiologyConceptClasses is badly formatted
     * @throws IllegalStateException if global property radiologyConceptClasses contains a UUID not found among concept
     *         classes
     * @should throw illegal state exception if global property radiology concept classes is null
     * @should throw illegal state exception if global property radiology concept classes is an empty
     *         string
     * @should throw illegal state exception if global property radiology concept classes is badly
     *         formatted
     * @should throw illegal state exception if global property radiology concept classes contains a
     *         UUID not found among concept classes
     * @should return comma separated list of concept class names configured via concept class UUIDs
     *         in global property radiology concept classes
     */
    public String getRadiologyConceptClassNames() {

        String radiologyConceptClassUuidSetting = getGlobalProperty(RadiologyConstants.GP_RADIOLOGY_CONCEPT_CLASSES,
                true);
        radiologyConceptClassUuidSetting = radiologyConceptClassUuidSetting.replace(" ", "");
        if (!radiologyConceptClassUuidSetting.matches("^[0-9a-fA-f,-]+$")) {
            throw new IllegalStateException("Property " + RadiologyConstants.GP_RADIOLOGY_CONCEPT_CLASSES
                    + " needs to be a comma separated list of concept class UUIDs (allowed characters [a-z][A-Z][0-9][,][-][ ])");
        }

        final String[] radiologyConceptClassUuids = radiologyConceptClassUuidSetting.split(",");

        String result = "";
        for (final String radiologyConceptClassUuid : radiologyConceptClassUuids) {
            final ConceptClass fetchedConceptClass = conceptService
                    .getConceptClassByUuid(radiologyConceptClassUuid);
            if (fetchedConceptClass == null) {
                throw new IllegalStateException("Property " + RadiologyConstants.GP_RADIOLOGY_CONCEPT_CLASSES
                        + " contains UUID " + radiologyConceptClassUuid
                        + " which cannot be found as ConceptClass in the database.");
            }
            result = result + fetchedConceptClass.getName() + ",";
        }
        result = result.substring(0, result.length() - 1);
        return result;
    }

    /**
     * Gets the names of the concept classes for the UUIDs from the global property radiologyOrderReasonConceptClasses
     *
     * @return a string that contains the names of the concept classes for radiology order reason seperated by a comma
     * @throws IllegalStateException if global property radiologyOrderReasonConceptClasses is badly formatted
     * @throws IllegalStateException if global property radiologyOrderReasonConceptClasses contains a UUID not found among
     *         concept classes
     * @should throw illegal state exception if global property radiology order reason concept classes is badly formatted
     * @should throw illegal state exception if global property radiology order reason concept classes contains a UUID not
     *         found among concept classes
     * @should return the name of the diagnosis concept class if global property radiology order reason concept classes is
     *         null
     * @should return the name of the diagnosis concept class if global property radiology order reason concept classes is an
     *         empty string
     * @should return an empty string if global property radiology order reason concept classes is null or an empty string
     *         and no diagnosis concept class is present
     * @should return comma separated list of concept class names configured via concept class UUIDs in global property
     *         radiology order reason concept classes
     */
    public String getRadiologyOrderReasonConceptClassNames() {

        String radiologyReasonConceptClassUuidSetting = getGlobalProperty(
                RadiologyConstants.GP_RADIOLOGY_ORDER_REASON_CONCEPT_CLASSES, false);
        if (StringUtils.isBlank(radiologyReasonConceptClassUuidSetting)) {
            final ConceptClass diagnosisConceptClass = conceptService.getConceptClassByName("Diagnosis");
            if (diagnosisConceptClass == null) {
                return "";
            }
            return diagnosisConceptClass.getName();
        }

        radiologyReasonConceptClassUuidSetting = radiologyReasonConceptClassUuidSetting.replace(" ", "");
        if (!radiologyReasonConceptClassUuidSetting.matches("^[0-9a-fA-f,-]*$")) {
            throw new IllegalStateException("Property "
                    + RadiologyConstants.GP_RADIOLOGY_ORDER_REASON_CONCEPT_CLASSES
                    + " needs to be a comma separated list of concept class UUIDs (allowed characters [a-z][A-Z][0-9][,][-][ ])");
        }
        final String[] radiologyReasonConceptClassUuids = radiologyReasonConceptClassUuidSetting.split(",");

        String result = "";
        for (final String radiologyReasonConceptClassUuid : radiologyReasonConceptClassUuids) {
            final ConceptClass fetchedConceptClass = conceptService
                    .getConceptClassByUuid(radiologyReasonConceptClassUuid);
            if (fetchedConceptClass == null) {
                throw new IllegalStateException(
                        "Property " + RadiologyConstants.GP_RADIOLOGY_ORDER_REASON_CONCEPT_CLASSES
                                + " contains UUID " + radiologyReasonConceptClassUuid
                                + " which cannot be found as ConceptClass in the database.");
            }
            result = result + fetchedConceptClass.getName() + ",";
        }
        result = result.substring(0, result.length() - 1);
        return result;
    }

    /**
     * Gets a global property by its name.
     * 
     * @param globalPropertyName the name of the requested global property
     * @param required indicates if the global property must be configured
     * @return value of global property for given name
     * @throws IllegalStateException if global property cannot be found
     * @should return global property given valid global property name
     * @should return null given non required and non configured global property
     * @should throw illegal state exception given required non configured global property
     */
    private String getGlobalProperty(String globalPropertyName, boolean required) {
        final String result = administrationService.getGlobalProperty(globalPropertyName);
        if (required && StringUtils.isBlank(result)) {
            throw new IllegalStateException("Configuration required: " + globalPropertyName);
        }
        return result;
    }

    /**
     * Gets folder to store {@code MRRT} templates.
     * 
     * @return templates folder
     * @throws IllegalStateException if global property cannot be found
     * @should create a directory under the openmrs application data directory if GP value is relative
     * @should creates a directory at GP value if it is an absolute path
     * @should throw illegal state exception if global property cannot be found
     */
    public File getReportTemplateHome() {

        Path templatesPath = Paths.get(getGlobalProperty(RadiologyConstants.GP_MRRT_REPORT_TEMPLATE_DIR, true));

        if (!templatesPath.isAbsolute()) {
            templatesPath = Paths.get(OpenmrsUtil.getApplicationDataDirectory(), templatesPath.toString());
        }
        if (!templatesPath.toFile().exists()) {
            templatesPath.toFile().mkdirs();
        }

        return templatesPath.toFile();
    }
}