// $Id: CellInfoContainer.java,v 1.1 2006-06-08 15:23:27 patrick Exp $Cg
package diskCacheV111.services.web;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.regex.Pattern;
public class CellInfoContainer
{
private final Map<String,Map<String,Map<String,Object>>> _poolHash
= new HashMap<>();
private final Map<String,PatternEntry> _patternHash
= new HashMap<>();
private final Map<String,Map<String,Map<String,Object>>> _poolGroupClassHash
= new HashMap<>();
public synchronized void addInfo(String poolName, Object payload)
{
Map<String,Map<String,Object>> link = _poolHash.get(poolName);
if (link != null) {
for (Map<String,Object> table: link.values()) {
table.put(poolName, payload);
}
}
for (PatternEntry patternEntry : _patternHash.values()) {
if (patternEntry.pattern.matcher(poolName).matches()) {
for (Map<String,Object> table: patternEntry.linkMap.values()) {
table.put(poolName, payload);
}
}
}
}
public synchronized void addPool(String groupClass, String group, String poolName)
{
Map<String,Map<String,Object>> poolGroupMap =
_poolGroupClassHash.get(groupClass);
if (poolGroupMap == null) {
poolGroupMap =
new HashMap<>();
_poolGroupClassHash.put(groupClass, poolGroupMap);
}
Map<String,Object> table = poolGroupMap.get(group);
if (table == null) {
table = new HashMap<>();
poolGroupMap.put(group, table);
}
Map<String,Map<String,Object>> link = _poolHash.get(poolName);
if (link == null) {
link = new HashMap<>();
_poolHash.put(poolName, link);
}
link.put(groupClass + ":" + group, table);
}
public synchronized void removePool(String groupClass, String group, String poolName)
throws NoSuchElementException, IllegalStateException
{
Map<String,Map<String,Object>> poolGroupMap =
_poolGroupClassHash.get(groupClass);
if (poolGroupMap == null) {
throw new
NoSuchElementException("groupClass not found : "
+ groupClass);
}
Map<String,Object> tableMap = poolGroupMap.get(group);
if (tableMap == null) {
throw new
NoSuchElementException("group not found : " + group);
}
//
//
// now get the table map from the poolHash side
//
Map<String,Map<String,Object>> link = _poolHash.get(poolName);
if (link == null) {
throw new
NoSuchElementException("pool not found : " + poolName);
}
tableMap = link.remove(groupClass + ":" + group);
if (tableMap == null) {
throw new
IllegalStateException("not found in link map : "
+ groupClass + ":" + group);
}
//
// here we should check if both table maps are the same. But
// we wouldn't know what to do if not.
//
// clear the possible content
//
tableMap.remove(poolName);
}
//
// NOT FINISHED YET
//
public synchronized void removePoolGroup(String className, String groupName)
{
//
// first remove pool group from poolGroupClass hash
//
Map<String,Map<String,Object>> groupMap =
_poolGroupClassHash.get(className);
if (groupMap == null) {
throw new
NoSuchElementException("not found : " + className);
}
Map<String,Object> tableMap = groupMap.remove(groupName);
if (tableMap == null) {
throw new
NoSuchElementException("not found : " + groupName);
}
for (Map.Entry<String,Map<String,Map<String,Object>>> entry:
_poolHash.entrySet()) {
String poolName = entry.getKey();
Map<String,Map<String,Object>> link = entry.getValue();
for (Map.Entry<String,Map<String,Object>> domain:
link.entrySet()) {
String domainName = domain.getKey();
Map<String,Object> table = domain.getValue();
// FIXME: Is something supposed to happen here?
}
}
}
private static class PatternEntry
{
private final Map<String,Map<String,Object>> linkMap
= new HashMap<>();
private final Pattern pattern;
private PatternEntry(Pattern pattern)
{
this.pattern = pattern;
}
public String toString()
{
return pattern.pattern() + " " + linkMap.toString();
}
}
public synchronized void addPattern(String groupClass, String group, String patternName, String pattern)
{
Map<String,Map<String,Object>> poolGroupMap =
_poolGroupClassHash.get(groupClass);
if (poolGroupMap == null) {
poolGroupMap = new HashMap<>();
_poolGroupClassHash.put(groupClass, poolGroupMap);
}
Map<String,Object> table = poolGroupMap.get(group);
if (table == null) {
table = new HashMap<>();
poolGroupMap.put(group, table);
}
PatternEntry patternEntry = _patternHash.get(patternName);
if (patternEntry == null) {
if (pattern == null) {
throw new
IllegalArgumentException("patterName is new, so we need pattern");
}
patternEntry = new PatternEntry(Pattern.compile(pattern));
_patternHash.put(patternName, patternEntry);
} else {
if (pattern != null) {
if (! patternEntry.pattern.pattern().equals(pattern)) {
throw new
IllegalArgumentException("Conflict in pattern (name in use with different pattern)");
}
}
}
patternEntry.linkMap.put(groupClass + ":" + group, table);
}
public synchronized void removePattern(String groupClass, String group, String patternName)
{
Map<String,Map<String,Object>> poolGroupMap =
_poolGroupClassHash.get(groupClass);
if (poolGroupMap == null) {
throw new
NoSuchElementException("groupClass not found : "
+ groupClass);
}
Map<String,Object> tableMap = poolGroupMap.get(group);
if (tableMap == null) {
throw new
NoSuchElementException("group not found : " + group);
}
//
//
// now get the table map from the poolHash side
//
PatternEntry patternEntry = _patternHash.get(patternName);
if (patternEntry == null) {
throw new
NoSuchElementException("patternName not found : "
+ patternName);
}
Map<String,Map<String,Object>> link = patternEntry.linkMap;
tableMap = link.remove(groupClass + ":" + group);
if (tableMap == null) {
throw new
IllegalStateException("not found in link map : "
+ groupClass + ":" + group);
}
// if (link.size() == 0)_patternHash.remove(patternName);
//
// here we should check if both table maps are the same. But we wouldn't know
// what to do if not.
//
// clear the possible content
//
List<String> toBeRemoved = new ArrayList<>();
for (String poolName : tableMap.keySet()) {
if (patternEntry.pattern.matcher(poolName).matches()) {
toBeRemoved.add(poolName);
}
}
for (String poolName : toBeRemoved) {
tableMap.remove(poolName);
}
}
public synchronized String getInfo()
{
StringBuilder sb = new StringBuilder();
for (Map.Entry<String,Map<String,Map<String,Object>>> entry:
_poolGroupClassHash.entrySet()) {
String className = entry.getKey();
Map<String,Map<String,Object>> groupMap = entry.getValue();
sb.append("Class : ").append(className).append("\n");
for (Map.Entry<String,Map<String,Object>> groupEntry:
groupMap.entrySet()) {
String groupName = groupEntry.getKey();
Map<String,Object> tableMap = groupEntry.getValue();
sb.append(" Group : ").append(groupName).append("\n");
printTable(sb, " ", tableMap);
}
}
sb.append("PoolHash :\n");
for (Map.Entry<String,Map<String,Map<String,Object>>> entry:
_poolHash.entrySet()) {
String poolName = entry.getKey();
Map<String,Map<String,Object>> link = entry.getValue();
sb.append(" ").append(poolName).append("\n");
for (Map.Entry<String,Map<String,Object>> domain:
link.entrySet()) {
String domainName = domain.getKey();
Map<String,Object> table = domain.getValue();
sb.append(" ").append(domainName).append("\n");
printTable(sb, " ", table);
}
}
sb.append("Pattern List :\n");
for (Map.Entry<String,PatternEntry> entry:
_patternHash.entrySet()) {
String patternName = entry.getKey();
PatternEntry patternEntry = entry.getValue();
Pattern pattern = patternEntry.pattern;
Map<String,Map<String,Object>> link = patternEntry.linkMap;
sb.append(" ").append(patternName).append("(").append(pattern.pattern()).append(")").append("\n");
for (Map.Entry<String,Map<String,Object>> domain:
link.entrySet()) {
String domainName = domain.getKey();
Map<String,Object> table = domain.getValue();
sb.append(" ").append(domainName).append("\n");
printTable(sb, " ", table);
}
}
return sb.toString();
}
private void printTable(StringBuilder sb, String prefix,
Map<String,Object> table)
{
for (Map.Entry<String,Object> tableEntry : table.entrySet()) {
String pn = tableEntry.getKey();
String tc = tableEntry.getValue().toString();
sb.append(prefix).append(pn).append(" -> ").append(tc).append("\n");
}
}
public synchronized Map<String,Map<String,Map<String,Object>>>
createExternalTopologyMap()
{
Map<String,Map<String,Map<String,Object>>> allClasses =
new HashMap<>();
for (Map.Entry<String,Map<String,Map<String,Object>>> entry:
_poolGroupClassHash.entrySet()) {
String className = entry.getKey();
Map<String,Map<String,Object>> groupMap = entry.getValue();
Map<String,Map<String,Object>> currentClass =
new HashMap<>();
allClasses.put(className, currentClass);
for (Map.Entry<String,Map<String,Object>> groupEntry:
groupMap.entrySet()) {
String groupName = groupEntry.getKey();
Map<String,Object> tableMap = groupEntry.getValue();
Map<String,Object> currentGroup =
new HashMap<>();
currentClass.put(groupName, currentGroup);
for (String poolName: tableMap.keySet()) {
currentGroup.put(poolName, null);
}
}
}
return allClasses;
}
}