Παρασκευή 11 Φεβρουαρίου 2011

Περιγραφή υλοποίησης εφαρμογής

Η εφαρμογή διαχωρίστηκε σε πακέτα (packages) κλάσεων, με σκοπό τη διάκριση των διαφόρων λειτουργιών. Αναλυτικά, απαρίζεται από τα ακόλουθα πακέτα:
·          
      Utility
Τo συγκεκριμένο πακέτο περιλαμβάνει μια κλάση, ονόματι Utility, σκοπός της οποίας είναι η δημιουργία των αναγνωριστικών των κόμβων και των αναγνωριστικών των αρχείων με τη χρήση της συνάρτησης SHA-1.

·         Structures
To πακέτο Structures περιλαμβάνει κλάσεις, οι οποίες αναπαριστούν τα βασικά συστατικά κομμάτια για τη λειτουργία του Pastry. Συγκεκριμένα περιλαμβάνει τις ακόλουθες κλάσεις:
  •       Η κλάση KeyID αναπαριστά ένα αναγνωριστικό και περιέχει τις κατάλληλες μεθόδους για τις συγκρίσεις αναγνωριστικών που χρειάζονται.
  •      Για την συγκέντρωση όλων των πληροφοριών που είναι απαραίτητες για τη μεταφορά ενός μηνύματος πάνω στο δακτύλιο του Pastry χρησιμοποιείται η κλάση Message, η οποία περιλαμβάνει το αναγνωριστικό το οποίο δρομολογείται στο δακτύλιο, την IP και το port του αρχικού αποστολέα, καθώς και τον τύπο του μηνύματος (JOIN, FILE_INSERT κ.τ.λ.)
  •       Όλες οι δομικές ενότητες του Pastry (leaf set, neighbor set, routing table, available files) βρίσκονται στην κλάση PastryNode.

·         Communication
Στο πακέτο Communication εντοπίζονται όλες οι κλάσεις που σχετίζονται με την επικοινωνία μέσω της τεχνολογίας RMI, καθώς και η υλοποίηση των μεθόδων του πρωτοκόλλου Pastry.
  •     Η κλάση PastryFunctions είναι η διεπαφή η οποία ορίζει αφηρημένα τις προς υλοποίηση κλάσεις (route, forward, downloadFile, uploadFile, updateStructures).
  •      Η κλάση PastryServer περιλαμβάνει την υλοποίηση όλων των μεθόδων που ορίζονται στην κλάση PastryFunctions, καθώς και άλλων, οι οποίες καλούνται τοπικά και όχι μέσω RMI, π.χ. η μέθοδος deliver.
  •      Η απομακρυσμένη κλήση μεθόδων μέσω RMI πραγματοποιείται μέσω της κλάσης PastryClient.

·         Display
Στο τελευταίο πακέτο περιλαμβάνεται η κλάση MainApp, η οποία είναι η υλοποίηση γραφικής διεπαφής για την εφαρμογή αποτελεί την κύρια διασύνδεση των υπολοίπως πακέτων.

Συσχέτιση πακέτων κώδικα

Η συσχέτιση των πακέτων και των κλάσεων διαφαίνεται στο παρακάτω σχήμα:


Το πακέτο Utility χρησιμοποιείται από όλα τα άλλα πακέτα. Το πακέτο Structures αξιοποιείται από το πακέτο Communication και το πακέτο Display, ενώ το πακέτο Communication χρησιμοποιείται μόνο από το πακέτο Display. Τέλος, το πακέτο Display αξιοποιεί μόνο τα άλλα πακέτα και δε χρησιμοποείται από κάποιο.

Αποκλίσεις από τις προδιαγραφές της περιγραφής της αρχιτεκτονικής

Αρχικά, είχε γίνει η παραδοχή πως δύο χρήστες αποφασίζουν τη δημιουργία ενός δακτυλίου και το πραγματοποιούν με τη μεταξύ τους ανταλλαγή πληροφοριών για την αρχικοποίηση των καταστάσεων δρομολόγησης. Αντί αυτού, ο δακτύλιος δημιουργείται με τη βοήθεια ενός αρχικού κόμβου (bootstrap node), με τον οποίο επικοινωνεί κάθε κόμβος που επιθυμεί να εισαχθεί στο δακτύλιο καθόλη τη διάρκεια ύπρξης του δακτυλίου. Καθώς η IP και το port του αρχικού κόμβου είναι γνωστά σε κάθε υποψήφιο χρήστη, ο υποψήφιος χρήστης επικοινωνεί με τον αρχικό κόμβο με χρήση της τεχνολογίας RMI.



Εκτέλεση εφαρμογής

Η μέθοδος εκτέλεσης της εφαρμογής βρίσκεται στην κλάση MainApp του πακέτου Display. To πρώτο στιγμιότυπο της εφαρμογής θα πρέπει να λειτουργήσει ως αρχικός κόμβος (επιλέγοντας το σχετικό check-box). Στη συνέχεια, κάθε νέος κόμβος θα πρέπει να δίνει ως είσοδο προτού ξεκινήσει, μέσω των σχετικών text-boxes, την IP και το port του αρχικού κόμβου.
                Ο αρχικός κόμβος αναλαμβάνει να δρομολογήσει το δακτύλιο ένα JOIN μήνυμα για το νέο κόμβο. Μέσω αυτού του τρόπου και βάσει όσων περιγράφει το πρωτόκολλο Pastry για τη διαδικασία της εισόδου ενός κόμβου, πραγματοποιείται η είσοδος ενός νέου κόμβου παράλληλα με την ενημέρωση των δομών του Pastry κάθε κόμβου που βρίσκεται στο routing path του JOIN μηνύματος. Η διαδικασία εισόδου ολοκληρώθηκε και ο κόμβος είναι έτοιμος να διαθέσει στο δακτύλιο ένα ή περισσότερα αρχεία μουσικής και να αναζητήσει κάποιο αρχείο μουσικής.
                Για την προσθήκη ενός αρχείου στο δακτύλιο, δημιουργείται ένα νέο αναγνωριστικό, βασισμένο στο όνομα του αρχείου, το οποίο παράγεται κατά τον ίδιο τρόπο με το αναγνωριστικό του κόμβου. Στη συνέχεια, δρομολογείται ένα νέο μήνυμα στο δακτύλιο με προορισμό το αναγνωριστικό του αρχείου μουσικής. Μόλις φτάσει στον κόμβο που θα είναι υπεύθυνος για το αρχείο, ο συγκεκριμένος κόμβος “κατεβάζει” το αρχείο από τον κόμβο-πηγή μέσω RMI, καλώντας τη μέθοδο downloadFile.