Konkurentné programovanie (ÚINF/KOPR/2012)

Obhajoby projektov: 2.2.2017 od 12:30 v SJ2P10. Obhajoby prebiehajú pred všetkými spolužiakmi formou ukážky funkčnosti projektu a odpovedaním na otázky k zdrojovému kódu hodnotiacich prípadne spolužiakov.

Opravné obhajoby projektov: 23.2.2015 od 15:00 v SJ2S07 (seminárna miestnosť UINF). Obhajoby prebiehajú pred všetkými spolužiakmi formou ukážky funkčnosti projektu a odpovedaním na otázky k zdrojovému kódu hodnotiacich prípadne spolužiakov. Trestom za neúspešnú, alebo nerealizovanú obhajobu niektorého z projektov 2.2.2017 je vypracovanie ďalšej verzie druhého zadania. Teda ak niekto neobháji 1 projekt, na opravnej obhajobe obhajuje 3 projekty, ak neobhájil oba projekty bude obhajovať štyri.

1. Projekt

Vytvorte klient-server aplikáciu na kopírovanie súboru. Požadované vlastnosti:

  • Sťahovanie súboru prebieha paralelne cez používateľom daný počet TCP soketov.
  • Toto sťahovanie je prerušiteľné tak, že ho je možné prerušiť, vypnúť program, napr. sa presunúť na iné miesto na internete a pri opätovnom pokuse o skopírovanie toto kopírovanie pokračuje od momentu prerušenia opäť paralelne cez rovnaký počet TCP soketov.
  • Grafické používateľské rozhranie obsahujúce aspoň
    • progressbar znázorňujúci percento skopírovania celého súboru
    • tlačidlo na prerušenie kopírovania a následné vypnutie programu
    • tlačidlo na opätovné pokračovanie v kopírovaní, ak je (pri spustení) zistené, že kopírovanie bolo prerušené
    • tlačidlo na úplné zrušenie kopírovania bez možnosti pokračovania, ktoré nezanechá na disku žiadnu stopu
  • Môžete si vybrať, či bude prebiehať kopírovanie zo servra na klienta alebo naopak, nie je potrebné programovať oba smery
  • Stačí uvažovať kopírovanie jedného súboru v rovnakom čase
  • Nie je potrebné programovať prehľadávač disku "na druhej strane" na výber súboru
  • Odporúčam nepoužívať vytváranie špeciálnych paketov s hlavičkami, ale posielať cez Socket.getOutputStream().write() po prípadných úvodných dohodách iba dáta. Uzatvorenie streamu sa dá odchytiť cez výnikmku IOException, keď sa zatvorí socket.
  • Program má byť schopný skopírovať bez problémov na lokálnej sieti, alebo v rámci localhostu aj 1GB súbor pod 1 minútu

2. Projekt

Startup chcemjest.sk chce postaviť aplikáciu na správu reštaurácií. Usúdila, že na tento účel je najlepšie postaviť webovú službu. Pre každú reštauráciu chceme evidovať jej názov, GPS lokáciu a zoznam hashtagov (napr. #veganska #bezlepkova alebo #steak #pizza)

Implementujte nasledovné operácie:

  • pridanie novej reštaurácie. Návratovou hodnotou je jednoznačný UUID identifikátor reštaurácie. Vstupom je reštaurácia s vyššie uvedenými atribútmi.
  • aktualizácia reštaurácie na základe identifikátora
  • odstránenie reštaurácie na základe identifikátora
  • získanie reštaurácie na základe identifikátora
  • vyhľadanie reštaurácií v geografickom okolí s použitím hashtagov. Umožnite napr. vyhľadať bezlepkové (#bezlepkova) reštaurácie v 5 km okolí.

Pri všetkých operáciách ošetrite situácie, keď sa reštaurácia v databáze nenachádza, a to rozumným spôsobom, ktorý klienta dostatočne oboznámi s chybovým stavom.

Implementáciu databázy zvoľte podľa vlastného uváženia. Nezabúdajte na to, že ku databáze reštaurácií budú pristupovať viacerí klienti naraz.

Zvoľte si aspoň jednu z nasledovných štyroch možností a plne ju implementujte. Zadanie, ktoré nespĺňa všetky požiadavky vo vybranej možnosti, bude zamietnuté. Pri zadaní sa hodnotí kvalita a spôsob implementácie.

I. SOAP webservice (od kódu k WSDL)

Implementujte SOAP webservice v štýle document/literal alebo RPC/encoded so všetkými vyššie uvedenými operáciami. Zverejnite WSDL so službou a vytvorte k nej klienta v ľubovoľnej technológii, pričom odporúčame použiť JAX-WS 2.0.

Demonštrujte funkčnosť servera i klienta -- odporúčaná forma sú unit testy.

II. SOAP webservice (od WSDL ku kódu)

Vytvorte ručne WSDL, ktoré popisuje ľubovoľnú z vyššie uvedenú operácií. Na základe tohto WSDL implementujte serverovskú a klientskú časť pre túto operáciu v ľubovoľnej technológii. Použite ľubovoľný štýl (i keď odporúčame document/literal.)

Demonštrujte funkčnosť servera i klienta -- odporúčaná forma sú unit testy.

III. REST webservice

Navrhnite a implementujte REST API pre všetky vyššie uvedené operácie na strane servera. Použite ľubovoľný vhodný framework: odporúčaný je Spring MVC (Spring Boot) alebo Restlet.

Implementujte klienta pre uvedenú webovú službu v odlišnej technológii / programovacom jazyku. Ak ste implementovali server v Jave, ste povinní implementovať klienta v odlišnom programovacom jazyku: napr. PHP / Python / Pascal a pod.

Demonštrujte funkčnosť servera i klienta -- odporúčaná forma sú unit testy.

IV. Akka aktor

Navrhnite a implementujte aktorov pre vyššie uvedené operácie.

Demonštrujte funkčnosť pre aktora nasadeného na lokálny počítač, ale aj pre prípad aktora bežiaceho na vzdialenom serveri. (Konfigurácia pre vzdialený beh je popísaná v tutoriáli na http://ics.upjs.sk/~novotnyr/blog/1568/akka-a-vzdialene-volanie-aktorov-pre-otacanie-retazcov).

Vyjasnenia

  • v prípade voľby variantu I. alebo II. môžete i klienta i server implementovať v rovnakej technológii na rovnakej platforme (JAX-WS server + JAX-WS klient).
  • v prípade voľby variantu III. REST musíte klientskú stranu implementovať v odlišnej technológii než server.

GitHub úložisko

Na GitHube budem zverejňovať úlohy riešené na cvičeniach

Obsah cvičení

Literatúra