Ontology Explorer - Documentazione
DOCUMENTAZIONE
ONTOLOGY EXPLORER
Pagina 1 di 37
Ontology Explorer - Documentazione
Indice
1 INTRODUZIONE
4
1.1 FINALITÀ
4
2 FUNZIONALITÀ
5
2.1 CARICAMENTO DI ONTOLOGIE ON-LINE
2.2 CONFIGURAZIONE E PARAMETRIZZAZIONE DELL’ONTOLOGY EXPLORER
2.3 FUNZIONALITÀ DI NAVIGAZIONE TRAMITE ALBERO DINAMICO
2.4 FUNZIONE DI RICERCA SMART
2.5 VISUALIZZAZIONE DELLE INFORMAZIONI
2.6 CARICAMENTO DI ONTOLOGIE ATTRAVERSO IL PASSAGGIO DI PARAMETRI DA URI
5
5
6
6
6
7
3 ARCHITETTURA
8
3.1 CLIENT-SIDE E SERVER-SIDE
3.1.1 IL PROCESSO DELLE INFORMAZIONI ALL’INTERNO DELL’ARCHITETTURA
3.1.2 STRUTTURA DEL SERVIZIO
3.1.3 FUNZIONAMENTO DEL SERVIZIO
3.2 I WRAPPER
3.2.1 OWLWRAPPER
3.2.2 OWLCLASSWRAPPER
3.2.3 OWLINSTANCEWRAPPER
3.2.4 OWLTAXONOMYWRAPPER
3.3 I CSS
8
8
8
12
14
15
16
16
16
17
4 WIDGET
19
4.1 WIDGET DI BASE
4.1.1 COMPONENTI DI INPUT
4.1.2 COMPONENTI DI VISUALIZZAZIONE
4.1.3 COMPONENTI DI LAYOUT (UTILI ALLA DISPOSIZIONE DI ALTRI WIDGET)
4.2 WIDGET SVILUPPATI
4.2.1 OPTIONBOX
4.2.2 TAXONOMYSEARCH
4.2.3 TAXONOMYTREE
4.2.4 OWLINSTANCEDISCLOSUREPANEL
4.2.5 ONTOLOGYINFOPANEL
19
19
20
21
22
22
24
25
26
28
5 PROGETTO ECLIPSE ED ORGANIZZAZIONE DEL CODICE
29
5.1 PACKAGE JAVA
5.1.1 GWT-OWLWRAPPER
5.1.2 ONTOLOGYEXPLORER
29
29
31
Pagina 2 di 37
Ontology Explorer - Documentazione
5.1.3 SEMANTICWIDGETS
5.2 LIBRERIE
5.2.1 GWT-OWLWRAPPERS
5.2.2 ONTOLOGYEXPLORER
5.2.3 SEMANTICWIDGETS
5.3 ANT FILE
5.3.1 GWT-OWLWRAPPERS
5.3.2 ONTOLOGYEXPLORER
5.3.3 SEMANTICWIDGETS
32
32
33
33
33
34
34
34
34
6 SCREENSHOT
35
Pagina 3 di 37
Ontology Explorer - Documentazione
1 Introduzione
1.1 Finalità
L’Ontology Explorer è un software on-line ideato e sviluppato per la
consultazione e la navigazione di ontologie.
Questo strumento può essere sfruttato da un ampio target di utenti, ma in
particolar modo si rivolge ad esperti di dominio (domain expert). Questi
soggetti possiedono ottime conoscenze riguardo ai concetti inerenti il dominio
di loro competenza, ma non hanno alcuna conoscenza riguardo alla struttura
ed alle caratteristiche dell’ontologia che li vuole rappresentare.
L’Ontology Explorer è stato testato sull’ontologia di Moda-ML1.
L’Ontology Explorer vuole evolversi rispetto ai tool già esistenti sul web
soprattutto in particolari aspetti, quali la semplicità nell’utilizzo da parte
dell’utente (anche quello meno esperto), la configurabilità di visualizzazione e
navigazione, la dinamicità dei componenti e l’alto livello d’interattività. Per
render ciò possibile, questo tool è stato implementato sfruttando tecnologie
quali AJAX2 e GWT3.
Il progetto relativo all’Ontology Explorer è stato implementato (e viene tuttora
sviluppato) in codice Java all’interno dell’ambiente Eclipse, utilizzando, per
compatibilità con GWT e Googlipse, Java 1.3.
1Moda-ML:
Middleware tOols and Documents to enhAnce the textile/clothing supply chain through xML.
Iniziativa, derivata dall’omonimo progetto europeo, con l’obiettivo di mettere a disposizione delle aziende del
settore del Tessile Abbigliamento alcuni servizi, quali un vocabolario di termini comuni ed un insieme di tipi
di documenti XML predefiniti, che possano rendere più agevole la circolazione ed il passaggio di
informazioni tecniche e gestionali ad ogni livello dell’organizzazione.
2Ajax:
Asynchronous Javascript And Xml. Insieme di tecnologie che permette una diversa ed innovativa
interazione tra client e server; la presenza di un motore Ajax, quale intermediario, rende infatti possibile che
l’interazione avvenga in modo asincrono.
3GWT:
Google Web Toolkit. Toolkit open source fornito da Google che dà al programmatore la possibilità di
implementare applicazioni Ajax scrivendo e debuggando semplice codice Java così da evitare le difficoltà
facilmente riscontrabili nella programmazione di puro codice JavaScript.
Pagina 4 di 37
Ontology Explorer - Documentazione
2 Funzionalità
L’Ontology Explorer viene tipicamente utilizzato per poter navigare, in modo
completo ed approfondito ontologie OWL presenti sul Web.
2.1 Caricamento di ontologie on-line
L’utente che andrà ad utilizzare questo tool avrà la possibilità di caricare su di
esso ogni ontologia che gli interessi, semplicemente passandogli l’URI ad essa
associato, ad unica condizione che questa ontologia sia accessibile on-line.
Inoltre, tramite un menu, l’utente potrà scegliere alcune ontologie di default, il
cui indirizzo è già memorizzato all’interno del tool.
2.2 Configurazione e parametrizzazione
dell’Ontology Explorer
La parametrizzazione dell’Ontology Explorer è gestita direttamente attraverso
l’interazione con la sua interfaccia, la quale mette a disposizione un pop-up,
grazie al quale l’utente può esprimere le proprie preferenze di configurazione.
I parametri messi a disposizione dell’utente sono diversi e ricoprono varie aree
concettuali del tool.
Opzioni generali:
 Mostrare (o non mostrare) le istanze durante la navigazione
 Mostrare (o non mostrare) i tool tip rappresentanti le descrizioni dei vari
oggetti esistenti
Opzioni di visualizzazione:
 Rappresentare gli elementi dell’ontologia attraverso i loro nomi
 Rappresentare gli elementi dell’ontologia attraverso le loro label
Opzioni di ricerca:
 Effettuare la ricerca in modalità “Start with” (default)
 Effettuare la ricerca in modalità “Contains” (slow)
 Utilizzo dei prefissi nella ricerca
Opzioni relative al pannello di visualizzazione delle informazioni:
 Rappresentare le istanze di una classe attraverso i loro nomi
 Rappresentare le istanze di una classe attraverso le loro label
 Ordinare alfabeticamente le istanze
 Ordinare alfabeticamente le proprietà
Pagina 5 di 37
Ontology Explorer - Documentazione
2.3 Funzionalità di navigazione tramite albero
dinamico
Volendo mettere a disposizione dell’utente una navigazione completa
dell’ontologia, si è deciso di progettare questo tool in modo tale che esso
presenti, come elemento principale di navigazione, una struttura ad albero,
dinamica, parametrizzabile ed interattiva, rappresentante l’intera tassonomia
o, nel caso ve ne fossero più di una collegate tra loro, l’insieme di queste.
L’Ontology Explorer è stato pensato per dare all’utente la possibilità di
visualizzare dati, caratteristiche e proprietà di ogni classe e istanza presente
all’interno dell’ontologia. L’utente potrà accedere a qualsiasi informazione
semplicemente cliccando sull’elemento corrispondente all’interno della struttura
ad albero; questo farà sì che il tool apra la visualizzazione delle informazioni
riguardanti classi e istanze e che, in tal modo, la navigazione dell’ontologia
continui anche attraverso i collegamenti che saranno presenti all’interno di
questa visualizzazione.
2.4 Funzione di ricerca smart
Allo scopo di aiutare l’utente finale nella navigazione, si è pensato di dotare il
tool di uno strumento di ricerca, così da rendere possibile un più facile
reperimento delle informazioni desiderate. Per questo, l’interfaccia è dotata di
una casella di ricerca smart, ovvero una semplice casella di testo che, al
momento della digitazione, mostra un menu a tendina dove vengono elencati
tutti e solo gli elementi (classi ed istanze) presenti all’interno dell’ontologia che
soddisfano il criterio di ricerca attuale (per esempio la stringa iniziale); questo
permette all’utilizzatore di poter ricercare, all’interno di tassonomie a lui
sconosciute, se esistono elementi di suo interesse, senza correre il rischio di
perdere tempo in inutili ricerche lungo tutta la lunghezza dell’albero.
2.5 Visualizzazione delle informazioni
Infine si è valutata la visualizzazione dei dati relativi alle varie entità presenti
nell’ontologia. L’interfaccia offre una visualizzazione a schede sfruttando la
struttura a tab fornita da GWT; questa permette all’utente di avere a portata di
mano, nello stesso momento, le informazioni relative a più entità, e di gestire
tali informazioni in modo ordinato ed intuitivo (proprio grazie alla particolare
configurazione a schede).
Pagina 6 di 37
Ontology Explorer - Documentazione
2.6 Caricamento di ontologie attraverso il passaggio
di parametri da URI
Oltre alle funzionalità appena presentate, si è deciso di permettere all’Ontology
Explorer di interpretare eventuali parametri passatigli attraverso l’URI. Questo
per poter avere, all’interno di un particolare sito web, un link diretto ad un
determinato concetto appartenente ad una specifica ontologia . In tal modo,
l’utente interessato ad avere informazioni su di un concetto, piuttosto che
aprire l’Ontology Explorer, caricare l’ontologia e cercare il concetto di suo
interesse, potrà semplicemente cliccare su di uno specifico link, il quale,
attraverso il passaggio di opportuni parametri, aprirà l’Ontology Explorer con
l’ontologia necessaria già caricata e la visualizzazione di questa già puntata sul
concetto desiderato.
I parametri appena citati sono:
 ontologyUrl: al quale deve essere assegnato un indirizzo valido relativo
ad un ontologia OWL presente on-line
 concept: al quale deve essere associato un ID OWL valido di un concetto
esistente all’interno dell’ontologia caricata
Per maggior precisione viene qui di seguito mostrato il codice relativo alla
lettura dei parametri:
private boolean readParameters() {
boolean foundParameters = false;
Location location = WindowUtils.getLocation();
String conceptID =location.getParameter(CONCEPT_PARAMETER_NAME);
String ontologyUrl = location.getParameter(ONTOLOGY_URL_PARAMETER_NAME);
String url = location.getPath();
System.out.println("path=" + url);
System.out.println("ontologyUrl=" + ontologyUrl);
System.out.println("concept=" + conceptID);
if (ontologyUrl!="" && ontologyUrl!=null){
currentOntologyURL = ontologyUrl;
foundParameters = true;
if (conceptID!="" && conceptID!=null){
currentConcept = conceptID;
foundParameters = true;
}
}
System.out.println("FoundParameters=" + foundParameters);
return foundParameters;
}
Pagina 7 di 37
Ontology Explorer - Documentazione
3 Architettura
3.1 Client-side e Server-side
GWT fa già una sua suddivisione tra client-side e server-side. Più
precisamente, all’interno della parte server, rappresentata da un GWT Service,
vi è la struttura base dell’applicazione; questa si occupa della ricezione delle
richieste di informazioni effettuate dal client, del reperimento di tali
informazioni e della loro restituzione, tramite Remote Procedure Call (RPC), in
un formato adatto alla compilazione in JavaScript. Per quanto riguarda la parte
client, invece, al suo interno vi risiede l’insieme delle applicazioni che
gestiscono le informazioni ed è qui che vengono sfruttate le proprietà di AJAX,
in particolare grazie ai widget forniti da GWT.
3.1.1 Il processo delle informazioni all’interno dell’architettura
L’architettura dell’Ontology Explorer stabilisce un determinato processo delle
informazioni al suo interno. Prendendo per esempio il caricamento di
un’ontologia, i vari passi di questo procedimento sono:




l’utente, dal client, attraverso i widget componenti l’interfaccia, fa la
richiesta di informazioni sull’ontologia al server;
il server, una volta ricevuta la richiesta, utilizza le Protégé OWL-API per
interrogare l’ontologia e riempie i wrapper necessari con i dati ottenuti;
l’applicazione invia queste strutture dati, denominate wrapper, dal server
al client tramite l’utilizzo di Remote Procedure Call (RPC);
il client, ricevuti i wrapper, analizza i dati e li visualizza a video nel modo
corretto attraverso i CSS.
Il processo appena descritto è quello che avviene ad ogni richiesta di
informazioni effettuata da parte dell’utente.
3.1.2 Struttura del servizio
Il ruolo del GWT Service risulta di fondamentale importanza all’interno
dell’architettura dell’Ontology Explorer. Questo può anche essere visto come il
cuore della struttura del tool. Questo servizio, basato su di una particolare
architettura servlet (non HttpServlet ma RemoteServiceServlet, che ne è una
estensione Java), è utile alla gestione di tutte le informazioni passanti per
l’Ontology Explorer. Il servizio rimane in attesa di richieste effettuate dal client
per poi elaborare le informazioni utili ad inviare una risposta. Queste
informazioni sono ottenute navigando e interrogando l’ontologia tramite le
Protégé OWL-API.
Pagina 8 di 37
Ontology Explorer - Documentazione
Una volta ricavati i dati ottenuti, il servizio procede poi all’impacchettamento di
questi all’interno dei wrapper e all’invio alla parte client che potrà quindi
procedere alla compilazione in JavaScript.
L’OntologyService, il servizio GWT implementato all’interno dell’Ontology
Explorer, è composto da tre particolari interfacce Java, di cui le prime due
utilizzate lato client e la terza lato server:



OWLOntoService;
OWLOntoServiceAsync;
OWLOntoServiceImpl.
L’OWLOntoService è l’interfaccia usata dal client che imposta i principali metodi
utili al servizio durante la gestione delle informazioni. Tra questi metodi vi
sono:

loadOntologyFromURL, utile al caricamento di un ontologia attraverso il
settaggio di un url;
public void loadOntologyFromURL(String url) throws Exception;

getTaxonomy, utile a reperire le informazioni relative alla tassonomia;
public OWLTaxonomy getTaxonomy(String rootClassName);

getInstancesOfClass, utile a reperire tutti i wrapper delle istanze relative
ad una determinata classe;
public Collection getInstancesOfClass(String owlClassName);

getTaxonomyWrapper, utile a reperire il wrapper contenente le
informazioni relative alla tassonomia;
public OWLTaxonomyWrapper getTaxonomyWrapper(String rootClassName);

getInstanceWrapper, utile a reperire il wrapper contenente le
informazioni di una determinata istanza;
public OWLInstanceWrapper getInstanceWrapper(String instanceName);

getClassWrapper, utile a reperire il wrapper contenente le informazioni di
una determinata classe;
public OWLClassWrapper getClassWrapper(String className);
Pagina 9 di 37
Ontology Explorer - Documentazione

getDataTypePropWrapper, utile a reperire il wrapper contenente le
informazioni di una determinata Datatype Property relativa ad una
classe;
public OWLClassDTPWrapper getDataTypePropWrapper(String dataTypePropName);

getObjectPropWrapper, utile a reperire il wrapper contenente le
informazioni di una determinata Object Property relativa ad una classe;
public OWLClassOPWrapper getObjectPropWrapper(String objectPropName);

getInstanseDataTypePropWrapper, utile a reperire il wrapper contenente
le informazioni di una determinata Datatype Property relativa ad
un’istanza;
public OWLInstanceDTPWrapper getInstanceDataTypePropWrapper
(String instanceName, String dataTypePropName);

getInstanceObjectPropWrapper, utile a reperire il wrapper contenente le
informazioni di una determinata Object Property relativa ad un’istanza;
public OWLInstanceOPWrapper getInstanceObjectPropWrapper
(String instanceName, String objectPropName);
L’OWLOntoServiceAsync non è altro che un’interfaccia identica a quella appena
descritta, dotata degli stessi metodi, con l’unica fondamentale particolarità di
rendere ognuno di questi metodi capace di supportare le chiamate asincrone
derivate dall’utilizzo di tecnologie AJAX.
Gli stessi metodi sopra citati vengono quindi presentati anche in questa
interfaccia, ma con l’aggiunta del gestore delle chiamate asincrone, per
esempio:
public void loadOntologyFromURL(String url, AsyncCallback callback);
public void getTaxonomyWrapper(String rootClassName, AsyncCallback callback);
public void getInstanceWrapper(String instanceName, AsyncCallback callback);
public void getClassWrapper(String className, AsyncCallback callback);
public void getDataTypePropWrapper(String dataTypePropName,
AsyncCallback callback);
public void getObjectPropWrapper(String objectPropName, AsyncCallback callback);
public void getInstanceDataTypePropWrapper(String instanceName,
String dataTypePropName, AsyncCallback callback);
public void getInstanceObjectPropWrapper(String instanceName,
String objectPropName, AsyncCallback callback);
Pagina 10 di 37
Ontology Explorer - Documentazione
AsyncCallBack è l’interfaccia principale che un chiamante deve implementare
per poter ricevere una risposta da una Remote Procedure Call. Se una RPC ha
successo, allora verranno eseguite le operazioni stabilite da onSuccess(Object),
in caso contrario, invece, verranno eseguite le operazioni relative ad
onFailure(Throwable).
Infine, l’OWLOntoServiceImpl consiste nella vera e propria implementazione
dei metodi presentati all’interno delle interfacce Java appena descritte.
All’interno di questi il servizio sfrutta l’OWLModel delle Protégé OWLAPI per
poter interrogare l’ontologia e costruisce così gli insiemi delle informazioni poi
utili per rispondere alle richieste del client.
Per mostrare un esempio semplice e chiaro al tempo stesso, si può vedere qui
di seguito come viene implementato il metodo getClassWrapper:
public OWLClassWrapper getClassWrapper(String className) {
OWLClassWrapper classWrapper = new OWLClassWrapper();
classWrapper = WrapOWLClass(OWL_model.getOWLNamedClass(className));
return classWrapper;
}
Questo metodo crea un nuovo wrapper, il quale viene poi riempito attraverso
la chiamata di un metodo statico interno alla classe (WrapOWLClass) che
consiste in:
public static OWLClassWrapper WrapOWLClass(OWLNamedClass owlClass){
OWLClassWrapper classWrapper = new OWLClassWrapper();
classWrapper.setName(owlClass.getName());
if(!owlClass.getLabels().isEmpty())
classWrapper.setLabel(
owlClass.getLabels().iterator().next().toString());
if(!owlClass.getComments().isEmpty())
classWrapper.setDescription(
owlClass.getComments().iterator().next().toString());
Iterator classIte = owlClass.getNamedSuperclasses(false).iterator();
while (classIte.hasNext()) {
classWrapper.addSuperclasses(((OWLNamedClass)classIte.next()).getName());
}
…
…
…
return classWrapper;
}
WrapOWLClass, come si può vedere, dopo aver creato l’istanza di un nuovo
wrapper, attribuisce a questo le informazioni ricavate dall’interrogazione delle
API e lo fa utilizzando i metodi setName, setLabel, setDescription e
addSuperclasses.
Pagina 11 di 37
Ontology Explorer - Documentazione
Un altro metodo utile alla comprensione del contesto è getTaxonomyWrapper:
public OWLTaxonomyWrapper getTaxonomyWrapper(String rootClassName){
TaxonomyClassNode rootClassNode = null;
OWLNamedClass OWLRootClass = null;
OWLRootClass = OWL_model.getOWLNamedClass(rootClassName);
OWLTaxonomyWrapper taxonomy = null;
if (OWLRootClass!=null) {
rootClassNode = getTaxonomyNodesTree(rootClassName);
taxonomy = new OWLTaxonomyWrapper(rootClassNode);
}
return taxonomy;
}
Questo metodo mostra il processo di creazione dell’OWLTaxonomyWrapper.
Questo consiste nell’interrogazione delle Protégé OWL-API, così da trovare
l’elemento radice dell’ontologia, il quale sarà poi, non solo il cuore del wrapper,
ma il punto di partenza per il raggiungimento di tutte le informazioni relative
all’ontologia.
3.1.3 Funzionamento del servizio
Per quanto concerne il funzionamento del servizio, va innanzi tutto detto che
questo deve essere inizializzato dal client. Questa operazione consiste
sostanzialmente nel metodo initializeServiceEntryPoint:
private final OWLOntoServiceAsync initiailizeServiceEntryPoint() {
OWLOntoServiceAsync ontoService =
(OWLOntoServiceAsync) GWT.create(OWLOntoService.class);
ServiceDefTarget target = (ServiceDefTarget) ontoService;
String staticResponseURL = GWT.getModuleBaseURL();
staticResponseURL += "owlOntoService";
target.setServiceEntryPoint(staticResponseURL);
return ontoService;
}
Questo metodo crea un particolare oggetto OWLOntoServiceAsync
(ontoService) attraverso il metodo statico GWT.create poi, tramite un altro
metodo statico (GWT.getModuleBaseURL), ottiene l’url del modulo necessario a
stabilire i punti di entrata per i file RPC presenti all’interno del percorso
pubblico.
Una volta che il servizio è stato correttamente inizializzato ed impostato, il
client può richiamarlo attraverso l’oggetto creato (ontoService) per effettuare
le richieste di cui ha bisogno. Alcuni esempi di queste chiamate possono
essere:
ontoService.loadOntologyFromURL(textBox.getText(), new
OntoService_LoadCallBack());
Pagina 12 di 37
Ontology Explorer - Documentazione
oppure
ontoService.getTaxonomyWrapper("owl:Thing", new
OntoService_GetTaxonomyCallBack());
Come si può notare, i metodi utilizzati richiamano anche le chiamate asincrone
supportate dall’interfaccia OWLOntoServiceAsync. Queste chiamate, come già
anticipato in precedenza, prevedono due evenienze:


onSuccess(Object), in caso di successo della chiamata;
onFailure(Throwable), in caso di fallimento della chiamata.
Esempi significativi di implementazione di questa interfaccia possono essere:

OntoService_LoadCallBack che mostra, in caso di fallimento, la gestione
degli errori, mentre, in caso di successo, la visualizzazione di un
messaggio di conferma rivolto all’utente e l’invio di una chiamata al
server per ottenere le informazioni sulla tassonomia appena caricata.
private class OntoService_LoadCallBack implements AsyncCallback {
public void onFailure(Throwable caught) {
try {
throw caught;
} catch (InvocationException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} catch (Throwable e) {
// last resort -- a very unexpected exception
}
loadPanel.remove(loadLabel);
loadPanel.add(reloadButton);
}
public void onSuccess(Object result) {
ontoLabel.setText("Stai navigando l’ontologia:
"+textBox.getText());
ontoService.getTaxonomyWrapper("owl:Thing",
new OntoService_GetTaxonomyCallBack());
loadPanel.remove(loadLabel);
loadPanel.add(reloadButton);
}
}
Pagina 13 di 37
Ontology Explorer - Documentazione

OntoService_GetTaxonomyCallBack che mostra, in caso di fallimento, la
sua gestione degli errori, mentre, in caso di successo, il richiamo dei
metodi utili a costruire i widget basati sulla tassonomia caricata, quali il
TaxonomyTree (tree) ed il TaxonomySearch (autoBox).
private class OntoService_GetTaxonomyCallBack implements AsyncCallback {
public void onFailure(Throwable caught) {
try {
throw caught;
} catch (InvocationException e) {
// the call didn’t complete cleanly
} catch (Throwable e) {
// last resort -- a very unexpected exception
}
}
public void onSuccess(Object result) {
OWLTaxonomyWrapper taxonomy = (OWLTaxonomyWrapper)result;
tree.setTaxonomyAndShowIstances(taxonomy, withInstance);
createList(taxonomy);
orderList(list);
autoBox.setCompletionItems(new SimpleAutoCompletionItems(list));
}
}
3.2 I wrapper
Per poter implementare applicazioni AJAX con GWT, è indispensabile passare
informazioni dal server al client e queste informazioni devono poter essere
compilate come JavaScript. Per poter essere compilate come JavaScript,
queste informazioni devono essere contenute in classi Java implementanti
isSerializable, ovvero la serializzazione di GWT (e non la normale
serializzazione di Java). L’Ontology Explorer, ricavando le informazioni relative
alle ontologie attraverso le Protégé OWL-API, non aveva modo di passare tali
informazioni dal server al client in modo corretto, cioè da permettere la
serializzazione e la conseguente compilazione in JavaScript, perciò si è pensato
all’utilizzo di particolari classi implementanti isSerializable, utili unicamente al
passaggio delle informazioni, capaci di essere compilate come JavaScript e da
questo sono stati implementati i wrapper. Questi wrapper, paragonabili ad una
sorta di pacchetto, possono contenere i dati dell’ontologia, quelli di una classe
o di un’istanza e vengono richiamati e spediti al client ogni volta che l’utente fa
una richiesta di informazioni al server.
Pagina 14 di 37
Ontology Explorer - Documentazione
Questi wrapper sono stati costruiti seguendo lo stesso paradigma dei
Javabean, ovvero:





implementano IsSerializable (di GWT), cioè sono serializzabili in XML per
essere passati tramite le Remote Procedure Call (RPC);
il loro scopo unico è quello di trasportare informazioni;
possiedono attributi utili, appunto, al trasporto delle informazioni;
non hanno logica di funzionamento;
espongono metodi get e set per la gestione degli attributi pubblici.
Un problema che si è presentato durante lo sviluppo dei wrapper è stato quello
relativo alla ”autolimitazione”, cioè alla decisione di quali e quante informazioni
raggruppare all’interno di ogni singolo wrapper. Tale problema si è posto in
quanto ogni wrapper rappresentante un elemento appartenente all’ontologia
(come una classe), attraverso le varie relazioni esistenti, avrebbe potuto
contenere anche le informazioni relative agli elementi collegati; così facendo, in
maniera ricorsiva, si sarebbe arrivati al punto di avere all’interno di ogni
wrapper tutti gli altri wrapper rappresentanti gli elementi dell’ontologia. Questo
sarebbe risultato, ovviamente, inutile e controproducente, perciò, per ogni
wrapper sono stati stabiliti limiti di contenimento delle informazioni ed usati,
dove necessario, i dovuti riferimenti, utili per reperire altri wrapper, e relative
informazioni, in un secondo momento tramite una nuova chiamata
all’OntologyService.
Vengono qui di seguito descritti i principali wrapper sviluppati all’interno del
progetto.
3.2.1 OWLWrapper
OWLWrapper è una classe astratta che implementa IsSerializable per
scambiare dati dal Semantic Service al Client GWT. Ogni elemento OWL
scambiato deve ereditare da OWLWrapper. Questa contiene gli attributi:




name
namespace
label
description
Pagina 15 di 37
Ontology Explorer - Documentazione
3.2.2 OWLClassWrapper
OWLClassWrapper contiene tutte le informazioni riguardanti una classe OWL
(owl:class). Questa, oltre alle informazioni ereditate da OWLWrapper,
contiene: la collezione delle superclassi, la collezione delle sottoclassi, la
collezione delle object property, la collezione delle datatype property e la
collezione delle istanze.
Relativamente all’autolimitazione, l’OWLClassWrapper è stato impostato in
modo tale da vedere tutte le classi (superclassi e sottoclassi) e le istanze
collegate alla classe come riferimenti ai nomi (ID) in formato stringa dei loro
rispettivi wrapper.
3.2.3 OWLInstanceWrapper
OWLInstanceWrapper contiene tutte le informazioni riguardanti le istanze di
una classe. Questa, oltre alle informazioni ereditate da OWLWrapper, contiene
la collezione di tutte le classi di cui è istanza. Si vuole sottolineare il fatto
che in OWL un’istanza può essere istanza di più classi. Come già anche per
l’OWLClassWrapper, l’OWLInstanceWrapper è stato impostato in modo da
essere limitato dal punto di vista del contenimento di informazioni, ovvero
gestisce le classi e le istanze a cui è collegato come dei riferimenti ai loro
relativi wrapper. Questi riferimenti, citati anche in altri wrapper, offrono la
possibilità di raggiungere le informazioni desiderate in un secondo momento,
senza doverle possedere ed accumularle ad altre di maggior rilievo in un
determinato istante.
3.2.4 OWLTaxonomyWrapper
OWLTaxonomyWrapper rappresenta una particolare tassonomia OWL (ovvero
un albero di classi). Questa, oltre alle informazioni ereditate da OWLWrapper,
contiene:



rootClass
maxDeep
minDeep
Pagina 16 di 37
Ontology Explorer - Documentazione
3.3 I CSS
Fondamentali per la creazione dell’interfaccia del tool di navigazione sono i CSS
(Cascading Style Sheet), ovvero i fogli di stile per la visualizzazione grafica dei
componenti a browser. L’utilizzo dei CSS, già molto frequente all’interno di
normali pagine web, è risultato di importanza ancora maggiore all’interno
dell’Ontology Explorer in quanto ogni widget deve, per una corretta
rappresentazione, essere formattato tramite CSS.
La formattazione impostata attraverso i CSS non ha solo rilevanza dal punto di
vista della correttezza delle visualizzazione, ma anche dal punto di vista della
logica di programmazione. Si pensi alla differenziazione grafica tra classi ed
istanze effettuata per aiutare l’utente a riconoscere in maniera più rapida e
semplice le diverse entità; questo, dal lato della programmazione in Java,
sarebbe risultato sì possibile, ma sicuramente ben più complesso, mentre,
grazie all’utilizzo dei CSS, si è potuta gestire la visualizzazione in modo
sicuramente più rapido e più semplice, rendendo così le classi (rappresentate
coi nomi scritti in grassetto) facilmente distinguibili dalle istanze
(rappresentate coi nomi scritti in corsivo). Quanto appena detto è un esempio
pratico del concetto base su cui sono stati creati i CSS, ovvero sulla
separazione del contenuto informativo della pagina dalla formattazione di
quest’ultima.
I CSS assumono inoltre un ruolo di rilevante importanza dal punto di vista della
parametrizzazione, in quanto, semplicemente mettendo a disposizione
dell’utente finale diversi file CSS (appositamente sviluppati), questo potrà
scegliere ed ottenere visualizzazioni del tool completamente differenti, magari
volte ad enfatizzare determinate informazioni piuttosto che altre, così da
riuscire a risolvere in modo più semplice particolari problematiche.
I CSS possono essere considerati parte integrante dei widget e quindi anche
dell’Ontology Explorer.
Mostriamo qui di seguito un esempio di applicazione di CSS ad un widget,
prendendo come riferimento il TaxonomyTree.
Innanzi tutto viene scritto il codice all’interno del file CSS associato all’Ontology
Explorer. Per questo caso particolare viene scritto il codice relativo all’albero in
generale (.TaxonomyTree), al singolo nodo rappresentante una classe
(.TaxonomyTree-OWLClass .gwt-TreeItem), al singolo nodo rappresentante
un’istanza (.TaxonomyTree-OWLInstance .gwt-TreeItem) e al singolo nodo
risultante selezionato (.TaxonomyTree .gwt-TreeItem-selected).
.TaxonomyTree{
margin: 3px, 3px, 3px, 3px;
font-size: xx-small;
font-family: Verdana, Arial, Helvetica, sans-serif;
}
Pagina 17 di 37
Ontology Explorer - Documentazione
.TaxonomyTree-OWLClass .gwt-TreeItem{
font-weight: bold;
cursor: hand;
}
.TaxonomyTree-OWLInstance .gwt-TreeItem{
font-weight: normal;
font-style: italic;
color: green;
cursor: hand;
}
.TaxonomyTree .gwt-TreeItem-selected {
background-color: #E8EEF7;
text-decoration: underline;
}
Una volta creato il codice appena mostrato, questo va collegato al widget che
lo usa; per questo, all’interno della classe Java TaxonomyTree.java vengono
create delle variabili statiche utili come riferimenti ai nomi degli stili definiti nel
CSS.
public static String WIDGET_STYLE_NAME_ROOT = "TaxonomyTree";
public static String OWLCLASS_STYLE = WIDGET_STYLE_NAME_ROOT+"-"+"OWLClass";
public static String OWLINSTANCE_STYLE = WIDGET_STYLE_NAME_ROOT+"-"+"OWLInstance";
Le variabili appena mostrate vengono poi utilizzate per assegnare ai vari
widget, ed alle loro parti, lo stile relativo in base alla logica del tool. Va
sottolineato che questo tipo di assegnamenti, come gli esempi riportati di
seguito, sono fattibili anche durante il funzionamento dell’applicazione e quindi
aumentano le potenzialità dello strumento dandogli la capacità di modificarsi in
corso d’opera.
rootItem.setStyleName(OWLCLASS_STYLE);
rootItem.setStyleName(OWLINSTANCE_STYLE);
Pagina 18 di 37
Ontology Explorer - Documentazione
4 Widget
L’Ontology Explorer, dal punto di vista dell’interattività e dell’interfaccia, è
composto per la quasi totalità da widget. Questi ultimi, messi a disposizione da
GWT, non sono altro che componenti grafici capaci di sfruttare la tecnologia
AJAX. Qui di seguito vengono inizialmente introdotti i widget di base già offerti
da GWT e successivamente verranno descritti i widget creati appositamente
per l’Ontology Explorer; tra questi vi sono l’Option Box, il TaxonomySearch, il
TaxonomyTree, l’OWLInstanceDisclosurePanel e l’OntologyInfoPanel.
4.1 Widget di base
GWT mette già a disposizione del programmatore diversi widget di base, i quali
possono essere utilizzati per eseguire le loro specifiche operazioni, oppure
possono essere scelti come fondamenta per l’implementazione di widget
composite. Vengono qui di seguito elencati i widget di base usati dall’Ontology
Explorer.
4.1.1 Componenti di input

Button: un button (o pulsante di comando) è un widget che fornisce
all’utente un modo semplice per innescare un evento, come inviare una
richiesta ad un motore di ricerca, o per interagire con finestre di dialogo,
come confermare determinate azioni. Il tipico button è rettangolare con
un’intestazione descrittiva al centro. Il metodo più comune di premere un
button è cliccare su di esso, ma possono essere utilizzate anche altri
input, quali la battuta dell’invio. Quando premuto, oltre all’esecuzione di
un compito predeterminato impostato tramite la gestione dell’evento, il
button subisce spesso un cambiamento grafico come se questo stesse
temporaneamente abbassato.

RadioButton: un radio button è un tipo di widget grafico di interfaccia
utente, il quale permette all’utente di scegliere una di un insieme
predefinito di opzioni. I radio button sono organizzati in gruppi di due o
più e vengono mostrati su schermo come, ad esempio, dei fori circolari
contenenti spazio bianco (quando non selezionati) o un punto (quando
selezionati). Adiacente ad ogni radio button viene mostrata normalmente
una label che descrive la scelta che questo rappresenta. Quando l’utente
seleziona un radio button, qualsiasi altro scelto precedentemente nello
stesso gruppo si deseleziona. Selezionare un radio button può essere
fatto facendo clic sulla rappresentazione grafica a forma di foro circolare
o sull’intestazione oppure anche utilizzando un tasto di scelta rapida.
Pagina 19 di 37
Ontology Explorer - Documentazione

CheckBox: una check box è un altro tipo di widget grafico di interfaccia
utente; questo consente all’utente di effettuare più scelte da molte
opzioni. Normalmente, le check box vengono mostrate sullo schermo
come piccoli riquadri che possono contenere spazio bianco (quando non
selezionate) o un segno a forma di x (quando selezionate). Adiacente alla
check box viene mostrata normalmente un’intestazione che descrive il
significato di questa. Invertire lo stato di una check box può essere fatto
facendo clic sulla rappresentazione grafica a forma di piccolo riquadro o
sull’intestazione oppure anche utilizzando un tasto di scelta rapida.

TextBox: una casella di testo, un campo o un riquadro di ingresso di
testo è un comune elemento grafico di interfaccia utente. Lo scopo di una
casella di testo è permettere all’utente di immettere informazioni testuali
che devono essere utilizzate dal programma. Le direttive user-interface
(user-interface guidelines) consigliano una casella di testo single-line (a
linea singola) quando è richiesta una sola linea di immissione, mentre
una multiline (a linea multipla) nel caso un sola linea di immissione non
fosse sufficiente. Le caselle di testo non editabili possono servire al
semplice scopo di mostrare del testo. Una tipica casella di testo è un
rettangolo di qualsiasi dimensione, possibilmente con un confine che
separa la casella di testo dal resto dell’interfaccia. Le caselle di testo
possono contenere zero, uno o due barre di scorrimento. Alcune possono
mostrare una linea verticale lampeggiante, indicando la regione corrente
di testo che viene editato. È comune che il cursore del mouse cambi la
sua forma quando si sposta sopra una casella di testo.

ListBox: una list box è un widget che permette all’utente di scegliere uno
o più elementi da un elenco contenuto in una casella di testo a linea
multipla. L’utente clicca, all’interno dell’elenco, sull’elemento che vuole
selezionare, tenendo premuto il tasto Shift nel caso volesse effettuare
più scelte.
4.1.2 Componenti di visualizzazione

Tree: un tree è una struttura dati che emula una struttura ad albero con
un insieme di nodi collegati. Una struttura ad albero è un modo di
rappresentare graficamente la natura gerarchica di una struttura. È
chiamata struttura ad albero perché proprio come un albero possiede la
radice all’inizio e le foglie nel fondo. Dal punto di vista grafico si presenta
come un’insieme di stringhe, rappresentanti i singoli nodi; quando il nodo
risulta chiuso la stringa relativa è accostata ad un simbolo ”+”, utile
all’apertura del nodo stesso, mentre, viceversa, nel caso in cui il nodo
risulti aperto, la stringa sarebbe accostata ad un simbolo ”-”, questo utile
alla chiusura del nodo. Da quanto appena detto, si riesce ad evincere
l’altro grado di interattività fornito dal tree, il quale modifica il proprio
stato ad ogni singolo click. Oltre a questo va infine detto che, grazie alla
Pagina 20 di 37
Ontology Explorer - Documentazione
capacità di supportare la gestione di diversi eventi, il tree riesce ad
incrementare notevolmente le sue funzionalità e quindi la sua utilità.

PopupPanel: un popup panel è un widget fuori dalla gerarchia principale
di gestione delle geometrie di una pagina. È una costruzione fatta
attivare temporaneamente per dare all’utente una parte di informazioni o
per ottenere qualche informazione dall’utente. Un popup è una finestra
che, solitamente, mentre si stata navigando col browser, si può aprire
autonomamente o si può aprire tramite un click sul relativo link. Può
essere utile o fastidiosa. Tipicamente, ma non sempre, si può chiudere
cliccando la x che viene mostrata in un angolo.
4.1.3 Componenti di layout (utili alla disposizione di altri widget)

HorizontalPanel: un horizontal panel (pannello orizzontale) è un widget
che spesso non ha alcuna caratteristica grafica specifica, ma viene
utilizzato principalmente per raggruppare insieme altri widget
(ovviamente in senso orizzontale). Questo permette di avere un controllo
migliore sulla disposizione dei widget.

VerticalPanel: un vertical panel (pannello verticale) è un widget dalle
stesse caratteristiche appena presentate per l’HorizontalPanel, con l’unica
differenza del senso di disposizione dei widget, cioè verticale invece che
orizzontale.

TabPanel: un tab panel è un widget di navigazione per la commutazione
tra documenti. Un singolo tab è solitamente progettato come un’etichetta
di testo all’interno di un riquadro rettangolare. L’attivazione di un tab
(tipicamente dovuta ad un click del mouse) rende visibile il suo
documento associato ed evidenzia il tab stesso, così da distinguerlo dagli
altri tab non attivi. Generalmente, può essere attivo solo un tab alla
volta. Questi tab, dal punto di vista grafica, richiamano le tradizionali
schede cartacee, così da dare all’interfaccia utente un aspetto più
familiare per l’utilizzatore finale.
Pagina 21 di 37
Ontology Explorer - Documentazione
4.2 Widget sviluppati
Al fine di realizzare l’Ontology Explorer come pensato in fase di progettazione,
si è deciso di sviluppare dei widget specifici aventi una loro logica ad hoc.
Questi particolari widget derivano dalla composizione di widget di base, così da
poter assolvere particolari compiti più complessi e specifici rispetto ai widget di
base. Tra questi widget ve ne sono tre molto particolari e di fondamentale
importanza per il raggiungimento degli obiettivi prefissati e sono:





OptionBox
TaxonomySearch
TaxonomyTree
OWLInstanceDisclosurePanel
OntologyInfoPanel
Si rinvia ai paragrafi successivi una loro più specifica descrizione.
4.2.1 OptionBox
L’OptionBox è un widget composto dall’unione di un PopupPanel con una
CheckBox, dei RadioButton, delle Label ed un Button.
Lo scopo di questo widget è quello di mettere a disposizione dell’utente uno
strumento utile a gestire la parametrizzazione relativa alla rappresentazione
dei dati relativi all’ontologia. Il suo costruttore, riportato qui sotto, mostra la
presenza di un metodo apposito, generateOptionBox, utile alla composizione
del widget.
public OptionBox() {
super();
init();
generateOptionBox();
}
I parametri presenti e gestibili dall’utente riguardano (come già detto nel
paragrafo 2.2) diverse aree concettuali dell’Ontology Explorer.
Opzioni generali:


Mostrare (o non mostrare) le istanze durante la navigazione
Mostrare (o non mostrare) i tool tip rappresentanti le descrizioni dei vari
oggetti esistenti
Opzioni di visualizzazione:


Rappresentare gli elementi dell’ontologia attraverso i loro nomi
Rappresentare gli elementi dell’ontologia attraverso le loro label
Pagina 22 di 37
Ontology Explorer - Documentazione
Opzioni di ricerca:



Effettuare la ricerca in modalità “Start with” (default)
Effettuare la ricerca in modalità “Contains” (slow)
Utilizzo dei prefissi nella ricerca
Opzioni relative al pannello di visualizzazione delle informazioni:




Rappresentare le istanze di una classe attraverso i loro nomi
Rappresentare le istanze di una classe attraverso le loro label
Ordinare alfabeticamente le istanze
Ordinare alfabeticamente le proprietà
La modifica dei detti parametri avviene attraverso specifici setters, di cui un
paio di esempi vengono qui di seguito riportati.
public void setLabels(boolean isLabels) {
this.isLabels = isLabels;
if(isLabels){
this.isNames = false;
this.isIDs = false;
}
}
public void setNames(boolean isNames) {
this.isNames = isNames;
if(isNames){
this.isIDs = false;
this.isLabels = false;
}
}
Questo widget dà all’utilizzatore finale dell’Ontology Explorer la possibilità di
gestire la parametrizzazione in modo facile e veloce, senza che esso debba
avere particolari conoscenze o capacità. In tal modo chiunque può utilizzare
questo tool visualizzandolo in base alle proprie esigenze.
public boolean getNameRBValue(){
return rbName.isChecked();
}
Il codice appena presentato mostra la gestione su di un particolare
RadioButton e, più precisamente, fa vedere, in base al controllo dello stato del
widget, come viene modificato il parametro.
L’attuazione del cambiamento dei parametri viene avviata cliccando col mouse
sull’apposito button. Una volta effettuata questa operazione, l’OptionBox viene
chiuso ed i componenti soggetti alla parametrizzazione, quali il
TaxonomySearch ed il TaxonomyTree, vengono rigenerati sulla base delle
modifiche effettuate.
Pagina 23 di 37
Ontology Explorer - Documentazione
In quanto all’architettura dell’OptionBox, questo viene creato al momento
dell’avvio dell’Ontology Explorer ed è capace di gestire la parametrizzazione sia
prima che dopo il caricamento dell’ontologia desiderata.
4.2.2 TaxonomySearch
Il TaxonomySearch è un widget composto dall’unione di una TextBox con una
ListBox ed un PopupPanel.
Lo scopo di questo widget è quello di mettere a disposizione dell’utente una
casella di ricerca intelligente (o smart) simile a quella utilizzata all’interno di
Google Suggest. L’intelligenza di tale casella di ricerca viene data dalla
conoscenza di tutti gli elementi presenti all’interno dell’ontologia caricata.
Conoscendo tutte le entità esistenti, mentre l’utente digita il nome di ciò che
desidera cercare all’interno della tassonomia, la casella di ricerca riesce a
mostrare un pop-up contenente una lista comprendente tutte gli elementi
ricercabili.
La ricerca attraverso il TaxonomySearch può essere avviata sia dopo aver
completato la digitazione dell’elemento da ricercare, cliccando sul button “GO”,
sia durante la digitazione, interrompendola battendo il tasto Invio e
selezionando uno degli elementi presenti nella lista. Nell’esempio seguente
viene mostrata la gestione degli eventi relativi all’input da tastiera; si può
infatti notare la gestione dei tasti KEY_DOWN e KEY_UP, che comportano lo
spostamento della selezione all’interno della lista, KEY_ENTER, che porta alla
scelta ed alla conseguente visualizzazione di un elemento della lista, e
KEY_ESCAPE che chiude la lista senza effettuare alcun tipo di selezione.
if(arg1 == KEY_DOWN){
int selectedIndex = choices.getSelectedIndex();
selectedIndex++;
if(selectedIndex > choices.getItemCount()) {selectedIndex = 0;}
choices.setSelectedIndex(selectedIndex);
return;
} if(arg1 == KEY_UP){
int selectedIndex = choices.getSelectedIndex();
selectedIndex--;
if(selectedIndex < 0) {selectedIndex = choices.getItemCount();}
choices.setSelectedIndex(selectedIndex);
return;
} if(arg1 == KEY_ENTER){
if(visible)
complete();
return;
} if(arg1 == KEY_ESCAPE){
choices.clear();
choicesPopup.hide();
visible = false;
return;
}
Pagina 24 di 37
Ontology Explorer - Documentazione
Avviata la ricerca, se effettuata su di un nome esistente, l’albero
rappresentante la tassonomia si apre in corrispondenza dell’elemento
corrispondente e si apre la relativa scheda di visualizzazione delle informazioni.
Si può vedere come avvenga questo grazie all’esempio qui riportato, dove si
vede il richiamo del metodo all’evento del click.
public void onClick(Widget arg0) {
tree.moveTree(new TreeItem(autoBox.getText()));
}
Questo widget risulta utile per l’utente in quanto gli permette di ricercare
elementi anche a lui sconosciuti e gli evita di perdere tempo nella ricerca di
entità non esistenti all’interno dell’ontologia presa in esame.
Per quanto riguarda l’architettura del TaxonomySearch, questo viene costruito
solo dopo che è avvenuto il caricamento dell’ontologia; una volta avvenuto ciò,
infatti, al widget viene passata l’intera tassonomia, la quale viene utilizzata per
generare la lista di suggerimento all’utente.
Oltre a quanto detto finora, va anche precisato che questo widget è soggetto
alla parametrizzazione e quindi i dati che esso contiene posso essere
visualizzati in modi diversi a seconda delle scelte dell’utente.
4.2.3 TaxonomyTree
Il TaxonomyTree è un widget derivato dalla specializzazione di un Tree.
Lo scopo di questo widget è quello di dare all’utente una struttura dinamica
utile alla visualizzazione di una tassonomia. Qui viene mostrato il metodo
generatore del TaxonomyTree attraverso il quale si può vedere come, dopo
una serie di dovuti controlli sui parametri esistenti, questo richiami i vari
metodi di riempimento dell’albero con la tassonomia passata.
public boolean generateTaxonomyTree() {
if (!taxonomy.isEmpty()) {
treeMap.clear();
rootItem = fillTree(taxonomy.getRootClass());
taxonomyTree.removeItems();
taxonomyTree.addItem(rootItem);
setStyleName(WIDGET_STYLE_NAME_ROOT);
taxonomyTree.addTreeListener(this);
return true;
}
else return false;
}
Ciò che differenzia il TaxonomyTree da un normale Tree sono le azioni che
supporta alla selezione di un suo elemento ed i comportamenti che tiene
all’accadimento di particolari eventi dovuti ad altri widget. In particolare,
riguardo a quanto appena detto, il Taxonomy Tree, quando si clicca su di un
suo elemento, apre la relativa scheda di visualizzazione delle informazioni,
Pagina 25 di 37
Ontology Explorer - Documentazione
mentre, quando durante la navigazione l’utente si muove ed accede a diverse
entità, senza effettuarne la ricerca o comunque senza passare per l’albero,
questo si modifica e si mantiene aperto sempre sull’elemento di cui l’utente sta
visualizzando le informazioni.
private class treeUserTreeListener implements TreeListener{
public void onTreeItemSelected(final TreeItem item) {
if(((TaxonomyNode)item.getUserObject()).isInstanceNode()){
ontoService.getInstanceWrapper(
((TaxonomyNode)item.getUserObject()).getName(),
new OntoService_GetInstanceWrapperCallBack());
}else{
ontoService.getClassWrapper(
((TaxonomyNode)item.getUserObject()).getName(),
new OntoService_GetClassWrapperCallBack());
}
}
}
Nel codice sopra presentato è rappresentata la gestione della selezione di un
elemento del tree. Questo mostra in particolare l’utilizzo dei metodi su
ontoService, getInstanceWrapper e getClassWrapper, ovvero quei metodi utili
a fare richieste al servizio per ottenere informazioni, rispettivamente, su
istanze e classi. Questo widget mette a disposizione dell’utente uno strumento
molto utile alla navigazione dell’ontologia, il quale permette di poter analizzare
quest’ultima e la sua struttura anche senza avere le dovute conoscenze. Come
già detto per il Taxonomy Search, anche il TaxonomyTree viene costruito solo
una volta avvenuto il caricamento dell’ontologia; dopo di ciò, infatti, al widget
viene passata l’intera tassonomia, la quale viene utilizzata per generare la
struttura ad albero poi visualizzata (come già visto nel primo esempio sopra
presentato). Anche per questo widget va precisata la dipendenza dalla
parametrizzazione, ovvero che i dati da esso rappresentati possono essere
visualizzati in modi diversi a seconda delle scelte dell’utente.
4.2.4 OWLInstanceDisclosurePanel
L’OWLInstanceDisclosurePanel è un widget derivato dalla specializzazione di un
DisclosurePanel.
Lo scopo di questo widget è quello di dare all’utente una struttura dinamica
utile alla visualizzazione di tutte le istanze relative ad una determinata classe.
La caratteristica principale del DisclosurePanel consiste nella capacità di
mostrare (o nascondere), con un semplice click, un pannello contenente uno o
più widget. L’OWLInstanceDisclosurePanel è una specializzazione di questo in
quanto, semplicemente prendendo in ingresso una Collection di wrapper
(OWLInstanceWrapper), riempie il pannello con un elenco di label
rappresentanti tutte le istanze della lista; dette label sono tutte cliccabili e
Pagina 26 di 37
Ontology Explorer - Documentazione
consentono (al click dell’utente) la visualizzazione della scheda relativa
all’istanza interessata.
Qui di seguito viene mostrata una parte del codice appartenente al metodo
generatore dell’OWLInstanceDisclosurePanel, dove si può vedere il ciclo dove
avviene l’assegnazione delle label ed il riempimento del pannello con le label
rappresentanti le istanze.
Iterator ite = list.iterator();
while (ite.hasNext()) {
Label lab = new Label();
OWLInstanceWrapper instanceWrapper = (OWLInstanceWrapper)ite.next();
if(name){
lab.setText(instanceWrapper.getName());
}else if(label){
if(instanceWrapper.getLabel()!=null){
if(!instanceWrapper.getLabel().equalsIgnoreCase("")){
lab.setText(instanceWrapper.getLabel());
}else{
lab.setText(instanceWrapper.getName()+NO_LABEL);
}
}else{
lab.setText(instanceWrapper.getName()+NO_LABEL);
}
}
vp.add(lab);
}
Un’ulteriore peculiarità dell’OWLInstanceDisclosurePanel consiste nella capacità
di visualizzare l’elenco delle istanze sopra citato, sia attraverso i loro nomi, sia
attraverso le loro label (a seconda delle decisioni fatte dall’utente attraverso
l’apposita CheckBox).
Viene qui mostrato il metodo che gestisce l’evento onClick sulla CheckBox e
che quindi imposta la configurazione dell’OWLInstanceDisclosurePanel.
showInstancesWithLabelCheckBox.addClickListener(new ClickListener(){
public void onClick(Widget sender){
if(((CheckBox)sender).isChecked()){
instanceOIDP.setName(false);
instanceOIDP.setLabel(true);
instanceOIDP.regenerate();
findInfoAboutInstance(instanceOIDP);
}else{
instanceOIDP.setName(true);
instanceOIDP.setLabel(false);
instanceOIDP.regenerate();
findInfoAboutInstance(instanceOIDP);
}
}
});
Visto quanto appena detto, anche per questo widget viene evidenziata la
dipendenza dalla parametrizzazione, ovvero che i dati da esso rappresentati
possono essere visualizzati in modi diversi a seconda delle scelte dell’utente.
Pagina 27 di 37
Ontology Explorer - Documentazione
4.2.5 OntologyInfoPanel
L’OntologyInfoPanel consiste in un semplice popup che prende in ingresso un
wrapper, più precisamente un OWLOntologyInfo, e che da questo ricava tutte
le informazioni riguardanti l’ontologia caricata (quali nome, label, description,
ecc…). Una volta assunte queste informazioni, l’OntologyInfoPanel può essere
visualizzato semplicemente cliccando sul relativo bottone presente all’interno
dell’OntologyExplorer.
Viene qui di seguito mostrato il codice relativo al metodo generatore
dell’OntologyInfo panel.
private void generatePanel() {
this.clear();
this.setStyleName(WIDGET_STYLE_NAME_ROOT);
closeButton.setStyleName(INFO_CLOSEBUTTON_STYLE);
vPanel.clear();
vPanel.setStyleName(VPANEL_STYLE);
vPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
caption.setStyleName(INFO_CAPTION_STYLE);
closeXButton.setStyleName(INFO_CLOSEXBUTTON_STYLE);
hPanel.setStyleName(HPANEL_STYLE);
hPanel.add(caption); hPanel.add(closeXButton);
hPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
this.setCaption(hPanel);
String label = new String(ONTOLOGYINFO_NONE_VALUE_LABEL);
String description = new String(ONTOLOGYINFO_NONE_VALUE_LABEL);
if (ontologyInfo!=null) {
if (ontologyInfo.getLabel()!=null)
label = ontologyInfo.getLabel();
if (ontologyInfo.getDescription()!=null)
description = ontologyInfo.getDescription();
HTML row1 = new HTML("<span class=\""+INFO_LABEL_STYLE+"\">"
+ONTOLOGYINFO_LABEL_LABEL+"</span>"
+"<span class=\""+INFO_VALUE_STYLE+"\">"
+label+"</span>");
HTML row3 = new HTML("<span class=\""+INFO_LABEL_STYLE+"\">"
+ONTOLOGYINFO_NAMESPACE_LABEL+"</span>"
+"<span class=\""+INFO_VALUE_STYLE+"\">"
+ontologyInfo.getNamespace()+"</span>");
HTML row4 = new HTML("<span class=\""+INFO_LABEL_STYLE+"\">"
+ONTOLOGYINFO_DESCRITPION_LABEL+"</span>"
+"<span class=\""+INFO_VALUE_STYLE+"\">"
+description+"</span>");
row1.setStyleName(INFO_ROW_STYLE);
row3.setStyleName(INFO_ROW_STYLE);
row4.setStyleName(INFO_ROW_STYLE);
vPanel.add(row1); vPanel.add(row3); vPanel.add(row4);
}
else vPanel.add(new HTML("<span class=\""+NO_INFO_LABEL_STYLE+"\">"
+ONTOLOGYINFO_NOINFO_LABEL+"</span>"));
vPanel.add(closeButton);
this.add(vPanel);
}
Pagina 28 di 37
Ontology Explorer - Documentazione
5 Progetto Eclipse ed organizzazione del
codice
Come già anticipato all’interno del paragrafo 1.1, il progetto dell’Ontology
Explorer è stato interamente sviluppato all’interno dell’ambiente Eclipse. In
questo capitolo viene mostrata l’organizzazione e la struttura dell’intero
progetto all’interno, appunto, di Eclipse.
5.1 Package Java
Il progetto globale dell’Ontology Explorer, all’interno di Eclipse è in realtà
composto da tre mini progetti collegati tra loro. Questi tre mini progetti sono:



GWT-OWLWrapper
OntologyExplorer
SemanticWidgets
Ognuno di questi progetti contiene al suo interno diversi package utili a
suddividere, a seconda delle diverse utilità e delle diverse funzioni, le classi
sviluppate all’interno del progetto stesso. Questi package possono contenere,
non solo classi java, ma anche i file GWT-Module in formato xml e cartelle
contenenti tutti i file necessari per la pubblicazione del progetto sul web, quali
pagine html, fogli di stile css o immagini. Vengono ora mostrati i vari package
in relazione al mini progetto a cui appartengono.
5.1.1 GWT-OWLWrapper
org.xlab.semantic.gwt
Package contenente il GWT-Module del progetto in formato xml.
Al suo interno vi si può trovare:
 gwt-OWLWrappers.gwt.xml
org.xlab.semantic.gwt.client.owlUtility.info
Package contenente una classe utile a racchiudere le informazioni globali
riguardanti l’ontologia.
Al suo interno vi si può trovare:
 OntologyInfo.java
Pagina 29 di 37
Ontology Explorer - Documentazione
org.xlab.semantic.gwt.client.owlUtility.interface
Package contenente due interfacce utili a racchiudere particolari informazioni
riguardanti le proprietà.
Al suo interno vi si può trovare:
 PropertyWithDatatypeValues.java
 PropertyWithInstanceValues.java
org.xlab.semantic.gwt.client.owlUtility.utility
Package contenente due classi utili a racchiudere le informazioni riguardanti le
tipologie dei wrapper e delle proprietà.
Al suo interno vi si può trovare:
 OWLPropertyType.java
 OWLWrapperType.java
org xlab.semantic.gwt.client.owlUtility.wrappers
Package contenente tutti i wrapper esistenti utili al trasporto delle informazioni
dal service al client.
Al suo interno vi si può trovare:
 OWLClassDTPHasValueRestrWrapper.java
 OWLClassDTPWrapper.java
 OWLClassOPHasValueRestrWrapper.java
 OWLClassOPWrapper.java
 OWLClassPropertyWrapper.java
 OWLClassWrapper.java
 OWLInstanceDTPHasValueRestrWrapper.java
 OWLInstanceDTPWrapper.java
 OWLInstanceOPHasValueRestrWrapper.java
 OWLInstanceOPWrapper.java
 OWLInstancePropertyWrapper.java
 OWLInstanceWrapper.java
 OWLOntologyInfo.java
 OWLPropertyWrapper.java
 OWLTaxonomyWrapper.java
 OWLWrapper.java
 TaxonomyClassNode.java
 TaxonomyInstanceNode.java
 TaxonomyNode.java
Pagina 30 di 37
Ontology Explorer - Documentazione
5.1.2 OntologyExplorer
org.xlab.semantic.gwt
Package contenente i GWT-Module del progetto (client e service) in formato
xml e la cartella Public contenente tutti i file utili alla pubblicazione del progetto
sul web (file html, css, immagini, ecc…)
Al suo interno vi si può trovare:
 OntologyExplorer.gwt.xml
 OntologyService.gwt.xml
 Public (cartella)
org.xlab.semantic.gwt.client
Package contenente la main class del client del progetto.
Al suo interno vi si può trovare:
 OntologyExplorer.java
org.xlab.semantic.gwt.client.configuration
Package contenente la classe utile a gestire i parametri, e quindi la
configurazione dell’Ontology Explorer.
Al suo interno vi si può trovare:
 OBConfiguration.java
org.xlab.semantic.gwt.client.utility
Package contenente le classi utili ad assolvere particolari compiti in interazione
con l’Ontology Explorer.
Al suo interno vi si può trovare:
 SemanticHashMap.java
org.xlab.semantic.gwt.client.widgets
Package contenente i widget non semantici utili all’interno dell’Ontology
Explorer.
Al suo interno vi si può trovare:
 DefaultOntologiesMenu.java
 OptionBox.java
org.xlab.semantic.gwt.client.interfaces
Package contenente le interfacce (sincrona ed asincrona) relative al service del
progetto.
Al suo interno vi si può trovare:
 OWLOntoService.java
 OWLOntoServiceAsync.java
org.xlab.semantic.gwt.server
Package contenente la main class del service del progetto.
Al suo interno vi si può trovare:
 OWLOntoServiceImpl.java
Pagina 31 di 37
Ontology Explorer - Documentazione
5.1.3 SemanticWidgets
org.xlab.semantic.gwt.semanticWidgets
Package contenente il GWT-Module del progetto in formato xml.
Al suo interno vi si può trovare:
 SemanticWidgets.gwt.xml
org.xlab.semantic.gwt.semanticWidgets.client
Package contenente tutti i widget semantici utili all’Ontology Explorer e da esso
utilizzabili.
Al suo interno vi si può trovare:
 OntologyInfoPanel.java
 OWLDatatypePropertyDisclosurePanel.java
 OWLInstanceDisclosurePanel.java
 OWLObjectPropertyDisclosurePanel.java
 OWLPropertiesDisclosurePanel.java
 OWLPropertiesInstanceDisclosurePanel.java
 OWLPropertiesPopup.java
 OWLRestrictionDisclosurePanel.java
 SemanticLabel.java
 SemanticWidget.java
 SemanticWidgets.java
 TaxonomySearch.java
 TaxonomySearchAutoCompletation.java
 TaxonomySuggestBox.java
 TaxonomyTree.java
org.xlab.semantic.gwt.semanticWidgets.client.notUsed
 Package contenente tutti i widget semantici creati ed utilizzati durante lo
sviluppo del progetto ma non più utili all’Ontology Explorer.
5.2 Librerie
Come già detto precedentemente, il progetto globale dell’Ontology Explorer si
compone da tre mini progetti collegati tra loro. Ognuno di questi progetti
necessita di importare al suo interno particolari librerie (che siano esse interne
al progetto dell’Ontology Explorer o esterne) al fine di raggiungere gli obiettivi
prefissati. Vengono qui di seguito mostrate le librerie importate ed utilizzate da
ogni mini progetto.
Pagina 32 di 37
Ontology Explorer - Documentazione
5.2.1 GWT-OWLWrappers
Le librerie contenute sono:
 JRE System Library (libreria Java)
 gwt-user.jar (libreria di GWT)
5.2.2 OntologyExplorer
Le librerie contenute sono:
 JRE System Library (libreria Java)
 gwt-user.jar (libreria di GWT – per l’utilizzo di GWT)
 gwt-OWLWrappers.jar (libreria dei wrapper – per l’utilizzo dei wrapper)
 OntologyService.jar (libreria del service – per l’accesso al servizio)
 semanticWidgets.jar (libreria dei semantic widget – per l’utilizzo dei
semantic widget)
 gwttk-0.2.1.jar (libreria del progetto esterno GWT TK – per l’utilizzo di
alcuni componenti presenti all’interno del progetto GWT TK)
 protege-owl.jar (libreria delle protégé owl-api – per l’utilizzo delle
protégé owl-api)
 protege.jar (libreria di protégé)
 jena.jar (libreria di jena)
 xercesImpl.jar (libreria di xerces)
 icu4j.jar
 gwt-widgets-0.1.4.jar (libreria di widget – per l’utilizzo di widget messi a
disposizione dal progetto esterno gwt-widgets-0.1.4)
 gwt-servlet.jar (libreria di servlet GWT – per l’utilizzo di servlet messi a
disposizione da GWT)
 OntologyService.interfaces.jar (libreria delle interfacce del servizio)
5.2.3 SemanticWidgets
Le librerie contenute sono:
 JRE System Library (libreria Java)
 gwt-user.jar (libreria di GWT – per l’utilizzo di GWT)
 gwt-OWLWrappers.jar (libreria dei wrapper – per l’utilizzo dei wrapper)
 gwttk-0.2.1.jar (libreria del progetto esterno GWT TK – per l’utilizzo di
alcuni componenti presenti all’interno del progetto GWT TK)
Pagina 33 di 37
Ontology Explorer - Documentazione
5.3 Ant file
Infine, anche per quanto riguarda i file ant, va sottolineato che ognuno dei tre
progetti componenti il progetto globale dell’Ontology Explorer possiede ed
usufruisce di un suo file build.xml (un file ant appunto). Vengono qui di seguito
mostrate le caratteristiche e le funzionalità dei file ant appartenenti ad ogni
progetto.
5.3.1 GWT-OWLWrappers
Funzionalità dell’ant file build.xml:
 clean (cancella tutti i file .class e .war)
 CreateJAR (crea il file .jar del progetto che verrà poi utilizzato come una
libreria da altri progetti)
 CreateAndCopy-JAR [default] (crea il file .jar e lo copia direttamente
all’interno della cartella ‘lib’ relativa al progetto che lo vuole utilizzare in
qualità di libreria)
5.3.2 OntologyExplorer
Funzionalità dell’ant file build.xml
 clean (cancella tutti i file .class e .war)
 Compile Javascript (compila il progetto come Javascript)
 CompileAndCreateWAR [default] (compila il progetto e crea il WAR per
l’esportazione)
 CreateJAR (crea il file .jar del progetto che verrà poi utilizzato come una
libreria da altri progetti)
 CreateAndCopy-JAR (crea il file .jar e lo copia direttamente all’interno
della cartella ‘lib’ relativa al progetto che lo vuole utilizzare in qualità di
libreria)
 CreateWAR (crea il file .war che verrà poi utilizzato per far girare il
progetto su server)
deploy to server (esegue il procedimento di sostituzione del WAR sul server)
5.3.3 SemanticWidgets
Funzionalità dell’ant file build.xml:
 clean (cancella tutti i file .class e .war)
 CreateJAR [default] (crea il file .jar del progetto che verrà poi utilizzato
come una libreria da altri progetti)
 CreateAndCopy-JAR (crea il file .jar e lo copia direttamente all’interno
della cartella ‘lib’ relativa al progetto che lo vuole utilizzare in qualità di
libreria)
Pagina 34 di 37
Ontology Explorer - Documentazione
6 Screenshot
Figura 1 – Screenshot relativo all’Ontology Explorer dopo il caricamento
dell’ontologia UBL2
Pagina 35 di 37
Ontology Explorer - Documentazione
Figura 2 - Screenshot relativo all’Ontology Explorer durante una ricerca all’interno
dell’ontologia UBL2
Pagina 36 di 37
Ontology Explorer - Documentazione
Figura 3 - Screenshot relativo all’Ontology Explorer durante la navigazione
dell’ontologia UBL”
Pagina 37 di 37