package org.dcache.services.info.gathers;
import dmg.cells.nucleus.CellMessageAnswerable;
import dmg.cells.nucleus.CellPath;
import org.dcache.services.info.base.StateExhibitor;
import org.dcache.services.info.base.StatePath;
/**
* This class sends a series of messages based on the current state tree.
* It uses a visitor to
* extract all entries below a certain point in the state tree and constructs a message for
* each entry; for example, if the path is "dCache.pools" and the state contains entries for
* "dCache.pools.fandango_1" and "dCache.pools.fandango_2" then two CellMessages are sent.
* <p>
* @author Paul Millar <paul.millar@desy.de>
*/
public class ListBasedMessageDga extends SkelListBasedActivity
{
private final CellPath _cellPath;
private final String _messagePrefix;
private final CellMessageAnswerable _handler;
private final MessageSender _sender;
/* The following two are only needed for toString() */
private final String _cellName;
private final String _parentPath;
/**
* Create a new list-based data-gathering activity
* @param parent the StatePath that points to the list's parent item
* @param cellName the name of the cell to contact
* @param message the message to send.
* @param handler the cell handler for the return msg payload.
*/
public ListBasedMessageDga(StateExhibitor exhibitor, MessageSender sender,
StatePath parent, String cellName, String message,
CellMessageAnswerable handler)
{
super(exhibitor, parent);
_cellName = cellName;
_parentPath = parent.toString();
_messagePrefix = message;
_handler = handler;
_cellPath = new CellPath(cellName);
_sender = sender;
}
/**
* Triggered every-so-often, under control of SkelListBasedActivity.
*/
@Override
public void trigger()
{
super.trigger();
String item = getNextItem();
// Only null if there's nothing under _parentPath in dCache.
if (item == null) {
return;
}
StringBuilder sb = new StringBuilder();
sb.append(_messagePrefix);
sb.append(" ");
sb.append(item);
_sender.sendMessage(getMetricLifetime(), _handler, _cellPath, sb.toString());
}
@Override
public String toString()
{
StringBuilder sb = new StringBuilder();
sb.append(this.getClass().getSimpleName());
sb.append("[");
sb.append(_cellName);
sb.append(", ");
sb.append(_parentPath);
sb.append(", ");
sb.append(_messagePrefix);
sb.append("]");
return sb.toString();
}
}