org.openmrs.SimpleDosingInstructions.java Source code

Java tutorial

Introduction

Here is the source code for org.openmrs.SimpleDosingInstructions.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;

import static org.apache.commons.lang3.time.DateUtils.addSeconds;
import java.util.Date;
import java.util.Locale;

import org.openmrs.api.APIException;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;

/**
 * @since 1.10
 */
public class SimpleDosingInstructions implements DosingInstructions {

    private Double dose;

    private Concept doseUnits;

    private Concept route;

    private OrderFrequency frequency;

    private Integer duration;

    private Concept durationUnits;

    private Boolean asNeeded;

    private String asNeededCondition;

    private String administrationInstructions;

    /**
     * @see DosingInstructions#getDosingInstructionsAsString(java.util.Locale)
     */
    @Override
    public String getDosingInstructionsAsString(Locale locale) {
        StringBuilder dosingInstructions = new StringBuilder();
        dosingInstructions.append(this.dose);
        dosingInstructions.append(" ");
        dosingInstructions.append(this.doseUnits.getName(locale).getName());
        dosingInstructions.append(" ");
        dosingInstructions.append(this.route.getName(locale).getName());
        dosingInstructions.append(" ");
        dosingInstructions.append(this.frequency);
        if (duration != null) {
            dosingInstructions.append(" ");
            dosingInstructions.append(this.duration);
            dosingInstructions.append(" ");
            dosingInstructions.append(this.durationUnits.getName(locale).getName());
        }
        if (this.asNeeded) {
            dosingInstructions.append(" ");
            dosingInstructions.append("PRN");
            if (this.asNeededCondition != null) {
                dosingInstructions.append(" ");
                dosingInstructions.append(this.asNeededCondition);
            }
        }
        if (this.administrationInstructions != null) {
            dosingInstructions.append(" ");
            dosingInstructions.append(this.administrationInstructions);
        }
        return dosingInstructions.toString();
    }

    /**
     * @see DosingInstructions#setDosingInstructions(DrugOrder)
     */
    @Override
    public void setDosingInstructions(DrugOrder order) {
        order.setDosingType(this.getClass());
        order.setDose(this.dose);
        order.setDoseUnits(this.doseUnits);
        order.setRoute(this.route);
        order.setFrequency(this.frequency);
        order.setDuration(this.duration);
        order.setDurationUnits(this.durationUnits);
        order.setAsNeeded(this.asNeeded);
        order.setAsNeededCondition(this.asNeededCondition);
        order.setDosingInstructions(this.administrationInstructions);
    }

    /**
     * @see DosingInstructions#getDosingInstructions(DrugOrder)
     */
    @Override
    public DosingInstructions getDosingInstructions(DrugOrder order) {
        if (!order.getDosingType().equals(this.getClass())) {
            throw new APIException("DrugOrder.error.dosingTypeIsMismatched",
                    new Object[] { this.getClass().getName(), order.getDosingType() });
        }
        SimpleDosingInstructions simpleDosingInstructions = new SimpleDosingInstructions();
        simpleDosingInstructions.setDose(order.getDose());
        simpleDosingInstructions.setDoseUnits(order.getDoseUnits());
        simpleDosingInstructions.setRoute(order.getRoute());
        simpleDosingInstructions.setFrequency(order.getFrequency());
        simpleDosingInstructions.setDuration(order.getDuration());
        simpleDosingInstructions.setDurationUnits(order.getDurationUnits());
        simpleDosingInstructions.setAsNeeded(order.getAsNeeded());
        simpleDosingInstructions.setAsNeededCondition(order.getAsNeededCondition());
        simpleDosingInstructions.setAdministrationInstructions(order.getDosingInstructions());
        return simpleDosingInstructions;
    }

    /**
     * @see DosingInstructions#validate(DrugOrder, org.springframework.validation.Errors)
     * @param order
     * @param errors
     * @should reject a duration unit with a mapping of an invalid type
     */
    @Override
    public void validate(DrugOrder order, Errors errors) {
        ValidationUtils.rejectIfEmpty(errors, "dose", "DrugOrder.error.doseIsNullForDosingTypeSimple");
        ValidationUtils.rejectIfEmpty(errors, "doseUnits", "DrugOrder.error.doseUnitsIsNullForDosingTypeSimple");
        ValidationUtils.rejectIfEmpty(errors, "route", "DrugOrder.error.routeIsNullForDosingTypeSimple");
        ValidationUtils.rejectIfEmpty(errors, "frequency", "DrugOrder.error.frequencyIsNullForDosingTypeSimple");
        if (order.getAutoExpireDate() == null && order.getDurationUnits() != null
                && Duration.getCode(order.getDurationUnits()) == null) {
            errors.rejectValue("durationUnits", "DrugOrder.error.durationUnitsNotMappedToSnomedCtDurationCode");
        }
    }

    /**
     * @see DosingInstructions#getAutoExpireDate(DrugOrder)
     */
    @Override
    public Date getAutoExpireDate(DrugOrder drugOrder) {
        if (drugOrder.getDuration() == null || drugOrder.getDurationUnits() == null) {
            return null;
        }
        if (drugOrder.getNumRefills() != null && drugOrder.getNumRefills() > 0) {
            return null;
        }
        String durationCode = Duration.getCode(drugOrder.getDurationUnits());
        if (durationCode == null) {
            return null;
        }
        Duration duration = new Duration(drugOrder.getDuration(), durationCode);
        return aMomentBefore(duration.addToDate(drugOrder.getEffectiveStartDate(), drugOrder.getFrequency()));
    }

    public Double getDose() {
        return dose;
    }

    public void setDose(Double dose) {
        this.dose = dose;
    }

    public Concept getDoseUnits() {
        return doseUnits;
    }

    public void setDoseUnits(Concept doseUnits) {
        this.doseUnits = doseUnits;
    }

    public Concept getRoute() {
        return route;
    }

    public void setRoute(Concept route) {
        this.route = route;
    }

    public OrderFrequency getFrequency() {
        return frequency;
    }

    public void setFrequency(OrderFrequency frequency) {
        this.frequency = frequency;
    }

    public Integer getDuration() {
        return duration;
    }

    public void setDuration(Integer duration) {
        this.duration = duration;
    }

    public Concept getDurationUnits() {
        return durationUnits;
    }

    public void setDurationUnits(Concept durationUnits) {
        this.durationUnits = durationUnits;
    }

    public Boolean getAsNeeded() {
        return asNeeded;
    }

    public void setAsNeeded(Boolean asNeeded) {
        this.asNeeded = asNeeded;
    }

    public String getAsNeededCondition() {
        return asNeededCondition;
    }

    public void setAsNeededCondition(String asNeededCondition) {
        this.asNeededCondition = asNeededCondition;
    }

    public String getAdministrationInstructions() {
        return administrationInstructions;
    }

    public void setAdministrationInstructions(String administrationInstructions) {
        this.administrationInstructions = administrationInstructions;
    }

    private Date aMomentBefore(Date date) {
        return addSeconds(date, -1);
    }

}