KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > planetamessenger > protocols > jabber > JJabberPlugin


1 /*
2     =========================================================================
3     Package jabber - Implements the Jabber Protocol.
4
5     This module is developed and maintained by PlanetaMessenger.org.
6     Specs, New and updated versions can be found in
7     http://www.planetamessenger.org
8     If you want contact the Team please send a email to Project Manager
9     Leidson Campos Alves Ferreira at leidson@planetamessenger.org
10
11     Copyright (C) since 2001 by PlanetaMessenger.org
12     
13     This library is free software; you can redistribute it and/or
14     modify it under the terms of the GNU Lesser General Public
15     License as published by the Free Software Foundation; either
16     version 2.1 of the License, or (at your option) any later version.
17
18     This library is distributed in the hope that it will be useful,
19     but WITHOUT ANY WARRANTY; without even the implied warranty of
20     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21     Lesser General Public License for more details.
22
23     You should have received a copy of the GNU Lesser General Public
24     License along with this library; if not, write to the Free Software
25     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26
27     =========================================================================
28 */

29
30 /*
31  * Created on 8-Nov-06 by Peter Maloney
32  *
33  * $Id: JJabberPlugin.java,v 1.19 2007/02/03 07:41:41 popolony2k Exp $
34  * $Author: popolony2k $
35  * $Name: $
36  * $Revision: 1.19 $
37  * $State: Exp $
38  *
39  */

40
41
42 package org.planetamessenger.protocols.jabber;
43
44 import java.util.Calendar JavaDoc;
45 import java.util.Collection JavaDoc;
46 import java.util.GregorianCalendar JavaDoc;
47 import java.util.Iterator JavaDoc;
48 import java.util.Locale JavaDoc;
49 import org.jivesoftware.smack.AccountManager;
50 import org.jivesoftware.smack.Chat;
51 import org.jivesoftware.smack.ConnectionListener;
52 import org.jivesoftware.smack.PacketListener;
53 import org.jivesoftware.smack.Roster;
54 import org.jivesoftware.smack.RosterListener;
55 import org.jivesoftware.smack.SSLXMPPConnection;
56 import org.jivesoftware.smack.XMPPConnection;
57 import org.jivesoftware.smack.XMPPException;
58 import org.jivesoftware.smack.filter.PacketFilter;
59 import org.jivesoftware.smack.filter.PacketTypeFilter;
60 import org.jivesoftware.smack.packet.Message;
61 import org.jivesoftware.smack.packet.Packet;
62 import org.jivesoftware.smack.packet.Presence;
63 import org.planetamessenger.io.JClassPath;
64 import org.planetamessenger.mos.engine.JConfiguration;
65 import org.planetamessenger.plugin.JMessengerEventListener;
66 import org.planetamessenger.plugin.*;
67 import sun.security.x509.X400Address;
68
69
70
71 /**
72  * The PlanetaMessenger plugin for the Jabber IM protocol (http://jabber.org)
73  * @author Peter Maloney
74  */

75 public class JJabberPlugin extends JPlugin {
76
77     // ========================================================
78
// Fields - static
79
// ========================================================
80
private static final String JavaDoc JABBER_STATUS_OFFLINE = "offline";
81
82     // ========================================================
83
// Fields - state
84
// ========================================================
85

86     // config stuff
87
int port = -1;
88     boolean ssl = true;
89     String JavaDoc host = null;
90     boolean autoReconnect = true;
91     boolean loggedIn = false;
92     JJabberPlugin selfPluginObject = null;
93
94     XMPPConnection connection = null;
95     JUIEventListener uiListener = null;
96     JProtocolListener protocolListener = null;
97     JMessageListener messageListener = null;
98     JSubscribeListener subscribeListener = null;
99
100     private int status;
101
102     protected class JJabberPluginException extends Exception JavaDoc {
103
104         /** */
105         private static final long serialVersionUID = 1L;
106
107         protected JJabberPluginException() {
108             super();
109         }
110
111         protected JJabberPluginException( String JavaDoc message, Throwable JavaDoc cause ) {
112             super( message, cause );
113         }
114
115         protected JJabberPluginException( String JavaDoc message ) {
116             super( message );
117         }
118
119         protected JJabberPluginException( Throwable JavaDoc cause ) {
120             super( cause );
121         }
122
123     }
124
125     /** Handles incomming message events */
126     protected class JMessageListener implements PacketListener {
127         public void processPacket( Packet packet ) {
128             Message chat = ( Message ) packet;
129
130             String JavaDoc address = fixAddress( chat.getFrom() );
131             String JavaDoc body = chat.getBody();
132
133             GregorianCalendar JavaDoc cal = new GregorianCalendar JavaDoc( Locale.getDefault() );
134             fireOnReceiveMessage( address, cal, body );
135         }
136     };
137
138     /** Handles incoming subscribe (request authorization) events */
139     protected class JSubscribeListener implements PacketListener {
140         public void processPacket( Packet packet ) {
141             Presence pres = ( Presence ) packet;
142             String JavaDoc address = pres.getFrom();
143
144             fireOnRequestAuthorization( address, address );
145         }
146     };
147
148     protected class JUIEventListener implements JMessengerEventListener {
149
150         // ========================================================
151
// JMessengerEventListener
152
// ========================================================
153

154         /** adds the user to the Roster if not present */
155         public void onAddUserToContactList( String JavaDoc strUserId ) {
156             System.err.println( "JJabberPlugin.onAddUserToContactList(...) - strUserId=" + strUserId );
157             if( connection.getRoster().contains( strUserId ) )
158                 return;
159
160             try {
161                 String JavaDoc nick = connection.getRoster().getEntry( strUserId ).getName();
162                 connection.getRoster().createEntry( strUserId, nick, null );
163             } catch( XMPPException e ) {
164                 System.err.println( "JJabberPlugin.onAddUserToContactList(...) - " + e );
165                 e.printStackTrace( System.err );
166             }
167         }
168
169         public void onAuthorizeBuddy( String JavaDoc strUserId ) {
170             System.err.println( "JJabberPlugin.onAuthorizeBuddy(...) - strUserId=" + strUserId );
171             Presence p = new Presence( Presence.Type.SUBSCRIBED );
172             connection.sendPacket( p );
173         }
174
175         public void onBuddyDetails( String JavaDoc strUserId ) {
176             // TODO Auto-generated method stub
177
System.err.println( "JJabberPlugin.onBuddyDetails(...) - strUserId=" + strUserId );
178         }
179
180         public void onChangePassword( String JavaDoc strNewPasswd ) {
181             System.err.println( "JJabberPlugin.onChangePassword(...)" );
182
183             AccountManager m = new AccountManager( connection );
184             try {
185                 m.changePassword( strNewPasswd );
186                 fireOnPasswordChangedSuccessfull( strNewPasswd );
187             } catch( XMPPException e ) {
188                 fireOnPasswordChangedFailed();
189                 e.printStackTrace();
190             }
191         }
192
193         public void onChangePrivacy( String JavaDoc strUserId, int nPrivacyType ) {
194             // TODO Auto-generated method stub
195
System.err.println( "JJabberPlugin.onChangePrivacy(...) - strUserId=" + strUserId + ", nPrivacyType=" + nPrivacyType );
196         }
197
198         public void onLogin( int nPluginStatus ) {
199             System.err.println( "JJabberPlugin.onLogin(...) - user=" + getUserId() + ", host=" + host + ", port=" + port );
200
201             try {
202                 if( ssl ) {
203                     // Create a connection to the jabber.org server
204
if( port == -1 ) {
205                         connection = new XMPPConnection( host, 5222 );
206                     }
207                     else {
208                         connection = new XMPPConnection( host, port );
209                     }
210                 }
211                 else {
212                     // Create an SSL connection to jabber.org.
213
if( port == -1 ) {
214                         connection = new SSLXMPPConnection( host, 5223 );
215                     }
216                     else {
217                         connection = new SSLXMPPConnection( host, port );
218                     }
219                 }
220
221                 connection.login( getUserId(), getPassword(), "PlanetaMessenger.org", false );
222
223                 if( !connection.isAuthenticated() ) {
224                     throw new JJabberPluginException( "Failed to authenticate user=" + getUserId() + ", host=" + host + ", port=" + port );
225                 }
226
227                 connection.addConnectionListener( protocolListener );
228
229                 Roster roster = connection.getRoster();
230                 roster.addRosterListener( protocolListener );
231                 connection.addPacketListener( messageListener, new PacketTypeFilter( Message.class ) );
232
233                 roster.setSubscriptionMode( Roster.SUBSCRIPTION_MANUAL );
234                 connection.addPacketListener( subscribeListener, new PacketTypeFilter( Presence.class ) {
235
236                     public boolean accept( Packet packet ) {
237                         // sometimes a Version object is sent here despite
238
// passing
239
// Presence.class in the constructor, so do this safety
240
// check
241
if( !( packet instanceof Presence ) )
242                             return false;
243
244                         Presence pres = ( Presence ) packet;
245                         return super.accept( packet ) && pres.getType() == Presence.Type.SUBSCRIBE;
246                     }
247
248                 } );
249
250                 System.err.println( "JJabberPlugin.onLogin(...) - Logged in. user=" + getUserId() + ", host=" + host + ", port=" + port );
251                 loggedIn = true;
252                 fireOnLoginAccepted();
253                 fireOnRegisterUserSucessfull(); // Called here because this
254
// login could be a user
255
// registration
256
// (onRegisterexistingUser)
257
fireOnPluginStatusChanged( nPluginStatus );
258             } catch( XMPPException e ) {
259                 System.err.println( "JJabberPlugin.onLogin(...) - " + e );
260                 e.printStackTrace( System.err );
261                 
262                 loggedIn = false;
263                 fireOnLoginFailed();
264                 fireOnRegisterUserFailed(); // Called here because this login
265
// could be a user registration
266
// (onRegisterexistingUser)
267
} catch( JJabberPluginException e ) {
268                 System.err.println( "JJabberPlugin.onLogin(...) - " + e );
269                 e.printStackTrace( System.err );
270                 
271                 loggedIn = false;
272                 fireOnLoginFailed();
273                 fireOnRegisterUserFailed(); // Called here because this login
274
// could be a user registration
275
// (onRegisterexistingUser)
276
} catch( IllegalStateException JavaDoc e ) {
277                 System.err.println( "JJabberPlugin.onLogin(...) - " + e );
278                 e.printStackTrace( System.err );
279                 
280                 loggedIn = false;
281                 fireOnLoginFailed();
282                 fireOnRegisterUserFailed(); // Called here because this login
283
// could be a user registration
284
// (onRegisterexistingUser)
285
}
286         }
287
288         public void onLogout() {
289             System.err.println( "JJabberPlugin.onLogout()" );
290             loggedIn = false;
291             if( !isConnected() )
292                 return;
293
294             connection.close();
295         }
296
297         public void onPluginPropertiesUpdated() {
298             // TODO Auto-generated method stub
299
System.err.println( "JJabberPlugin.onPluginPropertiesUpdated()" );
300         }
301
302         public void onPluginStatusChanged( int nStatus ) {
303             System.err.println( "JJabberPlugin.onPluginStatusChanged(...) - nStatus=" + nStatus );
304
305             Presence p = new Presence( Presence.Type.AVAILABLE );
306             Presence.Mode m = ( Presence.Mode ) translateStatusToPlugin( nStatus );
307             
308             if( m == null || m.equals( JABBER_STATUS_OFFLINE ) ) {
309               p.setType( Presence.Type.UNAVAILABLE );
310             }
311             else {
312               p.setMode( m );
313             }
314
315             connection.sendPacket( p );
316         }
317
318         public void onPrivacyChanged() {
319             // TODO Auto-generated method stub
320
System.err.println( "JJabberPlugin.onPrivacyChanged()" );
321         }
322
323         public void onRegisterExistingUser( String JavaDoc strNickName, String JavaDoc strUserId, String JavaDoc strPasswd ) {
324             System.err.println( "JJabberPlugin.onRegisterExistingUser(...) - strNickName=" + strNickName + ",strUserId=" + strUserId );
325
326             JUserInfo userInfo = new JUserInfo( strUserId, strNickName, strPasswd, JPlugin.STATUS_ONLINE );
327             
328             setUserInfo( userInfo );
329             fireOnLogin();
330         }
331
332         public void onRegisterNewUser( String JavaDoc strNickName, StringBuffer JavaDoc strNewUserId, String JavaDoc strPasswd ) {
333             System.err.println( "JJabberPlugin.onRegisterNewUser(...) - strNickName=" + strNickName + ",strNewUserId=" + strNewUserId );
334
335             JUserInfo userInfo = new JUserInfo( strNewUserId.toString(), strNickName, strPasswd, JPlugin.STATUS_ONLINE );
336             
337             setUserInfo( userInfo );
338             fireOnLogin();
339         }
340
341         public void onRemoveUserFromContactList( String JavaDoc strUserId ) {
342             // TODO Auto-generated method stub
343
System.err.println( "JJabberPlugin.onRemoveUserFromContactList(...) - strUserId=" + strUserId );
344
345             Presence p = new Presence( Presence.Type.UNSUBSCRIBE );
346             p.setTo( strUserId );
347             p.setFrom( getUserId() );
348             connection.sendPacket( p );
349         }
350
351         public void onRequestAuthorization( String JavaDoc strUserId, String JavaDoc strNickName ) {
352             System.err.println( "JJabberPlugin.onRequestAuthorization(...) - strUserId=" + strUserId + ",strNickName=" + strNickName );
353
354             Presence p = new Presence( Presence.Type.SUBSCRIBE );
355             p.setTo( strUserId );
356             p.setFrom( getUserId() );
357             connection.sendPacket( p );
358         }
359
360         public void onSendMessage( String JavaDoc strToUser, String JavaDoc msg, int nMsgType ) {
361             // TODO: what is nMsgType?
362

363             System.err.println( "JJabberPlugin.onSendMessage(...) - strToUser=" + strToUser + ",msg=" + msg );
364
365             Message m = new Message( strToUser, Message.Type.NORMAL );
366             m.setBody( msg );
367
368             connection.sendPacket( m );
369         }
370
371         public void onUnauthorizeBuddy( String JavaDoc strUserId ) {
372             // TODO Auto-generated method stub
373
System.err.println( "JJabberPlugin.onUnauthorizeBuddy(...) - strUserId=" + strUserId );
374         }
375
376         public void onUnregisterUser() {
377             System.err.println( "JJabberPlugin.onUnregisterUser()" );
378
379             AccountManager m = new AccountManager( connection );
380             try {
381                 m.deleteAccount();
382                 fireOnUnregisterUserSuccessfull();
383             } catch( XMPPException e ) {
384                 e.printStackTrace();
385             }
386         }
387
388     }
389
390     /** Handles protocol events, except PacketListener events */
391     protected class JProtocolListener implements RosterListener, ConnectionListener {
392
393         // ============================================================
394
// RosterListener, for when the host tells us user status/details
395
// changes
396
// ============================================================
397

398         public void entriesAdded( Collection JavaDoc addresses ) {
399             System.err.println( "JJabberPlugin.entriesAdded() - addresses=" + addresses );
400             Iterator JavaDoc addyIt = addresses.iterator();
401             while( addyIt.hasNext() ) {
402                 String JavaDoc xmppAddress = ( String JavaDoc ) addyIt.next();
403                 fireOnAddUserToContactList( xmppAddress );
404
405             }
406         }
407
408         public void entriesDeleted( Collection JavaDoc addresses ) {
409             System.err.println( "JJabberPlugin.entriesDeleted() - addresses=" + addresses );
410             // Iterator addyIt = addresses.iterator();
411
// while( addyIt.hasNext() ) {
412
// String xmppAddress = (String)addyIt.next();
413
// fireOnRemoveUserFromContactList( xmppAddress );
414
// }
415
}
416
417         public void entriesUpdated( Collection JavaDoc addresses ) {
418             System.err.println( "JJabberPlugin.entriesUpdated() - addresses=" + addresses );
419             Iterator JavaDoc addyIt = addresses.iterator();
420             while( addyIt.hasNext() ) {
421                 String JavaDoc xmppAddress = ( String JavaDoc ) addyIt.next();
422                 fireOnBuddyDetails( xmppAddress );
423             }
424         }
425
426         public void presenceChanged( String JavaDoc xmppAddress ) {
427
428             JContactListItem item;
429             String JavaDoc strUserId = fixAddress( xmppAddress );
430
431             item = new JContactListItem( selfPluginObject.getPluginProperties().getPluginId(), strUserId, strUserId );
432
433             System.err.println( "JJabberPlugin.presenceChanged() - xmppAddress=" + item.getUserId() );
434
435             // Check if object is on local contact list database.
436
if( !getKernelManager().getContactListManager().isContact( selfPluginObject, item.getUserId() ) )
437                 getKernelManager().getContactListManager().addToContactList( selfPluginObject, item.getUserId(), item.getUserId() );
438
439             Presence p = connection.getRoster().getPresence( xmppAddress );
440             int newStatus = ( p == null ? JPlugin.STATUS_OFFLINE : translateStatusFromPlugin( p.getMode() ) );
441
442             System.err.println( "JJabberPlugin.presenceChanged() - p=" + p + ", newStatus=" + newStatus );
443
444             status = newStatus;
445             fireOnBuddyStatusChanged( item.getUserId(), newStatus );
446         }
447
448         // ============================================================
449
// ConnectionListener, for when connection changes
450
// ============================================================
451

452         public void connectionClosed() {
453             System.err.println( "JJabberPlugin.connectionClosed()" );
454             
455             fireOnLogout();
456             
457             if( autoReconnect && loggedIn ) {
458                 uiListener.onLogin( status );
459             }
460         }
461
462         public void connectionClosedOnError( Exception JavaDoc e ) {
463             System.err.println( "JJabberPlugin.connectionClosedOnError(...) - " + e );
464             
465             fireOnLogout();
466             
467             if( autoReconnect && loggedIn ) {
468                 uiListener.onLogin( status );
469             }
470         }
471
472     }
473
474     // ========================================================
475
// Fields - temporary stuff (to avoid memory burn)
476
// ========================================================
477

478     // ========================================================
479
// Constructors
480
// ========================================================
481

482     /**
483      * Creates a JJabberPlugin instance
484      */

485     public JJabberPlugin() {
486         // TODO: set preferences, such as host, port, ssl, etc.
487
host = "jabber.org";
488         selfPluginObject = this;
489     }
490
491     // ========================================================
492
// Getters & setters
493
// ========================================================
494

495     // ========================================================
496
// Overridden methods
497
// ========================================================
498

499     /**
500      * Returns the plugin connection status .
501      */

502     public boolean isConnected() {
503         return connection != null && ( ( connection.isAuthenticated() == true ) && ( connection.isConnected() == true ) );
504     }
505
506     /**
507      * Implement the onCreate event listener. Performs the plugin creation.
508      */

509     public void onCreate() {
510
511         super.onCreate();
512
513         JPluginCapabilities capabilities = getPluginCapabilities();
514
515         // Update the plugin capabilities
516
capabilities.putBool( JPluginCapabilities.CAPABILITY_REGISTER_NEW_USER, true );
517         capabilities.putBool( JPluginCapabilities.CAPABILITY_OFFLINE_MESSAGE, true );
518         setPluginCapabilities( capabilities );
519
520         protocolListener = this.new JProtocolListener();
521         messageListener = this.new JMessageListener();
522         subscribeListener = this.new JSubscribeListener();
523
524         uiListener = this.new JUIEventListener();
525         addMessengerEventListener( uiListener );
526
527         addStatus( JPlugin.STATUS_OFFLINE, Presence.Mode.fromString( JABBER_STATUS_OFFLINE ) );
528         addStatus( JPlugin.STATUS_ONLINE, Presence.Mode.AVAILABLE );
529         addStatus( JPlugin.STATUS_FREE_CHAT, Presence.Mode.CHAT );
530         addStatus( JPlugin.STATUS_DND, Presence.Mode.DO_NOT_DISTURB );
531         addStatus( JPlugin.STATUS_AWAY, Presence.Mode.AWAY );
532         addStatus( JPlugin.STATUS_BUSY, Presence.Mode.EXTENDED_AWAY );
533         addStatus( JPlugin.STATUS_INVISIBLE, Presence.Mode.INVISIBLE );
534     }
535
536     // ========================================================
537
// Custom methods
538
// ========================================================
539

540     /**
541      * @param address
542      * @return the address with the last slash and whatever follows it removed
543      */

544     private String JavaDoc fixAddress( String JavaDoc address ) {
545         int slash = address.lastIndexOf( '/' );
546         if( slash != -1 )
547             address = address.substring( 0, slash );
548         return address;
549     }
550 }
551
Popular Tags