import java.util.*;
import java.lang.*;
import net.jxta.exception.*;
import net.jxta.peergroup.*;
import net.jxta.peer.*;
import net.jxta.id.*;
import java.net.URI;
/**
* Classe principale de l'application
* Elle cree un pair JXTA accompagne de differents services
*/
public class MesPairs extends Thread {
private PeerGroup groupe = null; //groupe de pairs d'appartenance
private Client client = null; //envoie des messages
private Serveur serveur = null; //reception des messages
private Decouverte decouverte = null; //recherche des pairs
private Graphique graphe = null; //interface graphique du pair
private String monNom = null; //nom du pair dans le groupe
private FenetreSecondaire secondaire = null; //fenetre d'affichage des documents
private Vector documentsConnus = new Vector(); //liste des documents connus sur le reseau
private ExplorationLocale exploration = null; //exploration des fichiers locaux
/**
* Constructeur de la classe MesPairs
*/
public MesPairs() {
try {
groupe = PeerGroupFactory.newNetPeerGroup(); //cree un nouveau groupe general
} catch (Exception e) {System.err.println("MesPairs() : Erreur de creation du groupe");}
//instanciation des services de decouverte et de communications
decouverte = new Decouverte(groupe);
client = new Client("PropagatePipeAdv.xml",groupe);
serveur = new Serveur(this,"PropagatePipeAdv.xml",groupe);
//recuperation du nom du pair dans le groupe general
monNom = groupe.getPeerName().toString();
//instanciation de l'interface graphique
graphe = new Graphique(monNom,this);
//creation du module d'exploration des documents locaux
exploration = new ExplorationLocale("documents");
//creation de la fenetre secondaire pour les documents
secondaire = new FenetreSecondaire();
}
/**
* Methode de lancement de la classe MesPairs
* lance le client, le serveur, la decouverte, l'interface graphique et la fenetre secondaire
*/
public void run() {
decouverte.start();
client.start();
serveur.start();
graphe.run();
secondaire.run();
travail();
}
/**
* Oblige le pair � effectuer une recherche de pairs
* dans le r�seau toutes les 5 secondes
*/
public void travail() {
while (true) {
decouverte.rechercher(); //recherche des pairs dans le reseau
try {
Thread.sleep(5000); //endormissement du thread
} catch (Exception e) {System.err.println("MesPairs.travail() : Impossible de dormir");}
}
}
/**
* Envoi d'un message par l'utilisateur
*/
public void sendMessage(String message) {
//envoi d'un message a l'ensemble des pairs
client.sendMessage(message);
}
/**
* Affichage d'un message recu
*/
public void afficheMessage(String message) {
graphe.affiche(message);
}
/**
* Recherche des documents disponibles dans le reseau de pairs
*/
public void chercherDocument() {
documentsConnus.clear();
//demande des documents disponibles a l'ensemble des pairs
client.demandeListeDocuments(groupe.getPeerID());
}
/**
* Transformation d'une chaine de caracteres contenant un PeerID
* en un objet du type PeerID
*/
public PeerID chaineVersPeerID(String pid_str) {
PeerID dest_pid = null;
try {
dest_pid = (PeerID) ID.create(new URI(pid_str));
} catch (Exception e) { System.err.println("Erreur dans MesPairs.chaineVersPeerID()"); }
return dest_pid;
}
/**
* Recuperation aupres du proprietaire du document selectionne
*/
public void selectionDocument(int place) {
MesDocuments doc = (MesDocuments) documentsConnus.get(place);
String le_nom = doc.getNom();
String proprio = doc.getProprietaire();
//recuperation du PeerID du destinataire
PeerID dest_pid = chaineVersPeerID(proprio);
//demande d'un document a un pair
client.demanderDocument(dest_pid,le_nom);
}
/**
* Prepare l'envoi d'un document � la demande d'un pair
*/
public void traiterDemandeDocument(String sender_pid,String nom_doc) {
String le_fichier = new String(exploration.recupererFichier(nom_doc));
//recuperation du PeerID du destinataire
PeerID dest_pid = chaineVersPeerID(sender_pid);
//envoi du fichier au demandeur
client.envoyerFichier(nom_doc,le_fichier,dest_pid);
}
/**
* Preparation d'une reponse a une demande de lsite de documents
*/
public void repondreListe(String pid) {
String liste_doc = exploration.lister();
//recuperation du PeerID du destinataire
PeerID sender_pid = chaineVersPeerID(pid);
//envoi de la liste des documents au demandeur
client.envoiListeDocuments(sender_pid,liste_doc);
}
/**
* Reception et traitement d'une liste de documents venant d'un pair
*/
public void messageListeRecu(String proprio,String la_liste) {
String temp = "";
int index = 0;
//parcourt de la liste des documents
while (index<la_liste.length()) {
while (la_liste.charAt(index) != ';') {
temp += la_liste.charAt(index);
index++;
}
//memorisation des documents de la liste
MesDocuments doc = new MesDocuments(temp,proprio);
if (!documentsConnus.contains(doc)) {
documentsConnus.add(doc);
}
temp = "";
index++;
}
//affichage du resultat de la requete de documents
graphe.afficheListe(documentsConnus);
}
/**
* Reception du document distant demande par l'utilisateur
*/
public void receptionDocument(String nom_doc,String contenu_doc) {
//mise en forme puis affichage du document recu
secondaire.afficher(" ... "+nom_doc+" ...\n\n"+contenu_doc);
secondaire.montrer();
}
}