/* * 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.core.snapshot; import com.sun.tools.visualvm.core.datasupport.Positionable; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; // TODO: synchronize /** * A repository of registered SnapshotCategory instances. * * @author Jiri Sedlacek */ public final class RegisteredSnapshotCategories { private static RegisteredSnapshotCategories sharedInstance; private final Set<SnapshotCategoriesListener> listeners = Collections.synchronizedSet(new HashSet()); private final Set<SnapshotCategory> categories = Collections.synchronizedSet(new HashSet()); /** * Returns singleton instance of RegisteredSnapshotCategories. * * @return singleton instance of RegisteredSnapshotCategories. */ public synchronized static RegisteredSnapshotCategories sharedInstance() { if (sharedInstance == null) sharedInstance = new RegisteredSnapshotCategories(); return sharedInstance; } /** * Adds a listener for changes of registered snapshot categories. * * @param listener listener for changes of registered snapshot categories. */ public void addCategoriesListener(SnapshotCategoriesListener listener) { listeners.add(listener); } /** * Removes a listener for changes of registered snapshot categories. * * @param listener listener for changes of registered snapshot categories. */ public void removeCategoriesListener(SnapshotCategoriesListener listener) { listeners.remove(listener); } /** * Registers a SnapshotCategory. * * @param category SnapshotCategory. */ public void registerCategory(SnapshotCategory category) { categories.add(category); fireCategoryRegistered(category); } /** * Unregisters a SnapshotCategory. * * @param category SnapshotCategory. */ public void unregisterCategory(SnapshotCategory category) { categories.remove(category); fireCategoryUnregistered(category); } /** * Returns list of registered SnapshotCategory instances to be shown in UI. * * @return list of registered SnapshotCategory instances to be shown in UI. */ public List<SnapshotCategory> getVisibleCategories() { List<SnapshotCategory> allCategories = new ArrayList(categories); List<SnapshotCategory> visibleCategories = new ArrayList(); for (SnapshotCategory category : allCategories) if (category.getPreferredPosition() != SnapshotCategory.POSITION_NONE) visibleCategories.add(category); Collections.sort(visibleCategories, Positionable.COMPARATOR); return visibleCategories; } /** * Returns list of registered SnapshotCategory instances capable of opening snapshot files. * * @return list of registered SnapshotCategory instances capable of opening snapshot files. */ public List<SnapshotCategory> getOpenSnapshotCategories() { List<SnapshotCategory> allCategories = new ArrayList(categories); List<SnapshotCategory> openSnapshotCategories = new ArrayList(); for (SnapshotCategory category : allCategories) if (category.supportsOpenSnapshot()) openSnapshotCategories.add(category); Collections.sort(openSnapshotCategories, Positionable.COMPARATOR); return openSnapshotCategories; } /** * Returns list of all registered SnapshotCategory instances. * * @return list of all registered SnapshotCategory instances. */ public List<SnapshotCategory> getAllCategories() { List<SnapshotCategory> allCategories = new ArrayList(categories); Collections.sort(allCategories, Positionable.COMPARATOR); return allCategories; } private void fireCategoryRegistered(SnapshotCategory category) { Set<SnapshotCategoriesListener> listenersSet = new HashSet(listeners); for (SnapshotCategoriesListener listener : listenersSet) listener.categoryRegistered(category); } private void fireCategoryUnregistered(SnapshotCategory category) { Set<SnapshotCategoriesListener> listenersSet = new HashSet(listeners); for (SnapshotCategoriesListener listener : listenersSet) listener.categoryUnregistered(category); } private RegisteredSnapshotCategories() {} }