Konkurentné programovanie (ÚINF/KOPR/2012)
Opravné obhajoby projektov: 1.3.2015 od 15:00 v SJSP17. 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. Všetci účastníci obhajujú svoje riešenie všetkých troch zadaní.
Obhajoby projektov: 9.2.2016 od 12:30 v SJ2P12. Obhajuje sa prvý projekt a jeden z variantov druhého projektu podľa voľby študenta. 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. Študenti, ktorí neprídu na túto obhajobu, alebo ich kód nebude spĺňať uvedené požiadavky v dostatočnom rozsahu, budú mať možnosť obhajoby v opravom termíne zhruba o 2 týždne neskôr. Na opravnom termíne už budú musieť obhajovať prvý projekt a obidva varianty druhého projektu.
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, či inak krájať dáta na chunky, 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 velky.hlad.sk chce postaviť aplikáciu na správu kuchárskych receptov. Usúdila, že na tento účel je najlepšie postaviť webovú službu.
Kuchársky recept obsahuje:
- názov receptu
- autora
- zoznam ingrediencí vrátane merných jednotiek (napr. 4 vajcia, 400 g hladkej múky, 1 lyžica cukru)
- postup prípravy.
Implementujte nasledovné operácie:
- pridanie receptu do databázy receptov. Návratovou hodnotou je jednoznačný UUID identifikátor receptu. Vstupom je recept s vyššie uvedenými vlastnosťami.
- aktualizácia receptu na základe identifikátora
- odstránenie receptu na základe identifikátora
- získanie receptu na základe identifikátora
- vyhľadanie receptov obsahujúcich zadané kľúčové slovo či slová. V tejto funkcionalite implementujte fulltextové vyhľadávanie, pričom algoritmus môže byť aj veľmi jednoduchý.
- vyhľadávanie receptov podľa ingrediencií. Pokryte situácie, keď máte doma napr. vajcia, múku a bravčové mäso a chcete vedieť, aké recepty si môžete pripraviť.
Pri všetkých operáciách ošetrite situácie, keď sa recept 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 receptov budú pristupovať viacerí klienti naraz.
Zvoľte si aspoň jednu z nasledovných možností (REST/SOAP).
I. SOAP webservice
Implementujte webovú službu s vyššie uvedenými operáciami. Služba nech je realizovaná v štýle document/literal alebo RPC/encoded. Zverejnite WSDL so službou a vytvorte k nej klienta.
Na implementáciu servera i klienta použite ľubovoľnú technológiu.
Demonštrujte funkčnosť servera i klienta -- odporúčaná forma sú unit testy.
II. REST webservice
Navrhnite a implementujte REST API pre 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.
Vyjasnenia
- v prípade voľby variantu I. SOAP 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 II. REST musíte klientskú stranu implementovať v odlišnej technológii než server.
SVN úložisko
Na SVN úložisku budem zverejňovať úlohy riešené na cvičeniach
Obsah cvičení
- 28.9.2015 - Cvičenie 1 - Úvod
- 5.10.2015 - Cvičenie 2 - Aktuálnosť a sprístupnenie stavu
- 12.10.2015 - Cvičenie 3 - Kompozícia vláknovo bezpečných tried
- 19.10.2015 - Cvičenie 4 - Konkurentné kolekcie
- 26.10.2015 - Cvičenie 5 - Koordinácia vlákien
- 9.11.2015 - Cvičenie 6 - Exekútory
- 16.11.2015 - Cvičenie 7 - Ukončovanie úloh, vlákien a exekútorov
- 23.11.2015 - Cvičenie 8 - Swing
- 30.11.2015 - Cvičenie 9 - Restlet
- prezentácia
- učebný text k Spring Boot
- Alternatíva s restletom:
- HTTP requester
- Cvičenie 10 - SOAP
- prezentácia
- http://www.w3.org/TR/soap/
- SoapUI
- Preferences-Tools - JAX-WS WSImport - c:\program files\java\jdk7\bin
- pravym na projekt - Generate Code - JAX-WS Artifacts - Source Directory - src projektu
- ak chceme to iného package tak treba napísať do akého
- učebný text
- Cvičenie 11 - SOAP z WSDL
Literatúra
- Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea: Java Concurrency in Practice