import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Map;
import java.util.LinkedHashMap;
import javax.management.MBeanServerConnection;
import javax.swing.JPanel;
import javax.swing.SwingWorker;

import com.sun.tools.jconsole.JConsolePlugin;
import com.sun.tools.jconsole.JConsoleContext;
import com.sun.tools.jconsole.JConsoleContext.ConnectionState;

public class HeapUsagePlugin extends JConsolePlugin {
    private HeapUsageIndicator indicator;
    private Map<String, JPanel> tabs;
    
    public HeapUsagePlugin() {
        addContextPropertyChangeListener(new PropertyChangeListener() {
            public void propertyChange(PropertyChangeEvent ev) {
                // 変更されたプロパティを取得
                String prop = ev.getPropertyName();
                if (prop == JConsoleContext.CONNECTION_STATE_PROPERTY) {

                    // JavaVMと接続されたらMBeanServerConnectionを取得し
                    // MemoryUsageIndicatorにセットする
                    ConnectionState state = (ConnectionState)ev.getNewValue();
                    if (state == ConnectionState.CONNECTED 
                                                 && indicator != null) {

                        MBeanServerConnection connection 
                            = getContext().getMBeanServerConnection(); 
                        indicator.setMBeanServerConnection(connection);
                    }
                }
            }
        });
    }
    
    @Override
    public synchronized Map<String, JPanel> getTabs() {
        if (tabs == null) {
            indicator = new HeapUsageIndicator();
            indicator.setMBeanServerConnection(
                getContext().getMBeanServerConnection());
            
            tabs = new LinkedHashMap<String, JPanel>();
            tabs.put("Heap Usage", indicator);
        }
        
        return tabs;
    }
    
    @Override
    public SwingWorker<?,?> newSwingWorker() {
        return indicator.newSwingWorker();    
    }
}

