La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Laboratorio di Servizi Web - XML - Ardissono 1 XML - Introduzione Linguaggio di markup, si è imposto come standard per condivisione di dati su internet.

Presentazioni simili


Presentazione sul tema: "Laboratorio di Servizi Web - XML - Ardissono 1 XML - Introduzione Linguaggio di markup, si è imposto come standard per condivisione di dati su internet."— Transcript della presentazione:

1 Laboratorio di Servizi Web - XML - Ardissono 1 XML - Introduzione Linguaggio di markup, si è imposto come standard per condivisione di dati su internet Basato su rappresentazione dati come stringhe di caratteri  facilmente trasferibili via HTTP Essendo standard de facto sono stati sviluppati strumenti per scrittura, interpretazione, gestione documenti XML margherita 8.00 media spaghetti al pesto 10.00 normal

2 Laboratorio di Servizi Web - XML - Ardissono 2 XML – Esempi di uso - I Rappresentazione interna di dati e documenti, visualizzabile in modalità diverse (formati esterni diversi, selezioni diverse di sottoinsiemi di contenuto, …) –Caratteristiche di prodotto, documentazione, … –Formato interno di interfaccia utente di applicazione –… XML Formato esterno CSS / XSL Codice HTML, WML, …

3 Laboratorio di Servizi Web - XML - Ardissono 3 XML – Esempi di uso - II Condivisione dati tra applicazioni –Formato comune di rappresentazione –Eventuale trasformazione dati per tradurre da formato di applicazione1 a formato di applicazione2, basata su tecnologie standard Rappresentazione del contenuto di un messaggio (e.g., SOAP) inviato da applicazione ad applicazione –e.g., ordine di acquisto, dati relativi a clienti, … –…

4 Laboratorio di Servizi Web - XML - Ardissono 4 Pensiamo ad HTML... HTML, markup language, usa tag per aggiungere informazioni al contenuto di un documento –molti tag forniscono informazioni di visualizzazione dei dati (, ) –alcuni specificano significato dei dati (, …) –browser sanno come interpretare i tag –MA: non si possono aggiungere nuovi tag (es: per definire nuovo stile di visualizzazione)  serve linguaggio di markup estensibile per definire il proprio linguaggio di descrizione dati

5 Laboratorio di Servizi Web - XML - Ardissono 5 XML - Extensible Markup Language - I linguaggio markup testuale versione semplificata di SGML (Standard Generalized Markup Language), linguaggio usato per gestione documenti (annotazioni, …) standard W3C (WWW Consortium: http://www.w3.org) per rappresentazione di documenti e dati, e scambio di dati nel Web alcuni obiettivi di design di XML: –direttamente utilizzabile su internet, supportare ampia gamma di applicazioni, compatibile con SGML, human-readable, facilmente processabile da programmi, ….

6 Laboratorio di Servizi Web - XML - Ardissono 6 XML - Extensible Markup Language - II linguaggio mediante cui si possono definire altri linguaggi (es: XHTML, WSDL,...) estensibile –permette creazione di nuovi tag (non necessariamente legati a visualizzazione di informazioni) strutturato –mediante tag si può rappresentare struttura delle informazioni validante –permette definizione di regole grammaticali per verifica di correttezza sintattica di informazioni rappresentate in XML (DTD e XML schema)

7 Laboratorio di Servizi Web - XML - Ardissono 7 Esempio Consideriamo la descrizione di una pizza peperoni (extracheese) 8.00 large La descrizione può essere strutturata come segue: peperoni 8.00 large I tag descrivono la struttura del dato (si è tentati a dire che descrivono la semantica, ma non è vero) I dati sono racchiusi tra tag Non strutturata pizza toppingpricesize

8 Laboratorio di Servizi Web - XML - Ardissono 8 Documenti XML composti di entità (unità fisiche di memorizzazione) che contengono dati analizzabili sintatticamente (PCDATA – Parsed Character Data) o meno (CDATA – unparsed data) PCDATA: dati analizzabili sintatticamente contengono caratteri (codifica UNICODE, etc.) –dati di tipo carattere –simboli di markup (tag di apertura e chiusura, commenti, …; descrivono struttura e proprietà dei documenti) CDATA: dati non analizzabili sintatticamente possono contenere testo, codice di scripting (e.g., Javascript, VBscript) o altri tipi di dati. Il contenuto di CDATA non è interpretato secondo sintassi di XML

9 Laboratorio di Servizi Web - XML - Ardissono 9 CDATA e PCDATA Mocha Java 11.95 Sumatra 12.50 <!CDATA[ // qui posso inserire per esempio del codice di programmazione ]]>

10 Laboratorio di Servizi Web - XML - Ardissono 10 Documenti XML ben formati - I Documento ::= prologo elemento Misc* –prologo: specifica versione di XML e caratteri usati. Es: –elemento: corrisponde ad una componente logica del documento XML e viene rappresentato mediante tag elemento: EmptyElementTag | StartTag content EndTag ogni documento ha un elemento principale, la radice, non incluso in alcun altro elemento un elemento può essere composto di altri elementi (contenitore) –Misc: commenti, processing instructions, … documento XML deve contenere prologo e elemento radice pizza toppingpricesize

11 Laboratorio di Servizi Web - XML - Ardissono 11 Documenti XML ben formati - II Intuitivamente, documento è ben formato sse –contiene tutte le componenti necessarie (1 prologo, 1 solo elemento radice,...) –i suoi tag sono bilanciati. E.g. ogni tag aperto viene chiuso (ad eccezione di tag vuoti, che possono essere chiusi direttamente: equivalente a ) tag annidati in modo che l’ultimo tag aperto sia il primo chiuso: … NB: tag possono essere composti  definizione di strutture gerarchiche (ad albero) NB: XML è case-sensitive

12 Laboratorio di Servizi Web - XML - Ardissono 12 coffee.xml: ben formato e non Mocha Java 11.95 Sumatra 12.50 Mocha Java 11.95 Sumatra 12.50

13 Laboratorio di Servizi Web - XML - Ardissono 13 XML - Extensible Markup Language - III XML è linguaggio estensibile e validante permette definizione di –nuovi tag XML –regole grammaticali per verifica di correttezza sintattica di documenti XML (cioè, che nei documenti XML si usino correttamente i tag del linguaggio definito) Es: linguaggio usato per descrivere catalogo dei prezzi del caffè o tipi di piatti (pizza, pasta) offerti nel menu del ristorante

14 Laboratorio di Servizi Web - XML - Ardissono 14 Definizione di nuovi linguaggi markup Partendo da sintassi di base XML è utile definire nuovi linguaggi basati su XML (dialetti di XML) per descrivere tipi di dati (es: linguaggio di descrizione prodotti in catalogo) scambiare messaggi tra applicazioni (es: WSDL, Web Services Description Language, descrive sintassi per invocare operazioni offerte da Web Service su internet)  Uso strumenti standard per definire grammatiche di linguaggi basati su XML, per verificare correttezza sintattica di documenti (rispetto a tali grammatiche), per interpretare contenuto di documenti (e estrarre informazioni)

15 Laboratorio di Servizi Web - XML - Ardissono 15 Documenti XML validi Documenti XML ben formati che rispettano una grammatica di linguaggio markup specificata via –Document Type Definition (DTD), oppure –XML schema Grammatica regola uso di tag e struttura documenti –non basta che i tag siano bilanciati, etc. –documento deve rispettare regole grammaticali che dicono quali tag si possono usare (parole riservate del linguaggio) quali tag possono essere inclusi in altri quali tipi di dato possono essere racchiusi in un tag (numeri, caratteri, etc.)...

16 Laboratorio di Servizi Web - XML - Ardissono 16 DTD: Document Type Definition Regole grammaticali. Definiscono (nuovo) linguaggio markup basato su XML Esempio: pizza.dtd definisce struttura di documenti XML che descrivono pizze pizza.dtd Prologo Definizione di elemento composto Definizione di elemento semplice, prende valori di tipo Parsed Character Data (cioè, testo) Definizione di attributo di elemento “topping”

17 Laboratorio di Servizi Web - XML - Ardissono 17 DTD: dichiarazioni di elementi - I tagname: nome del tag, corrisponde a nome di componente logica del documento definition: specifica tipo e struttura di elemento. Es: –  “persona” (elemento semplice) prende valori di tipo carattere. Es: Giorgio Bianchi –  elemento senza valore (tag che non racchiude nulla)

18 Laboratorio di Servizi Web - XML - Ardissono 18 DTD: dichiarazioni di elementi - II –  Elemento complesso contiene almeno 1 occorrenza di elemento uno uno due MA NON –  Elemento complesso contiene 0 o + occorrenze di elemento e altri come sopra

19 Laboratorio di Servizi Web - XML - Ardissono 19 DTD: dichiarazioni di elementi - III –  elemento complesso formato (esattamente) da elementi specificati peperoni 8.00 large MA NON 8.00 large

20 Laboratorio di Servizi Web - XML - Ardissono 20 DTD: dichiarazioni di elementi - IV –  Specifica elementi alternativi che elemento può includere (opzioni). Es: cornetto meringata MA NON cornetto meringata

21 Laboratorio di Servizi Web - XML - Ardissono 21 DTD: dichiarazioni di elementi - V –  Elemento misto testo del messaggio Intestazione Testo del messaggio –Altre dichiarazioni … si segue la sintassi delle espressioni regolari

22 Laboratorio di Servizi Web - XML - Ardissono 22 DTD: dichiarazioni di attributi Posso associare attributi ad elemento, specificando quali valori possono assumere, se necessario specificare valore,... –tagName: nome di elemento a cui associo attributo –attrName: nome attributo –values: tipo dell’attributo (enumerazione di valori) –defValue: valore di default –Es:

23 Laboratorio di Servizi Web - XML - Ardissono 23 DTD: altri tipi di dichiarazione DTD permettono di definire altre cose. Es: entità (variabili che fanno riferimento ad elementi definiti esternamente alla DTD) Non vediamo questi dettagli, che si possono trovare nelle specifiche W3C per sintassi di XML e DTD vedere: –http://www.w3.org/TR/REC-xml –rappresenta la grammatica di XML e delle DTD in Backus Naur Format –copia cartacea del documento disponibile in biblioteca

24 Laboratorio di Servizi Web - XML - Ardissono 24 Documento valido vs. ben formato -I pizza.dtd peperoni 8.00 large Grammatica Documento valido rispetto a DTD

25 Laboratorio di Servizi Web - XML - Ardissono 25 Documento valido vs. ben formato - II pizza.dtd peperoni 8.00 large Grammatica (di solito specificata in file.dtd) Documento ben formato, ma non valido rispetto a DTD

26 Laboratorio di Servizi Web - XML - Ardissono 26 Associazione di documenti XML a DTD Serve per dichiarare a quale grammatica fa riferimento un documento XML (altrimenti non sarebbe possibile verificare se documento valido o meno) …….. pizza.dtd peperoni 8.00 large pizza.xml Documenti XML diversi possono far riferimento a stessa grammatica

27 Laboratorio di Servizi Web - XML - Ardissono 27 Embedded DTDs Se grammatica serve in un solo documento la si può definire nel documento <!DOCTYPE priceList [ ]> Mocha Java 11.95 Sumatra 12.50 coffee.xml priceList coffee pricename Simbologia grafica inventata da me!!!!!

28 Laboratorio di Servizi Web - XML - Ardissono 28 Namespace - I Un documento XML può usare + DTD di riferimento Come evitare conflitti di nomi di tag? Es: tag “inizio” e “fine” potrebbero significare –Data di inizio (fine) di viaggio in dominio turistico –Parte iniziale (finale) di film in dominio cinematografico Namespace: –Definisce spazio di nomi che raccoglie insieme di tag e definizioni –serve per evitare conflitti di nomi (contestualizza i tag al namespace stesso) –identificato da URI (Uniform Resource Identifier), tipicamente associato a nome di dominio del DNS perchè sicuramente univoco

29 Laboratorio di Servizi Web - XML - Ardissono 29 Namespace - II Tag usati in documenti XML: Unqualified: si riporta solo il nome del tag, senza namespace di riferimento –come in esempi precedenti: … Namespace aware (qualified): specificati facendo riferimento a namespace in cui sono definiti – 15-04-2004 25-04-2004 Nasce XXX XXX sposa YYY Per usare namespace includere riferimento in doc. XML –

30 Laboratorio di Servizi Web - XML - Ardissono 30 Gestione documenti XML XML richiede rispetto di regole sintattiche ma permette di usare parser XML che verificano –se documento è ben formato –se documento valido rispetto a DTD (o XML schema)  non dobbiamo sviluppare parser perchè verifica di documento ben formato è basata su sintassi XML DTD (o XML schema) forniscono dettagli sintattici su linguaggio markup che noi creiamo usando XML

31 Laboratorio di Servizi Web - XML - Ardissono 31 Parser XML Ce ne sono molti (IBM, Sun Microsystems,...); possono essere validanti o meno Ci sono anche parser utilizzabili via web –Validatore di W3C: http://validator.w3.org/ Per programmare applicazioni che usano documenti XML serve parser che offra API per lanciare analisi sintattica, restituire risultati, … –parser SAX sviluppati per vari linguaggi di programmazione (Java, Python, …), offrono API standard per interazione con altro software –SAX: Simple API for XML –Noi useremo JAXP: parser SAX di Sun Microsystems

32 Laboratorio di Servizi Web - XML - Ardissono 32 Parser SAX: modello ad eventi (vd dopo) Docum XML Stream XML parser startDocument() startElement() endDocument().......... startDocument event startElement event HandlerBase Object Model

33 Laboratorio di Servizi Web - XML - Ardissono 33 SAX parser - JAXP SAX non è standard W3C ma è molto usato per –gestire grandi documenti (perchè scorre documenti carattere per carattere, senza caricarli per intero in memoria) –analizzare XML su piccoli device (che non supportano strumenti avanzati per XML-processing) Per JAXP CONSULTARE TUTORIAL di JWSDP1.1, Capitolo 2 http://www.educ.di.unito.it/intranet/dol/jwsdp- 1.1/tutorial/doc/

34 Laboratorio di Servizi Web - XML - Ardissono 34 Esempio di documento XML: coffee.xml <!DOCTYPE priceList [ ]> Mocha Java 11.95 Sumatra 12.50 Indentazione aiuta a vedere struttura documento; ignorata da parser e editor XML

35 Laboratorio di Servizi Web - XML - Ardissono 35 Verifico se coffee.xml ben formato - I import java.io.*; import org.xml.sax.*; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers.*; public class VerificaBenFormato extends DefaultHandler { static private Writer out; public static void main(String argv[]) { DefaultHandler handler = new VerificaBenFormato(); SAXParserFactory factory = SAXParserFactory.newInstance(); try { out = new OutputStreamWriter(System.out, "UTF8"); SAXParser saxParser = factory.newSAXParser(); saxParser.parse( "coffee.xml", handler); } catch (Throwable t) { t.printStackTrace(); } System.exit(0); } ….. Importo definizione di API SAX e librerie del parser JAXP javac VerificaBenFormato

36 Laboratorio di Servizi Web - XML - Ardissono 36 Verifico se coffee.xml ben formato - II public class VerificaBenFormato extends DefaultHandler { static private Writer out; public static void main(String argv[]) { DefaultHandler handler = new VerificaBenFormato(); SAXParserFactory factory = SAXParserFactory.newInstance(); try { out = new OutputStreamWriter(System.out, "UTF8"); SAXParser saxParser = factory.newSAXParser(); saxParser.parse( "coffee.xml", handler); } catch (Throwable t) { t.printStackTrace(); } System.exit(0); }... DefaultHandler offre metodi base di gestione di eventi ed errori Creo istanza di SAX Parser Factory Creo istanza di parser Lancio parser passando come parametri documento XML da controllare e oggetto handler di eventi

37 Laboratorio di Servizi Web - XML - Ardissono 37 Verifico se coffee.xml ben formato - III parser analizza coffee.xml –se trova errore nei tag lo segnala e si ferma. Es: manca prologo tag aperto ma non chiuso tag non bilanciati … –altrimenti, arriva fino a fine documento e si ferma NB: se documento XML ben formato, esecuzione del parser non produce risultati visibili a terminale … java VerificaBenFormato

38 Laboratorio di Servizi Web - XML - Ardissono 38 Validazione di coffee.xml - I import... public class Validat extends DefaultHandler { static private Writer out; public static void main(String argv[]) { DefaultHandler handler = new Validat(); SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setValidating(true); try { out = new OutputStreamWriter(System.out, "UTF8"); SAXParser saxParser = factory.newSAXParser(); saxParser.parse( "coffee.xml", handler); } catch (Throwable t) {t.printStackTrace();} System.exit(0); } Imposto parser a validante. NB: documento XML specifica a quale DTD far riferimento javac Validat

39 Laboratorio di Servizi Web - XML - Ardissono 39 Validazione di coffee.xml - II parser validante analizza coffee.xml –se trova errore sintattico (documento non ben formato e/o non valido) lo segnala e si ferma. Es: manca prologo tag aperto ma non chiuso tag non bilanciati tag sconosciuto tag con valore di tipo sbagliato... –altrimenti, arriva fino a fine documento e si ferma Esecuzione del parser su documento valido non produce risultati visibili a terminale … java Validat

40 Laboratorio di Servizi Web - XML - Ardissono 40 Analisi di documento non valido <!DOCTYPE pizza [ ]> Peperoni 7.00 large org.xml.sax.SaxParseException: Element type “prezzo” must be declared. at org.apache.xerces.parsers.AbstractSaxParser.parse… at …. Se il documento non è valido (o ben formato) parser lancia eccezioni...

41 Laboratorio di Servizi Web - XML - Ardissono 41 Manipolazione di documenti XML I parser possono anche essere usati per estrarre informazioni da documenti –Si può usare parser SAX per estrarre informazioni da documenti utilizzando gestione di eventi effettuata dal parser stesso (che, in modalità base, non fa nulla) Il parser –legge documento XML carattere per carattere, partendo da inizio documento –lancia eventi che contengono informazioni su caratteri appena letti. Es: quando incontra tag aperto, lancia evento startElement() che indica inizio di elemento XML quando incontra tag chiuso, lancia evento endElement()...

42 Laboratorio di Servizi Web - XML - Ardissono 42 Analisi sintattica di documento XML Docum XML Stream XML parser startDocument() startElement() endDocument().......... startDocument event startElement event HandlerBase Object Model Con l’evento characters il parser restituisce la stringa inclusa tra tag aperto e chiuso

43 Laboratorio di Servizi Web - XML - Ardissono 43 Gestione documenti XML - SAX Si può scrivere applicazione che –ascolta eventi lanciati dal parser durante analisi di documento –li gestisce (estrae dati e salva in variabili dell’applicazione, stampa a video,...) Metodo comune per fare ciò è basato su uso di API SAX per gestione di eventi legati a XML

44 Laboratorio di Servizi Web - XML - Ardissono 44 SAX - I SAX offre 4 interfacce per gestire eventi XML –EntityResolver: risolve entità –DTDHandler: riceve notifica di eventi legati alle DTD –DocumentHandler: riceve notifica di eventi generali che riguardano il documento: startElement(), endElement(), … –ErrorHandler: gestisce errori sintattici classe org.xml.sax.HandlerBase (org.xml.sax.helpers.DefaultHandler) offre implementazione di base delle interfacce (eventi, errori)

45 Laboratorio di Servizi Web - XML - Ardissono 45 SAX - II per gestire eventi in modo specifico  –estendere implementazione base DefaultHandler offerta da libreria JAXP e fare overriding dei metodi che interessano –Esempio: Ad ogni evento startDocument(), stampare a video stringa “inizio documento” Ad ogni evento startElement(), stampare a video il tag dell’elemento Ad ogni evento characters(), stampare a video i dati ad ogni evento endElement(), stampare tag di chiusura ad ogni evento endDocument(), stampare “fine!!” ad ogni errore di validazione, lanciare eccezione,...

46 Laboratorio di Servizi Web - XML - Ardissono 46 Metodi offerti da DefaultHandler –void startDocument() –void endDocument() –void setDocumentLocator(Locator locator) –void startElement() –void endElement() –void characters() –void ignorableWhiteSpace() –void processingInstructions() Tutorial (JAXP) fa esempi di uso di SAX parser. Vedere API JAXP per dettagli sui metodi di DefaultHandler

47 Laboratorio di Servizi Web - XML - Ardissono 47 Esempio - I import java.io.*; import org.xml.sax.*; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers.SAXParserFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; public class Validatore extends DefaultHandler { StringBuffer textBuffer; static private Writer out; public static void main(String argv[]) {...} public void setDocumentLocator(Locator l) {...} public void startDocument() throws SAXException {...} public void endDocument() throws SAXException {...} public void startElement(String namespaceURI, String sName, String qName, Attributes attrs) throws SAXException {...} public void endElement(String namespaceURI, String sName, String qName) throws SAXException {...} public void characters(char buf[], int offset, int len) throws SAXException {...} public void ignorableWhitespace(char buf[], int offset, int len) throws SAXException {...} … metodi di gestione degli errori e metodi di utilità...

48 Laboratorio di Servizi Web - XML - Ardissono 48 Esempio - II public static void main(String argv[]) { DefaultHandler handler = new Validatore(); SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setValidating(true); try { out = new OutputStreamWriter(System.out, "UTF8"); SAXParser saxParser = factory.newSAXParser(); saxParser.parse("coffee.xml", handler); } catch (Throwable t) {t.printStackTrace();} System.exit(0); } Istanzio SAX Handler Lancio parser su file XML passando SAX Handler

49 Laboratorio di Servizi Web - XML - Ardissono 49 Esempio - III public void setDocumentLocator(Locator l) { try {out.write("LOCATOR"); out.write("\n SYS ID: " + l.getSystemId() ); out.flush(); } catch (IOException e) {} } public void startDocument() throws SAXException { print(" "); nl(); } private void print(String s) throws SAXException { try {out.write(s); out.flush();} catch (IOException e) {throw new SAXException("I/O error", e);} } I/O exceptions gestite lanciando SAX exceptions per rispettare la signature dei metodi di HandlerBase nl() va a capo Stampa URI della DTD

50 Laboratorio di Servizi Web - XML - Ardissono 50 Esempio - IV public void startElement(String namespaceURI, String simpleTagName, String qualifiedTagName, Attributes attrs) throws SAXException { echoText(); String elementName = simpleTagName; if (simpleTagName.equals("")) elementName = qualifiedTagName; // namespaceAware print(" "); } public void characters(char buf[], int offset, int len) throws SAXException { String s = new String(buf, offset, len); if (textBuffer == null) { textBuffer = new StringBuffer(s); } else { textBuffer.append(s); } } Stampa contenuto di buffer se pieno Stampa tag aperto Salva in buffer caratteri inclusi tra tag aperto e chiuso

51 Laboratorio di Servizi Web - XML - Ardissono 51 Esempio - V public void endElement(String namespaceURI, String simpleTagName, String qualifiedTagName) throws SAXException { echoText(); String elementName = simpleTagName; if (elementName.equals("")) elementName = qualifiedTagName; print(" "); } private void echoText() throws SAXException { if (textBuffer == null) return; String s = "” + textBuffer; print(s); textBuffer = null; } Stampa contenuto di buffer a video e svuota buffer Stampa eventuali dati inclusi tra tag Stampa tag chiuso

52 Laboratorio di Servizi Web - XML - Ardissono 52 Esempio - VI public void endDocument() throws SAXException { try {nl(); out.flush(); } catch (IOException e) {throw new SAXException("I/O error", e);} } public void ignorableWhitespace(char buf[], int offset, int len) throws SAXException { nl();} private void nl() throws SAXException { String lineEnd = System.getProperty("line.separator"); try {out.write(lineEnd);} catch (IOException e) {throw new SAXException("I/O error", e);} }

53 Laboratorio di Servizi Web - XML - Ardissono 53 Esempio - VII //================================================== // SAX ErrorHandler methods //================================================== // treat validation errors as fatal public void error(SAXParseException e) throws SAXParseException { throw e; } // print warnings public void warning(SAXParseException err) throws SAXParseException { System.out.println("** Warning! line: ” + err.getLineNumber() + ”; URI: " + err.getSystemId()); System.out.println(" " + err.getMessage()); } Lancio eccezioni di tipo SAXParseException per catturare errori di validazione, etc.


Scaricare ppt "Laboratorio di Servizi Web - XML - Ardissono 1 XML - Introduzione Linguaggio di markup, si è imposto come standard per condivisione di dati su internet."

Presentazioni simili


Annunci Google