1 /*
2  * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 package com.sun.management.internal;
27 
28 import java.util.*;
29 import com.sun.management.VMOption;
30 import com.sun.management.VMOption.Origin;
31 import java.security.AccessController;
32 
33 /**
34  * Flag class is a helper class for constructing a VMOption.
35  * It has the static methods for getting the Flag objects, each
36  * corresponds to one VMOption.
37  *
38  */
39 class Flag {
40     private String name;
41     private Object value;
42     private Origin origin;
43     private boolean writeable;
44     private boolean external;
45 
Flag(String name, Object value, boolean writeable, boolean external, Origin origin)46     Flag(String name, Object value, boolean writeable,
47          boolean external, Origin origin) {
48         this.name = name;
49         this.value = value == null ? "" : value ;
50         this.origin = origin;
51         this.writeable = writeable;
52         this.external = external;
53     }
54 
getValue()55     Object getValue() {
56         return value;
57     }
58 
isWriteable()59     boolean isWriteable() {
60         return writeable;
61     }
62 
isExternal()63     boolean isExternal() {
64         return external;
65     }
66 
getVMOption()67     VMOption getVMOption() {
68         return new VMOption(name, value.toString(), writeable, origin);
69     }
70 
getFlag(String name)71     static Flag getFlag(String name) {
72         String[] names = new String[1];
73         names[0] = name;
74 
75         List<Flag> flags = getFlags(names, 1);
76         if (flags.isEmpty()) {
77             return null;
78         } else {
79             // flags should have only one element
80             return flags.get(0);
81         }
82     }
83 
getAllFlags()84     static List<Flag> getAllFlags() {
85         int numFlags = getInternalFlagCount();
86 
87         // Get all internal flags with names = null
88         return getFlags(null, numFlags);
89     }
90 
getFlags(String[] names, int numFlags)91     private static List<Flag> getFlags(String[] names, int numFlags) {
92         Flag[] flags = new Flag[numFlags];
93         int count = getFlags(names, flags, numFlags);
94 
95         List<Flag> result = new ArrayList<>();
96         for (Flag f : flags) {
97             if (f != null) {
98                 result.add(f);
99             }
100         }
101         return result;
102     }
103 
getAllFlagNames()104     private static native String[] getAllFlagNames();
105     // getFlags sets each element in the given flags array
106     // with a Flag object only if the name is valid and the
107     // type is supported. The flags array may contain null elements.
getFlags(String[] names, Flag[] flags, int count)108     private static native int getFlags(String[] names, Flag[] flags, int count);
getInternalFlagCount()109     private static native int getInternalFlagCount();
110 
111     // These set* methods are synchronized on the class object
112     // to avoid multiple threads updating the same flag at the same time.
setLongValue(String name, long value)113     static synchronized native void setLongValue(String name, long value);
setDoubleValue(String name, double value)114     static synchronized native void setDoubleValue(String name, double value);
setBooleanValue(String name, boolean value)115     static synchronized native void setBooleanValue(String name, boolean value);
setStringValue(String name, String value)116     static synchronized native void setStringValue(String name, String value);
117 
118     static {
AccessController.doPrivileged( new java.security.PrivilegedAction<Void>() { public Void run() { System.loadLibrary(R); return null; } })119         AccessController.doPrivileged(
120             new java.security.PrivilegedAction<Void>() {
121                 public Void run() {
122                     System.loadLibrary("management");
123                     return null;
124                 }
125             });
initialize()126         initialize();
127     }
initialize()128     private static native void initialize();
129 }
130