5.1 Generazione dei log di eventi
5.1.1 Le funzioni Template e Completion dell'editor
É venuto il momento di parlare delle altre funzionalità dell'editor dell'ap- plicazione, implementato a partire dalla libreria RSyntaxTextArea, descritta nella Sezione 4.2.1.
Questa libreria, oltre alle speciche già descritte, ore altre due interes- santi funzioni che all'interno della nostra applicazione sono state utilizzate per supportare la generazione dei log.
Queste funzioni sono utilizzabili all'interno di un qualsiasi editor del si- stema, apribile utilizzando il pulsante "New" dell'interfaccia e scegliendo poi di aprire un nuovo editor (Fig. 5.1).
5.1.1.1 Inserimento automatico del codice: Template
La prima delle due funzioni si chiama Template. Questa semplice funziona- lità permette di denire una serie di blocchi di codice predeniti, chiamati appunto template, che possono essere poi richiamati all'interno dell'editor.
Richiamare un blocco di codice signica inserire il suo contenuto all'in- terno dell'editor in un punto ben preciso per poter così facilmente riscrivere blocchi di codice che vengono utilizzati spesso senza doverli scrivere ogni volta a mano, ma semplicemente richiamandoli.
I template vengono deniti attraverso l'associazione all'editor di una serie di triple, così composte:
1. id: l'identicatore univoco del template.
La suddivisione del blocco tra begin ed end avviene semplicemente in base alla scelta di dove posizionare il cursore dopo l'inserimento del codice all'interno dell'editor: se si vuole il cursore in fondo al blocco del codice, tutto il template va nel campo begin, lasciando il campo end vuoto; se invece si vuole il cursore posizionato in un preciso punto del codice, ad esempio dove si vuole poi inserire un valore, allora si divide il codice in due parti, tra il campo begin e quello end, in modo che le due parti siano inserite rispettivamente prima e dopo il cursore.
Dopo aver denito i template che ci servono, possiamo richiamarli nel seguente modo:
1. Posizionare il cursore nella posizione dove si vuole inserire il template. 2. Scrivere l'identicatore del template.
3. Premere CTRL+SHIFT+SPAZIO
A seguito di questa semplice sequenza di operazioni, il sistema inserirà al posto dell'identicatore del template, il relativo blocco di codice.
Qui di seguito mostriamo come si crea l'associazione tra i template e l'editor, tenendo conto che nel nostro caso i template sono salvati su un le di congurazione esterno ed è il Model ad occuparsi della lettura e scrittura dei dati da questo tipo di le, in quanto è lui il componente dell'MVC adibito a questo compito.
1 ...
2 // enable the template function
3 RSyntaxTextArea.setTemplatesEnabled(true); 4 // get the template manager
6 // create the three list for template components
7 ArrayList<String> id = new ArrayList<String>(templates.get(0)); 8 ArrayList<String> begin = new ArrayList<String>(templates.get(1)); 9 ArrayList<String> end = new ArrayList<String>(templates.get(2)); 10 // for every template, identified by an id
11 for (int i=0; i<id.size(); i++) {
12 // add the template to the editor, using id, begin part and end part reading from the same index in the three lists
13 codeTemplateManager.addTemplate(new StaticCodeTemplate(id.get(i), begin.get(i), end. get(i)));
14 } 15 ...
Questa funzione è stata utilizzata nel sistema per fornire all'utente la possibilità di creare o modicare un log all'interno di un editor, senza la necessità di conoscere a fondo la struttura dello standard XES.
Infatti, grazie ad una serie di template preimpostati, uno per ogni pos- sibile elemento strutturale dei log XES, è possibile creare un log completo e complesso senza conoscere nel dettaglio la sintassi degli elementi, ma sempli- cemente richiamando i vari blocchi di codice e compilandone successivamente i valori, in base alle esigenze.
In Figura 5.2 è mostrato un esempio composito del richiamo di alcuni template all'interno dell'editor.
5.1.1.2 Completamento automatico delle parole: Completion La seconda funzione dell'editor che andiamo a vedere in questa sezione si chiama Completion. Questa funzione permette di denire una lista delle pa- role chiave che vengono utilizzate all'interno dell'editor in maniera ricorrente
Figura 5.2: L'utilizzo dei template
(dipendono da quale è il contenuto dell'editor, nel nostro caso log in formato XES).
Questa lista viene poi associata all'editor che, grazie ad essa, può fornire una funzionalità automatica di completamento delle parole.
1 // create the completion provider that will contain the list of possible XES keyword completions
2 DefaultCompletionProvider provider = new DefaultCompletionProvider(); 3 // add completions reading them from the first String array
4 // a BasicCompletion is a straightforward word completion 5 for (String completion : completions) {
6 provider.addCompletion(new BasicCompletion(provider, completion)); 7 }
8 // add the id of all the templates reading them from the second String array 9 for (String templateId : templatesId) {
10 provider.addCompletion(new BasicCompletion(provider, templateId)); 11 }
12 // create the auto completion, that will manage the completion in the installed text area, using the completion list from the given provider
14 // associate the auto completion with the text area 15 autoCompletion.install(textArea);
Anche in questo caso, la lista delle parole chiave è contenuta all'interno di un le di congurazione esterno gestito dal modello. É il Controller che si preoccupa di recuperare tale lista e di associarla ad un editor, quando ne crea uno.
Dopo aver associato la lista delle parole chiave all'editor, vengono inseriti nel completamento automatico anche le chiavi dei template.
In questo modo è possibile utilizzare la funzione di completamento au- tomatico sia per la ricerca delle parole chiave dello standard XES, sia per quella delle chiavi dei template.
Questa funzione può essere richiamata attraverso la combinazione CTRL+SPAZIO: 1. Premendo questa combinazione dopo aver iniziato a scrivere una pa-
rola, la funzione apre un menù a tendina mostrando tutte le possibili combinazioni di parole chiave che iniziano con la parte scritta tra cui poter scegliere.
2. Nel caso una sola sia la parola chiave all'interno della lista che inizia con la parte già scritta, la funzione al richiamo tramite tastiera inserirà subito la parola chiave nell'editor, senza aprire alcun menù a tendina, superuo in questo caso visto che una sola era la parola chiave possibile. 3. Nel caso si richiami la funzione di completamento in un punto vuoto dell'editor, senza alcuna parte iniziale prima della posizione del cursore, questa aprirà il consueto menù a tendina mostrando questa volta la
una selezione di una intera parola dalla lista senza doverne per forza ricordare la parte iniziale.
In Figura 5.3 viene mostrato il menù a tendina che si apre dopo aver richiamato la funzione di completamento automatico all'interno dell'editor.
Figura 5.3: La funzione di completamento automatico
Questa funzione si integra con quella della sezione precedente per fornire all'utente uno strumento completo per la generazione dei log.
Mentre l'altra permette di inserire blocchi di codice che deniscono ele- menti dello standard e che poi devono essere compilati con i valori desiderati, questa funzione è ottima sia per creare o modicare un singolo elemento della struttura, iniziando a scrivere e utilizzando il completamento automatico per non commettere errori nella denizione dei valori da utilizzare, sia soprattut- to per la compilazione di tutti i valori all'interno dei template e per la ricerca delle loro chiavi in maniera rapida.
La funzione infatti contiene la lista di tutti gli elementi della versione XML di XES, sia per quanto riguarda i tag (ad esempio "classier"), sia per quanto riguarda gli attributi dei tag (ad esempio "prex"), sia per quanto riguarda le chiavi degli attributi deniti dalle estensioni standard da utilizzare all'interno del campo key dei tag (ad esempio "concept:name").
In questo modo, combinando la funzione Template alla funzione Comple- tion, la generazione di un log diventa semplice ed automatica, minimizzando il rischio di errori e la necessità di una conoscenza profonda della versio- ne XML di XES, dedicandosi così esclusivamente alla denizione del log da creare.