/** * The contents of this file are subject to the OpenMRS Public License * Version 1.0 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://license.openmrs.org * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the * License for the specific language governing rights and limitations * under the License. * * Copyright (C) OpenMRS, LLC. All Rights Reserved. */ package org.openmrs.hl7; import java.util.HashMap; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.openmrs.api.APIException; import org.openmrs.api.context.Context; import org.openmrs.api.context.UserContext; /** * Separate thread to move the hl7 in archives from the database tables to the filesystem. It is * highly recommended to start this thread by calling "startHl7ArchiveMigration(UserContext)" method * in the service layer as opposed to calling the thread's start() method to ensure the thread is * started after making all the necessary checks. * * @see {@link HL7Service#startHl7ArchiveMigration()} */ public class Hl7InArchivesMigrateThread extends Thread { private static final Log log = LogFactory.getLog(Hl7InArchivesMigrateThread.class); /** * Map holds data about the progress of the transfer process, that is numberTransferred and * numberOfFailedTransfers */ private static Map<String, Integer> progressStatusMap; /** * number of days to keep when migrating */ private static Integer daysKept = 365; /** * Whether or not activity should continue with this thread */ private static boolean active = false; /** * User Context to be used for authentication and privilege checks */ private UserContext userContext; /** * Flag to keep track of the status of the migration process */ private static Status transferStatus = Status.NONE; /** * The different states this thread can be in at a given point during migration */ public enum Status { RUNNING, STOPPED, COMPLETED, ERROR, NONE } /** * Constructor to initialize variables */ public Hl7InArchivesMigrateThread() { this.userContext = Context.getUserContext(); progressStatusMap = new HashMap<String, Integer>(); progressStatusMap.put(HL7Constants.NUMBER_TRANSFERRED_KEY, 0); progressStatusMap.put(HL7Constants.NUMBER_OF_FAILED_TRANSFERS_KEY, 0); } /** * @return the daysKept */ public static Integer getDaysKept() { return daysKept; } /** * @param daysKept the daysKept to set */ public static void setDaysKept(Integer daysKept) { Hl7InArchivesMigrateThread.daysKept = daysKept; } /** * @return the active */ public static boolean isActive() { return active; } /** * @param active the active to set */ public static void setActive(boolean active) { Hl7InArchivesMigrateThread.active = active; } /** * @see java.lang.Runnable#run() */ @Override public void run() { Context.openSession(); Context.setUserContext(userContext); transferStatus = Status.RUNNING; while (isActive() && transferStatus == Status.RUNNING) { try { // migrate the archives if (isActive()) Context.getHL7Service().migrateHl7InArchivesToFileSystem(progressStatusMap); //if transfer is done when user didn't just stop it if (transferStatus != Status.STOPPED) transferStatus = Status.COMPLETED; } catch (APIException api) { // log this as a debug, because we want to swallow minor errors log.debug("Unable to migrate HL7 archive", api); try { Thread.sleep(HL7Constants.THREAD_SLEEP_PERIOD); } catch (InterruptedException e) { log.warn("Hl7 in archive migration thread has been abnormally interrupted", e); } } catch (Exception e) { transferStatus = Status.ERROR; log.warn("Some error occurred while migrating hl7 archives", e); } } // clean up Context.closeSession(); setActive(false); } /** * convenience method to set transfer status and active flag to stop migration */ public static void stopMigration() { transferStatus = Status.STOPPED; setActive(false); } /** * @return the transferStatus */ public static Status getTransferStatus() { return transferStatus; } /** * @return the numberTransferred at a given time during migration */ public static Integer getNumberTransferred() { if (progressStatusMap == null) return 0; return progressStatusMap.get(HL7Constants.NUMBER_TRANSFERRED_KEY); } /** * Gets the number of failed transfers during migration, this could be that the system couldn't * write them to the file system or couldn't be deleted from the database. * * @return the numberOfFailedTransfers */ public static Integer getNumberOfFailedTransfers() { if (progressStatusMap == null) return 0; return progressStatusMap.get(HL7Constants.NUMBER_OF_FAILED_TRANSFERS_KEY); } /** * @return the userContext */ public UserContext getUserContext() { return this.userContext; } }