Split out statistics tracking into separate classes
[controller.git] / opendaylight / md-sal / statistics-manager / src / main / java / org / opendaylight / controller / md / statistics / manager / AbstractStatsTracker.java
1 /*
2  * Copyright IBM Corporation, 2013.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.controller.md.statistics.manager;
9
10 import java.util.HashMap;
11 import java.util.Iterator;
12 import java.util.List;
13 import java.util.Map;
14 import java.util.Map.Entry;
15
16 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
17 import org.opendaylight.controller.sal.binding.api.data.DataProviderService;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
19 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
20 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
21
22 import com.google.common.base.Preconditions;
23
24 abstract class AbstractStatsTracker<I, K> {
25     private final Map<K, Long> trackedItems = new HashMap<>();
26     private final InstanceIdentifier<Node> nodeIdentifier;
27     private final DataProviderService dps;
28     private final long lifetimeNanos;
29
30     protected AbstractStatsTracker(final InstanceIdentifier<Node> nodeIdentifier, final DataProviderService dps, long lifetimeNanos) {
31         this.nodeIdentifier = Preconditions.checkNotNull(nodeIdentifier);
32         this.dps = Preconditions.checkNotNull(dps);
33         this.lifetimeNanos = lifetimeNanos;
34     }
35
36     protected final InstanceIdentifierBuilder<Node> getNodeIdentifierBuilder() {
37         return InstanceIdentifier.builder(nodeIdentifier);
38     }
39
40     final synchronized void updateStats(List<I> list) {
41         final Long expiryTime = System.nanoTime() + lifetimeNanos;
42         final DataModificationTransaction trans = dps.beginTransaction();
43
44         for (final I item : list) {
45             trackedItems.put(updateSingleStat(trans, item), expiryTime);
46         }
47
48         trans.commit();
49     }
50
51
52     final synchronized void cleanup(final DataModificationTransaction trans, long now) {
53         for (Iterator<Entry<K, Long>> it = trackedItems.entrySet().iterator();it.hasNext();){
54             Entry<K, Long> e = it.next();
55             if (now > e.getValue()) {
56                 cleanupSingleStat(trans, e.getKey());
57                 it.remove();
58             }
59         }
60     }
61
62     protected abstract void cleanupSingleStat(DataModificationTransaction trans, K item);
63     protected abstract K updateSingleStat(DataModificationTransaction trans, I item);
64 }