BRS#
Klientská aplikace

Hlavní části

Klientskou aplikaci tvoří tři základní bloky - uživatelské rozhraní, logika klienta a modul pro připojení k serveru. Schematicky to vystihuje obrázek na hlavní stránce včetně jejich vzájemné interakce.

Přeložená klientská aplikace se skládá z jediného spustitelného souboru BRS#_client.exe. K správnému běhu je třeba mít nainstalovaný .NET framework nebo běhové prostředí Mono. Při splnění těchto požadavků je možné tento program spustit na jakékoli platformě a operačním systému.

  • Logika klienta je ústředním modulem klientské aplikace. Zpracovává příkazy přijaté od uživatelského rozhraní, dále je rozkládá na jednotlivé "atomické" příkazy (tj. takové, které jsou přímo podporovány databázovým rozhraním IQuery), které pomocí databázového rozhraní postupně zpracovává. Mezivýsledky si interně ukládá a nakonec zobrazuje výsledky obsluze pomocí uživatelského rozhraní. Pokud dojde k nějaké chybě parametrů či nedostatečnému zadání, je tento stav ohlášen obsluze. Na rozdíl od jednoduchých příkazů databázového rozhraní, jež jsou bezstavové, logika klienta si ukládá své mezistavy a v řadě situací je podstatná správná sekvence příkazů. Typickým příkladem může být to, že vlastní rezervace sedadel příkazem RESERVE může být úspěšně provedena až po nastavení aktuálního autobusu příkazem BUS (podrobněji v dalším).

    Modul klientské logiky je implementován v třídě Logic. Rozhraní třídy zhruba odpovídá jednotlivým příkazům přijatým od uživatelského rozhraní. Pomocí uloženého odkazu na rozhraní IQuery (které je implementováno v modulu pro meziprocesovou komunikaci) se dotazuje databáze. Potřebné stavové proměnné jsou uloženy v privátních datových položkách.
  • Uživatelské rozhraní slouží k interakci aplikace s obsluhou. V případě konzolové aplikace je poměrně jednoduché - obsluha zadává příkazy pomocí klávesnice (v textové podobě), výsledky jsou zobrazovány na terminálu. Z hlediska programu je zpracováván standardní vstup programu a výsledky jsou odesílány na standardní výstup. To přináší možnost zpracování předem připravených dávkových souborů např. pro pravidelnou údržbu nebo jiné rutinní opakující se činnosti. Provedeme to pomocí přesměrování vstupu prostředky operačního systému, např.
    mono BRS#_client.exe < fill_db.txt
    
    pro vstup dat z předem připraveného (textového) souboru.

    Uživatelské rozhraní je naprogramováno ve třídách ClientApp a Graphics. První z nich obsluhuje hlavní smyčku - příjem příkazu (rozeznání příkazu a kontrola parametrů), jeho zpracování (předáním modulu logiky) a výstup výsledků. Třída Graphics pak slouží přímo k obsluze terminálu - obsahuje metody pro čtení ze vstupu a výpis různých druhů údajů.

    Klientská aplikace má dva módy - základní pro obyčenou pokladní za přepážkou a pak s rozšířenou funkčností, který je určen pro dispečery. Základní mód obsahuje pouze příkazy find, next, bus, reserve, unlock, city, help a exit (viz Popis příkazů). Rozšířená verze obsahuje všechny níže zmíněné příkazy.
  • Modul pro meziprocesovou komunikaci zajišťuje spojení se serverem a předávání informací oběma směry. Touto problematikou se podrobně zabývá oddíl Meziprocesová komunikace.

Konfigurace

U klientské aplikace je potřeba konfigurovat jednak parametry připojení k serveru a dále zda chceme základní či rozšířenou verzi klienta. To znamená i specifikace přípojného bodu na straně serveru. Uvedené parametry klietská aplikace očekává v souboru brs_client.conf ve stejném adresáři jako je vlastní spustitelný soubor. Jedná se o jednoduchý textový soubor, jehož příklad následuje:

# Bus Reservation System
#
# konfigurace klientské aplikace
#
# 
host=192.168.3.10
port=4567
full=true

Podstatné jsou řádky uvozené slovy host, port a full, za rovnítkem přímo následuje parametr. Řádky uvozené znakem # jsou komentáře, při zpracování souboru se ignorují.

Je zřejmé, že nastavení klientské a serverové aplikace (viz) spolu musí korespondovat, jinak se nenaváže komunikace mezi nimi. V případě použití TCP protokolu je potřeba zkontrolovat (a případně upravit) nastavení firewallu.

Poslední konfigurační položka (full) určuje, zda aplikace bude pracovat v normálním nebo dispečerském režimu. Odlišnost je v tom, že dispečerský režim má zpřístupněny všechny příkazy, režim normální obsluhy nemá umožněno vkládat a vyjímat objekty (města, autobusy apod.).

Popis příkazů

V okamžiku, kdy je aplikace připravena přijmout další příkaz, zobrazí se prompt ve tvaru >. Zadání jednotlivého příkazu se potvrdí stiskem ENTER. Příkazy (jednoduchá anglická slova) lze vkládat bez ohledu na velikost písmen, u parametrů (např. jména měst) však již na velikosti písmen záleží. Víceslovné parametry (např. Nove Mesto nad Metuji) vkládáme do uvozek. Jednotlivé parametry jsou odděleny mezerou.

Note
Otázku použití národních znakových sad jsem neřešil, proto je v následujícím možno nalézt ceska jména měst.

Vkládání a vyjímání objektů

Warning
Příkazy v této sekci jsou dostupné pouze z rozšířené (dispečerské) verze klientské aplikace.
  • ADDCITY
    Přidání nového města do databáze. Příkaz se provede, pokud město se zadaným názvem nebo jeho alias již v databázi není.
    Příklad:
    > ADDCITY "Kropacova Vrutice"
    OK. City number: 58
    
    Parameters
    městonázev města
  • ADDCITYALIAS
    Přidání aliasu (pomocného jména) k již existujícímu městu. V případě dlouhých názvů měst to může výrazně usnadnit činnost obsluhy. Město může mít i více aliasů.
    Příklad:
    > ADDCITYALIAS vrutice "Kropacova Vrutice"
    OK
    > ADDCITYALIAS krvrut "Kropacova Vrutice"
    OK
    
    Parameters
    aliasalias (pomocný název) pro město
    městonázev existujícího města
  • DELCITY
    Vymazání města z databáze. Operace úspěšně proběhne pouze v případě, kdy se město nevyskytuje jako počáteční nebo koncové město některé autobusové linky. Zároveň s městem jsou vymazány všechny jeho případné aliasy.
    Příklad:
    > DELCITY "Kropacova Vrutice"
    OK
    
    Parameters
    městonázev města, které má být vymazáno
  • ADDBUSPLAN
    Přidání nového typu autobusu společně s plánkem rozmístění sedadel. Plánu je přiřazeno jméno pro snadné odkazování. V současné době je podporován pouze plánek v textové podobě.
    Příklad:
    > ADDBUSPLAN Karosa956 49 "/home/mirek/Documents/brs/karosa956.txt"
    OK. Plan number: 5
    
    Parameters
    názevsymbolické jméno plánu autobusu
    sedadelpočet sedadel, které autobus nabízí cestujícím
    souborcesta (relativní či absolutní) k souboru, který obsahuje textovou podobu plánu autobusu
    Textový plánek je používán některými příkazy pro zobrazování volných či rezervovaných sedadel. Sedadla, která do výběru nepatří, jsou proškrtnuta (viz níže příkazy BUS a CLOSE). K tomu je potřeba, aby každé sedadlo v plánku bylo před i za číslem odděleno mezerou. Další součásti (popis, umístění sedadla řidiče, dveří, toalety atd.) jsou zcela libovolné. Příklad textového plánku následuje.
    Irisbus Iliade
    +   -----------------   -------------------+
    |    1  8  9 16 17 WC    28 29 36 37 44 45 |
    |    2  7 10 15 18       27 30 35 38 43 46 |
    |                                       47 |
    |    3  6 11 14 19 22 23 26 31 34 39 42 48 |
    | D  4  5 12 13 20 21 24 25 32 33 40 41 49 |
    +------------------------------------------+
    
  • DELBUSPLAN
    Vymazání existujícího druhu autobusu z databáze. Operace úspěšně proběhne pouze v případě, že žádný autobus v databázi odkazovaný plán nevyužívá.
    Příklad:
    > DELBUSPLAN Karosa956
    OK
    
    Parameters
    názevsymbolické jméno plánu autobusu k vymazání
  • ADDBUS
    Přidání autobusového spoje do databáze. Spoj je určen počátečním a cílovým městem a časem odjezdu - tento souhrn údajů musí být jedinečný. Zároveň je mu přiřazeno číslo linky (např. pro pozdější návaznost na jízdní řád apod.) a druh autobusu, který mj. určuje i počet sedadel.
    Příklad:
    > ADDBUS 1026 "Usti nad Labem" pha 13:36 Karosa956
    OK. Bus number: 615
    
    Parameters
    linkačíslo autobusové linky
    počátekpočáteční město autobusové linky (může být i alias)
    koneckoncové město autobusové linky (může být i alias)
    odjezdčas odjezdu z počátečního města, povolené formáty jsou typu 7:32 pro autobusy, které odjíždění stejného dne nebo 7:32-2.10.2013 s určením datumu
    plánsymbolické jméno plánu autobusu
  • DELBUS
    Vymazání autobusového spoje z databáze. Není možné vymazat autobus s povolenými rezervacemi, který ještě neodjel (čas odjezdu je větší než aktuální čas).
    Příklad:
    > DELBUS 615
    OK.
    
    Parameters
    autobusčíslo autobusovu k vymazání
  • CLEAR
    Hromadné vymazání nepotřebných objektů z databáze, konkrétní chování je závislé na uvedeném parametru.
    Příklad:
    > CLEAR CITY
    OK. Deleted items: 6.
    
    Parameters
    druhurčení typu objektů k vymazání, přípustné hodnoty jsou:
    BUS - provede vymazání všech autobusových spojů, které odjely (tj. jejichž čas odjezdu je menší než aktuální čas na počítači),
    CITY - provede vymazání měst (včetně odpovídajících aliasů), která nejsou použita žádným autobusovým spojem,
    PLAN - provede vymazání všech plánů autobusů, které nejsou využity.

Rezervace sedadel

  • FIND
    Nalezení autobusového spoje určeného počátečním a cílovým městem (případně aliasem) a časem odjezdu. Je vypsána sada nejbližích spojů nalezených v databázi, další sadu je možné vypsat pomocí příkazu NEXT. Velikost sady je v současnosti nastavena na 3.
    Příklad:
    > FIND Praha "Hradec Kralove" 5:30
    ID   LINE FROM                TO                  TIME                PLAN
    7    1023 Praha               Hradec Kralove      05:50-29.12.2013    Karosa956
    9    1024 Praha               Hradec Kralove      07:04-29.12.2013    Karosa956
    11   1023 Praha               Hradec Kralove      14:00-29.12.2013    KarosaAxer
    > NEXT
    ID   LINE FROM                TO                  TIME                PLAN
    12   1023 Praha               Hradec Kralove      15:00-18.12.2013    KarosaAxer
    13   1023 Praha               Hradec Kralove      16:00-18.12.2013    KarosaAxer
    14   1023 Praha               Hradec Kralove      17:00-18.12.2013    KarosaAxer
    > NEXT
    No buses found.
    
    Parameters
    počátekpočáteční město autobusového spoje (případně alias)
    cílcílové město nebo alias autobusového spoje
    odjezdčas odjezdu z počátečního města (lze použít oba formáty - obecný i zkrácený pro dnešní den - jak je popsáno u příkazu ADDBUS výše)
  • NEXT
    Vypsání další sady nalezených autobusů, více viz popis příkazu FIND výše.
  • BUS
    Zvolení autobusu pro rezervace sedadel. Následně je zobrazen plánek autobusu a seznam volných sedadel (tj. těch, která je možno rezervovat). Příklad:
    > BUS 14
    OK
    ID   LINE FROM                TO                  TIME                PLAN
    14   1023 Praha               Hradec Kralove      17:00-29.12.2013    KarosaAxer
    Bus plan:
    Karosa Axer
    +   ----------------   --------------------+
    |    1  -  9 13 17       25 29 33 37 41 -- |
    |    2  - 10 14 18       26 30 -- 38 42 -- |
    |                                       47 |
    |    3  7 11 -- -- 21 23 27 31 -- 39 43 48 |
    | D  4  8 12 16 20 22 24 28 32 36 40 44 49 |
    +------------------------------------------+
    
    Free seats: 1-4 7-14 16-18 20-33 36-44 47-49 (total: 41)
    
    Parameters
    autobusčíslo autobusu pro provádění rezervací (lze vyhledat pomocí FIND a NEXT)
  • RESERVE
    Rezervace sedadel v aktuálně vybraném autobuse (viz příkaz BUS). Existují dvě varianty příkazu - buď uvedeme seznam konkrétních sedadel k rezervaci nebo pouze počet požadovaných sedadel a necháme jejich výběr na systému. Příkaz vypíše nabízená sedadla a čeká na potvrzení. V kladném případě provede rezervaci a vypíše potvrzení. To obsahuje všechny potřebné údaje včetně jedinečného zákaznického čísla, které je vyžadováno při případném rušení rezervace (viz UNLOCK).
    Příklad 1 (se zadáním konkrétních sedadel):
    > RESERVE 25,26,29,30
    Seats to be reserved:  25 26 29 30
    Write 'y' to continue: y
    OK
    
    Your ticket:
    
    USER ID  BUS ID  CITY FROM           CITY TO             LEAVE TIME
    2        14      Praha               Hradec Kralove      17:00-18.12.2013
    Reserved seats:  25-26 29-30
    
    Příklad 2 (se zadáním počtu požadovaných sedadel):
    > RESERVE #6
    Seats to be reserved:  1-6
    Write 'y' to continue: y
    OK
    
    Your ticket:
    
    USER ID  BUS ID  CITY FROM           CITY TO             LEAVE TIME
    3        141     Karlovy Vary        Plzen               07:34-18.12.2013
    Reserved seats:  1-6
    
    Parameters
    seznamvarianta 1 - seznam sedadel požadovaných k rezervaci (čísla oddělená čárkami)
    početvarianta 2 - počet sedadel požadovaných k rezervaci (číslo uvozené #)
    Současně s vypsáním nabídky sedadel je provedeno jejich dočasné zarezervování, takže sedadla jsou pro ostatní zákazníky blokována. Teprve po potvrzení je rezervace definitivní. Při odmítnutí jsou dotčená sedadla ihned uvolněna, bez odezvy (např. při výpadku spojení se serverem) jsou po uplynutí ochranné doby pokládána za volná.
  • UNLOCK
    Zrušení rezervace (celé nebo částečné) v aktuálně zvoleném autobuse (viz příkaz BUS). Je vyžadováno číslo zákazníka vypsané na potvrzení o rezervaci.
    Příklad 1 (se zadáním konkrétních sedadel):
    > UNLOCK 2 25,26
    OK
    Unlocked seats: 25-26 (total: 2)
    
    Příklad 2 (storno všech sedadel rezervovaných zákazníkem):
    > UNLOCK 2
    OK
    Unlocked seats: 25-26 29-30 (total: 4)
    
    Parameters
    zákazníkjedinečné číslo zákazníka, pod nímž byla rezervace provedena
    seznamnepovinný - seznam sedadel ke zrušení rezervace (čísla oddělená čárkami)
    Vzhledem ke skutečnosti, že každá rezervace je provedena s unikátním číslem zákazníka, nehrozí nebezpečí zrušení cizí rezervace (číslo na potvrzení musí pochopitelně zkontrolovat obsluha terminálu).
  • CLOSE
    Ukončení dalších rezervací v tomto autobuse a vytištění plánku autobusu s rezervovanými sedadly pro řidiče, který podle tohoto plánku rozmístí na sedadla cedulky s místenkou.
    Příklad:
    > CLOSE 5
    OK
    ID   LINE FROM                TO                  TIME                PLAN
    5    1011 Praha               Ceske Budejovice    16:20-29.12.2013    Irisbus
    Bus plan:
    Irisbus Iliade
    +   -----------------   -------------------+
    |    -  -  - 16 -- WC    -- -- -- -- -- -- |
    |    -  - -- 15 --       -- 30 35 38 -- -- |
    |                                       47 |
    |    -  - -- -- -- -- -- -- -- -- -- -- 48 |
    | D  -  - -- -- -- -- -- -- -- -- -- -- -- |
    +------------------------------------------+
    
    Reserved seats: 15-16 30 35 38 47-48 (total: 7)
    
    Parameters
    autobusčíslo autobusu

Ostatní

  • CITY
    Vypsání existujících měst v databázi. Bez parametrů vypíše všechna města a všechny aliasy, s jedním parametrem se zúží hledání mezi městy a aliasy tak, že vypíše všechny názvy začínající dle parametru.
    Příklad 1:
    > city
    Brno
    Ceske Budejovice
    Pardubice
    Plzen
    Praha
    Usti nad Labem
    Zlin
    brno -> Brno
    cb -> Ceske Budejovice
    pardubice -> Pardubice
    pce -> Pardubice
    pha -> Praha
    plzen -> Plzen
    usti -> Usti nad Labem
    zlin -> Zlin
    
    Příklad 2:
    > city Pr
    Praha
    Pr -> Praha
    Prh -> Praha
    
    Parameters
    prefixnepovinný - všechny nalezené výsledky budou obsahovat tento parametr jako svůj vlastní prefix
  • HELP
    Vypsání seznamu příkazů a stručné nápovědy ke každému z nich.
  • EXIT
    Ukončení práce s aplikací.