blob: e353516e01ff0cb1e0a010b83994f6411333d2bf [file] [log] [blame]
/*-
* Copyright (C) 2002, 2018, Oracle and/or its affiliates. All rights reserved.
*
* This file was distributed by Oracle as part of a version of Oracle Berkeley
* DB Java Edition made available at:
*
* http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index.html
*
* Please see the LICENSE file included in the top-level directory of the
* appropriate version of Oracle Berkeley DB Java Edition for a copy of the
* license and additional information.
*/
package com.sleepycat.je.utilint;
import java.util.Iterator;
import java.util.Map.Entry;
import com.sleepycat.je.utilint.StatDefinition.StatType;
/**
* A JE stat that maintains a map of {@link LongAvg} values which can be looked
* up with a String key, and that returns results as a formatted string.
*/
public class LongAvgMapStat extends MapStat<Long, LongAvg> {
private static final long serialVersionUID = 1L;
/**
* Creates an instance of this class. The definition type must be
* INCREMENTAL.
*
* @param group the owning group
* @param definition the associated definition
* @throws IllegalArgumentException if the stat definition type is not
* INCREMENTAL
*/
public LongAvgMapStat(StatGroup group, StatDefinition definition) {
super(group, definition);
if (definition.getType() != StatType.INCREMENTAL) {
throw new IllegalArgumentException(
"The stat type must be INCREMENTAL, found: " +
definition.getType());
}
}
private LongAvgMapStat(LongAvgMapStat other) {
super(other);
}
/**
* Creates, stores, and returns a new stat for the specified key.
*
* @param key the key
* @return the new stat
*/
public synchronized LongAvg createStat(String key) {
assert key != null;
final LongAvg stat = new LongAvg();
statMap.put(key, stat);
return stat;
}
@Override
public LongAvgMapStat copy() {
return new LongAvgMapStat(this);
}
/**
* {@inheritDoc}
*
* @throws IllegalArgumentException if argument is not a LongAvgMapStat
*/
@Override
public LongAvgMapStat computeInterval(Stat<String> base) {
if (!(base instanceof LongAvgMapStat)) {
throw new IllegalArgumentException(
"Other stat must be a LongAvgMapStat, found: " + base);
}
final LongAvgMapStat other = (LongAvgMapStat) base.copy();
final LongAvgMapStat result = copy();
synchronized (result) {
synchronized (other) {
for (Iterator<Entry<String, LongAvg>> i =
result.statMap.entrySet().iterator();
i.hasNext(); ) {
final Entry<String, LongAvg> e = i.next();
final String key = e.getKey();
final LongAvg stat = e.getValue();
final LongAvg otherStat = other.statMap.get(key);
if (otherStat != null) {
stat.updateInterval(otherStat);
} else {
i.remove();
}
}
}
}
return result;
}
@Override
public synchronized void negate() {
for (final LongAvg avg : statMap.values()) {
avg.negate();
}
}
}