/**
* 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.util.databasechange;
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.openmrs.util.DatabaseUtil;
import org.openmrs.util.UpgradeUtil;
import liquibase.database.Database;
import liquibase.database.jvm.JdbcConnection;
import liquibase.exception.CustomPreconditionErrorException;
import liquibase.exception.CustomPreconditionFailedException;
import liquibase.precondition.CustomPrecondition;
/**
* This changesets finds all free text drug order dose units and frequencies and checks that they
* are all mapped to concepts ids via the OpenmrsConstants#GP_ORDER_ENTRY_UNITS_TO_CONCEPTS_MAPPINGS
* global property prior to upgrading to version 1.10. It MUST be the first 1.10.x changeset to be
* executed
*/
public class CheckDrugOrderUnitAndFrequencyTextNotMappedToConcepts implements CustomPrecondition {
@Override
public void check(Database database) throws CustomPreconditionFailedException, CustomPreconditionErrorException {
JdbcConnection connection = (JdbcConnection) database.getConnection();
try {
Set<String> doseUnits = DatabaseUtil.getUniqueNonNullColumnValues("units", "drug_order", String.class,
connection.getUnderlyingConnection());
Set<String> unmappedDoseUnits = getUnMappedText(doseUnits, connection);
if (!unmappedDoseUnits.isEmpty()) {
throw new CustomPreconditionFailedException(
"Upgrade failed because of the following unmapped drug order dose units that were found: ["
+ StringUtils.join(unmappedDoseUnits, ", ")
+ "]. Please make sure you have mapped all free text dose units and "
+ "frequencies via the global property named orderEntry.unitsToConceptsMappings"
+ " or use 1.10 upgrade helper module to map them");
}
Set<String> frequencies = DatabaseUtil.getUniqueNonNullColumnValues("frequency", "drug_order", String.class,
connection.getUnderlyingConnection());
Set<String> unmappedFrequencies = getUnMappedText(frequencies, connection);
if (!unmappedFrequencies.isEmpty()) {
throw new CustomPreconditionFailedException(
"Upgrade failed because of the following unmapped drug order frequencies that were found: ["
+ StringUtils.join(unmappedFrequencies, ", ")
+ "]. Please make sure you have mapped all free text dose units and "
+ "frequencies via the global property named orderEntry.unitsToConceptsMappings"
+ " or use 1.10 upgrade helper module to map them");
}
}
catch (Exception e) {
throw new CustomPreconditionErrorException("An error occurred while checking for unmapped free text drug "
+ "order dose units and frequencies", e);
}
}
private Set<String> getUnMappedText(Set<String> textList, JdbcConnection connection) {
Set<String> unmappedText = new HashSet<String>(textList.size());
for (String text : textList) {
if (StringUtils.isBlank(text) || UpgradeUtil.getConceptIdForUnits(text) != null) {
continue;
}
unmappedText.add(text);
}
return unmappedText;
}
}