package org.dcache.services.info.stateInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.dcache.services.info.base.BooleanStateValue; import org.dcache.services.info.base.FloatingPointStateValue; import org.dcache.services.info.base.IntegerStateValue; import org.dcache.services.info.base.StateExhibitor; import org.dcache.services.info.base.StateGuide; import org.dcache.services.info.base.StatePath; import org.dcache.services.info.base.StateVisitor; import org.dcache.services.info.base.StringStateValue; import org.dcache.services.info.base.guides.SubtreeStateGuide; /** * Scan through a dCache state tree, building a list of poolgroup-to-pools associations. * @author Paul Millar <paul.millar@desy.de> */ public class PoolgroupToPoolsVisitor implements StateVisitor { private static final Logger LOGGER = LoggerFactory.getLogger(PoolgroupToPoolsVisitor.class); private static final StatePath POOLGROUPS_PATH = new StatePath("poolgroups"); /** * Obtain a Map between a poolgroup and the pools that are currently members of this poolgroup. * @return */ public static Map <String,Set<String>> getDetails(StateExhibitor exhibitor) { LOGGER.trace("Gathering current status"); PoolgroupToPoolsVisitor visitor = new PoolgroupToPoolsVisitor(); exhibitor.visitState(visitor); return visitor._poolgroups; } Map <String,Set<String>> _poolgroups = new HashMap<>(); Set<String> _currentPoolgroupPools; StatePath _poolMembershipPath; StateGuide _guide = new SubtreeStateGuide(POOLGROUPS_PATH); @Override public boolean isVisitable(StatePath path) { return _guide.isVisitable(path); } @Override public void visitCompositePreDescend(StatePath path, Map<String,String> metadata) { LOGGER.trace("Examining {}", path); // If something like poolgroups.<some poolgroup> if (POOLGROUPS_PATH.isParentOf(path)) { LOGGER.trace("Found poolgroup {}", path.getLastElement()); _currentPoolgroupPools = new HashSet<>(); _poolgroups.put(path.getLastElement(), _currentPoolgroupPools); _poolMembershipPath = path.newChild("pools"); } // If something like poolgroups.<some poolgroup>.pools.<some pool> if (_poolMembershipPath != null && _poolMembershipPath.isParentOf(path)) { LOGGER.trace("Found pool {}", path.getLastElement()); _currentPoolgroupPools.add(path.getLastElement()); } } @Override public void visitCompositePostDescend(StatePath path, Map<String,String> metadata) { } @Override public void visitString(StatePath path, StringStateValue value) { } @Override public void visitBoolean(StatePath path, BooleanStateValue value) { } @Override public void visitInteger(StatePath path, IntegerStateValue value) { } @Override public void visitFloatingPoint(StatePath path, FloatingPointStateValue value) { } }