package org.radargun.state;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
import org.radargun.config.Cluster;
/**
* Support class for master and slave states.
*
* @author Mircea Markus <Mircea.Markus@jboss.com>
*/
public class StateBase<L extends StateListener> {
private Map<String, Object> stateMap = new HashMap<>();
private String configName;
private Cluster cluster;
private int clusterSize;
private int maxClusterSize;
private List<L> listeners = new CopyOnWriteArrayList<L>();
public String getConfigName() {
return configName;
}
public void setConfigName(String configName) {
this.configName = configName;
}
public int getClusterSize() {
return clusterSize;
}
public Cluster getCluster() {
return cluster;
}
public void setCluster(Cluster cluster) {
this.cluster = cluster;
this.clusterSize = cluster.getSize();
}
public int getMaxClusterSize() {
return maxClusterSize;
}
public void setMaxClusterSize(int maxClusterSize) {
this.maxClusterSize = maxClusterSize;
}
public Object remove(Object key) {
return stateMap.remove(key);
}
/**
* Store an entry that can be retrieved in next stages. However, this value does not persist service
* destruction and therefore cannot be retrieved in different configuration.
* @param key
* @param value
*/
public void put(String key, Object value) {
stateMap.put(key, value);
}
public Object get(String key) {
return stateMap.get(key);
}
public String getString(Object key) {
return (String) stateMap.get(key);
}
public Integer getInteger(Object key) {
Object value = stateMap.get(key);
if (value == null) return null;
if (value instanceof Integer) {
return (Integer) value;
} else {
return Integer.parseInt(value.toString());
}
}
public Float getFloat(Object key) {
Object value = stateMap.get(key);
if (value == null) return null;
if (value instanceof Float) {
return (Float) value;
} else {
return Float.parseFloat(value.toString());
}
}
public Boolean getBoolean(Object key) {
Object value = stateMap.get(key);
if (value == null) return null;
if (value instanceof Boolean) {
return (Boolean) value;
} else {
return Boolean.parseBoolean(value.toString());
}
}
public Map<String, String> asStringMap() {
HashMap<String, String> map = new HashMap<>(stateMap.size());
for (Map.Entry<String, Object> entry : stateMap.entrySet()) {
map.put(String.valueOf(entry.getKey()), String.valueOf(entry.getValue()));
}
return map;
}
public void reset() {
stateMap.clear();
listeners.clear();
}
public void addListener(L listener) {
listeners.add(listener);
}
public void removeListener(L listener) {
listeners.remove(listener);
}
public List<L> getListeners() {
return Collections.unmodifiableList(listeners);
}
}