package com.ibm.nmon.analysis;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.ibm.nmon.data.DataType;
/**
* <p>
* Track a set of data to analyze. Fields in the set are identified by key, as in
* {@link com.ibm.nmon.data.DataType#getKey(String) DataType.getKey()}. Data added to or removed
* from the set will fire {@link AnalysisSetListener} events.
* </p>
*
* <p>
* This class does not actually analyze or store any data. It is meant to be a holder for a set of
* data that is being analyzed. To retrieve statistics, this class should be used in conjunction
* with an {@link AnalysisRecord}, which actually contains the analyzed data.
* </p>
*/
public final class AnalysisSet {
// map DataType.getKey() values to the DataType and the field; these will be used in tandem
private final Map<String, DataType> types = new java.util.HashMap<String, DataType>();
private final Map<String, String> fields = new java.util.HashMap<String, String>();
private final List<AnalysisSetListener> listeners = new java.util.concurrent.CopyOnWriteArrayList<AnalysisSetListener>();
public void addData(DataType type) {
Set<String> added = new java.util.HashSet<String>(type.getFieldCount());
for (String field : type.getFields()) {
String key = type.getKey(field);
if (types.put(key, type) == null) {
fields.put(key, field);
added.add(key);
}
}
if (added.size() == type.getFieldCount()) {
for (AnalysisSetListener listener : listeners) {
listener.analysisAdded(type);
}
}
else {
for (String key : added) {
for (AnalysisSetListener listener : listeners) {
listener.analysisAdded(types.get(key), fields.get(key));
}
}
}
}
public void addData(DataType type, String field) {
String key = type.getKey(field);
if (types.put(key, type) == null) {
fields.put(key, field);
for (AnalysisSetListener listener : listeners) {
listener.analysisAdded(type, field);
}
}
}
public void removeData(String key) {
DataType type = types.remove(key);
String field = fields.remove(key);
if ((type != null) && (field != null)) {
for (AnalysisSetListener listener : listeners) {
listener.analysisRemoved(type, field);
}
}
}
public void clearData() {
types.clear();
fields.clear();
for (AnalysisSetListener listener : listeners) {
listener.analysisCleared();
}
}
public DataType getType(String key) {
return types.get(key);
}
public String getField(String key) {
return fields.get(key);
}
public Iterable<String> getKeys() {
return java.util.Collections.unmodifiableSet(types.keySet());
}
public int size() {
return types.size();
}
public void addListener(AnalysisSetListener listener) {
listeners.add(listener);
}
public void removeListener(AnalysisSetListener listener) {
listeners.remove(listener);
}
}