Skip to topic | Skip to bottom
Home
TechWeb07
TechWeb07.WDraft7DSr1.5 - 01 Jun 2007 - 16:40 - AlessandroCaponitopic end

Start of topic | Skip to actions
-- AlessandroCaponi - 30 May 2007

LTGB: Long Tail Guide Book

Data Source

Specifiche di protocollo

Versione 0.9.07 30 Maggio 2007

Questa versione: WDraft7DS
Ultima versione: WDraft7DS
Versione Precedente:WDraft6DS
Autori: FabioVitali, AngeloDiIorio, SilviaDuca, AntonioFeliziani, LucaFurini, LTGB DataSource Working Group

NOTA: VI CHIEDO CORTESEMENTE DI LEGGERE SEMPRE IL PARAGRAFO "NOTE GENERALI" E DI CONTROLLARE EVENTUALI BUG e/o FIX DI CUI SI PARLA NELLA PAGINA DEL WorkingGroupACDS.








Abstract

I protocolli ADS (Application Data Source) e ADF (Application Data Formatter) consentono ad una applicazione Web (lato server o lato client) di interrogare fonti informative per ottenere dati e di richiedere specifiche formattazioni di tali dati a moduli esterni per ottenere documenti riproducibili da visualizzatori. Consentono quindi di definire una netta distinzione fra la fase di reperimento delle informazioni da quella di gestione di opportuni layout per una loro adeguata presentazione.

Essi nascono all'interno del progetto LTGB, il cui obiettivo è realizzare portali per la creazione, pubblicazione e personalizzazione di guide turistiche on-demand secondo il modello "Long Tail". Il portale adotta un'architettura a 4 livelli, in cui un modulo chiamato DataSource fornisce i dati, uno chiamato DataFormatter trasforma dati "grezzi" (privi di indicazioni presentazionali) in documenti HTML, PDF, etc. e i moduli ApplicationController? e ApplicationLogic? sono responsabili della logica dell'applicazione, dell'organizzazione dei contenuti e della comunicazione tra le varie parti del sistema.

Questo documento descrive le specifiche del protocollo ADS di riferimento da adottare nella comunicazione fra l'ApplicationController (che sia uno script lato server o uno script lato client) e il modulo Data Source. In questo documento sono quindi riportati sia il formato delle richieste da inoltrare verso il modulo DS, sia il formato delle risposte che possono essere ricevute, sia il protocollo di trasporto per l’invio di richieste/risposte.

Stato di questo documento

Questo documento è stato redatto da Fabio Vitali, Angelo Di Iorio, Silvia Duca, Antonio Feliziani, Luca Furini, LTGB DataSource Working Group.

Deve essere utilizzato come materiale di riferimento per il progetto LTGB per garantire l’interoperabilità fra i gruppi. Questo documento è la versione 0.9.07 del protocollo ed è soggetto a modifiche da parte dei working group organizzati secondo le regole del W3C (http://www.w3.org/Consortium/Process/). I WG potranno emettere i documenti di riferimento aggiornati, numerati e versionati, che verranno usati per le specifiche di interoperabilità.

Sommario

Note Generali

Questa parte può essere soggetta a modifica per risolvere eventuali ambiguita e ricordare determinate regole da seguire per ottenere una corretta interoperabilità.

  • E' necessario utilizzare UTF-8 per la codifica dei caratteri nei vostri XML. Comportamenti diversi potrebbero portare ad una non corretta visualizzazione dei contenuti.

  • E' necessario utilizzare il WSDL così com'è per ciò che riguarda il nome e la tipologia dei metodi e dei parametri. E' necessario modificare l'URI del servizio con quello del proprio.

  • File necessari della grammatica:

  • Ontologia

1. Introduzione

Lo scopo del protocollo LTGB è di permettere ad un’applicazione Web

  • di interrogare fonti informative (d’ora in poi Data Source o DS) per ottenere dati (privi di indicazioni presentazionali) e di riorganizzarli in contenuti nuovi e rielaborati;

  • richiedere modifiche o inserimento di nuovi dati.

Nel seguito si indicherà con ADS il protocollo instaurato tra l’applicazione A e la fonte informativa DS.

Tutte le comunicazioni avvengono su canali HTTP, e il formato del documento generato dal DS e richiesto in input dal DF sono variazioni dello stesso formato XML. Il formato XML contiene una parte comune ai due protocolli, alcune parti specifiche, e la possibilità di personalizzare il formato in parte. Inoltre questi documenti XML sono da considerarsi "impacchettati" in una richiesta/risposta SOAP.Questo documento non descrive la sintassi SOAP, ma fornisce la grammatica WSDL alla quale il protocollo deve fare riferimento, perciò qualunque documento relativo alla comunicazione tra ApplicationController? e DS deve utilizzare tecnologie legate ai WebServices?. Tutti i frammenti XML citati in questo documento, quindi, rappresentano il payload di altrettante richieste/risposte SOAP.

Nel capitolo 2 viene dettagliato il protocollo di comunicazione. Il capitolo 3 descrive le richieste al DS mentre il capitolo 4 contiene dettagli sui vari tipi di contenuti XML generati o richiesti dal Data Source in relazione ai possibili servizi. Il capitolo 7 descrive l'ontologia di riferimento usata per classificare e specificare le informazioni contenute nei DS. Il capitolo 8 specifica come debba essere fatta la registrazione dei propri moduli in un elenco condiviso e pubblicamente accessibile.

2. Il protocollo di comunicazione

Per poter comunicare con i Data Source l’applicazione fa riferimento ad alcuni formati specifici per le richieste/risposte. I formati di richiesta e risposta differiscono nella comunicazione con un DS o un DF.

2.1 Il Catalogo

Tale richiesta è realizzata con una GET HTTP di un documento con URL stabilito e reso pubblico da ogni DS al momento della registrazione (nella sezione 8 sono riportate le regole per la registrazione dei data-source). Si assuma ad esempio che nel wiki sia registrato il seguente DS:

NOME CATALOGO XML CATALOGO HTML
TWDataSource http://tw.web.cs.unibo.it/TWds.xml http://tw.web.cs.unibo.it/TWds.html

L’URL da utilizzare per la richiesta è appunto:

http://tw.web.cs.unibo.it/TWds.xml

Il DS risponde con una auto-descrizione espressa in sintassi XML secondo la seguente grammatica:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:sch="http://purl.oclc.org/dsdl/schematron" xmlns="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkingGroupACDS" xmlns:df="http://vitali.web.cs.unibo.it/view/TechWeb07" targetNamespace="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkingGroupACDS">
   <!-- Inclusione degli elementi base della grammatica ( estensione di quelli comuni con il DataSource) -->
   
   <xs:import namespace="http://vitali.web.cs.unibo.it/view/TechWeb07" schemaLocation="testo.xsd"/>

   <xs:element name="catalogoSource">
      <xs:complexType>
         <xs:sequence>
            <xs:element name="nome" type="xs:string"/>
            <xs:element name="tipo" type="tipoDs_t"/>
            <xs:element name="descrizione" type="df:testo_t"/>
            <xs:element name="urlWsdl" type="xs:anyURI"/>
         </xs:sequence>
      </xs:complexType>
   </xs:element>
<xs:simpleType name="tipoDs_t">
<xs:restriction base="xs:string">
<xs:enumeration value="intermediary"/>
<xs:enumeration value="storage"/>
</xs:restriction>
</xs:simpleType>

</xs:schema>

Si noti che il catalogo può essere un documento statico e che è necessario fornire anche una versione human-readable (HTML) dello stesso.

Il ruolo del catalogo di un DS è fondamentale: per ogni richiesta l'AC deve consultare il catalogo del DS e recuperare l'URL completo del WSDL per poter accedere ai servizi del rispettivo DS. Sebbene sia possibile implementare meccanismi di caching, è obbligatorio recuperare dinamicamente l'indirizzo dello script del DS dal catalogo.

2.2 Applicazione <-> Data Source

Una volta ottenuto il catalogo e di conseguenza l'URI del WSDL, l’AC comunica con i DS disponibili attraverso connessioni HTTP. Le richieste sono tutte SOAP, sono di tipo request/response, e si intendono come chiamata di procedura remota.

Le richieste che possono essere inoltrate verso un DS sono di 7 tipi:

  • Richiesta di un elenco ragionato di dati presenti del DS. La risposta sarà un elenco di schede, in formato XML, costruito in base ai parametri specificati nella richiesta. E' possibile ad esempio richiedere un elenco di PuntiDiInteresse, ma anche un elenco di Itinerari o un elenco di Guide o collezioni miste di questi elementi. E' possibile inoltre specificare criteri di selezione per la costruzione di tali elenchi. La grammatica dei parametri e dell'elenco verra descritta nel capitolo 3.
  • Richiesta di una scheda, ossia l'insieme di tutte le informazioni associabili ad un documento. Esistono diversi tipi di scheda:
    • PuntoDiInteresse (vedi sezione 3). Un PuntoDiInteresse è un qualunque luogo che può essere descritto, analizzato, suggerito in una guida o in una sua sottoparte (itinerario).
    • Itinerario (vedi sezione 3). Un itinerario è una sequenza ordinata di PuntiDiInteresse, identificata da un ID (e/o da un nome), e corredata da una descrizione testuale, arricchita con altre informazioni.
    • Guida (vedi sezione 3). Una guida è una sequenza di Itinerari, arricchita da ulteriori informazioni per la pubblicazione come prezzo e copertina.
  • Richiesta di inserimento di una nuova scheda.Come specificato esistono 3 tipi di scheda, che possono essere inserite ex-novo all'interno del DS. La risposta sarà la conferma che conterrà l'id della nuova scheda.
  • Richiesta di una lista di commenti relativi ad una scheda. Devono anche essere forniti il numero di commenti che si intendono avere e il punto di partenza dal quale iniziare a prendere commenti.
  • Richiesta di inserimento di una nuovo commento. Nel caso in cui fosse il primo commento dovrà essere generata la radice "commenti", altrimenti verrà inserito nell'XML già esistente. La risposta sarà la conferma che conterrà l'idref della scheda a cui i commenti si riferiscono.
  • Richiesta di una guida completa. Nel caso sia utile inserire una guida completa, specialmente nel caso di formattazioni pdf. Non contiene riferimenti agli itinerari, ma contiene l'intera struttura di itinerari e punti di interesse.
  • Richiesta dei parametri extra supportati. Un DS puo' supportare parametri extra, non obbligatori ovviamente. Esiste un apposito metodo ed una apposita grammatica per gestire questo tipo di parametri.
Di seguito viene descritto il WSDL relativo al servizio di comunicazione con il DS:


<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:ds="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkinGroupACDS" targetNamespace="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkinGroupACDS">
   <wsdl:types/>
   <wsdl:message name="DsService_richiedi_elenco">
      <wsdl:part name="param" type="xs:string"/>
      <wsdl:part name="start" type="xs:integer"/>
      <wsdl:part name="offset" type="xs:integer"/>
   <!-- start e' l'indice del primo item da recuperare, offset il numero di item che si vogliono ricevere -->

   </wsdl:message>
   <wsdl:message name="DsService_richiedi_elencoResponse">
      <wsdl:part name="elenco" type="xs:string"/>
   </wsdl:message>
<!-- richiedi extra ritorna i parametri extra disponibili e supportati per le query da un dato datasource, oltre quelli obbligatori. Vedere la grammatica per ulteriori informazioni -->
<wsdl:message name="DsService_richiedi_extra">
   </wsdl:message>
<wsdl:message name="DsService_richiedi_extraResponse">
      <wsdl:part name="supported" type="xs:string"/>
   </wsdl:message>
   
   <wsdl:message name="DsService_richiedi_scheda">
      <wsdl:part name="id" type="xs:ID"/>
   </wsdl:message>
   <wsdl:message name="DsService_richiedi_schedaResponse">
      <wsdl:part name="scheda" type="xs:string"/>
   </wsdl:message>
   <wsdl:message name="DsService_richiedi_guida_completa">
      <wsdl:part name="id" type="xs:ID"/>
   </wsdl:message>
   <wsdl:message name="DsService_richiedi_guida_completaResponse">
      <wsdl:part name="guida_completa" type="xs:string"/>
   </wsdl:message>
   <wsdl:message name="DsService_inserisci_scheda">
      <wsdl:part name="scheda" type="xs:string"/>
      <!-- la scheda viene sempre inserita nel ds (storage) del gruppo -->
   </wsdl:message>
   <wsdl:message name="DsService_inserisci_schedaResponse">
      <wsdl:part name="id" type="xs:ID"/>
   </wsdl:message>
   <wsdl:message name="DsService_inserisci_commento">
      <wsdl:part name="commenti" type="xs:string"/> <!-- cambierei commenti in commento, e' singolo -->
      <wsdl:part name="idref" type="xs:ID"/>
      <!-- idref e' l'ID della scheda alla quale il commento e' riferito -->
      <!-- il commento viene sempre inserito nel ds (storage) del gruppo -->
   </wsdl:message>
   <wsdl:message name="DsService_inserisci_commentoResponse">
      <wsdl:part name="idref" type="xs:ID"/>
   </wsdl:message>
   <wsdl:message name="DsService_richiedi_commento">
      <wsdl:part name="start" type="xs:integer"/>
      <wsdl:part name="offset" type="xs:integer"/>
      <!-- i commenti vanno memorizzati dal piu' recente al meno recente -->
      <!-- start e' l'indice del primo commento da recuperare, offset il numero di commenti che si vogliono ricevere -->
      <wsdl:part name="idref" type="xs:ID"/>
      <!-- idref e' l'ID della scheda alla quale i commenti son riferiti -->
   </wsdl:message>
   <wsdl:message name="DsService_richiedi_commentoResponse">
      <wsdl:part name="commenti" type="xs:string"/>
   </wsdl:message>

   <wsdl:message name="DsService_Fault">
      <wsdl:part name="id" type="xs:integer"/>
   </wsdl:message>
   <wsdl:portType name="DsServicePort">
      <wsdl:operation name="richiedi_elenco">
         <wsdl:input message="ds:DsService_richiedi_elenco"/>
         <wsdl:output message="ds:DsService_richiedi_elencoResponse"/>
         <wsdl:fault name="error" message="ds:DsService_Fault"/>
      </wsdl:operation>
         <wsdl:operation name="richiedi_parametri_extra">
         <wsdl:input message="ds:DsService_richiedi_extra"/>
         <wsdl:output message="ds:DsService_richiedi_extraResponse"/>
         <wsdl:fault name="error" message="ds:DsService_Fault"/>
      </wsdl:operation>
      <wsdl:operation name="richiedi_scheda">
         <wsdl:input message="ds:DsService_richiedi_scheda"/>
         <wsdl:output message="ds:DsService_richiedi_schedaResponse"/>
         <wsdl:fault name="error" message="ds:DsService_Fault"/>
      </wsdl:operation>
      <wsdl:operation name="richiedi_guida_completa">
         <wsdl:input message="ds:DsService_richiedi_guida_completa"/>
         <wsdl:output message="ds:DsService_richiedi_guida_completaResponse"/>
         <wsdl:fault name="error" message="ds:DsService_Fault"/>
      </wsdl:operation>
      <wsdl:operation name="inserisci_scheda">
         <wsdl:input message="ds:DsService_inserisci_scheda"/>
         <wsdl:output message="ds:DsService_inserisci_schedaResponse"/>
         <wsdl:fault name="error" message="ds:DsService_Fault"/>
      </wsdl:operation>
      <wsdl:operation name="inserisci_commento">
         <wsdl:input message="ds:DsService_inserisci_commento"/>
         <wsdl:output message="ds:DsService_inserisci_commentoResponse"/>
         <wsdl:fault name="error" message="ds:DsService_Fault"/>
      </wsdl:operation>
      <wsdl:operation name="richiedi_commento">
         <wsdl:input message="ds:DsService_richiedi_commento"/>
         <wsdl:output message="ds:DsService_richiedi_commentoResponse"/>
         <wsdl:fault name="error" message="ds:DsService_Fault"/>
      </wsdl:operation>
      
   </wsdl:portType>
   <wsdl:binding name="DsServiceBinding" type="ds:DsServicePort">
      <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
      <!-- lo style ?pc perch? una remote procedure call -->
      <wsdl:operation name="richiedi_elenco">
         <soap:operation soapAction="http://tw.web.cs.unibo.it/DsService#richiedi_elenco"/>
         <wsdl:fault name="error"/>
         <wsdl:input>
            <soap:body use="literal" namespace="http://tw.web.cs.unibo.it/DsService"/>
         </wsdl:input>
         <wsdl:output>
            <soap:body use="literal"/>
         </wsdl:output>
      </wsdl:operation>
         <wsdl:operation name="richiedi_parametri_extra">
         <soap:operation soapAction="http://tw.web.cs.unibo.it/DsService#richiedi_elenco"/>
         <wsdl:fault name="error"/>
         <wsdl:input>
            <soap:body use="literal" namespace="http://tw.web.cs.unibo.it/DsService"/>
         </wsdl:input>
         <wsdl:output>
            <soap:body use="literal"/>
         </wsdl:output>
      </wsdl:operation>
      <wsdl:operation name="richiedi_scheda">
         <soap:operation soapAction="http://tw.web.cs.unibo.it/DsService#richiedi_scheda"/>
         <wsdl:fault name="error"/>
         <wsdl:input>
            <soap:body use="literal" namespace="http://tw.web.cs.unibo.it/DsService"/>
         </wsdl:input>
         <wsdl:output>
            <soap:body use="literal"/>
         </wsdl:output>
      </wsdl:operation>
      <wsdl:operation name="richiedi_guida_completa">
         <soap:operation soapAction="http://tw.web.cs.unibo.it/DsService#richiedi_guida_completa"/>
         <wsdl:fault name="error"/>
         <wsdl:input>
            <soap:body use="literal" namespace="http://tw.web.cs.unibo.it/DsService"/>
         </wsdl:input>
         <wsdl:output>
            <soap:body use="literal"/>
         </wsdl:output>
      </wsdl:operation>
      <wsdl:operation name="inserisci_scheda">
         <soap:operation soapAction="http://tw.web.cs.unibo.it/DsService#inserisci_scheda"/>
         <wsdl:fault name="error"/>
         <wsdl:input>
            <soap:body use="literal" namespace="http://tw.web.cs.unibo.it/DsService"/>
         </wsdl:input>
         <wsdl:output>
            <soap:body use="literal"/>
         </wsdl:output>
      </wsdl:operation>
      <wsdl:operation name="inserisci_commento">
         <soap:operation soapAction="http://tw.web.cs.unibo.it/DsService#inserisci_commento"/>
         <wsdl:fault name="error"/>
         <wsdl:input>
            <soap:body use="literal" namespace="http://tw.web.cs.unibo.it/DsService"/>
         </wsdl:input>
         <wsdl:output>
            <soap:body use="literal"/>
         </wsdl:output>
      </wsdl:operation>
      <wsdl:operation name="richiedi_commento">
         <soap:operation soapAction="http://tw.web.cs.unibo.it/DsService#richiedi_commento"/>
         <wsdl:fault name="error"/>
         <wsdl:input>
            <soap:body use="literal" namespace="http://tw.web.cs.unibo.it/DsService"/>
         </wsdl:input>
         <wsdl:output>
            <soap:body use="literal"/>
         </wsdl:output>
      </wsdl:operation>
   </wsdl:binding>
   <wsdl:service name="DsService">
      <wsdl:port name="DsServicePortType" binding="ds:DsServiceBinding">
         <soap:address location="http://ltw0716.web.cs.unibo.it/cgi-bin/data_source/DS.php5"/>
         <!-- ogni gruppo definirà la locazione del proprio wsdl -->
      </wsdl:port>
   </wsdl:service>
</wsdl:definitions>


3. Input e Output del Data Source

Il data source (o DS) è un modulo indipendente (cioè scollegato da qualunque altra applicazione) e passivo (cioè non ha comportamenti proattivi, ma risponde soltanto ad esplicita richiesta) che fornisce contenuti in formato XML

I data source possono essere data storage (cioè posseggono effettivamente i dati che sono in grado di restituire) oppure data intermediary (cioè estraggono i dati da qualche fonte su Internet e la restituiscono nel formato richiesto).

3.1 Elenco e Parametri di Ricerca

L'elenco è una collezione di schede, in particolare di riferimenti a PuntiDiInteresse, Itinerari e Guide. Si noti che, a differenza di questi elementi che sono interamente memorizzati nel DS, un elenco è una struttura dinamica, costruita on-the-fly dal DS sulla base dei parametri forniti in input. Meccanismi di caching possono essere comunque implementati per migliorare le prestazioni del sistema.

Prima di procedere con la richiesta di un elenco e' possibile attraverso la richiesta richiedi_parametri_extra ottenere i parametri di ricerca supportati da un determinato DS oltre quelli obbligatori, la grammatica dei parametri extra, che devono essere ritornati dal metodo, e' la seguente:

<xs:element name="supported" type="supportedQueryExtension"/>
<xs:complexType name="supportedQueryExtension">      
<xs:annotation>         
<xs:documentation> Risposta del DS al metodo supportedQueryExtension che 
chiede al DS quali sono le estensioni di ricerca sulle schede supportate</xs:documentation>   
</xs:annotation>      
<xs:sequence>         
<xs:element name="extension" type="percorso_t" minOccurs="0" maxOccurs="unbounded"/>   
</xs:sequence>   
</xs:complexType>

<xs:simpleType name="percorso_t">      
<xs:restriction base="xs:string">
         <xs:pattern value="/scheda(/[a-zA-Z]+)+"/>
   </xs:restriction>
</xs:simpleType>

Nell'elemento percorso va un Xpath sulla scheda, che descrive l'elemento scheda gestito. Un esempio potrebbe essere /scheda/info/modificatoIl.

Una richiesta di tipo elenco è realizzata con una richiesta SOAP di tipo richiedi_elenco; si ricorda che è necessario fornire una stringa contenente i parametri di ricerca. La stringa sarà in formato XML e dovrà rispondere alla seguente grammatica XML-Schema + Schematron:

        L'elemento radice dell'elenco. E` l'elemento necessario per il corretto
         invio di informazioni di tipo "elenco" tramite SOAP.
         </xs:documentation>
      </xs:annotation>
   </xs:element>
   <xs:complexType name="parametri_ricerca_t">
      <xs:annotation>
         <xs:appinfo>
            <sch:pattern name="coconstrain_query_param">
               <sch:rule context="param">
                  <sch:assert test="not(./raggio) Or (./raggio And ./GPS)">
                     L'elemento raggio necessita l'elemento GPS per essere valido!
                  </sch:assert>
               </sch:rule>
            </sch:pattern>
         </xs:appinfo>
      </xs:annotation>
      <xs:sequence>
         <xs:element name="tipo" type="ontologia_t" minOccurs="0"/>
         <xs:element name="GPS" type="GPS_t" minOccurs="0"/>
         <xs:element name="raggio" type="raggio_t" minOccurs="0"/>
         <xs:element name="nome" type="xs:string" minOccurs="0"/>
         <xs:element name="keyword" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
    <xs:element name="extra" type="extra_t" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
   </xs:complexType>
</xs:schema>

Il parametro extra e' definito nel seguente modo:


   <xs:complexType name="extra_t">
      <xs:simpleContent>
         <xs:extension base="xs:string">
         <xs:attribute name="percorso" type="percorso_t" use="required" />
            <xs:attribute name="criterio" type="criterio_t" use="optional" default="="/>
      </xs:extension>
      </xs:simpleContent>
   </xs:complexType>

   <xs:simpleType name="criterio_t">
      <xs:restriction base="xs:string">
         <xs:enumeration value="&lt;"/> <!-- minore -->
         <xs:enumeration value="&gt;"/> <!-- maggiore -->
         <xs:enumeration value="&gt;="/> <!-- minore o uguale -->
         <xs:enumeration value="&lt;="/> <!-- maggiore o uguale -->
         <xs:enumeration value="="/>
         <xs:enumeration value="in"/> <!-- match con una sottostringa -->
      </xs:restriction>
   </xs:simpleType>
   
   <xs:simpleType name="percorso_t">
      <xs:restriction base="xs:string">
         <xs:pattern value="/scheda(/[a-zA-Z]+)+"/>
      </xs:restriction>
   </xs:simpleType>

Il contenuto dell’elenco è appunto parametrizzato: i parametri di costruzione dell’elenco vengono specificati al momento della richiesta da parte del AC attraverso una query XML inviata tramite richiesta SOAP e questi parametri devono essere fra quelli supportati. Si ricorda che TUTTI i parametri descritti qui sopra, tranne extra devono essere supportati.Le keywords che ogni DataSource deve supportare, in riferimento alla grammatica delle schede, sono: nome, coordinateGPS, Raggio, Keywords, Tipo. Si ricorda che , come descritto nella grammatica, non può essere richiesto un elenco per raggio senza aver fornito anche le coordinate GPS. Nel caso di parametri extra (opzionali) e' necessario inserire il criterio: questo significa inserire la modalita' di ricerca su quello specifico parametro. Ad esempio se si tratta di un prezzo e' possibile dire se si vuole che sia minore o maggiore di 10 euro. Se si tratta di una stringa e' possibile, ad esempio, dire se sia uguale o che sia contenuta nella stringa che deve fare match.

Ad esempio una richiesta ('richiedi_elenco',$parametri) con parametri:

<ds:param xsi:schemaLocation="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkinGroupACDS parametri.xsd" xmlns:ds="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkinGroupACDS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <tipo>PdI</tipo>
   <GPS>
      <latitudine>-30.000000</latitudine>
      <longitudine>80.000000</longitudine>
   </GPS>
</ds:param>

dovrebbe ritornare la lista contenente tutti i punti di interesse di coordinate -30 e 80.

In tutte le ricerche è ammesso l'utilizzo di wildcard (ossia simbolo *, per indicare qualunque valore non esplicito). Il simbolo di * indica una qualunque sequenza (anche vuota) di caratteri, secondo la sintassi di espressioni regolari. Quindi se cercherò il PdI? con il nome uguale a par* mi verrà restituito ad esempio Parigi. Dovranno essere supportati obbligatoriamente solo l'utilizzo di wildcard alla fine oppure, all'inizio e alla fine di una stringa, ad esempio dovranno essere supportati situazioni del tipo par* oppure par. Questo perche' Xpath 1.0 non fornisce corretto supporto ad altre operazioni di questo tipo.

Esiste inoltre una classificazione predefinita dei vari tipi di PuntiDiInteresse, organizzata in categorie e sottocategorie, ed un insieme di informazioni correlate che definiscono i meccanismi di organizzazione e ricerca sulla knowledge-base. La sezione 7 descrive questa ontologia. Comunque un esempio può essere che se io cerco "Locale" mi verranno forniti probabilmente sia "Ristoranti" sia "Pub".

Il DS restituisce alla query un documento composto da un elemento radice elenco che contiene tanti elementi item tutti uguali. L’elemento elenco riporta nell’elemento figlio param la query che è stata effettuata per generare l’elenco stesso.

Ogni elemento item contiene una sequenza di elementi tratti dal vocabolario LTGB e utili per la visualizzazione dell’elenco. La scelta degli effettivi elementi utilizzati nella voce è definita dalla grammatica del DS. L’attributo idref contiene un identificativo utile per richiedere al DS la scheda completa associata alla voce in elenco.

Ad esempio, il seguente è un elenco di PuntiDiInteresse:

<ds:elenco xsi:schemaLocation="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkinGroupACDS elenco.xsd" xmlns:ds="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkinGroupACDS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <param>
      <tipo>PdI</tipo>
      
   </param>
   <item idref="a001">
      <nome>Le strade di Parigi</nome>
      <tipo>PdI</tipo>
      <modificatoIl>2001-12-17T09:30:47.0Z</modificatoIl>
      <descrizioneBreve>Le luci e lo splendore di una città eterna</descrizioneBreve>
   </item>
   <item idref="a002">
      <nome>La Vecchia Fattoria</nome>
      <tipo>PdI</tipo>
      <modificatoIl>2001-12-17T09:30:47.0Z</modificatoIl>
      <descrizioneBreve>Gli animali, le stalle e tutto quello che dovete sapere sulle fattorie più importanti</descrizioneBreve>
   </item>
   <item idref="a010">
      <nome>Il Polo Nord</nome>
      <tipo>PdI</tipo>
      <modificatoIl>2001-12-17T09:30:47.0Z</modificatoIl>
      <descrizioneBreve>Beh...che dire se volete un posto unico al mondo potete essere sicuri che questo sia il posto giusto.</descrizioneBreve>
   </item>
</ds:elenco>

Gli elenchi sono costruiti dinamicamente, secondo i parametri supportati da ciascun DS, e secondo i criteri di classificazione delle schede dichiarati nell'ontologia descritta in sezione 7

3.2 Scheda

Una scheda può essere un Punto di Interesse, un Itinerario, una guida. Le operazioni possibili sulla scheda sono 2:

  • con la richiesta SOAP richiedi_scheda ed il relativo parametro id, si ottiene la scheda stessa.

  • con la richiesta SOAP inserisci_scheda, passando come parametro la scheda stessa si ottiene la creazione di una nuova scheda all'interno del DS. Si ricorda che anche in caso di modifica deve essere creata una nuova scheda. Nel caso di inserimento l'id ovviamente è fittizio. Si consiglia di usarne uno apposito per l'inserimento per evitare problemi e avere ulteriore controllo.

  • con la richiesta SOAP richiedi_guida_completa ed il relativo parametro id, si ottiene la guida in forma estesa, cioe' contenente tutti gli Itinerari direttamente all'interno dell'Xml (non come riferimenti dunque). Attenzione: la radice non è scheda, ma è guidacompleta: lo si è fatto per distinguere questa situazione particolare dalla guida costruita con i riferimenti.

La scheda contiene tutte le informazioni associate ad un documento. Queste sono organizzate in sezioni che raggruppano informazioni tra loro omogenee per uso.

Ogni scheda o elenco restituito dal DS è un documento che deve essere formattato dal DF.

3.2.1 Grammatica della scheda

La grammatica XML-Schema + Schematron è la seguente:


<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:sch="http://purl.oclc.org/dsdl/schematron" xmlns="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkinGroupACDS" xmlns:df="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkingGroupACDF" targetNamespace="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkinGroupACDS">
   <xs:annotation>
      <xs:documentation>ahah </xs:documentation>
   </xs:annotation>
   <xs:include schemaLocation="logistica.xsd"/>
   <xs:include schemaLocation="testo.xsd"/>
   <!--
       ===============================================================================
       RADICE DEL DOCUMENTO
       ===============================================================================
   -->
   <xs:element name="scheda" type="scheda_t"/>
   <!--
      ===============================================================================
      DEFINIZIONE DEI (MACRO) TIPI DEGLI ELEMENTI DEL DATA SOURCE
      ===============================================================================
   -->
   <!-- Elemento Root: Scheda -->
   <xs:complexType name="scheda_t">
      <xs:sequence>
         <xs:element name="info" type="info_t"/>
         <xs:choice>
            <xs:element name="PdI" type="PdI_t"/>
            <xs:element name="itinerario" type="itinerario_t"/>
            <xs:element name="guida" type="guida_t"/>
         </xs:choice>
      </xs:sequence>
      <xs:attribute name="id" type="xs:ID" use="required"/>
   </xs:complexType>
   <!-- Informazioni -->
   <xs:complexType name="info_t">
      <xs:annotation>
         <xs:documentation>
            Definisce le meta-informazioni associate ad ua scheda.
            In particolari si hanno tutte le informazioni sulle proprieta`
            del file XML associato (e.g. autore, creazione, ...).
         </xs:documentation>
      </xs:annotation>
      <xs:all>
         <xs:element name="autore" type="xs:normalizedString"/>
         <xs:element name="team" type="xs:normalizedString"/>
         <xs:element name="origine" type="xs:anyURI" minOccurs="0"/>
         <xs:element name="creatoIl" type="xs:dateTime"/>
         <xs:element name="modificatoIl" type="xs:dateTime"/>
         <xs:element name="lang" type="lang_t" default="it_IT"/>
         <xs:element name="licence" type="xs:string" minOccurs="0"/>
         <xs:element name="tipo" type="ontologia_t"/>
         <xs:element name="keywords" type="keywords_t" minOccurs="0"/>
      </xs:all>
   </xs:complexType>
   <!-- Classe base astratta per PdI, Itinerari e Guide   -->
   <xs:complexType name="schedaBase_t" abstract="true">
      <xs:annotation>
         <xs:documentation>
            Elementi base comuni ad ogni scheda.
            Questi elementi sono utilizzati sia da un Punto di Interesse,
            che da un itinerario, che da una guida; sono raggruppati quindi
            in un'unica classe base, in modo che tutte le schede rispettino lo
            stesso ordine di definizione degli elementi.
         </xs:documentation>
      </xs:annotation>
      <xs:sequence>
         <xs:element name="nome" type="xs:normalizedString"/>
         <xs:element name="mappa" type="mappa_t" minOccurs="0"/>
         <xs:element name="immagini" type="immagini_t" minOccurs="0"/>
         <xs:element name="descrizione" type="descrizione_t"/>
      </xs:sequence>
   </xs:complexType>
   <!-- Punto d'Interesse -->
   <xs:complexType name="PdI_t">
      <xs:annotation>
         <xs:documentation>
            Definisce un punto d'interesse.
            Estende gli elementi definiti in ds:schedaBase_t, con gli
            elementi specifici di un punto d'interesse (e.g. GPS,
            raggio, ...).
         </xs:documentation>
      </xs:annotation>
      <xs:complexContent>
         <xs:extension base="schedaBase_t">
            <xs:sequence>
               <xs:element name="GPS" type="GPS_t"/>
               <xs:element name="raggio" type="raggio_t"/>
               <xs:element name="logistica" type="logistica_t" minOccurs="0"/>
            </xs:sequence>
         </xs:extension>
      </xs:complexContent>
   </xs:complexType>
   <!-- Itinerario -->
   <xs:complexType name="itinerario_t">
      <xs:annotation>
         <xs:documentation>
            Definisce un Itinerario.
            Estende gli elementi definiti in ds:schedaBase_t, con gli
            elementi specifici di un Itinerario (e.g. seqItem).
         </xs:documentation>
         <xs:appinfo>
            <sch:pattern name="item pdi">
               <sch:rule context="item">
                  <sch:assert test="./tipo[name()!='Itinerario' and name() != 'Guida']">
                     Un itinerario puo` contenere solo item di genere PdI.
                  </sch:assert>
               </sch:rule>
            </sch:pattern>
         </xs:appinfo>
      </xs:annotation>
      <xs:complexContent>
         <xs:extension base="schedaBase_t">
            <xs:sequence maxOccurs="unbounded">
               <xs:element name="sequenza" type="sequenza_t"/>
            </xs:sequence>
         </xs:extension>
      </xs:complexContent>
   </xs:complexType>
   <!-- Guida -->
   <xs:complexType name="guida_t">
      <xs:annotation>
         <xs:appinfo>
            <sch:pattern name="item itinerario">
               <sch:rule context="item">
                  <sch:assert test="./tipo[name()='Itinerario']">
                     Una Guida puo` contenere solo item di genere Itinerario.
                  </sch:assert>
               </sch:rule>
            </sch:pattern>
         </xs:appinfo>
      </xs:annotation>
      <xs:complexContent>
         <xs:extension base="schedaBase_t">
            <xs:sequence>
               <xs:element name="prezzo" type="xs:nonNegativeInteger" minOccurs="0"/>
               <xs:element name="copertinaURL" type="xs:anyURI" minOccurs="0"/>
               <xs:element name="sequenza" type="sequenza_t"/>
            </xs:sequence>
         </xs:extension>
      </xs:complexContent>
   </xs:complexType>
   <!-- Sequenza -->
   <xs:complexType name="sequenza_t">
      <xs:sequence>
         <xs:element name="testo" type="testo_t" minOccurs="0"/>
         <xs:sequence maxOccurs="unbounded">
            <xs:element name="item" type="item_t"/>
            <xs:element name="testo" type="testo_t" minOccurs="0"/>
         </xs:sequence>
      </xs:sequence>
   </xs:complexType>
   <!-- Item -->
   <xs:complexType name="item_t">
      <xs:sequence>
         <xs:element name="nome" type="xs:string"/>
         <xs:element name="tipo" type="ontologia_t"/>
         <xs:element name="modificatoIl" type="xs:dateTime"/>
         <xs:element name="descrizioneBreve" type="xs:string"/>
      </xs:sequence>
      <xs:attribute name="idref" type="xs:string" use="required"/>
   </xs:complexType>

</xs:schema>

Nella grammatica appena presentata manca la parte riguardante i tipi, che verranno descritti più avanti.La tabella seguente contiene una descrizione degli elementi contenuti.

Nome Descrizione Attributi
scheda L’elemento radice del documento scheda. Può essere ulteriormente specializzato in PuntoDiInteresse, Itinerario o Guida id : obbligatorio
PdI Elemento figlio di scheda relativa ad un PuntoDiInteresse  
itinerario Elemento figlio di una scheda relativa ad un Itinerario  
guida Elemento figlio di una scheda relativa ad una Guida  
info Metadati informativi sulla scheda in quanto prodotto di un determinato DS  
logistica Dati strutturati di descrizione della scheda e di un particolare luogo. Dipendono dal tipo di dato richiesto e fornito dal DS. Questi dati dipendono fortemente dal PuntoDiInteresse e rispondono all'ontologia in sezione 7. Nel paragrafo 3.4 verranno illustrati gli elementi contenuti in logistica.  
immagini Una sequenza di immagini (di contenuto e non presentazionali)  
sequenza Alternanza di elementi testo (che verrano descritti nel paragrafo 3.5) e di item, che contengono un set ridotto di informazioni relative ad un PuntoDiInteresse o di un Itinerario. Ogni elemento item contiene una sequenza di elementi tratti dal vocabolario LTGB e utili per la visualizzazione della entry. Si ricorda che nel caso di Itinerari le sequenze saranno di PdI? e nel caso di guide saranno di itinerari.  
item è l'elemento figlio di elenco e della sequenza. E' una struttura che descrive informazioni riassuntive di un Pdi, di un itinerario o di una guida idref : obbligatorio
keywords Una sequenza dikeyword, che contengono un token di informazione relativo ad una scheda.  
descrizione La composizione di due descrizioni una breve e una estesa, di un PuntoDiInteresse, di un Itinerario o di una Guida  
descrizioneEstesa la descrizione completa di una scheda fornita dall'utente.Può contenere diversi elementi per caratterizzare il testo. Questi elementi verranno descritti nel paragrafo 3.5  
GPS tupla di coordinate: latitudine e longitudine  

Di seguito gli altri tipi contenuti in scheda, che descrivono la composizione interna degli elementi fondamentali.

<!-- Coordinate GPS -->
   <xs:complexType name="GPS_t">
      <xs:sequence>
         <xs:element name="latitudine">
            <xs:simpleType>
               <xs:restriction base="xs:decimal">
                  <xs:totalDigits value="8"/>
                  <xs:fractionDigits value="6"/>
                  <xs:minInclusive value="-90.000000"/>
                  <xs:maxInclusive value="90.000000"/>
               </xs:restriction>
            </xs:simpleType>
         </xs:element>
         <xs:element name="longitudine">
            <xs:simpleType>
               <xs:restriction base="xs:decimal">
                  <xs:totalDigits value="9"/>
                  <xs:fractionDigits value="6"/>
                  <xs:minInclusive value="-180.000000"/>
                  <xs:maxInclusive value="180.000000"/>
               </xs:restriction>
            </xs:simpleType>
         </xs:element>
      </xs:sequence>
   </xs:complexType>
   <!-- Raggio -->
   <xs:simpleType name="raggio_t">
      <xs:restriction base="xs:decimal">
         <xs:totalDigits value="8"/>
         <xs:fractionDigits value="6"/>
         <xs:minInclusive value="0.000000"/>
         <xs:maxInclusive value="90.000000"/>
      </xs:restriction>
   </xs:simpleType>
   <!-- Lista di Immagini -->
   <xs:complexType name="immagini_t">
      <xs:sequence maxOccurs="unbounded">
         <xs:element name="img" type="img_t"/>
      </xs:sequence>
   </xs:complexType>
   <!-- Descrizione breve ed estesa -->
   <xs:complexType name="descrizione_t">
      <xs:sequence>
         <xs:element name="breve" type="xs:normalizedString"/>
         <xs:element name="estesa" type="testo_t"/>
      </xs:sequence>
   </xs:complexType>
   <!-- Mappa -->
   <xs:complexType name="mappa_t">
      <xs:attribute name="url" type="xs:anyURI" use="required"/>
   </xs:complexType>
   <!-- Lista di Keywords -->
   <xs:complexType name="keywords_t">
      <xs:sequence maxOccurs="unbounded">
         <xs:element name="keyword" type="keyword_t"/>
      </xs:sequence>
   </xs:complexType>
   <!-- Keyword singola -->
   <xs:complexType name="keyword_t">
      <xs:simpleContent>
         <xs:extension base="xs:string">
            <xs:attribute name="seeAlso" type="xs:NMTOKEN" use="optional"/>
         </xs:extension>
      </xs:simpleContent>
   </xs:complexType>
   <!-- Lingua della scheda -->
   <xs:simpleType name="lang_t">
      <xs:restriction base="xs:NMTOKEN">
         <xs:enumeration value="it_IT"/>
         <xs:enumeration value="en_EN"/>
         <xs:enumeration value="en_US"/>
         <xs:enumeration value="de_DE"/>
         <xs:enumeration value="fr_FR"/>
         <xs:enumeration value="es_ES"/>
         <!-- And many others!!! -->
      </xs:restriction>
   </xs:simpleType>
   

Di seguito una tabella che descrive i tipi appena presentati:

Nome Descrizione Attributi
autore L’autore della scheda  
team Il team a cui appartiene l’autore  
origine l’URI del documento originale da cui è tratto il contenuto della scheda se originata da un DS intermediary.  
creatoIl La data di creazione della scheda  
modificatoIl la data di ultima modifica della scheda  
latitudine

latitudine (nord/sud) di un PuntoDiInteresse.

Per semplicità, la coordinata è espressa nel formato DD (gradi decimali positivi e negativi (-90,+90), si veda ad es. Geographical_coordinates su Wikipedia) anzichè nella più classica forma con gradi, primi e secondi.

Ad esempio, le coordinate GPS del tempio di Angkor Wat in Cambogia sono: 13.4125N,103.866667E

 
longitudine

longitudine (est/ovest) di un PuntoDiInteresse.

Per semplicità, la coordinata è espressa nel formato DD(-180,+180) anzichè nella più classica forma con gradi, primi e secondi.

 
raggio

Raggio di un PuntoDiInteresse.

Se le coordinate GPS individuano (più o meno) il centro del PuntoDiInterese, il raggio del cerchio entro cui si può idealmente inscrivere il PuntoDiInteresse permette di definirne in modo approssimato le dimensioni. Per semplificare i confronti con le coordinateGPS, anche il raggio è espresso in gradi decimali anzichè come gradi, primi e secondi oppure come lunghezza.

Ad esempio, un grado corrisponde a circa 111 Km, un decimillesimo di grado a circa 11 metri.

 
nome Il nome di una scheda (PuntoDiInteresse, Itinerario o Guida)  
tipo Il tipo di un PuntoDiInteresse, secondo la classificazione proposta nell'ontologia descritta in sezione 7. Utile anche per distinguere la tipologia nell'ambito del DS (scheda, pdi o guida).  
keyword Una parole chiave (token) per descrivere una scheda.  
mappa Una mappa dell'area vicina ad un punto di interesse. La mappa è calcolata da un'applicazione esterna, per cui è importante conoscere solo l'URL completo per inoltrare tale richiesta. N.B.: per evitare problemi di compatibilità si prega di inserire l'URL all'immagine di una mappa e NON un puntatore a GoogleMaps? o comunque pagine che contengono javascript.

url

prezzo Il prezzo di una Guida  
copertinaURL l'URL di una immagine da usare nella copertina della Guida  
descrizioneBreve la descrizione sintetica di una scheda fornita dall'utente.  

3.3 Commenti

Un contenitore "commenti" è l'elemento radice che contiene i commenti relativi ad una scheda. I commenti sono contenitori allo stesso livello di scheda e vanno gestiti separatamente, nel senso che non sono inseriti nelle schede e ci sono richieste specifiche per i commenti. Sono ammissibili solo 2 operazioni sui commenti:

  • possono essere richiesti; i commenti contengono un ID che si riferisce alla scheda alla quale fanno riferimento e la richiesta contiene il numero di commenti voluti ed il punto di partenza (l'offset) sulla lista.

  • possono essere salvati. Si ricorda che i commenti possono solo essere inseriti e non rimossi.

Si ricorda che i commenti vanno inseriti in testa o comunque vanno gestiti in modo che il primo comento restituito in realta' e' l'ultimo inserito.

La grammatica dei commenti è la seguente:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:sch="http://purl.oclc.org/dsdl/schematron" xmlns="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkinGroupACDS" xmlns:ds="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkinGroupACDS" xmlns:df="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkingGroupACDF" targetNamespace="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkinGroupACDS">
   <xs:annotation>
      <xs:documentation>
         Definisce lo schema per i commenti.
         L'elemento radice e` commenti, e deve essere qualificato dal nome del namespace.
         (e.g. <ltgb:commenti xmlns:ltgb="http://vitali.web.cs.unibo.it/view/TechWeb07">...</ltgb:commenti>).
         L'attributo elementFormDefault e` settato a unqualified, quindi non si deve specificare il namespace
         per gli elementi e gli attributi (a qualunque livello di annidamento) di commenti.
      </xs:documentation>
   </xs:annotation>
   <xs:include schemaLocation="testo.xsd"/>
   
   
   <xs:element name="commenti" type="commenti_t"/>
   <!-- Commenti -->
   <xs:complexType name="commenti_t">
      <xs:sequence maxOccurs="unbounded">
         <xs:element name="commento" type="commento_t"/>
      </xs:sequence>
      <xs:attribute name="idref" type="xs:string"/>
   </xs:complexType>
   <!-- Un Commento -->
   
   
   <xs:element name="commento" type="commento_t"/>

   <xs:complexType name="commento_t" mixed="true">
      <xs:complexContent mixed="true">
         <xs:extension base="testo_t">
            <xs:attribute name="number" type="xs:nonNegativeInteger"/>
         </xs:extension>
      </xs:complexContent>
   </xs:complexType>
   
   
   
</xs:schema>

Nel caso in cui si inserisce un commento DEVE essere un elemento commento. Invece nella richiesta dovra' essere restituita una LISTA di commenti.

3.4 Logistica e Tipo

La logistica contiene tutti elementi opzionali che descrivono ulteriormente il PdI?, in base alle caratteristiche che deve avere il PdI? relativamente alla specializzazione all'interno dell'ontologia.Ad esempio un Museo avrà "orario" ma non può avere "tipoCucina". Il tipo ontologia_t descrive le stringhe che possono essere contenute all'interno di "tipo" che specifica la classe a cui appartiene il Pdi. Di seguito viene fornita la grammatica:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:sch="http://purl.oclc.org/dsdl/schematron" xmlns="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkinGroupACDS" targetNamespace="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkinGroupACDS">
   <xs:annotation>
      <xs:documentation>
         Definisce lo schema per l'ontologia.
      </xs:documentation>
   </xs:annotation>
   <xs:simpleType name="ontologia_t">
      <xs:restriction base="xs:NMTOKEN">
         <xs:enumeration value="PdI"/>
         <xs:enumeration value="Guida"/>
         <xs:enumeration value="Itinerario"/>
         <xs:enumeration value="Negozio"/>
         <xs:enumeration value="Profumeria"/>
         <xs:enumeration value="Libreria"/>
         <xs:enumeration value="Abbigliamento"/>
         <xs:enumeration value="Alimentari"/>
         <xs:enumeration value="Arredamento"/>
         <xs:enumeration value="Localita"/>
         <xs:enumeration value="Quartiere"/>
         <xs:enumeration value="Comune"/>
         <xs:enumeration value="Provincia"/>
         <xs:enumeration value="Contrada"/>
         <xs:enumeration value="ParchiNaturali"/>
         <xs:enumeration value="Frazione"/>
         <xs:enumeration value="Regione"/>
         <xs:enumeration value="Nazione"/>
         <xs:enumeration value="EntePubblico"/>
         <xs:enumeration value="Turismo"/>
         <xs:enumeration value="CallCenter"/>
         <xs:enumeration value="InformationPoint"/>
         <xs:enumeration value="InternetPoint"/>
         <xs:enumeration value="Emergenze"/>
         <xs:enumeration value="Ospedale"/>
         <xs:enumeration value="Polizia"/>
         <xs:enumeration value="Farmacia"/>
         <xs:enumeration value="Poste"/>
         <xs:enumeration value="Municipio"/>
         <xs:enumeration value="Ambasciata"/>
         <xs:enumeration value="Ostello"/>
         <xs:enumeration value="Pensione"/>
         <xs:enumeration value="BedBreakfast"/>
         <xs:enumeration value="Hotel"/>
         <xs:enumeration value="LuogoCulto"/>
         <xs:enumeration value="Museo"/>
         <xs:enumeration value="Monumento"/>
         <xs:enumeration value="Stazione"/>
         <xs:enumeration value="Aeroporto"/>
         <xs:enumeration value="Evento"/>
         <xs:enumeration value="Manifestazione"/>
         <xs:enumeration value="Concerto"/>
         <xs:enumeration value="Mostra"/>
         <xs:enumeration value="Teatro"/>
         <xs:enumeration value="Locale"/>
         <xs:enumeration value="Ristorante"/>
         <xs:enumeration value="Pub"/>
         <xs:enumeration value="Disco"/>
         <xs:enumeration value="Bar"/>
         <xs:enumeration value="Agriturismo"/>
         <xs:enumeration value="Montagna"/>
         <xs:enumeration value="ScuolaUniversita"/>
         <xs:enumeration value="Alloggio"/>
         <xs:enumeration value="Campeggio"/>
         <xs:enumeration value="Castello"/>
         <xs:enumeration value="CulturaSpettacolo"/>
         <xs:enumeration value="Mercato"/>
         <xs:enumeration value="Utente"/>
         <!-- And many others... -->
      </xs:restriction>
   </xs:simpleType>
   <xs:complexType name="logistica_t">
      <xs:sequence>
         <xs:element name="orario" type="orario_t" minOccurs="0" maxOccurs="14"/>
         <!-- Incrementabile a richiesta (sensata) -->
         <xs:element name="accomodationPrice" type="service_t" minOccurs="0"/>
         <xs:element name="ticketPrice" type="service_t" minOccurs="0"/>
         <xs:element name="data" type="xs:date" minOccurs="0"/>
         <xs:element name="tipologiaTrasporti" type="xs:string" minOccurs="0"/>
         <xs:element name="tipoCucina" type="xs:string" minOccurs="0"/>
         <xs:element name="stelle" type="xs:integer" minOccurs="0"/>
         <xs:element name="ubicazione" type="xs:string" minOccurs="0"/>
         <xs:element name="nomeLocalita" type="xs:string" minOccurs="0"/>
         <xs:element name="calendario" type="calendario_t" minOccurs="0"/>
         <xs:element name="artista" type="xs:string" minOccurs="0"/>
         <xs:element name="contatti" type="contatti_t" minOccurs="0"/>
         <xs:element name="tipoMercato" type="xs:string" minOccurs="0"/>
         <xs:element name="formalismo" type="xs:string" minOccurs="0"/>
         <xs:element name="posizione" type="xs:string" minOccurs="0"/>
         <!-- And few others... possibly! -->
      </xs:sequence>
   </xs:complexType>
   <xs:complexType name="orario_t">
      <xs:choice>
         <xs:element name="mese" type="mese_t" maxOccurs="12"/>
      </xs:choice>
   </xs:complexType>
   <xs:complexType name="mese_t">
      <xs:choice>
         <xs:element name="giorno" type="giorno_t" maxOccurs="7"/>
      </xs:choice>
      <xs:attribute name="nome" type="nome_mese_t" use="required"/>
   </xs:complexType>
   <xs:complexType name="service_t">
      <xs:sequence maxOccurs="unbounded">
         <xs:element name="servizi">
            <xs:complexType>
               <xs:sequence>
                  <xs:element name="servizio" type="xs:string"/>
                  <xs:element name="prezzo" type="xs:float"/>
               </xs:sequence>
            </xs:complexType>
         </xs:element>
      </xs:sequence>
   </xs:complexType>
   <xs:complexType name="giorno_t">
      <xs:sequence maxOccurs="unbounded">
         <xs:element name="apertura" type="xs:time"/>
         <xs:element name="chiusura" type="xs:time"/>
      </xs:sequence>
      <xs:attribute name="nome" type="nome_giorno_t" use="required"/>
   </xs:complexType>
   <xs:simpleType name="nome_giorno_t">
      <xs:restriction base="xs:string">
         <xs:enumeration value="Lunedi"/>
         <xs:enumeration value="Martedi"/>
         <xs:enumeration value="Mercoledi"/>
         <xs:enumeration value="Giovedi"/>
         <xs:enumeration value="Venerdi"/>
         <xs:enumeration value="Sabato"/>
         <xs:enumeration value="Domenica"/>
         <xs:enumeration value="TuttiGiorni"/>
         <xs:enumeration value="TuttiNoDomenica"/>
      </xs:restriction>
   </xs:simpleType>
   <xs:simpleType name="nome_mese_t">
      <xs:restriction base="xs:string">
         <xs:enumeration value="Gennaio"/>
         <xs:enumeration value="Febbraio"/>
         <xs:enumeration value="Marzo"/>
         <xs:enumeration value="Aprile"/>
         <xs:enumeration value="Maggio"/>
         <xs:enumeration value="Giugno"/>
         <xs:enumeration value="Luglio"/>
         <xs:enumeration value="Agosto"/>
         <xs:enumeration value="Settembre"/>
         <xs:enumeration value="Ottobre"/>
         <xs:enumeration value="Novembre"/>
         <xs:enumeration value="Dicembre"/>
         <xs:enumeration value="TuttiMesi"/>
      </xs:restriction>
   </xs:simpleType>
   <xs:complexType name="calendario_t">
      <xs:sequence>
         <xs:element name="stagione" type="stagione_t"/>
      </xs:sequence>
   </xs:complexType>
   <xs:complexType name="stagione_t">
      <xs:sequence>
         <xs:element name="spettacolo" type="spettacolo_t"/>
      </xs:sequence>
      <xs:attribute name="anno" type="xs:gYear"/>
   </xs:complexType>
   <xs:complexType name="spettacolo_t">
      <xs:sequence>
         <xs:element name="titolo" type="xs:string"/>
         <xs:element name="produzione" type="xs:string"/>
         <xs:element name="data" type="xs:dateTime"/>
      </xs:sequence>
      <xs:attribute name="tipo" type="xs:string"/>
   </xs:complexType>
   <xs:complexType name="contatti_t">
      <xs:sequence>
         <xs:element name="email" type="xs:string" minOccurs="0"/>
         <xs:element name="telefono" type="xs:string" minOccurs="0"/>
         <xs:element name="altri" type="xs:string" minOccurs="0"/>
      </xs:sequence>
   </xs:complexType>
</xs:schema>

Quella che segue è la tabella relativa agli elementi contenuti in "logistica":

Nome Descrizione Attributi
orario Lista degli orari organizzati per mesi e giorni. Questi ultimi infine contengono l'orario di apertura e chiusura dell'esercizio. Mese contiene un attributo che descrive il mese in questione. Esiste un valore particolare per non descrivere mese per mese, questo valore è "TuttiMesi". Giorno contiene un attributo che descrive il giorno della settimana in questione. Anche in queto caso ci sono stringhe particolari: "TuttiGiorni" e "TuttiNoDomenica", quest'ultimo descrive tutti i giorni tranne la domenica.  
accomodationPrice lista dei servizi offerti da una struttura.Prezzo è già definito come elemento atomico.  
ticketPrice Lista dei servizi generici per cui viene effettuato un pagamento.Prezzo è già definito come elemento atomico.
data Data e ora di uno specifico evento o di uno spettacolo.
tipologiaTrasporti Specifica il tipo di trasporti, necessario per Punti di Interesse che siano stazioni, aeroporti, etc..
tipoCucina Specifica il tipo di cucina di un punto di ristoro.
servizio Specifica il tipo di servizio.
stelle Indica la qualità di una struttura alberghiera
ubicazione Indica l'indirizzo più o meno preciso di un Punto di Interesse.N.B. è indicativo, l'informazione fondamentale per la localizzazione sono le coordinate.
nomeLocalità Indica il nome della località (ad es. Francia per una nazione o Parigi per una città) N.B. è indicativo, l'informazione fondamentale per la localizzazione sono le coordinate.
calendarioSpettacoli Indica il calendario degli spettacoli di un teatro o simile.
stagione Indica la stagione relativa ad un calendario anno
spettacolo è la radice della descrizione di uno spettacolo. L'attributo tipo indica la tipologia di spettacolo (es. commedia) tipo (tragedia,commedia,etc.)
titolo titolo spettacolo
produzione produzione spettacolo
artista l'individuo autore di un'opera
contatti contiene tre figli stringa email, telefono e altro che definiscono i contatti per un locale, ente, etc.
tipoMercato indica la tipologia di mercato (antiquariato, usato, etc.)
formalismo descrive il livello di formalismo di un dato locale (elegante, domestico, alla moda, [non so neanche io bene che termini usare])
posizione descrive la posizione della struttura (mare, montagna, città, etc.)

3.5 Componente Testuale

La componente testuale contenuta negli elementi sequenza, descrizione e commento. Descrive cosa può essere contenuta all'interno delle parti testuali contenute nelle schede e nei commenti. Di seguito la grammatica del testo:

<xs:complexType name="testo_t" mixed="true">
      <xs:choice minOccurs="0" maxOccurs="unbounded">
         <xs:group ref="blocco_g"/>
      </xs:choice>
      <xs:attributeGroup ref="DSaccessibilita_g"/>
   </xs:complexType>
   <!-- Elementi Blocco -->
   <xs:complexType name="blocco_t" mixed="true">
      <xs:annotation>
         <xs:appinfo>
            <sch:pattern name="coconstrain_elementi_blocco">
               <sch:rule context="//*[name()='h1' or name()='h2' or name()='h3' or name()='p']">
                  <sch:assert test="not((.//h1)and(.//h2)and(.//h3)and(.//p)) ">
                     Un elemento di tipo 'blocco' (escluso li) non puo` contenere altri elementi di tipo blocco.
                  </sch:assert>
               </sch:rule>
            </sch:pattern>
         </xs:appinfo>
      </xs:annotation>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
         <xs:group ref="inline_g"/>
         <xs:group ref="atomici_g"/>
      </xs:choice>
      <xs:attribute name="semantica" type="xs:string"/>
      <xs:attributeGroup ref="DSaccessibilita_g"/>
   </xs:complexType>
   <xs:group name="blocco_g">
      <xs:choice>
         <xs:element name="h1" type="blocco_t"/>
         <xs:element name="h2" type="blocco_t"/>
         <xs:element name="h3" type="blocco_t"/>
         <xs:element name="p" type="blocco_t"/>
         <xs:element name="ol" type="lista_t"/>
         <xs:element name="ul" type="lista_t"/>
      </xs:choice>
   </xs:group>
   <!-- Elementi Inline -->
   <xs:complexType name="inline_t" mixed="true">
      <xs:choice minOccurs="0" maxOccurs="unbounded">
         <xs:group ref="inline_g"/>
         <xs:group ref="atomici_g"/>
      </xs:choice>
      <xs:attributeGroup ref="DSaccessibilita_g"/>
   </xs:complexType>
   <xs:group name="inline_g">
      <xs:choice>
         <xs:element name="em" type="inline_t"/>
         <xs:element name="strong" type="inline_t"/>
         <xs:element name="a" type="a_t"/>
         <xs:element name="q" type="inline_t"/>
         <xs:element name="abbr" type="inline_t"/>
         <xs:element name="acronym" type="inline_t"/>
      </xs:choice>
   </xs:group>
   <!-- Elementi Atomici -->
   <xs:group name="atomici_g">
      <xs:choice>
         <xs:element name="br" type="br_t"/>
         <xs:element name="img" type="img_t"/>
      </xs:choice>
   </xs:group>
   <!-- Ancore -->
   <xs:complexType name="a_t">
      <xs:annotation>
         <xs:appinfo>
            <sch:pattern name="coconstrain_A">
               <sch:rule context="a">
                  <sch:assert test="not(.//a)">'a' non puo` avere 'a' come discendente</sch:assert>
                  <sch:assert test="( @href and not(@name) ) or (not(@href) and @name)">
                     Un elemento 'a' puo` contenere o l'attributo href o l'attributo name.
                  </sch:assert>
               </sch:rule>
            </sch:pattern>
         </xs:appinfo>
      </xs:annotation>
      <xs:complexContent>
         <xs:extension base="inline_t">
            <xs:attribute name="img" type="xs:anyURI" use="optional"/>
            <xs:attribute name="name" type="xs:anyURI" use="optional"/>
         </xs:extension>
      </xs:complexContent>
   </xs:complexType>
   <!-- Immagine -->
   <xs:complexType name="img_t">
      <xs:attribute name="href" type="xs:anyURI" use="required"/>
      <xs:attribute name="alt" type="xs:normalizedString" use="required"/>
      <xs:attribute name="longdesc" type="xs:anyURI"/>
      <xs:attributeGroup ref="DSaccessibilita_g"/>
      <!-- longdesc: aggiunto per accessibilita' (e' proprio dell'elemento IMG) -->
   </xs:complexType>
   <!-- Line break  -->
   <xs:complexType name="br_t"/>
   <!-- Elenchi (tolto "start" perchè deprecato nella versione xhtml strict)-->
   <xs:complexType name="lista_t">
      <xs:sequence maxOccurs="unbounded">
         <xs:element name="li" type="testo_t"/>
      </xs:sequence>
      <xs:attributeGroup ref="DSaccessibilita_g"/>
   </xs:complexType>
   <!-- ATTRIBUTI PER ACCESSIBILITA' -->
   <xs:attributeGroup name="DSaccessibilita_g">
      <xs:annotation>
         <xs:documentation>
            Attributi standard xhtml  (un sottinsieme sensato per il DS ) per permettere l'accessibilita':
            - title: titolo/descrizione aggiuntiva dell'elemento
            - dir : direzione di lettura del testo LeftToRight o RightToLeft
            - lang : language code che identifica la lingua in cui e' espresso il contenuto dell'elemento
         </xs:documentation>
      </xs:annotation>
      <xs:attribute name="title" type="xs:string" use="optional"/>
      <xs:attribute name="dir" use="optional">
         <xs:simpleType>
            <xs:restriction base="xs:NMTOKEN">
               <xs:enumeration value="ltr"/>
               <xs:enumeration value="rtl"/>
            </xs:restriction>
         </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="lang" type="xs:language" use="optional"/>
   </xs:attributeGroup>

Questi sono alcuni degli elementi presenti:

  • Elementi Blocco

Nome Descrizione Attributi
h1 Titolo di primo livello semantica: opzionale
h2 Titolo di secondo livello semantica: opzionale
h3 Titolo di terzo livello semantica: opzionale
p Paragrafo generico semantica: opzionale
ol lista ordinata semantica: opzionale
ul lista puntata semantica: opzionale

Gli elementi Blocco non possono contenere altri elementi blocco. L'elemento "il" è una particolare eccezione alla regola, nel quale è possibile addirittura inserire elementi di tipo testo_t data la sua natura. Si ricorda che gli elementi inline e atomici DEVONO OBBLIGATORIAMENTE essere contenuti nei blocchi.

  • Elementi inline

em Testo con enfasi   strong Testo con molta enfasi   a Ancora di partenza di link href e name : opzionali, l'uno esclude l'altro q testo quotato abbr forme abbreviate acronym acronimo

Inoltre all'interno di testo esistono 2 elementi atomici:

  • br: per andare a capo

  • img: per aggiungere un'immagine contestuale

4 Gestione Errori

Le richieste inoltrate al DS possono generare diversi errori. Per gestirli il protocollo ASD prevede un messaggio di errore che riporta un codice ed una descrizione human-readable per l’errore.

Il messaggio deve essere spedito come SoapFault. in php basta ad esempio creare un soapfault e restituirlo. Al client basta catturarlo come risultato della richiesta. E' necessario utilizzare i codici della tabella sottostante.

Viene riportata di seguito una tabella con gli errori e le relative descrizioni:

Codice errore Descrizione Errore
00 DS non disponibile
10 Parametri query errati
20 Scheda inesistente (id non valido)
30 Errore nell'inserimento della scheda
40 Commento inesistente (ID non valido)
50 Impossibile inserire commento
60 Errore di validazione
70 Impossibile restituire la guida completa

7. Ontologia di riferimento

I PuntiDiInteressi gestiti dall'applicazione LTGB sono classificati, organizzati in categorie e sottocategorie e descritte da informazioni specializzate per ogni tipo. Inoltre i PuntiDiInteresse sono identificati da keyword che ne descrivono la natura e che facilitano la navigazione per quanto riguarda il meccanismo di query. In allegato alla pagina OwlOntologia? è possibile scaricare un file .zip con lo schema relativo all'ontologia ed un insieme di pagine HTML per navigarla.

OwlOntolgia

L'ontologia serve come punto di riferimento soprattutto per raffinare o comuqnue migliorare le ricerche.

8. Registrazione di data source e formatter

I data-source diventano attivi nel sistema LTGB al momento della registrazione. La registrazione non avviene in maniera automatica ma modificando manualmente la pagina del wiki. I team sono tenuti ad aggiungere una riga nella tabella contenuta nelle pagine di registrazione ed indicare:

  1. nome del data-source
  2. URL del catalogo in sintassi XML. Si noti che il catalogo contiene tutte le metainformazioni relative al data-source, come indicato nelle sezioni 3.1.
  3. URL di una pagina HTML che presenta le stesse informazioni in una versione human-readable.

I vari team, dopo aver comprato i data-source ed i formatter, inseriranno manualmente nel codice della loro applicazione gli URL dei cataloghi di queste componenti (e non dei singoli script per richiedere elenchi, schede e formattazione), leggendoli dalle pagine del wiki. L'AC estrae dal catalogo tutte le informazioni necessarie per comunicare con i DS ed i DF scelti.

Esistono due pagine separate per registrare i data-source e i Formatter, rispettivamente RegistrazioneDataSource e RegistrazioneFormatter. Ad esempio la pagina RegistrazioneFormatter presenta questa tabella:

NOME CATALOGO XML CATALOGO HTML
-- nome formatter -- -- URL catalogo XML -- -- URL catalogo HTML --

Se il gruppo TW vuole registrare il Formatter il cui catalogo è all’URL

http://tw.web.cs.unibo.it/format.xml

ed ha creato una pagina HTML (via trasformazione XSLT del catalogo XML) all’URL

http://tw.web.cs.unibo.it/format.html 

deve editare la pagina wiki per produrre la seguente tabella:

NOME CATALOGO XML CATALOGO HTML
-- nome formatter -- -- URL catalogo XML -- -- URL catalogo HTML --
TW http://tw.web.cs.unibo.it/format.xml http://tw.web.cs.unibo.it/format.html

9.Modifiche rispetto alle versioni precedenti

Allineamento del protocollo con gli ultimi fix della grammatica, e del WSDL.

Inserimento nuova ontologia.
to top


You are here: TechWeb07 > WDraft7DS

to top

Copyright? © Fabio Vitali + TechWeb students 2006