source: branches/2.2/jabberit_messenger/java_source/src/nu/fw/jeti/backend/roster/Server.java @ 3102

Revision 3102, 13.7 KB checked in by amuller, 14 years ago (diff)

Ticket #986 - Efetuado merge para o Branch 2.2( atualizacao do modulo)

  • Property svn:executable set to *
Line 
1/*
2 *      Jeti, a Java Jabber client, Copyright (C) 2001 E.S. de Boer 
3 *
4 *  This program is free software; you can redistribute it and/or modify
5 *  it under the terms of the GNU General Public License as published by
6 *  the Free Software Foundation; either version 2 of the License, or
7 *  (at your option) any later version.
8 *
9 *  This program is distributed in the hope that it will be useful,
10 *      but WITHOUT ANY WARRANTY; without even the implied warranty of
11 *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 *      GNU General Public License for more details.
13 *
14 *  You should have received a copy of the GNU General Public License
15 *  along with this program; if not, write to the Free Software
16 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17 *
18 *      For questions, comments etc,
19 *      use the website at http://jeti.jabberstudio.org
20 *  or mail/IM me at jeti@jabber.org
21 */
22
23package nu.fw.jeti.backend.roster;
24
25import java.lang.reflect.InvocationTargetException;
26import java.util.HashMap;
27import java.util.Iterator;
28import java.util.Map;
29
30import javax.swing.SwingUtilities;
31
32import nu.fw.jeti.backend.Discovery;
33import nu.fw.jeti.events.*;
34import nu.fw.jeti.jabber.Backend;
35import nu.fw.jeti.jabber.JID;
36import nu.fw.jeti.jabber.JIDStatus;
37import nu.fw.jeti.jabber.elements.DiscoveryInfo;
38import nu.fw.jeti.jabber.elements.DiscoveryItem;
39import nu.fw.jeti.jabber.elements.Presence;
40import nu.fw.jeti.util.I18N;
41
42
43/**
44 * Class that controls the transports/sever from the roster.
45 * when a new transport is added this class wil lookup information
46 * about the transport (with Browse) and will give every item in the roster
47 * registered with that transport the right type.
48 * Changes in the server roster are broadcasted using the ServerListener
49 * @see ServerListener
50 * @see Discovery
51 * @see Roster
52 * @author E.S. de Boer
53 * @version 1.0
54 */
55
56//primarys wel/niet?? what about resources?
57public class Server implements DiscoveryListener
58{
59        private JIDStatusTree jidTree = new JIDStatusTree();//serverrostertree
60        private Backend backend;
61        private boolean fireReady = false;//is the server roster displayed?
62        private Map jidStatussen;//reference to rosters jidstatus cache
63        private Map availableTransports;
64
65        public Server(Backend backend)
66        {
67                this.backend = backend;
68                //backend.addListener(DiscoveryListener.class,this);
69                availableTransports = new HashMap(5);
70        }
71
72        public void addJIDStatussen(Map jidStatussen)
73        {//adds jidstatussen from roster
74                this.jidStatussen = jidStatussen;
75                //System.out.println("jidstatussen added");
76        }
77
78        public void clear()
79        {//reset server
80                fireReady = false;
81                availableTransports.clear();
82                if(jidTree.existGroup(I18N.gettext("main.main.roster.Servers")))
83                {
84                        jidTree.removeGroup(jidTree.getGroup(I18N.gettext("main.main.roster.Servers")));
85                }
86        }
87
88        public void fire()
89        {//fire after complete server reset
90                for(Iterator j = backend.getListeners(ServerListener.class);j.hasNext();)
91                {
92                        ((RosterListener)j.next()).rosterReplaced(jidTree);
93                }
94                fireReady = true;
95        }
96
97
98        public void addServerNoFire(JIDStatus jidStatus)
99        {
100                JIDStatusGroup jidGroup = jidTree.getGroup(I18N.gettext("main.main.roster.Servers"));
101                PrimaryJIDStatus primary = new PrimaryJIDStatus(jidStatus.getNick(),jidStatus);
102                jidGroup.addPrimaryJIDStatus(primary);
103                //primary.addJIDStatus(jidStatus);
104                //backend.browse(JID.jidFromString(jidStatus.getJID().toStringNoResource()) ,this);
105                backend.getInfo(JID.jidFromString(jidStatus.getJID().toStringNoResource()) ,this);
106        }
107
108        public void addServer(String nick, JIDStatus jidStatus)
109        {
110                addServerNoBrowse(nick,jidStatus);
111                //backend.browse(JID.jidFromString(jidStatus.getJID().toStringNoResource()),this);
112                backend.getInfo(JID.jidFromString(jidStatus.getJID().toStringNoResource()),this);
113        }
114
115        private void addServerNoBrowse(final String nick,final JIDStatus jidStatus)
116        {//when nick changes after browse
117                Runnable updateAComponent = new Runnable() {
118                        public void run()
119                        {
120                                String group = I18N.gettext("main.main.roster.Servers");
121                                JIDStatusGroup jidGroup;
122                                if(!jidTree.existGroup(group))
123                                {
124                                        jidGroup = jidTree.getGroup(group);
125                                        int index = jidTree.indexOfGroup(jidGroup);
126                                        for(Iterator j = backend.getListeners(ServerListener.class);j.hasNext();)
127                                        {//fire group make
128                                                ((RosterListener)j.next()).groupAdded(jidGroup,index);
129                                        }
130                                }
131                                else jidGroup = jidTree.getGroup(group);
132                                PrimaryJIDStatus primary = jidGroup.searchPrimaryJIDStatus(nick);
133                                //if(primary == null)
134                                {//server no primarys
135                                        primary = new PrimaryJIDStatus(nick,jidStatus);
136                                        jidGroup.addPrimaryJIDStatus(primary);
137                                        //primary.addJIDStatus(jidStatus);
138                                        //jidGroup.sort();
139                                        int index = jidGroup.indexOfPrimaryJIDStatus(primary);
140                                        for(Iterator j = backend.getListeners(ServerListener.class);j.hasNext();)
141                                        {//fire add
142                                                ((RosterListener)j.next()).primaryAdded(jidGroup,primary,index);
143                                        }
144                                }
145                        }
146                };
147                if(SwingUtilities.isEventDispatchThread())
148                {
149                        updateAComponent.run();
150                }
151                else
152                {
153                        try
154                        {
155                                SwingUtilities.invokeAndWait(updateAComponent);
156                        } catch (InterruptedException e)
157                        {
158                                e.printStackTrace();
159                        } catch (InvocationTargetException e)
160                        {
161                                e.printStackTrace();
162                        }
163                }
164        }
165
166        public void removeServer(final String nick,final JIDStatus jidStatus)
167        {//als primary gebruik veranderen als in roster
168                Runnable updateAComponent = new Runnable() {
169                        public void run()
170                        {
171                                JIDStatusGroup jidGroup = jidTree.getGroup(I18N.gettext("main.main.roster.Servers"));
172                                PrimaryJIDStatus primary = jidGroup.searchPrimaryJIDStatus(nick);
173                                if(primary.removeJIDStatus(jidStatus)) //primary onzin kan weg
174                                {
175                                        //if(primary.isEmpty())
176                                        {
177                                                int index = jidGroup.indexOfPrimaryJIDStatus(primary);
178                                                jidGroup.removePrimaryJIDStatus(primary);
179                                                for(Iterator j = backend.getListeners(ServerListener.class);j.hasNext();)
180                                                {//fire delete
181                                                        ((RosterListener)j.next()).primaryDeleted(jidGroup,primary,index);
182                                                }
183                                                //fire remove
184                                                if(jidGroup.size() < 1)
185                                                {//fire group remove
186                                                        int index2 = jidTree.indexOfGroup(jidGroup);
187                                                        jidTree.removeGroup(jidGroup);
188                                                        for(Iterator j = backend.getListeners(ServerListener.class);j.hasNext();)
189                                                        {//fire group delete
190                                                                ((RosterListener)j.next()).groupDeleted(jidGroup,index2);
191                                                        }
192                                                }
193                                        }
194        //                              else
195        //                              {//fire update
196        //                                      int index = jidGroup.indexOfPrimaryJIDStatus(primary);
197        //                                      for(Iterator j = backend.getListeners(ServerListener.class);j.hasNext();)
198        //                                      {
199        //                                              ((RosterListener)j.next()).primaryUpdated(jidGroup,primary,index);
200        //                                      }
201        //                              }
202                                }
203                        }
204                };
205                if(SwingUtilities.isEventDispatchThread())
206                {
207                        updateAComponent.run();
208                }
209                else
210                {
211                        try
212                        {
213                                SwingUtilities.invokeAndWait(updateAComponent);
214                        } catch (InterruptedException e)
215                        {
216                                e.printStackTrace();
217                        } catch (InvocationTargetException e)
218                        {
219                                e.printStackTrace();
220                        }
221                }
222        }
223
224        private void changeNickServer(String nick, NormalJIDStatus jidStatus)
225        {//changes nick from server  nick + oldjidstatus
226                String group = I18N.gettext("main.main.roster.Servers");
227                //System.out.println("update");
228                JIDStatusGroup jidGroup = jidTree.getGroup(group);
229                PrimaryJIDStatus primary = jidGroup.searchPrimaryJIDStatus(jidStatus.getNick());
230                if(primary.removeJIDStatus(jidStatus)) //primary onzin kan weg
231                {
232                        //if(primary.isEmpty())
233                        {
234                                //int index = jidGroup.indexOfPrimaryJIDStatus(primary);
235                                jidGroup.removePrimaryJIDStatus(primary);
236                        }
237                }
238                jidStatus.setNick(nick);
239//              if(!jidTree.existGroup(group))
240//              {
241//                      jidGroup = jidTree.getGroup(group);
242//                      //int index = jidTree.indexOfGroup(jidGroup);
243//              }
244//              else
245                jidGroup = jidTree.getGroup(group);
246                //JIDPrimaryStatus primary = jidGroup.searchPrimaryJIDStatus(nick);
247                //if(primary == null)
248                {//server no primarys
249                        primary = new PrimaryJIDStatus(nick,jidStatus);
250                        jidGroup.addPrimaryJIDStatus(primary);
251                        //primary.addJIDStatus(jidStatus);
252                        //jidGroup.sort();
253                        //int index = jidGroup.indexOfJIDPrimaryStatus(primary);
254                }
255        }
256       
257        //------------------------------Presence event------------------------------------\\
258
259        public void showChange(JIDStatus jidstatus)
260        {//als primary gebruik veranderen als in roster
261                //System.out.println("server show change");
262                //for(Iterator i = jidstatus.getGroups();i.hasNext();)
263                {//new jidstatus per group?
264                        final JIDStatusGroup jidGroup = jidTree.getGroup(I18N.gettext("main.main.roster.Servers"));
265                        final PrimaryJIDStatus primary = jidGroup.searchPrimaryJIDStatus(jidstatus.getNick());
266                        if(primary!=null)
267                        {//no status change after remove
268                                if(!jidstatus.isOnline() && !((NormalJIDStatus)jidstatus).isForcedOffline())new AutoReconnect(backend,jidstatus.getJID());
269                                Runnable updateAComponent = new Runnable() {
270                                        public void run()
271                                        {
272                                                int index = jidGroup.indexOfPrimaryJIDStatus(primary);
273                                                for(Iterator j = backend.getListeners(ServerListener.class);j.hasNext();)
274                                                {
275                                                        ((RosterListener)j.next()).primaryUpdated(jidGroup,primary,index);
276                                                }
277                                        }
278                                };
279                                try
280                                {
281                                        SwingUtilities.invokeAndWait(updateAComponent);
282                                } catch (InterruptedException e)
283                                {
284                                        e.printStackTrace();
285                                } catch (InvocationTargetException e)
286                                {
287                                        e.printStackTrace();
288                                }
289                        }
290                }
291        }
292
293        public void discoveryItemResult(JID jid, DiscoveryItem browseItem){}
294       
295        public void discoveryInfoResult(JID jid, DiscoveryInfo browseItem)
296        {
297                //System.out.println("browse" + jid + browseItem);
298                NormalJIDStatus jidStatus = (NormalJIDStatus) backend.getJIDStatus(jid);
299                if(jidStatus == null)
300                {
301                        System.out.println(jid + " is unknown jidstatus");
302                        return;
303                }
304                try
305                {//if transport has no nick/ jid as nick set nick to name of browseitem
306                        if(browseItem.getName() != null)
307                        {
308                                JID nick = JID.checkedJIDFromString(jidStatus.getNick());
309                                if(nick == null || nick.equals(jid))
310                                {
311                                        if(fireReady)
312                                        {
313                                                removeServer(jidStatus.getNick(),jidStatus);
314                                                jidStatus.setNick(browseItem.getName());
315                                                addServerNoBrowse(browseItem.getName(), jidStatus);
316                                        }
317                                        else changeNickServer(browseItem.getName(), jidStatus);
318                                }
319                        }
320                }
321                catch (Exception e)
322                {
323                        //nick already correct}
324                }
325                String type = browseItem.getType();
326                if(type == null) type = "unknown";
327                availableTransports.put(type, jidStatus);
328                if(jidStatus.getType().equals("jabber") && !type.equals("jabber"))
329                {//add type to jidstatusen in roster
330                        updateTypes(jidStatus, type);
331                }
332                //jidStatus.setNamespaces(browseItem.getNamespaces());
333        }
334
335       
336       
337        /*
338        public void browseResult(IQBrowse browseItem)
339        {
340                //System.out.println("browse");
341                NormalJIDStatus jidStatus = (NormalJIDStatus) Backend.getJIDStatus(browseItem.getJID());
342                if(jidStatus == null)
343                {
344                        System.out.println(browseItem.getJID() + " is unknown jidstatus");
345                        return;
346                }
347                try
348                {//if transport has no nick/ jid for nick set nick to name of browseitem
349                        if(browseItem.getName() != null)
350                        {
351                                JID nick = JID.checkedJIDFromString(jidStatus.getNick());
352                                if(nick == null || nick.equals(browseItem.getJID()))
353                                {
354                                        if(fireReady)
355                                        {
356                                                removeServer(jidStatus.getNick(),jidStatus);
357                                                jidStatus.setNick(browseItem.getName());
358                                                addServerNoBrowse(browseItem.getName(), jidStatus);
359                                        }
360                                        else changeNickServer(browseItem.getName(), jidStatus);
361                                }
362                        }
363                }
364                catch (Exception e){}
365                String type = browseItem.getType();
366                availableTransports.put(type, jidStatus);
367                if(type == null) type = "unknown";
368                if(jidStatus.getType().equals("jabber") && !type.equals("jabber"))
369                {//add type to jidstatusen in roster
370                        updateTypes(jidStatus, type);
371                }
372                jidStatus.setNamespaces(browseItem.getNamespaces());
373        }
374        */
375
376        private void updateTypes(NormalJIDStatus jidStatus, String type)
377        {
378           jidStatus.setType(type);
379           //System.out.println("type changed");
380           String server = jidStatus.getJID().getDomain();
381           //System.out.println(server);
382           for(Iterator i = jidStatussen.values().iterator();i.hasNext();)
383           {
384                   NormalJIDStatus ji =(NormalJIDStatus) i.next();
385                   //System.out.println(ji);
386                   if(ji.getJID().getDomain().equals(server))
387                   {//server van j == changed server
388                           ji.setType(type);
389                           /*
390                           for(Iterator i2 = ji.getGroups();i2.hasNext();)
391                          {//new jidstatus per group?
392                                  JIDGroup2 jidGroup = jidTree.getGroup((String)i2.next());
393                                  JIDPrimaryStatus primary = jidGroup.searchPrimaryJIDStatus(ji.getNick());
394                                  int index = jidGroup.indexOfJIDPrimaryStatus(primary);
395                                  for(Iterator j = backend.getListeners(RosterModelListener.class);j.hasNext();)
396                                  {
397                                          ((RosterModelListener)j.next()).primaryUpdated(jidGroup,primary,index);
398                                  }
399                        }
400                           */
401                   }
402           }
403    }
404       
405        public Map getAvailableTransports()
406        {
407                return availableTransports;
408        }
409}       
410       
411        class AutoReconnect extends Thread implements PresenceListener , StatusChangeListener
412        {
413                private Backend backend;
414                private volatile boolean connect = true;
415                private JID jid;
416               
417               
418                public AutoReconnect(Backend backend,JID jid)
419                {
420                        this.backend = backend;
421                        this.jid = jid;
422                        backend.addListener(PresenceListener.class, this);
423                        backend.addListener(StatusChangeListener.class, this);
424                        start();
425                }
426               
427                public void ownPresenceChanged(int show, String status)
428                {}
429               
430                public void connectionChanged(boolean online)
431                {//stop reconnecting when gone offline
432                        if(!online)exit();
433                }
434               
435                public void exit()
436                {
437                        connect = false;
438                        interrupt();
439                }
440               
441                public void presenceChanged(Presence presence)
442                {
443                        if(presence.getShow()!=Presence.UNAVAILABLE)exit();
444                }
445                               
446                public void run()
447                {
448                        boolean connected=false;
449                        while(connect)
450                        {
451                                backend.send(new Presence(jid,backend.getStatus(),null));
452                                if(connected) break;
453                                try
454                                {
455                                        Thread.sleep(600000);
456                                }
457                                catch (InterruptedException e){}
458                        }
459                        backend.removeListener(PresenceListener.class, this);
460                        backend.removeListener(StatusChangeListener.class, this);
461                }
462        }
463       
464
465/*
466 * Overrides for emacs
467 * Local variables:
468 * tab-width: 4
469 * End:
470 */
Note: See TracBrowser for help on using the repository browser.