1 /********************************************************************************
2 *InternetCafe is a software solution that helps the management of Cybercafes
3 * according with the ITALIAN DECREE LAW ON ANTI-TERROR MEASURES, 27 JULY 2005.
4 * Copyright (C) 2006 Guido Angelo Ingenito
5
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 *******************************************************************************/
20
21 package base.jdbs.network;
22
23 import java.util.Hashtable;
24 import java.util.Observable;
25
26 import net.jxta.discovery.DiscoveryListener;
27 import net.jxta.discovery.DiscoveryService;
28 import net.jxta.peer.PeerID;
29 import net.jxta.peergroup.PeerGroup;
30 import net.jxta.protocol.PeerAdvertisement;
31
32 import org.apache.log4j.Logger;
33
34 import base.jdbs.JDBSPeer;
35 import base.jdbs.network.util.JxtaUtil;
36
37 /***
38 * @author skunk
39 *
40 */
41 public class PeerDiscoveryThread extends Observable implements Runnable{
42
43 public static final String THREAD_NAME = "Peer Discovery Thread";
44 public static final int DISCOVERY_INTERVAL = 30*1000;
45
46 private static final transient Logger logger = Logger.getLogger(PeerDiscoveryThread.class.getName());
47
48 private final DiscoveryService discoveryService;
49 private final PeerGroup peerGroup;
50 private final DiscoveryListener discoveryListener;
51 private final Hashtable<PeerID, JDBSPeer> peer = new Hashtable<PeerID, JDBSPeer>();
52
53 public PeerDiscoveryThread(PeerGroup peerGroup){
54 this.discoveryService = peerGroup.getDiscoveryService();
55 this.peerGroup = peerGroup;
56
57 this.discoveryService.addDiscoveryListener(this.discoveryListener = new PeerDiscoveryListener(this));
58
59 }
60
61 public synchronized JDBSPeer[] getPeer(){
62 return this.peer.values().toArray(new JDBSPeer[0]);
63 }
64
65 public synchronized void addPeer(PeerAdvertisement peerAdvertisement, PeerGroup peerGroup){
66 if(!this.peer.containsKey(peerAdvertisement.getPeerID()) && peerAdvertisement.getPeerGroupID().equals(peerGroup.getPeerGroupID())){
67 this.setChanged();
68 JDBSPeer jdbsPeer = new JDBSPeer(peerAdvertisement, peerGroup);
69 this.peer.put(peerAdvertisement.getPeerID(),jdbsPeer);
70 this.notifyObservers();
71 }
72 }
73
74
75 public void run() {
76 try {
77 while (true) {
78
79 PeerAdvertisement[] peerAdvertisement = JxtaUtil.peersInLocalCache(this.discoveryService);
80 for(int i=0;i<peerAdvertisement.length; i++)
81 this.addPeer(peerAdvertisement[i],this.peerGroup);
82
83
84 logger.info(THREAD_NAME+": Sending a Peer Discovery Message.");
85
86 this.discoveryService.getRemoteAdvertisements(null, DiscoveryService.PEER, null, null, 10, this.discoveryListener);
87
88 try {
89 Thread.sleep(DISCOVERY_INTERVAL);
90 } catch(Exception ex) {
91 logger.error(ex.getMessage());
92 }
93 }
94 }
95 catch(Exception e) {
96 e.printStackTrace();
97 }
98
99 }
100
101 /***
102 * @return Returns the peerGroup.
103 */
104 public PeerGroup getPeerGroup() {
105 return peerGroup;
106 }
107 }