/* * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.tools.visualvm.jvmstat.application; import com.sun.tools.visualvm.core.datasource.Storage; import com.sun.tools.visualvm.core.properties.PropertiesPanel; import com.sun.tools.visualvm.core.properties.PropertiesProvider; import com.sun.tools.visualvm.host.Host; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import org.openide.util.NbBundle; /** * * @author Jiri Sedlacek */ class HostPropertiesProvider extends PropertiesProvider<Host> { /** * Key for the "jstatd" properties category. */ static final int CATEGORY_JSTATD_CONNECTION = 100; private static final String PROP_JSTATD_PORT = "prop_jstatd_port"; // NOI18N private static final String PROP_JSTATD_REFRESH = "prop_jstatd_refresh"; // NOI18N public HostPropertiesProvider() { super(NbBundle.getMessage(HostPropertiesProvider.class, "CAP_JstatdProperties"), // NOI18N NbBundle.getMessage(HostPropertiesProvider.class, "DESCR_JstatdProperties"), // NOI18N CATEGORY_JSTATD_CONNECTION, 0); // NOI18N } public boolean supportsDataSource(Host host) { return true; } public PropertiesPanel createPanel(Host host) { return new ConnectionsCustomizer(getDescriptorsEx(host)); } public void propertiesDefined(PropertiesPanel panel, Host host) { ConnectionsCustomizer customizer = (ConnectionsCustomizer)panel; setDescriptors(host, customizer.getDescriptors()); } public void propertiesChanged(PropertiesPanel panel, Host host) { ConnectionsCustomizer customizer = (ConnectionsCustomizer)panel; setDescriptorsEx(host, customizer.getDescriptors()); } public void propertiesCancelled(PropertiesPanel panel, Host host) { // Nothing to do } static Set<ConnectionDescriptor> descriptorsForHost(Host host) { Set<ConnectionDescriptor> descriptors = getDescriptors(host); if (Host.LOCALHOST.equals(host)) descriptors.add(ConnectionDescriptor.DEFAULT_LOCAL_DESCRIPTOR); return cleanup(host, descriptors); } private static Set<ConnectionDescriptor> cleanup(Host h, Set<ConnectionDescriptor> d) { Set<ConnectionDescriptor> descriptors = new HashSet(d); Iterator<ConnectionDescriptor> iterator = descriptors.iterator(); while (iterator.hasNext()) if (iterator.next().createHostIdentifier(h) == null) iterator.remove(); return descriptors; } private static Set<ConnectionDescriptor> getDescriptors(Host host) { Storage storage = host == null ? null : host.getStorage(); return getDescriptors(storage); } private static Set<ConnectionDescriptor> getDescriptors(Storage storage) { Set<ConnectionDescriptor> set = new HashSet(); if (storage != null) { int index = 0; String port = storage.getCustomProperty(PROP_JSTATD_PORT + "." + index); // NOI18N while (port != null) { String refresh = storage.getCustomProperty(PROP_JSTATD_REFRESH + "." + index); // NOI18N try { set.add(new ConnectionDescriptor(Integer.parseInt(port), Double.parseDouble(refresh))); } catch (NumberFormatException e) { // TODO: log it } port = storage.getCustomProperty(PROP_JSTATD_PORT + "." + ++index); // NOI18N } } return set; } private static Set<ConnectionDescriptor> getDescriptorsEx(Host host) { Set<ConnectionDescriptor> set = getDescriptors(host); if (host == null) set.add(ConnectionDescriptor.createDefault()); return set; } private static void setDescriptors(Host host, Set<ConnectionDescriptor> descriptors) { setDescriptors(host.getStorage(), descriptors); } private static void setDescriptors(Storage storage, Set<ConnectionDescriptor> descriptors) { clearDescriptors(storage); int index = 0; for (ConnectionDescriptor descriptor : descriptors) { storage.setCustomProperty(PROP_JSTATD_PORT + "." + index, // NOI18N Integer.toString(descriptor.getPort())); storage.setCustomProperty(PROP_JSTATD_REFRESH + "." + index, // NOI18N Double.toString(descriptor.getRefreshRate())); index++; } } private static void setDescriptorsEx(Host host, Set<ConnectionDescriptor> newDescriptors) { // Cache old descriptors List<ConnectionDescriptor> oldDescriptors = new ArrayList(getDescriptorsEx(host)); // Set new descriptors setDescriptors(host, newDescriptors); // Resolve added descriptors Set<ConnectionDescriptor> added = new HashSet(newDescriptors); added.removeAll(oldDescriptors); added = cleanup(host, added); // Resolve removed descriptors Set<ConnectionDescriptor> removed = new HashSet(oldDescriptors); removed.removeAll(newDescriptors); removed = cleanup(host, removed); // Resolve changed descriptors Set<ConnectionDescriptor> changed = new HashSet(newDescriptors); changed.retainAll(oldDescriptors); Iterator<ConnectionDescriptor> iterator = changed.iterator(); while (iterator.hasNext()) { ConnectionDescriptor descriptor1 = iterator.next(); ConnectionDescriptor descriptor2 = oldDescriptors.get( oldDescriptors.indexOf(descriptor1)); if (Math.abs(descriptor1.getRefreshRate() - descriptor2.getRefreshRate()) < 0.001) iterator.remove(); } changed = cleanup(host, changed); if (!added.isEmpty() || !removed.isEmpty() || !changed.isEmpty()) JvmstatApplicationProvider.sharedInstance().connectionsChanged( host, added, removed, changed); } private static void clearDescriptors(Storage storage) { int index = 0; String port = storage.getCustomProperty(PROP_JSTATD_PORT + "." + index); // NOI18N while (port != null) { storage.clearCustomProperties(new String[] { PROP_JSTATD_PORT + "." + index, PROP_JSTATD_REFRESH + "." + index // NOI18N }); port = storage.getCustomProperty(PROP_JSTATD_PORT + "." + ++index); // NOI18N } } }