blob: 50339ce65ff534fb07174b957965b18940889ca5 [file] [log] [blame]
/*
* This file is part of the Jikes RVM project (http://jikesrvm.org).
*
* This file is licensed to You under the Common Public License (CPL);
* You may not use this file except in compliance with the License. You
* may obtain a copy of the License at
*
* http://www.opensource.org/licenses/cpl1.0.php
*
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership.
*/
package org.vmutil.options;
/**
* The abstract base class for all options. This class also has
* the static interfaces to access the options system to set
* option values.
*
* All options within the system should have a unique name. No
* two options shall have a name that is the same when a case
* insensitive comparison between the names with spaces removed
* is performed. Only basic alphanumeric characters and spaces
* are allowed.
*
* The VM is required to provide a one way mapping function that
* takes the name and creates a VM style name, such as mapping
* "No Finalizer" to noFinalizer. The VM may not remove any letters
* when performing this mapping but may remove spaces and change
* the case of any character.
*/
public abstract class Option {
// Option types
public static final int BOOLEAN_OPTION = 1;
public static final int STRING_OPTION = 2;
public static final int ENUM_OPTION = 3;
public static final int INT_OPTION = 4;
public static final int PAGES_OPTION = 6;
public static final int MICROSECONDS_OPTION = 7;
public static final int FLOAT_OPTION = 8;
public static final int ADDRESS_OPTION = 9;
/**
* The possible output formats
*/
public static final int READABLE = 0;
public static final int RAW = 1;
public static final int XML = 2;
// Per option values
private int type;
private String name;
private String description;
private String key;
private Option next;
protected OptionSet set;
/**
* Construct a new option. This also calls the VM to map the option's
* name into a unique option key and links it onto the option list.
*
* @param set The option set this option belongs to.
* @param type The option type as defined in this class.
* @param name The unique name of the option.
* @param description A short description of the option and purpose.
*/
protected Option(OptionSet set, int type, String name, String description) {
this.type = type;
this.name = name;
this.description = description;
this.set = set;
this.key = set.register(this, name);
}
/**
* Return the VM determined key for an option
*
* @return The key.
*/
public String getKey() {
return this.key;
}
/**
* Update the next pointer in the Option chain.
*/
void setNext(Option o) {
next = o;
}
/**
* Return the next option in the linked list.
*
* @return The next option or null if this is the last option.
*/
public Option getNext() {
return this.next;
}
/**
* Return the name for the option.
*
* @return The option name.
*/
public String getName() {
return this.name;
}
/**
* Return the option description.
*
* @return The option description.
*/
public String getDescription() {
return this.description;
}
/**
* Return the type of the option.
*
* @return The option type.
*/
public int getType() {
return this.type;
}
/**
* This is a validation method that can be implemented by leaf option
* classes to provide additional validation. This should not be implemented
* at other levels within the heirarchy to avoid confusion. The validate
* method works against the current value of the option (post-set).
*/
protected void validate() {}
/**
* A fatal error occurred during the setting of an option. This method
* calls into the VM and is required to cause the system to stop.
*
* @param message The error message associated with the failure.
*/
protected void fail(String message) {
set.fail(this, message);
}
/**
* Fail if a specified condition is met.
*
* @param condition The condition that indicates failure.
* @param message The error message associated with the failure.
*/
protected void failIf(boolean condition, String message) {
if (condition) set.fail(this, message);
}
/**
* A non-fatal error occurred during the setting of an option. This method
* calls into the VM and shall not cause the system to stop.
*
* @param message The message associated with the warning.
*/
protected void warn(String message) {
set.warn(this, message);
}
/**
* Warn if a specified condition is met.
*
* @param condition The condition that indicates warning.
* @param message The message associated with the warning.
*/
protected void warnIf(boolean condition, String message) {
if (condition) set.warn(this, message);
}
}