package com.owera.xaps.tr069.background;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.owera.common.log.Logger;
import com.owera.common.scheduler.TaskDefaultImpl;
import com.owera.xaps.base.db.DBAccess;
import com.owera.xaps.dbi.DBI;
import com.owera.xaps.dbi.SyslogConstants;
import com.owera.xaps.dbi.Unit;
import com.owera.xaps.dbi.XAPS;
import com.owera.xaps.dbi.XAPSUnit;
public class ScheduledKickTask extends TaskDefaultImpl {
public static class UnitKick {
private Unit unit;
private long initiatedTms;
private int kickCount;
private long nextTms;
public UnitKick(Unit u) {
this.unit = u;
this.initiatedTms = System.currentTimeMillis();
this.kickCount = 0;
this.nextTms = initiatedTms + 5000;
}
public Unit getUnit() {
return unit;
}
public void setUnit(Unit unit) {
this.unit = unit;
}
public long getInitiatedTms() {
return initiatedTms;
}
public void setInitiatedTms(long initiatedTms) {
this.initiatedTms = initiatedTms;
}
public int getKickCount() {
return kickCount;
}
public void setKickCount(int kickCount) {
this.kickCount = kickCount;
}
public long getNextTms() {
return nextTms;
}
public void setNextTms(long nextTms) {
this.nextTms = nextTms;
}
}
private static Logger logger = new Logger();
private DBI dbi;
private static Object syncMonitor = new Object();
private static List<UnitKick> kickList = new ArrayList<ScheduledKickTask.UnitKick>();
public ScheduledKickTask(String taskName, DBI dbi) {
super(taskName);
this.dbi = dbi;
}
@Override
public void runImpl() throws Throwable {
XAPS xaps = dbi.getXaps();
synchronized (syncMonitor) {
Iterator<UnitKick> listIterator = kickList.iterator();
long now = System.currentTimeMillis();
while (listIterator.hasNext()) {
UnitKick uk = listIterator.next();
if (uk.getNextTms() > now)
continue;
if (uk.getKickCount() > 10) {
logger.debug("Removed UnitKick from list, have kicked 10 times (Unitid: " + uk.getUnit().getId() + ")");
listIterator.remove();
continue;
}
Unit unit = uk.getUnit();
// unit.toWriteQueue(SystemParameters.PROVISIONING_MODE, ProvisioningMode.KICK.toString());
// unit.toWriteQueue(SystemParameters.PROVISIONING_STATE, ProvisioningState.LOAD.toString());
XAPSUnit xapsUnit = DBAccess.getXAPSUnit(xaps);
xapsUnit.addOrChangeQueuedUnitParameters(unit);
dbi.publishKick(unit, SyslogConstants.FACILITY_STUN);
uk.setNextTms(now + 30000);
uk.setKickCount(uk.getKickCount() + 1);
logger.debug("Initiated a kick to prompt the device to connect again (Unitid: " + uk.getUnit().getId() + ")");
}
}
}
@Override
public Logger getLogger() {
return logger;
}
public static void addUnit(Unit u) {
removeUnit(u.getId());
synchronized (syncMonitor) {
kickList.add(new UnitKick(u));
logger.debug("Add UnitKick to list (Unitid: " + u.getId() + ")");
}
}
public static void removeUnit(String unitId) {
synchronized (syncMonitor) {
Iterator<UnitKick> listIterator = kickList.iterator();
while (listIterator.hasNext()) {
UnitKick uk = listIterator.next();
if (uk.getUnit().getId().equals(unitId)) {
logger.debug("Removed UnitKick from list (Unitid: " + unitId + ")");
listIterator.remove();
}
}
}
}
}