/* * 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.application.snapshot; import com.sun.tools.visualvm.core.datasource.Storage; import com.sun.tools.visualvm.core.datasource.descriptor.DataSourceDescriptorFactory; import com.sun.tools.visualvm.core.datasupport.Utils; import com.sun.tools.visualvm.core.snapshot.RegisteredSnapshotCategories; import com.sun.tools.visualvm.core.snapshot.SnapshotCategory; import com.sun.tools.visualvm.core.snapshot.SnapshotsContainer; import java.io.File; /** * Support for application snapshots in VisualVM. * * @author Jiri Sedlacek */ public final class ApplicationSnapshotsSupport { private static ApplicationSnapshotsSupport instance; private static final String SNAPSHOTS_STORAGE_DIRNAME = "snapshots"; // NOI18N private static File snapshotsStorageDirectory; private static String snapshotsStorageDirectoryString; private ApplicationSnapshotProvider snapshotProvider; private ApplicationSnapshotCategory snapshotCategory = new ApplicationSnapshotCategory(); /** * Returns singleton instance of ApplicationSnapshotsSupport. * * @return singleton instance of ApplicationSnapshotsSupport. */ public static synchronized ApplicationSnapshotsSupport getInstance() { if (instance == null) instance = new ApplicationSnapshotsSupport(); return instance; } /** * Returns SnapshotCategory instance for application snapshots. * * @return SnapshotCategory instance for application snapshots. */ public SnapshotCategory getCategory() { return snapshotCategory; } ApplicationSnapshotCategory getApplicationSnapshotCategory() { return snapshotCategory; } ApplicationSnapshotProvider getSnapshotProvider() { return snapshotProvider; } static synchronized String getStorageDirectoryString() { if (snapshotsStorageDirectoryString == null) snapshotsStorageDirectoryString = Storage.getPersistentStorageDirectoryString() + File.separator + SNAPSHOTS_STORAGE_DIRNAME; return snapshotsStorageDirectoryString; } static synchronized File getStorageDirectory() { if (snapshotsStorageDirectory == null) { String snapshotsStorageString = getStorageDirectoryString(); snapshotsStorageDirectory = new File(snapshotsStorageString); if (snapshotsStorageDirectory.exists() && snapshotsStorageDirectory.isFile()) throw new IllegalStateException("Cannot create snapshots storage directory " + snapshotsStorageString + ", file in the way"); // NOI18N if (snapshotsStorageDirectory.exists() && (!snapshotsStorageDirectory.canRead() || !snapshotsStorageDirectory.canWrite())) throw new IllegalStateException("Cannot access snapshots storage directory " + snapshotsStorageString + ", read&write permission required"); // NOI18N if (!Utils.prepareDirectory(snapshotsStorageDirectory)) throw new IllegalStateException("Cannot create snapshots storage directory " + snapshotsStorageString); // NOI18N } return snapshotsStorageDirectory; } static boolean storageDirectoryExists() { return new File(getStorageDirectoryString()).isDirectory(); } private ApplicationSnapshotsSupport() { DataSourceDescriptorFactory.getDefault().registerProvider(new ApplicationSnapshotDescriptorProvider()); snapshotProvider = ApplicationSnapshotProvider.sharedInstance(); RegisteredSnapshotCategories.sharedInstance().registerCategory(snapshotCategory); SnapshotsContainer.sharedInstance(); // Notify SnapshotsContainer snapshotProvider.initialize(); } }