/*******************************************************************************
* Copyright (c) 2007-2015, D. Lutz and Elexis.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* D. Lutz - initial API and implementation
* Gerry Weirich - adapted for 2.1
* Niklaus Giger - small improvements, split into 20 classes
*
* Sponsors:
* Dr. Peter Schönbucher, Luzern
******************************************************************************/
package org.iatrix.util;
import java.util.concurrent.CopyOnWriteArrayList;
import org.iatrix.Iatrix;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.elexis.core.data.activator.CoreHub;
import ch.elexis.core.data.events.Heartbeat.HeartListener;
import ch.elexis.core.ui.UiDesk;
/**
* A small wrapper around the Elexis HeartListener which may be globally disabled via the
* org.iatrix preferences.
*
* @author niklaus
*
*/
public class Heartbeat implements HeartListener {
private static Logger log = LoggerFactory.getLogger(Heartbeat.class);
private boolean heartbeatActive = false;
private boolean heartbeatProblemEnabled = true;
private CopyOnWriteArrayList<IatrixHeartListener> iatrixListener;
private static Heartbeat theHeartbeat;
private Heartbeat(){
iatrixListener = new CopyOnWriteArrayList<IatrixHeartListener>();
}
/**
* Das Singleton holen
*
* @return den Heartbeat der Anwendung
*/
public static Heartbeat getInstance(){
if (theHeartbeat == null) {
theHeartbeat = new Heartbeat();
}
return theHeartbeat;
}
public void enableListener(boolean mode){
if (mode) {
CoreHub.heart.addListener(this);
} else {
CoreHub.heart.removeListener(this);
}
}
/**
* Allow KTableCellEditor to temporarily suppress heartbeat
*
* @param value
*/
public void setHeartbeatProblemEnabled(boolean value){
log.debug("setHeartbeatProblemEnabled" + heartbeatProblemEnabled);
heartbeatProblemEnabled = value;
}
/**
* Trigger the hearbeat Should only be called from one place in JournalView
*/
@Override
public void heartbeat(){
// don't run while another heartbeat is currently processed
if (heartbeatActive) {
return;
}
heartbeatActive = true;
UiDesk.getDisplay().asyncExec(new Runnable() {
@Override
public void run(){
log.debug("run for " + iatrixListener.size() + " listeners");
notifyListeners();
}
});
heartbeatActive = false;
}
/**
* Return the auto-save time period interval, as configured in CoreHub.userCfg
*
* @return the calculated period interval, or 1 if there are invalid configuration values, or 0
* if autos-save is disabled
*/
public int getKonsTextSaverPeriod(){
int timePeriod =
CoreHub.userCfg.get(Iatrix.CFG_AUTO_SAVE_PERIOD, Iatrix.CFG_AUTO_SAVE_PERIOD_DEFAULT);
if (timePeriod == 0) {
// no auto-save
return 0;
}
log.debug("TimePeriod: " + timePeriod);
int heartbeatInterval =
CoreHub.localCfg.get(ch.elexis.core.constants.Preferences.ABL_HEARTRATE, 30);
if (heartbeatInterval > 0 && timePeriod >= heartbeatInterval) {
int period = timePeriod / heartbeatInterval;
if (period > 0) {
return period;
} else {
// shouldn't occur...
return 1;
}
} else {
// shouldn't occur...
return 1;
}
}
private void notifyListeners(){
for (IatrixHeartListener name : iatrixListener) {
name.heartbeat();
}
}
public void addListener(IatrixHeartListener newListener){
iatrixListener.add(newListener);
}
public interface IatrixHeartListener {
/**
* Die Methode heartbeat wird in "einigermassen" regelmässigen (aber nicht garantiert immer
* genau identischen) Abständen aufgerufen
*
*/
public void heartbeat();
}
}