/* * Copyright (c) 2003-2012 Fred Hutchinson Cancer Research Center * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.fhcrc.cpl.toolbox.commandline.arguments; import javax.swing.*; import java.awt.*; import java.util.ArrayList; /** * Validates arguments against an explicitly enumerated list of String values. Can be done * with or without case-sensitivity */ public class EnumeratedValuesArgumentDefinition extends BaseArgumentDefinitionImpl implements CommandLineArgumentDefinition { protected String[] mEnumeratedValues; protected boolean mCaseSensitive = false; public EnumeratedValuesArgumentDefinition(String argumentName) { super(argumentName); } /** * By default, validation is done without case sensitivity * @param argumentName * @param enumeratedValues */ public EnumeratedValuesArgumentDefinition(String argumentName, String[] enumeratedValues) { this(argumentName); mEnumeratedValues = enumeratedValues; } public EnumeratedValuesArgumentDefinition(String argumentName, String[] enumeratedValues, String help) { super(argumentName, help); mEnumeratedValues = enumeratedValues; } public EnumeratedValuesArgumentDefinition(String argumentName, String[] enumeratedValues, boolean caseSensitive) { this(argumentName); mEnumeratedValues = enumeratedValues; mCaseSensitive = caseSensitive; } public EnumeratedValuesArgumentDefinition(String argumentName, boolean required, String help, String[] enumeratedValues) { this(argumentName, enumeratedValues); this.setHelpText(help); this.setRequired(required); } public EnumeratedValuesArgumentDefinition(String argumentName, boolean required, String help, String[] enumeratedValues, boolean caseSensitive) { this(argumentName, enumeratedValues, caseSensitive); this.setHelpText(help); this.setRequired(required); } public EnumeratedValuesArgumentDefinition(String argumentName, boolean required, String help, String[] enumeratedValues, String defaultValue) { this(argumentName, required, help, enumeratedValues); this.setDefaultValue(defaultValue); } public EnumeratedValuesArgumentDefinition(String argumentName, boolean required, String help, String[] enumeratedValues, boolean caseSensitive, String defaultValue) { this(argumentName, required, help, enumeratedValues, caseSensitive); this.setDefaultValue(defaultValue); } public EnumeratedValuesArgumentDefinition(String argumentName, boolean required, String[] enumeratedValues, String[] valueExplanations) { StringBuffer helpTextBuf = new StringBuffer("\n"); for (int i=0; i< enumeratedValues.length; i++) { helpTextBuf.append("\t\t" + enumeratedValues[i] + ":\t" + valueExplanations[i] + "\n"); } mEnumeratedValues = enumeratedValues; setRequired(required); setHelpText(helpTextBuf.toString()); mArgumentName = argumentName.toLowerCase(); } public EnumeratedValuesArgumentDefinition(String argumentName, boolean required, String[] enumeratedValues, String[] valueExplanations, boolean caseSensitive) { this(argumentName, required, enumeratedValues, valueExplanations); mCaseSensitive = caseSensitive; } public EnumeratedValuesArgumentDefinition(String argumentName, boolean required, String[] enumeratedValues, String[] valueExplanations, boolean caseSensitive, String defaultValue) { this(argumentName, required, enumeratedValues, valueExplanations, caseSensitive); setDefaultValue(defaultValue); } public EnumeratedValuesArgumentDefinition(String argumentName, boolean required, String[] enumeratedValues, String[] valueExplanations, String defaultValue) { this(argumentName, required, enumeratedValues, valueExplanations); setDefaultValue(defaultValue); } /** * Try to match the argument against the set of allowed values, either with or without case-sensitivity * @param argumentValue * @return the argument as a String */ public String convertArgumentValue(String argumentValue) throws ArgumentValidationException { return mEnumeratedValues[getIndexForArgumentValue(argumentValue)]; } /** * Get the index into the enumerated values array for the element that matches * the passed-in argumentValue. If nothing matches, throw an exception * @param argumentValue * @return */ public int getIndexForArgumentValue(String argumentValue) throws ArgumentValidationException { int result = -1; for (int i=0; i<mEnumeratedValues.length; i++) { String testValue = mEnumeratedValues[i]; if (mCaseSensitive) { if (testValue.equals(argumentValue)) { result = i; break; } } else { if (testValue.equalsIgnoreCase(argumentValue)) { result = i; break; } } } if (result < 0) { StringBuffer exceptionSB = new StringBuffer("Argument value " + argumentValue + " is not an allowed value for parameter \"" + getArgumentName() + "\".\nAllowed values are:\n"); for (String allowedValue : mEnumeratedValues) exceptionSB.append("\t" + allowedValue + "\n"); throw new ArgumentValidationException(exceptionSB.toString()); } return result; } /** * Get all the enumerated values, in order. If there's a default, pluck it out of order and put it first * @return */ public String[] getEnumeratedValuesDefaultFirst() { if (mDefaultValue == null) return getEnumeratedValues(); java.util.List<String> resultList = new ArrayList<String>(); String defaultString = (String) mDefaultValue; resultList.add(defaultString); for (String value : getEnumeratedValues()) { if (!defaultString.equals(value)) resultList.add(value); } return resultList.toArray(new String[resultList.size()]); } public String[] getEnumeratedValues() { return mEnumeratedValues; } public void setEnumeratedValues(String[] mEnumeratedValues) { this.mEnumeratedValues = mEnumeratedValues; } public String getValueDescriptor() { String valueString = "<"; for (int i=0; i<getEnumeratedValues().length; i++) { valueString = valueString + getEnumeratedValues()[i]; if (i < (getEnumeratedValues().length - 1)) valueString = valueString + " | "; } valueString = valueString + ">"; return valueString; } public String getValueFromGUIComponent(JComponent component) { return (String) ((JComboBox) component).getSelectedItem(); } public JComponent addComponentsForGUI(Container parent, JDialog parentDialog, String defaultValue) { JPanel fieldPanel = new JPanel(); JComboBox comboBox = new JComboBox(); for (String allowedValue : getEnumeratedValues()) comboBox.addItem(allowedValue); if (defaultValue != null && defaultValue.length() > 0) comboBox.setSelectedItem(defaultValue); GridBagConstraints argComponentGBC = new GridBagConstraints(); argComponentGBC.anchor = GridBagConstraints.LINE_START; argComponentGBC.gridwidth = GridBagConstraints.REMAINDER; argComponentGBC.insets = new Insets(5,0,0,0); fieldPanel.add(comboBox, argComponentGBC); parent.add(fieldPanel, argComponentGBC); return comboBox; } }