package org.oddjob.jmx.general;
import java.util.concurrent.atomic.AtomicInteger;
import javax.management.ObjectName;
import javax.swing.ImageIcon;
import org.apache.log4j.Logger;
import org.oddjob.Iconic;
import org.oddjob.images.IconEvent;
import org.oddjob.images.IconHelper;
import org.oddjob.images.IconListener;
import org.oddjob.images.ImageIconStable;
import org.oddjob.logging.LogEnabled;
import org.oddjob.structural.ChildHelper;
import org.oddjob.structural.StructuralListener;
/**
* A simple implementation of a {@link DomainNode}.
*
* @author rob
*
*/
public class SimpleDomainNode implements DomainNode, Iconic, LogEnabled {
/** Used to count loggers. */
private static final AtomicInteger instanceCount = new AtomicInteger();
/** The icon. */
private final static ImageIcon icon = new ImageIconStable(
IconHelper.class.getResource("Open16.gif"),
"folder");
/** Logger for this instance. */
private final Logger logger = Logger.getLogger(getClass().getName() +
"." + instanceCount.incrementAndGet());
/** The name. */
private final String domain;
/** Session. */
private final MBeanSession mBeanSession;
/** For structural. */
private final ChildHelper<MBeanNode> childHelper =
new ChildHelper<MBeanNode>(this);
/**
* Constructor.
*
* @param domain The name.
* @param mBeanSession The session.
*/
public SimpleDomainNode(String domain, MBeanSession mBeanSession) {
this.domain = domain;
this.mBeanSession = mBeanSession;
}
@Override
public String loggerName() {
return logger.getName();
}
@Override
public void initialise() {
logger.info("Initialising for Domain: " + domain);
MBeanCache cache = mBeanSession.getMBeanCache();
try {
MBeanNode[] children = cache.findBeans(
new ObjectName(domain + ":*"));
for (MBeanNode child : children) {
childHelper.addChild(child);
// done after add to allow logger archiver to be added.
child.initialise();
}
} catch (Exception e) {
logger.error("Failed Querying MBeanServer", e);
}
}
@Override
public void addStructuralListener(StructuralListener listener) {
childHelper.addStructuralListener(listener);
}
@Override
public void removeStructuralListener(StructuralListener listener) {
childHelper.removeStructuralListener(listener);
}
/**
* Return an icon tip for a given id. Part
* of the Iconic interface.
*/
public ImageIcon iconForId(String iconId) {
return icon;
}
/**
* Add an icon listener. Part of the Iconic
* interface.
*
* @param listener The listener.
*/
public void addIconListener(IconListener listener) {
listener.iconEvent(new IconEvent(this, "folder"));
}
/**
* Remove an icon listener. Part of the Iconic
* interface.
*
* @param listener The listener.
*/
public void removeIconListener(IconListener listener) {
}
public void destroy() {
while (childHelper.size() > 0) {
MBeanNode node = childHelper.removeChildAt(0);
node.destroy();
}
}
@Override
public String toString() {
return domain;
}
}