1 /*
   2  * Copyright (c) 2014, 2016, 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.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 package jdk.test.lib.management;
  25 
  26 import com.sun.management.HotSpotDiagnosticMXBean;
  27 import java.lang.management.ManagementFactory;
  28 
  29 /**
  30  * A utility class to work with VM options which could be altered during
  31  * execution.
  32  *
  33  * This class is a wrapper around {@code com.sun.management.VMOption}.
  34  * It provides more convenient interface to read/write the values.
  35  *
  36  */
  37 public class DynamicVMOption {
  38 
  39     private final HotSpotDiagnosticMXBean mxBean;
  40 
  41     /**
  42      * VM option name, like "MinHeapFreeRatio".
  43      */
  44     public final String name;
  45 
  46     /**
  47      * Creates an instance of DynamicVMOption.
  48      *
  49      * @param name the VM option name
  50      */
  51     public DynamicVMOption(String name) {
  52         this.name = name;
  53         mxBean = ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class);
  54     }
  55 
  56     /**
  57      * Sets a new value for the option.
  58      * Trying to set not applicable value will cause IllegalArgumentException.
  59      * Behavior with null is undefined, most likely NPE will be thrown.
  60      *
  61      * @param newValue the value to be set
  62      * @see #getValue()
  63      * @throws IllegalArgumentException if newValue is not applicable to the option
  64      */
  65     public final void setValue(String newValue) {
  66         mxBean.setVMOption(name, newValue);
  67     }
  68 
  69     /**
  70      * Returns the value of option.
  71      *
  72      * @return the current option value
  73      * @see #setValue(java.lang.String)
  74      */
  75     public final String getValue() {
  76         return mxBean.getVMOption(name).getValue();
  77     }
  78 
  79     /**
  80      * Returns true, if option is writable, false otherwise.
  81      *
  82      * @return true, if option is writable, false otherwise
  83      */
  84     public final boolean isWriteable() {
  85         return mxBean.getVMOption(name).isWriteable();
  86     }
  87 
  88     /**
  89      * Checks if the given value is applicable for the option.
  90      *
  91      * This method tries to set the option to the new value. If no exception
  92      * has been thrown the value is treated as valid.
  93      *
  94      * Calling this method will not change the option value. After an attempt
  95      * to set a new value, the option will be restored to its previous value.
  96      *
  97      * @param value the value to verify
  98      * @return true if option could be set to the given value
  99      */
 100     public boolean isValidValue(String value) {
 101         boolean isValid = true;
 102         String oldValue = getValue();
 103         try {
 104             setValue(value);
 105         } catch (NullPointerException e) {
 106             if (value == null) {
 107                 isValid = false;
 108             }
 109         } catch (IllegalArgumentException e) {
 110             isValid = false;
 111         } finally {
 112             setValue(oldValue);
 113         }
 114         return isValid;
 115     }
 116 
 117     /**
 118      * Returns the value of the given VM option as String.
 119      *
 120      * This is a simple shortcut for {@code new DynamicVMOption(name).getValue()}
 121      *
 122      * @param name the name of VM option
 123      * @return value as a string
 124      * @see #getValue()
 125      */
 126     public static String getString(String name) {
 127         return new DynamicVMOption(name).getValue();
 128     }
 129 
 130     /**
 131      * Returns the value of the given option as int.
 132      *
 133      * @param name the name of VM option
 134      * @return value parsed as integer
 135      * @see #getString(java.lang.String)
 136      *
 137      */
 138     public static int getInt(String name) {
 139         return Integer.parseInt(getString(name));
 140     }
 141 
 142     /**
 143      * Sets the VM option to a new value.
 144      *
 145      * This is a simple shortcut for {@code new DynamicVMOption(name).setValue(value)}
 146      *
 147      * @param name the name of VM option
 148      * @param value the value to be set
 149      * @see #setValue(java.lang.String)
 150      */
 151     public static void setString(String name, String value) {
 152         new DynamicVMOption(name).setValue(value);
 153     }
 154 
 155     /**
 156      * Sets the VM option value to a new integer value.
 157      *
 158      * @param name the name of VM option
 159      * @param value the integer value to be set
 160      * @see #setString(java.lang.String, java.lang.String)
 161      */
 162     public static void setInt(String name, int value) {
 163         new DynamicVMOption(name).setValue(Integer.toString(value));
 164     }
 165 
 166 }