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(); } } } } }