KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > sun > cli > jmx > cmd > ConnectionMgrImpl


1 /*
2  * The contents of this file are subject to the terms
3  * of the Common Development and Distribution License
4  * (the License). You may not use this file except in
5  * compliance with the License.
6  *
7  * You can obtain a copy of the license at
8  * https://glassfish.dev.java.net/public/CDDLv1.0.html or
9  * glassfish/bootstrap/legal/CDDLv1.0.txt.
10  * See the License for the specific language governing
11  * permissions and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL
14  * Header Notice in each file and include the License file
15  * at glassfish/bootstrap/legal/CDDLv1.0.txt.
16  * If applicable, add the following below the CDDL Header,
17  * with the fields enclosed by brackets [] replaced by
18  * you own identifying information:
19  * "Portions Copyrighted [year] [name of copyright owner]"
20  *
21  * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
22  */

23  
24 /*
25  * $Header: /cvs/glassfish/admin-cli/cli-api/src/java/com/sun/cli/jmx/cmd/ConnectionMgrImpl.java,v 1.3 2005/12/25 03:45:33 tcfujii Exp $
26  * $Revision: 1.3 $
27  * $Date: 2005/12/25 03:45:33 $
28  */

29  
30
31 package com.sun.cli.jmx.cmd;
32
33 import java.util.Map JavaDoc;
34 import java.util.HashMap JavaDoc;
35 import java.util.Set JavaDoc;
36 import java.util.ArrayList JavaDoc;
37
38 import javax.management.remote.JMXConnector JavaDoc;
39 import javax.management.remote.JMXServiceURL JavaDoc;
40 import javax.management.remote.JMXConnectorFactory JavaDoc;
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 JavaDoc mName;
48     public JMXConnector JavaDoc mConn;
49     public ConnectInfo mConnectInfo; // keep as a String so original can't change
50

51         public
52     Connection( String JavaDoc name, ConnectInfo connectInfo, JMXConnector JavaDoc conn )
53     {
54         assert( name != null );
55         assert( connectInfo != null );
56         assert( conn != null );
57         
58         mName = name;
59         // clone this; we don't want it changing
60
mConnectInfo = new ConnectInfo( connectInfo );
61         mConn = conn;
62     }
63     
64         public boolean
65     equals( Object JavaDoc 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 JavaDoc mNameConnMap;
83     final ArrayList JavaDoc mProviders;
84     
85         private static void
86     dm( Object JavaDoc o )
87     {
88         System.out.println( o.toString( ) );
89     }
90     
91         public
92     ConnectionMgrImpl( )
93         throws IllegalAccessException JavaDoc, InstantiationException JavaDoc, ClassNotFoundException JavaDoc
94     {
95         // do allow instantiation of this class; probably a singleton,
96
// but could be useful to have more than one to segregate by user for example
97

98         mNameConnMap = new HashMap JavaDoc();
99         
100         mProviders = new ArrayList JavaDoc();
101         addProvider( com.sun.cli.jmx.spi.JMXMPDefaultConnectorProvider.class );
102     }
103     
104         public ConnectInfo
105     getConnectInfo( String JavaDoc 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 JavaDoc name )
114     {
115         final Connection conn = (Connection)mNameConnMap.get( name );
116         
117         return( conn );
118     }
119     
120         JMXConnectorProvider
121     createProvider( String JavaDoc className )
122         throws ClassNotFoundException JavaDoc, IllegalAccessException JavaDoc, InstantiationException JavaDoc
123     {
124         final Class JavaDoc theClass = Class.forName( className );
125         
126         final JMXConnectorProvider provider = (JMXConnectorProvider)theClass.newInstance( );
127         
128         return( provider );
129     }
130     
131         public void
132     addProvider( Class JavaDoc provider )
133         throws IllegalAccessException JavaDoc, InstantiationException JavaDoc, ClassNotFoundException JavaDoc
134     {
135         final JMXConnectorProvider instance = (JMXConnectorProvider)provider.newInstance( );
136         
137         // last added = first priority
138
mProviders.add( 0, instance );
139     }
140     
141         public void
142     removeProvider( Class JavaDoc 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 JavaDoc name, ConnectInfo connectInfo )
161         throws java.io.IOException JavaDoc, java.net.MalformedURLException JavaDoc, NoProviderFoundException
162     {
163         final Map JavaDoc 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 JavaDoc 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 JavaDoc
193     readPassword( String JavaDoc filename, String JavaDoc username )
194         throws java.io.FileNotFoundException JavaDoc, java.io.IOException JavaDoc
195     {
196         final java.io.File JavaDoc file = new java.io.File JavaDoc( filename );
197         String JavaDoc password = null;
198         
199         final java.io.InputStream JavaDoc is = new java.io.FileInputStream JavaDoc( file );
200         
201         try
202         {
203             final LineReaderImpl reader = new LineReaderImpl( is );
204             
205             String JavaDoc line;
206             while( (line = reader.readLine( null )) != null )
207             {
208                 // don't trim the line; spaces are allow in the password at the end
209
if ( line.length() != 0 )
210                 {
211                     final int delimIndex = line.indexOf( USER_PASSWORD_DELIM );
212                     
213                     if ( delimIndex <= 0 )
214                     {
215                         throw new IllegalArgumentException JavaDoc( "Invalid line in password file: " + line );
216                     }
217                     
218                     final String JavaDoc user = line.substring( 0, delimIndex );
219                     if ( user.equals( username ) ) // case sensitive
220
{
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 JavaDoc( "No password found for user: " + username );
235         }
236         
237         
238         return( password );
239     }
240     
241         Map JavaDoc
242     createMapForConnectorProvider( final ConnectInfo connectInfo )
243         throws java.io.FileNotFoundException JavaDoc,java.io.IOException JavaDoc
244     {
245         final HashMap JavaDoc map = new HashMap JavaDoc();
246         
247         map.putAll( connectInfo.mParams );
248         
249         // if we have a passwordFile, read it
250
final String JavaDoc passwordFile = (String JavaDoc)map.get( JMXConnectorProvider.PASSWORD_FILE );
251         if ( passwordFile != null && map.get( JMXConnectorProvider.PASSWORD ) == null )
252         {
253             // user is required if we have a password file
254
final String JavaDoc username = (String JavaDoc)map.get( JMXConnectorProvider.USER );
255             
256             if ( username == null )
257             {
258                 throw new IllegalArgumentException JavaDoc( "Username required when specifying password file" );
259             }
260             
261             final String JavaDoc 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 JavaDoc
274     connect( final String JavaDoc name, final ConnectInfo connectInfo )
275         throws java.io.IOException JavaDoc, java.net.MalformedURLException JavaDoc, NoProviderFoundException
276     {
277         Connection conn = lookup( name );
278         
279         if ( conn != null )
280         {
281             if ( ! connectInfo.equals( conn.mConnectInfo ) )
282             {
283                 // same name, but different info, close it and we'll open a new one
284
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 JavaDoc name )
299         throws java.io.IOException JavaDoc
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 JavaDoc
310     getNames()
311     {
312         return( mNameConnMap.keySet() );
313     }
314 };
315
316
317
318
319
320
321
322
323
Popular Tags