2 * Copyright IBM Corporation, 2013. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.controller.md.statistics.manager;
10 import java.util.HashMap;
11 import java.util.Iterator;
12 import java.util.List;
14 import java.util.Map.Entry;
15 import java.util.concurrent.Future;
17 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionAware;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionId;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
22 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
23 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
24 import org.opendaylight.yangtools.yang.common.RpcResult;
26 import com.google.common.base.Function;
27 import com.google.common.base.Preconditions;
28 import com.google.common.util.concurrent.Futures;
29 import com.google.common.util.concurrent.JdkFutureAdapters;
30 import com.google.common.util.concurrent.ListenableFuture;
32 abstract class AbstractStatsTracker<I, K> {
33 private static final Function<RpcResult<? extends TransactionAware>, TransactionId> FUNCTION =
34 new Function<RpcResult<? extends TransactionAware>, TransactionId>() {
36 public TransactionId apply(RpcResult<? extends TransactionAware> input) {
37 return input.getResult().getTransactionId();
41 private final Map<K, Long> trackedItems = new HashMap<>();
42 private final FlowCapableContext context;
43 private final long lifetimeNanos;
45 protected AbstractStatsTracker(final FlowCapableContext context, final long lifetimeNanos) {
46 this.context = Preconditions.checkNotNull(context);
47 this.lifetimeNanos = lifetimeNanos;
50 protected final InstanceIdentifierBuilder<Node> getNodeIdentifierBuilder() {
51 return InstanceIdentifier.builder(getNodeIdentifier());
54 protected final NodeRef getNodeRef() {
55 return context.getNodeRef();
58 protected final InstanceIdentifier<Node> getNodeIdentifier() {
59 return context.getNodeIdentifier();
62 protected static final <T extends TransactionAware> ListenableFuture<TransactionId> requestHelper(Future<RpcResult<T>> future) {
63 return Futures.transform(JdkFutureAdapters.listenInPoolThread(future), FUNCTION);
66 protected abstract void cleanupSingleStat(DataModificationTransaction trans, K item);
67 protected abstract K updateSingleStat(DataModificationTransaction trans, I item);
69 public final synchronized void updateStats(List<I> list) {
70 final Long expiryTime = System.nanoTime() + lifetimeNanos;
71 final DataModificationTransaction trans = context.startDataModification();
73 for (final I item : list) {
74 trackedItems.put(updateSingleStat(trans, item), expiryTime);
80 public final synchronized void cleanup(final DataModificationTransaction trans, long now) {
81 for (Iterator<Entry<K, Long>> it = trackedItems.entrySet().iterator();it.hasNext();){
82 Entry<K, Long> e = it.next();
83 if (now > e.getValue()) {
84 cleanupSingleStat(trans, e.getKey());