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 import org.vmmagic.pragma.Uninterruptible; 016 017 /** 018 * An option that is a selection of several strings. The mapping 019 * between strings and integers is determined using indexes into 020 * a string array. 021 * <p> 022 * Enumerations are case sensitive. 023 */ 024 public class EnumOption extends Option { 025 // values 026 protected int defaultValue; 027 protected int value; 028 protected String[] values; 029 030 /** 031 * Create a new enumeration option. 032 * 033 * @param set The option set this option belongs to. 034 * @param name The space separated name for the option. 035 * @param description The purpose of the option. 036 * @param values A mapping of int to string for the enum. 037 * @param defaultValue The default value of the option. 038 */ 039 protected EnumOption(OptionSet set, String name, String description, String[] values, String defaultValue) { 040 super(set, ENUM_OPTION, name, description); 041 this.values = values; 042 this.value = this.defaultValue = findValue(defaultValue); 043 } 044 045 /** 046 * Search for a string in the enumeration. 047 * 048 * @return The index of the passed string. 049 */ 050 private int findValue(String string) { 051 for (int i = 0; i < values.length; i++) { 052 if (values[i].equals(string)) { 053 return i; 054 } 055 } 056 fail("Invalid Enumeration Value"); 057 return -1; 058 } 059 060 /** 061 * Read the current value of the option. 062 * 063 * @return The option value. 064 */ 065 @Uninterruptible 066 public int getValue() { 067 return this.value; 068 } 069 070 /** 071 * Read the string for the current value of the option. 072 * 073 * @return The option value. 074 */ 075 @Uninterruptible 076 public String getValueString() { 077 return this.values[this.value]; 078 } 079 080 /** 081 * Read the default value of the option. 082 * 083 * @return The default value. 084 */ 085 @Uninterruptible 086 public int getDefaultValue() { 087 return this.defaultValue; 088 } 089 090 /** 091 * Read the string for the default value of the option. 092 * 093 * @return The default value. 094 */ 095 @Uninterruptible 096 public String getDefaultValueString() { 097 return this.values[this.defaultValue]; 098 } 099 100 /** 101 * Update the value of the option, echoing the change if the echoOptions 102 * option is set. This method also calls the validate method to allow 103 * subclasses to perform any required validation. 104 * 105 * @param value The new value for the option. 106 */ 107 public void setValue(int value) { 108 this.value = value; 109 validate(); 110 set.logChange(this); 111 } 112 113 /** 114 * Look up the value for a string and update the value of the option 115 * accordingly, echoing the change if the echoOptions option is set. 116 * This method also calls the validate method to allow subclasses to 117 * perform any required validation. 118 * 119 * @param value The new value for the option. 120 */ 121 public void setValue(String value) { 122 setValue(findValue(value)); 123 } 124 125 /** 126 * Modify the default value of the option. 127 * 128 * @param value The new default value for the option. 129 */ 130 public void setDefaultValue(String value) { 131 this.value = this.defaultValue = findValue(value); 132 } 133 134 /** 135 * Return the array of allowed enumeration values. 136 * 137 * @return The values array. 138 */ 139 public String[] getValues() { 140 return this.values; 141 } 142 }