1 23 24 29 30 package com.sun.cli.jmx.cmd; 31 32 import java.util.ArrayList ; 33 import java.util.Iterator ; 34 35 import com.sun.cli.util.stringifier.IteratorStringifier; 36 37 import com.sun.cli.jmx.spi.JMXConnectorProvider; 38 import com.sun.cli.util.ClassUtil; 39 40 41 public class ConfigureCmd extends JMXCmd 42 { 43 public final static char CLASSNAME_DELIM = ','; 44 45 public 46 ConfigureCmd( final CmdEnv env ) 47 { 48 super( env ); 49 } 50 51 int 52 getNumRequiredOperands() 53 { 54 return( 0 ); 55 } 56 57 58 String 59 getUsage() 60 { 61 return( CmdStrings.CONFIGURE_HELP.toString() ); 62 } 63 64 public final static String NAME = "configure"; 65 public final static String SHOW_CONFIG = "show-config"; 66 public final static String ADD_PROVIDER = "add-provider"; 67 public final static String REMOVE_PROVIDER = "remove-provider"; 68 public final static String ADD_CMD = "add-cmd"; 69 public final static String REMOVE_CMD = "remove-cmd"; 70 71 private final static String [] NAMES = new String [] 72 { 73 NAME, SHOW_CONFIG, ADD_PROVIDER, REMOVE_PROVIDER, ADD_CMD, REMOVE_CMD 74 }; 75 76 public static String [] 77 getNames( ) 78 { 79 return( NAMES ); 80 } 81 82 83 static private final String OPTIONS_INFO = ""; 84 85 86 ArgHelper.OptionsInfo 87 getOptionInfo() 88 throws ArgHelper.IllegalOptionException 89 { 90 return( new ArgHelperOptionsInfo( OPTIONS_INFO ) ); 91 } 92 93 static class ClassList 94 { 95 final ArrayList mItems; 96 97 ClassList( String providersString ) 98 { 99 mItems = new ArrayList (); 100 101 if ( providersString != null ) 102 { 103 final String [] list = providersString.trim().split( "" + CLASSNAME_DELIM ); 104 105 for ( int i = 0; i < list.length; ++i ) 107 { 108 mItems.add( list[ i ] ); 109 } 110 } 111 } 112 113 public String 114 toString() 115 { 116 return( IteratorStringifier.stringify( mItems.iterator(), "" + CLASSNAME_DELIM ) ); 117 } 118 119 public String [] 120 toArray() 121 { 122 return( (String [])mItems.toArray( new String [ mItems.size() ] ) ); 123 } 124 125 public boolean 126 exists( String name ) 127 { 128 return( mItems.contains( name ) ); 129 } 130 131 public Iterator 132 iterator() 133 { 134 return( mItems.iterator() ); 135 } 136 137 public void 138 add( String name ) 139 { 140 mItems.add( 0, name ); 142 } 143 144 public void 145 remove( String name ) 146 { 147 mItems.remove( name ); 149 } 150 } 151 152 ClassList 153 createProviderList() 154 { 155 return( new ClassList( (String )envGet( ENV_PROVIDERS ) ) ); 156 } 157 158 ClassList 159 createCmdList() 160 { 161 return( new ClassList( (String )envGet( ENV_COMMANDS ) ) ); 162 } 163 164 boolean 165 isLegalClassname( String name ) 166 { 167 return( name.indexOf( CLASSNAME_DELIM ) < 0 ); 169 } 170 171 void 172 addProvider( ) 173 throws Exception 174 { 175 requireNumOperands( 1, "A provider classname must be specified"); 176 177 final String providerClassname = getOperands()[ 0 ]; 178 179 ClassList list = createProviderList(); 180 181 if ( list.exists( providerClassname ) ) 182 { 183 println( "Provider already in list: " + providerClassname ); 184 } 185 else if ( ! isLegalClassname( providerClassname ) ) 186 { 187 printError( "Illegal classname: " + providerClassname ); 188 } 189 else 190 { 191 try 193 { 194 getConnectionMgr().addProvider( Class.forName( providerClassname ) ); 195 } 196 catch( Exception e ) 197 { 198 printError( "WARNING: unable to instantiate provider (added to list anyway): " + 199 e.getMessage() ); 200 } 201 202 list.add( providerClassname ); 203 204 envPut( ENV_PROVIDERS, list.toString(), true ); 205 } 206 } 207 208 void 209 removeProvider( ) 210 throws Exception 211 { 212 requireNumOperands( 1, "A provider classname must be specified"); 213 214 final String providerClassname = getOperands()[ 0 ]; 215 216 ClassList list = createProviderList(); 217 218 if ( ! list.exists( providerClassname ) ) 219 { 220 println( "Provider not found: " + providerClassname ); 221 } 222 else 223 { 224 try 226 { 227 final Class theClass = Class.forName( providerClassname ); 228 getConnectionMgr().removeProvider( theClass ); 229 } 230 catch( Exception e ) 231 { 232 } 234 235 list.remove( providerClassname ); 236 237 envPut( ENV_PROVIDERS, list.toString(), true ); 238 } 239 } 240 241 void 242 displayProviders( ) 243 throws Exception 244 { 245 println( "Available providers: " ); 246 final String list = IteratorStringifier.stringify( createProviderList().iterator(), "\n" ); 247 248 println( (list.length() == 0) ? "<none>" : list ); 249 250 println( "\nProviders successfully loaded (includes built-ins): " ); 251 final JMXConnectorProvider [] providersLoaded = getConnectionMgr().getProviders(); 252 for ( int i = 0; i < providersLoaded.length; ++i ) 253 { 254 JMXConnectorProvider provider = providersLoaded[ i ]; 255 256 println( provider.getClass().getName() ); 257 } 258 } 259 260 void 261 displayCmds( ) 262 throws Exception 263 { 264 println( "Commands configured: " ); 265 final String list = IteratorStringifier.stringify( createCmdList().iterator(), "\n" ); 266 267 println( (list.length() == 0) ? "<none>" : list ); 268 } 269 270 void 271 displayConfig( ) 272 throws Exception 273 { 274 displayProviders(); 275 276 println( "" ); 277 278 displayCmds(); 279 } 280 281 void 282 addCmd() 283 throws Exception 284 { 285 requireNumOperands( 1, "A command classname must be specified"); 286 287 final String commandClassname = getOperands()[ 0 ]; 288 289 final ClassList list = createCmdList(); 290 291 if ( list.exists( commandClassname ) ) 292 { 293 println( "Command already in list: " + commandClassname ); 294 } 295 else if ( ! isLegalClassname( commandClassname ) ) 296 { 297 printError( "Illegal classname: " + commandClassname ); 298 } 299 else 300 { 301 final CmdFactoryIniter initer = new CmdFactoryIniter( getCmdFactory() ); 302 final Class theClass = ClassUtil.getClassFromName( commandClassname ); 303 304 initer.addMappings( theClass ); 305 306 list.add( commandClassname ); 307 envPut( ENV_COMMANDS, list.toString(), true ); 308 } 309 } 310 311 312 void 313 removeCmd() 314 throws Exception 315 { 316 requireNumOperands( 1, "A classname must be specified"); 317 318 final String classname = getOperands()[ 0 ]; 319 final ClassList list = createCmdList(); 320 321 if ( ! list.exists( classname ) ) 322 { 323 println( "Command not registered: " + classname ); 324 } 325 else 326 { 327 list.remove( classname ); 329 envPut( ENV_PROVIDERS, list.toString(), true ); 330 331 final CmdFactoryIniter initer = new CmdFactoryIniter( getCmdFactory() ); 333 initer.removeMappings( ClassUtil.getClassFromName( classname ) ); 334 335 } 336 } 337 338 339 void 340 executeInternal() 341 throws Exception 342 { 343 final String cmdName = getCmdNameAsInvoked(); 344 345 if ( cmdName.equals( SHOW_CONFIG ) ) 346 { 347 displayConfig(); 348 } 349 else if ( cmdName.equals( ADD_PROVIDER ) ) 350 { 351 addProvider(); 352 } 353 else if ( cmdName.equals( REMOVE_PROVIDER ) ) 354 { 355 removeProvider( ); 356 } 357 else if ( cmdName.equals( ADD_CMD ) ) 358 { 359 addCmd( ); 360 } 361 else if ( cmdName.equals( REMOVE_CMD ) ) 362 { 363 removeCmd( ); 364 } 365 else 366 { 367 printUsage(); 368 } 369 } 370 } 371 372 373 374 375 376 377 | Popular Tags |