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    }