ΕΛ/ΛΑΚ | creativecommons.gr | mycontent.ellak.gr |
freedom

Upgrade UMLGraph with Java’s new doclet API

Η Ενοποιημένη Γλώσσα Σχεδίασης Προτύπων – Unified Modeling Language (UML) παρέχει μια σειρά από διαφορετικούς τύπους διαγραμμάτων για την περιγραφή όλων των πτυχών ενός προγράμματος. Ο προγραμματιστής ή ο σχεδιαστής έρχεται συχνά αντιμέτωπος με την ανάγκη για ανάπτυξη τέτοιων διαγραμμάτων σε ηλεκτρονική μορφή ενώ ταυτόχρονα αναζητά έξυπνα εργαλεία απεικόνισης. Τα διασημότερα σχεδιαστικά εργαλεία απαιτούν τη σύνδεση των στοιχείων ενός διαγράμματος χειρωνακτικά, τοποθετώντας με τη χρήση του ποντικιού τις γραμμές και τα σύμβολα στη σωστή τους θέση. Η διαδικασία αυτή απαιτεί προσπάθεια και χρόνο από το σχεδιαστή και δεν συμβάλει στην αξιοποίηση των ικανοτήτων του.

Το προγραμματιστικό εργαλείο UMLGraph παρέχει τη δυνατότητα δημιουργίας διαγραμμάτων UML, κλάσεων και ακολουθιών, αυτόματα. Το UMLGraph έχει υλοποιηθεί ως ένα Javadoc doclet και εκμεταλλεύεται την ύπαρξη συγκεκριμένων ετικετών που υπάρχουν στα αρχεία .java που ζητείται να εκφραστούν σε διαγράμματα UML.  

Η ανάπτυξη του UMLGraph βασίζεται στη χρήση της γλώσσας Java και η έκδοση την οποία υποστήριζε το εργαλείο, μέχρι πρόσφατα, ήταν η Java 8. Πιο συγκεκριμένα, κατά την λειτουργία του UMLGraph με την υποστήριξη της Java 8, έγινε εκτενής χρήση του πακέτου com.sun.javadoc doclet API και χρησιμοποιήθηκαν πολλά από τα interfaces που ανήκουν σε αυτό όπως είναι τα com.sun.javadoc.ClassDoc, com.sun.javadoc.Doc και com.sun.javadoc.Type.

Όμως στις νεότερες εκδόσεις της Java η χρήση του πακέτου com.sun.javadoc αποδοκιμάζεται και η λειτουργικότητα του προτείνεται να αντικατασταθεί με εκείνη του πακέτου jdk.javadoc.doclet και των interfaces που περιλαμβάνονται σε αυτό. Για παράδειγμα, το interface javax.lang.model.element.TypeElement αντικαθιστά σε λειτουργικότητα το interface com.sun.javadoc.ClassDoc όπως προστάζει ο οδηγός μετανάστευσης – migration guide μεταξύ των δύο doclet APIs.

Έτσι, ήταν επιτακτική η ανάγκη για την αναβάθμιση του εργαλείου UMLGraph και η λειτουργία του με βάση το νέο doclet API της έκδοσης Java 9. Σημειώνεται ότι, κατά τη μετανάστευση από το doclet API της Java 8 στο doclet API της Java 9 δεν θα άλλαζε καμία από τις λειτουργίες του UMLGraph. Οι αλλαγές αφορούν την εύρεση νέων interfaces, μεθόδων και αντικειμένων τα οποία θα περιέγραφαν τη λειτουργικότητα του εργαλείου με ισοδύναμο τρόπο με τα αντίστοιχα του πακέτου com.sun.javadoc.

Στα πλαίσια του Google Summer of Code (GSoC) 2019 ανέλαβα ως εργασία την επικαιροποίηση του εργαλείου UMLGraph ώστε να λειτουργεί πλέον με το νέο doclet API χρησιμοποιώντας την έκδοση Java 9. Αρχικά, μελετήθηκε τόσο ο υπάρχον κώδικας όσο και ο οδηγός μετανάστευσης ώστε να σχηματιστεί μια σφαιρική εικόνα των αναγκαίων τροποποιήσεων. Έπειτα, ξεκίνησε μια διαδικασία αλλαγών, αντικαθιστώντας μεθόδους και interfaces του πακέτου com.sun.javadoc με μεθόδους και interfaces αντίστοιχης λειτουργικότητας του πακέτου jdk.javadoc.doclet.

Μερικά χαρακτηριστικά παραδείγματα από τη μετάβαση του UMLGraph στη Java 9 είναι τα ακόλουθα. Όπως αναφέρθηκε ήδη το interface com.sun.javadoc.ClassDoc, το οποίο εκφράζει ένα στοιχείο του προγράμματος όπως μια κλάση ή έναν κατασκευαστή, αντικαθίσταται σε λειτουργικότητα από το interface javax.lang.model.element.TypeElement που εκφράζει ακριβώς τα ίδια στοιχεία ενός προγράμματος. Αντίστοιχα, το interface com.sun.javadoc.Type, το οποίο εκφράζει τους τύπους των στοιχείων του προγράμματος, παραχωρεί τη θέση του στο interface javax.lang.model.type.TypeMirror. Στη συνέχεια εξετάζεται το interface javax.lang.model.element.Element, το οποίο εκφράζει περισσότερα στοιχεία ενός προγράμματος όπως πακέτα, κλάσεις και μεθόδους και διαδέχεται το interface com.sun.javadoc.Doc. Ένα ακόμα χαρακτηριστικό παράδειγμα είναι το interface com.sun.javadoc.RootDoc, το οποίο αντιπροσωπεύει το αρχικό σημείο της δομής πληροφοριών για το πρόγραμμα από όπου γίνεται εκτέλεση του javadoc και δίνει τη θέση του στο interface jdk.javadoc.doclet.DocletEnvironment, το οποίο εκφράζει το περιβάλλον εκτέλεσης του doclet.

Παρουσιάζοντας μερικά αποσπάσματα από τις τροποποιήσεις που έγιναν στο κώδικα, θα γίνει πιο ξεκάθαρη η διαδικασία μετανάστευσης στο API της Java 9. Ένα σημείο του κώδικα όπου εξετάζεται το είδος ενός στοιχείου (δηλ. interface, μέθοδος κ.τ.λ.) με τη χρήση του πακέτου com.sun.javadoc είναι το παρακάτω.

Χρησιμοποιώντας το πακέτο jdk.javadoc.doclet, το παραπάνω τμήμα του κώδικα μετατρέπεται στο παρακάτω.

Βλέπουμε ότι χρησιμοποιείται η μέθοδος getKind() που επιστρέφει το είδος ενός στοιχείου, μαζί με το interface ElementKind, το οποίο παρέχει το απαραίτητο enumeration για τη σύγκριση του στοιχείου επιστροφής με συγκεκριμένους τύπους. Ένα δεύτερο απόσπασμα κώδικα είναι το παρακάτω στο οποίο ζητείται ο modifier (public, private, κ.τ.λ.) ενός ProgramElementDoc με τη χρήση του πακέτου com.sun.javadoc.

Αφού μετατραπεί ο παραπάνω κώδικας ώστε να λειτουργεί με τη χρήση του πακέτου jdk.javadoc.doclet, προκύπτει η παρακάτω μορφή.

Παρατηρούμε ότι, το ProgramElementDoc, αντιστοιχεί σε ένα στιγμιότυπο του interface Element, στο νέο API και καλείται η μέθοδος getModifiers(), η οποία επιστρέφει ένα σύνολο από modifiers που αντιστοιχούν σε ένα συγκεκριμένο Element. Έπειτα, το interface Modifier χρησιμοποιείται για να ελέγξουμε τα είδη των modifiers που περιέχονται μέσα στο σύνολο. Έτσι, αντικαθίστανται μέθοδοι όπως οι isPrivate() και isProtected(). Για περισσότερες πληροφορίες και παραδείγματα, θα ήταν κατάλληλη μια επίσκεψη στο gist που αποτελεί την τελική αναφορά της εργασίας.

Ολόκληρη η λειτουργικότητα του εργαλείου UMLGraph πρέπει να συγκεντρώνεται μέσα σε ένα .jar αρχείο, το οποίο κατά την αντιστοίχιση του με μια μεταβλητή περιβάλλοντος του υπολογιστή θα παρέχει τη δυνατότητα σχεδίασης των διαγραμμάτων UML. Για την αυτόματη κατασκευή του αρχείου .jar χρησιμοποιήθηκε το εργαλείο Maven. Η επιτυχής δημιουργία του αρχείου .jar μέσα από την εκτέλεση της εντολής “mvn install” φαίνεται στην παρακάτω εικόνα.

Το εργαλείο Maven παρέχει και άλλες εντολές για την εποπτεία του προγράμματος όπως είναι οι “mvn compile”, “mvn test-compile” και “mvn test” που αντιστοιχούν στη μεταγλώττιση των αρχείων του προγράμματος, στη μεταγλώττιση των αρχείων tests και στην εκτέλεση των αρχείων tests, αντίστοιχα.  

Εν κατακλείδι, κατά τη διάρκεια του GSoC ο στόχος που τέθηκε ήταν η αναβάθμιση του εργαλείου UMLGraph ώστε να χρησιμοποιεί την έκδοση Java 9 και το πακέτο jdk.javadoc.doclet. Ήταν ένας αρκετά απαιτητικός στόχος αλλά αφορούσε ένα ιδιαίτερα ενδιαφέρον αντικείμενο, δηλαδή την αυτόματη δημιουργία διαγραμμάτων UML.

Όλος ο κώδικας του έργου είναι διαθέσιμος στο github

Leave a Comment