Nov 21, 2013

Στατική ανάλυση σε έργα SOA και BPEL με τη βοήθεια ενός XML repository

Έχω αναφερθεί στο παρελθόν (εδώ και εδώ) στις δυνατότητες εξαγωγής χρήσιμης γνώσης από την στατική ανάλυση (static code analysis) των XML metadata στα οποία στηρίζονται frameworks όπως το Oracle ADF. Η ιδέα που είχε τότε περιγραφεί ήταν της μεταφοράς αυτής της δομής σε μια σχεσιακή βάση δεδομένων ώστε να τίθενται με άνεση διάφορα, συνδυαστικά ερωτήματα.

Αυτό το χρονικό διάστημα συνεργάζομαι με μια έμπειρη ομάδα σε ένα έργο βασισμένο στο Oracle SOA Suite, με το μεγαλύτερο μέρος του γραμμένο σε BPEL. Περιλαμβάνει πολλές, σύνθετες διαδικασίες και ως νεο-εισερχόμενος αναζητώ τρόπους γρηγορότερης, γενικότερης και πιο εποπτικής κάλυψης του αντικειμένου. Δεδομένου ότι τόσο μια διαδικασία BPEL, όσο και ο ορισμός ενός SCA composite περιγράφονται σε XML, μου κίνησε ξανά το ενδιαφέρον της στατικής ανάλυσης. Αυτή τη φορά διάλεξα ένα άλλο δρόμο ως repository των XML metadata: την φόρτωση τους απευθείας σε μια XML database και την κατασκευή ερωτημάτων με την χρήση των αντίστοιχων τεχνολογιών (XPath και XQuery)

Ως XML database, διάλεξα το BaseX που μου φάνηκε εξαιρετικά απλό στην χρήση του. Πρόκειται για μια Java εφαρμογή, πολύ φιλική στην χρήση της, με υποστήριξη για XQuery 3.0. Έχοντας λοιπόν σε έναν κατάλογο όλους τους πηγαίους κώδικες (SCA composites, BPEL processes, JCA adapters configurations, κλπ) έφτιαξα μια νέα βάση δεδομένων.
Από την στιγμή που τελειώσει το φόρτωμα και το indexing των αρχείων, παρουσιάζεται το BaseX interface. Στο αριστερό πλαίσιο μπορούμε να υποβάλλουμε τις ερωτήσεις μας (full-text, XQuery) στο δεξί πάνω πλαίσιο εμφανίζονται οπτικά τα "ταιριάσματα" σε αρχεία, ενώ στο κάτω μέρος εμφανίζονται τα περιεχόμενα του matching καθώς και τα στατιστικά εκτέλεσης.
 Έχοντας πια όλα τα έγγραφα σε μια βάση στη διάθεσή μας, μπορούμε να κατασκευάσουμε σύνθετα ερωτήματα. Για παράδειγμα θέλοντας να κατατάξουμε τις BPEL διαδικασίες μας από άποψη πολυπλοκότητας, μπορούμε να δούμε πόσες διακλαδώσεις (branching) περιλαμβάνουν, πόσες κλήσεις (invokes), κλπ. Ένα τέτοιο Xquery ερώτημα είναι το ακόλουθο:

declare default element namespace "http://schemas.xmlsoap.org/ws/2003/03/business-process/";
for $f in collection()
let $name := document-uri($f)
let $doc := doc($name)
let $nproc := count($doc//process)
let $pname := $doc/process/@name
let $ninvoke := count($doc//invoke)
let $npick := count($doc//pick)
let $nwhile := count($doc//while)
let $nswitch := count($doc//switch)
let $nflow := count($doc//flow)
let $nl := " "
where $nproc > 0
return
  $pname || ' I=' || $ninvoke || ' P=' || $npick || ' W=' || $nwhile || ' S=' || $nswitch || ' F=' || $nflow || $nl


Μια άλλη περίπτωση έχει να κάνει με την εύρεση αχρησιμοποίητων μεταβλητών. Ένα ενδεικτικό ερώτημα, που τυπώνει τον αριθμό των χρησιμοποιήσεων μιας μεταβλητής σε μια BPEL διαδικασία:

declare default element namespace "http://schemas.xmlsoap.org/ws/2003/03/business-process/";
for $f in collection()
let $name := document-uri($f)
let $doc := doc($name)
let $nproc := count($doc//process)
let $pname := $doc/process/@name
let $nl := " "
for $var in distinct-values(doc(document-uri($f))//variable/@name)
let $nv := count(//receive[@variable=$var]) + count(//from[@variable=$var]) + count(//to[@variable=$var]) + count(//invoke[@inputVariable=$var]) +  count(//receive[@variable=$var]) + count(//onMessage[@variable=$var]) +  count(//from/@expression[contains(., $var)]/text()) + count(//catch[@faultVariable=$var])
order by $pname,$var
return $pname || ':' || $var || ':' || $nv || $nl


Εν ολίγοις, το BaseX προσφέρει μια πολύ καλή λύση για αναλυτικές εργασίες σε XML αυτού του είδους, ενώ φυσικά τα οφέλη της στατικής ανάλυσης κώδικα είναι απεριόριστα, ιδίως για την διακυβέρνηση μεγάλων έργων.

No comments: