001 /* 002 * This file is part of the Jikes RVM project (http://jikesrvm.org). 003 * 004 * This file is licensed to You under the Eclipse Public License (EPL); 005 * You may not use this file except in compliance with the License. You 006 * may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/eclipse-1.0.php 009 * 010 * See the COPYRIGHT.txt file distributed with this work for information 011 * regarding copyright ownership. 012 */ 013 package org.vmutil.options; 014 015 /** 016 * The abstract base class for all options. This class also has 017 * the static interfaces to access the options system to set 018 * option values. 019 * <p> 020 * All options within the system should have a unique name. No 021 * two options shall have a name that is the same when a case 022 * insensitive comparison between the names with spaces removed 023 * is performed. Only basic alphanumeric characters and spaces 024 * are allowed. 025 * <p> 026 * The VM is required to provide a one way mapping function that 027 * takes the name and creates a VM style name, such as mapping 028 * "No Finalizer" to noFinalizer. The VM may not remove any letters 029 * when performing this mapping but may remove spaces and change 030 * the case of any character. 031 */ 032 public abstract class Option { 033 // Option types 034 public static final int BOOLEAN_OPTION = 1; 035 public static final int STRING_OPTION = 2; 036 public static final int ENUM_OPTION = 3; 037 public static final int INT_OPTION = 4; 038 public static final int PAGES_OPTION = 6; 039 public static final int MICROSECONDS_OPTION = 7; 040 public static final int FLOAT_OPTION = 8; 041 public static final int ADDRESS_OPTION = 9; 042 043 /* 044 * The possible output formats 045 */ 046 public static final int READABLE = 0; 047 public static final int RAW = 1; 048 public static final int XML = 2; 049 050 // Per option values 051 private int type; 052 private String name; 053 private String description; 054 private String key; 055 private Option next; 056 057 protected OptionSet set; 058 059 /** 060 * Construct a new option. This also calls the VM to map the option's 061 * name into a unique option key and links it onto the option list. 062 * 063 * @param set The option set this option belongs to. 064 * @param type The option type as defined in this class. 065 * @param name The unique name of the option. 066 * @param description A short description of the option and purpose. 067 */ 068 protected Option(OptionSet set, int type, String name, String description) { 069 this.type = type; 070 this.name = name; 071 this.description = description; 072 this.set = set; 073 this.key = set.register(this, name); 074 } 075 076 /** 077 * Return the VM determined key for an option 078 * 079 * @return The key. 080 */ 081 public String getKey() { 082 return this.key; 083 } 084 085 /** 086 * Update the next pointer in the Option chain. 087 */ 088 void setNext(Option o) { 089 next = o; 090 } 091 092 /** 093 * Return the next option in the linked list. 094 * 095 * @return The next option or null if this is the last option. 096 */ 097 public Option getNext() { 098 return this.next; 099 } 100 101 /** 102 * Return the name for the option. 103 * 104 * @return The option name. 105 */ 106 public String getName() { 107 return this.name; 108 } 109 110 /** 111 * Return the option description. 112 * 113 * @return The option description. 114 */ 115 public String getDescription() { 116 return this.description; 117 } 118 119 /** 120 * Return the type of the option. 121 * 122 * @return The option type. 123 */ 124 public int getType() { 125 return this.type; 126 } 127 128 /** 129 * This is a validation method that can be implemented by leaf option 130 * classes to provide additional validation. This should not be implemented 131 * at other levels within the hierarchy to avoid confusion. The validate 132 * method works against the current value of the option (post-set). 133 */ 134 protected void validate() {} 135 136 /** 137 * A fatal error occurred during the setting of an option. This method 138 * calls into the VM and is required to cause the system to stop. 139 * 140 * @param message The error message associated with the failure. 141 */ 142 protected void fail(String message) { 143 set.fail(this, message); 144 } 145 146 /** 147 * Fail if a specified condition is met. 148 * 149 * @param condition The condition that indicates failure. 150 * @param message The error message associated with the failure. 151 */ 152 protected void failIf(boolean condition, String message) { 153 if (condition) set.fail(this, message); 154 } 155 156 /** 157 * A non-fatal error occurred during the setting of an option. This method 158 * calls into the VM and shall not cause the system to stop. 159 * 160 * @param message The message associated with the warning. 161 */ 162 protected void warn(String message) { 163 set.warn(this, message); 164 } 165 166 /** 167 * Warn if a specified condition is met. 168 * 169 * @param condition The condition that indicates warning. 170 * @param message The message associated with the warning. 171 */ 172 protected void warnIf(boolean condition, String message) { 173 if (condition) set.warn(this, message); 174 } 175 } 176