L'intera
organizzazione del sistema è caratterizzata dall'utilizzo
di SOMA come ambiente per la mobilità. Difatti
abbiamo previsto di organizzare la struttura dei nodi
sfruttando la naturale organizzazione a domini
dei place di SOMA, la quale prevede di raggruppare
place (nodi) che hanno uguali caratteristiche sotto l'aspetto
fisico o logico in uno stesso dominio. I domini SOMA
sono organizzati ad albero gerarchico; noi
per semplicità limitiamo il nostro sistema ad un
solo livello, supponendo che i nodi del dominio non
siano eccessivi e che dunque siano contenibili in un
solo dominio. Nulla ci vieta in futuro di organizzare
i place in più sottodomini gerarchici, per far
fronte ad eventuali motivi di scalabilità del
sistema. Nel nostro caso avremo che i PNS (Place
Name Service) dei place del nostro dominio
conterranno l'elenco dei place su cui dover ricercare
le informazioni (tutti conoscono tutti).
L'applicazione è costituita di due agenti. Il primo ScarpetAgent
(committente) funge da interfaccia utente per la
ricerca e il secondo SearchAgent (cercatore)
è l'entita in grado di compiere la ricerca sui nodi.
L'agente cercatore contiene un vero e proprio
interprete del linguaggio DublinCore-XML usato per
codificare i dati. In sostanza il committente prepara
tutto il necessario per la ricerca, lancia l'agente
cercatore e visualizza infine i dati portati indietro
dal cercatore stesso. Durante la fase di ricerca, l'agente
che si muove è ovviamente l'agente cercatore. L'altro
è comunque un agente mobile in grado di spostarsi,
ma durante la fase di ricerca resta fermo sul nodo
dove si trova in attesa del risultato.
Un aspetto
interessante da affrontare riguarda la modalità di
esecuzione della ricarca. La ricerca può essere
portata avanti secondo due differenti modalità:
seriale
: tutti i nodi vengono visitati uno per volta
(in sequenza) dallo stesso agente;
-
parallelo
: ogni nodo viene visitato da un proprio
agente, più o meno contemporaneamente.
-
L'interessante
è valutare il comportamento di entrambe le soluzioni
su una rete reale e sotto diversi livelli di carico,
valutando il traffico generato ed i ritardi
introdotti. Purtroppo non è stato possibile
effettuare dei test su una rete reale, ma entrambe le
soluzioni sono state implementate con la costruzione
di unico agente cercatore. Ciò è stato reso
possibile dal fatto che l'agente cercatore, quando
viene creato, accetta come parametro un cammino di
nodi (un cammino può essere anche di un solo nodo).
Nel primo caso l'agente committente crea un solo
cercatore passandogli la lista dei nodi da visitare (in
realtà non è proprio così), nel secondo crea un
cercatore per ogni nodo passandogli il nodo stesso.
Coordinamento richiesta/ricerca/risposta
Il modello
di richiesta della ricerca è un modello client/server
tra l'utente e l'agente SearchAgent, mentre è a
demandazione tra i due agenti come illustrato nella
figura.
La gerarchia delle classi
Le classi
che implementano i due agenti discendono entrambe
dalla classe base Agent messa a disposizione
da SOMA e che fornisce le funzionalità di base di
cui deve essere dotato un agente mobile.
L'agente SearchAgent
L'agente
cercatore è il cuore dell'applicazione. Esso si
occupa di effettuare la ricerca delle informazioni
sui vari nodi. Per come è stato pensato ha bisogno
di almeno due informazioni per poter operare: la
lista dei nodi che deve visitare ed una struttura
dati che specifichi le proprietà di interesse per
gli oggetti da ricercare. Ricevuti questi dati alla
creazione, l'agente parte alla volta del primo host,
dove prende il file dei dati museali e cera al suo
interno. Ovviamente l'agente deve essere in grado di
"capire" (interpretare) il contenuto di
questo file. L'agente cercatore di per se non è in
grado di farlo ma contiene un oggetto (è a tutti gli
effetti un parser-valutatore) che,
accettando in ingresso la struttura dati contenenti i
requisiti della ricerca, valuta la bontà di ogni
record e restituisce un vettore contenente alcune
informazioni sui record rilevanti ai fini della
ricerca. Questo oggetto a sua volta si avvale dell'aiuto
di un oggetto lexer che scandisce le parole
del file di dati.
Questo
agente porta con se oltre alle due strutture dati
sopra citate anche un vettore contenente i risultati
della ricerca; è da notare che si potrebbe fare a
meno di portare dietro la lista dei nodi da visitare
per le assunzioni fatte (tutti i nodi hanno lo stesso
PNS) ma si è riscontrato che i PNS dei nodi sono in
ordine differente e ciò comporta difficoltà nell'individuare
l'host successivo da visitare. La scelta fatta da noi
è dunque quella di portarsi dietro la tabella ed
eliminare, man mano che si procede, i nodi visitati (ciò
porta ad una maggiore efficienza essendo la lista
sempre più corta).
Per far migrare un agente, SOMA sfrutta la proprietà
di "serializzabilità" che può
essere imposta su un oggetto (gli agenti SOMA sono
oggetti passivi), dunque questa proprietà deve
essere posseduta da queste strutture dati.
Il metodo StartMethod() si occupa di far
migrare l'agente da un nodo all'altro e di far fare
le ricerche. Esso viene lanciato automaticamento dopo
ogni migrazione.Terminato il percorso, l'agente torna
al nodo di partenza (home place) e riprende l'esecuzione
con il metodo HomeMethod() (possibile perche
Soma consente di specificare il metodo con cui
ripartire dopo una migrazione). Il metodo si occupa
di comunicare l'esito della ricerca al committente.
Si pone a questo punto un problema di comunicazione
tra agenti. Soma prevede una interazione "stretta",
possibile solo attraverso condivisione di oggetti, ed
una "lasca", realizzata mediante
scambio di messaggi (mette in piedi un un intero
sisteme di mailbox). Noi abbiamo utilizzato entranbe
le forme di comunicazione. Difatti si usa la
condivisione di un vettore per passare i risultati al
committente ed un messaggio dalla dicitura <SearchAgent_result>
per avvertirlo che il risultato è pronto.
L'oggetto dcXMLSearcher
Giunti su
un nuovo nodo, l'agente cercatore crea una istanza di
questo oggetto e lancia il metodo search()
passandogli la struttura dati contenente i termini
della ricerca. L'oggetto è in grado di scandire e
riconoscere tutti gli elementi del file di dati. Di
fatti riconosce la seguente grammatica :
DCS ::= <dublin-core-simple>
RL </dublin-core-simple>
RL ::= <record-list> LIST </record-list>
LIST::= DCR | DCR LIST
DCR ::= <dc-record> 1 o + tag dublin core
</dc-record>
La tecnica
usata per realizzare il "mini interprete"
è quella dell'analisi ricorsiva discendente.
Il
file di dati
Il file di dati è un file di
metadati DC codificato in XML e presenterà la
seguente struttura :
<?xml version="1.0"
?>
<dublin-core-simple>
<record-list>
<dc-record>
<type>...</type>
<format>...</format>
<title>...</title>
<description>...</description>
<subject>...</subject>
<creator>...</creator>
<contributor>...</contributor>
<publisher>...</publisher>
<date>...</date>
<coverage>...</coverage>
<identifier>...</identifier>
<source>...</source>
<relation>...</relation>
<language>...</language>
<rights>...</rights>
</dc-record>
...... "serie di record
dublin core" .....
</record-list>
</dublin-core-simple>
Per facilitare l'accesso da parte
dell'agente si è pensato di stabilire il nome e la
posizione del file. Il file dati deve dunque essere
posizionato, nel file system locale degli host, nella
directory che contiene le classi degli agenti ovvero
:
" ...\SOMA\agents\xyz.xml
"
Il nome del file è dato invece
dal nome del place seguito dal suffisso "data.xml",
così per esempio per il place "VirtualMuseums
Uffizi" il file si chiamerà "Uffizidata.xml".
Politica
di ricerca
Quello che si è tentato di fare
è realizzare una ricerca che sfruttando le proprietà
descrittive dei metadati DC sia la più aderente
possibile alle richieste di un cliente. Più che all'efficienza,
abbiamo badato all'efficacia del metodo di ricerca.
La valutazione di un record avviene assegnando ad
esso un punteggio che dipende dal numero e dal tipo
di termini che fanno match con le richieste. Il peso
di un termine dipende dall'importanza del tag a cui
è associato. Per semplicità abbiamo supposto di
poter fare le ricerche basandoci su un set limitato
dei tag DC :
Tag |
Descrizione |
Importanza |
Peso |
<type> |
tipo di oggetto |
deve coincidere se viene specificato |
10000
|
<creator> |
autore |
"
|
1000
|
<title> |
titolo |
"
|
100
|
<language> |
lingua originale |
"
|
10
|
<subject> |
soggetti |
basta la presenza di alcuni soggetti |
1
|
Come si vede si da più peso a
quei tag che devono combaciare necessariamente per
poter essere rilevante ai fini della ricerca, nel
senso che se un utente specifica il titolo o l'autore,
un record rilevante deve avere necessariamante quel
titolo o quell'autore (non posso portare all'utente
un titolo o un autore diversi da quello specificato).
La rilevanza o meno di un record si ottiene
confrontando il punteggio ottenuto con una soglia
calcolata in base ai dati forniti dall'utente (con la
stessa tecnica). La proprietà dell'essenzialità
dei tag più importanti è ottenuta variando di un
ordine di grandezza i pesi di ogni differente tipo di
tag. In tal modo se calcolo una soglia di 21010 per
poterla superare devo necessariamente almeno avere 2
type, 1 creator ed 1 language che coincidono con le
richieste dell'utente, altrimenti non riuscirei mai a
totalizzare un punteggio almeno pari alla soglia.
Risultato
della ricerca
Come risultato di una ricerca,
dcXMLSearcher fornisce delle informazioni relative ai
record risultati rilevanti. In particolare le
informazioni relative al record devono essere
significative per la descrizione dell'oggetto a cui
si riferisce il record stesso. Quelle da noi ritenute
tali sono :
Titolo |
il titolo dell'oggetto o
dell'evento descritto |
Descrizione |
breve descrizione dell'oggetto |
Autore |
chi è l'autore della cosa
descritta |
Identificatore |
un identidicatore univoco
per l'oggetto all'interno del dominio |
Come risultato della ricerca su
un nodo, si otterrà una lista di questi elementi (t-d-a-i),
uno per ogni record trovato. Le informazioni relative
ad un record sono almeno 4 considerando che i campi
titolo ed autore potrebbero essere multipli anche se
DC non esclude la ripetizione anche degli altri due.
Problema che resta da risolvere è come legare i
risoltati otteniti al nodo in cui sono stati trovati
(questo per la rintracciabilità delle risorse reali).
Due sono le possibilità:
includere nella
struttura dati del risultato anche il nome
del place su cui sono stati truvati i record
(incapsulare dati e provenienza in una unica
struttura);
seguire le
specifiche Cimi premettendo all'identificatore
locale della risorsa, l'identificatore del
nodo (host o museo) che lo detiene. Es. :
Uffizi : wac Oldenburg
interview 1974-08-25/1974-08-26
La soluzione da noi seguita è la
seconda.