ΕΡΓΑΣΤΗΡΙΟ Ηλεκτρονικού Εμπορίου Ε-Επιχειρείν

Slides:



Advertisements
Παρόμοιες παρουσιάσεις
Κληρονομικότητα. Εισαγωγή  Κληρονομικότητα (Inheritance) καλείται ο μηχανισμός με τον οποίο μία νέα κλάση που ονομάζεται παράγωγη (derived class) δημιουργείται.
Advertisements

Συλλογές, Στοίβες και Ουρές Σε πολλές εφαρμογές μας αρκεί η αναπαράσταση ενός δυναμικού συνόλου με μια δομή δεδομένων η οποία δεν υποστηρίζει την αναζήτηση.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Αναφορές Μέθοδοι που επιστρέφουν αντικείμενα Copy Constructor Deep and Shallow Copies.
ΜΑΘΗΜΑ: ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ C++ ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ Δευτέρα, 30 Ιουνίου 2014Δευτέρα, 30 Ιουνίου 2014Δευτέρα, 30 Ιουνίου 2014Δευτέρα, 30 Ιουνίου 2014Τμ.
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Κεφάλαιο 6 Threads. 2 Στον παραδοσιακό προγραμματισμό όταν ένα πρόγραμμα εκτελείται ονομάζεται process (διεργασία) και οι εντολές του εκτελούνται σειριακά.
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Εισαγωγή στον Προγραμματισμό, Αντώνιος Συμβώνης, ΣΕΜΦΕ, ΕΜΠ, Slide 1 Εβδομάδα 3: Υλοποίηση μεθόδων.
 Αυδίκου Χριστίνα  Γιουμούκης Παναγιώτης  Κιντσάκης Θάνος  Πάπιστας Γιάννης.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Πίνακες Κλάσεις και Αντικείμενα.
Φροντηστήριο Διαχείριση Περιεχομένου Παγκόσμιου Ιστού και Γλωσσικά Eργαλεία.
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Φροντιστήρια Εισηγητής: Σπύρος Αργυρόπουλος Μέλος ΕΤΕΠ Εργαστήριο Προγραμματισμού & Τεχνολογίας Ευφυών Συστημάτων.
Πανεπιστήμιο Ιωαννίνων Ανάκτηση Πληροφορίας Τμήμα Πληροφορικής Ακαδημαϊκό Έτος MapReduce: Simplified Data processing on Large Clusters Φώτης.
Σχεδίαση-Ανάπτυξη Εφαρμογών Πληροφορικής Αντώνιος Συμβώνης, ΕΜΠ, Slide 1 Week 9: Input / Output Εβδομάδα 8: Είσοδος / Έξοδος [Input / Output]
Σχεδίαση-Ανάπτυξη Εφαρμογών Πληροφορικής Αντώνιος Συμβώνης, ΕΜΠ, Slide 1 Week 4: Exceptions Εβδομάδα 4: Εξαιρέσεις [Exceptions]
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Στατικές μέθοδοι και μεταβλητές Εσωτερικές κλάσεις.
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Εισαγωγή στη Java II.
ΗΥ302 Διδακτική της Πληροφορικής Η γλώσσα προγραμματισμού LOGO Writer Ομάδα Εργασία: Αλεβίζου Βασιλική (Α.Μ.:1029) Κοφφινά Ιωάννα (Α.Μ.:1035) Τριανταφυλλίδου.
Εισαγωγή στον Προγραμματισμό, Αντώνιος Συμβώνης, ΣΕΜΦΕ, ΕΜΠ, Slide 1 Εβδομάδα 11: Εκτέλεση Java χωρίς το BlueJ.
PHP/MYSQL ΠΑΡΟΥΣΙΑΣΗ ΣΤΑ ΠΛΑΙΣΙΑ ΤΟΥ ΜΑΘΗΜΑΤΟΣ ΕΠΟΙΚΟΙΝΩΝΙΑ ΑΝΘΡΩΠΟΥ-ΜΗΧΑΝΗΣ ΤΥΡΟΛΟΓΟΥ ΓΛΥΚΕΡΙΑ ΑΜ 875 ΡΙΖΟΥ ΔΕΣΠΟΙΝΑ ΑΜ 816.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Αντικείμενα ως ορίσματα Εισαγωγή στις αναφορές.
1 Εισαγωγή στη Java Χρήσιμες Διευθύνσεις Χαρακτηριστικά της Java Εργαλεία της Java Εργαλεία της Java Μεταγλώττιση στοιχειωδών εφαρμογών.
Επικοινωνία Ανθρώπου Μηχανής HTML CGI JAVASCRIPT Κουμπούλης Χρήστος Α.Μ. 921 Χαλαβαζής Βασίλης Α.Μ. 988.
Applets Εκμεταλλεύονται τo γραφικό υπόβαθρο που παρέχουν οι browsers, έχοντας έτσι τη δυνατότητα προβολής γραφικών και τη δυνατότητα υλοποίησης ενός γραφικού.
Διαχείριση γεγονότων (events) Γεγονότα: Κλήσεις που παράγονται από γραφικά στοιχεία (Components) π.χ. click ποντικιού, μετακίνηση ποντικιού Ακρόαση-Διαχείριση.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Copy Constructor Deep and Shallow Copies.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Πολυμορφισμός – Αφηρημένες κλάσεις Interfaces (διεπαφές)
Έλεγχος Ονομάτων (Name Control) Για ένα πρόγραμμα που αποτελείται από πολλά τμήματα κάποια από τα οποία έχουν πιθανώς γραφτεί από άλλους προγραμματιστές.
Tomcat Θ. Βαρβαρίγου Καθηγήτρια ΕΜΠ Τηλ
Γλωσσική Τεχνολογία HTML/XML Processing – HTTP Services.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα Αναφορές.
1 Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστών και Πληροφορικής Πανεπιστήμιο Πατρών ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ (C++) Τάξεις και Αφαίρεση Δεδομένων.
Threads Στον παραδοσιακό προγραμματισμό όταν ένα πρόγραμμα εκτελείται ονομάζεται process (διεργασία) και οι εντολές του εκτελούνται σειριακά η μία μετά.
Streams Streams: κανάλια ροής δεδομένων Κανάλια εισόδου: ανάγνωση δεδομένων Κανάλια εξόδου: αποστολή δεδομένων Συνήθεις πηγές και προορισμοί δεδομένων:
Applets Εκτελούνται από τον appletviewer και από Java enabled web browsers Εκμεταλλεύονται τo γραφικό υπόβαθρο που παρέχουν οι browsers, έχοντας έτσι τη.
ΗΥ150 – ΠρογραμματισμόςΞ. Ζαμπούλης ΗΥ-150 Προγραμματισμός Αρχεία.
Κεφάλαιο 4 Εξαιρέσεις. Όταν σε ένα πρόγραμμα συμβεί κάποιο λάθος, ο κώδικας εγείρει (throw) μία εξαίρεση. Στη Java oι εξαιρέσεις εκπροσωπούνται από αντικείμενα.
XML Parsing Γιώργος Θάνος Παρασκευή 14 Νοεμβρίου 2008.
Κεφάλαιο 3 Τύποι Δεδομένων - Τελεστές. Πρωτογενείς τύποι δεδομένων: int, float, double, chars ΤύποςΌνομαΜέγεθος byte 8-bit signed, short 16-bit.
Εισαγωγή στη JAVΑ (μέρος Β’) Βασίλης Παπαταξιάρχης Μάθημα: Αντικειμενοστραφής Προγραμματισμός Διδάσκουσα: Ιζαμπώ Καράλη Τμήμα Πληροφορικής.
Εισαγωγή στη Java (Μέρος B’) Για όσους γνωρίζουν C++ Βασίλης Στούμπος
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα.
ΕΡΓΑΣΤΗΡΙΟ – No.7 Ηλεκτρονικού Εμπορίου Ε-Επιχειρείν Δρ. Χρήστος Κ. Γεωργιάδης Java APIs για Web Services: ΧΜL και JSP.
Προγραμματισμός Εφαρμογών Διαδικτύου
Εισαγωγή στον Προγ/μό Η/Υ
Ασκήσεις στην Java-XML
Αρχεσ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Η/Υ ΤΑξη Β΄
Κατανεμημένα Συστήματα
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Κλάσεις και αντικείμενα
Wrapper Classes, Abstract Classes and Interfaces
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
Κατανεμημένα Συστήματα
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Web Services στη C# Εργαστήριο 3
Εισαγωγή στον Προγ/μό Υπολογιστών
Κεφάλαιο 10 Streams.
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ
Εισαγωγή στη Java (Μέρος Α’)
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό (στη γλώσσα Java)
Εξαιρέσεις [Exceptions]
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Μεταγράφημα παρουσίασης:

ΕΡΓΑΣΤΗΡΙΟ Ηλεκτρονικού Εμπορίου Ε-Επιχειρείν ΕΡΓΑΣΤΗΡΙΟ Ηλεκτρονικού Εμπορίου Ε-Επιχειρείν Java APIs για Web Services: ΧΜL και JSP Δρ. Χρήστος Κ. Γεωργιάδης - 2003

Java API for XML Processing (JAXP) Επεξεργασία XML δεδομένων με χρήση εφαρμογών κωδικοποιημένων στη γλώσσα Java Τα τρέχοντα APIs για πρόσβαση σε έγγραφα XML, είτε σειριακά είτε με δυνατότητα τυχαίας προσπέλασης είναι αντίστοιχα το SAX και το DOM. Τα βασικά JAXP APIs ορίζονται στο πακέτο (package) javax.xml.parsers SAX (Simple API for XML Parsing) Είναι στην πραγματικότητα ένα προϊόν συνεργασίας της λίστα ηλεκτρονικής αλληλογραφίας XML-DEV, παρά ένα προϊόν από τη W3C. Αλλά διαθέτει «τελικά» χαρακτηριστικά όπως προβλέπει η σύσταση (recommendation) της W3C. Αναλύει τα δεδομένα ως ρεύμα συμβάντων (stream of events) και κάνει επεξεργασία στοιχείο-προς-στοιχείο. Δρ. Χρήστος Κ. Γεωργιάδης - 2003

SAX (απλή διεπαφή προγραμματισμού εφαρμογών ανάλυσης XML) Θεωρούμε αυτό το πρότυπο ως το πρωτόκολλο «σειριακής προσπέλασης» για την XML, Π.χ., αυτός μπορεί να είναι ο γρήγορος-για-εκτέλεση μηχανισμός που θα χρησιμοποιούμε για να διαβάσουμε και να γράψουμε τα δεδομένα XML σε έναν διακομιστή (server). Καλείται επίσης πρωτόκολλο οδηγημένο από γεγονότα (event-driven), επειδή η τεχνική είναι να καταχωρηθεί ο χειριστής (handler) μας με έναν αναλυτή (parser) SAX, και μετά ο αναλυτής καλεί τις μεθόδους επανάκλησής μας όποτε βλέπει μια νέα ετικέτα XML (ή αντιμετωπίζει ένα σφάλμα, ή θέλει να μας πει οτιδήποτε άλλο). Απαραίτητο για εφαρμογές server-side και εφαρμογές υψηλής επίδοσης. Κοινά στοιχεία (π.χ. error handling) και χρησιμότητα (μετατροπή data σε XML) ακόμη και για εφαρμογές του άλλου JAXP API, του DOM Δρ. Χρήστος Κ. Γεωργιάδης - 2003

Δρ. Χρήστος Κ. Γεωργιάδης - 2003 Τα SAX packages Ο αναλυτής SAX ορίζεται από τα ακόλουθα πακέτα: javax.xml.parsers Προσδιορίζει τη κλάση SAXParserFactory Είναι vendor-neutral factory class, που αρχικά «δείχνει» σε υλοποίηση XML της Sun Επιστρέφει τον SAXParser Καθορίζει επίσης κλάσεις εξαιρέσεων (exception classes) για αναφορά λαθών. org.xml.sax Προσδιορίζει τα κύρια SAX interfaces. Το προσδιοριστικό org.xml στο sax package οφείλεται στην ομάδα που προσδιόρισε το SAX API. Δρ. Χρήστος Κ. Γεωργιάδης - 2003

Δρ. Χρήστος Κ. Γεωργιάδης - 2003 Τα SAX packages ΙΙ org.xml.sax.ext Προσδιορίζει SAX extensions που χρησιμοποιούνται όταν απαιτείται πιο εξεζητημένη επεξεργασία SAX, π.χ. για επεξεργασία εγγράφου DTD ή για ανάγνωση λεπτομερούς σύνταξης ενός αρχείου org.xml.sax.helpers Περιέχει κλάσεις βοήθειας, που διευκολύνουν τη χρήση SAX, π.χ. με το να ορίζεται default handler με κενές (null) μεθόδους για όλα τα interfaces, έτσι ώστε να χρειάζεται να υπερβεί (override) κάποιος, μόνο αυτά που πραγματικά θέλει να υλοποιήσει Δρ. Χρήστος Κ. Γεωργιάδης - 2003

Δρ. Χρήστος Κ. Γεωργιάδης - 2003 SAX APIs 1. Για να αρχίσει η επεξεργασία, ένα instance της κλάσης SAXParserFactory χρησιμοποιείται για τη παραγωγή ενός instance του parser. 2. O parser συσκευάζει ένα αντικείμενο SAXReader. 3. Όταν η μέθοδος parse του parser καλείται, ο SAXReader επικαλείται μια από τις πολλές μεθόδους callback (επανάκλησης) που έχει υλοποιήσει η εφαρμογή. 4. Αυτές οι μέθοδοι ορίζονται από τα interfaces: ContentHandler, ErrorHandler, DTDHandler, και EntityResolver. Δρ. Χρήστος Κ. Γεωργιάδης - 2003

Δρ. Χρήστος Κ. Γεωργιάδης - 2003 Τα κύρια SAX APIs SAXParser To SAXParser interface ορίζει διάφορα είδη μεθόδων parse(). Συνήθως, πρέπει να αποσταλεί μια πηγή δεδομένων XML και ένα αντικείμενο DefaultHandler στον parser, ο οποίος επεξεργάζεται τα XML και καλεί τις κατάλληλες μεθόδους στο αντικείμενο χειρισμού (handler) SAXReader Ο SAXParser συσκευάζει έναν SAXReader. Συνήθως δεν ασχολούμαστε μαζί του, αλλά κάθε τόσο χρειάζεται να το «διαμορφώσουμε», χρησιμοποιώντας τη μέθοδο getXMLReader() του SAXParser. Ο SAXReader είναι αυτός που μεταφέρει τη συνομιλία με τους SAX event handlers που ορίζουμε. DefaultHandler Υλοποιεί τα ContentHandler, ErrorHandler, DTDHandler, και EntityResolver interfaces (με κενές μεθόδους), έτσι ώστε να υπερβαίνουμε μόνο όσες χρειάζεται Δρ. Χρήστος Κ. Γεωργιάδης - 2003

Δρ. Χρήστος Κ. Γεωργιάδης - 2003 Μια τυπική εφαρμογή υλοποιεί τις περισσότερες από τις μεθόδους των ακόλουθων SAX APIs: ContentHandler Όταν μια ετικέτα XML αναγνωρίζεται, καλούνται μέθοδοι όπως οι startDocument, endDocument, startElement, και endElement. Αυτό το interface επίσης ορίζει τις μεθόδους characters και processingInstruction, που καλούνται όταν ο parser εντοπίζει το κείμενο σε ένα στοιχείο XML ή μια inline εντολή επεξεργασίας αντίστοιχα. ErrorHandler Οι μέθοδοι error, fatalError, και warning καλούνται ως απάντηση στα διάφορα λάθη parsing. Ο default handler λαθών ρίχνει μια εξαίρεση (exception) για τα μοιραία (fatal) λάθη και αγνοεί άλλα λάθη (ακόμη και λάθη εγκυρότητας). Αυτός είναι ένας λόγος που χρειάζεται να γνωρίζουμε τον SAX parser, έστω και εάν χρησιμοποιούμε DOM. Ορισμένες φορές η εφαρμογή είναι ικανή να ξεπεράσει ένα λάθος εγκυρότητας. Άλλες φορές θα χρειαστεί να παράγει ένα exception. Για να είμαστε σίγουροι για το σωστό χειρισμό, πρέπει να τροφοδοτήσουμε τον parser με τον δικό μας χειριστή λαθών. Δρ. Χρήστος Κ. Γεωργιάδης - 2003

Δρ. Χρήστος Κ. Γεωργιάδης - 2003 Παράδειγμα: Echo01.java Λίστα με import … Επεξεργασία παραμέτρου γραμμής εντολής με απόκτηση του ονόματος του αρχείου XML για παρουσίαση και ετοιμασία του ρεύματος εξόδου. public static void main(String argv[]) { if (argv.length != 1) { System.err.println("Usage: cmd filename"); System.exit(1); } try { // Set up output stream out = new OutputStreamWriter(System.out, "UTF8"); catch (Throwable t) { t.printStackTrace(); System.exit(0); static private Writer out; Δρ. Χρήστος Κ. Γεωργιάδης - 2003

Echo01.java: Ετοιμασία του parser // Use an instance of ourselves as the SAX event handler DefaultHandler handler = new Echo01(); // Use the default (non-validating) parser SAXParserFactory factory = SAXParserFactory.newInstance(); try... // Parse the input SAXParser saxParser = factory.newSAXParser(); saxParser.parse( new File(argv[0]), handler ); Δρ. Χρήστος Κ. Γεωργιάδης - 2003

Echo01.java: Εμφάνιση εξόδου Οι μέθοδοι του ContentHandler υποστηρίζουν SAXExceptions αλλά όχι IOExceptions, τα οποία μπορούν να εμφανιστούν κατά τη διαδικασία του γραψίματος – εμφάνισης εξόδου (writing the output). Έτσι έχει νόημα να γίνεται η έξοδος με μια μέθοδο, την emit(), που φροντίζει τις λεπτομέρειες χειρισμού των exceptions. private void emit(String s) throws SAXException { try { out.write(s); out.flush(); } catch (IOException e) { throw new SAXException("I/O error", e); } Δρ. Χρήστος Κ. Γεωργιάδης - 2003

Echo01.java: Χαρακτήρας τέλους γραμμής private void nl() throws SAXException { String lineEnd = System.getProperty("line.separator"); try { out.write(lineEnd); } catch (IOException e) { throw new SAXException("I/O error", e); } Δρ. Χρήστος Κ. Γεωργιάδης - 2003

Χειρισμός γεγονότων περιεχομένου (content events, ContentHandler) Γεγονότα Εγγράφου (start-document και end-document) public void startDocument() throws SAXException { emit("<?xml version='1.0' encoding='UTF-8'?>"); nl(); } public void endDocument() try { out.flush(); } catch (IOException e) { throw new SAXException("I/O error", e); Δρ. Χρήστος Κ. Γεωργιάδης - 2003

Γεγονότα Στοιχείου (start-element και end-element) public void endElement(String namespaceURI, String sName, // simple name String qName // qualified name ) throws SAXException { String eName = sName; // element name if ("".equals(eName)) eName = qName; // not namespaceAware emit("</"+eName+">"); } public void startElement(String namespaceURI, String sName, // simple name String qName, // qualified name Attributes attrs) throws SAXException { String eName = sName; // element name if ("".equals(eName)) eName = qName; // not namespaceAware emit("<"+eName); if (attrs != null) { for (int i = 0; i < attrs.getLength(); i++) { String aName = attrs.getLocalName(i); // Attr name if ("".equals(aName)) aName = attrs.getQName(i); emit(" "); emit(aName+"=\""+attrs.getValue(i)+"\""); } emit(">"); Δρ. Χρήστος Κ. Γεωργιάδης - 2003

Δρ. Χρήστος Κ. Γεωργιάδης - 2003 Γεγονότα Χαρακτήρα Χρήση buffer StringBuffer textBuffer; public void characters(char buf[], int offset, int len) throws SAXException { String s = new String(buf, offset, len); if (textBuffer == null) { textBuffer = new StringBuffer(s); } else { textBuffer.append(s); } Δρ. Χρήστος Κ. Γεωργιάδης - 2003

Δρ. Χρήστος Κ. Γεωργιάδης - 2003 echoText() private void echoText() throws SAXException { if (textBuffer == null) return; String s = ""+textBuffer emit(s); textBuffer = null; } Δρ. Χρήστος Κ. Γεωργιάδης - 2003

Δρ. Χρήστος Κ. Γεωργιάδης - 2003 Compile & Run Echo01.java Αντιγραφή του endorsed directory… Έλεγχος του output Περισσότερες λεπτομέρειες στο parsing: Echo02.java … Echo10.java Δρ. Χρήστος Κ. Γεωργιάδης - 2003