/*
* Copyright (c) 2014 Cisco Systems, Inc. and others. 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
*/
package org.opendaylight.openflowplugin.applications.topology.lldp;
import com.google.common.annotations.VisibleForTesting;
import java.util.Date;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ConcurrentHashMap;
import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.LinkDiscovered;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.LinkRemovedBuilder;
public class LLDPLinkAger implements AutoCloseable {
private final long linkExpirationTime;
private final Map<LinkDiscovered, Date> linkToDate;
private final Timer timer;
private final NotificationProviderService notificationService;
/**
* default ctor - start timer
*/
public LLDPLinkAger(final long lldpInterval, final long linkExpirationTime,
final NotificationProviderService notificationService) {
this.linkExpirationTime = linkExpirationTime;
this.notificationService = notificationService;
linkToDate = new ConcurrentHashMap<>();
timer = new Timer();
timer.schedule(new LLDPAgingTask(), 0, lldpInterval);
}
public void put(LinkDiscovered link) {
Date expires = new Date();
expires.setTime(expires.getTime() + linkExpirationTime);
linkToDate.put(link, expires);
}
@Override
public void close() {
timer.cancel();
linkToDate.clear();
}
private class LLDPAgingTask extends TimerTask {
@Override
public void run() {
for (Entry<LinkDiscovered,Date> entry : linkToDate.entrySet()) {
LinkDiscovered link = entry.getKey();
Date expires = entry.getValue();
Date now = new Date();
if(now.after(expires)) {
if (notificationService != null) {
LinkRemovedBuilder lrb = new LinkRemovedBuilder(link);
notificationService.publish(lrb.build());
linkToDate.remove(link);
}
}
}
}
}
@VisibleForTesting
public boolean isLinkToDateEmpty() {
return linkToDate.isEmpty();
}
}