Μηχανή εκτέλεσης ροών εργασίας για συστήματα χαμηλών προδιαγραφών

Μέγεθος: px
Εμφάνιση ξεκινά από τη σελίδα:

Download "Μηχανή εκτέλεσης ροών εργασίας για συστήματα χαμηλών προδιαγραφών"

Transcript

1 ΕΘΝΙΚΌ ΜΕΤΣΌΒΙΟ ΠΟΛΥΤΕΧΝΕΊΟ ΣΧΟΛΉ ΗΛΕΚΤΡΟΛΌΓΩΝ ΜΗΧΑΝΙΚΏΝ ΚΑΙ ΜΗΧΑΝΙΚΏΝ ΥΠΟΛΟΓΙΣΤΏΝ ΤΟΜΈΑΣ ΕΠΙΚΟΙΝΩΝΙΏΝ, ΗΛΕΚΤΡΟΝΙΚΉΣ ΚΑΙ ΣΥΣΤΗΜΆΤΩΝ ΠΛΗΡΟΦΟΡΙΚΉΣ Μηχανή εκτέλεσης ροών εργασίας για συστήματα χαμηλών προδιαγραφών ΔΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ του Νικολάου-Σταύρου Ζευγολάτη Επιβλέπων : Θεοδώρα, Α., Βαρβαρίγου Καθηγήτρια Αθήνα, Νοέμβριος 2009

2

3 ΕΘΝΙΚΌ ΜΕΤΣΌΒΙΟ ΠΟΛΥΤΕΧΝΕΊΟ ΣΧΟΛΉ ΗΛΕΚΤΡΟΛΌΓΩΝ ΜΗΧΑΝΙΚΏΝ ΚΑΙ ΜΗΧΑΝΙΚΏΝ ΥΠΟΛΟΓΙΣΤΏΝ ΤΟΜΈΑΣ ΕΠΙΚΟΙΝΩΝΙΏΝ, ΗΛΕΚΤΡΟΝΙΚΉΣ ΚΑΙ ΣΥΣΤΗΜΆΤΩΝ ΠΛΗΡΟΦΟΡΙΚΉΣ Μηχανή εκτέλεσης ροών εργασίας για συστήματα χαμηλών προδιαγραφών ΔΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ του Νικολάου-Σταύρου Ζευγολάτη Επιβλέπων : Θεοδώρα, A., Βαρβαρίγου Καθηγήτρια Εγκρίθηκε από την τριμελή εξεταστική επιτροπή την 3 η Νοεμβρίου Θεοδώρα Βαρβαρίγου Καθηγήτρια... Παπαβασιλείου Συμεών Επίκουρος Καθηγητής... Βασίλειος Λούμος Καθηγητής Αθήνα, Νοέμβριος 2009

4 ... Νικόλας-Σταύρος, Α., Ζευγολάτης Διπλωματούχος Ηλεκτρολόγος Μηχανικός και Μηχανικός Υπολογιστών Ε.Μ.Π. Copyright Νικόλας-Σταύρος, Α., Ζευγολάτης, Με επιφύλαξη παντός δικαιώματος. All rights reserved. Απαγορεύεται η αντιγραφή, αποθήκευση και διανομή της παρούσας εργασίας, εξ ολοκλήρου ή τμήματος αυτής, για εμπορικό σκοπό. Επιτρέπεται η ανατύπωση, αποθήκευση και διανομή για σκοπό μη κερδοσκοπικό, εκπαιδευτικής ή ερευνητικής φύσης, υπό την προϋπόθεση να αναφέρεται η πηγή προέλευσης και να διατηρείται το παρόν μήνυμα. Ερωτήματα που αφορούν τη χρήση της εργασίας για κερδοσκοπικό σκοπό πρέπει να απευθύνονται προς τον συγγραφέα. Οι απόψεις και τα συμπεράσματα που περιέχονται σε αυτό το έγγραφο εκφράζουν τον συγγραφέα και δεν πρέπει να ερμηνευθεί ότι αντιπροσωπεύουν τις επίσημες θέσεις του Εθνικού Μετσόβιου Πολυτεχνείου.

5 Πρόλογος Η παρούσα διπλωματική εργασία εκπονήθηκε κατά τη διάρκεια του εαρινού εξαμήνου του ακαδημαϊκού έτους από τον Ζευγολάτη Νικόλαο-Σταύρο. Θα ήθελα να ευχαριστήσω την καθηγήτρια κα Θεοδώρα Βαρβαρίγου για την ανάθεση της εργασίας, την παρακολούθηση και παροχή κατευθύνσεων για την υλοποίηση της, την εξασφάλιση ιδανικών συνθηκών εργασίας και μελέτης καθώς και για την ευκαιρία που μου έδωσε να ασχοληθώ με ένα άκρως ενδιαφέρον κεφάλαιο του σύγχρονου αλλά κατά βάση και μελλοντικού διαδικτύου. Επίσης, θα ήθελα να ευχαριστήσω τον διδακτορικό φοιτητή του εργαστηρίου Τηλεπικοινωνιών, κο Σπύρο Γωγουβίτη για την άψογη συνεργασία που είχαμε όλο αυτό το διάστημα και τον τρόπο που με καθοδήγησε σε ένα ομολογουμένως αχανές γνωστικό αντικείμενο και που με αμέριστη υπομονή και συμπαράσταση, συνέβαλε με τον τρόπο του στην ολοκλήρωση αυτού του έργου. H συμβολή των δύο ανωτέρω ήταν καθοριστική τόσο στην περίοδο έρευνας του αντικειμένου της εργασίας όσο και κατά τη διάρκεια της συγγραφής της. Τέλος, θα ήθελα να ευχαριστήσω την οικογένειά μου, καθώς δίχως την συνεχή συμπαράστασή της όλα αυτά τα χρόνια και τις πολλές θυσίες που έχει κάνει για την ολοκλήρωση των σπουδών μου, όλα αυτά θα ήταν αδύνατα. Νοέμβριος 2009 Ζευγολάτης Νικόλαος-Σταύρος

6 Περίληψη Σκοπός της παρούσας διπλωματικής εργασίας είναι να μελετηθεί η ανάπτυξη της τεχνολογίας των δικτυακών υπηρεσιών καθώς και των τεχνολογιών που χρησιμοποιούνται ή βρίσκονται υπό ανάπτυξη προκειμένου να ενταχθούν οι δικτυακές υπηρεσίες σε αυτόνομες ροές εκτέλεσης ή επιχειρησιακές διαδικασίες. Η υλοποίηση είναι ανοικτού λογισμικού και αφορά την δημιουργία μίας μηχανής όπου δέχεται ένα αρχείο ροής εργασίας μεταξύ διαφορετικών δικτυακών υπηρεσιών σε γλώσσα bpel, το αναλύει και στην συνέχεια το υλοποιεί χρησιμοποιώντας σύγχρονη επικοινωνία μεταξύ των υπηρεσιών. Στόχος της εργασίας ήταν η υπηρεσία αυτή να απαιτεί λίγους υπολογιστικούς πόρους και να είναι γρήγορη, γεγονός που επετεύχθη. Λέξεις κλειδιά: WS-BPEL, WSDL, δικτυακές υπηρεσίες, Ροή εκτέλεσης δικτυακών υπηρεσιών, επιχειρησιακές διαδικασίες, πλέγμα, σύννεφο

7 Abstract The purpose of this thesis is to study the design technology of web services and as well as as the technology that is used or is under development to integrate web services into independent streams of execution or operational procedures. The implementation is open source and it involves the creation of an engine which accepts a workflow file between different web services in bpel language, analyzes it and then it implements it, using synchronous communication. The aim of this study was to insure that the service requires few computing resources and is fast, a goal which that was reached. Keywords : Web services, Business processes, WS-BPEL, execution flows, workflows, bpel enactor, grid, cloud, computing, synchronous communication

8 ΕΙΣΑΓΩΓΗ Τις τελευταίες δεκαετίες έχει παρατηρηθεί μια τεράστια εξάπλωση του διαδικτύου (Internet) σε διάφορους τομείς της ανθρώπινης δραστηριότητας. Αρχικά επρόκειτο για μεταφορά απλών html σελίδων και βασικών υπηρεσιών όπως και ftp. Με την πάροδο, όμως, του χρόνου σημειώθηκε ραγδαία ανάπτυξη και προσθήκη όλο και πιο πολύπλοκων διαδικασιών. Το διαδίκτυο αποτελεί στην ουσία του, ένα δίκτυο διασυνδεδεμένων υπολογιστών, οι οποίοι αλληλεπιδρούν και παρέχουν σημαντικές πληροφορίες και υπηρεσίες, ένα δίκτυο υπολογιστικών συστημάτων πολλών διαφορετικών κατασκευαστών, διαφορετικών αρχιτεκτονικών και διαφορετικών λειτουργικών συστημάτων. Στόχος και σκοπός του συγκεκριμένου δικτύου είναι να μπορέσει να προσφέρει υπηρεσίες: υπηρεσίες ενημέρωσης, υπηρεσίες διεκπεραίωσης, υπηρεσίες ψυχαγωγίας και υπηρεσίες διασύνδεσης. Σε αυτό το δίκτυο που προσφέρει υπηρεσίες, εταιρείες και ιδιώτες προσπαθούν να διαχειριστούν τις υπηρεσίες με έναν κατανεμημένο τρόπο, ανεξάρτητα της αρχιτεκτονικής των υπολογιστών, σε μία γλώσσα κοινή σε όλους. Μία γλώσσα που προσπαθεί να λύσει το παραπάνω ζήτημα τα τελευταία χρονιά είναι η WS-BPEL(Business Process Execution Language Web Services). Με δομή(structure) απλή, καλά ορισμένη και ανεξάρτητη πλατφόρμας έχει αρχίσει να κυριαρχεί στο διαδίκτυο, ενώ συνεχώς επεκτείνεται και βελτιώνεται. Η WS-BPEL, όπως μαρτυρά και το όνομά της, αποτελεί μία γλώσσα που διαχειρίζεται διαγράμματα ροής διεργασιών προς εκτέλεση. Συνδυάζει απλότητα με δύναμη, ταχύτητα με αποτελεσματικότητα. Άμεση συνέπεια τούτου είναι να προσελκύει ολοένα και περισσότερο το ενδιαφέρον όλο και περισσότερων προγραμματιστών αλλά και μεγάλων εταιρειών του χώρου που επιθυμούν να την υιοθετήσουν ή να την υποστηρίξουν.

9 Πίνακας περιεχομένων Πρόλογος... 5 ΕΙΣΑΓΩΓΗ Web services Τί είναι τα web services(δικτυακές υπηρεσίες) H τεχνολογία των web services Σενάρια υλοποίησης Πλεονεκτήματα και μειονεκτήματα Πλεονεκτήματα Μειονεκτήματα XML Eισαγωγή Τι είναι η XML; Διαφορές μεταξύ XML και HTML Η XML δεν κάνει κάτι συγκεκριμένο Η XML είναι απλή και επεκτάσιμη Η XML είναι ένα συμπλήρωμα της HTML Η XML στην ανάπτυξη μελλοντικών Web εφαρμογών WSDL (Web Service Description Language) Η WSDL προδιαγραφή Παράδειγμα Αρχιτεκτονικές Υπηρεσιοστραφής Αρχιτεκτονική (Service Oriented Architecture - SOA) Γενικά SOA Συνθέσεις (SOA Compositions) Ενορχήστρωση Χορογραφία Πλεγματικά συστήματα (Grid & cloud computing) Γενικά Ορισμός Η αρχιτεκτονική πλέγματος (Grid Architecture) Fabric (Ύφανση) Connectivity (Συνδεσιμότητα) Resource (Πόροι) Collective (Συλλογικό) Εφαρμογές Παραδείγματα Grid Συστημάτων Διαγράμματα ροής δεδομένων Γενικά Ορισμός Σχετικές έννοιες Ιστορική αναδρομή Χαρακτηριστικά και φαινομενολογία Συνιστώσες ροών εργασίας BPEL Ορισμός Γενικά... 57

10 3.2.3 Ιστορία Σχεδιαστικοί στόχοι της BPEL Η γλώσσα BPEL BPEL διαδικασίες WSDL Ορισμοί για Σύνθετες Υπηρεσίες Τρόπος λειτουργίας Η δομή ενός αρχείου WS-BPEL Παράδειγμα WS-BPEL ορισμού Διαφορές με ροές εργασίας σε πλέγματα Μηχανές εκτέλεσης ροών εργασίας BPEL Εργαλεία Εγκατάσταση των εργαλείων Java Development Kit (JDK) Έκδοση του JDK Εγκατάσταση Γιατί χρησιμοποιήθηκε η Java Tomcat Έκδοση του Tomcat Εγκατάσταση του Tomcat Γιατί χρησιμοποιήθηκε ο Tomcat AXIS Έκδοση του Axis Γενικά για τον AXIS Γιατί χρησιμοποιήθηκε ο Axis; Eclipse Έκδοση Εγκατάσταση Γιατί χρησιμοποιήθηκε ο Eclipse VTD-XML Έκδοση Εγκατάσταση Γιατί χρησιμοποιήθηκε το vtd-xml Υλοποίηση Σκοπός Πλεονεκτήματα Υλοποίησης Δομή Υλοποίησης Παράδειγμα χρήσης Παράρτημα Α ΒΙΒΛΙΟΓΡΑΦΙΑ

11 1. Web services 1.1 Τί είναι τα web services(δικτυακές υπηρεσίες) Ο καθαρός ορισμός μιας υπηρεσίας διαδικτύου (web service) σύμφωνα με το World Wide Web Consortium είναι ένα σύστημα λογισμικού σχεδιασμένο για να υποστηρίζει διαλειτουργική αλληλεπίδραση από μηχανή-σε-μηχανή μέσω δικτύου. Έχει μια διεπαφή που περιγράφεται από μία εύκολα επεξεργάσιμη μορφή από μηχανή (συγκεκριμένα την WSDL). Άλλα συστήματα αλληλεπιδρούν με την υπηρεσία διαδικτύου σε μια διαδικασία που προβλέπεται από την περιγραφή της, χρησιμοποιώντας SOAP μηνυμάτα, που συνήθως μεταφέρονται χρησιμοποιώντας το πρωτόκολλο HTTP με σειριοποίηση ενός XML σε συνδυασμό με άλλα πρότυπα που σχετίζονται με το διαδίκτυο 1. Ο όρος web services, όπως υπονοεί το όνομά του, αναφέρεται σε υπηρεσίες προσβάσιμες μέσω του διαδικτύου. Στον όρο, όμως, εμπεριέχονται πολύ περισσότερες έννοιες απ' ότι υπονοεί η ονομασία του. Με την έννοια web services αναφερόμαστε και στην αρχιτεκτονική, τα πρότυπα, την τεχνολογία και τα επιχειρησιακά μοντέλα που απαιτούνται για να υπάρξουν και να υλοποιηθούν οι web services. Ακολουθεί ένας επιπλέον ορισμός των web services, όπως αυτός δίνεται από την IBM: Οι web services αποτελούν την νέα γενιά δικτυακών εφαρμογών. Είναι αυτοπεριεχόμενες, αυτοπεριγραφούμενες εφαρμογές, οι οποίες δημοσιεύονται και τοποθετούνται αλλά και καλούνται μέσω του διαδικτύου. Οι web services υλοποιούν υπηρεσίες που μπορεί να είναι από απλές μέχρι σύνθετες επιχειρησιακές διαδικασίες. Πιο απλά, μια web service είναι μια υπηρεσία διαθέσιμη στο διαδίκτυο, η οποία χρησιμοποιεί ένα καθορισμένο σύστημα μηνυμάτων βασισμένα σε XML και δεν είναι δεμένη με κανένα λειτουργικό σύστημα ή γλώσσα προγραμματισμού. Από τα παραπάνω προκύπτει ότι θέλουμε μια web service να παρουσιάζει δύο χαρακτηριστικά:

12 Μια web service πρέπει να είναι αυτοπεριγραφούμενη. Όταν δημοσιεύεται μια web service πρέπει να δημοσιεύεται επίσης και μια διεπαφή (interface) προς αυτήν, τουτέστιν μια περιγραφή αυτής έτσι, ώστε σε ανάπτυξη ολοκληρωμένων συστημάτων να μπορεί να ενοποιηθεί μαζί με άλλες και να είναι εύκολα υλοποιήσιμη. Αυτό γίνεται μέσω του αρχείου περιγραφής της υπηρεσίας, WSDL, για το οποίο θα μιλήσουμε παρακάτω. Μια web service πρέπει να είναι ανακαλύψιμη. Όταν δημιουργείται μια web service τότε πρέπει να γνωστοποιείται αυτό το γεγονός. Πρέπει, δηλαδή, να δημοσιεύεται ένα interface αυτής ώστε να είναι σε θέση οι ενδιαφερόμενοι να την βρουν και να την καλέσουν. Είναι αυτόνομα μέρη, τα οποία επεξεργάζονται καλώς ορισμένα XML αρχεία Συνοπτικά μια ολοκληρωμένη web service είναι μια υπηρεσία η οποία: 1. Είναι διαθέσιμη στο διαδίκτυο ή σε ιδιωτικά-εταιρικά δίκτυα 2. Χρησιμοποιεί ένα καθορισμένο σύστημα μηνυμάτων βασισμένο σε XML 3. Δεν είναι δεμένη με κανένα λειτουργικό σύστημα ή γλώσσα προγραμματισμού 4. Είναι αυτό-περιγραφόμενη μέσω κοινής XML γραμματικής 5. Είναι ανακαλύψιμη μέσω μιας απλής διαδικασίας εύρεσης (find) 1.2 H τεχνολογία των web services Για πιο εύκολη κατανόηση και διαχείριση των web services, έχουν κατηγοριοποιηθεί σε ένα μοντέλο επιπέδων. Η μοντελοποίηση, όπως και στο μοντέλο 7-επιπέδων του OSI, ξεκινάει από το κατώτερο επίπεδο, το οποίο επιτρέπει τη μεταφορά δεδομένων από το ένα μηχάνημα στο άλλο, ενώ προχωρώντας προς τα ανώτερα επίπεδα, κρύβονται λεπτομέρειες των προηγούμενων επιπέδων. 12

13 Εικόνα 2: Στρώμα Υπηρεσίας Διαδικτύου Μία γρήγορη ανάλυση των επιπέδων αυτών είναι: Service Transport (Επίπεδο Μεταφοράς) Η λειτουργία του επιπέδου μεταφοράς είναι να μεταφέρει δεδομένα από ένα σημείο σε ένα άλλο. Αποτελεί το πρωτόκολλο για τη μετάδοση δεδομένων των web services. Οι web services χρησιμοποιούν διάφορα πρωτόκολλα για να μεταφέρουν τα δεδομένα από υπηρεσία σε υπηρεσία, συμπεριλαμβανομένων των HTTP, SMTP, FTP, χωρίς όμως να περιορίζονται μόνο σε αυτά. Το πιο διαδεδομένο πρωτόκολλο μέχρι στιγμής που χρησιμοποιούν οι web services είναι το HTTP. Χρησιμοποιείται περισσότερο γιατί δεν μπλοκάρεται από firewalls και αποτελεί κατ' αυτόν τον τρόπο το πρότυπο για διαλειτουργικά συστήματα. Service Messaging (Επίπεδο Μηνυμάτων) Το επίπεδο μηνυμάτων περιγράφει σε τι μορφές θα είναι τα δεδομένα ώστε να μπορούν να μεταφερθούν από τη μια υπηρεσία στην άλλη. Η XML είναι η βασική μορφή που χρησιμοποιείται για τις web services. Τα δεδομένα που διαμορφώνονται με βάση την XML είναι σαν δέντρο (tree) με στοιχεία (elements) και ολόκληρη η δενδρική μορφή καλείται έγγραφο (document). Η XML δεν έχει ξεχωριστή περιγραφή δεδομένων γιατί τα ίδια τα δεδομένα περιγράφουν τον εαυτό τους κι αυτό γιατί έχουν 13

14 ειδικές ετικέτες που τους δίνουν ένα όνομα καθώς και την θέση τους μέσα στη δενδρική μορφή. Το SOAP (Simple Object Access Protocol) είναι μια προδιαγραφή που λέει στον καταναλωτή μιας υπηρεσίας και στον προμηθευτή αυτής πώς να διαμορφώσουν και να διαβάσουν ένα μήνυμα γραμμένο σε XML που χρησιμοποιείται από μια υπηρεσία. Ένα SOAP μήνυμα έχει τρεις περιοχές: τον φάκελο, την επικεφαλίδα και το σώμα. Το SOAP επιτρέπει να εκκινήσει μια λειτουργία με την συγκεκριμένη ακολουθία χαρακτήρων στέλνοντας σε αυτή ένα SOAP μήνυμα. Το SOAP ορίζει την μορφή των XML κειμένων που στένονται πάνω από το HTTP είτε σαν ερωτήσεις είτα σαν απαντήσεις από μια δικτυακή υπηρεσία. Service Description (Επίπεδο Περιγραφής) Το επίπεδο περιγραφής καθορίζει τρεις πλευρές μιας web service: Μεθόδους τις οποίες μια web service κάνει διαθέσιμες Τα μηνύματα που δέχεται μια web service Το πρωτόκολλο, το οποίο πρέπει να χρησιμοποιήσει ο πελάτης για να καλέσει τη web service Πρωταρχικής σημασίας θεωρείται ο ορισμός μιας συγκεκριμένης μεθόδου περιγραφής της κάθε δικτυακής υπηρεσίας. Για τον σκοπό αυτόν δημιουργήθηκε η περιγραφική γλώσσα WSDL(Web Services Description Language) 2 για να καθορίσει μια σύμβαση υπηρεσίας. Η WSDL περιγράφει κάθε δικτυακή υπηρεσία σαν ένα σύνολο από θύρες, οι οποίες κατηγοριοποιούν μια σειρά από διεργασίες που μπορούν να πραγματοποιηθούν ανάμεσα σε έναν χρήστη και στην δικτυακή υπηρεσία. Οι διεργασίες αυτές ονομάζονται λειτουργίες και έχουν ένα μήνυμα εισόδου και ενίοτε ένα σημείο εξόδου. Η κάθε λειτουργία περιγράφει μια διεργασία η οποία μπορεί να πραγματοποιηθεί μεταξύ χρήστη και δικτυακής υπηρεσίας. Αυτό μπορεί να σημαίνει πως η εφαρμογή που την χρησιμοποιεί ζητά από την δικτυακή υπηρεσία να κάνει κάτι και να επιστρέψει το αποτέλεσμα, αλλά και ότι η δικτυακή υπηρεσία μπορεί να εκκινήσει μια διαδικασία για την οποία η εφαρμογή πρέπει να αντιδράσει αναλόγως

15 Ο πελάτης μιας υπηρεσίας χρησιμοποιεί την περιγραφή αυτή με δύο τρόπους: 1. Κατά την ώρα της ανάπτυξης της υπηρεσίας (development time), ο πελάτης μπορεί να δημιουργήσει ένα στέλεχος αυτής (stub) χρησιμοποιώντας την περιγραφή αυτής. Το στέλεχος (stub) είναι μια κλάση η οποία συμφωνεί με την περιγραφή της υπηρεσίας. Ο πελάτης συνδέεται με το στέλεχος κατά την ώρα της σύνταξης (compile time). Αυτό καλείται αρχικό δέσιμο (early binding). Ο πελάτης γνωρίζει την διεπαφή την οποία θα χρησιμοποιήσει για να επικοινωνήσει με την δικτυακή υπηρεσία. 2. Οι web services υποστηρίζουν επίσης και την ιδέα του καθυστερημένου δεσίματος (late binding), ένα δέσιμο που γίνεται μόνο κατά την ώρα που εκτελείται μια υπηρεσία μεταξύ του πελάτη και του παροχέα της υπηρεσίας. Αυτό γίνεται χρησιμοποιώντας ένα δυναμικό πληρεξούσιο (dynamic proxy) που διαμορφώνεται δυναμικά κατά την ώρα της εκτέλεσης χρησιμοποιώντας την WSDL περιγραφή της υπηρεσίας. Η WSDL περιγράφει μία δικτυακή υπηρεσία στα πλαίσια την λειτουργιών που αυτή μπορεί να υλοποιήσει. Με τον τρόπο αυτό δεν περιγράφεται όμως η ακριβής μέθοδος που θα χρησιμοποιήσει μια εφαρμογή για να επικοινωνήσει με την δικτυακή υπηρεσία. Η WSDL επιτρέπει ένα συγκεκριμένο προτύπο σύνδεσης με την δικτυακή υπηρεσία, μέσω του πρωτοκόλλου επικοινωνίας SOAP. Περισσότερα για την WSDL θα δοθούν παρακάτω. Service Registry - Κατάλογος Υπηρεσιών Με την βοήθεια του SOAP και της WSDL μπορούμε να περιγράψουμε μια δικτυακή υπηρεσία και να χρησιμοποιήσουμε δικτυακές υπηρεσίες μέσα από εφαρμογές. Το μόνο που έμενε να καθοριστεί ήταν ένας τρόπος ανεύρεσης δικτυακών υπηρεσιών. Για τον σκοπό αυτό δημιουργήθηκε ένα πρότυπο όσον αφορά την δημιουργία ευρετηρίων για την ανεύρεση διαφόρων δικτυακών υπηρεσιών. Οι web services υποστηρίζουν αυτή την ιδέα, της δυναμικής εύρεσης υπηρεσιών. Ένας πελάτης χρησιμοποιεί την αποθήκη υπηρεσιών για να ανακαλύψει υπηρεσίες που τον ενδιαφέρουν. Το UDDI (Universal Description, Discovery and Integration) είναι μια web service από μόνη της που υποστηρίζει ένα σύνολο υπηρεσιών οι οποίες 15

16 επιτρέπουν σε ένα χρήστη μιας υπηρεσίας να ανακαλύψει δυναμικά και να εντοπίσει την περιγραφή μιας υπηρεσίας διαδικτύου. Τα UDDI ευρετήρια είναι από μόνα τους υπηρεσίες διαδικτύου που εκθέτουν μία διεπαφή προγραμματισμού εφαρμογών (application programming interface - API) ως ένα σύνολο καλά διαμορφωμένων SOAP μηνυμάτων. Τόσο ο παροχέας μιας υπηρεσίας όσο και ο καταναλωτής αυτής χρησιμοποιούν το SOAP και το HTTP για να δημοσιεύσουν μια υπηρεσία στο ευρετήριο και να λάβουν πληροφορίες για όποιες άλλες ενδιαφέρονται. Τα δημόσια ευρετήρια UDDI υπηρεσιών παρέχουν πληροφορίες για το σημείο στο οποίο μπορείς να καλέσεις την υπηρεσία, τον ιδιοκτήτη της εταιρείας που παρέχει την υπηρεσία και κάποιες τεχνικές πληροφορίες για την web service. Το UDDI υποστηρίζει δύο τύπους συνομιλίας: Ο παροχέας υπηρεσίας χρησιμοποιεί την UDDI αποθήκη για να δημοσιεύσει πληροφορίες σχετικά με τις υπηρεσίες που παρέχει. Ο καταναλωτής μιας υπηρεσίας στέλνει XML μηνύματα διαμορφωμένα σύμφωνα με το SOAP προς την αποθήκη υπηρεσιών για να παραλάβει μια λίστα από υπηρεσίες που ταιριάζουν στα κριτήριά του. Service Composition - Σύνθεση Υπηρεσιών Η σύνθεση υπηρεσιών αναφέρεται στην δυνατότητα να συνδυάζουμε υπηρεσίες σε μια ροή εργασίας. Η σύνθεση υπηρεσιών αναφέρεται στην ικανότητα να βάζεις σε μια λογική σειρά και να κατευθύνεις συνομιλίες μεταξύ υπηρεσιών σε μια μεγαλύτερη συναλλαγή. Αυτό αναφέρεται επίσης ως «ενορχήστρωση υπηρεσιών» ή ως «χορογραφία υπηρεσιών» (service orchestration ή service choreography). Ενορχήστρωση: Αναφέρεται σε μια εκτελέσιμη επιχειρηματική διαδικασία που μπορεί να αλληλεπιδράσει με εσωτερικές και εξωτερικές υπηρεσίες διαδικτύου. Η ενορχήστρωση περιγράφει πώς υπηρεσίες διαδικτύου μπορούν να αλληλεπιδράσουν στο επίπεδο μηνύματος, συμπεριλαμβανομένης της επιχειρηματικής λογικής καθώς και της εκτέλεσης των αλληλεπιδράσεων. Η ενορχήστρωση 3 πραγματοποιείται από κάποιον που μπορεί να συντονίζει τις υπηρεσίες. Ένα μηχάνημα ή μία υπηρεσία, καλεί

17 όλα τα υπόλοιπα και διαχειρίζεται εκείνο/εκείνη τις αιτήσεις αλλά και τα αποτελέσματα που αυτές του/της επιστρέφουν. Χορογραφία: μεγαλύτερη συνεργασία από την φύση της, όπου καθένα από τα μέρη που εμπλέκονται στη διαδικασία περιγράφει το ρόλο τους στην αλληλεπίδραση. Στην χορογραφία καταγράφεται η ακολουθία των μηνυμάτων που μπορεί να περιλαμβάνει πολλά μέρη και πολλαπλές πηγές. Στην χορογραφία, οι ίδιες οι υπηρεσίες γνωρίζουν μόλις πάρουν ένα αίτημα για να εξυπηρετήσουν πού ακριβώς θα πρέπει να απευθυνθούν για να δώσουν το αποτέλεσμά τους. Συνεπώς, στην δεύτερη περίπτωση δεν απαιτείται κάποιος κεντρικός συντονιστής προκειμένου να περατωθεί μία υπηρεσία. Υπάρχει πληθώρα προτεινόμενων γλωσσών για να περιγράψουν ένα επιχειρηματικό διαδικαστικό διάγραμμα. Οι δύο περισσότερο γνωστές είναι οι WSFL και XLANG. Πρόσφατα οι εταιρείες IBM, Microsoft και BEA συνδύασαν τις δύο παραπάνω γλώσσες σε μία προδιαγραφή που ονομάζεται BPEL4WS (Business Process Execution Language for Web Services), με την οποία θα ασχοληθούμε παρακάτω. 1.3 Σενάρια υλοποίησης 17

18 Αφού μια web service μπορεί να αναπτυχθεί σε πολλές διαφορετικές πλατφόρμες, μπορεί και να ακολουθήσει πολλά μοντέλα υλοποίησης. Το μοντέλο υλοποίησης που χρησιμοποιεί εξαρτάται από το πρόβλημα που πρέπει να λυθεί και τις διαθέσιμες πλατφόρμες για την δημιουργία του μοντέλου. Το μοντέλο για την ολοκλήρωση μιας web service μπορεί να κατηγοριοποιηθεί σε 4 τύπους: απλής υπηρεσίας, σύνθετης υπηρεσίας, ενδιάμεσης υπηρεσίας και ενός διαδρόμου υπηρεσιών. Απλή υπηρεσία Η πιο απλή υπηρεσία είναι να έχουμε έναν web service το οποίο θα μας επιστρέφει μία σελίδα Http στον φυλλομετρητή μας. Έτσι, κάθε φορά που ένας χρήστης εισάγει στον φυλλομετρητή του την τοποθεσία της υπηρεσίας μου, εκείνη θα του επιστρέφει ένα σύνολο από bytes που θα του επιτρέπουν αν δει την ιστοσελίδα μου. Browse r Servlet Database Σύνθετη Υπηρεσία Εικόνα 3: Σενάριο απλής υπηρεσίας Μια σύνθετη υπηρεσία στην ουσία είναι μία ένωση πολλών απλών ή ακόμα και επιπλέον σύνθετων υπηρεσιών. Παραδείγματος χάριν, θα μπορούσε μία σύνθετη υπηρεσία να είναι η εξής: Ο χρήστης να δίνει τα credentials του καθώς και έναν κωδικό προϊόντος και η υπηρεσία να αναθέτει σε μία υπηρεσία να ελέγξει εάν τα credentials είναι σωστά, σε μία άλλη να χρεώσει την πιστωτική του καρτα, ενώ σε μία τρίτη υπηρεσία να μειώνει το προϊόν από την αποθήκη κατά 1 και ταυτόχρονα να αποστέλλει ένα προϊόν στο ταχυδρομείο. Κατ'αυτόν τον τρόπο οι επιμέρους υπηρεσίες μπορούν να χρησιμοποιηθούν ξεχωριστά αλλά και συνεργατικά, όποτε αυτό κρίνεται σκόπιμο, όπως σε αυτό το παράδειγμα. 18

19 Sub service 1 Browser Service Sub Data service 3 Base Sub service 2 Εικόνα 4: Σενάριο Σύνθετης Υπηρεσίας Ενδιάμεση Υπηρεσία Μια δικτυακή υπηρεσία που τοποθετεί αιτήσεις προς εξυπηρέτηση σε έναν ενδιάμεσο διάδρομο είναι ένα στιγμιότυπο υλοποίησης ενδιάμεσης υπηρεσίας. Παραδείγματος χάριν, μπορεί μία εταιρεία να υλοποιήσει κατ' αυτόν τον τρόπο τα s των εργαζομένων της. Δηλαδή, δε χρειάζεται να γνωρίζει ο αποστολέας πού βρίσκεται ο παραλήπτης, την διαδικασία αυτή την αναλαμβάνει να την κάνει η υπηρεσία. sender Service Receiver 1 Receiver 2 Εικόνα 5: Σενάριο Ενδιάμεσης Υπηρεσίας 19

20 Διάδρομος Υπηρεσιών Ο διάδρομος υπηρεσιών επιτρέπει στις web services να επικοινωνούν μεταξύ τους μέσω τρίτων. Παραδείγματος χάριν, έστω μία τράπεζα και ένας χρήστης ο οποίος έχει έναν λογαριασμό στην τράπεζα αυτή. Αν ο χρήστης μεταφέρει μέσω internet κάποια χρήματα από έναν λογαριασμό και δώσει πάγια εντολή, η δικτυακή υπηρεσία θα πρέπει να στείλει ένα μήνυμα στον διάδρομο υπηρεσίας. Ο διάδρομος υπηρεσίας αναλαμβάνει να ενημερώσει την υπηρεσία ανάληψης χρημάτων όπως και την υπηρεσία καταθέσεων. Όταν η υπηρεσία αναλήψεων μπορέσει να επεξεργαστεί (ενδεχομένως να έχει ουρά εξυπηρέτησης) το αίτημα και πιστοποιήσει ότι ο λογαριασμός δεν έχει αρνητικό υπόλοιπο, τότε αποστέλλει ένα μήνυμα στην υπηρεσία καταθέσεων για να καταθέσει τα χρήματα στον 2 ο λογαριασμό, σε αυτόν της πάγιας εντολής. Web Service Net Applica tion Service Bus Partner System J2EE Applica tion Εικόνα 12: Σενάριο Διαδρόμου υπηρεσιών 20

21 Αυτή η μέθοδος δρομολόγησης μηνυμάτων μεταξύ των web services είναι πολυδύναμη. Ταυτόχρονα με την υπηρεσία καταθέσεων και αναλήψεων, μπρούν και άλλες υπηρεσίες ζητήσουν να αλλάξουν τον λογαριασμό, όπως φερειπείν τα στοιχεία του πελάτη. Αυτή είναι μια multi-cast μέθοδος επικοινωνίας, με την οποία ένα χρήστης μπορεί να αποστείλει μηνύματα σε πολλαπλές υπηρεσίες ταυτόχρονα. Ο χρήστης δεν γνωρίζει επιπλέον ποιες άλλες υπηρεσίες συμμετέχουν στην αίτησή του. Το λογισμικό διαχείρισης του διαδρόμου υπηρεσιών καθοδηγεί τη δρομολόγηση αυτών των μηνυμάτων. 1.4 Πλεονεκτήματα και μειονεκτήματα Πλεονεκτήματα Τα web services σε αντίθεση με τα παραδοσιακά αντικειμονεστραφή components είναι πιο χαλαρά συνδεδεμένα με τους πελάτες τους, απ'ότι τα παραδοσιακά αντικειμενοστραφή components. Για παράδειγμα, μια αλλαγή σε μία μέθοδο και κατ' επέκταση στην διεπαφή ενός παραδοσιακού αντικειμενοστραφούς κομματιού κώδικα θα απαιτούσε αλλαγή και επαναμετάφραση του κώδικα του πελάτη, καθώς αυτά είναι ισχυρά συζευγμένα. Τα web services, απαλλάσσονται από αυτόν τον μπελά και ο πελάτης μπορεί να φτιάξει εκ νέου και δυναμικά το στέλεχος (stub) της υπηρεσίας, μέσω του WSDL εγγράφου που περιγράφει την υπηρεσία. Η ιδιότητα αυτή αναφέρεται στην βιβλιογραφία ως χαλαρή σύζευξη (loose coupling). Το WSDL έγγραφο, επίσης, προσφέρει στα web services ακόμα περισσότερη ελευθερία και δύναμη. Το WSDL έγγραφο μπορεί να τροποποιηθεί κατάλληλα έτσι, ώστε να ξεπερνά τις προδιαγραφές του πρωτοκόλλου SOAP. Μπορεί να υιοθετηθεί από την υπηρεσία επιπλέον ασφάλεια, είδος κρυπτογράφησης, προστασία από μη εξουσιοδοτημένους χρήστες κτλ. Τα web services δεν εξαρτώνται από την πλατφόρμα που υλοποιούνται καθώς επίσης και από την γλώσσα υλοποίησής τους, λόγω της κοινά αποδεκτής γλώσσας XML. Αυτό σημαίνει ότι μπορεί ένα πρόγραμμα πελάτη να έχει υλοποιηθεί σε Perl και 21

22 να εκτελείται σε περιβάλλον Windows, ενώ το web service να είναι προγραμματισμένο σε Java και να εκτελείται σε περιβάλλον Linux. Εικόνα 4: Μια απλή υπηρεσία διαδικτύου, όπου διαφαίνεται ότι η γλώσσα επεξεργασίας των μηνυμάτων xml είναι διαφορετική, όπως και το λειτουργικό σύστημα. Τα περισσότερα web services χρησιμοποιούν το πρωτόκολλο HTTP για την μετάδοση των μηνυμάτων τους (service request and service response). Αυτό αποτελεί μεγάλο πλεονέκτημα γιατί έτσι αποφεύγονται ζητήματα συμπλοκής με firewalls, αφού η πόρτα 80 σχεδόν πάντα είναι ανοικτή Μειονεκτήματα Τα web services αν και αρκετά σταθερά, δεν παύουν να βρίσκονται σε αρχικό στάδιο, γεγονός που τα κάνουν ακόμα επιρρεπή σε αστάθειες, παρά το γεγονός ότι βασίζονται σε απλά, σταθερά και ασφαλή πρότυπα (XML, WSDL) και πρωτόκολλα (HTTP, SOAP). Ωστόσο, αυτό το μειονέκτημα σε λίγο καιρό θα είναι αμελητέο διότι ο ρυθμός ανάπτυξής τους είναι πολύ γρήγορος. Επίσης, αν και όχι εγγενές μειονέκτημα των web services, είναι το γεγονός ότι χρησιμοποιούν μεγάλη ποσότητα δεδομένων για να επικοινωνήσουν. Η μετάδοση των δεδομένων βάσει της XML μορφής αντί της δυαδικής προσθέτει βάρος στο δίκτυο, αλλά και πολυπλοκότητα στο ίδιο το μηχάνημα που τρέχει την υπηρεσία. Το κέρδος σε φορητότητα, ουσιαστικά, που προσφέρει η XML χάνεται σε απόδοση. 22

23 1.5 XML Eισαγωγή Σε ένα κόσμο όπου οι πληροφορίες παρέχονται μέσω του παγκόσμιου διαδικτύου, τα έγγραφα πρέπει να είναι εύκολα προσβάσιμα, μεταφέρσιμα και ευέλικτα. Πρέπει επίσης να είναι ανεξάρτητα οποιουδήποτε συστήματος και περιεχομένου. Οι γενικευμένες γλώσσες έχουν τέτοια χαρακτηριστικά, παρέχοντας στα έγγραφα αυτά μια δυνατότητα η οποία δεν υπάρχει σε άλλες γλώσσες περιγραφής εγγράφων. Η HTML είναι προβληματική και περιοριστική γλώσσα. Η XML έλυσε πολλά από τα προβλήματα που αντιμετώπισαν οι σχεδιαστές του web και είναι υπεύθυνη για την XHTML, μια ανασχεδιασμένη HTML. Θα χρησιμοποιείται για πολλά χρόνια επειδή προσφέρει αποτελεσματικές και δυναμικές λύσεις. Η XML σχεδιάστηκε να ικανοποιήσει πολλές ανάγκες δίνοντας στα έγγραφα ένα μεγαλύτερο επίπεδο προσαρμοστικότητας στο στυλ και τη δομή από αυτό που υπήρχε παλαιότερα στην HTML. Η XML προσφέρει στους σχεδιαστές της HTML τη δυνατότητα να προσθέτουν περισσότερα στοιχεία στη γλώσσα. Δεν αναφέρεται μονάχα στους σχεδιαστές του web αλλά σε οποιονδήποτε ασχολείται με εκδόσεις. Στην πραγματικότητα, η XML είναι γλώσσα προσαύξησης (markup) για έγγραφα που περιέχουν δομημένες πληροφορίες. Γλώσσα προσαύξησης είναι ένας μηχανισμός που καθορίζει δομές σε ένα έγγραφο. Οι δομημένες πληροφορίες περιλαμβάνουν περιεχόμενο και κάποιες διευκρινίσεις για το ρόλο που παίζει το περιεχόμενο. Σχεδόν όλα τα έγγραφα έχουν την ίδια δομή Τι είναι η XML; Η XML είναι συντομογραφία για το EXtensible Markup Language Η XML είναι markup γλώσσα, η οποία μοιάζει πολύ με την HTML Η XML σχεδιάστηκε για να περιγράφει δεδομένα Τα XML tags δεν είναι προκαθορισμένα. Πρέπει να ορίσουμε τα δικά μας tags 23

24 Η XML χρησιμοποιεί το Document Type Definition (DTD) ή το XML Schema για να περιγράψει τα δεδομένα Ένα XML κείμενο με ένα DTD ή ένα XML Schema σχεδιάστηκε για να περιγράφει επαρκώς τον εαυτό του Διαφορές μεταξύ XML και HTML Η XML σχεδιάστηκε για τη μεταφορά δεδομένων. Η XML δεν είναι ένα αντικατάστατο της HTML. Η XML σχεδιάστηκε για να περιγράφει τα δεδομένα και εστιάζει στο τι είναι τα δεδομένα. Η HTML σχεδιάστηκε για να παρουσιάζει τα δεδομένα και εστιάζει στο πώς φαίνονται τα δεδομένα. Η HTML έχει να κάνει με την παρουσίαση των δεδομένων ενώ η XML έχει να κάνει με την περιγραφή των δεδομένων Η XML δεν κάνει κάτι συγκεκριμένο < > <to>nick</to> <from>mom</from> <heading>goodbye</heading> <body>have a great time at the camp!</body> </ > Μπορεί να είναι λίγο δύσκολο να το καταλάβει κανείς, αλλά η XML δεν κάνει κάτι συγκεκριμένο. Η XML σχεδιάστηκε για τη δόμηση, την αποθήκευση και την αποστολή δεδομένων. Το παρακάτω παράδειγμα είναι ένα της μητέρας ενός παιδιού στο παιδί της, αποθηκευμένο σε XML: Το σημείωμα έχει μια κεφαλή ( heading ) και ένα σώμα ( body ), το οποίο περιέχει το μήνυμα. Περιέχει επίσης πληροφορίες για τον αποστολέα και τον αποδέκτη. Παρ 24

25 όλα αυτά όμως το XML κείμενο εξακολουθεί να μην κάνει κάτι συγκεκριμένο. Περιέχει απλά πληροφορίες, τοποθετημένες μέσα σε XML tags. Κάποιος πρέπει να γράψει ένα κομμάτι software για να το στείλει, να το λάβει ή να το παρουσιάσει Η XML είναι απλή και επεκτάσιμη Τα tags που χρησιμοποιούνται στα HTML κείμενα είναι προκαθορισμένα. Ο συγγραφέας ενός HTML κειμένου μπορεί να χρησιμοποιήσει μόνο τα tags που ορίζονται στο HTML standard ( όπως <p>, <br/> κ.λ.π. ). Η XML επιτρέπει στο συγγραφέα ενός XML κειμένου να ορίσει τα δικά του tags. Για παράδειγμα τα tags <to> και <from> στο παραπάνω παράδειγμα δεν είναι ορισμένα σε κανένα XML standard. Αυτά τα tags «επινοήθηκαν» από το συγγραφέα αυτού του XML κειμένου Η XML είναι ένα συμπλήρωμα της HTML Είναι σημαντικό να καταλάβει κανείς ότι η XML δεν αποτελεί ένα αντικατάστατο της HTML. Είναι πολύ πιθανόν ότι οι μελλοντικές Web εφαρμογές θα χρησιμοποιούν την XML για να περιγράφουν τα δεδομένα, ενώ η HTML θα χρησιμοποιείται για την απεικόνιση των δεδομένων αυτών. Για αυτό και η καλύτερη περιγραφή της XML είναι η εξής: η XML είναι ένα ανεξάρτητο πλατφόρμας, ανεξάρτητο από software και hardware εργαλείο για την μετάδοση πληροφοριών Η XML στην ανάπτυξη μελλοντικών Web εφαρμογών Είναι συναρπαστικό το πόσο γρήγορα το XML standard αναπτύχθηκε και πόσο γρήγορα ένας μεγάλος αριθμός από σχεδιαστές λειτουργικών συστημάτων υιοθέτησαν το standard αυτό. 25

26 Πιστεύεται ότι η XML θα είναι τόσο σημαντική για το μέλλον του Web όσο ήταν η HTML για τη θεμελίωση του. Πιστεύεται επίσης ότι η XML θα είναι το πιο κοινό εργαλείο για την επεξεργασία των δεδομένων και τη μετάδοση τους. 1.6 WSDL (Web Service Description Language) Είδαμε στην προηγούμενη παράγραφο ότι οι υπηρεσίες διαδικτύου πρέπει να παρέχουν μία καλώς ορισμένη διεπαφή (interface), με την χρήση της WSDL. Το WSDL αρχείο καλείται συμβόλαιο (contract) και στην ουσία περιγράφει web services και χρησιμοποιείται για τον εντοπισμό τους. Η WSDL είναι μια προδιαγραφή μίας γλώσσας που καθορίζει τον τρόπο περιγραφής των web services σε μία XML γραμματική, που δεν είναι ακόμα W3C standard. Η WSDL περιγράφει 4 σημαντικά κομμάτια δεδομένων: Πληροφορία για όλες τις δημόσια διαθέσιμες λειτουργίες Πληροφορίες τύπων δεδομένων για όλα τα μηνύματα αίτησης και απάντησης Πληροφορίες σύνδεσης σχετικά με τα πρωτόκολλα μεταφοράς Πληροφορίες διευθύνσεων για τον εντοπισμό της συγκεκριμένης υπηρεσίας Χρησιμοποιώντας την WSDL ένας πελάτης μπορεί να εντοπίσει μια web service και να καλέσει οποιαδήποτε από τις δημόσιες λειτουργίες της Η WSDL προδιαγραφή Η WSDL προδιαγραφή αποτελείται από 2 μέρη:το λογικό και το φυσικό. Το λογικό κομμάτι ενός αρχείου WSDL περιγράφει τα αφηρημένα (abstract) χαρακτηριστικά της δικτυακής υπηρεσίας και συμπεριλαμβάνει τα παρακάτω κομμάτια: Definitions 26

27 Το στοιχείο definitions πρέπει να είναι η ρίζα του δένδρου για κάθε WSDL αρχείο. Καθορίζει το όνομα της Web service, δηλώνει τα πολλαπλά namespaces (εκτός περιπτώσεων όπου υπάρχει υπερκάλυψη-override) που χρησιμοποιούνται στο υπόλοιπο κείμενο και περιέχει όλα τα υπόλοιπα στοιχεία της υπηρεσίας. Η χρήση των namespaces είναι σημαντική για να ξεχωρίζουμε τα στοιχεία μεταξύ τους και δίνει την δυνατότητα στο wsdl κείμενο να αναφέρεται σε εξωτερικές προδιαγραφές, συμπεριλαμβανομένων και των WSDL, SOAP και XML Schema προδιαγραφών. Το στοιχείο definitions, επίσης, δηλώνει και μια ιδιότητα targetnamespace. Αυτή η ιδιότητα είναι μια σύμβαση του XML Σχήματος η οποία δίνει τη δυνατότητα στο WSDL κείμενο να αναφέρεται στον εαυτό του. Θα πρέπει να σημειώσουμε, όμως, ότι η προδιαγραφή σχετικά με το namespace δεν απαιτεί να υπάρχει όντως το κείμενο WSDL στην τοποθεσία. Το σημαντικό είναι να καθορίζεται μια τιμή που είναι μοναδική και διαφορετική από τα υπόλοιπα namespaces. Τέλος, το στοιχείο definitions δηλώνει και ένα δικό του namespace, το xmlns= Όλα τα στοιχεία που δεν έχουν κάποιο πρόθεμα, όπως το message, το porttype κτλ., θεωρούνται ότι αναφέρονται σε αυτό το namespace. Types Το στοιχείο types περιγράφει όλους τους τύπους δεδομένων που χρησιμοποιούνται μεταξύ του πελάτη και του εξυπηρετητή. Η WSDL δεν ακολουθεί αποκλειστικά ένα συγκεκριμένο σύστημα δήλωσης τύπων, αλλά χρησιμοποιεί την W3C XML προδιαγραφή σχήματος (schema) ως προκαθορισμένη επιλογή της. Αν η υπηρεσία χρησιμοποιεί μόνο XML σχήμα δομημένο σε απλούς τύπους, όπως αλφαριθμητικά και ακεραίους, το στοιχείο types δεν είναι απαραίτητο. Εάν ωστόσο έχει πιο σύνθετους τύπους, αυτό το κομμάτι είναι ο μόνος τρόπος να οριστούν. ορίζει τους τύπους δεδομένων που χρησιμοποιεί το Web Service. Message Το στοιχείο message περιγράφει ένα μήνυμα μιας κατεύθυνσης είτε αυτό είναι ένα μήνυμα αίτησης είτε απάντησης. Καθορίζει το όνομα του μηνύματος και αν περιέχει μηδέν στοιχεία part υποθέτει ότι δεν μεταδίδεται τίποτα. Εάν έχει ένα ή περισσότερα στοιχεία part τότε αποστέλλει όσα αναφέρονται στις παραμέτρους του μηνύματος ή στις επιστρεφόμενες τιμές του. Επίσης, Περιγράφει τους τύπους 27

28 δεδομένων που χρησιμοποιεί μια operation. Κάθε μήνυμα αποτελείται από ένα ή περισσότερα κομμάτια. Τα κομμάτια αυτά μπορούν να συγκριθούν με τις παραμέτρους μιας συνάρτησης σε μια παραδοσιακή προγραμματιστική γλώσσα. Για την αίτηση, αυτό το στοιχείο καθορίζει τις παραμέτρους που δέχεται μια συνάρτηση. Η ιδιότητα type του στοιχείου part καθορίζει έναν τύπο σύμφωνο με το XML Schema. Η τιμή της ιδιότητας αυτής πρέπει να δοθεί ως XML Schema QName, δηλαδή να έχει ένα πρόθεμα που να αναφέρεται σε ένα namespace. Συνήθως, η ιδιότητα type των στοιχείων έχουν τιμή xsd:.... Το xsd πρόθεμα αναφέρεται στο namespace του XML σχήματος που ορίστηκε μέσα στα namespaces του στοιχείου definitions. Operation Το στοιχείο operation περιγράφει μία πράξη που μπορεί να κάνει μία υπηρεσία, προσδιορίζοντας μηνύματα εισόδου και εξόδου που χρειάζονται ως παράμετροι για αυτή την πράξη. PortType Το στοιχείο PortType συνδυάζει πολλαπλά στοιχεία message για να συνθέσει μια απλή λειτουργία είτε μιας ή αμφίδρομης κατεύθυνσης. Το porttype στοιχείο είναι το πιο σημαντικό στοιχείο ενός WSDL κειμένου. Περιγράφει μια Web Service, τις λειτουργίες (operations) που μπορούν να εκτελεστούν, καθώς και τα μηνύματα που ανταλλάσσονται. Το porttype μπορεί να συγκριθεί με μια βιβλιοθήκη συναρτήσεων ή ένα module ή μια κλάση στις απλές προγραμματιστικές γλώσσες. Για παράδειγμα, ένα porttype μπορεί να συνδυάζει ένα μήνυμα αίτησης και απάντησης σε μια μοναδική λειτουργία αίτησης-απάντησης η οποία χρησιμοποιείται πιο συχνά στις SOAP υπηρεσίες. Αξίζει να σημειωθεί ότι ένα porttype συχνά καθορίζει πολύπλοκες λειτουργίες. Όπως και στην ιδιότητα type που αναφέραμε στο στοιχείο message, η ιδιότητα message πρέπει να οριστεί σαν XML Schema QName, δηλαδή να αναφέρεται σε ένα namespace. Τύπος One-way Ορισμός Η λειτουργία λαμβάνει ένα μήνυμα αλλά δεν επιστρέφει απάντηση H υπηρεσία λαμβάνει το μήνυμα. Έτσι το στοιχείο 28

29 operation έχει ένα μοναδικό στοιχείο input. Request-response Η λειτουργία λαμβάνει μια αίτηση και επιστρέφει μια απάντηση Η υπηρεσία λαμβάνει ένα μήνυμα αίτησης και στέλνει ένα μήνυμα απάντησης. Έτσι το στοιχείο operation έχει ένα στοιχείο input που ακολουθείται από ένα στοιχείο output Solicit-response Η λειτουργία στέλνει μια αίτηση και περιμένει μια απάντηση Η υπηρεσία στέλνει ένα μήνυμα και λαμβάνει έπειτα μια απάντηση. Έτσι, το στοιχείο operation έχει ένα στοιχείο output που ακολουθείται από ένα στοιχείο input Notification Η λειτουργία στέλνει ένα μήνυμα αλλά δεν περιμένει απάντηση H υπηρεσία στέλνει ένα μήνυμα. Έτσι, το στοιχείο operation έχει ένα μοναδικό στοιχείο output Το φυσικό κομμάτι ενός αρχείου WSDL περιγράφει τα συμπαγή χαρακτηριστικά μιας υπηρεσίας διαδικτύου και συμπεριλαμβάνει τα παρακάτω κομμάτια: Binding Το στοιχείο binding περιγράφει το συγκεκριμένο τρόπο υλοποίησης της υπηρεσίας πάνω στο καλώδιο, συνδέει ένας συνεπές πρωτόκολλο και τις προδιαγραφές των μηνυμάτων με operations και messages, ορισμένα μέσα σε ένα συγκεκριμένο porttype που έχει οριστεί στο λογικό κομμάτι του αρχείου. Πιο απλά, το στοιχείο binding παρέχει ειδικές λεπτομέρειες για το πώς μια λειτουργία που καθορίζεται από το στοιχείο porttype θα μεταφερθεί πάνω στο καλώδιο. Οι συνδέσεις μπορούν να γίνουν μέσω διαφόρων πρωτοκόλλων, συμπεριλαμβανομένων των HTTP GET, HTTP POST ή SOAP. Στην πραγματικότητα μπορείς να ορίσεις πολλές συνδέσεις (bindings) για κάθε στοιχείο porttype. Το στοιχείο binding έχει 2 χαρακτηριστικά (attributes) το όνομα και τον τύπο. Το name (μπορούμε να χρησιμοποιήσουμε ό,τι όνομα θέλουμε) καθορίζει το όνομα του binding και το type αναφέρεται στο στοιχείο porttype που έχει οριστεί πιο πάνω στο WSDL κείμενο. Το soap:binding έχει 2 χαρακτηριστικά το 29

30 χαρακτηριστικό style και το χαρακτηριστικό transport. Το χαρακτηριστικό style μπορεί να είναι rpc ή document. Το χαρακτηριστικό transport καθορίζει το SOAP πρωτόκολλο που θα χρησιμοποιηθεί. Στην περίπτωσή μας χρησιμοποιούμε το HTTP. Το operation ορίζει κάθε λειτουργία που εκθέτει το port. Για κάθε λειτουργία η αντίστοιχη SOAP ενέργεια πρέπει να οριστεί. Πρέπει επίσης να οριστεί και ο τρόπος που θα κωδικοποιηθεί η είσοδος (input) και η έξοδος (output) (συνήθως χρησιμοποιούμε το literal ). Port Το στοιχείο port εγκαθιδρύει ένα endpoint συνδέοντας ένα binding με μια συνεπή διεύθυνση δικτύου. Service To στοιχείο service καθορίζει τη διεύθυνση για την κλήση της συγκεκριμένης υπηρεσίας και περιέχει το URL της υπηρεσίας. Επιπρόσθετα στα παραπάνω επτά βασικά στοιχεία, η WSDL καθορίζει επίσης τα ακόλουθα χρήσιμα στοιχεία: Documentation Το στοιχείο documentation χρησιμοποιείται για να παρέχει μια κατανοητή από τον άνθρωπο περιγραφή της υπηρεσίας και μπορεί να εμπεριέχεται σε οποιοδήποτε WSDL στοιχείο. Import Το στοιχείο import χρησιμοποιείται για να εισάγει άλλα αρχεία WSDL ή σχήματα XML κυρίως για την υιοθέτηση τύπων (types σε αρχεία xsd) Παράδειγμα Έστω το wsdl αρχείο: <?xml version="1.0" encoding="utf-8"?> <definitions name ="poservice" xmlns:http=" 30

31 xmlns:soap=" xmlns:xsd=" xmlns=" targetnamespace=" <message name="getorderstatusinput"> <part name="body" element="xsd:string"/> </message> <message name="getorderstatusoutput"> <part name="body" element="xsd:string"/> </message> <porttype name="poserviceporttype"> <operation name="getorderstatus"> <input message="tns:getorderstatusinput"/> <output message="tns:getorderstatusoutput"/> </operation> </porttype> <binding name="poservicebinding" type="tns:poserviceporttype"> <soap:binding style="rpc" transport=" <operation name="getorderstatus"> <soap:operation soapaction= " <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> </binding> <service name="poservice"> <port name="poserviceport" binding="tns:poservicebinding"> <soap:address location= " </port> </service> 31

32 </definitions> Θα δούμε αυτό το αρχείο σε λεπτομέρεια προκειμένου να καταλάβουμε στην πράξη την σύνταξη ενός WSDL αρχείου. Το στοιχείο definitions είναι η ρίζα κάθε WSDL αρχείου, περικλείοντας όλες τους ορισμούς που χρησιμοποιούνται στο αρχείο. Επιπλέον, έχει όλες τα namespaces που θα χρησιμοποιούνται γενικά μέσα στο αρχείο. <definitions name ="poservice" xmlns:http=" xmlns:soap=" xmlns:xsd=" xmlns=" targetnamespace= " Στην συνέχεια, ορίζουμε τους αφηρημένους ορισμούς για τα μηνύματα που θα χρησιμοποιηθούν για την ανταλλαγή δεδομένων. Εδώ παρέχεται ο αφηρημένος ορισμός για το μήνυμα που θα χρησιμοποιηθεί για να μεταφέρει την παράμετρο εισόδου για την συνάρτηση getorderstatus: <message name="getorderstatusinput"> <part name="body" element="xsd:string"/> </message> Έπειτα, ορίζουμε αφηρημένα το μήνυμα που θα χρησιμοποιηθεί για να σταλεί πίσω το αποτέλεσμα της συνάρτησης getorderstatus: <message name="getorderstatusoutput"> <part name="body" element="xsd:string"/> </message> Άπαξ και έχουν οριστεί τα μηνύματα, μπορούν να ομαδοποιηθούν σε operations, οι οποίες με την σειρά τους ομαδοποιούνται σε μία διεπαφή service. Εδώ παρατίθεται το τμήμα porttype που αντιπροσωπεύει μία αφηρημένη αποτύπωση της διεπαφής του service,το οποίο, σε αυτό το παράδειγμα, υποστηρίζει μόνο μία operation: 32 <porttype name="poserviceporttype"> <operation name="getorderstatus"> <input message="tns:getorderstatusinput"/>

33 <output message="tns:getorderstatusoutput"/> </operation> </porttype> Τώρα που έχουμε ορίσει την αφηρημένη διεπαφή της υπηρεσίας, μπορούμε να προσδιορίσουμε τις φυσικές λεπτομέρειες της ανταλλαγής δεδομένων. Σε ένα τμήμα binding, χαρτογραφούμε την αφηρημένη διεπαφή της υπηρεσίας μέσα σε ένα porttype τμήμα, προσδιορίζοντας ένα συνεπές πρωτόκολλο για μετάδοση δεδομένων και τις προδιαγραφές των μηνυμάτων. Σε αυτό το παράδειγμα, το τμήμα binding χρησιμοποιείται για να γίνει δημοσιοποίηση (deploy) η operation getorderstatus η μοναδική operation που υποστηρίζεται από την υπηρεσία. <binding name="poservicebinding" type="tns:poserviceporttype"> <soap:binding style="rpc" transport=" <operation name="getorderstatus"> <soap:operation soapaction= " <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> </binding> Στο παραπάνω παράθεμα, ορίζουμε ένα binding πρωτοκόλλου SOAP της μορφής request-response RPC operation πάνω από HTTP και προσδιορίζουμε το συνεπές URI υποδεικνύοντας τον σκοπό του SOAP HTTP request. Τέλος, χρησιμοποιούμε το στοιχείο service που μας δείχνει το στοιχείο port για να συγκεκριμενοποιηθεί η φυσική διεύθυνση της υπηρεσίας <service name="poservice"> <port name="poserviceport" binding="tns:poservicebinding"> <soap:address location= " 33

34 </port> </service> Στο παραπάνω παράδειγμα, η λειτουργία getorderstatus που είναι μια δικτυακή υπηρεσία, λαμβάνει μόνο μία παράμετρο εισόδου. Τί γίνεται, όμως, αν χρειαστεί να περαστούν περισσότερες από μία παράμετροι για μια δικτυακή υπηρεσία; Ας υποθέσουμε ότι τροποποιούμε την συνάρτηση getorderstatus, έτσι ώστε να λαμβάνει μία επιπλέον παράμετρο, έστω την podate που προσδιορίζει την ημερομηνία που δόθηκε η παραγγελία. Θα πρέπει να περιλαμβάνεται ένα νέο στοιχείο part στο τμήμα message που να περιγράφει την αφηρημένη λογική ενός μηνύματος εισόδου στο έγγραφο WSDL: <definitions name ="poservice" xmlns:http=" xmlns:soap=" xmlns:xsd=" xmlns=" targetnamespace= " <message name="getorderstatusinput"> <part name="ponumber" element="xsd:string"/> <part name="podate" element="xsd:string"/> </message> <message name="getorderstatusoutput"> <part name="body" element="xsd:string"/> </message>... </definitions> Τώρα ένα SOAP Μήνυμα που θα εκδίδεται από μία δικτυακή υπηρεσία για να πάρει το αποτέλεσμα της απομακρυσμένης συνάρτησης getorderstatus θα είναι όπως φαίνεται παρακάτω: 34 <?xml version="1.0" encoding="utf-8"?> <SOAP-ENV:Envelope xmlns:soap-env="

35 <SOAP-ENV:Body> <SOAP-ENV:getOrderStatus> <ponumber>us </ponumber> <podate>21-jan-07</podate> </SOAP-ENV:getOrderStatus> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Εάν θέλουμε να στείλουμε και να πάρουμε πιο πολύπλοκες παραμέτρους οφείλουμε να χρησιμοποιήσουμε το στοιχείο types και να τροποποιήσουμε το αρχείο μας ως εξής: <?xml version="1.0" encoding="utf-8"?> <definitions name ="poservice" xmlns:http=" xmlns:soap=" xmlns:xsd1=" xmlns=" xmlns:xsd=" targetnamespace= " <types> <xsd:schema targetnamespace=" <xsd:element name="poinfo"> <xsd:complextype> <xsd:sequence> <xsd:element name="pono" type="xsd:string" /> <xsd:element name="shippingdate" type="xsd:string" /> <xsd:element name="status" type="xsd:string" /> </xsd:sequence> </xsd:complextype> </xsd:element> 35

36 </xsd:schema> </types> <message name="getorderstatusinput"> <part name="ponumber" element="xsd:string"/> <part name="podate" element="xsd:string"/> </message> <message name="getorderstatusoutput"> <part name="postatus" element="xsd1:poinfo"/> </message>... </definitions> Σε αυτή την περίπτωση, ένα μήνυμα απάντησης που θα μας σταλεί από την υπηρεσία σε μία υπηρεσία που ζήτησε απάντηση, μπορεί αν είναι σαν το κάτωθι: <SOAP-ENV:Envelope xmlns:soap-env=" <SOAP-ENV:Body> <SOAP-ENV:getOrderStatusResponse> <postatus> <pono>us </pono> <shippingdate>21-jan-07</shippingdate> <status>shipped</status> </postatus> </SOAP-ENV:getOrderStatusResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Αν και το παράδειγμα μας δείχνει πώς να ορίζουμε XML Schema types μέσα στο τμήμα types ενός WSDL αρχείου, μπορεί να υπάρξει μεγαλύτερη επαναχρησιμοποίηση και περισσότερο modularity βάζοντας τους τύπους που 36

37 επαναχρησιμοποιούνται και από άλλες υπηρεσίες σε ένα xsd αρχείο. Το xsd αρχείο του παραδείγματος θα είναι: <?xml version="1.0"?> <schema targetnamespace=" xmlns=" <element name="poinfo"> <complextype> <sequence> <element name="pono" type="string" /> <element name="shippingdate" type="string" /> <element name="status" type="string" /> </sequence> </complextype> </element> </schema> </schema> Οπότε, αν αυτό το αρχείο είναι τοποθετημένο στο τότε το αρχείο wsdl τροποποιείται κατάλληλα (αφαιρώντας το τμήμα types και εισάγοντας το αρχείο μέσω του tag import). <?xml version="1.0" encoding="utf-8"?> <definitions name ="poservice" xmlns:http=" xmlns:soap=" xmlns:xsd1=" xmlns=" xmlns:xsd=" targetnamespace= " <import namespace=" location=" <message name="getorderstatusinput"> <part name="ponumber" element="xsd:string"/> <part name="podate" element="xsd:string"/> 37

38 </message> <message name="getorderstatusoutput"> <part name="postatus" element="xsd1:poinfo"/> </message>... </definitions> 38

39 2. Αρχιτεκτονικές 2.1 Υπηρεσιοστραφής Αρχιτεκτονική (Service Oriented Architecture - SOA) Γενικά Όπως έχει ήδη σημειωθεί, για να σχεδιαστεί και υλοποιηθεί μία υπηρεσιοστραφής αρχιτεκτονική (Service Oriented Architecture SOA) βασισμένη σε δικτυακέ υπηρεσίες, χρειάζεται να ακολουθηθούν τα υπηρεσιοστραφή αξιώματα όταν συνδέονται οι υπηρεσίες προκειμένου να υλοποιηθεί μία εφαρμογή. Εδώ παρουσιάζονται συνοπτικά βασικά αξιώματα της υπηρεσιοστραφούς αρχιτεκτονικής που χρησιμεύουν σε υλοποίηση SOA εφαρμογών: Χαλαρή σύζευξη (Loose coupling) αντιπροσωπεύει μία σχέση που επιτρέπει στην υποκείμενη λογική μίας υπηρεσίας να αλλάζει με ελάχιστο ή και καθόλου αντίκτυπο στις υπόλοιπες υπηρεσίες που χρησιμοποιούνται στην ίδια SOA. Η χαλαρή σύζευξη είναι το κεντρικό αξίωμα της υπηρεσιοστραφούς αρχιτεκτονικής. Υλοποιώντας υπηρεσίες όσο το δυνατόν πιο χαλαρά συζευγμένες επιτρέπει τον σχεδιαστή και τον χρήστη να τηρεί τις προδιαγραφές και για τις υπόλοιπα αξιώματα της υπηρεσιοστραφούς αρχιτεκτονικής, όπως είναι η επαναχρησιμοποίηση της υπηρεσίας, την αυτονομία της υπηρεσίας και την αδυναμία μνήμης προηγούμενης κατάστασης της υπηρεσίας (statelessness). Το συμβόλαιο της υπηρεσίας αντιπροσωπεύει περιγραφές της υπηρεσίας και άλλα αρχεία που περιγράφουν πώς μία υπηρεσία μπορεί προγραμματιστικά να κληθεί. Αυτό μπορεί να γίνει κυρίως από ένα αρχείο wsdl (μαζί με ενδεχόμενα xsd αρχεία), που περιγράφει μία υπηρεσία, ορίζοντας το συμβόλαιο για αυτή την υπηρεσία. Απόκρυψη της υποκείμενης λογικής σημαίνει ότι μία υπηρεσία εκθέτει δημόσια μόνο την λογική που περιγράφεται στο συμβόλαιο της υπηρεσίας, αποκρύπτοντας τις λεπτομέρειες υλοποίησης από τους πελάτες της υπηρεσίας. Αυτό σημαίνει ότι οι υπηρεσίες αλληλεπιδρούν η μία με την άλλη μόνο διαμέσω των δημόσιων διεπαφών τους. Το αρχείο wsdl, έχει τέτοιο τμήμα που δίνει τις διεπαφές μιας υπηρεσίας. 39

40 Αυτονομία σημαίνει ότι οι υπηρεσίες ελέγχουν μόνο την λογική που εγκολπώνονται. Διαιρώντας την λογική των εφαρμογών σε ένα σετ από αυτόνομες υπηρεσίες, επιτρέπει στον σχεδιαστή να φτιάξει ευέλικτες SOA λύσεις για τα διάφορα εγχειρήματα, κατορθώνοντας ταυτόχρονα χαλαρή σύζευξη, επαναχρησιμοποίηση και σύνθεσης. Η επαναχρησιμοποίηση σε υπηρεσιοστραφή αρχιτεκτονική επιτυγχάνεται με τον διαμοιρασμό της λογικής της εφαρμογής σε διάφορες υπηρεσίες έτσι, ώστε κάθε υπηρεσία να μπορεί δυνητικά να χρησιμοποιηθεί από περισσότερους του ενός αιτούντος την υπηρεσία. Σχεδιάζοντας και κατασκευάζοντας επαναχρησιμοποιούμενες υπηρεσίες υποστηρίζει το αξίωμα της σύνθεσης. Η σύνθεση αντιπροσωπεύει την δυνατότητα των υπηρεσιών να ομαδοποιούνται σε σύνθετες υπηρεσίες που συντονίζουν μία ανταλλαγή δεδομένων μεταξύ των υπηρεσιών που συναθροίζονται. Παραδείγματος χάριν, χρησιμοποιώντας μία γλώσσα ενορχήστρωσης, όπως η WS-BPEL, επιτρέπει να συντεθούν λεπτά σχεδιασμένες υπηρεσίες σε πιο χοντρά σχεδιασμένες υπηρεσίες. Η WS-BPEL θα συζητηθεί παρακάτω. Η απουσία μνήμης προηγούμενης κατάστασης της υπηρεσίας (statelessness) σημαίνει οι υπηρεσίες δεν κρατούν την κατάστασή τους σε μία συγκεκριμένη διεργασία. Η κατασκευή τέτοιων υπηρεσιών ενθαρρύνει την χαλαρή σύζευξη, την επαναχρησιμοποίηση και την σύνθεση. Βέβαια, κάτι τέτοιο δεν είναι πάντοτε επιθυμητό, όπως σε εφαρμογές πλέγματος (grid). Η διαλειτουργικότητα μεταξύ των υπηρεσιών εύκολα επιτυγχάνεται αρκεί οι υπηρεσίες να αλληλεπιδρούν διαμέσου των διεπαφών οι οποίες είναι ανεξάρτητες των γλωσσών υλοποίησης καθώς και της πλατφόρμας. Η ανιχνευσιμότητα αναφέρεται σε standard μηχανισμούς που επιτρέπουν σε υπηρεσίες να ανακαλύπτονται από διάφορους αιτούντες των υπηρεσιών τους. Η UDDI (Universal Description, Discovery, and Integration) προδιαγραφή παρέχει τέτοιο μηχανισμό, ο οποίος επιτρέπει την δημοσιοποίηση των descriptors υπηρεσιών σε μία XML-βασισμένη αποθήκη και ως εκ τούτου κάνοντας τες διαθέσιμες στο κοινό. 40

41 Όπως εύκολα μπορεί να παρατηρηθεί, τα περισσότερα από αυτά τα αξιώματα είναι στενά συνδεδεμένα. Για παράδειγμα, εάν κάποιος έχει κατά νου την αυτονομία όταν διαιρεί την λογική μιας εφαρμογής για να φτιάξει υπηρεσίες που θα χρησιμοποιηθούν σε SOA λύσεις, θα έχει σίγουρα επαναχρησιμοποιούμενα, σύνθετα και χαλαρά συζευγμένα κομμάτια κώδικα λογισμικού, τα οποία θα μπορεί να τα ξαναχρησιμοποιήσει σε μελλοντικά του σχέδια. Από την άλλη, αγνοώντας έστω και ένα αξίωμα της υπηρεσιοστραφούς αρχιτεκτονικής δυσχεραίνει το γεγονός να κρατηθούν όλα τα υπόλοιπα. Παραδείγματος χάριν, εάν αγνοηθεί το αξίωμα της απουσίας μνήμης προηγούμενης κατάστασης όταν σχεδιάζονται οι υπηρεσίες, υπάρχει σοβαρό ενδεχόμενο να καταλήξει ο σχεδιαστής με λιγότερο επαναχρησιμοποιούμενα και λιγότερο συνθέσιμα κομμάτια κώδικα για τις SOA λύσεις του SOA Συνθέσεις (SOA Compositions) Άμα τη δημιουργία όλων των υπηρεσιών που απαιτούνται για να αυτοματοποιηθεί η διαδικασία της κατάθεσης προτάσεων, ο σχεδιαστής χρειάζεται να γνωρίζει πώς θα τα θέσει αυτά σε δράση. Βασικά, υπάρχουν πληθώρα τρόπων που μπορούν οι υπηρεσίες να οργανωθούν για να συντεθεί μία λύση SOA. Παραδείγματος χάριν, μπορεί να δημιουργηθεί μία σύνθετη υπηρεσία ως ένα php script που θα εκτίθεται ως δικτυακή υπηρεσία και που, προγραμματιστικά, καλεί άλλες υπηρεσίες όπως οφείλει. Εντούτοις, ο πιο συνηθισμένος τρόπος να σχεδιαστούν και να συντεθούν SOA λύσεις είναι χρησιμοποιώντας WS-BPEL, μία γλώσσα ενορχήστρωσης που επιτρέπει στον σχεδιαστή να φτιάξει ενορχηστρώσεις σύνθετες και ελεγχόμενες υπηρεσίες ορίζοντας το πώς οι υπηρεσίες που καλούνται θα διαδράσουν προκειμένου να επιτευχθεί το επιθυμητό αποτέλεσμα Ενορχήστρωση Μία ενορχήστρωση συγκεντρώνει υπηρεσίες σε μία επιχειρησιακή εκτελέσιμη διαδικασία που χρειάζεται να εκτελεσθεί από μία μηχανή ενορχήστρωσης. Σχηματικά, μία ενορχήστρωση μπορεί να ομοιάζει με το παρακάτω: 41

42 Εικόνα 5: H controller service αναλαμβάνει χρέη ενορχηστρωτή. Όπως διαφαίνεται από την παραπάνω εικόνα, ένας ενορχηστρωτής (controller service) αναλαμβάνει να συντονίσει, βάσει της λογικής με την οποία έχει σχεδιαστεί, διάφορες υπηρεσίες. Αυτός ο ενορχηστρωτής μπορεί να είναι μία WS-BPEL επιχειρησιακή διεργασία, η οποία όταν εκτελείται σε μία μηχανή ενορχήστρωσης ολοκληρώνει μία συγκεκριμένη επιχειρηματική εργασία. Αξίζει εδώ να σημειωθεί ότι, εάν μία υπηρεσία συντονισμού έχει υλοποιηθεί βάσει μίας WS-BPEL, τότε θα πρέπει να γνωρίζει τα αντίστοιχα WSDL αρχεία που θα χρησιμοποιεί προκειμένου να καλεί τις αντίστοιχες υπηρεσίες, όπως και επίσης και η ίδια η υπηρεσία του controller να έχει ένα wsdl αρχείο για να μπορεί να γίνεται γνωστή η υπηρεσία που προσφέρει στο κοινό. Φυσικά, αναδρομικά, μπορεί μία ενορχηστρωμένη υπηρεσία να αποτελέσει κομμάτι μίας μεγαλύτερης ενορχήστρωσης Χορογραφία Η προδιαγραφή χορογραφίας δικτυακών υπηρεσιών μαζί με την αντίστοιχη γλώσσα περιγραφής χορογραφίας δικτυακών υπηρεσιών (Web Services Choreography Description Language - WS-CDL) παρέχει έναν επιπλέον τρόπο για την σχεδίαση SOA συνθέσεων. Ενώ η WS-BPEL χρησιμοποιείται για να ενορχηστρώσει υπηρεσίες σε σύνθετες λύσεις που συνήθως εκφράζουν -συγκεκριμένα σε επιχειρήσειςδιαγράμματα επιχειρηματικών διαδικασιών, η WS-CDL επιτρέπει στον σχεδιαστή να 42

43 περιγράψει ομότιμες (peer-to-peer) σχέσεις μεταξύ των υπηρεσιών Web και / ή με άλλους συμμετέχοντες εντός ή πέρα από τα όρια εμπιστοσύνης. Σε αντίθεση με την ενορχήστρωση, η χορογραφία δεν έχει ένα συγκεντρωτικό μηχανισμό ελέγχου, με την προϋπόθεση ο έλεγχος να κατανέμεται μεταξύ των συμμετεχόντων αλληλεπίδρασης. Αυτό σημαίνει ότι μια ενορχήστρωση αντιπροσωπεύει μία εκτελέσιμη διαδικασία που πρέπει να εκτελεστεί από έναν μηχανισμό ενορχήστρωσης σε ένα μέρος, ενώ η χορογραφία στην ουσία αποτελεί μια περιγραφή του τρόπου διανομής του ελέγχου μεταξύ των συνεργαζομένων συμμετεχόντων, δίχως να χρησιμοποιείται ένας κεντρικός συντονιστής με σκοπό την ολοκλήρωση της εργασίας. Για να οριστεί σωστά η χορογραφία, πρέπει ο σχεδιαστής να δημιουργήσει ένα WS-CDL περιγραφικό έγγραφο της χορογραφίας που θα χρησιμεύσει ως το συμβόλαιο/σύμβαση μεταξύ των συμμετεχόντων αλληλεπίδρασης. Συγκεκριμένα, ένα WS-CDL έγγραφο περιγράφει τις ανταλλαγές μηνυμάτων μεταξύ των συνεργαζομένων συμμετεχόντων, ορίζοντας πώς αυτοί οι συμμετέχοντες πρέπει να χρησιμοποιούνται μαζί για την επίτευξη ενός κοινού επιχειρηματικού στόχου. Για παράδειγμα, μπορεί να υπάρξει μια χορογραφία που επιτρέπει τη συνεργασία μεταξύ ενός ενορχήστρωση, μια υπηρεσία-ελεγκτής που αντιπροσωπεύει μία WS-BPEL διαδικασία, και μία υπηρεσία-πελάτης που αλληλεπιδρά με την εν λόγω υπηρεσίαελεγκτή. Σχηματικά, αυτό μπορεί να αναπαρασταθεί στην παρακάτω εικόνα: 43

44 Στο σενάριο που απεικονίζεται στο σχήμα, το στρώμα της χορογραφία χρησιμοποιείται για να καθορίσει την ομότιμη (peer-to-peer) συνεργασία των δύο υπηρεσιών. Ειδικότερα, το WS-CDL έγγραφο της χορογραφίας περιγράφει την ανταλλαγή μηνυμάτων μεταξύ μίας σύνθετης υπηρεσίας που συζητήθηκε στην προηγούμενη παράγραφο και μίας από τους πελάτες της. 44

45 2.2 Πλεγματικά συστήματα (Grid & cloud computing) Γενικά Υπάρχουν φορές όπου ένας υπολογιστής ή τουλάχιστον ένα εταιρικό δίκτυο υπολογιστών δεν επαρκεί για τις υπολογιστικές (grid) ή και αποθηκευτικές ανάγκες της επιχείρησης (cloud). Το πλέγμα (grid) κατορθώνει ακριβώς αυτό: επιτυγχάνει μεγαλύτερη απόδοση συγκεντρώνοντας πόρους από διαφορετικές τοποθεσίες. Δίχως το πλέγμα, ένας οργανισμός, μία επιχείρηση, πρέπει να περιορίζεται στους πόρους τους οποίους διαθέτει φυσικά. Με το πλέγμα, πόροι από διαφορετικούς οργανισμούς συγκεντρώνονται δυναμικά για να σχηματιστούν εικονικοί οργανισμοί με σκοπό την επίλυση συγκεκριμένων προβλημάτων. Η παρακάτω εικόνα δείχνει πιο παραστατικά πώς οι πόροι από τρεις ξεχωριστούς 'πραγματικούς' οργανισμούς μπορούν να συνδυαστούν σε δύο εικονικούς οργανισμούς. Περαιτέρω, αν και δεν φαίνεται στην εικόνα, απλοί χρήστες μπορούν να σχηματίσουν εικονικούς οργανισμούς, όπως γίνεται σε διάφορα projects ανά την υφήλιο (βλ. boinc κτλ.) Εννοιολογικά, όλα αυτά μπορεί να φαίνονται σαν μια απλή σκέψη. Στην πραγματικότητα, "η χρήση πόρων από πολλούς οργανισμούς" μοιάζει σαν ένα πολύ έξυπνο τρόπο δράσης όταν ένα πρόβλημα δεν μπορεί να επιλυθεί με τη χρησιμοποίηση των υπολογιστικών πόρων ενός μεμονωμένου οργανισμού. Ωστόσο, στην πράξη, αυτό δεν είναι καθόλου απλό. Για παράδειγμα, ρωτήστε τον εαυτό σας τα εξής: Πώς θα αποφασίσουμε ποιοι πόροι είναι μέρος της κάθε εικονικού οργανισμού; 45

46 Με δεδομένη μια υπολογιστική εργασία, πώς θα αποφασιστεί ποιοι πόροι θα διατεθούν για την περάτωση του έργο; Για πόσο καιρό; Σίγουρα, δεν θέλουμε να δώσουμε σε άλλους οργανισμούς απρόσκοπτη πρόσβαση σε πόρους μας! Πώς θα κάνουμε τους πόρους να επικοινωνούν μεταξύ τους; Πρέπει να ληφθεί υπόψη ότι αυτοί οι ετερογενείς πόροι προέρχονται από διάφορους οργανισμούς! Αν θέλουμε να "χωριστεί" ένα έργο, ώστε να μπορεί να εκτελεστεί παράλληλα από διάφορους υπολογιστές σε διαφορετικούς οργανισμούς, με ποιον τρόπο θα πρέπει πραγματικά να "κατατμηθεί" το πρόγραμμα; Και πάλι, μας απασχολούν οι ετερογενείς πόροι: κάθε οργανισμός μπορεί να χρησιμοποιεί ένα διαφορετικό λειτουργικό σύστημα, ή ακόμη και μια διαφορετική αρχιτεκτονική υπολογιστή. Ο διαμοιρασμός των πόρων με άλλους οργανισμούς μπορεί να ακούγεται σαν μια πραγματικά ιδανική σκέψη, αλλά ενέχει πολλές προκλήσεις ασφαλείας. Για παράδειγμα, πώς μπορεί ένας οργανισμός να είναι σίγουρος ότι οι πόροι του θα χρησιμοποιούνται μόνο από έμπιστους χρήστες και ότι δεν καταχρώνται από κακόβουλους χρήστες; Έτσι, θα μπορούσαμε να πούμε ότι το Grid computing, σε γενικές γραμμές, μας δίνει τη δυνατότητα πρόσβασης σε ετερογενείς πόρους που προέρχονται από διάφορους οργανισμούς, παρέχοντας ένα σύνολο πρωτοκόλλων, τεχνολογιών, και μεθοδολογιών που παρέχουν μια απάντηση στα ερωτήματα αυτά. Προτού μελετήσουμε περισσότερο τη γενική αρχιτεκτονική των συστημάτων Grid, ας ρίξουμε μια ματιά σε ένα πιο περιεκτικό ορισμό του Grid Computing Ορισμός Αν και έχουν δοθεί πάρα πολλοί ορισμοί σχετικά με το Grid computing, εμείς θα χρησιμοποιήσουμε τον ορισμό του Ian Foster από το βιβλίο του What is the Grid? A Three Point Checklist 4. Αν και ο ίδιος ο συγγραφέας εξηγεί ότι η λίστα αφήνει χώρο για συζήτηση, ωστόσο παρέχει έναν συνεπή και ακριβή ορισμό του grid. Παραθέτοντας, λέει: 4 I. Foster. What is the Grid? A Three Point Checklist.GRIDToday, July 20,

47 Πλέγμα είναι ένα σύστημα που 1. συντονίζει τους πόρους που δεν υπόκεινται σε κεντρικό έλεγχο 2. χρησιμοποιώντας τυποποιημένα, ανοικτού και γενικού σκοπού πρωτόκολλα και διεπαφές 3. για να παραδώσει σύνθετες ποιοτικές υπηρεσίες. Ας ρίξουμε μια πιο προσεκτική ματιά στα δύο πρώτα σημεία: 1. συντονίζει τους πόρους που δεν υπόκεινται σε κεντρικό έλεγχο Αυτό παραπέμπει στην έννοια του χρησιμοποιώντας πόρους από διάφορους οργανισμούς που έχουμε αναφέρει νωρίτερα. Για να είμαστε πιο συνεπείς, στην πραγματικότητα, αναφερόμαστε στην ενσωμάτωση και τον συντονισμό των πόρων και των χρηστών που ζουν σε διαφορετικούς τομείς ελέγχου(control domains). Έχουμε μιλήσει για διαμοιρασμό πόρων διάφορων οργανισμών, αλλά αυτοί οι τομείς ελέγχου θα μπορούσε επίσης να είναι διαφορετικές διοικητικές μονάδες μέσα σε μια εταιρεία. Είναι ακριβώς τότε, όταν έχουμε να αντιμετωπίσουμε αυτούς τους διάφορους τομείς ελέγχου, ότι θα προκύψουν όλα τα ζητήματα που προαναφέρθηκαν. Διαφορετικά, θα πρέπει να κάνουμε με ένα πρόβλημα που μπορεί να επιλυθεί χρησιμοποιώντας τοπικές λύσεις διαχείρισης, που δεν χρησιμοποιούν πλεγματικό σύστημα. 2. χρησιμοποιώντας τυποποιημένα, ανοικτού και γενικού σκοπού πρωτόκολλα και διεπαφές Έχουμε αναφέρει ότι οι πόροι σε ένα Grid είναι ανομοιογενείς. Σε ένα σύστημα πλέγματος, πρέπει με κάποιο τρόπο πρέπει να λάβουμε το σύνολο των διαφορετικών πόρων (ανεξάρτητοι υπολογιστές, ομάδες/clusters, υπερυπολογιστές, αποθηκευτικοί χώροι, κ.λπ.) που χρησιμοποιούν μια μεγάλη ποικιλία λειτουργικών συστημάτων και αρχιτεκτονικών, και με κάποιο τρόπο να τους κάνουμε να συνεργάζονται για την επίλυση υπολογιστικών καθηκόντων. Ο μόνος τρόπος για να γίνει αυτό είναι με τη χρήση "πρότυπων, ανοικτών, γενικού σκοπού πρωτοκόλλων και διεπαφών" που παρέχουν μια «κοινή γλώσσα» που ο καθένας στο Grid μπορεί να καταλάβει. Τα 47

48 πρωτόκολλα επιτρέπουν την ανομοιογένεια, και, το γεγονός ότι αυτά βασίζονται σε πρότυπα, προωθείται η διαλειτουργικότητα Η αρχιτεκτονική πλέγματος (Grid Architecture) Η δημιουργία ενός πλήρους συστήματος Grid απαιτεί μια ευρεία ποικιλία πρωτοκόλλων, υπηρεσιών, και κιτ ανάπτυξης λογισμικού. Στο ορόσημο κείμενο των Foster, Kesselman και Tuecke, Anatomy of the Grid 5, καθορίζεται μία γενική αρχιτεκτονική Grid στην οποία όλα τα διάφορα στοιχεία που απαρτίζουν ένα σύστημα πλέγματος (Grid) κατηγοριοποιούνται ανάλογα με τη λειτουργία και τον σκοπό τους. Η αρχιτεκτονική Grid μπορεί να εκφραστεί βάσει ενός πολυεπίπεδου διαγράμματος. Θα περιγραφεί κάθε στρώμα από κάτω προς τα πάνω. 1.Fabric (Ύφανση) Αυτό το στρώμα αφορά τους πόρους που στην πραγματικότητα πρόκειται να κατανεμηθούν στο Grid σύστημά μας, όπως μεμονωμένοι υπολογιστές, clusters, υπερυπολογιστές, αποθηκευτικοί χώροι δικτύου, βάσεις δεδομένων, κλπ. 2.Connectivity (Συνδεσιμότητα) Φυσικά, οι πόροι μας πρέπει να είναι σε θέση να επικοινωνούν μεταξύ τους. Το στρώμα συνδεσιμότητας αναφέρεται σε όλα τα πρωτόκολλα που θα επιτρέψουν στους πόρους μας να επικοινωνούν. Θεμελιώδη πρωτόκολλα Internet, όπως το TCP / IP, HTTP, DNS, κλπ. εμπίπτουν σε αυτό το στρώμα. Ωστόσο, τα συστήματα Grid επίσης 5 I. Foster, C. Kesselman, and S. Tuecke. The Anatomy of the Grid: Enabling Scalable Virtual Organizations.International J. Supercomputer Applications15(3),

49 απαιτούν ασφαλή επικοινωνία, έτσι αυτό το στρώμα περιλαμβάνει επίσης πολλά πρωτόκολλα που έχουν προκύψει από την κοινότητα Grid σε απάντηση των ιδιόρρυθμων προκλήσεων ασφαλείας που αντιμετωπίζουν τα Grid συστήματα. 3.Resource (Πόροι) Αυτό το στρώμα αναφέρεται σε όλες τις υπηρεσίες και τα πρωτόκολλα που θα μας επιτρέπουν να διαχειριζόμαστε τους ανεξάρτητους πόρους. Αυτή η διαχείριση μπορεί να περιλαμβάνει εργασίες όπως η αρχικοποίηση των πόρων, την παρακολούθησή τους, και την μέτρησή τους. Σε αυτό το στρώμα, δεν ασχολούνται με τις παγκόσμιες αλληλεπιδράσεις μεταξύ των πόρων στο Grid, μόνο με ανεξάρτητους πόρους. Συγκεκριμένα, υπάρχουν δύο κύριες κατηγορίες των πρωτοκόλλων σε αυτό το επίπεδο: Πρωτόκολλα πληροφοριών: Τα πρωτόκολλα αυτά θα μας επιτρέψουν να έχουν πρόσβαση σε πληροφορίες ενός πόρου. Για παράδειγμα, στην περίπτωση ενός υπολογιστή, ίσως να μας ενδιαφέρει να μάθουμε το CPU load, την διαθέσιμη μνήμη του, τον αριθμός των διαδικασιών λειτουργίας σε αυτό, κλπ. Πρωτόκολλα διαχείρισης: Τα πρωτόκολλα αυτά στην πραγματικότητα μας επιτρέπουν να ελέγχουμε τον πόρο, σε κάποιο βαθμό. Σε ένα σύστημα πλέγματος, εμείς δεν θα έχουμε συνήθως πλήρη έλεγχο πάνω σε έναν πόρο. Συνεπώς, αυτές οι υπηρεσίες και τα πρωτόκολλα γενικά θα είναι υπεύθυνα να ελέγχουν ότι το είδος των υπηρεσιών που θα ζητήσουμε σε έναν πόρο είναι συνεπείς με τις πολιτικές ενός οργανισμού. 4 Collective (Συλλογικό) Αυτό το στρώμα περιλαμβάνει τις υπηρεσίες και τα πρωτόκολλα που ασχολούνται με τη διαχείριση πολλαπλών πόρων. Με βάση τις υπηρεσίες που παρέχονται στο στρώμα των πόρων (resource), αυτό το στρώμα θα μας επιτρέψει να λαμβάνουμε πράγματι ένα σύνολο πόρων και να τους κάνουμε να συνεργάζονται για την επίλυση ένα κοινού έργου. Τα παρακάτω είναι μόνο ένα δείγμα από το είδος των υπηρεσιών που βρίσκονται συνήθως σε αυτό το στρώμα: 49

50 Μητρώα πόρων (Resource registries): Μας επιτρέπουν να ανακαλύψουμε μέσα σε έναν εικονικό οργανισμό πόρους και να αιτηθούμε ιδιότητές τους. Υπηρεσίες κατανομής και δρομολογητών: Όταν θέλουμε να εκτελέσουμε ένα πρόγραμμα σε ένα σύστημα πλέγματος, εμείς γενικά δεν πρέπει να αποφασίσουμε πού ακριβώς αυτό θα τρέξει στο δίκτυο. Μία υπηρεσία κατανομής θα χρησιμοποιήσει έναν κατάλογο των πόρων για να ανακαλύψει έναν πόρο (ή πόρους) κατάλληλα για το πρόγραμμά μας (που συνήθως ονομάζεται εργασία), και θα διαθέσει πόρους για τη εργασία μας. Μια υπηρεσία προγραμματισμού θα αποφασίσει ποιες εργασίας πραγματικά τρέχουν πού και πότε. Υπηρεσίες παρακολούθησης: Μας επιτρέπουν να παρακολουθούμε ότι όλοι οι πόροι μας δουλεύουν κανονικά. Υπηρεσίες διαχείρισης δεδομένων: Οι εργασίες μας θα απαιτούν γενικά σύνολα δεδομένων για να εργαστούν. Οι υπηρεσίες διαχείρισης δεδομένων παρακολουθούν αυτές τις σειρές δεδομένων και τις εναλλαγές δεδομένων με τον πόρο που τους χρειάζεται. 5.Εφαρμογές Αυτό το στρώμα αναφέρεται στις πραγματικές εφαρμογές που θα τρέχουν σε ένα σύστημα πλέγματος. Να σημειωθεί ότι οι εφαρμογές αυτές δεν χρειάζεται να αλληλεπιδρούν άμεσα με το υπηρεσίες συλλογικού (collective services). Είναι επίσης ελεύθερες να έχουν πρόσβαση στο κομμάτι των Πόρων(resource) και των υπηρεσιών συνδεσιμότητας (Connectivity) κάθε φορά που απαιτείται Παραδείγματα Grid Συστημάτων EGEE: Enabling Grids for E-Science στην Ευρώπη ( Ένα φιλόδοξο σχέδιο πλέγματος που θα δώσουν επιστήμονες πρόσβαση σε 50

51 υπολογιστικούς πόρους σε 27 χώρες. Το EGEE θα είναι επίσης υπεύθυνο για την παροχή της τρομερής υπολογιστικής ισχύος που απαιτείται από το LHC του CERN NEESit ( Παρέχει μια εκτεταμένη υποδομή για την NEES (Δίκτυο για την Προσομοίωσης Αντισεισμικής Μηχανικής) συμμαχίας, με τη διασύνδεση ερευνητικών κέντρων σεισμών στις ΗΠΑ. TeraGrid ( Ένα σύστημα Grid που παρέχει μια ισχυρή υποδομή για την ανοικτή επιστημονική έρευνα. Το 2004, το TeraGrid είχε 20 teraflops υπολογιστικής ισχύος και 1 Petabyte δυνατότητα αποθήκευσης. ediamond ( Το ediamond έργο είναι ένα παράδειγμα του πώς το Grid computing μπορεί να χρησιμοποιηθεί για την ηλεκτρονική Υγεία. Αυτό το έργο "μαζεύει και διανέμει πληροφορίες για τη θεραπεία του καρκίνου του μαστού, δίνει τη δυνατότητα έγκαιρης ανίχνευσης και διάγνωσης, καθώς και παρέχει εργαλεία και πληροφορίες για τη θεραπεία της ασθένειας". 51

52 3. Διαγράμματα ροής δεδομένων 3.1. Γενικά Ορισμός Μια ροή εργασίας αποτελείται από μια σειρά συνδεδεμένων βημάτων. Πρόκειται για μια παράσταση μιας ακολουθίας πράξεων, που δηλώθηκαν ως εργασία ενός προσώπου, μιας ομάδας ατόμων 6, μια οργάνωσης με προσωπικό, ή γενικά ενός ή περισσότερων απλών ή σύνθετων μηχανισμών. Ως ροή εργασίας μπορεί να θεωρηθεί οποιαδήποτε αφηρημένη θεώρηση μιας πραγματικής εργασίας, που διαχωρίζεται σε επιμέρους εργασίες, σε τμήματα εργασίας ή σε άλλα είδη της ταξινόμησης(ή επιμέρισης). Για ελεγκτικούς σκοπούς, η ροή εργασίας μπορεί να είναι μια άποψη, μια οπτική γωνία για την πραγματική εργασία σε μία συγκεκριμένη, επιλεγμένη πτυχή 7, ούσα ως εκ τούτου μία εικονική αναπαράσταση της πραγματικής εργασίας. Η ροή που περιγράφεται, συχνά αναφέρεται ως έγγραφο που μεταφέρεται από το ένα στάδιο στο άλλο. Μια ροή εργασίας είναι ένα μοντέλο για να αντιπροσωπεύει μία πραγματική δουλειά για περαιτέρω εκτίμηση, παραδείγματος χάριν, για την περιγραφή μίας αξιόπιστης επαναλαμβανόμενης αλληλουχίας ενεργειών. Πιο αφηρημένα, μια ροή εργασίας είναι ένα μοτίβο δραστηριότητας που έχει προκύψει με τη συστηματική οργάνωση των πόρων, καθορισμένων ρόλων και μαζικών, ενεργειακών και πληροφοριακών ροών εργασίας, σε μια διαδικασία εργασίας που μπορεί να τεκμηριωθεί και να γίνει γνωστή. 8 9 Οι ροές εργασίας αποσκοπούν στην επίτευξη να επεξεργαστούν κάποιου είδους προθέσεων, όπως η φυσική μεταμόρφωση, η παροχή υπηρεσιών, ή η επεξεργασία πληροφοριών. Οι έννοιες των ροών εργασίας είναι έννοιες που συνδέονται στενά με άλλες έννοιες που χρησιμοποιούνται για να περιγράψουν οργανωτική δομή, όπως σιλό, λειτουργίες, ομάδες, σχέδια, πολιτικές και ιεραρχίες. Οι ροές εργασίας μπορεί να 6 ΙSO 12052:2006, 7 ISO/TR 16044:2004, ftp://ftp.informatik.uni-stuttgart.de/pub/library/medoc.ustuttgart_fi/stud-2052/stud-2052.pdf 52

53 θεωρηθούν ως ένα πρωταρχικό δομικό στοιχείο των οργανισμών. Οι σχέσεις μεταξύ αυτών των εννοιών περιγράφονται παρακάτω σε αυτήν την καταχώρηση. Ο όρος ροή εργασίας χρησιμοποιείται στο πλαίσιο του προγραμματισμού ηλεκτρονικών υπολογιστών για να συλλάβει και να αναπτύξει τις σχέσεις ανθρώπωνμηχανών. Τα λογισμικά διαχείρισης ροών εργασίας 10 έχουν ως στόχο να παρέχουν στους τελικούς χρήστες έναν ευκολότερο τρόπο να ενορχηστρώνουν ή/και να περιγράφουν σύνθετες επεξεργασίες δεδομένων σε μια οπτική μορφή, περίπου όπως τα διαγράμματα ροής αλλά δίχως την ανάγκη να γίνουν κατανοητοί οι υπολογιστές ή ο προγραμματισμός Σχετικές έννοιες Η έννοια της ροής εργασίας σχετίζεται στενά με πολλούς άλλους τομείς στην έρευνα λειτουργιών (operations research) και σε άλλα πεδία που μελετούν την φύση της εργασίας, είτε ποιοτικά είτε ποσοτικά, όπως η τεχνητή νοημοσύνη (ιδίως, η υποπειθαρχία του σχεδιασμού τεχνητής νοημοσύνης) και η εθνογραφία. Η ροή εργασίας είναι όρος που χρησιμοποιείται πιο συχνά σε συγκεκριμένους κλάδους, όπως στην εκτύπωση, και σε επαγγελματικούς τομείς, όπου μπορεί να έχει ιδιαίτερα εξειδικευμένες σημασίες. 1. Διεργασίες: Μια διεργασία (ενίοτε αναφέρεται και ως διαδικασία) είναι μια πιο συγκεκριμένη έννοια από τη ροή εργασίας, και μπορεί να εφαρμοστεί, για παράδειγμα, σε φυσικές ή βιολογικές διεργασίες. Στο πλαίσιο των εννοιών γύρω από την εργασία, μια διαδικασία μπορεί να διακριθεί από μια ροή εργασίας από το γεγονός ότι έχει σαφώς καθορισμένες εισροές, εκροές και σκοπούς, ενώ η έννοια της ροής εργασίας ενδέχεται να ισχύει γενικότερα για κάθε συστηματικό τρόπο διεξαγωγής των δραστηριοτήτων. 2. Σχεδιασμός και δρομολόγηση: Η σχεδίαση είναι μια περιγραφή του λογικά αναγκαίου, εν μέρει διατεταγμένου συνόλου των δραστηριοτήτων που απαιτούνται για την επίτευξη ενός συγκεκριμένου στόχου υπό ορισμένες αρχικές συνθήκες. Ένα 10 MEgha Workflow Management System, 53

54 σχέδιο, όταν προσαυξηθεί με ένα χρονοδιάγραμμα και με υπολογισμούς της κατανομής των πόρων, καθορίζει απόλυτα ένα συγκεκριμένο στιγμιότυπο (instance) της συστηματικής επεξεργασίας για την επίτευξη ενός στόχου. Μια ροή εργασίας μπορεί να θεωρηθεί ως μία (συχνά βέλτιστη ή σχεδόν βέλτιστη) υλοποίηση των μηχανισμών που απαιτούνται για να εκτελεστεί το ίδιο σχέδιο επανειλημμένα. 3. Ο έλεγχος της ροής είναι μια έννοια ελέγχου που εφαρμόζεται στις ροές των εργασιών για την εκτροπή από στατικές έννοιες ελέγχου που εφαρμόζονται στο απόθεμα, το οποίο διαχειρίζεται απλά τις παραγγελίες, σε μια πιο δυναμική έννοια ελέγχου, που διαχειρίζεται η ταχύτητα της ροής και η ροή όγκου στην κίνηση και στη διαδικασία Ιστορική αναδρομή Στη δεκαετία του 1980, ο όρος ροή εργασίας χρησιμοποιήθηκε για πρώτη φορά στη σύγχρονη μορφή της, στη βιομηχανία λογισμικού, από τον αντιπρόεδρο της FileNet David Siegel. Η εταιρεία αποκάλεσε το λογισμικό της αυτοματοποίησης της επιχειρηματικής διαδικασίας "WorkFlo"(ομόηχο του workflow στα αγγλικά, που σημαίνει ροής εργασίας). Το 1995, η εκδοτική βιομηχανία μελέτησε πώς οι παραδοσιακές διαδικασίες έκδοσης μπορεί να είναι προσδιορισθούν και να αποτυπωθούν γραμμικά σε ψηφιακές μεθόδους, προκειμένου να μειωθεί ο χρόνος καθυστέρησης, καθώς και το σημαντικό κόστος εκτύπωσης και αποστολής για την παροχή αντιγράφων βιβλίων και περιοδικών σε αποθήκες και συνδρομητές. Το ενδιαφέρον για τις επιχειρησιακές διαδικασίες εκφράστηκε στο χώρο των ηλεκτρονικών επιχειρήσεων σε διάφορες μορφές. Το UN/CEFACT - Ηνωµένα Έθνη/ Κέντρο διευκόλυνσης εμπορίου και ηλεκτρονικών επιχειρήσεων, επικέντρωσε στα τέλη της δεκαετίας του 90 το μεγαλύτερο μέρος των εργασιών του στο Open-edi Reference Model. Το Open-edi Reference Model, που στη συνέχεια έγινε πρότυπο (ISO standard 14662), καθόριζε ένα τρόπο επικοινωνίας και αλληλεπίδρασης εταιριών με εμπορικούς συνεργάτες. Το συγκεκριμένο πρότυπο, σε αντίθεση με το έως τότε χρησιμοποιούμενο μοντέλο, 54

55 περιέγραφε λεπτομερώς την τεχνολογία που οι επιμέρους συνεργάτες σε μια διαδικασία χρησιμοποιούσαν και αναγνώριζε τις επιχειρησιακές διαδικασίες περιεχομένου και των μελών που τις χρησιμοποιούσαν. Αναγνώριζε επίσης τις διενέργειες και τα μηνύματα προς και από τις διαδικασίες αυτές που μπορούσαν να πραγματοποιηθούν, καθώς και την ερμηνεία αυτών των μηνυμάτων. Η πρωτοποριακή εργασία του UN/CEFACT συνέβαλε δραστικά στη δηµιουργία του Business Process Specification Schema ή BPSS που αναπτύχθηκε σαν πρωτοβουλία της ebxml. Η BPSS συμπεριέλαβε και τα δύο πρότυπα που αναφέρονται παρακάτω σε ένα νέο πλαίσιο. Το πλαίσιο αυτό περιελάμβανε μεταξύ άλλων και ευρετήρια, ανταλλαγή μηνυμάτων, συμφωνίες μεταξύ των εμπορικών συνεργατών, επικοινωνία μέσω μηνυμάτων και ενιαίο τρόπο ερμηνείας των. Το συγκεκριμένο πλαίσιο υλοποιήθηκε τόσο σε XML όσο και σε UML και στηρίχθηκε στην αρχιτεκτονική του ebxml. Το ως άνω περιγραφόμενο συγκεντρωτικό ενδιαφέρον στις επιχειρησιακές διαδικασίες επηρέασε σε μεγάλο βαθμό τις εργασίες του RosettaNet. Ένα νέο πλαίσιο για τις ηλεκτρονικές υπηρεσίες σχεδιάστηκε και μάλιστα έγινε άμεσα αποδεκτό ως μοντέλο από πολλές επιχειρήσεις. Οι αρχιτέκτονες του RosettaNet αντιστάθηκαν στην παρόρμηση να αναπτύξουν ένα λεξιλόγιο επικοινωνίας αποκλειστικά βασισμένο σε XML και συγκεντρώθηκαν στον ορισμό επιχειρησιακών διαδικασιών για την ηλεκτρονική βιομηχανία που αυτοί περιέγραψαν ως Partner Interface Processes ή PIPs. Το κάθε PIP αναπαριστά μία ή περισσότερες διαδράσεις και περιλαμβάνει τα ηλεκτρονικά επιχειρησιακά έγγραφα που ανταλλάσσονται, το λεξιλόγιο που χρησιμοποιείται για το καθένα. Το RosettaNet δημοσίευσε 6 συλλογές από PIPs, τα οποία καλύπτουν ισάριθμες επιχειρησιακές λειτουργίες, μία εκ των οποίων αφορά την διαχείριση. Ανάμεσα στα ήδη υπάρχοντα XML λεξικά για ηλεκτρονικές επιχειρήσεις το RosettaNet αποτέλεσε μια από τις πιο επιτυχημένες πρωτοβουλίες, χάρη στο ότι ένα μεγάλο μέρος του αφιερώθηκε στο να περιγράψει business processes. 55

56 3.1.4 Χαρακτηριστικά και φαινομενολογία Μοντελοποίηση: Τα προβλήματα ροής εργασίας μπορούν να μοντελοποιηθούν και να αναλυθούν με βάση διαγραμματικούς φορμαλισμούς όπως τα δίκτυα Petri Μέτρηση: Πολλές από τις έννοιες που χρησιμοποιούνται για τη μέτρηση των συστημάτων προγραμματισμού σε ερευνητικές δραστηριότητες είναι χρήσιμες για τη μέτρηση των γενικών ροών εργασίας. Αυτές περιλαμβάνουν την δυναμικότητα, τον χρόνο επεξεργασίας, καθώς και άλλες τακτικές μετρήσεις. Εξειδικευμένες συνδηλώσεις: Η ροή εργασίας έχει εξειδικευμένες συνδηλώσεις στην τεχνολογία πληροφοριών, στην διαχείριση εγγράφων και εικόνων. Από το 1993, μια κοινοπραξία εμπόρων που αφορά ειδικότερα στη διαχείριση της ροής εργασίας και τη διαλειτουργικότητα των συστημάτων διαχείρισης ροής εργασίας έχει σχηματίσει τον Συνασπισμό Διαχείρισης Ροών Εργασίας (Workflow Management Coalition ) Επιστημονικές ροές εργασίας: Οι επιστημονικές ροές εργασίας βρήκαν ευρείας αποδοχής στους τομείς της βιοπληροφορικής και της χημειοπληροφορικής στις αρχές της δεκαετίας του 2000, όπου κάλυψαν με επιτυχία την ανάγκη για πολλαπλά διασυνδεδεμένα εργαλεία, τον χειρισμό πολλαπλών μορφών δεδομένων και μεγάλων ποσοτήτων δεδομένων. Επίσης, το πρότυπο της επιστημονικής ροής εργασίας ήταν κοντά στην παγιωμένη παράδοση της εγγραφής κομματιών κώδικα σε Perl στην επιστήμη της ζωοφυσικής έρευνα, έτσι ώστε αυτή αποδοχή να αποτελέσει ένα φυσικό βήμα προς μια πιο συγκροτημένη υποδομή των ροών εργασίας Συνιστώσες ροών εργασίας Μια ροή εργασίας συνήθως μπορεί να περιγραφεί χρησιμοποιώντας επίσημες ή ανεπίσημες τεχνικές διαγραμμάτων ροής, που δείχνουν κατευθυνόμενες ροές μεταξύ των σταδίων επεξεργασίας. Μεμονωμένα στάδια επεξεργασίας ή συνιστώσες μιας ροής εργασίας μπορούν κατά βάση να οριστούν από τρεις παραμέτρους: 56

57 1. περιγραφή των εισροών: οι πληροφορίες, το υλικό και η ενέργεια που απαιτείται για να ολοκληρωθεί το βήμα 2. κανόνες μετατροπής, αλγόριθμοι, οι οποίοι μπορούν να πραγματοποιηθούν από ανθρώπους ή μηχανές, ή συνδυασμός των δύο 3. περιγραφή των εκροών: οι πληροφορίες, το υλικό και η ενέργεια που παράγεται από το βήμα και που παρέχονται ως εισροές στα μεταγενέστερα βήματα. Οι συνιστώσες μπορούν να συνδεθούν μαζί, αν το αποτέλεσμα ενός προηγούμενου (συνόλου) στοιχείου (-ων) είναι ίση με τις υποχρεωτικές απαιτήσεις εισόδου του επόμενου στοιχείου. Όταν οι συνιστώσες δεν είναι τοπικές υπηρεσίες, αλλά καλούνται εξ αποστάσεως υπηρεσίες για να εξυπηρετηθούν, όπως στις υπηρεσίες διαδικτύου, επιπλέον περιγραφικές οντότητες (όπως η ποιότητα της υπηρεσίας και η διαθεσιμότητα) πρέπει επίσης να εξεταστούν. 3.2 BPEL Ορισμός Η Γλώσσα Εκτέλεσης Επιχειρησιακών Διαδικασιών (Business Process Execution Language - BPEL), συντόμευση της πλήρους ονομασίας Γλώσσα Εκτέλεσης Επιχειρησιακών Διαδικασιών για υπηρεσίες διαδικτύου (Web Services Business Process Execution Language - WS-BPEL) είναι ένα πρότυπο εκτελέσιμης γλώσσας κατά τον OASIS για τον προσδιορισμό των αλληλεπιδράσεων με δικτυακές υπηρεσίες. Διεργασίες στο Business Process Execution Language εξαγωγής και εισαγωγής πληροφοριών με τη χρήση Web Service διασυνδέσεις αποκλειστικά Γενικά Οι αλληλεπιδράσεις των υπηρεσιών διαδικτύου μπορούν να περιγραφούν με δύο τρόπους: ως εκτελέσιμες επιχειρησιακές διαδικασίες ή ως αφηρημένες επιχειρησιακές διαδικασίες. Οι εκτελέσιμες επιχειρησιακές διαδικασίες μοντελοποιούν την πραγματική συμπεριφορά ενός συμμετέχοντος σε μια επιχειρησιακή αλληλεπίδραση. 57

58 Οι αφηρημένες επιχειρησιακές διαδικασίες είναι εν μέρει καθορισμένες διαδικασίες που δεν έχουν ως σκοπό να εκτελεστούν. Μια αφηρημένη διαδικασία μπορεί να κρύβει μερικές από τις απαιτούμενες συγκεκριμένες επιχειρησιακές λεπτομέρειες. Οι αφηρημένες διαδικασίες εξυπηρετούν στο να δίνεται ένας περιγραφικός ρόλο, με περισσότερες από μία πιθανές περιπτώσεις χρήσης (use cases), συμπεριλαμβανομένων παρατηρήσιμων συμπεριφορών και προτύπων διαδικασίας. Η WS-BPEL προορίζεται να χρησιμοποιηθεί και για την μοντελοποίηση της συμπεριφοράς των αφηρημένων αλλά και των εκτελέσιμων διαδικασιών. Η WS-BPEL παρέχει μια γλώσσα για την προδιαγραφή των εκτελέσιμων και των αφηρημένων επιχειρησιακών διαδικασιών. Με αυτόν τον τρόπο, επεκτείνει το μοντέλο αλληλεπίδρασης των υπηρεσιών διαδικτύου και τους επιτρέπει να υποστηρίξουν επιχειρησιακές συναλλαγές. Η WS-BPEL ορίζει ένα διαλειτουργικό πρότυπο ολοκλήρωσης που μπορεί να διευκολύνει την επέκταση της αυτοματοποιημένης διαδικασίας ολοκλήρωσης, τόσο εντός όσο και μεταξύ των επιχειρήσεων. Η προέλευση του BPEL μπορούν να εντοπιστούν στο WSFL και την XLANG. Σειριοποιείται μέσω της XML και έχει ως στόχο να διευκολύνει τον προγραμματισμό των μεγάλων, σύνθετων προγραμμάτων. Οι έννοιες του προγραμματισμού των μεγάλων και τον προγραμματισμό των μικρών γίνεται στην διάκριση μεταξύ δύο πτυχών της γραφής κώδικα για τις μακροχρόνιες ασύγχρονες διαδικασίες που συνήθως συναντά κανείς στις επιχειρησιακές διαδικασίες. Ο προγραμματισμός των μεγάλων αναφέρεται γενικά σε υψηλού επιπέδου αλληλεπιδράσεις μεταβατικής κατάστασης μιας διαδικασίας η BPEL αναφέρεται στην έννοια αυτή ως αφηρημένη διαδικασία. Μια BPEL αφηρημένη διαδικασία αντιπροσωπεύει ένα σύνολο δημόσιων παρατηρούμενων συμπεριφορών σε έναν τυποποιημένο τρόπο. Μια αφηρημένη διαδικασία περιλαμβάνει πληροφορίες όπως το πότε να περιμένει για μηνύματα, πότε να προετοιμάζεται για την αποστολή μηνυμάτων, πότε να αντισταθμίζει τις αποτυχημένες συναλλαγές, κτλ. Ο προγραμματισμός των μικρών, αντιθέτως, ασχολείται με την βραχύβια προγραμματική συμπεριφορά, που συχνά εκτελείται ως μεμονωμένη συναλλαγή και αφορά την πρόσβαση σε τοπική λογική και πόρους, όπως αρχεία, βάσεις δεδομένων κλπ. Η 58

59 ανάπτυξη της BPEL προήρθε από την ιδέα ότι για τον προγραμματισμό των μεγάλων και για τον προγραμματισμό των μικρών απαιτούνται διαφορετικά είδη γλωσσών Ιστορία Η ανάγκη για αναπαράσταση επιχειρησιακών διαδικασιών σε εφαρμογές με δικτυακές υπηρεσίες, όπως φάνηκε από την επιτυχία του RosettaNet, οδήγησε στη δημιουργία πολλών άλλων XML λεξιλογίων και προτύπων δικτυακών υπηρεσιών που αφορούν αυτά τα ζητήματα. Οι δύο πιο σημαντικές συμβολές είναι η Business Process Modeling Language (BPML) αλλά και -όπως είδαμε- η Business Process Execution Language for Web Services (BPEL-WS). Η IBM και η Microsoft είχε καθεμιά ορίσει τις δικές τους, αρκετά παρόμοιες, γλώσσες για «προγραμματισμός των μεγάλες», τις WSFL και XLANG, αντίστοιχα. Με τη δημοτικότητα και την έλευση του BPML, και την αυξανόμενη επιτυχία του BPMI.org καθώς και το ανοιχτό κίνημα BPMS υπό την ηγεσία της JBoss και της Intalio Inc, η IBM και η Microsoft αποφάσισαν να συνδυάσουν αυτές τις γλώσσες σε μια νέα γλώσσα, την BPEL4WS. Τον Απρίλιο του 2003, οι BEA Systems, IBM, Microsoft, SAP και Siebel Systems υπέβαλαν BPEL4WS 1.1 στον OASIS για την τυποποίηση μέσω της τεχνικής επιτροπής της BPEL για δικτυακές υπηρεσίες. Παρόλο που BPEL4WS εμφανίστηκε τόσο ως 1.0 όσο και ως 1.1 εκδοχή, η OASIS WS-BPEL τεχνική επιτροπή ψήφισε στις 14 Σεπτεμβρίου του 2004 να ονομάσουν την προδιαγραφή WS-BPEL 2.0. Αυτή η αλλαγή ονόματος έγινε για να ευθυγραμμιστεί η BPEL με τις υπόλοιπες τυποποιημένες συμβάσεις ονομασίας δικτυακών υπηρεσιών που αρχίζουν με το WS καθώς και μαρτυρά τις σημαντικές βελτιώσεις μεταξύ BPEL4WS 1,1 και WS-BPEL 2.0. Αν δεν συζητάμε για μια συγκεκριμένη έκδοση, τότε συνήθως χρησιμοποιούμε σκέτο το ακρωνύμιο BPEL Τον Ιούνιο του 2007, οι Active Endpoints, Adobe, BEA, IBM, Oracle και SAP δημοσίευσαν τις BPEL4People και WS-HumanTask προδιαγραφές, οι οποίες περιγράφουν τον τρόπο που μπορούν να εφαρμοστεί η αλληλεπίδραση του ανθρώπου σε BPEL διαδικασίες Σχεδιαστικοί στόχοι της BPEL Υπήρχαν δέκα αρχικοί σχεδιαστικοί στόχοι που σχετίζονται με BPEL: 59

60 1. Ο ορισμός επιχειρησιακών διαδικασιών που αλληλεπιδρούν με εξωτερικούς φορείς μέσω λειτουργιών δικτυακών υπηρεσιών, οι οποίες θα ορίζονται βάσει του προτύπου WSDL 1.1, καθώς και θα είναι δηλώνουν την εμφάνισή τους ως υπηρεσίες διαδικτύου πάλι βάσει προτύπου WSDL 1.1. Οι αλληλεπιδράσεις είναι «αφηρημένες» υπό την έννοια ότι η εξάρτηση είναι σε τύπου porttype ορισμούς και όχι σε κατευθείαν ορισμούς θυρών (port). 2. Καθορισμός επιχειρησιακών διαδικασιών με χρήση γλώσσα βασισμένη σε XML. Να μην ορίζεται μια γραφική αναπαράσταση των διαδικασιών ή να παρέχεται οποιαδήποτε συγκεκριμένη μεθοδολογία σχεδιασμού για τις διαδικασίες. 3. Ορισμός ενός συνόλου εννοιών ενορχήστρωσης δικτυακών υπηρεσιών που προορίζονται να χρησιμοποιηθούν τόσο από την εξωτερική (αφηρημένη) όσο και από την εσωτερική (εκτελέσιμη) άποψη μιας επιχειρηματικής διαδικασίας. Μια τέτοια επιχειρησιακή διαδικασία καθορίζει την συμπεριφορά μιας ενιαίας αυτόνομης οντότητας, που συνήθως λειτουργεί σε αλληλεπίδραση με άλλες παρόμοιες ομότιμες οντότητες. Εξυπακούεται ότι κάθε πρότυπος τρόπος χρήσης (π.χ. αφηρημένη άποψη και εκτελέσιμο άποψη) θα απαιτήσει λίγες εξειδικευμένες επεκτάσεις, αλλά αυτές οι επεκτάσεις πρέπει να περιορίζονται στο ελάχιστο και να δοκιμάζονται ως προς τις απαιτήσεις, όπως η εισαγωγή / εξαγωγή και ο έλεγχος συμμόρφωσης που συνδέουν τις δύο μορφές χρήσης. 4. Παροχή τόσο ιεραρχικής όσο και γραφικής παράστασης τομέων ελέγχου, και επίτρεψη των χρήσεών τους να αναμειχθούν όσο απρόσκοπτα είναι δυνατό. Αυτό θα πρέπει να μειώνει τον κατακερματισμό του χώρου της μοντελοποίησης της διαδικασία. 5. Παροχή λειτουργιών διαχείρισης δεδομένων για τον απλό χειρισμό των δεδομένων που απαιτούνται για τον καθορισμό των δεδομένων της διαδικασίας και για τον έλεγχο της ροής. 6. Υποστήριξη ενός μηχανισμού αναγνώρισης για διαδικασίες που επιτρέπει τον ορισμό των αναγνωριστικών σε επίπεδο μηνύματος αίτησης της εκάστοτε εφαρμογής. 7. Η υποστήριξη της έμμεσης δημιουργίας και τερματισμού των διαδικασιών ως βασικό μηχανισμό του κύκλου ζωής. Σύνθετες εργασίες του κύκλου ζωής, όπως η 60

61 "διακοπή" και "συνέχιση" μπορούν να προστεθούν σε μελλοντικές εκδόσεις για τη βελτίωση της διαχείρισης του κύκλου ζωής. 8. Ορισμός ενός μοντέλου μακροχρόνιας συναλλαγής που θα βασίζεται σε δοκιμασμένες τεχνικές, όπως ενέργειες αποζημίωσης και οριοθέτησης του πεδίου με σκοό την υποστήριξη για ανάκτηση από αποτυχία σε μέρη μακροχρόνιων επιχειρησιακών διαδικασιών. 9. Χρήση των υπηρεσιών διαδικτύου ως μοντέλο για την αποσύνθεση και την συναρμολόγηση διαδικασιών 10. Βάση στα πρότυπα των υπηρεσιών διαδικτύου, όσο το δυνατόν περισσότερο σε ένα συνθετικό και σπονδυλωτό τρόπο Η γλώσσα BPEL Η BPEL είναι μια γλώσσα ενορχήστρωσης, όχι μια γλώσσα χορογραφίας. Η κύρια διαφορά μεταξύ ενορχήστρωση και η χορογραφία είναι δυνατότητα εκτέλεσης και ελέγχου. Μια ενορχήστρωση καθορίζει μία εκτελέσιμη διαδικασία που περιλαμβάνει ανταλλαγές μηνυμάτων με άλλα συστήματα, έτσι ώστε οι ακολουθίες ανταλλαγής μηνυμάτων να ελέγχονται από το σχεδιαστή της ενορχήστρωσης. Μια χορογραφία καθορίζει ένα πρωτόκολλο για ομότιμες αλληλεπιδράσεις. Τέτοιο πρωτόκολλο δεν είναι άμεσα εκτελέσιμο, καθώς επιτρέπει πολλές διαφορετικές υλοποιήσεις (διαδικασίες που συμμορφώνονται με αυτό). Η χορογραφία μπορεί να πραγματοποιηθεί, αφού τροποποιηθεί σε ενορχήστρωση, με τη σύνταξη ενός ενορχήστρωση (π.χ. με τη μορφή μιας διαδικασίας BPEL) για κάθε μέλος που εμπλέκεται σε αυτό. Η ενορχήστρωση και η χορογραφία είναι διακρίσεις που βασίζονται στις αναλογίες: ενορχήστρωση παραπέμπει στον κεντρικό έλεγχο (από τον μαέστρο) της συμπεριφοράς ενός κατανεμημένου συστήματος (η ορχήστρα που αποτελείται από πολλούς παίκτες), ενώ η χορογραφία αναφέρεται σε ένα κατανεμημένο σύστημα (η ομάδα χορού) που λειτουργούν σύμφωνα με τους κανόνες αλλά δεν έχει κεντρικό έλεγχο. Η εστίαση της BPEL για τις σύγχρονες επιχειρηματικές διαδικασίες, καθώς και η ιστορία των WSFL και XLANG, οδήγησε την BPEL να υιοθετήσει τις διαδικτυακές 61

62 υπηρεσίες ως έναν εξωτερικό μηχανισμό ανακοίνωσής της. Έτσι τα μηνύματα της BPEL εξαρτώνται από τη χρήση του Web Services Description Language (WSDL) 1.1 για την περιγραφή των εξερχόμενων και εισερχόμενων μηνυμάτων. Όπως αναφέρθηκε προηγουμένως, WS-BPEL είναι μια γλώσσα που χρησιμοποιείται για να περιγράψει τη λογική εκτέλεση των υπηρεσιών εφαρμογών διαδικτύου με τον καθορισμό των ροών ελέγχου τους και παρέχοντας έναν τρόπο για τις συμμετέχουσες υπηρεσίες να μοιράζονται ένα κοινό πλαίσιο. Ως συμμετέχουσες υπηρεσίες ορίζουμε αυτές που αλληλεπιδρούν με την WS-BPEL διαδικασία. Η WS-BPEL βασίζεται σε διάφορες προδιαγραφές, όπως SOAP, WSDL και XML Schema, όπου η WSDL είναι ίσως η πιο σημαντική. Η WSDL είναι αυτό που κάνει μια υπηρεσία να μπορεί να χρησιμοποιηθεί εντός των σύνθετων υπηρεσιών που βασίζοναι στην WS-BPEL. Η WS-BPEL επιτρέπει να οριστούν επιχειρησιακές διαδικασίες που αλληλεπιδρούν με συνεργαζόμενες υπηρεσίες μέσω WSDL περιγραφών. Αυτό θα εξηγηθεί λεπτομερώς στην παράγραφο WSDL Ορισμοί για Σύνθετες Υπηρεσίες BPEL διαδικασίες Με την WS-BPEL, μπορεί να δημιουργηθεί μια επιχειρησιακή διαδικασία με την ενσωμάτωση μιας συλλογής υπηρεσιών διαδικτύου σε μια ροή εργασίας επιχειρησιακών διαδικασιών. Μια WS-BPEL επιχειρησιακή διαδικασία ορίζει πώς να συντονιστούν οι αλληλεπιδράσεις μεταξύ ενός στιγμιότυπου (instance) της εν λόγω διαδικασίας και των συμμετεχουσών υπηρεσιών 62

63 Η παρακάτω εικόνα δείχνει ένα παράδειγμα ενός διαγράμματος ροής εργασίας που αντιπροσωπεύει μια WS-BPEL επιχειρησιακή διαδικασία: Όπως μπορείτε να δείτε, η WS-BPEL διαδικασία που απεικονίζεται στην εικόνα ενσωματώνει τις υπηρεσίες που απαιτούνται για την ολοκλήρωση των βημάτων που λαμβάνονται μετά την αποδοχή μιας πρότασης σε μια διαδικασία. Σε αυτό το 63

64 συγκεκριμένο παράδειγμα, η διαδικασία ενσωματώνει τέσσερις υπηρεσιών διαδικτύου, όπως απεικονίζεται στην τιμή που αναγράφεται στο τμήμα Ενορχήστρωσης σε προηγούμενη παράγραφο (SOA Συνθέσεις). Όπως θα δείτε στο επόμενο τμήμα, μία WS-BPEL διαδικασία συνδέεται με μια υπηρεσία διαδικτύου μέσω μιας συμμετέχουσας σύνδεσης (partner link) που ορίζεται στο έγγραφο WSDL. Εκτός από τη δυνατότητα να καλέσει (invoke) πολλαπλές υπηρεσίες, μία WS- BPEL διαδικασία μπορεί να χειρίζεται XML δεδομένα και να εκτελεί παράλληλες εκτελέσεις (flow), υπό όρους διακλαδώσεις (switch - if), και να ελέγχει βρόχους (while) ελέγχοντας πάντα την ροή της διαδικασίας. Για παράδειγμα, στην παραπάνω διαδικασία χρησιμοποιείται η δραστηριότητα switch, για τη σύσταση των δύο κλάδων. Εάν η υπό επεξεργασία πρόταση έχει υποβληθεί από ένα νέο δημιουργό, η διαδικασία θα καλέσει τη λειτουργία της υπηρεσίας Συγγραφέας (Author) που είναι αρμόδια για την αποθήκευση των πληροφοριών σχετικά με τον συγγραφέα στη βάση δεδομένων. Διαφορετικά, αυτό το βήμα παραλείπεται. Για λόγους απλούστευσης, το τμήμα αυτό απεικονίζει μόνο ένα διάγραμμα ροής της WS-BPEL διαδικασίας και όχι τον εκτελέσιμο κώδικα BPEL της εν λόγω διαδικασίας WSDL Ορισμοί για Σύνθετες Υπηρεσίες Στο 2 ο κεφάλαιο WSDL, μελετήθηκε η χρήση της WSDL προδιαγραφής, παρέχοντας έναν τρόπο για τον πελάτη υπηρεσιών να κατανοήσει μια υπηρεσίας διαδικτύου. Στην πραγματικότητα, η WSDL διαδραματίζει σημαντικό ρόλο στην ανάπτυξη υπηρεσιοστραφούς αρχιτεκτονικής. Όπως αναφέρθηκε, ακόμη και μια WS- BPEL ενορχήστρωση μπορεί να συνδέεται με WSDL ορισμούς, καθιστώντας κατ' αυτόν τον τρόπο δυνατή την αντιμετώπιση αυτής της ενορχήστρωσης ως αυτόνομη υπηρεσία που μπορεί να καλέσει άλλη/άλλες υπηρεσία/υπηρεσίες ή μπορεί να είναι ένα μέρος μιας άλλης ενορχήστρωσης ή χορογραφίας. Όντας η ίδια υπηρεσία, μία WS-BPEL διαδικασία θα πρέπει να έχει αντίστοιχο WSDL έγγραφο, που καθιστά δυνατό για τις υπηρεσίες των πελατών να καλέσουν 64

65 αυτή την διαδικασία. Για παράδειγμα, η WS-BPEL διαδικασία που απεικονίζεται στην προηγούμενη εικόνα ενδέχεται να σχετίζεται με τον εξής WSDL ορισμό: <?xml version="1.0" encoding="utf-8"?> <definitions name="proposalprocessingservice" xmlns=" xmlns:wsdl=" xmlns:soap=" xmlns:xsd=" xmlns:xsd1=" xmlns:plink= " targetnamespace= " <types> <xsd:schema targetnamespace= " <xsd:import namespace=" schemalocation=" propproc.xsd"/> </xsd:schema> </types> <message name="receiveproposalinput"> <part name="body" element="xsd1:proposaldoctype"/> </message> <message name="receiveproposaloutput"> <part name="body" element="xsd:string"/> </message> <porttype name="proposalprocessingserviceporttype"> <operation name="receiveproposal"> <input message="tns:receiveproposalinput"/> <output message="tns:receiveproposaloutput"/> </operation> </porttype> <plink:partnerlinktype name="proposalprocessingservice"> <plink:role name="proposalprocessingservicerole"> 65

66 <porttype="tns:proposalprocessingserviceporttype"/> </plink:role> </plink:partnerlinktype> </definitions> Όπως μπορεί να απρατηρηθεί, αυτό το έγγραφο WSDL δεν περιέχει στοιχεία binding ή service. Το γεγονός είναι ότι ένα έγγραφο WSDL της WS-BPEL υπηρεσίας διαδικασιών περιλαμβάνει μόνο τον αφηρημένο ορισμό της υπηρεσίας και partnerlinktype ενότητες που αντιπροσωπεύουν την αλληλεπίδραση μεταξύ των υπηρεσιών της διαδικασίας και των υπηρεσιών των πελατών της. Σε αυτό το συγκεκριμένο παράδειγμα, ο ορισμός της WSDL περιέχει μόνο ένα τμήμα partnerlinktype, υποστηρίζοντας μία λειτουργία που χρησιμοποιείται από έναν πελάτη να αρχίσει την διαδικασία. Αξίζει να σημειωθεί εδώ, ότι ένα partnerlinktype τμήμα ορίζει μέχρι δύο ρόλους, καθένας από τους οποίους με τη σειρά του συνδέεται με ένα porttype που έχει οριστεί στο WSDL έγγραφο νωρίτερα. Η WS-BPEL χρησιμοποιεί τον μηχανισμό των συμμετεχουσών συνδέσεων (partner link) για τον καθορισμό μιας σχέσης μεταξύ μίας WS-BPEL διαδικασίας και των εμπλεκόμενων εργασιών. Ένας WS-BPEL ορισμός διαδικασίας περιέχει partnerlink στοιχεία για να καθοριστούν οι αλληλεπιδράσεις μεταξύ της WS-BPEL διαδικασίας και των πελατών της ή των συμμετεχουσών διεργασιών της. Κάθε ορισμός διαδικασίας partnerlink σε ένα WS-BPEL έγγραφο συνδέεται με ένα partnerlinktype που έχει οριστεί στο αντίστοιχο έγγραφο WSDL. Σχηματικά, αυτό φαίνεται όπως και στην επόμενη εικόνα (εμφανίζεται στην οπίσθια όψη). Δεδομένου ότι έχει δημιουργηθεί ο WSDL ορισμός (το έγγραφο WSDL) για μια υπηρεσία-διαδικασία, χρειάζεται να τροποποιήσουμε τα WSDL έγγραφα των υπηρεσιών που πρόκειται να κληθούν κατά τη διάρκεια της διαδικασίας εκτέλεσης, όπως είναι τα έγγραφα των συμμετεχουσών υπηρεσιών. Για να ενεργοποιηθεί μια υπηρεσία που να είναι μέρος μίας WS-BPEL ενορχήστρωσης, ίσως να χρειάζεται να προστεθεί ένα partnerlinktype στοιχείο για το αντίστοιχο έγγραφο WSDL. Για παράδειγμα, για να μπορέσει η υπηρεσία ειδοποίησης (Notification) να συμμετάσχει 66

67 στην ενορχήστρωση που απεικονιζόταν στο προηγούμενο σχήμα, θα πρέπει να δημιουργήσετε το ακόλουθο έγγραφο WSDL: <?xml version="1.0" encoding="utf-8"?> <definitions name="notificationservice" xmlns=" xmlns:wsdl=" xmlns:soap=" xmlns:xsd=" xmlns:plink= " targetnamespace=" <message name="sendmessageinput"> <part name="body" element="xsd:string"/> </message> <message name="sendmessageoutput"> <part name="body" element="xsd:string"/> </message> <porttype name="notificationserviceporttype"> <operation name="sendmessage"> <input message="tns:sendmessageinput"/> <output message="tns:sendmessageoutput"/> </operation> </porttype> <binding name="notificationservicebinding" type="tns:notificationserviceporttype"> <soap:binding style="document" transport=" <operation name="sendmessage"> <soap:operation soapaction= " <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> 67

68 </output> </operation> </binding> <service name="notificationservice"> <port name="notificationserviceport" binding="tns:notificationservicebinding"> <soap:address location=" </port> </service> <plink:partnerlinktype name="notificationservice"> <plink:role name="notificationservicerole"> <porttype="tns:notificationserviceporttype"/> </plink:role> </plink:partnerlinktype> </definitions> Στον παραπάνω κώδικα έχει σημειωθεί με έντονα γράμματα το partnerlinktype μπλοκ. Με τη συμπερίληψη αυτής της ενότητας στο τέλος του εγγράφου WSDL που περιγράφει την υπηρεσία, θα μπορέσει η υπηρεσία να είναι συμμετέχων σύνδεσμος (partner link), καθιστώντας το δυνατό να είναι μέρος μίας ενορχήστρωσης. Όπως αναφέρθηκε, η WS-BPEL χρησιμοποιεί τον μηχανισμό των συμμετεχουσών συνδέσεων για να μοντελοποιήσει με τον τύπο της αλληλεπίδρασης των υπηρεσιών στο πλαίσιο της επιχειρησιακής διαδικασίας. Εδώ είναι ένα κομμάτι του ορισμού της WS-BPEL επιχειρησιακής διαδικασίας που απεικονίζεται στην προηγούμενη εικόνα και εκπροσωπεί την proposalprocessingservice υπηρεσία-διαδικασία, που δείχνει τη χρήση των συμμετεχουσών συνδέσεων: <process name="businesstravelprocess" targetnamespace=" proposalprocessing/" xmlns=" xmlns:prc=" proposalprocessing/" xmlns:ntf=" 68

69 <partnerlinks> <partnerlink name="client" partnerlinktype="prc:proposalprocessingservice" myrole="proposalprocessingservicerole"/> <partnerlink name="sendingnotification" partnerlinktype="ntf:notificationservice" partnerrole="notificationservicerole"/>... </partnerlinks>... </process> Για να εξοικονομηθεί χώρος, το παραπάνω απόσπασμα δείχνει μόνο δύο τμήματα partnerlink στον ορισμό της διαδικασίας. Το πρώτο τμήμα partnerlink προσδιορίζει την αλληλεπίδραση μεταξύ της WS-BPEL διαδικασία και των πελατών της, και το άλλο partnerlink προσδιορίζει την αλληλεπίδραση μεταξύ της WS-BPEL διαδικασία και της υπηρεσία ειδοποίησης (Notification) που λειτουργεί εδώ. Το ακόλουθο σχήμα παρατίθεται για την καλύτερη κατανόηση του τρόπου που ο μηχανισμός συμμετεχουσών συνδέσεων χρησιμοποιούνται σε WS-BPEL διαδικασίες. 69

70 Το παράδειγμα που απεικονίζεται στο σχήμα αναπαριστά τη σχέση μεταξύ ενός partnerlinktype που ορίζεται στο έγγραφο WSDL που περιγράφει μία WS-BPEL υπηρεσία-διαδικασία και ένα partnerlink που προβλέπεται στον ορισμό της διαδικασίας. Κατά τον καθορισμό των partnerlinktype, χρησιμοποιείται το χαρακτηριστικό myrole έτσι, ώστε να διευκρινιστεί ο ρόλος της WS-BPEL διαδικασίας. Σε αντίθεση, για να διευκρινιστεί ο ρόλος των συμμετεχουσών διαδικασιών, θα χρησιμοποιηθεί το partnerrole χαρακτηριστικό, όπως φαίνεται στο έγγραφο ορισμού διαδικασίας που συζητήθηκε παραπάνω. Εξετάζοντας τα partnerlink τμήματα στο έγγραφο ορισμού διαδικασίας που συζητήθηκε εδώ, μπορεί να παρατηρηθεί ότι δεν παρέχουν ουσιαστικά κάποια πληροφορία σχετικά με τη θέση των εγγράφων WSDL που περιέχουν τους 70

71 αντίστοιχους τύπους συμμετεχουσών συνδέσεων. Αυτές οι πληροφορίες αποθηκεύονται στο αρχείο περιγραφής εγκατάστασης της εκάστοτε διαδικασίας (deployment descriptor file). Η μορφή του εγγράφου αυτού ποικίλλει ανάλογα με το WS-BPEL εργαλείο που χρησιμοποιείται. Για παράδειγμα, αν σχεδιαστεί μία SOA λύση με την Oracle BPEL Process Manager, το αρχείο περιγραφής εγκατάστασης της διαδικασίας ονομάζεται bpel.xml και μπορεί να μοιάζει ως εξής: <?xml version="1.0" encoding="utf-8"?> <BPELSuitcase> <BPELProcess src="proposalprocess.bpel" id="proposalprocess"> <partnerlinkbindings> <partnerlinkbinding name="client"> <property name="wsdllocation">proposalprocess.wsdl</property> </partnerlinkbinding> <partnerlinkbinding name="sendingnotification"> <property name="wsdllocation"> </partnerlinkbinding>... </partnerlinkbindings> </BPELProcess> </BPELSuitcase> Στο πρόγραμμα Designer ActiveBPEL, το αρχείο περιγραφής εγκατάστασης της διαδικασίας έχει την επέκταση PDD. Αυτό το έγγραφο περιέχει περιγραφή των πληροφοριών που απαιτούνται για το διακομιστή της ActiveBPEL έτσι, ώστε να εκτελέσει τις αντίστοιχες WS-BPEL διαδικασίες. Μια PDD περιγραφή καθορίζει τη θέση των εγγράφων WSDL που περιγράφουν τα μέρη που εμπλέκονται στην ενότητα των αναφορών (references), όπως φαίνεται στο ακόλουθο απόσπασμα: <?xml version="1.0" encoding="utf-8"?> <process...>... <references> 71

72 <wsdl location="project:/proposalprocess/wsdl/ proposalprocess.wsdl" namespace=" <wsdl location="project:/proposalprocess/wsdl/notification.wsdl" namespace=" </references> </process> Τρόπος λειτουργίας Προηγουμένως, σημειώθηκε ότι η WS-BPEL χρησιμοποιεί διάφορες προδιαγραφές XML, όπου η WSDL είναι η πιο σημαντική. Μιλώντας πρακτικά, ούσα η ίδια η WS-BPEL μια υπηρεσία, μία WS-BPEL διαδικασία θα πρέπει να έχει ένα αντίστοιχο έγγραφο WSDL που θα την περιγράφει στους πελάτες της. Έτσι, τόσο η WS-BPEL διαδικασία ως υπηρεσία και οι συμμετέχουσες υπηρεσίες που χρησιμοποιούνται στο πλαίσιο αυτής της διαδικασίας είναι εκτεθειμένοι στο διαδίκτυο μέσω του WSDL ορισμού τους. Το ακόλουθο σχήμα απεικονίζει το παραπάνω μοντέλο αλληλεπίδρασης διαγραμματικά: Αν και το διάγραμμα στην παραπάνω εικόνα δεν δείχνει τους μηχανισμούς που κρύβονται πίσω από την WS-BPEL, μπορεί να χρησιμοποιηθεί ως βοήθημα για να 72

73 κατανοηθεί πώς μια υπηρεσία-διαδικασία WS-BPEL εντάσσεται στην μεγαλύτερη εικόνα της σύνθετης λύσης που θα βασίζεται στη χρήση της ενορχήστρωσης βάσει της ίδιας της WS-BPEL. Συγκεκριμένα, δείχνει ότι η WS-BPEL υπηρεσία-διαδικασία, όπως και κάθε άλλη υπηρεσία, εκθέτει τη λειτουργία της μέσω μιας διεπαφής WSDL και, επομένως, μπορούν να κληθεί από ένα πελάτη που και αυτός μπορεί να έχει βάσει του προτύπου WSDL. Στην πραγματικότητα, υπάρχουν διάφοροι τρόποι με τους οποίους Μία WS-BPEL υπηρεσία-διαδικασία μπορεί να κληθεί. Για παράδειγμα, μία WS-BPEL διαδικασία μπορεί να κληθεί μέσα από μια άλλη WS-BPEL διαδικασία, με αποτέλεσμα να αποτελεί, αναδρομικά, μέρος μίας άλλης ενορχήστρωσης. Όταν δημιουργείται μια WS-BPEL υπηρεσία, δημιουργείται ένας WS-BPEL ορισμός(έγγραφο) που στη συνέχεια θα εκτελεστεί σε μία WS-BPEL μηχανή, ενώ μία συμμετέχουσα υπηρεσία που έχει γραφτεί στην επέκταση PHP & SOAP θα πρέπει να εκτελεστεί σε μια μηχανή PHP. Η ακόλουθη εικόνα δίνει μια γραφική απεικόνιση της κατάστασης αυτής: Μία WS-BPEL μηχανή διαβάζει έναν εκτελέσιμο ορισμό (αρχείο) μίας WS- BPEL διαδικασίας, καθώς και άλλα έγγραφα, όπως WSDL και XSD και περιμένει για ένα εισερχόμενο μήνυμα να ζητήσει από τον καταναλωτή της WS-BPEL διαδικασίας την εκκίνησή της. Όταν ένα τέτοιο μήνυμα φτάνει, δημιουργεί ένα στιγμιότυπο (instance) της διαδικασίας εκτέλεσης και αλληλεπιδρά με τις συμμετέχουσες υπηρεσίες, όπως περιγράφεται στον ορισμό της διαδικασίας 73

74 3.2.9 Η δομή ενός αρχείου WS-BPEL Ένα WS-BPEL αρχείο επιχειρησιακής διαδικασίας διευκρινίζει πώς να συντονίζονται οι αλληλεπιδράσεις μεταξύ ενός τρέχοντος παραδείγματος αυτής της διαδικασίας και των συμμετεχουσών υπηρεσιών. Η παράγραφος αυτή ασχολείται με τη δομή ενός WS-BPEL εγγράφου, παρέχοντας μια σύντομη περιγραφή των πιο σημαντικών δομών της WS-BPEL γλώσσας. Γραφικά, η γενική διάρθρωση ενός αρχείου μίας WS-BPEL διαδικασίας μπορεί να μοιάζει κάπως με το ακόλουθο σχήμα: <process...> <partnerlinks>... </partnerlinks> <variables>... </variables> <faulthandlers>... </faulthanders> <sequence> <receive.../> <invoke.../> <reply...>... </sequence> </process> Όπως φαίνεται στην εικόνα, ένας WS-BPEL ορισμός αντιπροσωπεύει ένα έγγραφο XML που περιέχει WS-BPEL γλωσσικά τμήματα που εκτελούν τη λογική διαδικασία. Ένας WS-BPEL ορισμός, καθώς και ορισμένα άλλα έγγραφα που σχετίζονται με τη διαδικασία ορισμού χρησιμοποιούνται στη συνέχεια σε μία WS- BPEL μηχανή κατά την οποία ο ορισμός της διαδικασίας θα πρέπει να εκτελεστεί. Εδώ παρατίθενται οι πιο σημαντικοί WS-BPEL τμήματα που χρησιμοποιούνται κατά τον καθορισμό WS-BPEL ορισμοί: 74

75 WS-BPEL τμήμα process partnerlinks variables faulthandlers sequence flow receive invoke Περιγραφή Αυτό είναι το στοιχείο ρίζα ενός ορισμού μίας WS- BPEL διαδικασίας και χρησιμοποιεί χαρακτηριστικά για να δηλώσει αρκετά namespaces που σχετίζονται με την διαδικασίας Περιέχει ένα σύνολο partnerlink στοιχείων. Κάθε partnerlink στοιχείο καθορίζει τη σχέση μεταξύ της υπηρεσίας-διαδικασία και των συμμετεχουσών υπηρεσιών. Περιέχει ένα σύνολο στοιχείων μεταβλητών. Κάθε τέτοιο στοιχείο ορίζει μια μεταβλητή που χρησιμοποιείται από τη διαδικασία. Περιέχει χειριστές σφαλματων που περιγράφουν τις ενέργειες που πρέπει να ληφθούν ως απάντηση στις δυσλειτουργίες που ενδέχεται να προκύψουν κατά την εκτέλεση της διαδικασίας. Περιέχει μία ή περισσότερες δραστηριότητες που εκτελούνται η μία μετά την άλλη, όπως προκύπτει κατά την κατασκευή. Σε ένα περίπλοκο σενάριο, διάφορες ακολουθίες ίσως ενταχθούν στα τμήματα flow, τα οποία επιτρέπουν συγχρονισμό και συγχρονισμός. Ενεργοποιεί τον συγχρονισμό μεταξύ των δραστηριοτήτων που που βρίσκονται μέσα σε αυτό το τμήμα. Για παράδειγμα, μπορείτε να ξεκινήσετε να καλείτε διάφορες δραστηριότητες ταυτόχρονα, επιτρέποντας εξαρτήσεις συγχρονισμού μεταξύ τους. Λαμβάνει ένα μήνυμα από μια συμμετέχουσα υπηρεσία-πελάτη. Συνήθως, η δραστηριότητα αυτή χρησιμοποιείται με την χαρακτηριστικό createinstance να είναι ναι(yes), προκειμένου να αρχίσει η επιχειρησιακή διαδικασία. Καλεί την συμμετέχουσα υπηρεσία που ορίζεται από 75

76 reply assign If wait throw το χαρακτηριστικό partnerlink της δραστηριότητας. Στέλνει ένα μήνυμα απάντησης στο αίτημα που έχει λάβει η δραστηριότητα μας, υποθέτοντας ότι η λειτουργία invoke είναι της μορφής request-response. Περιέχει τα ζεύγη από (from) και προς (to) τυλιγμένο σε ένα στοιχείο αντιγραφής (copy), τα οποία χρησιμοποιούνται για την ενημέρωση των τιμών των μεταβλητών που έχουν οριστεί στο τμήμα μεταβλητές. Επιτρέπει να προστεθεί λογική διακλάδωσης στην διαδικασία. Με τη χρήση ένθετων στοιχείων elseif και ένα προαιρετικό else στοιχείο, μπορείτε να ορίσετε έναν ή περισσότερους όρους διακλάδωσης εντός της if δραστηριότητας. Να σημειωθεί ότι τα if/elseif/else είναι νέα στοιχεία στην WS-BPEL 2.0. Διαφορετικά, στην BPEL4WS 1.1, χρησιμοποιούνται τα switch/case/instead. Ορίζει ρητά στην υπηρεσία πόσο να παραμένει ή μέχρι πότε να παραμένει αδρανής. Ρητά ρίχνει ένα ονοματισμένο λάθος στο εσωτερικό της επιχειρησιακής διαδικασίας. Μπορούν να χρησιμοποιηθούν τα προαιρετικά faultvariable χαρακτηριστικά για να καθοριστεί μία μεταβλητή με τα στοιχεία σφάλματος. Ένα τέτοιο σφάλμα θα πρέπει να το διαχειρίζεται ένας εξυπηρέτησης σφαλμάτων που ορίζεται εντός του τμήματος faulthandlers. Το παράδειγμα στην παράγραφο που ακολουθεί δείχνει τον τρόπο χρήσης των ανωτέρω WS-BPEL τμημάτων σε έναν ορισμό μιας WS-BPEL διαδικασίας Παράδειγμα WS-BPEL ορισμού Ας υποθέσουμε ότι χρειάζεται να κατασκευάσουμε έναν ορισμό μίας WS-BPEL διαδικασίας η οποία θα επιστρέψει τις απαιτούμενες πληροφορίες σχετικά με μια παραγγελία. Για λόγους απλούστευσης, η WS-BPEL διαδικασία που αναφέρεται σε 76

77 αυτό το τμήμα θα αλληλεπιδρά με μια μόνο συμμετέχουσα υπηρεσία που θα έχει υλοποιηθεί βάσει της γλώσσας PHP. Ειδικότερα, η διαδικασία θα αξιοποιήσει την poorderdocservice συμμετέχουσα υπηρεσία. Η poorderdocservice υπηρεσία επιστρέφει ολόκληρο το έγγραφο po του οποίου το pono είναι ίσο με αυτό που έχει καθοριστεί στο μήνυμα αιτήματος που έχει παραληφθεί από τον πελάτη. Έτσι, σε αυτό το παράδειγμα γίνεται η υπόθεση ότι δεν υπάρχει λογική διακλάδωσης στη WS-BPEL διαδικασία, δεδομένου ότι έχει μια πολύ απλή δομή η μόνη πληροφορία που επιστρέφεται σχετικά με την συγκεκριμένη δομή θα είναι το σύνολο του εγγράφου που αντιπροσωπεύει αυτή τη σειρά. Σχηματικά, το παραπάνω σχέδιο μπορεί να μοιάζει ως εξής: Τα βήματα της εικόνας, από την οπτική γωνία του παραδείγματος της WS-BPEL διαδικασίας, είναι : Βήμα 1: Η WS-BPEL διαδικασία λαμβάνει ένα μήνυμα αιτήματος από την συμμετέχουσα υπηρεσία πελάτη. Αυτό γίνεται με τη βοήθεια της λαμβάνουσας δομής της γλώσσας WS-BPEL. Στην πραγματικότητα, αυτό είναι το πρώτο βήμα στον κύκλο ζωής ενός παραδείγματος μιας WS-BPEL διαδικασίας, δεδομένου ότι ένα νέο στιγμιότυπο (instance) της επιχειρησιακής διαδικασίας δημιουργήθηκε όταν ελήφθη ένα μήνυμα από αίτημα του πελάτη. Βήμα 2, 3: Η επιχειρησιακή διαδικασία καλεί την συμμετέχουσα υπηρεσία που έχει δημιουργηθεί σε γλώσσα PHP. Το στιγμιότυπο αυτό βασίζεται στην παραδοχή μιας σύγχρονης λειτουργίας αίτησης-απόκρισης (request-response) μεταξύ της 77

78 διαδικασίας και του πελάτη. Αυτός είναι ο λόγος για τον οποίο τα δύο βήματα 2 και 3 μπορεί να εφαρμοστούν με τη χρήση μιας ενιαίας κλήσης (invoke) στην WS-BPEL διαδικασία. Βήμα 4: Η επιχειρησιακή διαδικασία απαντά στο αίτημα του πελάτη που έχει γίνει στο Βήμα 1. Για να γίνει αυτό, η δραστηριότητα απάντησης (reply) μπορεί να χρησιμοποιηθεί. Όπως φαίνεται και από το παραπάνω στιγμιότυπο, η WS-BPEL διαδικασία που απεικονίζεται στο σχήμα θα πρέπει να περιλαμβάνει τουλάχιστον τις ακόλουθες τρεις δραστηριότητες: Λήψη Κλήση Απάντηση Πριν προχωρήσουμε στον ορισμό της WS-BPEL διαδικασίας όμως, ας εξετάσουμε το έγγραφο WSDL που θα μπορούσε να χρησιμοποιηθεί για να εκθέσει την υπηρεσία-διαδικασία αυτή στους πελάτες της. 78 <?xml version="1.0" encoding="utf-8"?> <definitions name="poinfo" targetnamespace=" poinfoservice.wsdl" xmlns:tns=" poinfoservice.wsdl" xmlns:plnk=" xmlns:xsd=" xmlns:ns2=" xmlns=" <import namespace=" location=" po_orderdoc.wsdl"/> <types> <schema attributeformdefault="qualified"

79 elementformdefault="qualified" targetnamespace= " xmlns=" <element name="poinforequest"> <complextype> <sequence> <element name="input" type="xsd:string"/> </sequence> </complextype> </element> </schema> </types> <message name="poinforesponsemessage"> <part name="payload" type="xsd:string"/> </message> <message name="poinforequestmessage"> <part name="payload" element="tns:poinforequest"/> </message> <porttype name="poinfopt"> <operation name="getinfo"> <input message="tns:poinforequestmessage"/> <output message="tns:poinforesponsemessage"/> </operation> </porttype> <plnk:partnerlinktype name="poinfolt"> <plnk:role name="poinfoproviderrole"> <plnk:porttype name="tns:poinfopt"/> </plnk:role> </plnk:partnerlinktype> <plnk:partnerlinktype name="podoclt"> <plnk:role name="podocproviderrole"> <plnk:porttype name="ns2:poorderdocserviceporttype"/> </plnk:role> </plnk:partnerlinktype> </definitions> 79

80 Το πιο ενδιαφέρον πράγμα που πρέπει να σημειωθεί σχετικά με τον παραπάνω ορισμό WSDL είναι ότι δεν περιέχει κανένα δεσμευτικό τμήμα (binding) ούτε τμήματα υπηρεσιών (service). Η WS-BPEL μηχανή θα παράξει αυτούς τους ορισμούς εμμέσως, παρέχοντας έτσι την υπηρεσία-πελάτη με τις απαιτούμενες δεσμευτικές (binding) πληροφορίες. Ένα άλλο σημαντικό πράγμα που πρέπει να σημειωθεί εδώ είναι ότι η ανωτέρω WSDL εισάγωγει ένα άλλο έγγραφο WSDL, δηλαδή το po_orderdoc.wsdl, το οποίο περιγράφει την poorderdocservice συμμετέχουσα υπηρεσία. Το po_orderdoc.wsdl έγγραφο καθορίζει το poorderdocserviceporttype τύπο θύρας (porttype) που χρησιμοποιείται στο παραπάνω έγγραφο κατά τον καθορισμό του συμμετέχοντος τύπου θύρας podoclt. Αυτή η συμμετέχουσα σύνδεση τύπου μαζί με την onepoinfolt, η οποία χρησιμοποιείται για να αναπαριστά την αλληλεπίδραση μεταξύ της επιχειρησιακής διαδικασίας και την εξυπηρέτηση του πελάτη, στη συνέχεια χρησιμοποιούνται για τον ορισμό συμμετεχουσών συνδέσεων στον ορισμό της WS- BPEL διαδικασίας που αναλύεται κατωτέρω. Τώρα που έχει εξεταστεί μέσα από το έγγραφο WSDL η περιγραφή της WS- BPEL διαδικασίας που απεικονίζεται στην προηγούμενη εικόνα, ήρθε η στιγμή να εξεταστεί ο ορισμός της ίδιας της WS-BPEL διαδικασίας. Για τους σκοπούς αυτής της συζήτησης, ο ορισμός-έγγραφο της WS-BPEL διαδικασία διαιρείται σε κομμάτια, καθένα από τα οποία εξηγείται λεπτομερώς. Όπως και κάθε άλλος ορισμός WS-BPEL διαδικασίας, αρχίζει με το στοιχείο process που αποτελεί την ρίζα του δέντρου XML, ορίζοντας ως χαρακτηριστικά τα namespaces που σχετίζονται με τη διαδικασία: <?xml version="1.0" encoding="utf-8"?> <process xmlns=" executable" xmlns:ns1= " xmlns:ns2=" xmlns:xsd=" 80

81 name="poinfo.bpel" suppressjoinfailure="yes" targetnamespace=" Στη συνέχεια, εισάγονται οι ορισμοί WSDL που χρησιμοποιούνται στον ορισμό της WS-BPEL. Ειδικότερα, εισάγεται το έγγραφο WSDL που περιγράφει τη διαδικασία για τους πελάτες και η WSDL που περιγράφει τη poorderdocservice συμμετέχουσα υπηρεσία: <import importtype=" location="wsdl/poinfo.wsdl" namespace= " l" <import importtype=" location= " namespace=" oc"/> Εξετάζοντας το παραπάνω απόσπασμα, ίσως να αναρωτιέστε γιατί το χαρακτηριστικό location που έχει σχέση με την WSDL περιγραφή της WS-BPEL διαδικασίας δεν περιέχει πλήρη διαδρομή προς το έγγραφο. Το γεγονός είναι ότι αυτό το παράδειγμα υποθέτει ότι η διαδικασία θα αναπτυχθεί σε μία μηχανή ActiveBPEL, η οποία, όπως και η μηχανή που αναπτύσσεται στην παρούσα διπλωματική, υποθέτει ότι το αρχείο wsdl μπορεί να βρίσκεται μέσα σε ένα φάκελο δράσης όπου θα βρίσκονται όλα τα αρχεία bpel και wsdl. Το επόμενο βήμα είναι να καθοριστούν οι συμμετέχουσες σχέσεις που εκπροσωπούν τις σχέσεις μεταξύ της WS-BPEL διαδικασία και τους συμμετεχουσών υπηρεσιών της: <partnerlinks> <partnerlink myrole="poinfoproviderrole" name="poinfoprovider" partnerlinktype="ns1:poinfolt"/> <partnerlink name="podocrequester" partnerlinktype="ns1:podoclt" partnerrole="podocproviderrole"/> </partnerlinks> 81

82 Στην ενότητα των συμμετεχουσών συνδέσεων (Partnerlinks), ορίστηκαν δύο συμμετέχουσες συνδέσεις. Η πρώτη προσδιορίζει τη σχέση μεταξύ της διαδικασίας και του πελάτη της. Η δεύτερη προσδιορίζει τη σχέση μεταξύ της διαδικασίας και των συμμετεχουσών υπηρεσιών. Αν θυμάστε από το κεφάλαιο 1, η απουσία μνήμης προηγούμενης κατάστασης της υπηρεσίας (statelessness) είναι μία από τις βασικές αρχές του υπηρεσιοστραφούς προγραμματισμού, γεγονός που σημαίνει ότι οι υπηρεσίες δεν τηρούν την κατάσταση τους σε μια συγκεκριμένη δραστηριότητα. Όπως αναφέρθηκε, προγραμματίζοντας τέτοιες υπηρεσίες ενθαρρύνει την χαλαρή σύζευξη, την επαναχρησιμοποίηση και την σύνθεση. Ωστόσο, όταν συνδυάζονται υπηρεσίες σε μια εφαρμογή SOA, πιθανότατα να ενδιαφέρει ο σχεδιασμός και υλοποίηση μιας λύσης που να υποστηρίζει μνήμη προηγούμενης κατάστασης στις αλληλεπιδράσεις μεταξύ των συμμετεχουσών υπηρεσιών. Για την επίτευξη αυτού του στόχου σε WS-BPEL, χρησιμοποιούνται μεταβλητές. Στην επόμενη ενότητα των μεταβλητών (variables), μπορούν να οριστούν μεταβλητές που στη συνέχεια θα χρησιμοποιηθούν για την αποθήκευση πληροφοριών για την κατάσταση μεταξύ των αλληλεπιδράσεων των διαδικασιών: <variables> <variable messagetype= "ns1:poinforequestmessage" name="poinforequestmessage"/> <variable messagetype= "ns1:poinforesponsemessage" name="poinforesponsemessage"/> <variable messagetype= "ns2:getorderdocinput" name="podocrequestmessage"/> <variable messagetype= "ns2:getorderdocoutput" name="podocresponsemessage"/> </variables> Τώρα ξεκινά ο καθορισμός της δραστηριότητας sequence, η οποία αναθέτει στην WS-BPEL μηχανή να ξεκινήσει την διαδοχική επεξεργασία των δραστηριοτήτων που βρίσκονται ένθετες μέσα σε αυτήν. <sequence> Η πρώτη δραστηριότητα που απασχολεί την μηχανή κατά την ακολουθία sequence είναι η λήψη (receive), η οποία καθορίζει την συμμετέχουσα σύνδεση 82

83 partnerlink που περιέχει το myrole, το οποίο χρησιμοποιείται για να ληφθεί ένα μήνυμα αίτησης από μια υπηρεσία-πελάτη. Το αποτέλεσμα του μηνύματος αίτησης (στο παράδειγμα μας θα είναι το τμήμα payload) θα περάσει στην poinforequestmessage μεταβλητή που έχει οριστεί στο χαρακτηριστικό μεταβλητής (variable) της δραστηριότητας receive: <receive createinstance="yes" operation="getinfo" partnerlink="poinfoprovider" porttype="ns1:poinfopt" variable="poinforequestmessage"/> Όπως φαίνεται από το παράδειγμα, το χαρακτηριστικό createinstance της δραστηριότητας receive έχει οριστεί σε yes, γεγονός που σημαίνει ότι άσκηση αυτής της δραστηριότητας θα δημιουργήσει το στιγμιότυπο της επιχειρησιακής διαδικασίας. Στην πραγματικότητα, χρησιμοποιώντας το χαρακτηριστικό createinstance με τη receive ή pick δραστηριότητα είναι ο μόνος τρόπος με τον οποίο μπορείτε να δημιουργήσετε ένα στιγμιότυπο μίας WS-BPEL διαδικασίας. Στη συνέχεια, αντιγράφετε την αξία του στοιχείου της εισόδου (input), το οποίο είναι ένθετο στο XML κομμάτι που πραγματοποιήθηκε στην poinforequestmessage μεταβλητή, στην έξοδο (output) η οποία είναι το τμήμα pono της podocrequestmessage μεταβλητής, όπως φαίνεται παρακάτω: <assign> <copy> <from part="payload" variable="poinforequestmessage"> <query>ns1:input</query> </from> <to part="pono" variable="podocrequestmessage"/> </copy> </assign> Τώρα μπορεί να κληθεί η συμμετέχουσα υπηρεσία poorderdocservice, χρησιμοποιώντας την δραστηριότητα κλήσης (invoke), όπως φαίνεται παρακάτω: <invoke inputvariable="podocrequestmessage" outputvariable="podocresponsemessage" operation="getorderdoc" 83

84 partnerlink="podocrequester" porttype="ns2:poorderdocserviceporttype "> </invoke> Εδώ καθορίζεται η podocrequestmessage μεταβλητή, που έχει διαμορφωθεί από το προηγούμενο βήμα, ως μεταβλητή εισόδου και καθορίζεται η podocresponsemessage μεταβλητή, ως η μεταβλητή εξόδου στην ανωτέρω δραστηριότητα κλήσης (invoke). Αξίζει να σημειωθεί ότι το χαρακτηριστικό λειτουργίας (operation) της δραστηριότητας έχει οριστεί σε getorderdoc, η οποία, είναι το όνομα της λειτουργίας (operation) που έχει οριστεί στο po_orderdoc.wsdl WSDL έγγραφο που περιγράφει την poorderdocservice υπηρεσία. Είναι σημαντικό να γίνει κατανοητό ότι μια συμμετέχουσα υπηρεσία που έχει κληθεί κατά τη διάρκεια της εκτέλεσης της διαδικασίας, ενδεχομένως να είναι και η ίδια μία διαδικασία-υπηρεσία WS-BPEL. Σε μια τέτοια περίπτωση, η μητρική WS- BPEL διαδικασία χρησιμοποιείται για να περιγράψει διασυνοριακές αλληλεπιδράσεις επιχειρησιακής διαδικασίας που εκτελούνται μέσω WSDL διασυνδέσεων. Μόλις ολοκληρωθεί αυτή η δραστηριότητα κλήσης, η podocresponsemessage μεταβλητή εξόδου θα πρέπει να περιέχει το μήνυμα-αποτέλεσμα που επιστρέφεται από την συμμετέχουσα υπηρεσία poorderdocservice. Προτού οριστεί η δραστηριότητα απάντησης (reply), η οποία θα ολοκληρώσει την λειτουργία που άρχισε από την δραστηριότητα λήψης (receive) που ορίζεται κατά την έναρξη της ακολουθίας, θα πρέπει να αντιγράψετε την αξία του μέρους doc της μεταβλητής podocresponsemessage στο μέρος του payload της poinforesponsemessage μεταβλητής. Ένας τρόπος να γίνει αυτό είναι ως εξής: <assign> <copy> <from>$podocresponsemessage.doc</from> <to>$poinforesponsemessage.payload</to> </copy> </assign> Τώρα μπορεί να οριστεί η δραστηριότητα απάντησης (reply) που θα σχετίζεται με την δραστηριότητα λήψης (receive) που είχε οριστεί κατά την έναρξη της ακολουθίας: 84

85 <reply operation="getinfo" partnerlink="poinfoprovider" porttype="ns1:poinfopt" variable="poinforesponsemessage"/> </sequence> </process> Η δραστηριότητα «απάντησης» είναι η τελευταία σε αυτό το WS-BPEL αρχείο. Μετά από αυτή τη δραστηριότητα, μπορείτε ρητά να τερματίσετε την ακολουθία και στη συνέχεια την διαδικασία. Όπως αναφέρθηκε, η ανωτέρω διαδικασία, αφού έχει αναπτυχθεί σε μία WS-BPEL μηχανή, εκτελείται όταν ένας πελάτης στέλνει ένα μήνυμα-αίτημα. Το μήνυμα αίτησης πρέπει να περιέχει το "pono" του οποίου η αξία έχει περάσει στη συνέχεια στην κλήση της συμμετέχουσας υπηρεσίας poorderdocservice μέσα από την διαδικασία. Η poorderdocservice υπηρεσία, με τη σειρά της, επιστρέφει το σύνολικό "po" έγγραφο με την καθορισμένη μεταβλητή "pono". Η διαδικασία επιστρέφει στη συνέχεια το έγγραφο στον πελάτη που έφτιαξε το στιγμιότυπο της διαδικασία Διαφορές με ροές εργασίας σε πλέγματα 11 Οι Ροές εργασίας σε πλέγματα διαφέρουν από τις "κανονικές" ροές εργασίας, όπως οι ροές των εργασιών των επιχειρήσεων ή οι ροές εργασίας των τμημάτων ΙΤ των επιχειρήσεων, κυρίως στα εξής σημεία: Μνήμη προηγούμενης κατάστασης της υπηρεσίας: Οι δραστηριότητες των ροών εργασίας σε πλέγμα συνδέονται συχνά με υπηρεσίες που θυμούνται την προηγούμενη κατάσταση (ροή εργασίας σε υπηρεσίες πλέγματος), ενώ οι άλλες ροές εργασίας σχετίζονται κυρίως με την κλήση των υπηρεσιών που δεν θυμούνται την προηγούμενη κατάσταση(ροές εργασίας σε υπηρεσίες διαδικτύου)

86 Αξιοπιστία: Σε ένα πλέγμα οι υπολογιστικών πόροι μπορεί να αποτύχουν κατά τη διάρκεια του χρόνου εκτέλεσης της ροής εργασίας. Αυτό πρέπει να λαμβάνεται υπόψη από προηγμένες τεχνικές διαχείρισης βλάβης ροής εργασιών (π.χ. σημεία ελέγχου της ροής εργασίας και ανάκτηση, παρακολούθηση κτλ.) Απόδοση: Ένας από τους στόχους του υπολογισμού σε πλέγμα είναι η παροχή υψηλής απόδοσης υπολογιστικής ισχύος. Ως εκ τούτου σε ροές εργασίας σε πλέγματα πρέπει κανείς να ασχοληθεί με την μεσιτεία/διαχείριση πόρων, με την χρονοδρομολόγηση (εξισορρόπηση φορτίου), και με κατανεμημένες εφαρμογές (parallel computing) Μηχανές εκτέλεσης ροών εργασίας BPEL Λογικό είναι, άμα την προτυποποίηση της BPEL να εμφανίζονται μεγάλες εταιρείες που να προσπαθούν να κερδίσουν μερίδιο της αγοράς των μηχανών εκτέλεσης BPEL. Μία συλλογή μηχανών είναι η εξής: IBM BPEL4J ( ΙBM WBI Server Foundation ( Oracle BPEL Process Manager ( Collaxa BPEL Orchestation Server ( OpenStorm ChoreoServer ( FiveSight PXE ( Active Endpoints ActiveWebflow Server ( ActiveBPEL Open Source BPEL Engine ( wikipedia) bexee BPEL Execution Engine ( ) Twister 86

87 Στα θετικά των μηχανών αυτών είναι ότι ανανεώνονται συχνά και ότι εφαρμόζουν όλα τις πτυχές του προτύπου της BPEL κάθε φορά που ανανεώνεται. Ωστόσο, απαιτούν μεγάλους υπολογιστικούς πόρους και αρκετή μνήμη προκειμένου να μπορούν να τρέξουν. Κάτι τέτοιο καθιστά απαγορευτικό το γεγονός να μπορούν να ενσωματωθούν σε συστήματα πολλαπλών χρήσεων ή και εξειδικευμένης χρήσης. Απαιτούν εξυπηρετητές που θα σηκώνουν μόνο αυτή την υπηρεσία. Προς τον στόχο της σύγχρονης επικοινωνίας υπηρεσιών, η διπλωματική αυτή δείχνει ότι μπορεί να υπάρξει πιο γρήγορες λύσεις και εφαρμογές της BPEL. Αυτό συμβαίνει διότι στην διπλωματική χρησιμοποιούνται εργαλεία τα οποία είναι πολύ πιο καινούργια από τα πεπαλαιωμένα συστήματα που χρησιμοποιούν οι εταιρείες. Ως εκ τούτου, ο κώδικας των μηχανών αυτών αποτελεί σημαντικά κεφάλαια για να ξαναγραφτεί από την αρχή. Όπως αποδεικνύεται από την διπλωματική, όμως, κάτι τέτοιο έχει τεράστια οφέλη. Ακόμα και η ActiveBPEL, η οποία είναι ανοιχτού λογισμικού πάσχει από τα παραπάνω μειονεκτήματα. Στα αρνητικά, δε, των υπολοίπων συγκαταλέγεται το κόστος που χρειάζεται να καταβάλει μία επιχείρηση ή ακόμα και ένας ιδιώτης για να αγοράσει μία άδεια χρήσης. 87

88 4. Εργαλεία 4.1 Εγκατάσταση των εργαλείων Για την υλοποίηση της εφαρμογής χρειάστηκε η εγκατάσταση των παρακάτω εργαλείων: Java, Tomcat, Axis, Eclipse & Vtd-xml. Παρακάτω παρατίθεται μια επεξήγηση των εργαλείων αυτών Java Development Kit (JDK) Έκδοση του JDK Η έκδοση του JDK που χρησιμοποιήθηκε ήταν η JDK 6 Update 16 with Java EE, αν και να σημειωθεί ότι σε πολλές περιπτώσεις αναγκαστήκαμε (λόγω συμβατότητας) να επιβάλλουμε μετάφραση σε περιβάλλον JRE 4 και όχι JRE Εγκατάσταση Η Java είναι μια γλώσσα προγραμματισμού που αναπτύχθηκε αρχικά από τον James Gosling στη Sun Microsystems και κυκλοφόρησε το 1995 ως ένα βασικό συστατικό της πλατφόρμας Java Sun Microsystems. Η γλώσσα αντλεί μεγάλο μέρος της σύνταξης της από την C, αλλά έχει ένα απλούστερο αντικειμενοστραφές μοντέλο και λιγότερες χαμηλού επιπέδου εφαρμογές. Οι εφαρμογές Java μεταφράζονται σε δυαδικό κώδικα (bytecode - αρχείο class) που μπορεί να λειτουργεί σε οποιαδήποτε Java Virtual Machine (JVM) ανεξάρτητα από την αρχιτεκτονική του υπολογιστή. Είναι μία από τις πιο γνωστές γλώσσες προγραμματισμού, με πάρα πολλές λειτουργίες και με δυνατότητες που συνεχώς αυξάνονται. Επίσης προσφέρει έτοιμες συναρτήσεις οι οποίες διευκολύνουν πολύ την ανάπτυξη γρήγορων εφαρμογών, αφού η υλοποίηση των έτοιμων αυτών συναρτήσεων βελτιώνεται συνεχώς. Επίσης, η Java αποτελεί πλέον την γλώσσα προγραμματισμού που χρησιμοποιείται στις περισσότερες υπηρεσίες διαδικτύου, κυρίως χάριν στην ευκολία της και στην ταχύτητα που πραγματοποιεί τις ζητούμενες διαδικασίες. Για να γράψει και να μεταγλωττίσει κανείς κώδικα σε Java θα πρέπει να κατεβάσει την εκδοχή του κιτ ανάπτυξης λογισμικού σε Java από την ιστοσελίδα 88

89 Γιατί χρησιμοποιήθηκε η Java Χρησιμοποιήσαμε την Java για τους εξής λόγους: Είναι γρήγορη Είναι εύκολη Παρέχει έτοιμες χρήσιμες συναρτήσεις Μπορεί να επεκταθεί με επιπλέον βιβλιοθήκες ή αρχεία jars που εμπεριέχουν έτοιμες κλάσεις, όπως αυτή της vtd-xml Οι εξυπηρετητές Tomcat και Axis παρέχουν μεγαλύτερη συμβατότητα σε αυτή την γλώσσα από οποιαδήποτε άλλη γλώσσα Tomcat Έκδοση του Tomcat Η έκδοση του Tomcat που χρησιμοποιήθηκε είναι η Εγκατάσταση του Tomcat O Tomcat είναι μια servlet μηχανή. Τα servlets είναι ειδικού τύπου Java εφαρμογές, οι οποίες ενσωματώνονται σε ειδικούς web servers, τους υποδοχείς των servlets ή αλλιώς τις servlet-μηχανές. O Tomcat είναι λογισμικό ανοικτού κώδικα και κατά συνέπεια ο οποιοσδήποτε μπορεί να το κατεβάσει από τη σελίδα και να το εγκαταστήσει Γιατί χρησιμοποιήθηκε ο Tomcat Χρησιμοποιούμε τον Tomcat ως HTTP server, δηλαδή ως μια πλατφόρμα που περιέχει κλάσεις για την υποστήριξη των servlets. Τα θετικά στοιχεία του είναι ότι: Δεν κολλάει όταν πάθει κάτι ένα servlet. Υποστηρίζει τις προδιαγραφές ασφαλείας του J2EE. 89

90 Είναι ένας πολυνηματικός εξυπηρετητής. Για να εγκατασταθεί, κατεβάζουμε την zip επιλογή (light distributions for JDK 1.4 or later) από τη σελίδα και την τρέχουμε πηγαίνοντας στον φάκελο όπου εγκαταστάθηκε στον φάκελο bin και τρέχουμε το startup.bat. Αφού ξεκινήσουμε την υπηρεσία, μπαίνουμε στη σελίδα (ή σκέτο όπου θα πρέπει να εμφανίζεται η αρχική σελίδα του Tomcat AXIS Έκδοση του Axis Η έκδοση του Axis που χρησιμοποιήσαμε είναι η Αxis Γενικά για τον AXIS Ο Axis είναι μια SOAP μηχανή. Τι σημαίνει SOAP μηχανή; Είναι ένα σύνολο από κλάσεις, οι οποίες διευκολύνουν την ανάπτυξη των SOAP εφαρμογών είτε από τη μεριά του εξυπηρετητή είτε από τη μεριά του πελάτη. Γιατί χρειάζεται μια SOAP μηχανή; Ο σκοπός των web services είναι να παρέχουν μια πλατφόρμα ανεξάρτητη γλώσσας προγραμματισμού και λειτουργικού συστήματος. Αυτό επιτυγχάνεται με τη βοήθεια του πρωτοκόλλου SOAP (Simple Object Access Protocol), το οποίο επιτρέπει σε μια εφαρμογή πελάτη να καλέσει μια υπηρεσία διαδικτύου ανεξαρτήτως γλώσσας και λειτουργικού συστήματος που έχει υλοποιηθεί είτε η ίδια η υπηρεσία είτε η εφαρμογή πελάτη. Η Java παρέχει την Java διεπαφή προγραμματισμού εφαρμογών (application programming interface - API) για το XML- RPC (JAX-RPC) που επιτρέπει στους πελάτες να εκτελούν απομακρυσμένες κλήσεις σε μεθόδους (Remote Procedure Calls-RPC). To JAX-RPC υλοποιεί μια Java έκδοση του πρωτοκόλλου SOAP. Πρακτικά μια SOAP μηχανή περιέχει βασικές κλάσεις οι οποίες υποστηρίζουν τις παρακάτω λειτουργίες: 90

91 Σειριοποιούν κλήσεις μεθόδων σε πακέτα SOAP Αποσειριοποιούν πακέτα SOAP σε κλήσεις μεθόδων Ενσωματώνουν XML κείμενα σε πακέτα SOAP Εξάγουν τα XML κείμενα από τα πακέτα SOAP Υποβάλλουν SOAP αιτήσεις και χειρίζονται τις απαντήσεις Δέχονται SOAP αιτήσεις και επιστρέφουν τις απαντήσεις Υποστηρίζουν ασύγχρονες λειτουργίες Η λίστα με τις λειτουργίες είναι αρκετά μεγάλη και κρίνεται σκόπιμο να σταματήσουμε εδώ. Παρακάτω παρατίθενται επίλογές για SOAP μηχανές, οι επιλογές είναι πολλές: Αpache SOAP 2.2 ( ) H Apache SOAP 2.2 είναι μάλλον η πιο ώριμη επιλογή, αλλά δεν υποστηρίζει τη γλώσσα WSDL (Web Services Description Language) Apache SOAP 3.0 (ws.apache.org/axis/ ) Αυτή η SOAP μηχανή είναι γνωστή και ως Axis. Δεν είναι η επόμενη έκδοση της Apache SOAP μηχανής, αφού είναι κάτι εντελώς καινούργιο. Το όνομα Axis προέρχεται από το Apache extensible Interaction System. Web Services Developer Pack ( ) Αυτό το πακέτο της Sun Microsystems είναι στην πραγματικότητα μια ένωση πολλών τεχνολογιών. Για παράδειγμα μπορούμε να χρησιμοποιήσουμε το Java API για XML-Based Procedure Call (JAX-RPC), το Java API για XML Processing (JAXP) των SOAP μηνυμάτων κτλ. IBM Web Services Toolkit (WSTK) ( ) 91

92 Αυτό το πακέτο είναι παρόμοιο με το προηγούμενο από την άποψη ότι χρησιμοποιεί διάφορες τεχνολογίες. Χρησιμοποιεί τον Axis σαν SOAP μηχανή και τον WebShpere σαν web server. IBM WebSphere SDK for Web Services (WSDK) ( 106.ibm.com/developerworks/webservices/wsdk ) Αυτό είναι ένα πιο επίσημο πακέτο της IBM, σε σχέση με το WSTK. Επιπλέον συμπεριλαμβάνει και τον Axis μαζί με διάφορα άλλα εξαρτήματα, όπως ο Xerces, ένα προσωπικό UDDI registry, μια βάση δεδομένων, τον WebSphere web server κτλ Γιατί χρησιμοποιήθηκε ο Axis; Για την παρούσα διπλωματική επιλέχθηκε ο Axis ως SOAP μηχανή για τους παρακάτω λόγους: Ο Axis είναι ανοιχτού λογισμικού Ο Axis είναι αυτόνομος εξυπηρετητής Ο Axis ενσωματώνεται μέσα σε servlet μηχανές όπως ο Tomcat (WSDL) Παρέχει εκτεταμένη υποστήριξη για την Web Service Description Language Μπορεί να κατασκευάσει Java κλάσεις από την WSDL Παρέχει ένα εργαλείο, το TCP/IP monitoring για να εποπτεύει ο διαχειριστής τα πακέτα που στέλνονται και λαμβάνονται Ο Axis έχει υιοθετηθεί από πολλές εταιρείες όπως η ΙΒΜ που αναφέραμε με το WSTK και άλλες όπως η Macromedia. O Axis παρέχει υλοποίηση του JAX-RPC. 92

93 O Axis έχει μια πολύ επεκτάσιμη υλοποίηση που επιτρέπει εξαιρετικά ευέλικτες κινήσεις και εφαρμογές. Πριν μπορέσουμε να δουλέψουμε με τον Axis θα πρέπει να έχουμε εγκαταστήσει το Java Development Kit και έναν XML parser όπως ο Xerces. Για την εγκατάσταση του axis, κατεβάζουμε μια έκδοση του Axis και βάζουμε το axis webapp που βρίσκεται στο φάκελο webapps, μέσα στις webapps του Tomcat. Επιπλέον χρειάζονται και δύο jars αρχεία (ανάλογα με την έκδοση που θα έχουμε κατεβάσει μπορεί να υπάρχουν προεγκατεστημένα η έκδοση 1.4 που εγκαθιστούμε εμείς τα έχει ήδη μέσα), το xercesimpl.jar και το xmlparserapis.jar. Ελέγχουμε αν όλα εγκαταστάθηκαν σωστά μπαίνοντας στη σελίδα: και βλέποντας αν η happyaxis.jsp μας επιστρέφει σωστά αποτελέσματα Eclipse Έκδοση Η έκδοση που χρησιμοποιήθηκε ήταν η Εγκατάσταση Αρκεί κανείς να κατευθυνθεί στο για να κατεβάσει την πλατφόρμα του eclipse προκειμένου να αρχίσει να προγραμματίζει σε Java. Από εκεί κατεβάζει ένα αρχείο zip που μπορεί να το αποσυμπιέσει όπου θέλει. Έπειτα με ένα διπλό κλικ μέσα στον φάκελο όπου έχει αποσυμπιεστεί το αρχείο zip, θα βρίσκεται το eclipse.exe. Αφού ο χρήστης ερωτηθεί για τον φάκελο όπου θα αποθηκεύονται τα σχέδιά του, τότε μπορεί να αρχίσει να προγραμματίζει. Ο eclipse έχει πολλούς υποστηρικτές στο διαδίκτυο, οπότε εύκολα μπορεί να κανείς να βρει λύσεις στις απορίες του Γιατί χρησιμοποιήθηκε ο Eclipse Ο Eclipse είναι μία πλατφόρμα αρκετά δυναμική. Μπορεί κανείς να ρυθμίσει το classpath του, δίχως να πειράξει το classpath του συστήματος, μπορεί να ορίσει ποια 93

94 από τις java εκδόσεις θα χρησιμοποιήσει δίχως να πειράξει τις εγκατεστημένες ρυθμίσεις του συστήματος, μπορεί να έχει προειδοποιήσεις για πιθανά σφαλμάτων κατά την διάρκεια συγγραφής του κώδικα προτού τρέξει το πρόγραμμα, είναι γρήγορος και απαιτεί πολύ μικρές ποσότητες μνήμης στο σύστημα στο οποίο τρέχει. Μία από τις σημαντικές ιδιότητές του είναι η φορητότητα που προσφέρει. Μπορεί κανείς να το τρέξει και από τον φορητό δίσκο usb του, σε διαφορετικά λειτουργικά συστήματα. Δοκιμάστηκε σε συστήματα Windows XP, Windows Vista και σε Windows 7. Ο Eclipse χρησιμοποιείται ευρέως στην ελεύθερη αγορά για τον σχεδιασμό εφαρμογών σε Java και ως εκ τούτου υπάρχει πολύ καλή υποστήριξη σε τυχόντα θέματα που μπορούν να προκύψουν. Επίσης, παρέχει δωρεάν πολλά εργαλεία που είναι αρκετά χρήσιμα για πιο εξεζητημένες εφαρμογές. Παραδείγματος χάριν, μπορεί κανείς με ιδιαίτερη ευκολία να σχεδιάσει γραφικές εφαρμογές, μέσω της swing πλατφόρμας, με την οποία με ένα απλό drag 'n' drop να φτιάξει GUIs (γραφικές διεπαφές για τον χρήστη) που θα χρειάζονταν ώρες εργασίας. Ο Eclipse έχει σχεδιαστεί με γνώμονα την φορητότητα και σε άλλα λειτουργικά πέραν των λειτουργικών της Microsoft. Έχει το ίδιο γραφικό περιβάλλον και στα δύο άλλα δημοφιλή λειτουργικά: τις διανομές του Linux και στα λειτουργικά MacOS. Οπότε μπορεί κανείς να λειτουργήσει με ιδιαίτερη εύκολα σε όποιο λειτουργικό και εάν βρίσκεται. Το παραπάνω χαρακτηριστικό δεν μένει μόνο στο γραφικό περιβάλλον. Επεκτείνεται και στα αρχεία που χρησιμοποιεί ο eclipse για να φτιάξει κανείς τον φάκελο εργασίας του με τις διάφορες ρυθμίσεις. Όλος ο φάκελος του χώρου εργασίας του σχεδιαστή (workspace) μπορεί να μεταφερθεί από το ένα σύστημα στο άλλο. Σε αυτό το σημείο μπορώ να πω με ιδιαίτερη ευχαρίστηση ότι ήμουν μάρτυρας σε αυτό το χαρακτηριστικό. Χρησιμοποιούσα συνεχώς το pithos.grnet.gr για να αποθηκεύω κάθε μέρα την πρόοδο της εργασίας μου ( και για λόγους ασφαλείας ), στον υπολογιστή του εργαστηρίου που χρησιμοποιεί Windows XP, για να φτάνω σπίτι το βράδυ και να εργάζομαι σε λειτουργικό Windows Vista. Ενίοτε, καθώς το λειτουργικό που χρησιμοποιώ περισσότερο είναι η διανομή linux Ubuntu, μπορούσα και εργαζόμουν από εκεί. 94

95 Συνοψίζοντας, τα χαρακτηριστικά που με έπεισαν να εργαστώ σε Eclipse και όχι σε κάποια άλλη πλατφόρμα ανάπτυξης Java εφαρμογών, είναι: Σπουδαία φορητότητα και στην μεταφορά του ιδίου του κώδικα, όσο και διαλειτουργικό Εύχρηστο γραφικό περιβάλλον Εύκολο στην χρήση Γρήγορο στην ανταπόκριση Ελαφρύ Απαιτεί ελάχιστες απαιτήσεις για να τρέξει Ταυτόχρονη εύρεση σφαλμάτων κατά την συγγραφή του κώδικα Drag 'n drop εργαλεία Είναι δωρεάν Είναι ανοικτού λογισμικού (πατέντα EPL) Αναβαθμίζεται συχνά Μπορεί να ενσωματώσει jar αρχεία στα διάφορα έργα Μπορεί να αλλάξει το περιβάλλον σύγχρονης εκτέλεσης (runtime environment) με λίγα κλικ Προσφέρει πληθώρα δωρεάν εργαλείων που εξοικονομούν σπουδαίο χρόνο στους προγραμματιστές Έχει σπουδαία υποστήριξη στο διαδίκτυο από λοιπούς χρήστες του προγράμματος 95

96 Είναι πολύ εύκολο στην εκμάθησή του Για αυτούς τους λόγους, η χρήση του Eclipse θεωρήθηκε ευθύς εξαρχής επιτακτική έως επιβεβλημένη VTD-XML Έκδοση Η έκδοση που χρησιμοποιήθηκε ήταν η Εγκατάσταση Η μηχανή της vtd-xml είναι πολύ εύκολο να χρησιμοποιηθεί, αφού από το site μπορεί κανείς να κατεβάσει πολύ γρήγορα το zip αρχείο που έχει μέσα το jar αρχείο, με το οποίο μπορούμε να φτιάξουμε τις κλάσεις μας. Αρκεί αυτό το αρχείο να μπει στο classpath μας, προκειμένου να συμπεριληφθούν οι κλάσεις του με τις δικές μας. Στον eclipse αρκεί να σύρουμε το αρχείο vtd-xml.jar στο έργο μας, και αμέσως θα αναγνωριστεί ως ένα σετ κλάσεων που μπορούν να κληθούν από το έργο μας Γιατί χρησιμοποιήθηκε το vtd-xml Το πρώτο βήμα των περισσότερων αλγορίθμων επεξεργασίας XML αρχείων, συνήθως είναι να αποσπάται (εξόρυξη - extraction) το αλφαριθμητικό-συμβολικό περιεχόμενο από το έγγραφο προέλευσης σε πολλά διακριτά αντικείμενα. Το vtd-xml προτείνει μια "μη εξορυκτική" προσέγγιση εξαγωγής των αλφαριθμητικών (string) που διατηρεί το έγγραφο ανέπαφο στη μνήμη. Χρησιμοποιώντας μια δυαδική προδιαγραφή κωδικοποίησης που ονομάζεται Virtual Token Descriptor (VTD), το μοντέλο αντιστοίχησης αντιπροσωπεύει τα τμήματα που χρησιμοποιούνται αποκλειστικά σε σχέση με την αρχική μετατόπιση από την ρίζα και το μήκος από αυτήν. Για να δημιουργηθεί μια ιεραρχική βάση με τα δεδομένα που βρίσκονται σε ένα XML, ο parser στην συνέχεια κατηγοροποιεί περαιτέρω τους δείκτες που βρίσκονται στο ίδιο βάθος χρησιμοποιώντας δομές που μοιάζουν με εγκολπωμένους φακέλους. Μέσα από μια 96

97 επίδειξη της ιεραρχικής αυτής πλοήγησης του έγγραφου χρησιμοποιώντας VTD, έχει αποδείχθει ότι είναι πράγματι δυνατόν να δημιουργηθεί ένας δρομέας που διατηρεί τις περισσότερες από τις δυνατοτήτων τυχαίας πρόσβασης που προσφέρει ο DOM κατά ένα μόνο μέρος της μνήμης του. Τα αποτέλεσματα από διάφορα test δείχνουν ότι η εφαρμογή του μοντέλου αναφοράς επεξεργασίας vtd-xml ξεπερνά σημαντικά τον Xerces DOM όσον αφορά τόσο τη μνήμη όσο και τις επιδόσεις επεξεργασίας. Δεδομένου ότι χρησιμοποιεί συγκριτικά με τον DOM πολύ λίγη μνήμη, μπορεί κανείς να κατανοήσει ότι αυτό έχει άμεσες θετικές επιπτώσεις στην διπλωματική. Βελτιώνει τους χρόνους που γίνεται ανάλυση ενός xml αρχείου έως και 10 φορές πιο γρήγορα, βαθμός που είναι σημαντικός για μικρά αλλά και για μικρά αρχεία, δεδομένου ότι η υλοποίησή μας επιτρέπει ταυτοχρονισμό, γεγονός που απαιτεί ταυτόχρονη επεξεργασία του ιδίου μεν αρχείου, διαφορετικών δεικτών που θα επεξεργάζονται από το vtd-xml. Συνοψίζοντας τις λειτουργίες του vtd-xml, θα μπορούσαμε να πούμε ότι είναι: Ο πιο αποδοτικός αναλυτής XML αρχείων του κόσμου σε ζητήματα τυχαίας προσπέλασης καθώς απαιτεί στην μνήμη περίπου μόνο το 1.3x ~ 1.5x το μέγεθος ενός εγγράφου XML. Σε XML αρχεία όπου φυλάσσονται δεδομένα μπορεί να φτάσει τα 2x. Ο ταχύτερος XML αναλυτής του κόσμου: Σε έναν Core2 2.5Ghz laptop, o VTD-XML υπερτερεί των DOM αναλυτών από 5x ~ 12x, παρέχοντας 90 ~ 120 MB / sec σταθερή απόδοση ανά πυρήνα. Ο ταχύτερος υλοποιητής του Xpath 1.0 Αποτελεσματικότερη καταγραφή σε κατάλογο (Indexing) XML Ενσωματώνεται τέλεια σε οποιαδήποτε XML εφαρμογή, αφού είναι γενικού προσανατολισμού, όπως άλλωστε και τα xml αρχεία. Έυκολος να κατανοηθεί Δεν αλλάζει την δομή του πηγαίου εγγράφου xml 97

98 Ελαφρύς, απαιτεί ελάχιστη μνήμη Γρήγορος Μπορεί να πραγματοποιήσει αυξητική προσθήκη σε XML αρχεία: να κόψει, να επικολλήσει, να χωρίσει και συναρμολογήσει XML έγγραφα με μέγιστη απόδοση. Ο μοναδικός αναλυτής του κόσμου XML που επιτρέπει να χρησιμοποιηθεί XPath ορισμός για την επεξεργασία έγγραφων XML μέχρι και 256 GB. Μια έγγραφο-κεντρική ανάλυση του XML αρχείου Αναβαθμίζεται συχνά Προσφέρει την δυνατότητα επιτάχυνσης βάσει υλικού (hardware acceleration). Συγκεκριμένα βάσει υλοποίησης ASIC. Ένας από τους ελάχιστους τρόπους για να εισαχθεί η επεξεργασία xml σε chip. Το τελευταίο στοιχείο αποτελεί πολύ σημαντικός παράγοντας. Τα τεστ που έχουν γίνει στον vtd-xml μας δείχνουν ότι μπορεί να υπάρξει σε ενσωματωμένα συστήματα. 98

99 5.Υλοποίηση 5.1. Σκοπός Σκοπός της διπλωματικής είναι να κατασκευαστεί μία μηχανή WS-BPEL αρχείων που θα φέρει σε πέρας την κάθε διαδικασία. Η ίδια η μηχανή θα πρέπει να μπορεί να είναι υπηρεσία διαδικτύου και να είναι παραμετροποιήσιμη για εταιρικές εφαρμογές. Στόχος, επίσης της μηχανής είναι να είναι γρήγορη και ελαφριά Πλεονεκτήματα Υλοποίησης Κατ' αρχάς πρέπει να σημειωθεί ότι η υλοποίησή μας εύκολα μπορεί να μπει στον globus και ως επέκταση να αποτελέσει η ίδια ως διαδικτυακή υπηρεσία. Αυτό αυξάνει τις δυνατότητες της αρκετά. Μπορεί αν αναλάβει, φερειπείν, μία εταιρεία την περάτωση γενικευμένων ροών εργασίας. Η υπηρεσία, δηλαδή, δε θα δεσμεύεται να κάνει κάτι συγκεκριμένο ή να επιστρέφει συγκεκριμένο αποτέλεσμα, όπως οι στατικές υπηρεσίες που περιγράφηκαν στα προηγούμενα κεφάλαια. Είναι μία δυναμική υπηρεσία που υλοποιεί κάθε διάγραμμα ροής που σέβεται τους ορισμούς του προτύπου WS-BPEL 2.0. Αναλαμβάνει να περατώσει την διαδικασία που περιγράφεται στο αρχείο που θα της αποστέλλεται. Η γενική αυτή προσέγγιση αυξάνει δραματικά τις δυνατότητες της. Μπορεί η ίδια η υπηρεσία να διατεθεί από μία εταιρεία στο διαδίκτυο για να εξυπηρετήσει άλλες εταιρείες, ή μπορούν και οι ίδιες εταιρείες να την σηκώσουν στο διαδίκτυο για να εξυπηρετούν εσωτερικά τις δικές τους ανάγκες κάθε φορά που θα χρειάζονται μία συγκεκριμένη υπηρεσία. Μία εταιρεία, μπορεί να έχει μεν τους υπολογιστικούς πόρους, αλλά να μην χρειάζεται να τους χρησιμοποιεί όλους μαζί για μία μόνο υπηρεσία. Ενδεχομένως να χρειάζεται να πραγματοποιεί μία υπηρεσία της κατά ένα χρονικό διάστημα της ημέρας, μία άλλη κατά ένα άλλο χρονικό διάστημα κ.ο.κ. Συνεπώς, δεν χρειάζεται να μισθώσει μία εταιρεία να της διαθέσει πόρους, εφόσον και η ίδια θα τους έχει και θα μπορεί να τους εκμεταλλευθεί κατάλληλα. Οπότε μπορεί να σηκώσει την υπηρεσία που υλοποιήθηκε στην διπλωματική αυτή εργασία, για να εξυπηρετεί την μία περίοδο μία εργασία-υπηρεσία της γραμμένη σε WS-BPEL, μία άλλη πιο μετά πάλι γραμμένη σε WS-BPEL, δίχως να χρειάζεται να έχει στατικά μία και μόνο υπηρεσία σηκωμένη στον globus. 99

100 Συνεπώς, ένα από τα προτερήματα της διπλωματικής αυτής εργασίας είναι ότι είναι γενικού σκοπού, γεγονός που αφήνει στον καθένα να υλοποιήσει δυναμικά μία υπηρεσία. Αυτό φυσικά, συνεπάγεται και μία δυναμικότητα. Το γεγονός ότι είναι γραμμένη στην γλώσσα Java, μία ευρέως διαδεδομένη και γνωστή γλώσσα προγραμματισμού δίνει την δυνατότητα σε αρκετούς να πειράξουν τον κώδικα κατά το δοκούν., να τον βελτιώσουν, να απενεργοποιήσουν ορισμένες από τις λειτουργίες του, να παραμετροποιήσουν ορισμένες μεταβλητές. Σε αυτό το σημείο αξίζει να σημειωθεί ότι σε αρκετά σημεία είναι εμφανής η χρήση των futures που έχει εισάγει η Java. Τα futures ομοιάζουν στα νήματα με την διαφορά ότι ο χρήστης έχει περισσότερες δυνατότητες ελέγχου στα futures. Στην παρούσα διπλωματική, σηκώναμε τα futures και περιμέναμε να τελειώσουν προτού προχωρήσουμε σε παρακάτω ενέργειες. Επίσης, μπορεί κανείς να ορίσει πόσα futures μπορεί να χρησιμοποιεί μία διεργασία. Για παράδειγμα, μπορεί στην περίπτωση που μία εταιρεία έχει διαθέσει αυτόν τον κώδικα ως υπηρεσία, να θέλει να περιορίσει τους εκμεταλλεύσιμους πόρους που θα χρησιμοποιούν οι πελάτες της ανάλογα με τα χρήματα που θα της δίνουν. Ανάλογα με το πόσο υψηλό είναι το χρηματικό πόσο που θα καταβάλει ο πελάτης, τόσο θα αυξάνει η εταιρεία και τα threads-futures που θα μπορεί ο πελάτης να χρησιμοποιήσει. Αντίστοιχα, μία εταιρεία που χρησιμοποιεί αυτόν τον κώδικα για εσωτερική κατανάλωση, μπορεί να μη θέλει να δεσμεύει για τις υπηρεσίες της όλους τους δυνατούς πόρους, αλλά να θέλει να κρατά κάποιους πόρους για άλλες διεργασίες. Οπότε με αυτή την παραμετροποίηση θα μπορεί να περιορίσει την γενικότητα της υπηρεσίας μας. Παρακάτω παρατίθεται ο κώδικας που υλοποιεί την παραμετροποίηση αυτή: final ExecutorService execsvc = Executors.newFixedThreadPool(10); Όπως είναι εύκολα κατανοητό από το παραπάνω παράδειγμα, δημιουργούμε μία δεξαμενή από 10 νήματα τα οποία είναι δυνατόν να χρησιμοποιηθούν. Αξίζει να σημειωθεί εδώ ότι η υλοποίηση της δεξαμενής δεν σημαίνει απαραίτητα ότι σηκώνονται 10 futures, αλλά ότι είναι δυνατόν να σηκωθούν μέχρι 10 futures. Κάτι τέτοιο σημαίνει ότι υπάρχει εξοικονόμηση πόρων σε περίπτωση που αυτοί δεν είναι απαραίτητοι ή χρήσιμοι στην περάτωση της διαδικασίας. 100

101 Επίσης, είναι αυτονόητο ότι εάν χρειάζονται παραπάνω από 10 νήματα, τότε η μηχανή εκτέλεσης της Java περιμένει να τελειώσουν με τις εργασίες τους τα υπόλοιπα 10 νήματα και στην συνέχεια, μόλις τελειώσει έστω και ένα, τότε το αιτόν νήμα παίρνει την θέση του στην χρονοδρομολόγηση και στην υλοποίησή του. Όπως ειπώθηκε και στην παράγραφο των εργαλείων, χρησιμοποιούμε τον vtd-xml αναλυτή. Αυτό συνεπάγεται άμεσα μικρές απαιτήσεις σε υπολογιστική ισχύ, και κυρίως σε μικρές απαιτήσεις στην μνήμη καθώς ο vtd-xml αναλυτής φτιάχνει έναν κατάλογο που απαιτεί 1.3 ~ 1.5 το μέγεθος του αρχείου xml σε μνήμη. Κάτι τέτοιο είναι πολύ βολικό, καθώς η υλοποίηση με τα DOMs της Java απαιτεί 10 φορές μνήμη του μεγέθους του αρχείου. Η μείωση της δέσμευσης αυτής της μνήμης σε 6-7 φορές λίγοτερη συνεπάγεται και πιο γρήγορη προσπέλαση στα διάφορα σημεία στα οποία μπορούν να ανακτηθούν δεδομένα από το αρχείο XML. Ο κώδικάς μας, αφού φτιάξει τις κατάλληλες κλάσεις από τις διάφορες μεταβλητές που θα χρησιμοποιήσει, χρόνος που δεν μπορεί να μειωθεί παρά μόνο από την ίδια την υλοποίηση της εικονικής μηχανής της JAVA, συνεχίζει με την υλοποίηση του τμήματος sequence της WS-BPEL. Αυτό το τμήμα, λόγω του ότι χρησιμοποιείται η vtd-xml πραγματοποιείται γρήγορα, με ελάχιστους δεσμευμένους πόρους και με ακρίβεια. Η μόνη καθυστέρηση που εισάγεται πλέον είναι από τις δυνατότητες του δικτύου αλλά και απάντησης από τις υπόλοιπες υπηρεσίες. Ένα επιπλέον χαρακτηριστικό της vtd-xml είναι η δυνατότητα εκτέλεσής μέσω επιτάχυνσης υλικού (hardware acceleration), μέσω ASIC υλοποίησης. Το χαρακτηριστικό αυτό μαζί με το γεγονός των μικρών απαιτήσεων σε μνήμη και σε επεξεργαστική ισχύ σημαίνει ότι η υλοποίησή μας με κατάλληλες τροποποιήσεις μπορεί να τρέξει σε ενσωματωμένα συστήματα. Στην ουσία, αφήνει την δυνατότητα να φτιάξει ένας οργανισμός/εταιρεία/ιδιώτης μικρά συστήματα που θα είναι ειδικά σχεδιασμένα μόνο για αυτό. Αυτό ανεβάζει τον πήχη των προσφερόμενων υπηρεσιών, αφού η ταχύτητα και η χαμηλή ενεργειακή κατανάλωση είναι σημαντικοί παράγοντες και στην κοινωνική συνείδηση και στην ελεύθερη αγορά που ψάχνει τρόπους να αυξήσει τις υπηρεσίες της, ενώ παράλληλα να ελαχιστοποιήσει τα έξοδά της. Κάτι τέτοιο εύκολα γίνεται αισθητό με την δική μας υλοποίηση καθώς και πιο γρήγορο είναι το πρόγραμμά μας, αλλά και απαιτεί λιγότερη ενέργεια, μνήμη και επεξεργαστική ισχύ. Αξίζει να 101

102 σημειωθεί ότι ο vtd-xml ανανεώνεται αρκετά συχνά προσφέροντας ανανεώσεις τόσο στον κώδικά του, που έχουν σημαντικές βελτιώσεις στην ταχύτητά του, όσο και στις δυνατότητές του. Ο συνδυασμός αυτός, μαζί με την ίδιότητα που έχει να είναι ένα από τους ελάχιστους τρόπους που μπορεί να εισαχθεί η ανάλυση xml αρχείων σε ολοκληρωμένα, δίνει σημαντικές προοπτικές υιοθέτησης του κώδικα μας. 5.3 Δομή Υλοποίησης Ο κώδικας της υλοποίησης απαρτίζεται από λίγα αρχεία. Παρακάτω ορίζεται η λειτουργία των αρχείων αυτών ReadBpel.java είναι το αρχικό μας αρχείο, αυτό που ξεκινά την ανάγνωση του αρχείου WS-BPEL και αρχίζει σειριακά να το αναλύει. Το κάθε τμήμα του WS-BPEL αρχείου αποστέλλεται στο κάτωθι αρχείο. Runlogic.java είναι το αρχείο το οποίο στην ουσία είναι και ο πυρήνας της εφαρμογής μας. Κάθε σημείο που έρχεται από την ReadBpel.java έρχεται αδώ και αναλύεται για να υλοποιηθεί. Ανάλογα με το τμήμα, η runlogic εκτελεί και κάτι διαφορετικό. Createwsdl2javafiles.java είναι το αρχείο το οποίο χρησιμοποιείται εσωτερικά από την runlogic στο κομμάτι της δημιουργίας των μεταβλητών (variables). Συλλέγει τις υπηρεσίες που καλεί η WS-BPEL, μέσω των WSDL αρχείων τους και στη συνέχεια φτιάχνει τις μεταβλητές ως αρχεία java που θα χρησιμοποιηθούν καθώς και άλλα αρχεία τα οποία είναι χρήσιμα κατά την εκτέλεση του κώδικα. Εσωτερικά η ίδια τα μεταφράζει και σε κλάσεις χρησιμοποιώντας την CreateClassesFromJavaFiles Συνεπώς ο κώδικάς μας αποτελείται από αυτά τα 4 αρχεία τα οποία υλοποιούν τα απαιτούμενα. Ο κώδικας έχει σχόλια έτσι, ώστε κάθε προγραμματιστής να μπορεί να τον καταλάβει γρήγορα και να μπορεί να τον τροποποιήσει ακόμα πιο γρήγορα. Μόνη προϋπόθεση του σχολιασμού είναι να γνωρίζει αρκετά καλά και το αντικείμενο εφαρμογής έτσι, ώστε να καταλαβαίνει και τι τελείται σε κάθε σημείο, καθώς επίσης και 102

103 να καταλαβαίνει την αγγλική γλώσσα, μιας και η διεθνής σύμβαση σχολιασμού των προγραμμάτων που προορίζονται σε παγκόσμιο κοινό είναι η χρήση της αγγλικής γλώσσας. Σε αυτό το σημείο πρέπει να σημειωθεί ότι ο κώδικάς δεν έχει την υλοποίηση ορισμένων στοιχείων τα οποία είναι ελάσσονος σημασίας, τα οποία είναι τα if, faulthandlers και throw. Επίσης, η χρήση της receive και της reply δεν είναι αναγκαίες καθώς η υλοποίησή μας είναι για σύγχρονη επικοινωνία υπηρεσιών. 5.4 Παράδειγμα χρήσης Έστω το παρακάτω bpel αρχείο: <?xml version="1.0" encoding="utf-8"?> <process name="newprocess" targetnamespace=" xmlns=" xmlns:xsd=" xmlns:sxt=" xmlns:sxed=" xmlns:tns=" xmlns:impl="urn:fibonacci"> <import namespace="urn:add" location="add.wsdl" importtype=" <import namespace="urn:fibonacci" location="fib.wsdl" importtype=" <import namespace="urn:returnresult" location="returnresult.wsdl" importtype=" <import namespace="urn:square" location="square.wsdl" importtype=" <import namespace="urn:createrandom" location="createrandom.wsdl" importtype=" <partnerlinks> 103

104 <partnerlink name="partnerlink2" xmlns:tns=" partnerlinktype="tns:createrandomlinktype" partnerrole="createrandomrole"/> <partnerlink name="fib" xmlns:tns=" partnerlinktype="tns:fibonaccilinktype" partnerrole="fibonaccirole"/> <partnerlink name="string" xmlns:tns=" partnerlinktype="tns:returnresultstringlinktype" partnerrole="returnresultstringrole"/> <partnerlink name="square" xmlns:tns=" partnerlinktype="tns:squarelinktype" partnerrole="squarerole"/> <partnerlink name="partnerlink1" xmlns:tns=" partnerlinktype="tns:fibonaccilinktype" partnerrole="fibonaccirole"/> </partnerlinks> <variables> <variable name="createrandomout" xmlns:impl="urn:createrandom" messagetype="impl:createrandomresponse"/> <variable name="createrandomin" xmlns:impl="urn:createrandom" messagetype="impl:createrandomrequest"/> <variable name="squareout" xmlns:impl="urn:square" messagetype="impl:squareresponse"/> <variable name="squarein" xmlns:impl="urn:square" messagetype="impl:squarerequest"/> <variable name="calculatefibonacciout" xmlns:impl="urn:fibonacci" messagetype="impl:calculatefibonacciresponse"/> <variable name="calculatefibonacciin" xmlns:impl="urn:fibonacci" messagetype="impl:calculatefibonaccirequest"/> <variable name="variable2" type="xsd:int"/> <variable name="variable1" type="xsd:int"/> </variables> <sequence> <invoke name="invoke6" partnerlink="partnerlink2" operation="createrandom" xmlns:impl="urn:createrandom" porttype="impl:createrandom" inputvariable="createrandomin" outputvariable="createrandomout"/> <assign name="assign2"> 104

105 <copy> <from variable="createrandomout"/> <to variable="squarein"/> </copy> </assign> <flow name="flow1"> <sequence name="flowsequence"> <invoke name="invoke5" partnerlink="square" operation="square" xmlns:impl="urn:square" porttype="impl:square" inputvariable="squarein" outputvariable="squareout"/> </sequence> </flow> <assign name="assign1"> <copy> <from variable="squareout"/> <to variable="squarein"/> </copy> </assign> <invoke name="invoke5" partnerlink="square" operation="square" xmlns:impl="urn:square" porttype="impl:square" inputvariable="squarein" outputvariable="squareout"/> </sequence> </process> Εάν έχουμε δύο υπηρεσίες που η μία μας επιστρέφει έναν τυχαίο αριθμό μεταξύ 0 και 10, ενώ η δεύτερη μας επιστρέφει το τετράγωνο ενός αριθμού, ο παραπάνω κώδικας καλεί την πρώτη και έπειτα καλεί δύο φορές διαδοχικά την δεύτερη υπηρεσία. Στο τέλος καταλήγουμε με την τέταρτη δύναμη του τυχαίου αριθμού. Ο κώδικάς μας για να τρέξει χρειάζεται ως πρώτο όρισμα τον φάκελο που είναι αποθηκευμένοι τα bpel αρχεία μαζί με τα wsdls αρχεία, ως δεύτερο όρισμα το bpel αρχείο και ως τρίτο την τιμή false (λέει στην μηχανή να μην αντιστοιχήσει από μόνη της τα namespaces). Ένα τυχαίο αποτέλεσμα (καθότι ο αριθμός που μας επιστρέφεται από την πρώτη υπηρεσία είναι τυχαίος), που μας δείχνει κάθετι που γίνεται στην πλατφόρμα είναι το εξής: 105

106 outer Element name ==> process Trying to wait for the wsdl2java procedure to stop Parsing XML file:./services/square.wsdl Parsing XML file:./services/fib.wsdl Parsing XML file:./services/add.wsdl Parsing XML file:./services/createrandom.wsdl Parsing XML file:./services/returnresult.wsdl Generating add\_addintegers.java Generating returnresult\_returnresultstring.java Generating square_pkg\_square.java Generating fibonacci\_calculatefibonaccirangeresponse.java Generating createrandom_pkg\_createrandom.java Generating add\_addintegersresponse.java Generating square_pkg\_squareresponse.java Generating fibonacci\_calculatefibonacciresponse.java Generating createrandom_pkg\_createrandomresponse.java Generating returnresult\_returnresultstringresponse.java AddSoapBindingImpl.java already exists, WSDL2Java will not overwrite it. Generating add\add.java SquareSoapBindingImpl.java already exists, WSDL2Java will not overwrite it. Generating square_pkg\square.java Generating add\addsoapbindingstub.java CreaterandomSoapBindingImpl.java already exists, WSDL2Java will not overwrite it. Generating createrandom_pkg\createrandom.java Generating square_pkg\squaresoapbindingstub.java Generating returnresult\returnresultstringservice.java Generating fibonacci\_calculatefibonaccirange.java Generating add\addsoapbindingskeleton.java Generating square_pkg\squaresoapbindingskeleton.java Generating createrandom_pkg\createrandomsoapbindingstub.java Generating fibonacci\_calculatefibonacci.java Generating returnresult\returnresultstringservicelocator.java Generating square_pkg\squareservice.java Generating add\addservice.java Generating fibonacci\fibonacciservice.java ReturnresultSoapBindingImpl.java already exists, WSDL2Java will not overwrite it. Generating returnresult\returnresultstring.java Generating fibonacci\fibonacciservicelocator.java Generating returnresult\returnresultsoapbindingstub.java Generating createrandom_pkg\createrandomsoapbindingskeleton.java Generating add\addservicelocator.java FibonacciSoapBindingImpl.java already exists, WSDL2Java will not overwrite it. Generating fibonacci\fibonacci.java Generating add\deploy.wsdd Generating createrandom_pkg\createrandomservice.java Generating square_pkg\squareservicelocator.java Generating createrandom_pkg\createrandomservicelocator.java Generating fibonacci\fibonaccisoapbindingstub.java Generating returnresult\returnresultsoapbindingskeleton.java Generating square_pkg\deploy.wsdd Generating createrandom_pkg\deploy.wsdd Generating add\undeploy.wsdd 106

107 Generating returnresult\deploy.wsdd Generating createrandom_pkg\undeploy.wsdd Generating fibonacci\fibonaccisoapbindingskeleton.java Generating returnresult\undeploy.wsdd Generating square_pkg\undeploy.wsdd Generating fibonacci\deploy.wsdd Generating fibonacci\undeploy.wsdd square_pkg\squaresoapbindingstub.java:27: warning: as of release 5, 'enum' is a keyword, and may not be used as an identifier (use -source 5 or higher to use 'enum' as a keyword) oper.setstyle(org.apache.axis.enum.style.document); ^ square_pkg\squaresoapbindingstub.java:28: warning: as of release 5, 'enum' is a keyword, and may not be used as an identifier (use -source 5 or higher to use 'enum' as a keyword) oper.setuse(org.apache.axis.enum.use.encoded); ^ createrandom_pkg\createrandomsoapbindingstub.java:27: warning: as of release 5, 'enum' is a keyword, and may not be used as an identifier (use -source 5 or higher to use 'enum' as a keyword) oper.setstyle(org.apache.axis.enum.style.document); ^ createrandom_pkg\createrandomsoapbindingstub.java:28: warning: as of release 5, 'enum' is a keyword, and may not be used as an identifier (use -source 5 or higher to use 'enum' as a keyword) oper.setuse(org.apache.axis.enum.use.encoded); ^ add\addsoapbindingstub.java:27: warning: as of release 5, 'enum' is a keyword, and may not be used as an identifier (use -source 5 or higher to use 'enum' as a keyword) oper.setstyle(org.apache.axis.enum.style.document); ^ add\addsoapbindingstub.java:28: warning: as of release 5, 'enum' is a keyword, and may not be used as an identifier (use -source 5 or higher to use 'enum' as a keyword) oper.setuse(org.apache.axis.enum.use.encoded); ^ 2 warnings 2 warnings.\returnresult\returnresultsoapbindingstub.java:27: warning: as of release 5, 'enum' is a keyword, and may not be used as an identifier (use -source 5 or higher to use 'enum' as a keyword) oper.setstyle(org.apache.axis.enum.style.document); ^.\returnresult\returnresultsoapbindingstub.java:28: warning: as of release 5, 'enum' is a keyword, and may not be used as an identifier (use -source 5 or higher to use 'enum' as a keyword) oper.setuse(org.apache.axis.enum.use.encoded); ^ 2 warnings.\fibonacci\fibonaccisoapbindingstub.java:27: warning: as of release 5, 'enum' is a keyword, and may not be used as an identifier (use -source 5 or higher to use 'enum' as a keyword) oper.setstyle(org.apache.axis.enum.style.document); ^.\fibonacci\fibonaccisoapbindingstub.java:28: warning: as of release 5, 'enum' is a keyword, and may not be used as an identifier 107

108 (use -source 5 or higher to use 'enum' as a keyword) oper.setuse(org.apache.axis.enum.use.encoded); ^.\fibonacci\fibonaccisoapbindingstub.java:37: warning: as of release 5, 'enum' is a keyword, and may not be used as an identifier (use -source 5 or higher to use 'enum' as a keyword) oper.setstyle(org.apache.axis.enum.style.document); ^.\fibonacci\fibonaccisoapbindingstub.java:38: warning: as of release 5, 'enum' is a keyword, and may not be used as an identifier (use -source 5 or higher to use 'enum' as a keyword) oper.setuse(org.apache.axis.enum.use.encoded); ^ 2 warnings returnresult\returnresultsoapbindingstub.java:27: warning: as of release 5, 'enum' is a keyword, and may not be used as an identifier (use -source 5 or higher to use 'enum' as a keyword) oper.setstyle(org.apache.axis.enum.style.document); ^ returnresult\returnresultsoapbindingstub.java:28: warning: as of release 5, 'enum' is a keyword, and may not be used as an identifier (use -source 5 or higher to use 'enum' as a keyword) oper.setuse(org.apache.axis.enum.use.encoded); ^ 4 warnings fibonacci\fibonaccisoapbindingstub.java:27: warning: as of release 5, 'enum' is a keyword, and may not be used as an identifier (use -source 5 or higher to use 'enum' as a keyword) oper.setstyle(org.apache.axis.enum.style.document); ^ fibonacci\fibonaccisoapbindingstub.java:28: warning: as of release 5, 'enum' is a keyword, and may not be used as an identifier (use -source 5 or higher to use 'enum' as a keyword) oper.setuse(org.apache.axis.enum.use.encoded); ^ fibonacci\fibonaccisoapbindingstub.java:37: warning: as of release 5, 'enum' is a keyword, and may not be used as an identifier (use -source 5 or higher to use 'enum' as a keyword) oper.setstyle(org.apache.axis.enum.style.document); ^ fibonacci\fibonaccisoapbindingstub.java:38: warning: as of release 5, 'enum' is a keyword, and may not be used as an identifier (use -source 5 or higher to use 'enum' as a keyword) oper.setuse(org.apache.axis.enum.use.encoded); ^ Trying to wait for the wsdl2java procedure to stop 2 warnings 4 warnings Trying to wait for the wsdl2java procedure to stop Trying to wait for the wsdl2java procedure to stop Trying to wait for the wsdl2java procedure to stop urn:createrandom So far I've got filetolook:./services/createrandom.wsdl, class before the one to look: createrandomresponse Found where I'm supposed to look createrandom._createrandomresponse and gonna load it dynamically. Finding class 108

109 createrandom_pkg._createrandomresponse: Class loaded successfully urn:createrandom So far I've got filetolook:./services/createrandom.wsdl, class before the one to look: createrandomrequest Found where I'm supposed to look createrandom._createrandom and gonna load it dynamically. Finding class createrandom_pkg._createrandom: Class loaded successfully urn:square So far I've got filetolook:./services/square.wsdl, class before the one to look: squareresponse Found where I'm supposed to look square._squareresponse and gonna load it dynamically. Finding class square_pkg._squareresponse: Class loaded successfully urn:square So far I've got filetolook:./services/square.wsdl, class before the one to look: squarerequest Found where I'm supposed to look square._square and gonna load it dynamically. Finding class square_pkg._square: Class loaded successfully urn:fibonacci So far I've got filetolook:./services/fib.wsdl, class before the one to look: calculatefibonacciresponse Found where I'm supposed to look fibonacci._calculatefibonacciresponse and gonna load it dynamically. Finding class fibonacci._calculatefibonacciresponse: Class loaded successfully urn:fibonacci So far I've got filetolook:./services/fib.wsdl, class before the one to look: calculatefibonaccirequest Found where I'm supposed to look fibonacci._calculatefibonacci and gonna load it dynamically. Finding class fibonacci._calculatefibonacci: Class loaded successfully CreaterandomOut createrandom_pkg._createrandomresponse createrandom.wsdl CreaterandomIn createrandom_pkg._createrandom createrandom.wsdl SquareOut square_pkg._squareresponse square.wsdl SquareIn square_pkg._square square.wsdl CalculateFibonacciOut fibonacci._calculatefibonacciresponse fib.wsdl CalculateFibonacciIn fibonacci._calculatefibonacci fib.wsdl Variable2 java.lang.integer nofile Variable1 java.lang.integer nofile Variables section ended... Found CreaterandomIn in variableslist in position (starting from 0) 3 Found CreaterandomOut in variableslist in position (starting from 0) 0 Finding class createrandom_pkg.createrandomservicelocator: Class loaded successfully Calling 109

110 Beginning to transmit... Please wait... Invoke returned=8 Type of variable to pass is of:int and method's name is setcreaterandomreturn Invoke ending... Invoke with nameinvoke6 section ended... Going to child(from assign) Found CreaterandomOut in variableslist in position (starting from 0) 0 Found SquareIn in variableslist in position (starting from 0) 9 Assign says that those two variables have the same amount of parts... so gonna copy them Method's name is getcreaterandomreturn Type of variable to pass is of:int and method's name is setin0 8 Ended with assign command Going to children (from flow with name Flow1) Got from flow index number 185 and filelocation:./services/testcase3.bak.bpel Found index with number 185 so I'm gonna stop. Trying to wait for them to stop Going to children (from sequence with name FlowSequence) Found SquareIn in variableslist in position (starting from 0) 9 Found SquareOut in variableslist in position (starting from 0) 6 Finding class square_pkg.squareservicelocator: Class loaded successfully Calling Beginning to transmit... Please wait... Invoke returned=64 Type of variable to pass is of:int and method's name is setsquarereturn Invoke ending... Invoke with nameinvoke5 section ended... Going to child(from assign) Found SquareOut in variableslist in position (starting from 0) 6 Found SquareIn in variableslist in position (starting from 0) 9 Assign says that those two variables have the same amount of parts... so gonna copy them Method's name is getsquarereturn Type of variable to pass is of:int and method's name is setin0 64 Ended with assign command Found SquareIn in variableslist in position (starting from 0) 9 Found SquareOut in variableslist in position (starting from 0) 6 Finding class square_pkg.squareservicelocator: Class loaded successfully Calling Beginning to transmit

111 Please wait... Invoke returned=4096 Type of variable to pass is of:int and method's name is setsquarereturn Invoke ending... Invoke with nameinvoke5 section ended... Και όντως η 4 η δύναμη του 8 είναι το Αξίζει να σημειωθεί ότι, για να υπάρχει συμβατότητα μεταξύ των εργαλείων που χρησιμοποιήθηκαν, έπρεπε να χρησιμοποιηθεί η έκδοση 1.4 της java, γεγονός που όταν εκτελείται σε 1.6 περιβάλλον, εγείρει προειδοποιητικά μηνύματα. Στο παράρτημα φαίνεται ο κώδικας της υλοποίησής μας. 111

112 Παράρτημα Α Ο κώδικας της αρχικού java αρχείου, το οποίο αναλαμβάνει να ανοίγει το αρχείο και να μετακινεί τον κέρσορα κατά ένα στοιχείο κάθε φορά, είναι: import java.util.arraylist; import java.util.list; import java.util.concurrent.callable; import java.util.concurrent.executorservice; import java.util.concurrent.executors; import java.util.concurrent.future; import com.ximpleware.*; public class ReadBpel { static List <Object> variableslist=new ArrayList(); //it is the List that will hold any variable that is going to be used in the whole process static List <Object> receivelist=new ArrayList(); //it is the List that awaits for objects to be returned static List <String> namespacesresolved=new ArrayList(); public static void main(string[] args) throws Exception{ String filelocation=""; boolean filehasnamespaces=true; if (args.length==3){ filelocation=args[0]+args[1]; if (args[2].equalsignorecase("true")) filehasnamespaces=true; else filehasnamespaces=false; else { System.out.println(args.length+"Usage: Readbpel (BPEL file location) (BPEL has namespaces:type true or anything else for false)\n"); System.exit(1); VTDGen vg = new VTDGen(); // declarexpathnamespace associates name space with a prefix //ap.declarexpathnamespace(namespace,namespaceuri);//"xsd","ht tp:// /* File temp=new File(filelocation); System.out.println("File exists:"+temp.exists()); System.out.println(vg.parseFile("./bin/SynchronousSample.bpel", true));*/ if (vg.parsefile(filelocation, filehasnamespaces)){ //"./src/synchronoussample.wsdl","true" VTDNav vn = vg.getnav(); AutoPilot ap = new AutoPilot(vn); try { ap.selectxpath("/process");//found the root element // AutoPilot moves the cursor for you, as it returns the index value of the qualified node 112

113 if (ap.evalxpath()!=-1){ //means that it found a process element and moves the autopilot there System.out.println("outer Element name ==> " +vn.tostring(vn.getcurrentindex()) ); vn.toelement(vtdnav.first_child);//go to the first child so as to start the parsing of the program //begin iteration do { final ExecutorService execsvc1 = Executors.newFixedThreadPool(30); Callable<String> executioncallable1 = new runlogic(vn, args[0], args[1], filehasnamespaces); //go to runlogic function where each tag of the sequence is processed Future<String> future1 = execsvc1.submit(executioncallable1); future1.get(); while (vn.toelement(vtdnav.next_sibling)); System.exit(0); catch (Exception e) { System.out.println("XPathParseException");// in case something went wrong in XPATH e.printstacktrace(); else { System.out.println("File could not be parsed! Probably not a true bpel file (e.g. bad tagging)! \n"); ; public static void sendreceive(string operation, Object object){ receivelist.add(operation); //the name of the operation receivelist.add(object); //the variable that has been sent back Στην συνέχεια ακολουθεί ο πυρήνας του προγράμματος, το οποίο υλοποιεί κάθε στοιχείο, η runlogic.java import java.util.arraylist; import java.util.arrays; import java.util.date; import java.util.gregoriancalendar; import java.util.list; import java.util.locale; import java.util.timezone; import java.util.concurrent.callable; import java.util.concurrent.executionexception; import java.util.concurrent.executorservice; 113

114 import java.util.concurrent.executors; import java.util.concurrent.future; import java.util.concurrent.futuretask; import java.util.concurrent.linkedblockingqueue; import java.util.concurrent.threadfactory; import java.util.concurrent.threadpoolexecutor; import java.util.concurrent.timeunit; import java.io.file; import java.lang.long; import java.lang.reflect.invocationtargetexception; import java.lang.reflect.method; import java.net.malformedurlexception; import java.net.url; import java.net.urlclassloader; import java.util.calendar; import javax.xml.datatype.datatypeconfigurationexception; import javax.xml.datatype.datatypefactory; import javax.xml.namespace.qname; import org.apache.axis.client.call; import org.apache.axis.client.service; import sun.util.resources.calendardata_el; import wsdl2java.createwsdl2javafiles; import bpelactionscontrol.documentation; import bpelactionscontrol.invoke; import com.ximpleware.autopilot; import com.ximpleware.navexception; import com.ximpleware.pilotexception; import com.ximpleware.vtdgen; import com.ximpleware.vtdnav; class runlogic implements Callable <String>{ int curindex; VTDNav temp; VTDGen vg3 = new VTDGen(); String filefolder, filename, filelocation; boolean filehasnamespaces; VTDGen vg = new VTDGen(); //in case some one needs it (like invoke or receive) //TO-DO perhaps this list should be accessed by ReadBpel because it is that has the responsibility to go to the next node... so I don;t want it to create another list each time... or does it not create another child? static List <String> namespacesresolved=new ArrayList(); List <String> namespacesresolved2=new ArrayList(); static List <Object> variableslist=new ArrayList(); 114

115 static List <Object> receivelist=new ArrayList(); //1st constructor public runlogic(vtdnav temp, String filefolder, String filename, boolean filehasnamespaces){ this.temp=temp; this.filefolder=filefolder; this.filename=filename; this.filehasnamespaces=filehasnamespaces; filelocation=filefolder+filename; //2nd constructor //needed for flow command //needed for concurrency as one cannot take the pointer and alter it, cause they all share one common pointer in the previous way, so changing it would result in chaotic results public runlogic(int curindex, String filefolder, String filename, boolean filehasnamespaces) throws PilotException, NavException{ this.curindex=curindex; this.filename=filename; this.filefolder=filefolder; filelocation=filefolder+filename; this.filehasnamespaces=filehasnamespaces; System.out.println("Got from flow index number "+this.curindex+ " and filelocation:"+ this.filelocation); // System.out.println("Found flow with int index "+ curindex+ " so I'm gonna attempt to start a new navigator from there..."); if (vg3.parsefile(filelocation, filehasnamespaces)){ //"./src/synchronoussample.wsdl","true" VTDNav vnena=vg3.getnav(); //problem because there can be only one! AutoPilot apena = new AutoPilot(vnena); // ap is going to move the cursor apena.selectelement("*"); // select every element (* matches all strings) while(vnena.getcurrentindex()!=this.curindex) // iterate will iterate thru all elements { apena.iterate(); temp=vnena; System.out.println("Found index with number "+temp.getcurrentindex()+" so I'm gonna stop."); // System.out.println("Done. Starting a new navigator from index"+temp.getcurrentindex()); else { System.out.println("Could not parse file: "+this.filelocation); 115

116 public String call() throws IllegalAccessException, InstantiationException, MalformedURLException, ClassNotFoundException{ try { //NOTE TO SELF:: Multiple ifs not good, better is else if, even better the switch/case(which probably can be done via enumeration?!!!! // //import if (temp.matchelement("import")){ //finished! ThreadPoolExecutor threadpool = new ThreadPoolExecutor(5,5, 50000L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(), new PoolHandlerFactory()); final ExecutorService execsvc = Executors.newFixedThreadPool(1); ArrayList<FutureTask> t = new ArrayList<FutureTask>(); //so, for every import I will give it an FutureTask so as to perform simultaneously do { String attrnamespace=temp.tonormalizedstring(temp.getattrval("namespace")) ; String attrlocation=temp.tonormalizedstring(temp.getattrval("location")); String attrimporttype=temp.tonormalizedstring(temp.getattrval("importtype" )); if (attrimporttype.equalsignorecase(" )){ t.add(new FutureTask<String> (new createwsdl2javafiles(filefolder+attrlocation))); // Create the classes in their respective location); while (temp.toelement(vtdnav.next_sibling) && temp.matchelement("import")); //starting to parallelize the threads for (int i = 0; i < t.size(); i++) { threadpool.execute(t.get(i)); 116

117 for (int i = 0; i < t.size(); i++) { try{ System.out.println("Trying to wait for the wsdl2java procedure to stop"); t.get(i).get(); catch (InterruptedException ee) { catch (ExecutionException e) { // TODO Auto-generated catch block e.printstacktrace(); t.clear(); // else if (temp.matchelement("variables")){ //almost done --in case of three attributes I'm not sure if it is correct Thread.sleep(2000); if(temp.toelement(vtdnav.first_child)){ String wheretolook="",whatvariabletolook="", filetolook="", classtoload="", almostreadyclass="", almostthere[]; // ThreadPoolExecutor threadpool = new ThreadPoolExecutor(5,5, 50000L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(), new PoolHandlerFactory()); // final ExecutorService execsvc = Executors.newFixedThreadPool(1); // ArrayList<FutureTask> t = new ArrayList<FutureTask>(); Class var1 = null, var2 = null, var3 = null; do { String attrname=temp.tonormalizedstring(temp.getattrval("name")); int attrcount=temp.getattrcount(); switch (attrcount){ case 2: { if (temp.getattrval("type")!=-1){ //if there is no such element throws back an -1 String attrtype=temp.tonormalizedstring(temp.getattrval("type")); //e. g. <variable name="uploadopres" type="xsd:anytype"/> // t.add(new FutureTask<Object> (new Variables2Objects(attrname, attrtype))); variableslist.add(attrname); if 117

118 (attrtype.equalsignorecase("xsd:int")){ classvariable = 0; variableslist.add(classvariable); (attrtype.equalsignorecase("xsd:long")){ classvariable = 0; variableslist.add(classvariable); (attrtype.equalsignorecase("xsd:short")){ classvariable = 0;//short typeclass; variableslist.add(classvariable); (attrtype.equalsignorecase("xsd:float")){ classvariable = 0;//float typeclass; variableslist.add(classvariable); (attrtype.equalsignorecase("xsd:double")){ classvariable = 0;//double typeclass; variableslist.add(classvariable); (attrtype.equalsignorecase("xsd:boolean")){ classvariable = false;//boolean typeclass; variableslist.add(classvariable); (attrtype.equalsignorecase("xsd:byte")){ classvariable = 0;//byte typeclass; variableslist.add(classvariable); xsd2type(attrtype); classvariable = var.newinstance(); int else if else if else if else if else if else if long short float double boolean byte else { Class var = Object 118

119 variableslist.add(classvariable); variableslist.add("nofile"); that it will pass cases 3-5 break; //means if (temp.getattrval("messagetype")!=-1){ String attrmtype=temp.tonormalizedstring(temp.getattrval("messagetype")); //find where to look for the operation from the process attribute String[] tokenize = attrmtype.split(":"); if (tokenize.length==2){ //means that it has 2 tokens, one of the namespace and one of the porttype whatvariabletolook=tokenize[1]; //resolve namespace from variable and see what connection has with <process> for (int i=0; i<namespacesresolved.size(); i+=2){ //namespacesresolved has in every *second* line the namespace(impl) and in every other line the location of the namespace (e.g. "urn:fibonacci"). That is normally located as an attribute to the "process" child if (tokenize[0].equals(namespacesresolved.get(i))){ //xmlns:impl from tag wheretolook=namespacesresolved.get(i+1); urn:fibonacci from process //e.g. break; //found it so it will quit for loop ; if (wheretolook.isempty()){ //if previous for loop didn't give any result from the list where we keep all current namespaces if (vg.parsefile(filelocation, false)){ //false:do not separate namespaces VTDNav vn = vg.getnav(); { AutoPilot ap = new AutoPilot(vn); try 119

120 ap.selectxpath("/process");// // AutoPilot moves the cursor for you, as it returns the index value of the qualified node if (ap.evalxpath()!=-1){ sequence and moves the autopilot there //means that it found a if (vn.getattrval("xmlns:"+tokenize[0])!=-1){ //means that there is a valid namepsace in process wheretolook=vn.tonormalizedstring(vn.getattrval("xmlns:"+tokenize[0 ])); //e.g. "impl" namespacesresolved.add(tokenize[0]); namespacesresolved.add(wheretolook); //e.g. "urn:fibonacci" else System.out.println("Did not find "+ tokenize[0] +" from the variables section to the process section"); catch(exception e) { System.out.println("XPathParseException");// in case something went wrong in XPATH else { e.printstacktrace(); System.out.println("Could not open file..."); //I've got the namespace connection from the variable=>process, now I'm gonna find the connection from process=>import and see what file it corresponds to String [] location = wheretolook.split(":"); //location[0]==urn and location[1]==fibonacci if 120

121 (location[0].equalsignorecase("http")){ //TO-DO... this is the case that the process gives back an http link else { //resolve namespace from import and see what connection has with a file for (int i=0; i<namespacesresolved2.size(); i+=2){ //namespacesresolved2 has in every *second* line the namespace(process) and in every other line the file which it corresponds to (e.g. "urn:fibonacci=>fib.wsdl") if (wheretolook.equals(namespacesresolved2.get(i))){ //e.g wheretolook=urn:fibonacci filetolook=namespacesresolved2.get(i+1); from import //e.g. fib.wsdl break; (filetolook.isempty()){ //found it so it will quit for loop (vg.parsefile(filelocation, false)){ separate namespaces VTDNav vn = vg.getnav(); ; if if //false:do not { AutoPilot ap = new AutoPilot(vn); ap.selectxpath("/process/import");// try // AutoPilot moves the cursor for you, as it returns the index value of the qualified node if (ap.evalxpath()!=-1){ sequence and moves the autopilot there //means that it found a do { if (vn.getattrval("namespace")!=-1){ //means that there is a valid namespace in import if (vn.tonormalizedstring(vn.getattrval("namespace")).matches(wheretol ook)){ filetolook=vn.tonormalizedstring(vn.getattrval("location")); 121

122 namespacesresolved2.add(wheretolook); namespacesresolved2.add(filetolook); while (vn.toelement(vtdnav.next_sibling)); /*if (vn.getattrval("xmlns:"+tokenize[0])!=-1){ //means that there is a valid namespace in process filetolook=vn.tonormalizedstring(vn.getattrval("xmlns:"+tokenize[0] )); */ namespacesresolved2.add(tokenize[0]); namespacesresolved2.add(wheretolook); /*else if (vn.getattrval("namespace")!=-1){ //means that there is a valid namespace in process wheretolook=vn.tonormalizedstring(vn.getattrval("namespace")); found in "); System.out.println("Test case... Variable id namespacesresolved.add(tokenize[0]); namespacesresolved.add(wheretolook); else { */ System.out.println("Could not find from import the link to filelocation"); catch(exception e) { 122

123 System.out.println("XPathParseException");// in case something went wrong in XPATH else { e.printstacktrace(); System.out.println("Could not open file..."); System.out.println("So far I've got filetolook:./services/"+filetolook+", class before the one to look: "+tokenize[1]); //opening file so as to find the right class to load, usually it has the same name but there are times that this is not the case (see fib.wsdl and calculatefibonaccirequest example -> the class to load is not calculatefibonaccirequest but calculate Fibonacci if (vg.parsefile("./services/"+filetolook, false)){ //false:do not separate namespaces VTDNav vn = vg.getnav(); ap = new AutoPilot(vn); AutoPilot try { ap.selectxpath("/definitions/message");// // AutoPilot moves the cursor for you, as it returns the index value of the qualified node if (ap.evalxpath()!=-1){ and moves the autopilot there //means that it found a message do { if (vn.getattrval("name")!=-1){ there is a valid namespace in import //means that if (vn.tonormalizedstring(vn.getattrval("name")).matches(tokenize[1])) { if (vn.toelement(vtdnav.first_child)){ 123

124 almostreadyclass=vn.tonormalizedstring(vn.getattrval("element")); almostthere=almostreadyclass.split(":"); if (almostthere[0].equalsignorecase(tokenize[0])) { classtoload=almostthere[1]; retolook); etolook); //classesfromvariablesresolved.add(whe //classesfromvariablesresolved.add(fil vn.toelement(vtdnav.parent); //break; check the rest messages //found the one so no need to else { while (vn.toelement(vtdnav.next_sibling)); System.out.println("Could not find from import the link to filelocation"); catch(exception e) { System.out.println("XPathParseException");// in case something went wrong in XPATH e.printstacktrace(); else { System.out.println("Could not open file./services/"+filetolook); 124

125 System.out.println("Found where I'm supposed to look "+location[1]+"._"+classtoload+" and gonna load it dynamically."); currentdir = System.getProperty("user.dir"); outputdir = new File(currentdir); = new URL[]{outputdir.toURI().toURL(); String File URL[] urls ClassLoader cl = runlogic.class.getclassloader(); null) { System.out.println("Finding class"); stem.out.println("default ClassLoader : " + cl); if (cl!= //Sy URLClassLoader ucl = new URLClassLoader(urls, cl); temp=new File("./"+location[1]+"/_"+classtoload+".class"); (temp.exists()){ = ucl.loadclass(location[1]+"._"+classtoload); = ucl.loadclass(location[1]+"_pkg._"+classtoload); if File var1 else{ var1 System.out.println(var1.getName()+ ": Class loaded successfully"); Class.forName(location[1]+"._"+classtoload/*, true, Thread.currentThread().getContextClassLoader()*/); //var1 = Object classvariable = var1.newinstance(); //list that holds in every odd line the name and in every even line the class object... variableslist.add(attrname); variableslist.add(classvariable); variableslist.add(filetolook); 125

126 break; //it was case 2 so there is no point looking for the rest. //perhaps this needs alteration, it must take the xmlns:impl from the same field and not from the process=>import... case 3:{ if (temp.getattrval("type")!=-1){ //if there is no such element throws back an -1 String attrtype=temp.tonormalizedstring(temp.getattrval("type")); //e. g. <variable name="uploadopres" type="xsd:anytype"/> if (temp.getattrval("xsi:nillable")!=-1) if (temp.tonormalizedstring(temp.getattrval("xsi:nillable")).equals("t rue")){ Class var=xsd2type(attrtype+" xsi:nillable=true"); Object classvariable= var.newinstance(); break; //means that it will pass cases 4-5 if (temp.getattrval("messagetype")!=-1){ String attrmtype=temp.tonormalizedstring(temp.getattrval("messagetype")); //find where to look for the operation from the process attribute String[] tokenize = attrmtype.split(":"); if (tokenize.length==2){ //means that it has 2 tokens, one of the namespace and one of the name of the variable whatvariabletolook=tokenize[1]; there is an override for the namespace (temp.getattrval("xmlns:"+tokenize[0])!=-1){ //check if if wheretolook = temp.tonormalizedstring(temp.getattrval("xmlns:"+tokenize[0])); //otherwis e take the usual route 126

127 //I've got the namespace connection from the variable=>import, now I'm gonna find the connection from process=>import and see what file it corresponds to String [] location = wheretolook.split(":"); //location[0]==urn and location[1]==fibonacci System.out.println(wheretolook); if (location[0].equalsignorecase("http")){ //TO-DO... this is the case that the process gives back an http link else { if (vg.parsefile(filelocation, false)){ //false:do not separate namespaces VTDNav vn = vg.getnav(); { AutoPilot ap = new AutoPilot(vn); ap.selectxpath("/process/import");// try // AutoPilot moves the cursor for you, as it returns the index value of the qualified node if (ap.evalxpath()!=-1){ sequence and moves the autopilot there //means that it found a do { if (vn.getattrval("namespace")!=-1){ //means that there is a valid namespace in import if (vn.tonormalizedstring(vn.getattrval("namespace")).matches(wheretol ook)){ filetolook=vn.tonormalizedstring(vn.getattrval("location")); namespacesresolved2.add(wheretolook); namespacesresolved2.add(filetolook); 127

128 while (vn.toelement(vtdnav.next_sibling)); else { System.out.println("Could not find from import the link to filelocation"); catch(exception e) { System.out.println("XPathParseException");// in case something went wrong in XPATH else { e.printstacktrace(); System.out.println("Could not open file..."); System.out.println("So far I've got filetolook:./services/"+filetolook+", class before the one to look: "+tokenize[1]); //opening file so as to find the right class to load, usually it has the same name but there are times that this is not the case (see fib.wsdl and calculatefibonaccirequest example -> the class to load is not calculatefibonaccirequest but calculate Fibonacci if (vg.parsefile("./services/"+filetolook, false)){ //false:do not separate namespaces VTDNav vn = vg.getnav(); ap = new AutoPilot(vn); AutoPilot try { ap.selectxpath("/definitions/message");// // AutoPilot moves the cursor for you, as it returns the index value of the qualified node 128

129 if (ap.evalxpath()!=-1){ and moves the autopilot there //means that it found a message do { if (vn.getattrval("name")!=-1){ there is a valid namespace in import //means that if (vn.tonormalizedstring(vn.getattrval("name")).matches(tokenize[1])) { if (vn.toelement(vtdnav.first_child)){ almostreadyclass=vn.tonormalizedstring(vn.getattrval("element")); almostthere=almostreadyclass.split(":"); if (almostthere[0].equalsignorecase(tokenize[0])) { classtoload=almostthere[1]; retolook); etolook); //classesfromvariablesresolved.add(whe //classesfromvariablesresolved.add(fil vn.toelement(vtdnav.parent); //break; check the rest messages //found the one so no need to else { while (vn.toelement(vtdnav.next_sibling)); System.out.println("Could not find from import the link to filelocation"); 129

130 catch(exception e) { System.out.println("XPathParseException");// in case something went wrong in XPATH e.printstacktrace(); System.out.println("Could not open file./services/"+filetolook); else { System.out.println("Found where I'm supposed to look "+location[1]+"._"+classtoload+" and gonna load it dynamically."); currentdir = System.getProperty("user.dir"); outputdir = new File(currentdir); = new URL[]{outputdir.toURI().toURL(); String File URL[] urls ClassLoader cl = runlogic.class.getclassloader(); null) { System.out.println("Finding class"); stem.out.println("default ClassLoader : " + cl); if (cl!= //Sy URLClassLoader ucl = new URLClassLoader(urls, cl); temp=new File("./"+location[1]+"/_"+classtoload+".class"); (temp.exists()){ = ucl.loadclass(location[1]+"._"+classtoload); = ucl.loadclass(location[1]+"_pkg._"+classtoload); if File var1 else{ var1 System.out.println(var1.getName()+ ": Class loaded successfully"); //var1 = 130

131 Class.forName(location[1]+"._"+classtoload/*, true, Thread.currentThread().getContextClassLoader()*/); Object classvariable = var1.newinstance(); //list that holds in every odd line the name and in every even line the class object... variableslist.add(attrname); variableslist.add(classvariable); variableslist.add(filetolook); case 3 so there is no point looking for the rest. break; //it was default:system.out.println("don't know what to do with such variable..."); while (temp.toelement(vtdnav.next_sibling) && temp.matchelement("variable")); temp.toelement(vtdnav.parent); for (int i=0; i<variableslist.size(); i+=3){ //variableslist has in every even line the Class Object and in every odd the name of The Class System.out.print(variablesList.get(i)+"\t"); System.out.print(variablesList.get(i+1).getClass().getName() +"\t"); System.out.println(variablesList.get(i+2)); ; System.out.println("Variables section ended...\n\n\n\n"); // //invoke //else if 131

132 (temp.matchrawtokenstring(temp.getcurrentindex(), "invoke")) else if (temp.matchelement("invoke")) { int invoke1=6; // invoke without using classes, just by opening the wsdl file and reading the bpel file if (invoke1==1){ String attrname=temp.tonormalizedstring(temp.getattrval("name")); String attrpartnerlink=temp.tonormalizedstring(temp.getattrval("partnerlin k")); String attroperation=temp.tonormalizedstring(temp.getattrval("operation")) ; String attrporttype=temp.tonormalizedstring(temp.getattrval("porttype")); String wheretolook="", templook="", templook2=""; false)){ AutoPilot(vn); try { if (vg.parsefile(filelocation, VTDNav vn = vg.getnav(); AutoPilot ap = new ap.selectxpath("/process/partnerlinks/partnerlink"); // AutoPilot moves the cursor for you, as it returns the index value of the qualified node if (ap.evalxpath()!=-1){ //means that it found a sequence and moves the autopilot there do{ if (vn.tonormalizedstring(vn.getattrval("name")).equals(attrpartnerlin k)){ templook=vn.tonormalizedstring(vn.getattrval("xmlns:impl")); break; while (vn.toelement(vtdnav.next_sibling)); // System.out.println("Found it:"+templook+"\t in: "+attrpartnerlink); if (!templook.equals("")){ ap.selectxpath("/process/import"); if (ap.evalxpath()!=- 1){ //means that it found a sequence and moves the autopilot 132

133 there do{ if (vn.tonormalizedstring(vn.getattrval("namespace")).equals(templook) ){ templook2=vn.tonormalizedstring(vn.getattrval("location")); break; (vn.toelement(vtdnav.next_sibling)); // System.out.println("Found it:"+templook2); while if (vg.parsefile(filefolder+templook2, false)){ VTDNav vn = vg.getnav(); AutoPilot ap = new AutoPilot(vn); ap.selectxpath("/definitions/service/port"); if (ap.evalxpath()!=-1){ if (vn.toelement(vtdnav.fc)){ wheretolook=vn.tonormalizedstring(vn.getattrval("location")); else{ System.out.println("Can't find the (wsdlsoap:address) of wsdl file"); else{ System.out.println("Can't find the path.../definitions/service/port"); catch(exception e) { System.out.println("XPathParseException");// in case something went wrong in XPATH e.printstacktrace(); //find where to look for the operation from the process attribute /* String[] tokenize = attrporttype.split(":"); if (tokenize.length==2){ //means 133

134 that is has 2 tokens, one of the namespace and one of the porttype try { (vg.parsefile(filelocation, false)){ vg.getnav(); AutoPilot(vn); if VTDNav vn = AutoPilot ap = new ap.selectxpath("/process");//"/definitions/types/xsd:schema/xsd:imp ort" // AutoPilot moves the cursor for you, as it returns the index value of the qualified node if (ap.evalxpath()!=- 1){ //means that it found a sequence and moves the autopilot there wheretolook=vn.tonormalizedstring(vn.getattrval("xmlns:"+tokenize[0 ])); catch(exception e) { System.out.println("XPathParseException");// in case something went wrong in XPATH e.printstacktrace(); */ int object0=15; final ExecutorService execsvc = Executors.newFixedThreadPool(3); Callable<String> executioncallable = new invoke(attrname, attrpartnerlink, attroperation, attrporttype, wheretolook, object0); Future<?> future = execsvc.submit(executioncallable); future.get(); //not sure if it has children...well it may have documentation if(temp.toelement(vtdnav.first_child)){ //goes into children System.out.println("Going to child(from invoke)"); do { final ExecutorService execsvc1 = Executors.newFixedThreadPool(3); Callable<String> executioncallable1 = new runlogic(temp,filefolder, filename, 134

135 filehasnamespaces); Future<?> future1 = execsvc1.submit(executioncallable1); future1.get(); while (temp.toelement(vtdnav.next_sibling)); temp.toelement(vtdnav.parent); //returns from children to continue with the workflow System.out.println("exiting from invoke with "+attrporttype); // invoke using classes else { String inputvariable=temp.tonormalizedstring(temp.getattrval("inputvariabl e")); String outputvariable=temp.tonormalizedstring(temp.getattrval("outputvaria ble")); String attrname=temp.tonormalizedstring(temp.getattrval("name")); String attrpartnerlink=temp.tonormalizedstring(temp.getattrval("partnerlin k")); String attroperation=temp.tonormalizedstring(temp.getattrval("operation")) ; String attrporttype=temp.tonormalizedstring(temp.getattrval("porttype")); String attrxmlns=""; if (temp.getattrval("xmlns:impl")!=-1) attrxmlns=temp.tonormalizedstring(temp.getattrval("xmlns:impl")); String wheretolook="", templook="", templook2="", nameofservice=""; Class var1=null, var2=null, var3=null, var4=null; int k=-1,m=-1,p=0,n=0,nm=-1; List<String> inputlist=new ArrayList(), outputlist=new ArrayList(); try { for (int i=0; i<variableslist.size(); i=i+3){ if (variableslist.get(i).equals(inputvariable)){ k=i; it found that variable //store where System.out.println("Found "+ inputvariable+ " in 135

136 variableslist in position (starting from 0) "+k); break; for (int i=0; i<variableslist.size(); i=i+3){ if (variableslist.get(i).equals(outputvariable)){ m=i; //store where it found that variable System.out.println("Found "+ outputvariable+ " in variableslist in position (starting from 0) "+m); break; String classpath1[]; if (attrxmlns.equals("")){ String classpath0[]=attrporttype.split(":"); System.out.println("There is no xmlns:impl attribute so gonna search from the List"); for (int i=0; i<namespacesresolved.size(); i+=2){ //namespacesresolved has in every *second* line the namespace(impl) and in every other line the location of the namespace (e.g. "urn:fibonacci"). That is normally located as an attribute to the "process" child if (classpath0[0].equals(namespacesresolved.get(i))){ //xmlns:impl from process String nameofservice2[]=((string) namespacesresolved.get(i+1)).split(":"); //e.g. urn:fibonacci from process nameofservice=nameofservice2[1]; System.out.println(nameofservice); nm=i; break; //found it so it will quit for loop else{ String classpath0[]=attrxmlns.split(":"); nameofservice=classpath0[1]; String nameofservice1[]=attrporttype.split(":"); 136 // get paths to be used for

137 loading /*ClassLoader base = ClassLoader.getSystemClassLoader(); URL[] urls; if (base instanceof URLClassLoader) { urls = new URL[]{ new File(".").toURI().toURL() ; else { urls = ((URLClassLoader)base).getURLs(); paths:"); // list the paths actually being used System.out.println("Loading from for (int i = 0; i < urls.length; i++) { System.out.println(" " + urls[i]); //or */ File outputdir = new File(System.getProperty("user.dir")); URL[] urls = new URL[] {outputdir.touri().tourl(); ClassLoader cl = runlogic.class.getclassloader(); System.out.println("Finding class"); if (cl!= null) { //System.out.println("Defau lt ClassLoader : " + cl); URLClassLoader ucl = new URLClassLoader(urls, cl); File temp=new File("./"+nameofservice+"/"+nameOfService1[1]+"ServiceLocator.class "); if (temp.exists()){ var2 = ucl.loadclass(nameofservice+"."+nameofservice1[1]+"servicelocator") ; else{ var2 = ucl.loadclass(nameofservice+"_pkg."+nameofservice1[1]+"servicelocat or"); System.out.println(var2.getName()+ ": Class loaded successfully"); //var1 = Class.forName(location[1]+"._"+classtoload, true, 137

138 Thread.currentThread().getContextClassLoader()); Object locateuri = var2.newinstance(); if (vg.parsefile("./services/"+variableslist.get(k+2), false)){ //false:do not separate namespaces. it goes into the wsdl file to make a match //System.out.println("Got into "+"./services/"+variableslist.get(k+2)+ " file"); VTDNav vn = vg.getnav(); AutoPilot ap = new AutoPilot(vn); try { ap.selectxpath("/definitions"); // AutoPilot moves the cursor for you, as it returns the index value of the qualified node if (ap.evalxpath()!=- 1){ //means that it found a message and moves the autopilot there vn.toelement(vtdnav.first_child);//go to wsdl vn.toelement(vtdnav.first_child);//go to schema vn.toelement(vtdnav.first_child);//go to element do { if (vn.getattrval("name")!=-1){ //means that there is a valid name String[] toseeifitmatchesinput= (variableslist.get(k+1).getclass().getname()).split("_"); String[] toseeifitmatchesoutput= (variableslist.get(m+1).getclass().getname()).split("_"); int lastofoutputlist=toseeifitmatchesoutput.length-1;//if we had a _pkg in the name of the wsdl2java files then ther would be a problem, so we are trying to resolve the last one anyway int lastofinputlist=toseeifitmatchesinput.length-1; if (vn.tonormalizedstring(vn.getattrval("name")).matches(toseeifitmatc hesinput[lastofinputlist])){ vn.toelement(vtdnav.first_child);//complextype vn.toelement(vtdnav.first_child);//sequence vn.toelement(vtdnav.first_child);//element 138 do{

139 inputlist.add(vn.tonormalizedstring(vn.getattrval("name"))); //System.out.println(vn.toNormalizedString(vn.getAttrVa l("name"))); inputlist.add(vn.tonormalizedstring(vn.getattrval("type"))); //System.out.println(vn.toNormalizedString(vn.getAttrVa l("type"))); p++; //p stores the number of the parts in a variable while (vn.toelement(vtdnav.next_sibling)); vn.toelement(vtdnav.parent);//go to sequence vn.toelement(vtdnav.parent);//go to complextype vn.toelement(vtdnav.parent);//go to element if (vn.tonormalizedstring(vn.getattrval("name")).matches(toseeifitmatc hesoutput[lastofoutputlist])){ vn.toelement(vtdnav.first_child);//complextype vn.toelement(vtdnav.first_child);//sequence vn.toelement(vtdnav.first_child);//element do{ outputlist.add(vn.tonormalizedstring(vn.getattrval("name"))); //System.out.println(vn.toNormalizedString(vn.getAttrVa l("name"))); outputlist.add(vn.tonormalizedstring(vn.getattrval("type"))); //System.out.println(vn.toNormalizedString(vn.getAttrVa l("type"))); n++; //n stores the number of the parts in a variable while (vn.toelement(vtdnav.next_sibling)); 139

140 vn.toelement(vtdnav.parent);//go to sequence vn.toelement(vtdnav.parent);//go to complextype vn.toelement(vtdnav.parent);//go to element (vn.toelement(vtdnav.next_sibling)); while else { System.out.println("Could not autopilot to the element"); catch(exception e) { System.out.println("XPathParseException");// in case something went wrong in XPATH e.printstacktrace(); else { System.out.println("Could not open file./services/"+variableslist.get(k+2)); //Trying to make the Object List that will be the input of the invoke method Object[] inputobjectlist=new Object[inputList.size()/2]; Object[] outputobjectlist=new Object[outputList.size()/2]; for (int i=0; i<inputlist.size(); i=i+2){ int tempi = i / 2; //System.out.println(tempi) ; String methodtocall= inputlist.get(i).substring(0, 1).toUpperCase() + inputlist.get(i).substring(1)/*.tolowercase()*/; Method methoduri = (variableslist.get(k+1).getclass()).getmethod("get"+methodtocall, null); //getin0(null) =>getmethod(methodname, param1.class, param2.class,..); inputobjectlist[tempi]=methoduri.invoke(variableslist.get(k+1), null); //method.invoke (objecttoinvokeon, params) //objecttoinvokeon is of type Object and is the object you want to invoke the method on "method name" is the name of the method you want to call //----method invoking#1----// //Method methoduri= 140

141 cl2.getmethod("getfibonacciaddress", java.lang.string.class ); Method methoduri= var2.getmethod("get"+nameofservice+"address", null ); //getfibonacciaddress(null) String endpoint = (String) methoduri.invoke(locateuri, null); System.out.println("Calling "+endpoint); Service service = new Service(); Call call = (Call) service.createcall(); call.setoperationname(new QName(endpoint, attroperation)); call.settargetendpointaddress( new java.net.url(endpoint)); System.out.println("Beginning to transmit..."); e()); /*System.out.println(variablesList.get(k+1).getClass().getNam {(variableslist.get(k+1)); Object tester = new Object[] System.out.println(tester.getClass().getName());*/ Object returnvar = call.invoke(inputobjectlist); //works with this one //int returnvar = (Integer) call.invoke(new Object[]{(10)) ; //int ret=new Integer(returnvar); System.out.println("Please wait..."); System.out.println("Invoke returned=" + returnvar); //beginning to saving to the right variable... for (int i=0; i<outputlist.size(); i=i+2){ int tempi = i / 2; //System.out.println(tempi) ; String methodtocall = outputlist.get(i).substring(0, 1).toUpperCase() + outputlist.get(i).substring(1); //outputlist.get(i).substring(1).tolowercase() Class methodtype = xsd2type(outputlist.get(i+1)); System.out.println("Type of variable to pass is of:" +methodtype.getname()+" and method's name is set"+ methodtocall); 141

142 //Thread.sleep(2000); methoduri = (variableslist.get(m+1).getclass()).getmethod("set"+methodtocall, methodtype); //setin0(int) =>getmethod(methodname, param1.class, param2.class,..); methoduri.invoke(variableslist.get(m+1), returnvar); //method.invoke (objecttoinvokeon, params) //objecttoinvokeon is of type Object and is the object you want to invoke the method on "method name" is the name of the method you want to call System.out.println("Invoke ending..."); k=m=-1; catch (Exception e){ e.printstacktrace(); System.out.println("Invoke with name"+ attrname +" section ended...\n\n"); // //assign => almost done... nedd to fix not only copy parts but whole variables else if (temp.matchelement("assign")) { String attrname=""; if (temp.getattrval("name")==-1) { attrname= temp.tonormalizedstring(temp.getattrval("name")); ArrayList(); ArrayList(); int n=0; List<String> outputlist=new List<String> inputlist=new inputlist.clear(); outputlist.clear(); String fromtype="", totype=""; int fromnumber=0, tonumber=0; String attname=temp.tonormalizedstring(temp.getattrval("name")); Class<?> var1=null, var2=null; { //goes into copy child 142 if(temp.toelement(vtdnav.first_child)) System.out.println("Going to

143 child(from assign)"); if (temp.matchelement("copy")){ temp.toelement(vtdnav.first_child); if (temp.matchelement("from")){ int k=-1, m=-1; //auxiliary integers so as to determine whether or not the two variables have been found String fromvariable=temp.tonormalizedstring(temp.getattrval("variable")); if (temp.toelement(vtdnav.next_sibling)){ String tovariable=temp.tonormalizedstring(temp.getattrval("variable")); i<variableslist.size(); i=i+3){ (variableslist.get(i).equals(fromvariable)){ //store where it found that variable for (int i=0; if k=i; System.out.println("Found "+ fromvariable+ " in variableslist in position (starting from 0) "+k); break; //To-Do: would it be better to make those two for loops, checking in one pass? The if clause, that we would use to check if both k and m have been found in each iteration, wouldn;t that cost much more? for (int i=0; i<variableslist.size(); i=i+3){ if (variableslist.get(i).equals(tovariable)){ m=i; //store where it found that variable System.out.println("Found "+ tovariable+ " in variableslist in position (starting from 0) "+m); break; // we have a copy that involves whole variables //in case there is no parts in each variable and we want to just copy from one to another if (temp.getattrval("part")==-1 && temp.getattrval("variable")!=-1){ 143

144 //starting to determine what sort of <b>type</b> the "from" variable is if (variableslist.get(k+2).equals("nofile")){ //means that we created it and there is no class for that thang fromtype = (String) variableslist.get(k+1).getclass().getname(); //now we have what sort of type we have got fromnumber = 1; else{ //trying to figure out what sort of type this variable is so as to call the right function if (vg.parsefile("./services/"+variableslist.get(k+2), false)){ //false:do not separate namespaces VTDNav vn = vg.getnav(); ap = new AutoPilot(vn); AutoPilot try { ap.selectxpath("/definitions"); // AutoPilot moves the cursor for you, as it returns the index value of the qualified node if (ap.evalxpath()!=-1){ and moves the autopilot there //means that it found a message vn.toelement(vtdnav.first_child);//go to wsdl vn.toelement(vtdnav.first_child);//go to schema vn.toelement(vtdnav.first_child);//go to element do { if (vn.getattrval("name")!=-1){ there is a valid name //means that String[] toseeifitmatchesinput= (variableslist.get(k+1).getclass().getname()).split("_"); //it may be square_pkg._square so we have 3 split parts or it may be fibonacci._fibonacciresponse so we have 2 parts. either way we want only the last one int lastofinputlist=toseeifitmatchesinput.length-1; 144

145 if (vn.tonormalizedstring(vn.getattrval("name")).matches(toseeifitmatc hesinput[lastofinputlist])){ vn.toelement(vtdnav.first_child);//complextype vn.toelement(vtdnav.first_child);//sequence vn.toelement(vtdnav.first_child);//element do { if (vn.getattrval("name")!=-1){ inputlist.add(vn.tonormalizedstring(vn.getattrval("name"))); //System.out.println(vn.toN ormalizedstring(vn.getattrval("name"))); inputlist.add(vn.tonormalizedstring(vn.getattrval("type"))); //System.out.println(vn.toN ormalizedstring(vn.getattrval("type"))); fromnumber++; //fromnumber stores the number of the parts in a variable that will need to be copied while (vn.toelement(vtdnav.next_sibling) ); sequence complextype element vn.toelement(vtdnav.parent);//go to vn.toelement(vtdnav.parent);//go to vn.toelement(vtdnav.parent);//go to 145

146 while (vn.toelement(vtdnav.next_sibling)); else { element"); System.out.println("Could not autopilot to the catch(exception e) { System.out.println("XPathParseException");// in case something went wrong in XPATH e.printstacktrace(); System.out.println("Could not open file./services/"+variableslist.get(k+2)); else { //starting to determine what sort of <b>type</b> the "to" variable is if (variableslist.get(m+2).equals("nofile")){ //means that we created and there is no class for that thang totype = (String) variableslist.get(m+1).getclass().getname(); //now we have what sort of type we have got tonumber = 1; else{ //trying to figure out what sort of type this variable is so as to call the right function if (vg.parsefile("./services/"+variableslist.get(m+2), false)){ //false:do not separate namespaces VTDNav vn = vg.getnav(); ap = new AutoPilot(vn); AutoPilot try { ap.selectxpath("/definitions"); // AutoPilot moves the cursor for you, as it returns the index value 146

147 of the qualified node if (ap.evalxpath()!=-1){ and moves the autopilot there //means that it found a message vn.toelement(vtdnav.first_child);//go to wsdl vn.toelement(vtdnav.first_child);//go to schema vn.toelement(vtdnav.first_child);//go to element do { if (vn.getattrval("name")!=-1){ there is a valid name //means that String[] toseeifitmatchesoutput= (variableslist.get(m+1).getclass().getname()).split("_"); //it may be square_pkg._square so we have 3 split parts or it may be fibonacci._fibonacciresponse so we have 2 parts. either way we want only the last one int lastofoutputlist=toseeifitmatchesoutput.length-1; if (vn.tonormalizedstring(vn.getattrval("name")).matches(toseeifitmatc hesoutput[lastofoutputlist])){ vn.toelement(vtdnav.first_child);//complextype vn.toelement(vtdnav.first_child);//sequence vn.toelement(vtdnav.first_child);//element do { if (vn.getattrval("name")!=-1){ outputlist.add(vn.tonormalizedstring(vn.getattrval("name"))); //System.out.println(vn.toN ormalizedstring(vn.getattrval("name"))); outputlist.add(vn.tonormalizedstring(vn.getattrval("type"))); 147

148 //System.out.println(vn.toN ormalizedstring(vn.getattrval("type"))); tonumber++; //tonumber stores the number of the parts in the "to" variable that will need to be saved while (vn.toelement(vtdnav.next_sibling) ); sequence complextype element vn.toelement(vtdnav.parent);//go to vn.toelement(vtdnav.parent);//go to vn.toelement(vtdnav.parent);//go to while (vn.toelement(vtdnav.next_sibling)); else { element"); System.out.println("Could not autopilot to the catch(exception e) { System.out.println("XPathParseException");// in case something went wrong in XPATH e.printstacktrace(); System.out.println("Could not open file./services/"+variableslist.get(k+2)); else { //now that we have the two lists we can save each part of the "from" variable to each part of the "to" variable 148

149 =tonumber){ if (fromnumber! System.out.println ("Those two variables have not the same parts! So ignoring the assign/copy command"); else{ //if we have both xsd filetypes and they are the same filetype then System.out.println("Assign "+ attrname + "says that those two variables have the same amount of parts... so gonna copy them"); if (variableslist.get(k+2).equals("nofile") && variableslist.get(m+2).equals("nofile") && variableslist.get(m+2).getclass().getname().equals(variableslist.ge t(k+2).getclass().getname())){ variableslist.set(m+1, variableslist.get(k+1)); //if just the from variable is an xsd type else if(variableslist.get(k+2).equals("nofile")){ //the from variable is just an xsd type so going right away to save it to the right variable using the set...function. We are gusessing that there is just one, a well put assumption String methodtocall2= outputlist.get(0).substring(0, 1).toUpperCase() + outputlist.get(0).substring(1)/*.tolowercase()*/;//calling the method so as to save using the right function with the right class Class methodtype = xsd2type(outputlist.get(1)); if (methodtype.equals((variableslist.get(k+1).getclass().getname()))){ //they should both be of the same Type class System.out.println("Type of variable to pass is of:" +methodtype.getname()+" and method's name is set"+ methodtocall2); Method methoduri = (variableslist.get(m+1).getclass()).getmethod("set"+methodtocall2, methodtype); //setin(5) if there is a way to say what kind of variable the variabletocopy will be I can write variabletocopy.getclass() methoduri.invoke(variableslist.get(m+1), variableslist.get(k+1) ); { else 149

150 System.out.println("They are not of the same class so gonna quit assign"); //if just the to variable is an xsd filetype else if(variableslist.get(m+2).equals("nofile")){ //ca lling the get function String methodtocall= inputlist.get(0).substring(0, 1).toUpperCase() + inputlist.get(0).substring(1)/*.tolowercase()*/; Method methoduri = (variableslist.get(k+1).getclass()).getmethod("get"+methodtocall, null); //getin0(null) =>getmethod(methodname, param1.class, param2.class,..); Object variabletocopy = methoduri.invoke(variableslist.get(k+1), null); //method.invoke (objecttoinvokeon, params) //objecttoinvokeon is of type Object and is the object you want to invoke the method on "method name" is the name of the method you want to call //params is of type Object [] and declares the parameters to be passed to the method Class methodtype = xsd2type(inputlist.get(1)); if (methodtype.equals((variableslist.get(m+1).getclass().getname()))){ //they should both be of the same Type class variableslist.set(m+1, variabletocopy); else{ System.out.println("they are not of the same class so gonna quit the assign"); else { int iteration =inputlist.size(); for(int i=0; i<iteration; i=i+2){ //get variable 150

151 //Class<?> c=class.forname(variableslist.get(k+1).getclass().getname());//clas s<?> c = Class.forName("class name"); String methodtocall= inputlist.get(i).substring(0, 1).toUpperCase() + inputlist.get(i).substring(1)/*.tolowercase()*/; System.out.println("Method's name is get"+ methodtocall); Method methoduri = (variableslist.get(k+1).getclass()).getmethod("get"+methodtocall, null); //getin0(null) =>getmethod(methodname, param1.class, param2.class,..); Object variabletocopy = methoduri.invoke(variableslist.get(k+1), null); //method.invoke (objecttoinvokeon, params) //objecttoinvokeon is of type Object and is the object you want to invoke the method on "method name" is the name of the method you want to call //params is of type Object [] and declares the parameters to be passed to the method String methodtocall2= outputlist.get(i).substring(0, 1).toUpperCase() + outputlist.get(i).substring(1)/*.tolowercase()*/; //calling the method so as to save using the right function with the right class Class methodtype = xsd2type(outputlist.get(i+1)); Class methodtype2 = xsd2type(inputlist.get(i+1)); if (methodtype.equals(methodtype2)){ System.out.println("Type of variable to pass is of:" +methodtype2.getname()+" and method's name is set"+ methodtocall2); methoduri = (variableslist.get(m+1).getclass()).getmethod("set"+methodtocall2, methodtype2); //setin(5) if there is a way to say what kind of variable the variabletocopy will be I can write variabletocopy.getclass() ); methoduri.invoke(variableslist.get(m+1), variabletocopy System.out.println(variabletocopy); 151

152 else{ System.out.println("Parts are not of the same type one by one... To be exact "+methodtype+" of variable part "+outputlist.get(i)+"is not the same as"+methodtype2+" of variable part "+inputlist.get(i)); ; System.out.println("Ended with assign command \n\n"); // we have a parts copy if (temp.getattrval("part")!=-1 && temp.getattrval("variable")!=-1){ String frompart=temp.tonormalizedstring(temp.getattrval("part")); while (temp.toelement(vtdnav.next_sibling)){ if (temp.matchelement("to")==true); //found the "to" part break; //found to part so gonna copy String topart=temp.tonormalizedstring(temp.getattrval("part")); System.out.println("Gonna copy from "+fromvariable+" variable's part "+frompart+" and give it to "+ tovariable +" variable's part "+topart); //now the classes are located in k+1 and in m+1 and I'm gonna call the get and set methods to copy the variables if (k!=-1 && m! =-1){ //gonna use their methods through reflection =>see those three lines to understand //Object obj; =>our instantiated class //Method method = obj.getclass().getmethod("methodname", null); 152

153 nvoke(obj, null); //method.i //Class<?> c=class.forname(variableslist.get(k+1).getclass().getname());//clas s<?> c = Class.forName("class name"); String methodtocall= frompart.substring(0, 1).toUpperCase() + frompart.substring(1)/*.tolowercase()*/; Method methoduri = (variableslist.get(k+1).getclass()).getmethod("get"+methodtocall, null); //getin0(null) =>getmethod(methodname, param1.class, param2.class,..); Object variabletocopy = methoduri.invoke(variableslist.get(k+1), null); //method.invoke (objecttoinvokeon, params) //objecttoinvokeon is of type Object and is the object you want to invoke the method on "method name" is the name of the method you want to call //params is of type Object [] and declares the parameters to be passed to the method methodtocall2= topart.substring(0, 1).toUpperCase() + topart.substring(1)/*.tolowercase()*/; String //trying to figure out what sort of type this variable is so as to call the right function if (vg.parsefile("./services/"+variableslist.get(k+2), false)){ //false:do not separate namespaces VTDNav vn = vg.getnav(); ap = new AutoPilot(vn); AutoPilot try { ap.selectxpath("/definitions"); // AutoPilot moves the cursor for you, as it returns the index value of the qualified node if (ap.evalxpath()!=-1){ and moves the autopilot there //means that it found a message vn.toelement(vtdnav.first_child);//go to wsdl vn.toelement(vtdnav.first_child);//go to schema vn.toelement(vtdnav.first_child);//go to element 153

154 do { if (vn.getattrval("name")!=-1){ there is a valid name //means that String[] toseeifitmatchesoutput= (variableslist.get(m+1).getclass().getname()).split("_"); if (vn.tonormalizedstring(vn.getattrval("name")).matches(toseeifitmatc hesoutput[1])){ vn.toelement(vtdnav.first_child);//complextype vn.toelement(vtdnav.first_child);//sequence vn.toelement(vtdnav.first_child);//element do { if (vn.tonormalizedstring(vn.getattrval("name")).equalsignorecase(meth odtocall2)){ outputlist.add(vn.tonormalizedstring(vn.getattrval("name"))); //System.out.println(vn.toN ormalizedstring(vn.getattrval("name"))); outputlist.add(vn.tonormalizedstring(vn.getattrval("type"))); //System.out.println(vn.toN ormalizedstring(vn.getattrval("type"))); the parts in a variable n++; //n stores the number of while (vn.toelement(vtdnav.next_sibling) ); 154

155 sequence complextype element vn.toelement(vtdnav.parent);//go to vn.toelement(vtdnav.parent);//go to vn.toelement(vtdnav.parent);//go to while (vn.toelement(vtdnav.next_sibling)); else { element"); System.out.println("Could not autopilot to the catch(exception e) { System.out.println("XPathParseException");// in case something went wrong in XPATH e.printstacktrace(); System.out.println("Could not open file./services/"+variableslist.get(k+2)); else { //calling the method so as to save using the right function with the right class Class methodtype = xsd2type(outputlist.get(1)); System.out.println("Type of variable to pass is of:" +methodtype.getname()+" and method's name is set"+ methodtocall2); methoduri = (variableslist.get(m+1).getclass()).getmethod("set"+methodtocall2, methodtype); //setin(5) if there is a way to say what kind of variable the variabletocopy will be I can write variabletocopy.getclass() 155

156 oo = new Object[1]; Integer.valueOf(15); //Object[] //oo[0] = methoduri.invoke(variableslist.get(m+1), variabletocopy ); //oo instead of variabletocopy System.out.println(variabletocopy); temp.toelement(vtdnav.parent); //returns from children -from/to children - to continue with the assign. Is goes to the assign... temp.toelement(vtdnav.parent); //returns from copy to continue with the workflow // //receive else if (temp.matchelement("receive")) { //to-do: it should be done more asynchronously. see, now, it has to check every 2 seconds to see if something has been received in the receivelist String attname=temp.tonormalizedstring(temp.getattrval("name")); String attpartnerlink = temp.tonormalizedstring(temp.getattrval("partnerlink")); String attoperation = temp.tonormalizedstring(temp.getattrval("operation")); String attporttype = temp.tonormalizedstring(temp.getattrval("porttype")); String attvariable = temp.tonormalizedstring(temp.getattrval("variable")); String attcreateinstance = temp.tonormalizedstring(temp.getattrval("createinstance")); int k=-1, m=-1; if (attcreateinstance.equals("yes")){ //finding the right variable for (int i=0; i<variableslist.size(); i=i+3){ //ToDo: I should check whether it is from the right wsdl file or not because many wsdl files may have the same name for a different variable if (variableslist.get(i).equals(attvariable)){ 156

157 it found that variable k=i; //store where System.out.println("Found "+ attvariable + " in variableslist in position (starting from 0) "+k); break; //finding the right flag that corresponds to the variable while (true){ for (int i=0; i<receivelist.size(); i=i+2){ //The receivelist has in every even line the name of the operation and in the next one the object/variable if (receivelist.get(i).equals(attoperation)){ m=i; //store where it found that variable System.out.println("Found operation"+ attoperation + " in receivelist in position (starting from 0) "+m); break; Thread.sleep(2000); //allow the cpu to rest for a while until something has been sent. if (m!=-1) { break; //if you have found that there is something in the List that has been rece3ived, stop searching the List and exit the while loop receivelist.get(m+1)); variableslist.set((k+1), // //documentation else if (temp.matchelement("documentation")) { final ExecutorService execsvc = Executors.newFixedThreadPool(3); Callable<String> executioncallable = new documentation(temp.tonormalizedstring(temp.gettext())); Future<?> future = 157

158 execsvc.submit(executioncallable); future.get(); // //wait else if (temp.matchelement("wait")) { long milliseconds=0l, prep2=0l; String prep="0"; if (temp.toelement(vtdnav.first_child)){ if (temp.matchelement("for")){ String forattr=temp.tonormalizedstring(temp.gettext()); String forattr2[]=forattr.split("t"); if (forattr2[0].startswith("'p")){ char []arr=forattr2[0].tochararray(); char []arr1=forattr2[1].tochararray(); for (int i=0; i<arr.length; i++) { if (arr[i]=='\'') continue; else if (arr[i]=='p') continue; else if (arr[i]>='0' && (arr[i]<='9')) { String prep3=character.tostring(arr[i]); prep=prep + prep3; (arr[i]=='y') { else if prep2=new Long(prep); milliseconds=milliseconds+(prep2* l); // L is the number of milliseconds in a gregorian year prep="0"; (arr[i]=='m') { else if 158 prep2=new Long(prep);

159 milliseconds=milliseconds+(prep2* l); // LL is the number of milliseconds in a month prep="0"; (arr[i]=='d') { else if prep2=new Long(prep); milliseconds=milliseconds+(prep2* l); // L is the number of milliseconds in a day prep="0"; loop i<arr1.length; i++) (arr1[i]=='\'') continue; (arr1[i]=='t') continue; (arr1[i]>='0' && (arr1[i]<='9')) prep3=character.tostring(arr1[i]); + prep3; (arr1[i]=='h'){ //end of for for (int i=0; { if else if else if { String prep=prep else if prep2=new Long(prep); milliseconds=milliseconds+(prep2* l); // L is the number of milliseconds in a year prep="0"; (arr1[i]=='m'){ else if prep2=new Long(prep); milliseconds=milliseconds+(prep2*60000l); // L is the number of milliseconds in a year prep="0"; 159

160 (arr1[i]=='s'){ else if prep2=new Long(prep); milliseconds=milliseconds+(prep2*1000l); // L is the number of milliseconds in a year loop prep="0"; wait for "+milliseconds); //end of for System.out.println("\nGonna Thread.sleep(milliseconds); else if (temp.matchelement("until")){ String forattr=temp.tonormalizedstring(temp.gettext()); if (!forattr.equals("''")){ String forattr2[]=forattr.split("'"); String forattr3[]=forattr2[1].split("t"); long currenttime = GregorianCalendar.getInstance().getTimeInMillis(); Calendar datetostopwaiting= new GregorianCalendar(); for (int i=0; i<forattr3.length; i++) System.out.println(forattr3[i]); []arr=forattr3[0].split("-"); []arr1=forattr3[1].split(":"); String String datetostopwaiting.set(integer.parseint(arr[0]), Integer.parseInt(arr[1])-1, Integer.parseInt(arr[2]), Integer.parseInt(arr1[0]), Integer.parseInt(arr1[1]), Integer.parseInt(arr1[2])); long timetostop=datetostopwaiting.gettimeinmillis(); milliseconds=timetostop-currenttime; 160

161 System.out.println("\nGonna wait for "+milliseconds); Thread.sleep(milliseconds); temp.toelement(vtdnav.parent); //returns from children to continue with the workflow // //flow else if (temp.matchelement("flow")){ System.out.println("Going to children (from flow with name "+temp.tonormalizedstring(temp.getattrval("name"))+")"); temp.toelement(vtdnav.first_child); //goes into children ThreadPoolExecutor threadpool = new ThreadPoolExecutor(5,5, 50000L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(), new PoolHandlerFactory()); final ExecutorService execsvc = Executors.newFixedThreadPool(10); ArrayList<FutureTask> t = new ArrayList<FutureTask>(); //FutureTask t[] = new FutureTask[40]; //so, for every child of the flow process I will give it an FutureTask so as to perform similtaneously do { //System.out.println(temp.toNorm alizedstring(temp.getcurrentindex())); t.add(new FutureTask<String> (new runlogic(temp.getcurrentindex(), filefolder, filename, filehasnamespaces))); while (temp.toelement(vtdnav.next_sibling)); //starting to parallelize the threads for (int i = 0; i < t.size(); i++) { threadpool.execute(t.get(i)); to wait for them to stop"); for (int i = 0; i < t.size(); i++) { try{ System.out.println("Trying t.get(i).get(); catch (InterruptedException ee) 161

162 { catch (ExecutionException e) { catch block // TODO Auto-generated e.printstacktrace(); temp.toelement(vtdnav.parent); //returns from children to continue with the workflow // //sequence else if (temp.matchelement("sequence")) { //logic same as invoke regarding futuretasks if (temp.getattrcount()>0) System.out.println("Going to children (from sequence with name "+temp.tonormalizedstring(temp.getattrval("name"))+")"); temp.toelement(vtdnav.first_child); //goes into children do { final ExecutorService execsvc1 = Executors.newFixedThreadPool(1); Callable<String> executioncallable1 = new runlogic(temp,filefolder, filename, filehasnamespaces); Future<?> future1 = execsvc1.submit(executioncallable1); future1.get(); while (temp.toelement(vtdnav.next_sibling)); temp.toelement(vtdnav.parent); //returns from children to continue with the workflow 162 catch (NavException e) { // TODO Auto-generated catch block e.printstacktrace(); catch (InterruptedException e) { // TODO Auto-generated catch block e.printstacktrace(); catch (ExecutionException e) { // TODO Auto-generated catch block e.printstacktrace(); catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printstacktrace();

163 catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printstacktrace(); catch (SecurityException e) { // TODO Auto-generated catch block e.printstacktrace(); catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printstacktrace(); return "ok"; public Class xsd2type(string type){ if (type.equalsignorecase("xsd:int")){ return Integer.TYPE; else if (type.equalsignorecase("xsd:long")){ return Long.TYPE;//long typeclass; else if (type.equalsignorecase("xsd:short")){ return Short.TYPE;//short typeclass; else if (type.equalsignorecase("xsd:float")){ return Float.TYPE;//float typeclass; else if (type.equalsignorecase("xsd:double")){ return Double.TYPE;//double typeclass; else if (type.equalsignorecase("xsd:boolean")){ return Boolean.TYPE;//boolean typeclass; else if (type.equalsignorecase("xsd:byte")){ return Byte.TYPE;//byte typeclass; else if (type.equalsignorecase("xsd:base64binary")){ byte[] typeclass = null; return typeclass.getclass();//byte[] typeclass; else if (type.equalsignorecase("xsd:string")){ return String.class;//java.lang.String typeclass; else if (type.equalsignorecase("xsd:integer")){ java.math.biginteger typeclass = null; return typeclass.getclass();//java.math.biginteger typeclass; 163

164 else if (type.equalsignorecase("xsd:decimal")){ java.math.bigdecimal typeclass = null; return typeclass.getclass();//java.math.bigdecimal typeclass; else if (type.equalsignorecase("xsd:datetime")){ java.util.calendar typeclass = null; return typeclass.getclass();//java.util.calendar typeclass; else if (type.equalsignorecase("xsd:date")){ java.util.date typeclass = null; return typeclass.getclass();//java.util.date typeclass; else if (type.equalsignorecase("xsd:boolean xsi:nillable=true")){ java.lang.boolean typeclass = null; return typeclass.getclass();//java.lang.boolean typeclass; else if (type.equalsignorecase("xsd:float xsi:nillable=true")){ java.lang.float typeclass = null; return typeclass.getclass();//java.lang.float typeclass; else if (type.equalsignorecase("xsd:double xsi:nillable=true")){ java.lang.double typeclass = null; return typeclass.getclass();//java.lang.double typeclass; else if (type.equalsignorecase("xsd:int xsi:nillable=true")){ java.lang.integer typeclass = null; return typeclass.getclass();//java.lang.integer typeclass; else if (type.equalsignorecase("xsd:short xsi:nillable=true")){ java.lang.short typeclass = null; return typeclass.getclass();//java.lang.short typeclass; else if (type.equalsignorecase("xsd:byte xsi:nillable=true")){ java.lang.byte typeclass = null; return typeclass.getclass();//java.lang.byte typeclass; else if (type.equalsignorecase("xsd:anytype")){ java.lang.object typeclass = null; return 164

165 typeclass.getclass();//java.lang.object typeclass; return null; class PoolHandlerFactory implements ThreadFactory { public Thread newthread(runnable r) { Thread t = new Thread(r); t.setdaemon(true); return t; Για να τρέξει αυτός ο κώδικας χρειάζεται και ένα πακέτο μέσα στο βασικό που να ονομάζεται wsdl2java και να έχει μέσα τα εξής 2 αρχεία: createwsdl2javafiles.java package wsdl2java; import java.io.file; import java.net.url; import java.net.urlclassloader; import java.util.arraylist; import java.util.iterator; import java.util.list; import java.util.concurrent.callable; import org.apache.axis.wsdl.tojava.emitter; public class createwsdl2javafiles implements Callable<String>{ // Instantiate the emitter Emitter emitter = new Emitter(); String wsdl_location; public createwsdl2javafiles (String wsdllocation){ //reading the wsdl(and optionally the xsd---it does create the SimpleProcess file) file and converting it to Java classes wsdl_location = wsdllocation; //String wsdl_location1 []= new String [] {wsdl_location; //to be done in args public String call(){ // set any properties you want, such as: //Emitter from Axis2 165

166 //Emitter from axis 1 emitter.setverbose(true); emitter.setimports(true); emitter.setallwanted(true);//critical for making the types as java files emitter.setskeletonwanted(true); emitter.setserverside(true); //so as to make deploy and undeploy.wsdd as well as bindingimpl*/ //emitter.settestcasewanted(true); //emitter.sethelperwanted(true); //emitter.settimeout(3600); //emitter.setpackagename(projectname);//so as to make it one package where any class can have access to anything // Run the emitter try { emitter.run(wsdl_location); //makes the java files for the specified service out of the wsdl file List<?> list2 = emitter.getgeneratedfilenames(); //with / in file names so as to compile them List<?> list = emitter.getgeneratedclassnames();//with dots in case there is a chance to import List<String> ClassesCorrespondence = new ArrayList(); Iterator<?> itr2=list2.iterator(); //start compiling the java files (created from the wsdl file -by the emitter) to classes for (Iterator<?> itr=list.iterator(); /*itr2.hasnext() &&*/ itr.hasnext(); ) { Object p = itr.next(); //objects in a form type to load classes if (p==null) continue; //so it won't compile deploy and the rest of the files that are not.java... String[] st= ((String) p).split("\\."); //tokenize the class so as to get the last token which has the name of the service ClassesCorrespondence.add(st[(st.length)-1]); //fill the list so as to have both the name of the class as well as the name of the class in dots... ClassesCorrespondence.add((String)p); type to compile here... Object o = itr2.next(); //objects in a form //why do it with futures??? Fork would be good CreateClassesFromJavaFiles.call((String) o); 166

167 catch (Exception e) { // TODO Auto-generated catch block e.printstacktrace(); return "0"; Και CreateClassesFromJavaFiles.java package wsdl2java; import com.sun.tools.javac.main; public class CreateClassesFromJavaFiles /*implements Callable<String>*/ { String filetocompile; public CreateClassesFromJavaFiles (String filetocompile){ this.filetocompile=filetocompile; public static String call(string filetocompile) { //creating the classes programmatically String[] options=new String[] {"-source", "1.4", "-d", ".", "- classpath", "./extras/axis.jar;./extras/jaxrpc.jar;", "-sourcepath", ".", filetocompile ; // javac.compile(options); Main.compile(options); return filetocompile; Τέλος, με σκοπό να γίνει μία πιο Modular εκδοχή της μηχανής για όσους το απαιτήσουν, παρατίθενται και δύο αρχεία μέσα σε ένα package bpelactionscontrol, τα invoke.java και documentation.java, τα οποία επί τούτου είναι απαραίτητα για να μεταγλωττιστεί η εφαρμογή μας. Σημειώνεται ότι η υλοποίηση του Invoke δεν είναι αυτή εδώ, αλλά αυτή που φαίνεται στον κεντρικό κώδικα invoke.java package bpelactionscontrol; import java.util.concurrent.callable; 167

168 import javax.xml.namespace.qname; import org.apache.axis.client.call; import org.apache.axis.client.service; import java.lang.reflect.*; public class invoke implements Callable<String> { String name_receive, partnerlink_receive, operation_receive, porttype_receive, wheretolook; Object parameter; public invoke(string name_receive, String partnerlink_receive, String operation_receive, String porttype_receive, String wheretolook, Object parameter) { this.name_receive = name_receive; this.partnerlink_receive = partnerlink_receive; this.operation_receive = operation_receive; this.porttype_receive = porttype_receive; this.wheretolook =wheretolook; this.parameter=parameter; public String call() { System.out.println( "Invoke with attributes, name: "//"just inner receive. Element name ==> " this.getid()+ +name_receive+"\tpartnerlink: "+partnerlink_receive+ "\toperation: "+operation_receive+"\n\tporttype: " +porttype_receive+"\ngonna look in:"+wheretolook); try { //firstarg=args[0]; // secondarg=args[1]; String endpoint = wheretolook; Service service = new Service(); Call call = (Call) service.createcall(); call.setoperationname(new QName(endpoint, operation_receive)); call.settargetendpointaddress( new java.net.url(endpoint) ); System.out.println("Beginning to transmit..."); {(parameter)) ; int returnvar = (Integer) call.invoke(new Object[] int ret=new Integer(returnvar); System.out.println("Please wait..."); System.out.println("Fibonacci(15))=" + returnvar); " + e); catch (Exception e) { System.err.println("Execution failed. Exception: e.printstacktrace(); 168

169 Και return "ok"; documentation.java package bpelactionscontrol; import java.util.concurrent.callable; public class documentation implements Callable<String> { String text; public documentation(string text){ this.text=text; public String call() { try { //two different types for retrieving the same thing //System.out.println("Documentation. Element name ==> " +vn.tostring(vn.getcurrentindex()) ); System.out.println("Documentation says ==> " +text); catch (Exception e) { e.printstacktrace(); return "ok"; public void run() { Στον eclipse το prοject μας θα πρέπει να έχει την δομή που φαίνεται στο σχήμα: 169

170 170

Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου 10η Διάλεξη: Web Services

Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου 10η Διάλεξη: Web Services Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου 10η Διάλεξη: Web Services Δρ. Απόστολος Γκάμας Λέκτορας (407/80) gkamas@uop.gr Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου Διαφάνεια 1 Ορισμός των Web Services

Διαβάστε περισσότερα

Υπηρεσίες Ιστού (Web Services) Τεχνολογία Διοίκησης Επιχειρησιακών Διαδικασιών

Υπηρεσίες Ιστού (Web Services) Τεχνολογία Διοίκησης Επιχειρησιακών Διαδικασιών Υπηρεσίες Ιστού (Web Services) Τεχνολογία Διοίκησης Επιχειρησιακών Διαδικασιών Περιεχόμενα Εισαγωγή στις Υπηρεσίες Ιστού Ορισμοί Παραδείγματα Σύγκριση με άλλες τεχνολογίες Πρωτόκολλα Υπηρεσιών Ιστού SOAP

Διαβάστε περισσότερα

Υπηρεσιοστρεφής Αρχιτεκτονική SOA (Service Oriented Architecture)

Υπηρεσιοστρεφής Αρχιτεκτονική SOA (Service Oriented Architecture) Υπηρεσιοστρεφής Αρχιτεκτονική SOA (Service Oriented Architecture) Χρήστος Ηλιούδης Πλεονεκτήματα των Υπηρεσιών Ιστού Διαλειτουργικότητα: Η χαλαρή σύζευξή τους οδηγεί στην ανάπτυξη ευέλικτου λογισμικού

Διαβάστε περισσότερα

Προγραμματισμός και Συστήματα στον Παγκόσμιο Ιστό Ενότητα 9: Web Services. Καθ. Ιωάννης Γαροφαλάκης Πολυτεχνική Σχολή Μηχανικών Η/Υ & Πληροφορικής

Προγραμματισμός και Συστήματα στον Παγκόσμιο Ιστό Ενότητα 9: Web Services. Καθ. Ιωάννης Γαροφαλάκης Πολυτεχνική Σχολή Μηχανικών Η/Υ & Πληροφορικής Προγραμματισμός και Συστήματα στον Παγκόσμιο Ιστό Ενότητα 9: Web Services Καθ. Ιωάννης Γαροφαλάκης Πολυτεχνική Σχολή Μηχανικών Η/Υ & Πληροφορικής Σκοποί ενότητας Σκοπός της παρούσας ενότητας είναι να εξοικειωθούν

Διαβάστε περισσότερα

Κατανεμημένα Συστήματα με Java. Ενότητα # 18: Υπηρεσίες Ιστού Διδάσκων: Γεώργιος Ξυλωμένος Τμήμα: Πληροφορικής

Κατανεμημένα Συστήματα με Java. Ενότητα # 18: Υπηρεσίες Ιστού Διδάσκων: Γεώργιος Ξυλωμένος Τμήμα: Πληροφορικής Κατανεμημένα Συστήματα με Java Ενότητα # 18: Υπηρεσίες Ιστού Διδάσκων: Γεώργιος Ξυλωμένος Τμήμα: Πληροφορικής Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου

Διαβάστε περισσότερα

Τεχνολογία Διοίκησης Επιχειρησιακών Διαδικασιών Οδηγός Εργαστηρίου ΕΘΝΙΚΟ ΚΑΙ ΚΑΠΟΔΙΣΤΡΙΑΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ

Τεχνολογία Διοίκησης Επιχειρησιακών Διαδικασιών Οδηγός Εργαστηρίου ΕΘΝΙΚΟ ΚΑΙ ΚΑΠΟΔΙΣΤΡΙΑΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΕΘΝΙΚΟ ΚΑΙ ΚΑΠΟΔΙΣΤΡΙΑΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΠΡΟΓΡΑΜΜΑ ΜΕΤΑΠΤΥΧΙΑΚΩΝ ΣΠΟΥΔΩΝ Τεχνολογία Διοίκησης Επιχειρησιακών Διαδικασιών Οδηγός Εργαστηρίου:

Διαβάστε περισσότερα

Τεχνολογία Διοίκησης Επιχειρησιακών Διαδικασιών

Τεχνολογία Διοίκησης Επιχειρησιακών Διαδικασιών ΕΘΝΙΚΟ ΚΑΙ ΚΑΠΟΔΙΣΤΡΙΑΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΠΡΟΓΡΑΜΜΑ ΜΕΤΑΠΤΥΧΙΑΚΩΝ ΣΠΟΥΔΩΝ Τεχνολογία Διοίκησης Επιχειρησιακών Διαδικασιών Οδηγός Εργαστηρίου:

Διαβάστε περισσότερα

ΚΕΦΑΛΑΙΟ 17: Web Services Εισαγωγή

ΚΕΦΑΛΑΙΟ 17: Web Services Εισαγωγή ΚΕΦΑΛΑΙΟ 17: Web Services 17.1. Εισαγωγή Με τον όρο WebService αναφερόμαστε σε ένα σύστημα λογισμικού το οποίο σχεδιάστηκε με τρόπο τέτοιο ώστε να υποστηρίζει την ανεμπόδιστη συνεργασία δύο μηχανών μέσω

Διαβάστε περισσότερα

Υπηρεσίες Ιστού (Web Services) ΜΙΧΑΛΗΣ ΜΑΛΙΑΠΠΗΣ

Υπηρεσίες Ιστού (Web Services) ΜΙΧΑΛΗΣ ΜΑΛΙΑΠΠΗΣ Υπηρεσίες Ιστού (Web Services) ΜΙΧΑΛΗΣ ΜΑΛΙΑΠΠΗΣ Μάθημα Πρώτο Εισαγωγή στις Υπηρεσίες Ιστού (Web Services) Μοντέλα WS JSON Χρήση (consume) WS μέσω python Πρόσβαση σε WS και άντληση δεδομένων Παραδείγματα

Διαβάστε περισσότερα

Αρχιτεκτονικές κατανεμημένων συστημάτων. I. Sommerville 2006 Βασικές αρχές Τεχνολογίας Λογισμικού, 8η αγγ. έκδοση Κεφ. 12

Αρχιτεκτονικές κατανεμημένων συστημάτων. I. Sommerville 2006 Βασικές αρχές Τεχνολογίας Λογισμικού, 8η αγγ. έκδοση Κεφ. 12 Αρχιτεκτονικές κατανεμημένων συστημάτων Στόχοι Εξήγηση των πλεονεκτημάτων και των μειονεκτημάτων των αρχιτεκτονικών κατανεμημένων συστημάτων Εξέταση των αρχιτεκτονικών συστημάτων πελάτηδιακομιστή και των

Διαβάστε περισσότερα

Αρχιτεκτονικές κατανεμημένων συστημάτων. I. Sommerville 2006 Βασικές αρχές Τεχνολογίας Λογισμικού, 8η αγγ. έκδοση Κεφ. 12

Αρχιτεκτονικές κατανεμημένων συστημάτων. I. Sommerville 2006 Βασικές αρχές Τεχνολογίας Λογισμικού, 8η αγγ. έκδοση Κεφ. 12 Αρχιτεκτονικές κατανεμημένων συστημάτων Στόχοι Εξήγηση των πλεονεκτημάτων και των μειονεκτημάτων των αρχιτεκτονικών κατανεμημένων συστημάτων Εξέταση των αρχιτεκτονικών συστημάτων πελάτηδιακομιστή και των

Διαβάστε περισσότερα

ΣΥΓΚΡΙΤΙΚΗ ΜΕΛΕΤΗ ΤΕΧΝΟΛΟΓΙΩΝ ΔΙΑΔΙΚΤΥΑΚΩΝ ΥΠΗΡΕΣΙΩΝ ΚΑΙ ΑΞΙΟΛΟΓΗΣΗ ΤΗΣ ΤΕΧΝΟΛΟΓΙΑΣ REST ΠΛΑΣΤΑΡΑΣ ΕΥΡΙΠΙΔΗΣ

ΣΥΓΚΡΙΤΙΚΗ ΜΕΛΕΤΗ ΤΕΧΝΟΛΟΓΙΩΝ ΔΙΑΔΙΚΤΥΑΚΩΝ ΥΠΗΡΕΣΙΩΝ ΚΑΙ ΑΞΙΟΛΟΓΗΣΗ ΤΗΣ ΤΕΧΝΟΛΟΓΙΑΣ REST ΠΛΑΣΤΑΡΑΣ ΕΥΡΙΠΙΔΗΣ ΣΥΓΚΡΙΤΙΚΗ ΜΕΛΕΤΗ ΤΕΧΝΟΛΟΓΙΩΝ ΔΙΑΔΙΚΤΥΑΚΩΝ ΥΠΗΡΕΣΙΩΝ ΚΑΙ ΑΞΙΟΛΟΓΗΣΗ ΤΗΣ ΤΕΧΝΟΛΟΓΙΑΣ REST ΠΛΑΣΤΑΡΑΣ ΕΥΡΙΠΙΔΗΣ ΘΕΣΣΑΛΟΝΙΚΗ, 2016 ΕΙΣΑΓΩΓΗ Μια διαδικτυακή υπηρεσία μπορεί να περιγραφεί απλά σαν μια οποιαδήποτε

Διαβάστε περισσότερα

* Enterprise Resource Planning ** Customer Relationship Management

* Enterprise Resource Planning ** Customer Relationship Management Υπηρεσιοστρεφείς Επιχειρησιακές ιαδικασίες ιαµοιρασµός και Επαναχρησιµοποίηση Αποτελούν βασικές απαιτήσειςκατά το σχεδιασµό και την ολοκλήρωση (integration) επιχειρησιακών διαδικασιών ιαµοιρασµός: πολλοί

Διαβάστε περισσότερα

ΠΕΡΙΕΧΟΜΕΝΑ. Πρόλογος... 13. Κεφάλαιο 1 ο Αρχές Διαχείρισης πληροφορίας στον Παγκόσμιο Ιστό... 15

ΠΕΡΙΕΧΟΜΕΝΑ. Πρόλογος... 13. Κεφάλαιο 1 ο Αρχές Διαχείρισης πληροφορίας στον Παγκόσμιο Ιστό... 15 ΠΕΡΙΕΧΟΜΕΝΑ Πρόλογος... 13 Κεφάλαιο 1 ο Αρχές Διαχείρισης πληροφορίας στον Παγκόσμιο Ιστό... 15 1.1 Εισαγωγή... 16 1.2 Διαδίκτυο και Παγκόσμιος Ιστός Ιστορική αναδρομή... 17 1.3 Αρχές πληροφοριακών συστημάτων

Διαβάστε περισσότερα

Αρχιτεκτονική Υπολογιστών

Αρχιτεκτονική Υπολογιστών Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Αρχιτεκτονική Υπολογιστών Ενότητα 13: (Μέρος Β ) Λειτουργικό Σύστημα Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής

Διαβάστε περισσότερα

Αρχιτεκτονική Υπολογιστών

Αρχιτεκτονική Υπολογιστών Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Αρχιτεκτονική Υπολογιστών Ενότητα 13: (Μέρος Β ) Λειτουργικό Σύστημα Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής

Διαβάστε περισσότερα

Η Υλοποίηση της Επικοινωνίας. Κατανεµηµένα Συστήµατα

Η Υλοποίηση της Επικοινωνίας. Κατανεµηµένα Συστήµατα Η Υλοποίηση της Επικοινωνίας στα Κατανεµηµένα Συστήµατα ιαφάνειες στα πλαίσια του µαθήµατος: Κατανεµηµένα Συστήµατα Ε Εξάµηνο, Τµήµα Πληροφορικής και Τεχνολογίας Υπολογιστών, ΤΕΙ Λαµίας Πέτρος Λάµψας 2002

Διαβάστε περισσότερα

Δίκτυα Υπολογιστών Firewalls. Χάρης Μανιφάβας

Δίκτυα Υπολογιστών Firewalls. Χάρης Μανιφάβας Δίκτυα Υπολογιστών Firewalls Χάρης Μανιφάβας 1 Επικοινωνία Βασίζεται στη μεταβίβαση μηνυμάτων (λόγω απουσίας διαμοιραζόμενης μνήμης) Απαιτείται συμφωνία φόρμας μηνυμάτων Πρότυπο Στόχος τυποποίησης = Συνεργασία

Διαβάστε περισσότερα

Μέρος 3 ο : Βασικές Έννοιες για δυναμικές ιστοσελίδες

Μέρος 3 ο : Βασικές Έννοιες για δυναμικές ιστοσελίδες Μέρος 3 ο : Βασικές Έννοιες για δυναμικές ιστοσελίδες Εισαγωγή-Σκοπός. Τρόποι δημιουργίας δυναμικών ιστοσελίδων. Dynamic Web Pages. Dynamic Web Page Development Using Dreamweaver. Τρόποι δημιουργίας δυναμικών

Διαβάστε περισσότερα

Αρχιτεκτονική Λογισμικού

Αρχιτεκτονική Λογισμικού Αρχιτεκτονική Λογισμικού περιεχόμενα παρουσίασης Τι είναι η αρχιτεκτονική λογισμικού Αρχιτεκτονική και απαιτήσεις Σενάρια ποιότητας Βήματα αρχιτεκτονικής σχεδίασης Αρχιτεκτονικά πρότυπα Διαστρωματωμένη

Διαβάστε περισσότερα

Πρότυπο Αναφοράς Open Systems Interconnection (OSI) Επικοινωνίες Δεδομένων Μάθημα 5 ο

Πρότυπο Αναφοράς Open Systems Interconnection (OSI) Επικοινωνίες Δεδομένων Μάθημα 5 ο Πρότυπο Αναφοράς Open Systems Interconnection (OSI) Επικοινωνίες Δεδομένων Μάθημα 5 ο Πρωτόκολλα και Αρχιτεκτονική Δικτύου Για να ανταλλάξουν δεδομένα δύο σταθμοί, εκτός από την ύπαρξη διαδρομής μεταξύ

Διαβάστε περισσότερα

Web and HTTP. Βασικά Συστατικά: Web Server Web Browser HTTP Protocol

Web and HTTP. Βασικά Συστατικά: Web Server Web Browser HTTP Protocol HTTP Protocol Web and HTTP Βασικά Συστατικά: Web Server Web Browser HTTP Protocol Web Servers (1/2) Ένα πρόγραμμα (λογισμικό) που έχει εγκατασταθεί σε ένα υπολογιστικό σύστημα (έναν ή περισσότερους υπολογιστές)

Διαβάστε περισσότερα

Σηµασιολογικές Υπηρεσίες Ιστού

Σηµασιολογικές Υπηρεσίες Ιστού Citation: Thanassis Tiropanis, Notes on Semantic Web Services, July 2006 http://eprints.ecs.soton.ac.uk/18173/ You may contact the author at: tt2@ecs.soton.ac.uk Σηµασιολογικές Υπηρεσίες Ιστού Θανάσης

Διαβάστε περισσότερα

Web Services. και SOAP

Web Services. και SOAP Web Services και SOAP Πίνακας Περιεχομένων 1 Εισαγωγή στα web services...3 2 Αρχιτεκτονική και δομικά στοιχεία των web services...9 3 XML...15 4 WSDL και UDDI...25 5 SOAP...32 6 Αναπτυσσόμενες τεχνολογίες...52

Διαβάστε περισσότερα

ΤΕΧΝΟΛΟΓΙΑ ΔΙΚΤΥΩΝ ΕΠΙΚΟΙΝΩΝΙΩΝ 7ο ΚΕΦΑΛΑΙΟ

ΤΕΧΝΟΛΟΓΙΑ ΔΙΚΤΥΩΝ ΕΠΙΚΟΙΝΩΝΙΩΝ 7ο ΚΕΦΑΛΑΙΟ ΤΕΧΝΟΛΟΓΙΑ ΔΙΚΤΥΩΝ ΕΠΙΚΟΙΝΩΝΙΩΝ 7ο ΚΕΦΑΛΑΙΟ ΕΡΩΤΗΣΕΙΣ - ΑΣΚΗΣΕΙΣ 1. Για να διεκπεραιωθεί η μεταφορά των πακέτων από την πηγή στον προορισμό μεταξύ των κόμβων του επικοινωνιακού υποδικτύου απαιτείται η

Διαβάστε περισσότερα

ΥΠΗΡΕΣΙΑ «TAXISNET» - ΗΛΕΚΤΡΟΝΙΚΗ ΥΠΟΒΟΛΗ ΤΩΝ ΦΟΡΟΛΟΓΙΚΩΝ ΔΗΛΩΣΕΩΝ ΓΙΑ ΤΟ ΤΜΗΜΑ ΕΣΩΤΕΡΙΚΩΝ ΠΡΟΣΟΔΩΝ ΚΑΙ ΤΗΝ ΥΠΗΡΕΣΙΑ ΦΟΡΟΥ ΠΡΟΣΤΙΘΕΜΕΝΗΣ ΑΞΙΑΣ ΤΟΥ

ΥΠΗΡΕΣΙΑ «TAXISNET» - ΗΛΕΚΤΡΟΝΙΚΗ ΥΠΟΒΟΛΗ ΤΩΝ ΦΟΡΟΛΟΓΙΚΩΝ ΔΗΛΩΣΕΩΝ ΓΙΑ ΤΟ ΤΜΗΜΑ ΕΣΩΤΕΡΙΚΩΝ ΠΡΟΣΟΔΩΝ ΚΑΙ ΤΗΝ ΥΠΗΡΕΣΙΑ ΦΟΡΟΥ ΠΡΟΣΤΙΘΕΜΕΝΗΣ ΑΞΙΑΣ ΤΟΥ ΥΠΗΡΕΣΙΑ «TAXISNET» - ΗΛΕΚΤΡΟΝΙΚΗ ΥΠΟΒΟΛΗ ΤΩΝ ΦΟΡΟΛΟΓΙΚΩΝ ΔΗΛΩΣΕΩΝ ΓΙΑ ΤΟ ΤΜΗΜΑ ΕΣΩΤΕΡΙΚΩΝ ΠΡΟΣΟΔΩΝ ΚΑΙ ΤΗΝ ΥΠΗΡΕΣΙΑ ΦΟΡΟΥ ΠΡΟΣΤΙΘΕΜΕΝΗΣ ΑΞΙΑΣ ΤΟΥ ΥΠΟΥΡΓΕΙΟΥ ΟΙΚΟΝΟΜΙΚΩΝ ΤΗΣ ΚΥΠΡΙΑΚΗΣ ΔΗΜΟΚΡΑΤΙΑΣ Οδηγίες

Διαβάστε περισσότερα

Εργαλεία ανάπτυξης εφαρμογών internet Ι

Εργαλεία ανάπτυξης εφαρμογών internet Ι IEK ΟΑΕΔ ΚΑΛΑΜΑΤΑΣ ΤΕΧΝΙΚΟΣ ΕΦΑΡΜΟΓΩΝ ΠΛΗΟΦΟΡΙΚΗΣ Εργαλεία ανάπτυξης εφαρμογών internet Ι Διδάσκουσα: Κανελλοπούλου Χριστίνα ΠΕ19 Πληροφορικής 4 φάσεις διαδικτυακών εφαρμογών 1.Εφαρμογές στατικής πληροφόρησης

Διαβάστε περισσότερα

6.2 Υπηρεσίες Διαδικτύου

6.2 Υπηρεσίες Διαδικτύου 6.2 Υπηρεσίες Διαδικτύου 1 / 34 Όλες οι υπηρεσίες στο Διαδίκτυο, όπως και πολλές εφαρμογές λογισμικού, στηρίζονται στο μοντέλο Πελάτη Εξυπηρετητή. 2 / 34 Σύμφωνα με αυτό το μοντέλο ο Εξυπηρετητής οργανώνει,

Διαβάστε περισσότερα

Ημερομηνία Παράδοσης: 4/4/2013

Ημερομηνία Παράδοσης: 4/4/2013 Δράση 9.14 / Υπηρεσία εντοπισμού λογοκλοπής Κυρίως Παραδοτέο / Σχεδιασμός και ανάπτυξη λογισμικού (λογοκλοπής) και βάσης δεδομένων (αποθετηρίου) Επιμέρους Παραδοτέο 9.14.1.4 / Πληροφοριακό σύστημα υπηρεσίας

Διαβάστε περισσότερα

1 Συστήματα Αυτοματισμού Βιβλιοθηκών

1 Συστήματα Αυτοματισμού Βιβλιοθηκών 1 Συστήματα Αυτοματισμού Βιβλιοθηκών Τα Συστήματα Αυτοματισμού Βιβλιοθηκών χρησιμοποιούνται για τη διαχείριση καταχωρήσεων βιβλιοθηκών. Τα περιεχόμενα των βιβλιοθηκών αυτών είναι έντυπα έγγραφα, όπως βιβλία

Διαβάστε περισσότερα

Βασικές Έννοιες Web Εφαρμογών

Βασικές Έννοιες Web Εφαρμογών ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΔΙΟΙΚΗΤΙΚΗΣ ΕΠΙΣΤΗΜΗΣ ΚΑΙ ΤΕΧΝΟΛΟΓΙΑΣ Τεχνολογίες και Εφαρμογές Διαδικτύου Βασικές Έννοιες Web Εφαρμογών Κατερίνα Πραματάρη Τεχνολογίες και Εφαρμογές Διαδικτύου Περιεχόμενα

Διαβάστε περισσότερα

Π Τ Υ Χ Ι Α Κ Η Ε Ρ Γ Α Σ Ι Α

Π Τ Υ Χ Ι Α Κ Η Ε Ρ Γ Α Σ Ι Α ΑΝΩΤΑΤΟ ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙΔΕΥΤΙΚΟ ΙΔΡΥΜΑ ΠΕΙΡΑΙΑ ΤΜΗΜΑ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΤΟΜΕΑΣ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ Η/Υ, ΠΛΗΡΟΦΟΡΙΚΗΣ & ΔΙΚΤΥΩΝ Εργ. Τεχνολογίας Λογισμικού & Υπηρεσιών S 2 E Lab Π Τ Υ Χ Ι

Διαβάστε περισσότερα

Επικοινωνία Client/Server Απομακρυσμένη Κλήση Διαδικασιών

Επικοινωνία Client/Server Απομακρυσμένη Κλήση Διαδικασιών Επικοινωνία Client/Server Απομακρυσμένη Κλήση Διαδικασιών Χάρης Μανιφάβας Τμήμα Εφ. Πληροφορικής & Πολυμέσων ΤΕΙ Κρήτης Επικοινωνία -RPC 1 Υλοποίηση RPC Προκειμένου να επιτευχθεί διαφάνεια στην κλήση RPC,

Διαβάστε περισσότερα

ΕΘΝΙΚΟ ΚΑΙ ΚΑΠΟΔΙΣΤΡΙΑΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΠΡΟΓΡΑΜΜΑ ΜΕΤΑΠΤΥΧΙΑΚΩΝ ΣΠΟΥΔΩΝ

ΕΘΝΙΚΟ ΚΑΙ ΚΑΠΟΔΙΣΤΡΙΑΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΠΡΟΓΡΑΜΜΑ ΜΕΤΑΠΤΥΧΙΑΚΩΝ ΣΠΟΥΔΩΝ ΕΘΝΙΚΟ ΚΑΙ ΚΑΠΟΔΙΣΤΡΙΑΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΠΡΟΓΡΑΜΜΑ ΜΕΤΑΠΤΥΧΙΑΚΩΝ ΣΠΟΥΔΩΝ Οδηγός Εργαστηρίου για το Μεταπτυχιακό Μάθημα Τεχνολογία Διοίκησης

Διαβάστε περισσότερα

ΠΑΝΕΠΙΣΤΗΜΙΟ ΜΑΚΕΔΟΝΙΑΣ - Π.Μ.Σ. ΕΦΑΡΜΟΣΜΕΝΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΜΑΚΕΔΟΝΙΑΣ - Π.Μ.Σ. ΕΦΑΡΜΟΣΜΕΝΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ > ΠΑΝΕΠΙΣΤΗΜΙΟ ΜΑΚΕΔΟΝΙΑΣ - Π.Μ.Σ. ΕΦΑΡΜΟΣΜΕΝΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΟΡΙΣΜΟΣ: Το Cloud Computing είναι η ονοµασία της τεχνολογίας η οποία επιτρέπει στους χρήστες να

Διαβάστε περισσότερα

Κατανεμημένα Συστήματα

Κατανεμημένα Συστήματα Κατανεμημένα Συστήματα Σημειώσεις εργαστηρίου Lab#7 - Διεργασίες, Nήματα, Πολυνημάτωση στη Python Νεβράντζας Βάιος-Γερμανός Λάρισα, Φεβρουάριος 2013 Lab#7 - Διεργασιές, Νη ματα, Πολυνημα τωση στη Python,

Διαβάστε περισσότερα

Κατανεμημένα Συστήματα. Ενότητα # 11: Μηνυματοστρεφές ενδιάμεσο λογισμικό Διδάσκων: Γεώργιος Ξυλωμένος Τμήμα: Πληροφορικής

Κατανεμημένα Συστήματα. Ενότητα # 11: Μηνυματοστρεφές ενδιάμεσο λογισμικό Διδάσκων: Γεώργιος Ξυλωμένος Τμήμα: Πληροφορικής Κατανεμημένα Συστήματα Ενότητα # 11: Μηνυματοστρεφές ενδιάμεσο λογισμικό Διδάσκων: Γεώργιος Ξυλωμένος Τμήμα: Πληροφορικής Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού

Διαβάστε περισσότερα

ΕΠΛ 012 Εισαγωγή στο Παγκόσμιο Πλέγμα Πληροφοριών

ΕΠΛ 012 Εισαγωγή στο Παγκόσμιο Πλέγμα Πληροφοριών ΕΠΛ 012 Εισαγωγή στο Παγκόσμιο Πλέγμα Πληροφοριών World Wide Web (WWW) Θέματα Επεξεργασία δεδομένων στο Web Δημιουργία απλών σελίδων HTML Περιγραφή κάποιων XHTML στοιχείων (tags) Εξέλιξης του WWW Το WWW

Διαβάστε περισσότερα

Το Μέλλον για τα Συστήματα Διαχείρισης Ακτινολογικής Εικόνας (PACS)

Το Μέλλον για τα Συστήματα Διαχείρισης Ακτινολογικής Εικόνας (PACS) Το Μέλλον για τα Συστήματα Διαχείρισης Ακτινολογικής Εικόνας (PACS) Ελένη Καλδούδη Τμήμα Ιατρικής Δημοκρίτειο Πανεπιστήμιο Θράκης 2003 θέματα το χθές, το σήμερα και το αύριο για τα PACS απαιτήσεις από

Διαβάστε περισσότερα

Σύντομη παρουσίαση των εργαλείων/εντολών telnet, ping, traceroute nslookup και nmap, zenmap

Σύντομη παρουσίαση των εργαλείων/εντολών telnet, ping, traceroute nslookup και nmap, zenmap Σύντομη παρουσίαση των εργαλείων/εντολών telnet, ping, traceroute nslookup και nmap, zenmap Version 2.00 Επιμέλεια Σημειώσεων: Δημήτρης Κόγιας Πατρικάκης Χαράλαμπος Πίνακας περιεχομένων TELNET... 2 PING...

Διαβάστε περισσότερα

Ηλεκτρονικός οδηγός για τους φοιτητές ενός Α.Ε.Ι.

Ηλεκτρονικός οδηγός για τους φοιτητές ενός Α.Ε.Ι. Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Τμήμα Ηλεκτρονικών Μηχανικών Τ.Ε. Ηλεκτρονικός οδηγός για τους φοιτητές ενός Α.Ε.Ι. Πτυχιιακή Εργασίία Φοιτητής: Δημήτριος Παπαοικονόμου ΑΜ: 36712

Διαβάστε περισσότερα

Εισαγωγή στην Πληροφορική

Εισαγωγή στην Πληροφορική Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων Εισαγωγή στην Πληροφορική Ενότητα 8: Λειτουργικά Συστήματα Το περιεχόμενο του μαθήματος διατίθεται με άδεια Creative Commons εκτός και αν αναφέρεται διαφορετικά

Διαβάστε περισσότερα

ΥΠΟΛΟΓΙΣΤΙΚΕΣ ΤΕΧΝΙΚΕΣ ΓΙΑ ΣΥΣΤΗΜΑΤΑ ΜΕΤΑΔΟΣΗΣ ΠΛΗΡΟΦΟΡΙΑΣ

ΥΠΟΛΟΓΙΣΤΙΚΕΣ ΤΕΧΝΙΚΕΣ ΓΙΑ ΣΥΣΤΗΜΑΤΑ ΜΕΤΑΔΟΣΗΣ ΠΛΗΡΟΦΟΡΙΑΣ ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΥΠΟΛΟΓΙΣΤΙΚΕΣ ΤΕΧΝΙΚΕΣ ΓΙΑ ΣΥΣΤΗΜΑΤΑ ΜΕΤΑΔΟΣΗΣ ΠΛΗΡΟΦΟΡΙΑΣ Αντικειμενοστραφής προγραμματισμός Web Sites:

Διαβάστε περισσότερα

ΕΘΝΙΚΟ ΚΑΙ ΚΑΠΟΔΙΣΤΡΙΑΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΠΡΟΓΡΑΜΜΑ ΜΕΤΑΠΤΥΧΙΑΚΩΝ ΣΠΟΥΔΩΝ

ΕΘΝΙΚΟ ΚΑΙ ΚΑΠΟΔΙΣΤΡΙΑΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΠΡΟΓΡΑΜΜΑ ΜΕΤΑΠΤΥΧΙΑΚΩΝ ΣΠΟΥΔΩΝ ΕΘΝΙΚΟ ΚΑΙ ΚΑΠΟΔΙΣΤΡΙΑΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΠΡΟΓΡΑΜΜΑ ΜΕΤΑΠΤΥΧΙΑΚΩΝ ΣΠΟΥΔΩΝ Τεχνολογία Διοίκησης Επιχειρησιακών Διαδικασιών Εκφώνηση Υποχρεωτικής

Διαβάστε περισσότερα

Ανάπτυξη Υπηρεσίας Καταλόγου LDAP με τα στοιχεία του προσωπικού του TEI Πειραιά. Νίκος Πασσαράς. Εισηγητής: Πρεζεράκος Γεώργιος

Ανάπτυξη Υπηρεσίας Καταλόγου LDAP με τα στοιχεία του προσωπικού του TEI Πειραιά. Νίκος Πασσαράς. Εισηγητής: Πρεζεράκος Γεώργιος ΑΝΩΤΑΤΟ ΤΕΧΝΟΛΟΓΙΚΟ ΙΔΡΥΜΑ ΠΕΙΡΑΙΑ ΣΧΟΛΗ ΤΕΧΝΟΛΟΓΙΚΩΝ ΕΦΑΡΜΟΓΩΝ ΤΜΗΜΑ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ Ανάπτυξη Υπηρεσίας Καταλόγου LDAP με τα στοιχεία του προσωπικού του TEI Πειραιά Νίκος Πασσαράς

Διαβάστε περισσότερα

Εισαγωγή στη Σχεδίαση Λογισμικού

Εισαγωγή στη Σχεδίαση Λογισμικού Εισαγωγή στη Σχεδίαση Λογισμικού περιεχόμενα παρουσίασης Τι είναι η σχεδίαση λογισμικού Έννοιες σχεδίασης Δραστηριότητες σχεδίασης Σχεδίαση και υποδείγματα ανάπτυξης λογισμικού σχεδίαση Η σχεδίαση του

Διαβάστε περισσότερα

ΚΕΦΑΛΑΙΟ 1.7. Πρωτόκολλα και Αρχιτεκτονική Δικτύου

ΚΕΦΑΛΑΙΟ 1.7. Πρωτόκολλα και Αρχιτεκτονική Δικτύου ΚΕΦΑΛΑΙΟ 1.7 Πρωτόκολλα και Αρχιτεκτονική Δικτύου Επικοινωνία δύο σταθμών Ύπαρξη διαδρομής Αποκατάσταση σύνδεσης Ο σταθμός-πηγή πρέπει να ξέρει πότε ο σταθμός-προορισμός είναι έτοιμος να λάβει δεδομένα.

Διαβάστε περισσότερα

Ανάπτυξηλογισμικού υλοποίησης του ανοικτού πρότυπου EPCALEv1.1 για εφαρμογές RFID

Ανάπτυξηλογισμικού υλοποίησης του ανοικτού πρότυπου EPCALEv1.1 για εφαρμογές RFID ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ- ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ, Ανάπτυξηλογισμικού υλοποίησης του ανοικτού πρότυπου EPCALEv1.1 για εφαρμογές RFID ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΚΑΙ ΔΙΚΤΥΩΝ Marie-Aurélie

Διαβάστε περισσότερα

Αξιολόγηση Υπηρεσιών ιαδικτύου µέσω Περιπτώσεων Μελέτης

Αξιολόγηση Υπηρεσιών ιαδικτύου µέσω Περιπτώσεων Μελέτης Αξιολόγηση Υπηρεσιών ιαδικτύου µέσω Περιπτώσεων Μελέτης Κωστής Αϊβαλής Μηχανικός Πληροφορικής TU-Berlin 2/5/2008 ΕΑΠ-ΓΤΠ61-Κωστής Αϊβαλής 1 Εισαγωγή Η ταχύτητα επεξεργασίας των εφαρµογών διαδικτυακών υπηρεσιών

Διαβάστε περισσότερα

Συστήματα ηλεκτρονικής μάθησης με χρήση υπηρεσιών ιστού και ροών εργασίας

Συστήματα ηλεκτρονικής μάθησης με χρήση υπηρεσιών ιστού και ροών εργασίας ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΕΙΡΑΙΩΣ ΤΜΗΜΑ ΔΙΔΑΚΤΙΚΗΣ ΤΗΣ ΤΕΧΝΟΛΟΓΙΑΣ ΚΑΙ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΚΑΤΕΥΘΥΝΣΗ ΗΛΕΚΤΡΟΝΙΚΗΣ ΜΑΘΗΣΗΣ Συστήματα ηλεκτρονικής μάθησης με χρήση υπηρεσιών ιστού και ροών εργασίας Διπλωματική εργασία

Διαβάστε περισσότερα

Η Γλώσσα WS-BPEL 2.0. Εργαστήριο Ανάλυσης Συστημάτων και Τεχνολογίας Λογισμικού. S3Laboratory

Η Γλώσσα WS-BPEL 2.0. Εργαστήριο Ανάλυσης Συστημάτων και Τεχνολογίας Λογισμικού. S3Laboratory Η Γλώσσα WS-BPEL 2.0 Εργαστήριο Ανάλυσης Συστημάτων και Τεχνολογίας Λογισμικού S3Laboratory Εισαγωγή Η WS-BPEL (ή ΒPEL) είναι μια γλώσσα για την περιγραφή και εκτέλεση επιχειρησιακών διαδικασιών με χρήση

Διαβάστε περισσότερα

ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΑ ΕΡΓΑΛΕΙΑ ΓΙΑ ΤΟ ΔΙΑΔΙΚΤΥΟ

ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΑ ΕΡΓΑΛΕΙΑ ΓΙΑ ΤΟ ΔΙΑΔΙΚΤΥΟ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΑ ΕΡΓΑΛΕΙΑ ΓΙΑ ΤΟ ΔΙΑΔΙΚΤΥΟ Κεφάλαιο 2. Το περιβάλλον του παγκόσμιου Ιστού Επιμέλεια: Καραγιάννης Σπύρος Καθηγητής ΠΕ19 Πλεονεκτήματα παγκόσμιου Ιστού Εξυπηρετητής Ιστού & Ιστοσελίδες Κύριες

Διαβάστε περισσότερα

Οδηγίες αξιοποίησης για τον Εκπαιδευτικό

Οδηγίες αξιοποίησης για τον Εκπαιδευτικό Ανάδοχοι Φορέας Υλοποίησης Έργο ΛΑΕΡΤΗΣ Λογισμικό Δικτύων Οδηγίες αξιοποίησης για τον Εκπαιδευτικό Ερευνητικό Ακαδημαϊκό Ινστιτούτο Τεχνολογίας Υπολογιστών Ανάδοχος φορέας: CONCEPTUM A.E. 1 Προσομοίωση

Διαβάστε περισσότερα

Γλώσσες Σήµανσης (Markup Languages) Τεχνολογία ιαδικτύου και Ηλεκτρονικό Εµπόριο

Γλώσσες Σήµανσης (Markup Languages) Τεχνολογία ιαδικτύου και Ηλεκτρονικό Εµπόριο Γλώσσες Σήµανσης (Markup Languages) Τεχνολογία ιαδικτύου και Ηλεκτρονικό Εµπόριο 1 Γλώσσες Σήµανσης Γλώσσες σήµανσης: Αρχικά για τον καθορισµό εµφάνισης σελίδων, γραµµατοσειρών. Στη συνέχεια επεκτάθηκαν

Διαβάστε περισσότερα

Επαναληπτικές Ασκήσεις Μαθήματος

Επαναληπτικές Ασκήσεις Μαθήματος Επαναληπτικές Ασκήσεις Μαθήματος Ερώτηση: EAM1. Ποιο από τα παρακάτω χαρακτηριστικά δεν αποτελεί κριτήριο κατηγοριοποίησης δικτύων. Κλίμακα Τεχνολογία μετάδοσης Πλήθος τερματικών εντός του δικτύου Ερώτηση:

Διαβάστε περισσότερα

Αντικειμενοστρεφής Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΙΚΑ ΜΑΘΗΜΑΤΑ Αντικειμενοστρεφής Προγραμματισμός Ενότητα 1: Εισαγωγή Γρηγόρης Τσουμάκας, Επικ. Καθηγητής Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται

Διαβάστε περισσότερα

Τεχνολογίες Παγκόσμιου Ιστού. 1η διάλεξη

Τεχνολογίες Παγκόσμιου Ιστού. 1η διάλεξη Τεχνολογίες Παγκόσμιου Ιστού 1η διάλεξη Χαρακτηριστικά Μαθήματος Μάθημα προγραμματισμού (και όχι μόνον) Μπορεί να εξελιχθεί σε εφιάλτη αν δεν έχετε καλή γνώση και αρκετή εμπειρία προγραμματισμού (Java)

Διαβάστε περισσότερα

Αρχιτεκτονική του πληροφοριακού συστήµατος Cardisoft Γραµµατεία 2003 ιαχείριση Προσωπικού

Αρχιτεκτονική του πληροφοριακού συστήµατος Cardisoft Γραµµατεία 2003 ιαχείριση Προσωπικού Αρχιτεκτονική του πληροφοριακού συστήµατος Cardisoft Γραµµατεία 2003 ιαχείριση Προσωπικού Γενικά Η αρχιτεκτονική ανάπτυξης τους πληροφοριακού συστήµατος Γραµµατεία 2000 υποσύστηµα διαχείρισης προσωπικού

Διαβάστε περισσότερα

ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ. Παράδοση Ασκήσεων Κεφάλαιο 2 Ασκήσεις 3,6,8,9,15,22,24,26. Γεωργόπουλος Άλκης Α.Μ.: 39 Κοντογιώργης Αναστάσιος A.M.

ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ. Παράδοση Ασκήσεων Κεφάλαιο 2 Ασκήσεις 3,6,8,9,15,22,24,26. Γεωργόπουλος Άλκης Α.Μ.: 39 Κοντογιώργης Αναστάσιος A.M. ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ Παράδοση Ασκήσεων Κεφάλαιο 2 Ασκήσεις 3,6,8,9,15,22,24,26 Γεωργόπουλος Άλκης Α.Μ.: 39 Κοντογιώργης Αναστάσιος A.M.: 43 Άσκηση 3 Μια αξιόπιστη multicast υπηρεσία επιτρέπει σε έναν

Διαβάστε περισσότερα

Διπλωματική Εργασία. Μέλλιος Θωμάς, Πετρίδης Κοσμάς. Επιβλέπων Καθηγητής: Πρωτόγερος Νικόλαος

Διπλωματική Εργασία. Μέλλιος Θωμάς, Πετρίδης Κοσμάς. Επιβλέπων Καθηγητής: Πρωτόγερος Νικόλαος Διπλωματική Εργασία Αμφίδρομη επικοινωνία μεταξύ μίας Διαδικτυακής Πύλης Πανεπιστημίου και μίας εφαρμογής διαχείρισης γραμματείας με χρήση Web Services Επιβλέπων Καθηγητής: Πρωτόγερος Νικόλαος Θεσσαλονίκη,

Διαβάστε περισσότερα

Τι είναι ένα δίκτυο υπολογιστών; Αρχιτεκτονική επιπέδων πρωτοκόλλων. Δικτυακά πρωτόκολλα

Τι είναι ένα δίκτυο υπολογιστών; Αρχιτεκτονική επιπέδων πρωτοκόλλων. Δικτυακά πρωτόκολλα Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής Εισαγωγή στην Επιστήμη των Υπολογιστών 2014-15 Δίκτυα υπολογιστών (και το Διαδίκτυο) http://di.ionio.gr/~mistral/tp/csintro/ Μ.Στεφανιδάκης Τι είναι ένα δίκτυο υπολογιστών;

Διαβάστε περισσότερα

Πίνακας Εικόνων. 22/04/2014 Έκδοση 3.0.1

Πίνακας Εικόνων. 22/04/2014 Έκδοση 3.0.1 Προδιαγραφές για Προγραμματιστές Διαδικτυακής Υπηρεσίας «Βασικά στοιχεία μητρώου για νομικά πρόσωπα, νομικές οντότητες, και φυσικά πρόσωπα με εισόδημα από επιχειρηματική δραστηριότητα». Πίνακας Περιεχομένων

Διαβάστε περισσότερα

Διαφορές single-processor αρχιτεκτονικών και SoCs

Διαφορές single-processor αρχιτεκτονικών και SoCs 13.1 Τα συστήματα και η επικοινωνία μεταξύ τους γίνονται όλο και περισσότερο πολύπλοκα. Δεν μπορούν να περιγραφούνε επαρκώς στο επίπεδο RTL καθώς αυτή η διαδικασία γίνεται πλέον αρκετά χρονοβόρα. Για αυτό

Διαβάστε περισσότερα

Πανεπιστήµιο Πειραιώς Τµήµα : Ψηφιακών Συστηµάτων Πρόγραµµα Μεταπτυχιακών Σπουδών Κατεύθυνση :Ψηφιακών επικοινωνιών και δικτύων.

Πανεπιστήµιο Πειραιώς Τµήµα : Ψηφιακών Συστηµάτων Πρόγραµµα Μεταπτυχιακών Σπουδών Κατεύθυνση :Ψηφιακών επικοινωνιών και δικτύων. Πανεπιστήµιο Πειραιώς Τµήµα : Ψηφιακών Συστηµάτων Πρόγραµµα Μεταπτυχιακών Σπουδών Κατεύθυνση :Ψηφιακών επικοινωνιών και δικτύων Πτυχιακή εργασία Του Σπουδασττή ΧΡΙΣΤΟΦΟΡΟΥ Β.. ΚΑΡΑΧΡΗΣΤΟΥ Πειιραιιάς 2009

Διαβάστε περισσότερα

Ενότητα 12 (κεφάλαιο 28) Αρχιτεκτονικές Εφαρμογών

Ενότητα 12 (κεφάλαιο 28) Αρχιτεκτονικές Εφαρμογών ΕΠΛ362: Τεχνολογία Λογισμικού ΙΙ (μετάφραση στα ελληνικά των διαφανειών του βιβλίου Software Engineering, 9/E, Ian Sommerville, 2011) Ενότητα 12 (κεφάλαιο 28) Αρχιτεκτονικές Εφαρμογών Οι διαφάνειες αυτές

Διαβάστε περισσότερα

Τεχνολογία Διοίκησης Επιχειρησιακών Διαδικασιών

Τεχνολογία Διοίκησης Επιχειρησιακών Διαδικασιών ΕΘΝΙΚΟ ΚΑΙ ΚΑΠΟΔΙΣΤΡΙΑΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΠΡΟΓΡΑΜΜΑ ΜΕΤΑΠΤΥΧΙΑΚΩΝ ΣΠΟΥΔΩΝ Τεχνολογία Διοίκησης Επιχειρησιακών Διαδικασιών Οδηγός Εργαστηρίου:

Διαβάστε περισσότερα

Βασίλειος Κοντογιάννης ΠΕ19

Βασίλειος Κοντογιάννης ΠΕ19 Ενότητα3 Επικοινωνία και Διαδίκτυο Κεφ10: Υπηρεσίες και Εφαρμογές Διαδικτύου 10.1 Υπηρεσίες Διαδικτύου Υπηρεσίες Επικοινωνίας Ηλεκτρονικό Ταχυδρομείο (e-mail) Υπηρεσία του Διαδικτύου για διακίνηση γραπτών

Διαβάστε περισσότερα

ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ - ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. WSDLBook:

ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ - ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. WSDLBook: ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ - ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ WSDLBook: Web 2.0 εφαρμογή για WSDL Περιγραφές Υπηρεσιών Ιστού (Web Services) Διπλωματική Εργασία του Γεωργακάκη Νικολάου

Διαβάστε περισσότερα

Βασικές Υπηρεσίες Διαδικτύου. Επικοινωνίες Δεδομένων Μάθημα 2 ο

Βασικές Υπηρεσίες Διαδικτύου. Επικοινωνίες Δεδομένων Μάθημα 2 ο Βασικές Υπηρεσίες Διαδικτύου Επικοινωνίες Δεδομένων Μάθημα 2 ο Μεταφορά αρχείων (File Transfer Protocol, FTP) user at host FTP user interface FTP client local file system file transfer FTP server remote

Διαβάστε περισσότερα

Γενικές Αρχές. Τεχνολογία ικτύων Επικοινωνιών ΙΙ

Γενικές Αρχές. Τεχνολογία ικτύων Επικοινωνιών ΙΙ Τεχνολογία ικτύων Επικοινωνιών ΙΙ 7.1.1. Γενικές Αρχές 1. Τι ονοµάζεται επικοινωνιακό υποδίκτυο και ποιο είναι το έργο του; Το σύνολο όλων των ενδιάµεσων κόµβων που εξασφαλίζουν την επικοινωνία µεταξύ

Διαβάστε περισσότερα

Ανάπτυξη Συστήματος Σύνθεσης Υπηρεσιών Ιστού

Ανάπτυξη Συστήματος Σύνθεσης Υπηρεσιών Ιστού ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ - ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ Ανάπτυξη Συστήματος Σύνθεσης Υπηρεσιών Ιστού Διπλωματική Εργασία του Σιδηρόπουλου Ανέστη (ΑΕΜ: 1537) Επιβλέπων Καθηγητής:

Διαβάστε περισσότερα

08 Η γλώσσα UML I. Τεχνολογία Λογισμικού. Σχολή Hλεκτρολόγων Mηχανικών & Mηχανικών Yπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο. Χειμερινό εξάμηνο

08 Η γλώσσα UML I. Τεχνολογία Λογισμικού. Σχολή Hλεκτρολόγων Mηχανικών & Mηχανικών Yπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο. Χειμερινό εξάμηνο 08 Η γλώσσα UML I Τεχνολογία Λογισμικού Σχολή Hλεκτρολόγων Mηχανικών & Mηχανικών Yπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο Χειμερινό εξάμηνο 2017 18 Δρ. Κώστας Σαΐδης saiko@di.uoa.gr Unified Modeling Language

Διαβάστε περισσότερα

Διαδικτυακές Εφαρμογές. Ενότητα 2: Enterprise Java Beans και Java Server Faces Μιχάλας Άγγελος Βούρκας Δημήτριος Τμήμα Μηχανικών Πληροφορικής ΤΕ

Διαδικτυακές Εφαρμογές. Ενότητα 2: Enterprise Java Beans και Java Server Faces Μιχάλας Άγγελος Βούρκας Δημήτριος Τμήμα Μηχανικών Πληροφορικής ΤΕ Διαδικτυακές Εφαρμογές Ενότητα 2: Enterprise Java Beans και Java Server Faces Μιχάλας Άγγελος Βούρκας Δημήτριος Τμήμα Μηχανικών Πληροφορικής ΤΕ Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες

Διαβάστε περισσότερα

Εισαγωγή στις Αρχές της Επιστήμης των ΗΥ

Εισαγωγή στις Αρχές της Επιστήμης των ΗΥ Εισαγωγή στις Αρχές της Επιστήμης των ΗΥ 2.3.1.1. Παπαγιάννη Νάσια Ηλεκτρολόγος Μηχανικός και Μηχανικός Υπολογιστών ΕΜΠ 1 περιλαμβάνει: Η έννοια του προγράμματος Επίλυση προβλήματος 1. Ακριβή προσδιορισμό

Διαβάστε περισσότερα

Τεχνολογία Δικτύων Επικοινωνιών (Ενότητα Πρωτόκολλα και Αρχιτεκτονική Δικτύου)

Τεχνολογία Δικτύων Επικοινωνιών (Ενότητα Πρωτόκολλα και Αρχιτεκτονική Δικτύου) Τεχνολογία Δικτύων Επικοινωνιών (Ενότητα 1.7 - Πρωτόκολλα και Αρχιτεκτονική Δικτύου) Πρωτόκολλο είναι ένα σύνολο κανόνων που πρέπει να ακολουθήσουν όλοι οι σταθμοί εργασίας σε ένα δίκτυο ώστε να μπορούν

Διαβάστε περισσότερα

Εισαγωγή στην Επιστήμη των Υπολογιστών

Εισαγωγή στην Επιστήμη των Υπολογιστών Εισαγωγή στην Επιστήμη των Υπολογιστών Ενότητα 1: Διαδικαστικά Τμήμα: Αγροτικής Οικονομίας & Ανάπτυξης Διδάσκων: Θεόδωρος Τσιλιγκιρίδης Μαθησιακοί Στόχοι Παρουσίαση της δομής και των περιεχομένων του μαθήματος.

Διαβάστε περισσότερα

Π Τ Υ Χ Ι Α Κ Η Ε Ρ Γ Α Σ Ι Α

Π Τ Υ Χ Ι Α Κ Η Ε Ρ Γ Α Σ Ι Α ΑΝΩΤΑΤΟ ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙ ΕΥΤΙΚΟ Ι ΡΥΜΑ ΠΕΙΡΑΙΑ ΤΜΗΜΑ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΤΟΜΕΑΣ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ Η/Υ, ΠΛΗΡΟΦΟΡΙΚΗΣ & ΙΚΤΥΩΝ Εργ. Τεχνολογίας Λογισμικού & Υπηρεσιών S 2 E Lab Π Τ Υ Χ Ι

Διαβάστε περισσότερα

a. b. c. d ΤΕΧΝΟΛΟΓΙΑ ΔΙΚΤΥΩΝ ΕΠΙΚΟΙΝΩΝΙΩΝ

a. b. c. d ΤΕΧΝΟΛΟΓΙΑ ΔΙΚΤΥΩΝ ΕΠΙΚΟΙΝΩΝΙΩΝ 7.7 Πρωτόκολλο Μέχρι τώρα έχουμε αναφέρει, ότι, για να μεταδοθούν τα αυτοδύναμα πακέτα στο φυσικό μέσο, πρέπει αυτά να μετατραπούν σε πακέτα φυσικού δικτύου (π.χ. Ethernet). Όμως, δεν έχει ειπωθεί τίποτε

Διαβάστε περισσότερα

ΠΛΗΡΟΦΟΡΙΑΚΑ ΣΥΣΤΗΜΑΤΑ ΔΙΟΙΚΗΣΗΣ MANAGEMENT INFORMATION SYSTEMS (M.I.S.)

ΠΛΗΡΟΦΟΡΙΑΚΑ ΣΥΣΤΗΜΑΤΑ ΔΙΟΙΚΗΣΗΣ MANAGEMENT INFORMATION SYSTEMS (M.I.S.) ΠΛΗΡΟΦΟΡΙΑΚΑ ΣΥΣΤΗΜΑΤΑ ΔΙΟΙΚΗΣΗΣ MANAGEMENT INFORMATION SYSTEMS (M.I.S.) 1.1 Κωνσταντίνος Ταραμπάνης Καθηγητής Τμήμα Οργάνωσης και Διοίκησης Επιχειρήσεων Πανεπιστήμιο Μακεδονίας Γρ. 307 2310-891-578 kat@uom.gr

Διαβάστε περισσότερα

Βάσεις Δεδομένων ΙΙ. Διάλεξη 5 η XML και ΒΔ στο Διαδίκτυο

Βάσεις Δεδομένων ΙΙ. Διάλεξη 5 η XML και ΒΔ στο Διαδίκτυο Βάσεις Δεδομένων ΙΙ Διάλεξη 5 η XML και ΒΔ στο Διαδίκτυο Δ. Χριστοδουλάκης - Α. Φωκά Τμήμα Μηχανικών Η/Υ & Πληροφορικής - Εαρινό Εξάμηνο 2007 Εισαγωγή Πολλές εφαρμογές διαδικτύου υποστηρίζουν web διεπαφές

Διαβάστε περισσότερα

Νέες τεχνολογίες εισάγονται ή χρησιµοποιούνται

Νέες τεχνολογίες εισάγονται ή χρησιµοποιούνται special report τoυ Γιώργου Φετοκάκη / gfetokakis@boussias.com Jobs scheduling Η χρυσή τοµή της αυτοµατοποίησης Μια λύση job scheduling πρέπει να είναι αρκετά περιεκτική. Πρέπει να υποστηρίζει την ενσωµάτωση

Διαβάστε περισσότερα

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΑΝΑΛΥΣΗ Διαγράμματα Αλληλεπίδρασης. Ιωάννης Σταμέλος Βάιος Κολοφωτιάς Πληροφορική

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΑΝΑΛΥΣΗ Διαγράμματα Αλληλεπίδρασης. Ιωάννης Σταμέλος Βάιος Κολοφωτιάς Πληροφορική ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΑΝΑΛΥΣΗ Διαγράμματα Αλληλεπίδρασης Ιωάννης Σταμέλος Βάιος Κολοφωτιάς Πληροφορική Θεσσαλονίκη, Σεπτέμβριος 2013 Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative

Διαβάστε περισσότερα

Σχεδιασµός βασισµένος σε συνιστώσες

Σχεδιασµός βασισµένος σε συνιστώσες Σχεδιασµός βασισµένος σε συνιστώσες 1 Ενδεικτικά περιεχόµενα του κεφαλαίου Ποια είναι τα "άτοµα", από τα οποία κατασκευάζονται οι υπηρεσίες; Πώς οργανώνουµε τις συνιστώσες σε ένα αρµονικό σύνολο; Τι είναι

Διαβάστε περισσότερα

Κεφάλαιο 7 Διαδικτύωση-Internet. 7.2 Τεχνολογία TCP/IP

Κεφάλαιο 7 Διαδικτύωση-Internet. 7.2 Τεχνολογία TCP/IP Κεφάλαιο 7 Διαδικτύωση-Internet 7.2 Τεχνολογία TCP/IP Τι δηλώνει ο όρος «TCP/IP»; Ο όρος TCP/IP αναφέρεται σε μια ομάδα ομοειδών πρωτοκόλλων που χρησιμοποιούνται για την επικοινωνία των δικτύων υπολογιστών

Διαβάστε περισσότερα

28 Πολυπρακτορικά Συστήµατα

28 Πολυπρακτορικά Συστήµατα ΚΕΦΑΛΑΙΟ 28 28 Πολυπρακτορικά Συστήµατα "There is no such thing as a single agent system". [Woodridge, 2002] Η παραπάνω ρήση από το βιβλίο του M.Wooldridge τονίζει, ίσως µε περισσή έµφαση, ότι είναι πλέον

Διαβάστε περισσότερα

Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής Εισαγωγή στην Επιστήμη των Υπολογιστών 2014-15. Δίκτυα υπολογιστών. (και το Διαδίκτυο)

Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής Εισαγωγή στην Επιστήμη των Υπολογιστών 2014-15. Δίκτυα υπολογιστών. (και το Διαδίκτυο) Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής Εισαγωγή στην Επιστήμη των Υπολογιστών 2014-15 Δίκτυα υπολογιστών (και το Διαδίκτυο) http://di.ionio.gr/~mistral/tp/csintro/ Μ.Στεφανιδάκης Τι είναι ένα δίκτυο υπολογιστών;

Διαβάστε περισσότερα

Μάθημα 5: To Μοντέλο Αναφοράς O.S.I.

Μάθημα 5: To Μοντέλο Αναφοράς O.S.I. Μάθημα 5: To Μοντέλο Αναφοράς O.S.I. 5.1 Γενικά Τα πρώτα δίκτυα χαρακτηρίζονταν από την «κλειστή» αρχιτεκτονική τους με την έννοια ότι αυτή ήταν γνωστή μόνο στην εταιρία που την είχε σχεδιάσει. Με τον

Διαβάστε περισσότερα

Εισαγωγικό Μάθημα Βασικές Έννοιες - Ανάλυση Απαιτήσεων

Εισαγωγικό Μάθημα Βασικές Έννοιες - Ανάλυση Απαιτήσεων ..?????? Εργαστήριο ΒΑΣΕΙΣ????????? ΔΕΔΟΜΕΝΩΝ Βάσεων Δεδομένων?? ΙΙ Εισαγωγικό Μάθημα Βασικές Έννοιες - . Γενικά Τρόπος Διεξαγωγής Ορισμός: Βάση Δεδομένων (ΒΔ) είναι μια συλλογή από σχετιζόμενα αντικείμενα

Διαβάστε περισσότερα

Περιεχόμενο του μαθήματος

Περιεχόμενο του μαθήματος ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ Απαιτήσεις Λογισμικού Περιπτώσεις χρήσης Δρ Βαγγελιώ Καβακλή Τμήμα Πολιτισμικής Τεχνολογίας και Επικοινωνίας Πανεπιστήμιο Αιγαίου Εαρινό Εξάμηνο 2012-2013 1 Περιεχόμενο του μαθήματος

Διαβάστε περισσότερα

Ανάπτυξη διαδικτυακής διαδραστικής εκπαιδευτικής εφαρμογής σε λειτουργικό σύστημα Android

Ανάπτυξη διαδικτυακής διαδραστικής εκπαιδευτικής εφαρμογής σε λειτουργικό σύστημα Android Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Τμήμα Ηλεκτρονικών Μηχανικών Τ.Ε. Ανάπτυξη διαδικτυακής διαδραστικής εκπαιδευτικής εφαρμογής σε λειτουργικό σύστημα Android Πτυχιακή Εργασία Φοιτητής:

Διαβάστε περισσότερα

ΚΕΦΑΛΑΙΟ Web Services

ΚΕΦΑΛΑΙΟ Web Services ΚΕΦΑΛΑΙΟ Web Services Προϋποθέσεις εγκατάστασης Web Services για το Κεφάλαιο 4.50 1. Κεφάλαιο έκδοση 4.51e build 458 ή νεότερο 2. Internet Information Server (IIS) version 6 ή νεότερος 3. Σε κάποιον υπολογιστή

Διαβάστε περισσότερα

Δίκτυα Υπολογιστών ΙΙ (Ασκήσεις Πράξης)

Δίκτυα Υπολογιστών ΙΙ (Ασκήσεις Πράξης) TEI Σερρών Τμήμα Πληροφορικής και Επικοινωνιών Δίκτυα Υπολογιστών ΙΙ (Ασκήσεις Πράξης) Ανάλυση Πρωτοκόλλων Τομέας Τηλεπικοινωνιών και Δικτύων Δρ. Αναστάσιος Πολίτης Καθηγητής Εφαρμογών anpol@teiser.gr

Διαβάστε περισσότερα

Τεχνολογίες Ανάπτυξης Ηλεκτρονικού Καταστήματος Μικρομεσαίας Επιχείρησης. Μικρομεσαίες Επιχειρήσεις και Καινοτομία

Τεχνολογίες Ανάπτυξης Ηλεκτρονικού Καταστήματος Μικρομεσαίας Επιχείρησης. Μικρομεσαίες Επιχειρήσεις και Καινοτομία Τεχνολογίες Ανάπτυξης Ηλεκτρονικού Καταστήματος Μικρομεσαίας Επιχείρησης Μικρομεσαίες Επιχειρήσεις και Καινοτομία Ηλεκτρονικό Εμπόριο H δυνατότητα των καταναλωτών και των εμπορικών καταστημάτων να κάνουν

Διαβάστε περισσότερα

Διαδίκτυο: δίκτυο διασυνδεμένων δικτύων Ξεκίνησε ως ένα μικρό κλειστό στρατιωτικό δίκτυο, απόρροια του Ψυχρού Πολέμου μεταξύ ΗΠΑ και ΕΣΣΔ.

Διαδίκτυο: δίκτυο διασυνδεμένων δικτύων Ξεκίνησε ως ένα μικρό κλειστό στρατιωτικό δίκτυο, απόρροια του Ψυχρού Πολέμου μεταξύ ΗΠΑ και ΕΣΣΔ. ΚΕΦΑΛΑΙΟ 9 Διαδίκτυο: δίκτυο διασυνδεμένων δικτύων Ξεκίνησε ως ένα μικρό κλειστό στρατιωτικό δίκτυο, απόρροια του Ψυχρού Πολέμου μεταξύ ΗΠΑ και ΕΣΣΔ. Το 1966 αρχίζει ο σχεδιασμός του ARPANET, του πρώτου

Διαβάστε περισσότερα

Λειτουργικά Συστήματα Ι. Καθηγήτρια Παπαδάκη Αναστασία

Λειτουργικά Συστήματα Ι. Καθηγήτρια Παπαδάκη Αναστασία Λειτουργικά Συστήματα Ι Καθηγήτρια Παπαδάκη Αναστασία 2013 1 Ηλεκτρονικός Υπολογιστής αποτελείται: 1. Από Υλικό Hardware (CPUs, RAM, Δίσκοι), & 2. Λογισμικό - Software Και μπορεί να εκτελέσει διάφορες

Διαβάστε περισσότερα

ΜΕΛΕΤΗ ΣΧΕΔΙΑΣΗ ΕΦΑΡΜΟΓΗΣ ΣΕ ΥΠΟΛΟΓΙΣΤΙΚΟ ΝΕΦΟΣ (CLOUD COMPUTING) ΜΕ ΕΜΦΑΣΗ ΣΤΗΝ ΚΑΤΑΣΚΕΥΗ ΔΕΝΤΡΩΝ.

ΜΕΛΕΤΗ ΣΧΕΔΙΑΣΗ ΕΦΑΡΜΟΓΗΣ ΣΕ ΥΠΟΛΟΓΙΣΤΙΚΟ ΝΕΦΟΣ (CLOUD COMPUTING) ΜΕ ΕΜΦΑΣΗ ΣΤΗΝ ΚΑΤΑΣΚΕΥΗ ΔΕΝΤΡΩΝ. ΤΕΙ ΠΕΙΡΑΙΑ ΤΜΗΜΑ ΗΥΣ Θέμα: ΜΕΛΕΤΗ ΣΧΕΔΙΑΣΗ ΕΦΑΡΜΟΓΗΣ ΣΕ ΥΠΟΛΟΓΙΣΤΙΚΟ ΝΕΦΟΣ (CLOUD COMPUTING) ΜΕ ΕΜΦΑΣΗ ΣΤΗΝ ΚΑΤΑΣΚΕΥΗ ΔΕΝΤΡΩΝ. Εισηγητής: Δ. Ν. Καλλέργης, MSc. Φοιτήτρια: Κοντζοπούλου Παναγιώτα Εισαγωγή

Διαβάστε περισσότερα

SNMP ΔΙΑΧΕΙΡΙΣΗ ΔΙΚΤΥΟΥ ΒΑΣΙΚΕΣ ΕΝΝΟΙΕΣ

SNMP ΔΙΑΧΕΙΡΙΣΗ ΔΙΚΤΥΟΥ ΒΑΣΙΚΕΣ ΕΝΝΟΙΕΣ Κεφάλαιο 4 SNMP ΔΙΑΧΕΙΡΙΣΗ ΔΙΚΤΥΟΥ ΒΑΣΙΚΕΣ ΕΝΝΟΙΕΣ 1 4.1 ΕΙΣΑΓΩΓΗ...3 4.2 ΒΑΣΙΚΕΣ ΕΝΝΟΙΕΣ...3 4.2.1 Η ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΤΗΣ ΔΙΑΧΕΙΡΙΣΗΣ ΔΙΚΤΥΟΥ...3 4.2.1.1 ΣΤΑΘΜΟΣ ΔΙΑΧΕΙΡΙΣΗΣ ΔΙΚΤΥΟΥ...4 4.2.1.2 ΔΙΑΧΕΙΡΙΖΟΜΕΝΟΙ

Διαβάστε περισσότερα

ΕΡΓΑΣΙΑ. (στο μάθημα: Τεχνολογίες Εφαρμογών Διαδικτύου του Η εξαμήνου σπουδών του Τμήματος Πληροφορικής & Τηλ/νιών)

ΕΡΓΑΣΙΑ. (στο μάθημα: Τεχνολογίες Εφαρμογών Διαδικτύου του Η εξαμήνου σπουδών του Τμήματος Πληροφορικής & Τηλ/νιών) ΕΡΓΑΣΙΑ (στο μάθημα: Τεχνολογίες Εφαρμογών Διαδικτύου του Η εξαμήνου σπουδών του Τμήματος Πληροφορικής & Τηλ/νιών) Τίτλος: Εφαρμογή Διαδικτύου Ηλεκτρονικού Καταστήματος Ζητούμενο: Να αναπτυχθεί web εφαρμογή,

Διαβάστε περισσότερα

Δυναμικές Ιστοσελίδες στο Πανελλήνιο Σχολικό Δίκτυο

Δυναμικές Ιστοσελίδες στο Πανελλήνιο Σχολικό Δίκτυο Δυναμικές Ιστοσελίδες στο Πανελλήνιο Σχολικό Δίκτυο Δρ. Χρήστος Όροβας Τεχνικός Υπεύθυνος 1 Διαδικασία «Φόρτωσης» μιας Ιστοσελίδας Internet Explorer, Mozilla, Chrome, κτλ HTTP Server ΠΣΔ Αίτημα για επικοινωνία

Διαβάστε περισσότερα

Το λειτουργικό σύστημα. Προγραμματισμός II 1

Το λειτουργικό σύστημα. Προγραμματισμός II 1 Το λειτουργικό σύστημα Προγραμματισμός II 1 lalis@inf.uth.gr Συστήματα υπολογιστών Ειδικού σκοπού συστήματα για μια συγκεκριμένη εφαρμογή η εφαρμογή είναι γνωστή εκ των προτέρων περιορισμένοι υπολογιστικοί

Διαβάστε περισσότερα