package net.floodlightcontroller.debugcounter;
import java.util.Collection;
import java.util.Date;
import java.util.concurrent.atomic.AtomicLong;
import javax.annotation.Nonnull;
import net.floodlightcontroller.debugcounter.IDebugCounterService.MetaData;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
class DebugCounterImpl implements IDebugCounter {
private final String moduleName;
private final String counterHierarchy;
private final String description;
private final ImmutableSet<IDebugCounterService.MetaData> metaData;
private final AtomicLong value = new AtomicLong();
private final Date lastModified = new Date(); // should return long ms to ensure immutability
DebugCounterImpl(@Nonnull String moduleName,
@Nonnull String counterHierarchy,
@Nonnull String description,
@Nonnull Collection<MetaData> metaData) {
this.moduleName = moduleName;
this.counterHierarchy = counterHierarchy;
this.description = description;
this.metaData = Sets.immutableEnumSet(metaData);
this.lastModified.setTime(System.currentTimeMillis());
}
@Nonnull
String getModuleName() {
return moduleName;
}
@Nonnull
String getCounterHierarchy() {
return counterHierarchy;
}
@Nonnull
String getDescription() {
return description;
}
@Nonnull
ImmutableSet<IDebugCounterService.MetaData> getMetaData() {
return metaData;
}
@Override
public void reset() {
value.set(0);
lastModified.setTime(System.currentTimeMillis());
}
@Override
public void increment() {
value.incrementAndGet();
lastModified.setTime(System.currentTimeMillis());
}
@Override
public void add(long increment) {
if (increment < 0) {
throw new IllegalArgumentException("increment must be > 0. Was "
+ increment);
}
value.addAndGet(increment);
lastModified.setTime(System.currentTimeMillis());
}
@Override
public long getCounterValue() {
return value.get();
}
@Override
public long getLastModified() {
return lastModified.getTime();
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime
* result
+ ((counterHierarchy == null) ? 0
: counterHierarchy.hashCode());
result = prime * result
+ ((description == null) ? 0 : description.hashCode());
result = prime * result
+ ((metaData == null) ? 0 : metaData.hashCode());
result = prime * result
+ ((moduleName == null) ? 0 : moduleName.hashCode());
result = prime * result + ((value == null) ? 0 : value.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
DebugCounterImpl other = (DebugCounterImpl) obj;
if (counterHierarchy == null) {
if (other.counterHierarchy != null) return false;
} else if (!counterHierarchy.equals(other.counterHierarchy))
return false;
if (description == null) {
if (other.description != null) return false;
} else if (!description.equals(other.description)) return false;
if (metaData == null) {
if (other.metaData != null) return false;
} else if (!metaData.equals(other.metaData)) return false;
if (moduleName == null) {
if (other.moduleName != null) return false;
} else if (!moduleName.equals(other.moduleName)) return false;
if (value == null) {
if (other.value != null) return false;
} else if (value.get() != other.value.get()) return false;
return true;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("[");
builder.append(moduleName);
builder.append(" ");
builder.append(counterHierarchy);
builder.append(", description=");
builder.append(description);
builder.append(", metaData=");
builder.append(metaData);
builder.append(", value=");
builder.append(value);
builder.append("]");
return builder.toString();
}
}