Predstavme si takýto scenár: používateľ našiel chybu v programe, ktorý používa, a chce ju oznámiť programátorom, ktorí ho vyvíjajú. Prihlási sa do diskusnej miestnosti venovanej danému programu a medzi účastníkmi vyhľadá roBota, ktorý je určený na ohlasovanie chýb v programe. Tento roBot mu poskytne formulár, ktorý používateľ vyplní a odošle späť.
Aj keď spomínaného roBota ešte zrejme nikto nenaprogramoval, technológie na to nevyhnutné sú k dispozícii. Všetko potrebné sme už v seriáli opisovali – až na posielanie formulárov. Pri vytváraní miestností v Multi User Chat protokole sme spomínali, že výmena formulárov prebieha pomocou protokolu Data Forms (JEP-04). A práve o ňom si povieme viac v tejto časti.
Data Forms
Formuláre obsahujú štruktúrované dáta, ktoré sa vymieňajú medzi používateľom a aplikáciou. V samotnom Jabbere sa formuláre používajú napr. pri registrovaní transportu. Kým ICQ transportu stačí zadanie UIN a hesla, MSN transport vyžaduje ešte aj meno používateľa. Protokol Data Forms umožňuje, aby požadované údaje nemuseli byť natvrdo definované v protokole, ale boli vyžiadané ad hoc. Data Forms by mal byť podľa tvorcov akýsi kompromis medzi jednoduchými dvojicami meno-hodnota a komplexným protokolom XForms.
Formulár môže byť prenášaný v Message, IQ aj v Presence paketoch. Je reprezentovaný XML elementom <x/> v mennom priestore jabber:x:data. Element <x/> má atribút „type“, ktorého hodnota je jedna z týchto:
- form – roBot posiela prazdny formulár na vyplnenie
- submit – používateľ vracia vyplnený formulár späť
- cancel – používateľ stlačil cancel
- result – roBot vracia nejaké údaje po spracovaní, napr. výsledky vyhľadávania.
Element <x/> obsahuje elementy
- title – názov formulára
- instruction – inštrukcie (text), ako vyplniť formulár
a niekoľko elementov <field/> s jednotlivými položkami formulára.
Príklad pre nevyplnený formulár odoslaný v IQ pakete:
<iq from='BugReportBot@program.jabber.org'
to='psivak@jabber.sk'
type='result'
id='1'>
<x xmlns='jabber:x:data' type='form'>
<title>Bug Report</title>
<instructions>Vyplňte tieto údaje:</instructions>
<field type='text-single'
label='Názov programu'
var='programname'/>
<field type='text-multi'
label='Popis chyby'
var='description'/>
<field type='list-single'
label='Verzia'
var='version'>
<option label='0.9'><value>0.9</value></option>
<option label='1.0'><value>1.0</value></option>
<option label='2.0'><value>2.0</value></option>
</field>
</x>
</iq>
Typy položiek sú
- boolean pre logické hodnoty
- fixed pre popisný text
- hidden pre neviditelné položky, ktoré sa vrátia spolu s formulárom
- jid-single pre zoznam Jabber IDov (vyberá sa jeden)
- jid-multi pre zoznam Jabber IDov (môže sa vybrať viac)
- list-single pre zoznam (vyberá sa jedna položka)
- list-multi pre zoznam (môže sa vybrať viac položiek)
- test-single pre jednoriadkový text
- text-multi pre viacriadkový text
- text-private pre zadávanie hesiel
Formulár sa vyplní pridaním elementov <value/> do jednotlivých elementov <field/>.
Formuláre v Smacku
Smack implemetuje formuláre v triede Form. Konštruktorom vytvoríme nový formulár:
Form myForm = new Form(Form.TYPE_FORM);
Vo vytvorenom formulári vyplníme názov a inštrukcie:
myForm.setTitle("Bug Report");
myForm.setInstructions("Vyplňte tieto údaje:");
Pokračujeme vytváraním položiek a ich pridávaním do formulára:
field = new FormField("programname");
field.setType(FormField.TYPE_TEXT_SINGLE);
field.setLabel("Názov programu");
myForm.addField(field);
field = new FormField("description");
field.setType(FormField.TYPE_TEXT_MULTI);
field.setLabel("Popis chyby");
myForm.addField(field);
A nakoniec vytvorený formulár odošleme v Message pakete:
Message msg = chat.createMessage(); msg.addExtension(formToSend.getDataFormToSend()); chat.sendMessage(msg);
Vyplnenie položky:
myForm.setAnswer("programname", "jabberd");
Záver
Formuláre protokolu Data Forms spolu s messagingovými funkciami XMPP umožňujú vytvárať online služby s jednoduchým používateľským rozhraním. Komunikácia s roBotmi tak nie je obmedzená len na posielanie textových správ.