001 package org.maltparser.core.options.option;
002
003 import java.util.Formatter;
004 import java.util.HashMap;
005 import java.util.TreeSet;
006
007 import org.maltparser.core.exception.MaltChainedException;
008 import org.maltparser.core.options.OptionException;
009 import org.maltparser.core.options.OptionGroup;
010
011 /**
012 * An enumerate option is an option that can only contain string value, which is in the legal value set.
013 *
014 * @author Johan Hall
015 * @since 1.0
016 **/
017 public class EnumOption extends Option {
018 private String defaultValue;
019 private TreeSet<String> legalValues;
020 private HashMap<String,String> legalValueDesc;
021
022 /**
023 * Creates an enumerate option description
024 *
025 * @param group a reference to the option group.
026 * @param name the name of the option.
027 * @param shortDescription a short description of the option.
028 * @param flag a short string that can be used in the command line.
029 * @param usage a string that explains the usage of the option.
030 * @throws OptionException
031 */
032 public EnumOption(OptionGroup group,
033 String name,
034 String shortDescription,
035 String flag,
036 String usage) throws MaltChainedException {
037 super(group, name, shortDescription, flag, usage);
038 legalValues = new TreeSet<String>();
039 legalValueDesc = new HashMap<String,String>();
040 }
041
042 /* (non-Javadoc)
043 * @see org.maltparser.core.options.option.Option#getValueObject(java.lang.String)
044 */
045 public Object getValueObject(String value) throws MaltChainedException {
046 if (value == null) {
047 return null;
048 } else if (legalValues.contains(value)) {
049 return new String(value);
050 } else {
051 throw new OptionException("'"+value+"' is not a legal value for the '"+getName()+"' option. ");
052 }
053 }
054
055 /* (non-Javadoc)
056 * @see org.maltparser.core.options.option.Option#getDefaultValueObject()
057 */
058 public Object getDefaultValueObject() throws MaltChainedException {
059 return new String(defaultValue);
060 }
061
062 /* (non-Javadoc)
063 * @see org.maltparser.core.options.option.Option#getDefaultValueString()
064 */
065 public String getDefaultValueString() {
066 return defaultValue.toString();
067 }
068
069 /* (non-Javadoc)
070 * @see org.maltparser.core.options.option.Option#setDefaultValue(java.lang.String)
071 */
072 public void setDefaultValue(String defaultValue) throws MaltChainedException {
073 if (defaultValue == null) {
074 if (legalValues.isEmpty()) {
075 throw new OptionException("The default value of the '"+getName()+"' option is null and the legal value set is empty.");
076 } else {
077 this.defaultValue = legalValues.first();
078 }
079 } else if (legalValues.contains(defaultValue.toLowerCase())) {
080 this.defaultValue = defaultValue.toLowerCase();
081 } else {
082 throw new OptionException("The default value '"+defaultValue+"' for the '"+getName()+"' option is not a legal value. ");
083 }
084 }
085
086 /**
087 * Adds a legal value
088 *
089 * @param value a legal value name
090 * @param desc a short description of the legal value
091 * @throws OptionException
092 */
093 public void addLegalValue(String value, String desc) throws MaltChainedException {
094 if (value == null || value.equals("")) {
095 throw new OptionException("The legal value is missing for the '"+getName()+"' option. ");
096 } else if (legalValues.contains(value.toLowerCase())) {
097 throw new OptionException("The legal value '"+value+"' already exists for the '"+getName()+"' option. ");
098 } else {
099 legalValues.add(value.toLowerCase());
100 if (desc == null || desc.equals("")) {
101 legalValueDesc.put(value.toLowerCase(), "Description is missing. ");
102 } else {
103 legalValueDesc.put(value.toLowerCase(), desc);
104 }
105 }
106 }
107
108 /**
109 * Adds a legal value without a description
110 *
111 * @param value a legal value name
112 * @throws OptionException
113 */
114 public void addLegalValue(String value) throws MaltChainedException {
115 addLegalValue(value, null);
116 }
117
118 /* (non-Javadoc)
119 * @see org.maltparser.core.options.option.Option#getStringRepresentation(java.lang.Object)
120 */
121 public String getStringRepresentation(Object value) {
122 if (value instanceof String && legalValues.contains(value)) {
123 return value.toString();
124 }
125 return null;
126 }
127
128 /* (non-Javadoc)
129 * @see org.maltparser.core.options.option.Option#toString()
130 */
131 public String toString() {
132 final StringBuilder sb = new StringBuilder();
133 sb.append(super.toString());
134 Formatter formatter = new Formatter(sb);
135 for (String value : legalValues) {
136 formatter.format("%2s%-10s - %-20s\n", "", value, legalValueDesc.get(value));
137 }
138 sb.append("-----------------------------------------------------------------------------\n");
139 return sb.toString();
140 }
141 }