198 lines · 7.1 KB · Java
RawDownload
/* * Copyright (c) 2004, 2007, 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 sun.jvmstat.perfdata.monitor.protocol.local; import sun.jvmstat.monitor.*;import sun.jvmstat.monitor.event.*;import java.util.*;import java.util.regex.*;import java.io.*; /** * Class for managing the LocalMonitoredVm instances on the local system. * <p> * This class is responsible for the mechanism that detects the active * HotSpot Java Virtual Machines on the local host and possibly for a * specific user. The ability to detect all possible HotSpot Java Virtual * Machines on the local host may be limited by the permissions of the * principal running this JVM. * * @author Brian Doherty * @since 1.5 */public class LocalVmManager {    private String userName;                 // user name for monitored jvm    private File tmpdir;    private Pattern userPattern;    private Matcher userMatcher;    private FilenameFilter userFilter;    private Pattern filePattern;    private Matcher fileMatcher;    private FilenameFilter fileFilter;    private Pattern tmpFilePattern;    private Matcher tmpFileMatcher;    private FilenameFilter tmpFileFilter;     /**     * Creates a LocalVmManager instance for the local system.     * <p>     * Manages LocalMonitoredVm instances for which the principal     * has appropriate permissions.     */    public LocalVmManager() {        this(null);    }     /**     * Creates a LocalVmManager instance for the given user.     * <p>     * Manages LocalMonitoredVm instances for all JVMs owned by the specified     * user.     *     * @param user the name of the user     */    public LocalVmManager(String user) {        this.userName = user;         if (userName == null) {            tmpdir = new File(PerfDataFile.getTempDirectory());            userPattern = Pattern.compile(PerfDataFile.userDirNamePattern);            userMatcher = userPattern.matcher("");             userFilter = new FilenameFilter() {                public boolean accept(File dir, String name) {                    userMatcher.reset(name);                    return userMatcher.lookingAt();                }            };        } else {            tmpdir = new File(PerfDataFile.getTempDirectory(userName));        }         filePattern = Pattern.compile(PerfDataFile.fileNamePattern);        fileMatcher = filePattern.matcher("");         fileFilter = new FilenameFilter() {            public boolean accept(File dir, String name) {                fileMatcher.reset(name);                return fileMatcher.matches();            }        };         tmpFilePattern = Pattern.compile(PerfDataFile.tmpFileNamePattern);        tmpFileMatcher = tmpFilePattern.matcher("");         tmpFileFilter = new FilenameFilter() {            public boolean accept(File dir, String name) {                tmpFileMatcher.reset(name);                return tmpFileMatcher.matches();            }        };    }     /**     * Return the current set of monitorable Java Virtual Machines.     * <p>     * The set returned by this method depends on the user name passed     * to the constructor. If no user name was specified, then this     * method will return all candidate JVMs on the system. Otherwise,     * only the JVMs for the given user will be returned. This assumes     * that principal associated with this JVM has the appropriate     * permissions to access the target set of JVMs.     *     * @return Set - the Set of monitorable Java Virtual Machines     */    public synchronized Set<Integer> activeVms() {        /*         * This method is synchronized because the Matcher object used by         * fileFilter is not safe for concurrent use, and this method is         * called by multiple threads. Before this method was synchronized,         * we'd see strange file names being matched by the matcher.         */        Set<Integer> jvmSet = new HashSet<Integer>();         if (! tmpdir.isDirectory()) {            return jvmSet;        }         if (userName == null) {            /*             * get a list of all of the user temporary directories and             * iterate over the list to find any files within those directories.             */            File[] dirs = tmpdir.listFiles(userFilter);             for (int i = 0 ; i < dirs.length; i ++) {                if (!dirs[i].isDirectory()) {                    continue;                }                 // get a list of files from the directory                File[] files = dirs[i].listFiles(fileFilter);                 if (files != null) {                    for (int j = 0; j < files.length; j++) {                        if (files[j].isFile() && files[j].canRead()) {                            jvmSet.add(new Integer(                                    PerfDataFile.getLocalVmId(files[j])));                        }                    }                }            }        } else {            /*             * Check if the user directory can be accessed. Any of these             * conditions may have asynchronously changed between subsequent             * calls to this method.             */             // get the list of files from the specified user directory            File[] files = tmpdir.listFiles(fileFilter);             if (files != null) {                for (int j = 0; j < files.length; j++) {                    if (files[j].isFile() && files[j].canRead()) {                        jvmSet.add(new Integer(                                PerfDataFile.getLocalVmId(files[j])));                    }                }            }        }         // look for any 1.4.1 files        File[] files = tmpdir.listFiles(tmpFileFilter);        if (files != null) {            for (int j = 0; j < files.length; j++) {                if (files[j].isFile() && files[j].canRead()) {                    jvmSet.add(new Integer(                            PerfDataFile.getLocalVmId(files[j])));                }            }        }         return jvmSet;    }}