package org.visualvm.demoapplicationtype.model; import com.sun.tools.visualvm.application.Application; import com.sun.tools.visualvm.application.type.ApplicationTypeFactory; import com.sun.tools.visualvm.core.datasource.DataSourceProvider; import com.sun.tools.visualvm.core.datasource.DataSourceRepository; import com.sun.tools.visualvm.core.datasupport.DataChangeEvent; import com.sun.tools.visualvm.core.datasupport.DataChangeListener; import com.sun.tools.visualvm.core.datasupport.DataRemovedListener; import org.visualvm.demoapplicationtype.applicationtype.AnagramApplicationType; import java.util.Set; public class AnagramModelProvider implements DataChangeListener<Application>, DataRemovedListener<Application> { //~ Static fields/initializers ----------------------------------------------------------------------------------------------- private static final AnagramModelProvider INSTANCE = new AnagramModelProvider(); private final DataRemovedListener<Application> removelListener = new DataRemovedListener<Application>() { public void dataRemoved(Application app) { processFinishedApplication(app); } }; public AnagramModelProvider() { } //~ Methods ------------------------------------------------------------------------------------------------------------------ public void dataChanged(DataChangeEvent<Application> event) { if (event.getAdded().isEmpty() && event.getRemoved().isEmpty()) { // Initial event to deliver DataSources already created by the provider before registering to it as a listener // NOTE: already existing hosts are treated as new for this provider Set<Application> newApplications = event.getCurrent(); for (Application app : newApplications) { processNewApplication(app); } } else { // Real delta event Set<Application> newApplications = event.getAdded(); for (Application app : newApplications) { processNewApplication(app); } } } public static void initialize() { DataSourceRepository.sharedInstance().addDataChangeListener(INSTANCE, Application.class); } public static void shutdown() { DataSourceRepository.sharedInstance().removeDataChangeListener(INSTANCE); } public void dataRemoved(Application application) { processFinishedApplication(application); } private void processFinishedApplication(Application app) { // TODO: remove listener!!! Set<AnagramModel> roots = app.getRepository().getDataSources(AnagramModel.class); app.getRepository().removeDataSources(roots); } private void processNewApplication(final Application app) { if (ApplicationTypeFactory.getApplicationTypeFor(app) instanceof AnagramApplicationType) { AnagramModel am = new AnagramModel(app); app.getRepository().addDataSource(am); app.notifyWhenRemoved(removelListener); } } }