====== eXtraWay Platform Server - eXtraWay Tree Library ======
===== Versioni eXtraWay Tree library =====
**:!: ####Not yet implemented/released#### **
Con l'introduzione del **server** di classe **24** si è fatto un più ampio uso delle **librerie dinamiche**, specialmente in forma di **PlugIn**.
Per accedere ad essi si fa uso di un **comando XML** generico col quale indicare **parametri** di varia natura ottenendo in risposta un corrispondente **XML**.
La ''libtree'' è una di questi **PlugIn** ed è finalizzata a navigare una **gerarchia** di **nodi** che si prestano per diversi scopi.
Di seguito l'elenco delle **versioni** e delle loro **caratteristiche**, ''[[#come_si_configurano_ed_utilizzano_i_nodi|in coda]]'' un breve tutorial.
**N.B** Per quanto concerne la **numerazione** dei **moduli** si rimanda alla ''[[tecnici:prodotti_e_servizi:extraway_platform_server:versioni_extraway_server|descrizione della numerazione adottata per il Server]]''
===== Versioni '1' =====
==== Versione 1.0.0 ====
* Prima versione. Introduce l'uso dei **nodi standard** e dei **nodi template**;
* Adeguato il **comportamento** della **libreria** allo stesso risultato per **alberi** di **nodi template** e **standard**;
* Introdotta la possibilità di filtrare ulteriormente gli **alberi** di tipo **template** impostando una precedente selezione come **restrizione** da applicarsi in analisi spettrale;
* Introdotto il concetto di **frequenza**: Mentre negli **alberi template** di tipo ''voc'' essa è una conseguenza naturale, in quanto derivante dal **vocabolario**, negli **alberi standard** si applica solo là dove sia presente un'apposita ''action'' di tipo ''search''. Indicando nella richiesta del **caricamento** di un nodo la specifica che si desidera la **frequenza**, essa verrà tornata nell'**attributo** supplementare ''frequency'' ;
* Corretto trattamento dei **caratteri accentati** o **non validi** e dei **vocabolari double** nei **nodi** di **alberi template** introducendo la **codifica Base 64** dove necessaria ed un più puntale trattamento dei vocabolari double.
===== Come si configurano ed utilizzano i Nodi =====
Tutto il **sistema** degli **alberi** di **navigazione** si basa sul concetto di **nodo**.
Ogni **nodo** può rappresentare un **punto intermedio**, appunto nodo, ovvero un estremità del nostro albero, quindi una **foglia**.
Questi **nodi** altro non sono che **unità informative** che devono convivere nell'ambito dello stesso **archivio** con le unità informative che realmente lo caratterizzano.
Questo comporta che il **file** di **configurazione** dell'**archivio**, per poter operare correttamente con gli **alberi** di **nodi**, deve prevedere la configurazione di questa particolare **unità informativa**, come nell'**esempio** seguente:
Esistono due **tipologie** di **nodi**, quelli **statici** e quelli **dinamici**, o **template**.
Se pure nulla escluda che si possano combinare in vario modo, di fatto essi sono sino ad ora stati realizzati solo distintamente, vale a dire **alberi** di soli **nodi statici** ed **alberi** di soli **nodi dinamici**.
Introduciamo innanzitutto il concetto di **nodo**. Esso è rappresentato da un'**unità informativa** di tipo ''xwNodeRecord'' caratterizzata da un ''recordId'' **univoco** e da una serie di **nodi** al suo interno. Ciascuno di essi indicherà se conduce ad altri nodi o se si tratta di un **elemento terminale**, una **foglia**.
Il '' recordId'' di un **albero** si compone sempre di una **label** che lo identifica e da un **nodo principale** riconosciuto come ''root''. Da quel momento l'**identificazione** di tutti i successivi **nodi** dello stesso **albero** deve avere in comune solo la **radice** del ''recordId''. Ogni ''recordId'' è suddiviso quindi in due **parti**, **radice** ed **estensione**, separate dal **carattere** '':''
Prendiamo ad **esempio** un **albero** di **classificazione**:
[labelFull]="classif.0.*"
[labelFull]="classif.1.*"
[labelFull]="classif.2.*"
[labelFull]="classif.3.*"
[labelFull]="classif.4.*"
[labelFull]="classif.5.*"
[labelFull]="classif.6.*"
[labelFull]="classif.7.*"
[labelFull]="classif.8.*"
Come si può notare il ''recordId'' di questo **nodo** è identificato da una **label principale**, ''MainClassif'' e dal **suffisso** '':root'' ad identificare che si tratta del **nodo principale** dell'**albero**.
Essi contiene uno o più **elementi** ''node''. Vediamone uno nel **dettaglio**:
[labelFull]="classif.0.*"
L'**elemento** ''node'' deve sempre avere un **attributo** ''type'' che indichi la sua **natura**. Il **valore** di questo **attributo** può essere:
^ list | Indica che il nodo così identificato punta ad un ulteriore ''xwNodeRecord'' il cui ''recordId'' corrisponde al ''nodeId''|
^ node | Indica che si tratta di una foglia, non destinata a condurre altrove|
^ template | Indica che il nodo in esame è in forma di template e che quindi segue un comportamento del tutto differente che sarà spiegato in seguito|
Il ''node'' così identificato ha normalmente un ''nodeId''((per quanto esso sia realmente necessario solo se il nodo è di tipo ''list'')). Il **valore** di tale ''nodeId'' segue i **criteri** del ''recordId'' già visto ed impone, di fatto, solo la presenza della stessa **radice** del ''recordId'' cui si appartiene.
Analogamente può avere, e normalmente ha, un **attributo** ''label'' finalizzato alla sua **rappresentazione esteriore** in sede applicativa.
Al ''node'' può essere associata un'**azione**. Attualmente la sola **azione** prevista (indicata dall'attributo ''type'') è l'azione di **ricerca**, codificata con il **valore** ''search''. L'**elemento** ''action'' a ciò preposto conterrà quindi l'**espressione** di **ricerca** che si intende utilizzare.
In **condizioni normali** tutti i **nodi foglia** hanno un'azione associata. Essa si associa sovente anche a **nodi intermedi** ma, mentre il primo caso rientra nella normalità, la presenza di un'**azione** in un nodo intermedio dipende totalmente dalle **esigenze** applicative e dalla natura dell'**albero** di **nodi** che si sta costituendo.
==== Un albero di nodi statici ====
Secondo l'**esempio** precedente, vediamo il **nodo puntato** dal primo dei nodi citati nella **radice** dell'**albero**:
[labelFull]="classif.0.0.*"
[labelFull]="classif.0.1.*"
[labelFull]="classif.0.2.*"
[labelFull]="classif.0.3.*"
[labelFull]="classif.0.4.*"
[labelFull]="classif.0.5.*"
[labelFull]="classif.0.6.*"
[labelFull]="classif.0.7.*"
[labelFull]="classif.0.8.*"
[labelFull]="classif.0.9.*"
ed infine il **nodo** di **livello** ulteriormente **inferiore**, sempre riferito al primo dei **nodi** qui citati:
[labelFull]="classif.0.0.1.*"
[labelFull]="classif.0.0.2.*"
[labelFull]="classif.0.0.3.*"
[labelFull]="classif.0.0.4.*"
[labelFull]="classif.0.0.5.*"
[labelFull]="classif.0.0.6.*"
[labelFull]="classif.0.0.7.*"
[labelFull]="classif.0.0.8.*"
[labelFull]="classif.0.0.9.*"
In questo ultimo caso risulterà evidente come alcuni dei **nodi citati** siano ''list'' ed altri siano invece ''node'' in quanto non prevedono ulteriori **livelli** d'**alberatura**.
==== Un albero di nodi template ====
Visto l'**esempio** di cui al caso precedente, vediamo ora come si componga e comporti un **albero** di **nodi** di tipo **template**.
Se è evidente che un **albero** composto di numerosi rami avrà un diverso **record** ''xwNodeRecord'' per ciascun **ramo** da percorrere, nel caso dell'albero di tipo **template** si avrà uno ed un solo **nodo auto-consistente**.
Vediamo come si dichiara un **simile nodo**:
Innanzitutto l'**albero** di tipo **template** ha un **attributo omonimo** che dichiara la modalità secondo la quale il suo **contenuto** dev'essere interpretato. Nella fattispecie esiste attualmente solo la **modalità** ''voc'' che comporta un accesso ai **vocabolari** potenziato dall'analisi spettrale.
Ogni ulteriore **nodo** dichiara, con un **attributo** ''voc'', quale **vocabolario** dell'**archivio** debba essere interessato.
|**N.B**: Il tipo di **nodo** ritornato dalle **funzioni** della ''libtree'' quando si accede ad un nodo di questa fatta è del tutto analogo a quelli appena visti negli **alberi statici**, con la differenza che il ciascun **nodo** viene prodotto automaticamente e conduce al **ramo** sottostante che rappresenta, appunto, l'**analisi spettrale** desiderata.|
Il nostro **esempio** fa accesso al **vocabolario** dell'anno e mostrerà quindi un **nodo principale** con tanti **nodi** di tipo ''list'' quante sono le diverse **chiavi** del **vocabolario** dell'anno, nel nostro caso, quanti articoli saranno stati pubblicati in un determinato anno con relativa **cardinalità**.
Per ciascuno di questi **nodi**, percorrendo il legame al **nodo** successivo tramite il ''nodeId'', avremo un'**analisi spettrale** sul **vocabolario** del numero della rivista.
Il **nodo** prodotto avrà tanti nodi di tipo ''list'' quanti saranno i **numeri emessi** nell'**anno** prescelto. Per ciascuno di essi verrà indicato il **numero** di **articoli pubblicati** quell'anno sulla **rivista** avente quel numero.
Compiendo un ulteriore passo avanti, ovvero richiedendo l'**analisi** della **rubrica**, avremo un nuovo **record** che conterrà **nodi** questa volta di tipo ''node'', in quanto **nodi foglia**. Per ciascuno di essi verrà riportata la **cardinalità** di quanti **articoli** (pubblicati quell'anno nella rivista con quel numero) appartengano ad una data **rubrica**.
Quale che sia il **livello** del **nodo**, a ciascuno di essi viene associato d'ufficio un'**azione** atta a selezionare tutti i **record** che il **nodo** stesso descrive ed enumera.
===== Composizione del comando =====
I **comandi** per questo **Plug-In** si rifanno alle ''[[tecnici:prodotti_e_servizi:extraway_platform_server:dettaglio_comandi_server_extraway#comando_verso_plugin|regole standard per questo tipo di comandi XML]]''
Unifichiamo quindi nel concetto di **parametro** un **valore** che può essere espresso sia come **attributo** che come **elemento**.
Vediamo comunque che **comandi** sono **disponibili** e quali sono i loro **modificatori**.
^ Comando ^ Dettagli ^
^ XTree.treeList | Richiede che vengano elencati gli alberi disponibili, indipendentemente dal fatto che essi siano statici o dinamici((template)).\\ Prevede un parametro ''arc'' che indichi il nome logico dell'archivio per il quale si richiede tale elencazione.\\
|
^ XTree.loadNodeRecord | Richiede che venga caricato un particolare nodo dell'albero indicato. L'indicazione è insita nel parametro ''id'' e comporta il caricamento del nodo avente corrispondente ''recordId''. Nel momento in cui si accede al primo nodo di un albero, del quale si conosce la denominazione tramite il precedente comando ''XTree.treeList'', si deve accodare all'etichetta che identifica l'albero il suffisso '':root''.\\ In ogni altro caso, vale a dire caricando nodi successivi dell'albero dal loro nodo padre, il ''nodeId'' ricevuto sarà sufficiente per il caricamento.\\ Richiede anche in questo caso l'indicazione del parametro ''arc''.\\
\\ Esplicitando anche il parametro ''frequency'' con valore positivo((Si intendono valori positivi i valori quali ''yes'', ''on'', ''true'', ''si'' e ''1''.)) in presenza di nodi aventi un'appropriata action associata si avrà in risposta anche un attributo ''frequency'' opportunamente valorizzato, in grado di farci scegliere se mostrare o meno il nodo in esame.\\
true
|
^ XTree.executeNode | Richiede gli stessi parametri di cui al comando precedente, quindi l'indicazione dell'archivio nel parametro ''arc'' e l'indicazione del nodo di cui compiere l'azione nel parametro ''id''.\\ Riferendosi alla ''action'' associata ad un nodo, l' ''id'' che si deve indicare si riferisce al ''nodeId'' dell'elemento ''node'' e non al ''recordId'' del record.\\
|