001 /* 002 * Copyright 2003-2005 The Apache Software Foundation 003 * Copyright 2005 Stephen McConnell 004 * 005 * Licensed under the Apache License, Version 2.0 (the "License"); 006 * you may not use this file except in compliance with the License. 007 * You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package net.dpml.cli.validation; 018 019 import java.util.Iterator; 020 import java.util.List; 021 import java.util.Set; 022 023 import net.dpml.cli.resource.ResourceConstants; 024 import net.dpml.cli.resource.ResourceHelper; 025 026 /** 027 * The <code>EnumValidator</code> validates the string argument 028 * values are valid. 029 * 030 * The following example shows how to limit the valid values 031 * for the color argument to 'red', 'green', or 'blue'. 032 * 033 * <pre> 034 * Set values = new HashSet(); 035 * values.add("red"); 036 * values.add("green"); 037 * values.add("blue"); 038 * ... 039 * ArgumentBuilder builder = new ArgumentBuilder(); 040 * Argument color = 041 * builder.withName("color"); 042 * .withValidator(new EnumValidator(values)); 043 * </pre> 044 * 045 * @author <a href="http://www.dpml.net">Digital Product Meta Library</a> 046 * @version 1.0.0 047 */ 048 public class EnumValidator implements Validator 049 { 050 /** List of permitted values */ 051 private Set m_validValues; 052 053 /** 054 * Creates a new EnumValidator for the specified values. 055 * 056 * @param values The list of permitted values 057 */ 058 public EnumValidator( final Set values ) 059 { 060 setValidValues( values ); 061 } 062 063 /** 064 * Validate the list of values against the list of permitted values. 065 * 066 * @param values the list of values to validate 067 * @exception InvalidArgumentException if a value is invalid 068 * @see net.dpml.cli.validation.Validator#validate(java.util.List) 069 */ 070 public void validate( final List values ) throws InvalidArgumentException 071 { 072 for( final Iterator iter = values.iterator(); iter.hasNext();) 073 { 074 final String value = (String) iter.next(); 075 if( !m_validValues.contains( value ) ) 076 { 077 throw new InvalidArgumentException( 078 ResourceHelper.getResourceHelper().getMessage( 079 ResourceConstants.ENUM_ILLEGAL_VALUE, 080 new Object[]{value, getValuesAsString()} ) ); 081 } 082 } 083 } 084 085 /** 086 * Returns the permitted values in a comma separated String 087 * 088 * @return String formatted list of values 089 */ 090 String getValuesAsString() 091 { 092 final StringBuffer buff = new StringBuffer(); 093 buff.append( "[" ); 094 for( final Iterator iter = m_validValues.iterator(); iter.hasNext();) 095 { 096 buff.append( "'" ).append( iter.next() ).append( "'" ); 097 if( iter.hasNext() ) 098 { 099 buff.append( ", " ); 100 } 101 } 102 buff.append( "]" ); 103 return buff.toString(); 104 } 105 106 /** 107 * Returns the Set of valid argument values. 108 * 109 * @return Returns the Set of valid argument values. 110 */ 111 public Set getValidValues() 112 { 113 return m_validValues; 114 } 115 116 /** 117 * Specifies the Set of valid argument values. 118 * 119 * @param validValues The Set of valid argument values. 120 */ 121 protected void setValidValues( Set validValues ) 122 { 123 m_validValues = validValues; 124 } 125 }