1 23 24 29 30 31 package com.sun.cli.jmx.cmd; 32 33 import java.util.Map ; 34 import java.util.HashMap ; 35 import java.util.Set ; 36 import java.util.ArrayList ; 37 38 import javax.management.remote.JMXConnector ; 39 import javax.management.remote.JMXServiceURL ; 40 import javax.management.remote.JMXConnectorFactory ; 41 42 import com.sun.cli.jmx.spi.JMXConnectorProvider; 43 import com.sun.cli.util.LineReaderImpl; 44 45 final class Connection 46 { 47 public String mName; 48 public JMXConnector mConn; 49 public ConnectInfo mConnectInfo; 51 public 52 Connection( String name, ConnectInfo connectInfo, JMXConnector conn ) 53 { 54 assert( name != null ); 55 assert( connectInfo != null ); 56 assert( conn != null ); 57 58 mName = name; 59 mConnectInfo = new ConnectInfo( connectInfo ); 61 mConn = conn; 62 } 63 64 public boolean 65 equals( Object o ) 66 { 67 if ( o == this ) 68 return( true ); 69 if ( ! (o instanceof Connection ) ) 70 { 71 return( false ); 72 } 73 74 final Connection rhs = (Connection)o; 75 76 return( mName.equals( rhs.mName ) && mConnectInfo.equals( rhs.mConnectInfo ) ); 77 } 78 } 79 80 public class ConnectionMgrImpl implements ConnectionMgr 81 { 82 private final Map mNameConnMap; 83 final ArrayList mProviders; 84 85 private static void 86 dm( Object o ) 87 { 88 System.out.println( o.toString( ) ); 89 } 90 91 public 92 ConnectionMgrImpl( ) 93 throws IllegalAccessException , InstantiationException , ClassNotFoundException 94 { 95 98 mNameConnMap = new HashMap (); 99 100 mProviders = new ArrayList (); 101 addProvider( com.sun.cli.jmx.spi.JMXMPDefaultConnectorProvider.class ); 102 } 103 104 public ConnectInfo 105 getConnectInfo( String name ) 106 { 107 final Connection conn = (Connection)mNameConnMap.get( name ); 108 109 return( conn == null ? null : conn.mConnectInfo ); 110 } 111 112 Connection 113 lookup( final String name ) 114 { 115 final Connection conn = (Connection)mNameConnMap.get( name ); 116 117 return( conn ); 118 } 119 120 JMXConnectorProvider 121 createProvider( String className ) 122 throws ClassNotFoundException , IllegalAccessException , InstantiationException 123 { 124 final Class theClass = Class.forName( className ); 125 126 final JMXConnectorProvider provider = (JMXConnectorProvider)theClass.newInstance( ); 127 128 return( provider ); 129 } 130 131 public void 132 addProvider( Class provider ) 133 throws IllegalAccessException , InstantiationException , ClassNotFoundException 134 { 135 final JMXConnectorProvider instance = (JMXConnectorProvider)provider.newInstance( ); 136 137 mProviders.add( 0, instance ); 139 } 140 141 public void 142 removeProvider( Class provider ) 143 { 144 mProviders.remove( provider ); 145 } 146 147 148 149 150 public JMXConnectorProvider [] 151 getProviders() 152 { 153 JMXConnectorProvider [] providers = new JMXConnectorProvider[ mProviders.size() ]; 154 155 mProviders.toArray( providers ); 156 return( providers ); 157 } 158 159 Connection 160 openNew( String name, ConnectInfo connectInfo ) 161 throws java.io.IOException , java.net.MalformedURLException , NoProviderFoundException 162 { 163 final Map map = createMapForConnectorProvider( connectInfo ); 164 165 final JMXConnectorProvider [] providers = getProviders(); 166 167 Connection conn = null; 168 for( int i = 0; i < providers.length; ++i ) 169 { 170 final JMXConnectorProvider provider = (JMXConnectorProvider)providers[ i ]; 171 172 if ( provider.isSupported( map ) ) 173 { 174 final JMXConnector jmxConn = provider.connect( map ); 175 176 conn = new Connection( name, connectInfo, jmxConn ); 177 break; 178 } 179 } 180 181 if ( conn == null ) 182 { 183 throw new NoProviderFoundException( "No provider found for: " + connectInfo.toString() ); 184 } 185 186 return( conn ); 187 } 188 189 190 final char USER_PASSWORD_DELIM = '='; 191 192 String 193 readPassword( String filename, String username ) 194 throws java.io.FileNotFoundException , java.io.IOException 195 { 196 final java.io.File file = new java.io.File ( filename ); 197 String password = null; 198 199 final java.io.InputStream is = new java.io.FileInputStream ( file ); 200 201 try 202 { 203 final LineReaderImpl reader = new LineReaderImpl( is ); 204 205 String line; 206 while( (line = reader.readLine( null )) != null ) 207 { 208 if ( line.length() != 0 ) 210 { 211 final int delimIndex = line.indexOf( USER_PASSWORD_DELIM ); 212 213 if ( delimIndex <= 0 ) 214 { 215 throw new IllegalArgumentException ( "Invalid line in password file: " + line ); 216 } 217 218 final String user = line.substring( 0, delimIndex ); 219 if ( user.equals( username ) ) { 221 password = line.substring( delimIndex + 1, line.length() ); 222 break; 223 } 224 } 225 } 226 } 227 finally 228 { 229 is.close(); 230 } 231 232 if ( password == null ) 233 { 234 throw new IllegalArgumentException ( "No password found for user: " + username ); 235 } 236 237 238 return( password ); 239 } 240 241 Map 242 createMapForConnectorProvider( final ConnectInfo connectInfo ) 243 throws java.io.FileNotFoundException ,java.io.IOException 244 { 245 final HashMap map = new HashMap (); 246 247 map.putAll( connectInfo.mParams ); 248 249 final String passwordFile = (String )map.get( JMXConnectorProvider.PASSWORD_FILE ); 251 if ( passwordFile != null && map.get( JMXConnectorProvider.PASSWORD ) == null ) 252 { 253 final String username = (String )map.get( JMXConnectorProvider.USER ); 255 256 if ( username == null ) 257 { 258 throw new IllegalArgumentException ( "Username required when specifying password file" ); 259 } 260 261 final String password = readPassword( passwordFile, username ); 262 map.put( JMXConnectorProvider.PASSWORD, password ); 263 } 264 265 if ( map.get( JMXConnectorProvider.PROTOCOL ) == null ) 266 { 267 map.put( JMXConnectorProvider.PROTOCOL, "jmxmp" ); 268 } 269 270 return( map ); 271 } 272 273 public JMXConnector 274 connect( final String name, final ConnectInfo connectInfo ) 275 throws java.io.IOException , java.net.MalformedURLException , NoProviderFoundException 276 { 277 Connection conn = lookup( name ); 278 279 if ( conn != null ) 280 { 281 if ( ! connectInfo.equals( conn.mConnectInfo ) ) 282 { 283 close( name ); 285 conn = null; 286 } 287 } 288 if ( conn == null ) 289 { 290 conn = openNew( name, connectInfo ); 291 mNameConnMap.put( name, conn ); 292 } 293 294 return( conn.mConn ); 295 } 296 297 public void 298 close( String name ) 299 throws java.io.IOException 300 { 301 final Connection conn = lookup( name ); 302 if ( conn != null ) 303 { 304 mNameConnMap.remove( name ); 305 conn.mConn.close(); 306 } 307 } 308 309 public Set 310 getNames() 311 { 312 return( mNameConnMap.keySet() ); 313 } 314 }; 315 316 317 318 319 320 321 322 323 | Popular Tags |