1 23 24 29 package com.sun.cli.jmx.cmd; 30 31 import java.util.HashMap ; 32 import java.util.Iterator ; 33 34 35 36 public class ArgHelperOptionsInfo implements ArgHelper.OptionsInfo 37 { 38 final HashMap mOptionDescriptions; 39 40 public 41 ArgHelperOptionsInfo( ) 42 throws ArgHelper.IllegalOptionException 43 { 44 mOptionDescriptions = new HashMap (); 45 } 46 47 public 48 ArgHelperOptionsInfo( String options ) 49 throws ArgHelper.IllegalOptionException 50 { 51 mOptionDescriptions = new HashMap (); 52 53 addOptions( options ); 54 } 55 56 public String 57 tokenToOptionName( String token ) 58 { 59 final int delimIndex = token.indexOf( '=' ); 60 61 String name = token; 62 63 if ( delimIndex > 0 ) 64 { 65 name = token.substring( 0, delimIndex ); 66 } 67 68 return( name ); 69 } 70 71 public String 72 tokenToOptionData( String token ) 73 { 74 final int delimIndex = token.indexOf( '=' ); 75 76 String data = null; 78 if ( delimIndex > 0 ) 79 { 80 data = token.substring( delimIndex + 1, token.length() ); 82 } 83 84 return( data ); 85 } 86 87 private static void 88 dm( Object o ) 89 { 90 System.out.println( o.toString() ); 91 } 92 93 OptionDesc 94 findOptionDesc( String token ) 95 { 96 final String optionName = tokenToOptionName( OptionDesc.mapName( token ) ); 97 98 return( (OptionDesc)mOptionDescriptions.get( optionName ) ); 99 } 100 101 public boolean 102 isLegalOption( String token ) 103 { 104 if ( ! token.startsWith( "-" ) ) 105 { 106 return( false ); 107 } 108 109 final boolean isLegal = (findOptionDesc( token ) != null); 110 111 return( isLegal ); 112 } 113 114 public void 115 checkLegalOption( String token ) 116 { 117 if ( ! isLegalOption( token ) ) 118 { 119 throw new IllegalArgumentException ( "illegal option: " + token ); 120 } 121 } 122 123 public int 124 getNumValues( String token ) 125 { 126 checkLegalOption( token ); 127 128 final OptionDesc info = findOptionDesc( token ); 129 130 return( info.mNumValues ); 131 } 132 133 public boolean 134 isBoolean( String token ) 135 { 136 checkLegalOption( token ); 137 138 final OptionDesc info = findOptionDesc( token ); 139 140 return( info.mIsBoolean ); 141 } 142 143 public void 144 foundIllegalOption( final String token ) 145 throws ArgHelper.IllegalOptionException 146 { 147 throw new ArgHelper.IllegalOptionException( "illegal option: " + token ); 148 } 149 150 boolean 151 exists( final String optionName ) 152 { 153 return( mOptionDescriptions.get( optionName ) != null ); 154 } 155 156 void 157 checkExists( final String optionName ) 158 { 159 if ( exists( optionName ) ) 160 { 161 throw new IllegalArgumentException ( "can't add same option twice: " + optionName ); 162 } 163 } 164 165 void 166 add( final OptionDesc desc ) 167 { 168 checkExists( desc.mName ); 169 170 mOptionDescriptions.put( desc.mName, desc ); 171 } 172 173 public void 174 addBoolean( final String name ) 175 throws ArgHelper.IllegalOptionException 176 { 177 add( new OptionDesc( name ) ); 178 } 179 180 181 public void 182 addNonBoolean( final String name, final int numValues ) 183 throws ArgHelper.IllegalOptionException 184 { 185 add( new OptionDesc( name, numValues ) ); 186 } 187 188 189 public final static char MULTIPLE_DELIM = ' '; 190 public final static char NUMVALUES_DELIM = ','; 191 192 public void 193 addOptions( String list ) 194 throws ArgHelper.IllegalOptionException 195 { 196 final String [] names = list.split(" "); 197 198 for( int i = 0; i < names.length; ++i ) 199 { 200 final String [] data = names[ i ].split( "" + NUMVALUES_DELIM ); 201 202 if ( data.length == 1 ) 203 { 204 addBoolean( data[ 0 ] ); 205 } 206 else 207 { 208 addNonBoolean( data[ 0 ], new Integer ( data[ 1 ] ).intValue() ); 209 } 210 } 211 } 212 213 214 215 public final static class OptionDesc 216 { 217 public String mName; public int mNumValues; 219 public boolean mIsBoolean; 220 221 222 boolean 223 isLegalOptionNameChar( final char theChar ) 224 { 225 return( (theChar >= 'a' && theChar <= 'z') || 226 (theChar >= 'A' && theChar <= 'Z') || 227 (theChar >= '0' && theChar <= '9') || 228 ( theChar == '-' || theChar == '_' || theChar == '.' ) 229 ); 230 } 231 232 void 233 validateName( String name ) 234 throws ArgHelper.IllegalOptionException 235 { 236 final boolean isLongOption = name.startsWith( "--" ); 237 final boolean isShortOption = (! isLongOption) && name.startsWith( "-" ); 238 final int length = name.length(); 239 240 if ( ! (isLongOption || isShortOption) ) 241 { 242 throw new ArgHelper.IllegalOptionException( "invalid option name: " + name ); 243 } 244 245 if ( isShortOption && length != 2 ) 246 { 247 throw new ArgHelper.IllegalOptionException( "invalid short option name: " + name ); 248 } 249 250 for( int i = 0; i < length; ++i ) 251 { 252 final char theChar = name.charAt( i ); 253 254 if ( ! isLegalOptionNameChar( theChar ) ) 255 { 256 throw new ArgHelper.IllegalOptionException( "invalid character '" + 257 theChar + "' in option name: " + name ); 258 } 259 } 260 } 261 262 OptionDesc( String name, int numValues ) 263 throws ArgHelper.IllegalOptionException 264 { 265 mName = mapName( name ); 266 267 validateName( mName ); 268 269 if ( numValues == 0 ) 270 { 271 throw new IllegalArgumentException ( "use OptionDesc( name ) for boolean options" ); 272 } 273 274 mNumValues = numValues; 275 mIsBoolean = false; 276 } 277 278 OptionDesc( String name ) 279 throws ArgHelper.IllegalOptionException 280 { 281 mName = mapName( name ); 282 283 validateName( mName ); 284 285 mIsBoolean = true; 286 mNumValues = 1; 287 } 288 289 static String 290 mapName( String name ) 291 { 292 String mappedName = name; 293 294 if ( ! name.startsWith( "-" ) ) 295 { 296 final String prefix = (name.length() == 1) ? "-" : "--"; 297 298 mappedName = prefix + name; 299 } 300 return( mappedName ); 301 } 302 303 public String 304 toString() 305 { 306 if ( mIsBoolean ) 307 { 308 return( mName + ":boolean" ); 309 } 310 return( mName + ":" + mNumValues + " values" ); 311 } 312 } 313 314 } 315 316 | Popular Tags |