% options:
% thesis=B bachelor's thesis
% thesis=M master's thesis
% czech thesis in Czech language
% slovak thesis in Slovak language
% english thesis in English language
% hidelinks remove colour boxes around hyperlinks

\documentclass[thesis=M,czech]{FITthesis}[2012/06/26]

\usepackage[utf8]{inputenc} % LaTeX source encoded as UTF-8

\usepackage{graphicx} %graphics files inclusion
% \usepackage{amsmath} %advanced maths
% \usepackage{amssymb} %additional math symbols

\usepackage{lscape}
\usepackage{listings}
\usepackage{dirtree} %directory tree visualisation

% % list of acronyms
% \usepackage[acronym,nonumberlist,toc,numberedsection=autolabel]{glossaries}
% \iflanguage{czech}{\renewcommand*{\acronymname}{Seznam pou{\v z}it{\' y}ch zkratek}}{}
% \makeglossaries

\newcommand{\tg}{\mathop{\mathrm{tg}}} %cesky tangens
\newcommand{\cotg}{\mathop{\mathrm{cotg}}} %cesky cotangens

% % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
% ODTUD DAL VSE ZMENTE
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % %

\department{Katedra softwarového inženýrství}
\title{Databáze konferencí a publikací II}
\authorGN{Stanislav} %(křestní) jméno (jména) autora
\authorFN{Štipl} %příjmení autora
\authorWithDegrees{Bc. Stanislav Štipl} %jméno autora včetně současných akademických titulů
\author{Stanislav Štipl} %jméno autora bez akademických titulů
\supervisor{doc. Ing. Petr Fišer, Ph.D.}
\acknowledgements{Děkuji doc. Ing. Petru Fišerovi, Ph.D. za odborné vedení diplomové práce. Děkuji svým rodičům za podporu při studiu.}
\abstractCS{Tato diplomová práce se zabývá rozšířením aplikace pro správu konferencí a publikací, která je využívána na FIT ČVUT. Práce uvádí detailní popis a analýzu stávající aplikace. Na základě této analýzy je navrženo její rozšíření. Úpravy spočívají ve vylepšení uživatelské přívětivosti, zavedení evidence referencí, citací a jejich rozpoznání, evidence vlastních publikací uživatele, zavedení uživatelských štítků u publikací, zavedení možnosti uvádět více ISBN/ISSN u časopisů, ročníků konferencí a publikací a dalších drobnějších úpravách.}
\abstractEN{The thesis presents extension of Web application for publication and conference management software used at the Faculty of Information Technology of Czech Technical University in Prague. The thesis describes and analyses the current application. On the basis of this analysis an extension of the application is designed. The revision improves user interface and implements possibility to add references and citations, their recognition, to keep a record of user's own publications, user's own tags for publications, possibility to add more ISBN/ISSN to journals, conference years and publications as well as additional minor modifications.}
\placeForDeclarationOfAuthenticity{V~Praze}
\declarationOfAuthenticityOption{4} %volba Prohlášení (číslo 1-6)
\keywordsCS{Správa publikací, správa konferencí, aplikace, reference, citace, štítky, webová aplikace, Nette, MySQL.}
\keywordsEN{Publication management software, conference management software, references, citations, tags, Web application, Nette, MySQL.}
% \website{http://site.example/thesis} %volitelná URL práce, objeví se v tiráži - úplně odstraňte, nemáte-li URL práce

\begin{document}

% \newacronym{CVUT}{{\v C}VUT}{{\v C}esk{\' e} vysok{\' e} u{\v c}en{\' i} technick{\' e} v Praze}
% \newacronym{FIT}{FIT}{Fakulta informa{\v c}n{\' i}ch technologi{\' i}}

\begin{introduction}
Po celém světě se pořádá velké množství odborných konferencí a vzniká řada vědeckých publikací. Jejich množství každým dnem stoupá a současně s tím se objevuje i požadavek, jak se v takovém množství nových informací co nejlépe orientovat a využívat je. Touto problematikou se zabývají i jednotlivé vysoké školy a vědecké ústavy, které musí ve své činnosti vycházet z již publikovaných údajů.

Skupina pedagogů a~studentů z~ČVUT pro své potřeby vyvinula aplikaci, která slouží pro správu publikací a~konferencí. Tato aplikace byla postupně vyvíjena v~rámci několika bakalářských a~diplomových prací. Má práce přímo navazuje na~bakalářskou práci \cite{svoboda} a~diplomovou práci \cite{kubalek}. Na základě požadavků uživatelů aplikace se ji snaží dále rozšířit a~opravit případné nedostatky.
\end{introduction}

\chapter{Cíl práce}
Zadání práce ukládá pokračovat ve vývoji stávající aplikace pro evidenci konferencí a~publikací. Konkrétně jsou v zadání zmíněny následující body:
\begin{itemize}
	\item odstranění drobných chyb, vylepšení uživatelské přívětivosti,
	\item zavedení pojmu \uv{citace publikace},
	\item zavedení automatického rozpoznávání referencí publikace, alespoň nějakým jednoduchým způsobem,
	\item zavedení správy \uv{vlastních} (autorských) publikací a~správy citací,
	\item zavedení uživatelských \uv{tagů} u~publikací,
	\item vylepšení vyhledávání publikací (podle kombinace různých kritérií, vyhledávání podle poznámek, tagů).
\end{itemize}
Níže se jednotlivým bodům věnuji podrobněji.

\section{Odstranění drobných chyb}
Při používání aplikace uživatelé postupně zjišťovali chyby a~nedostatky, které je třeba opravit. Další chyby pak byly způsobeny mými úpravami. Chyby byly evidovány v~systému GitLab a~postupně jsem je opravoval.

\section{Vylepšení uživatelské přívětivosti}
Uživatelské rozhraní je implementováno ve frameworku Bootstrap. Ten zajišťuje jednotný vzhled různých částí aplikace a~možnost responzivního zobrazení. Aplikace často využívá modálních oken. Pro některé funkce jsou použity další JS knihovny na~straně klienta.
Vylepšení uživatelské přívětivosti v~tomto případě spočívá například v~umístění již existujících ovládacích prvků na~místa, kde budou pro uživatele snadněji dostupné.

\section{Zavedení pojmu citace publikace}
Aplikace eviduje jednotlivé publikace, ale neumí evidovat vztahy mezi nimi. Tedy žádným způsobem nezaznamenává, které další publikace jsou v publikaci citovány, nebo naopak, které ji citují. Ze zadání vyplývá potřeba doplnit možnost vazby mezi publikacemi formou citací.

\section{Zavedení automatického rozpoznávání referencí publikace}
Zavedení automatického rozpoznávání referencí publikace navazuje na~předchozí bod. Cílem je, aby nebylo nutné ručně vyhledávat každou citovanou publikaci, ale alespoň u~některých publikací došlo k automatickému rozpoznání na~základě zkopírovaného seznamu citací. Nutnou podmínkou pro rozpoznání je, že citované publikace musí být v~systému již vedeny.

\section{Zavedení správy vlastních (autorských) publikací}
Aplikace dosud nemá podporu pro to, že někdo z~jejích uživatelů je zároveň autorem některých publikací. Autoři publikací a~uživatelé jsou v~aplikaci vedeni zcela odděleně. Cílem tohoto bodu je zavést relaci mezi autory a~uživatele a~umožnit uživatelům správu vlastních publikací a~citací.

\section{Zavedení uživatelských tagů u publikací}
Podobně jako anotace, které již aplikace umí, budou \uv{tagy} (štítky) moci být zadávány každým uživatelem jako soukromé nebo veřejné. Na rozdíl od anotací však štítky budou nejprve vytvořeny na~jednom místě a~až následně přiřazeny ke konkrétním publikacím.

\section{Vylepšení vyhledávání publikací}
Aplikace v~současné době umí vyhledávat publikace, ale jen pomocí fulltextového vyhledávání v~kombinaci s~kategoriemi, které jsou spojeny pomocí logického součtu (OR) nebo součinu (AND). Kromě toho je k vyhledávání možné připojit filtr na~publikace označené hvězdičkou. Cílem vylepšení je umožnit složitější podmínky vyhledávání (kombinace podmínek) a~umožnit vyhledávání podle anotací, štítků atd.

\chapter{Analýza a návrh}
\section{Obecný popis stávající aplikace}

Aplikace slouží pro uchování informací o~vědeckých konferencích a~publikacích. Byla vyvinuta v~rámci několika bakalářských a~diplomových prací na~FEL a~FIT ČVUT.

\subsection{Správa konferencí}
Uživatelé mohou přidávat a~editovat konference a~jejich ročníky, přiřadit k~nim publikace a~workshopy. Záznam konference obsahuje její název, zkratku, její první ročník a~popis. Správce konferencí může u~každého ročníku označit příznak archivace, případně označit celou konferenci jako mrtvou. Každý uživatel konferencí může označovat ročníky konferencí uživatelskou hvězdičkou. Konference lze zařazovat do dvou typů kategorií. ACM kategorie \cite{acm} mají stromovou strukturu, zatímco vlastní kategorie stromovou strukturu nemají. Ročníky konferencí lze filtrovat podle klíčových slov, obou typů kategorií, stavu konference a~jejího označení uživatelskou hvězdičkou a~podle písmen anglické abecedy. Ročníky konferencí lze řadit podle názvu, zkratky, roku, místa a~několika dat. Výsledky filtrování jsou stránkované.

\subsection{Správa publikací}
Uživatelé mohou přidávat a~editovat publikace. Informace zaznamenávané u~publikace se liší podle typu publikace. Typy publikace vycházejí z formátu BibTex \cite{bibtex}. Nejčastějšími typy publikace jsou inproceedings (článek na základě konference) a article (článek v časopise). Nově přidaná publikace musí být schválena administrátorem. Publikace lze filtrovat podle klíčových slov, označení uživatelskou hvězdičkou a~podle písmen anglické abecedy. Výsledky filtrování jsou stránkované. Vedle toho lze publikace vyhledávat fulltextově, přičemž výsledek vyhledávání lze filtrovat podle logického součtu nebo logického součinu vlastních kategorií. Fulltextové vyhledávání prohledává i~nahrané dokumenty. Kromě hvězdiček mohou uživatelé k publikacím přidat vlastní anotace. Ty mohou být buď privátní (zobrazí se pouze danému uživateli a~administrátorovi) nebo globální (zobrazí se všem uživatelům). Je možné zobrazit citační záznamy publikací ve formátech definovaných administrátorem (např. ČSN ISO 690, IEEE, APA). Publikaci je také možné importovat z~formátů BibTex, EndNote a~RefWorks a~exportovat její údaje do těchto formátů.

\subsection{Ostatní funkce}
Uživatelé se do aplikace přihlašují přes SSO, konkrétně přes fakultní Shibboleth. Z~historických důvodů aplikace obsahuje také podporu pro LDAP a~pro přihlašování uživatelským jménem a~heslem. Ve třetím uvedeném případě je možné obnovit zapomenuté heslo pomocí e-mailu. Tato možnot však není dostupná uživatelům, kteří se přihlašují např. přes Shibooleth. Každý uživatelský účet může využívat právě jeden způsob autentizace. Administrátor může uživatelům přidělovat role, podle kterých se určují jejich oprávnění v~systému. Pro uživatele je dostupná změna hesla, přehled jejich anotací a~publikací a~možnost změny uživatelských nastavení. Administrátor dále může schvalovat zadané publikace a~spravovat autory, časopisy, vydavatele, formáty citací kategorie a~další hodnoty.

\section{Technický popis stávající aplikace}
Stávající aplikace pro evidenci konferencí a~publikací je webovou aplikací.

\subsection{Aplikace na straně serveru}
Aplikace je vytvořena ve frameworku Nette ve verzi 2.2. Uvedená verze frameworku je v~době psaní práce již zastaralá. Aplikace požaduje PHP ve verzi 5.3.7 nebo novější (v rámci řady 5). Na~serveru je aplikace provozována na~PHP ve verzi 5.6.32.

\subsection{Databáze}
Aplikace používá pro uložení dat (s výjimkou souborů, které jsou uloženy na~souborovém systému) relační databází MySQL. Při tvorbě nové aplikace bych zvolil robustnější řešení, například PostgreSQL, pro aplikaci je však MySQL zcela dostačující a~není důvod databázi měnit.

Pro rozpoznávání referencí bude třeba fulltextové vyhledávání. MySQL podporuje FULLTEXT indexy pro tabulky s~engine MyISAM a~od verze 5.6 i~pro tabulky InnoDB.

\subsection{Aplikace na straně klienta}
Pro vzhled využívá aplikace front-end framework Twitter Bootstrap. Dále jsou na~straně klienta použity JS knihovny jQuery, jQuery UI, jqxWidgets a~další. Použitá knihovna jQuery je ve verzi 1.11.1. Tato verze již dávno není podporována. Zastaralé jsou i~další knihovny. Jiné knihovny jsou sice do kódu vloženy, není však zřejmé, zda se skutečně využívají.

\section{Bezpečnost stávající aplikace}
Při zkoumání aplikace jsem narazil na~několik věcí, které nepovažuji z~hlediska zabezpečení za ideální. Tyto záležitosti popisuji níže. Zároveň však je třeba uvést, že se v~žádném případě nejedná o~vyčerpávající zkoumání zabezpečení aplikace. Tato problematika je velmi rozsáhlá a~pravděpodobně by vydala na~samostatnou diplomovou práci. Pro ověření bezpečnosti aplikace je možné použít OWASP Application Security Verification Standard Project \cite{owasp}.

\subsection{Spuštění vlastního kódu na serveru}
Aplikace umožňuje zadavateli publikací definovat formáty citací. Kromě toho, že způsob zadání formátů citací není příliš uživatelsky přívětivý (upravuje se přímo kód šablony latte), obsahuje v~sobě také bezpečnostní hrozbu. Do latte šablony je totiž možné vložit libovolný PHP kód. Samozřejmostí je zároveň možnost spouštět jakékoliv dotazy v~databázi. Protože funkce exec není v~instalaci PHP zakázaná, je zároveň možné získat shellový přístup k serveru pod uživatelem webového serveru. Není třeba dodávat, že pod stejným uživatelem běží i~další webové aplikace a~že k plnému ovládnutí serveru stačí, aby se objevila vhodná zranitelnost v~jádře operačního systému.

\subsection{Uložení hesel}
Pro ukládání hesel používá aplikace hashovací funkci SHA-512 s~5000 opakováními. Přestože hashovací funkce SHA-512 nebyla prolomena, pro účely ukládání hesel není vhodná z~důvodu příliš velké rychlosti výpočtu, zejména na~grafických kartách, a~to i~při použití 5000 opakování. Bylo by vhodnější použít funkce přímo navržené k učelu hashování hesel, například bcrypt, pbkdf2 nebo argon2. Nicméně většina uživatelů se do aplikace přihlašuje přes SSO, takže toto nepředstavuje zásadní problém.

\subsection{Zranitelnosti typu XSS}
Zranitelnosti typu XSS jsou typem útoku, kdy uživatel vloží do webové stránky škodlivý kód. Protože aplikace (s výjimkou přihlašovacího formuláře) není veřejně dostupná z~internetu, neměl by tento typ zranitelnosti být problematický. Aplikace slouží pouze přihlášeným uživatelům, kterým můžeme do značné míry důvěřovat. Nicméně teoreticky by bylo možné tento typ útoku zneužít ze strany běžného uživatele aplikace proti administrátorovi aplikace.
Základní ochranu proti XSS v podobě Context-Aware Escaping poskytuje framework Nette, resp. jeho šablonovací aplikace Latte \cite{latte}. Je důležité, aby programátor tuto ochranu nevypínal, pokud si není jistý bezpečností takového postupu v~daném konkrétním případě.

\subsection{Zranitelnosti typu CSRF}
Aplikace může obsahovat zranitelnosti typu CSRF. To by teoreticky útočníkovi umožňovalo například smazat publikaci prostřednictvím přihlášené oběti pomocí zaslání odkazu nebo jeho otevření v~rámci zcela jiného webu. V~minulosti se proti této zranitelnosti používaly jednorázové tokeny, ale dnes tomu lze bránit nastavením HTTP hlaviček.


\section{Požadavky na~úpravy aplikace}
\subsection{Funkční požadavky}
Ze zadání vyplývají následující funkční požadavky:
\begin{itemize}
	\item Evidence referencí a citací publikace
	\item Automatické rozpoznání referencí publikace
	\item Správa vlastních publikací
	\item Evidence štítků u~publikací
	\item Rozšířené vyhledávání publikací
\end{itemize}
Další funkční požadavkek vyplynul z~konzultací:
\begin{itemize}
	\item Přiřazení více ISBN a~ISSN publikaci, ročníku konference a~časopisu
\end{itemize}

Evidence referencí publikace znamená, že u každé publikace bude dostupný seznam publikací, které tato publikace cituje. Tento seznam se u publikace neobjeví automaticky, ale je jej možné zadat dvěma způsoby:
\begin{itemize}
    \item{výběrem z dostupných publikací}, kdy uživatel vybere ze seznamu citovanou publikaci,
    \item{zadáním textového řádku reference}, kdy uživatel zadá text reference (typicky zkopírovaný z odpovídající části publikace).
\end{itemize}

Textové řádky reference se budou zadávat ve formě seznamu. Typicky uživatel zkopíruje všechny reference z dané publikace (každou na samostatný řádek).

Aplikace se bude snažit zadané textové reference rozpoznávat. Bude tak činit dvěma způsoby.

První způsob spočívá v tom, že se aplikace při zadávání textových referencí pomocí parseru pokusí z textového řádku získat název publikace. Pokud se tento název shoduje s některou z publikací v databázi, je velmi pravděpodobné, že se jedná o identickou publikaci. Proto bude aplikace takto nalezené publikace nabízet administrátorovi ke schválení.

Druhý způsob vychází z MySQL FULLTEXT indexu. Aplikace umožní uživateli u textové reference provést výběr publikace ze seznamu tak, že nabízené publikace budou seřazeny podle shody na základě FULLTEXT indexu. Pokud se citovaná publikace v databází nachází, je velice pravděpodobné, že bude v seznamu na prvním místě. V případě, že publikace v databázi není, bude aplikaci přesto nabízet publikaci s \uv{nejbližším} podobným názvem. Z tohoto důvodu nebude aplikace takto rozpoznané publikace nabízet administrátorovi ke schválení, ale nechá pouze na zadavateli publikací, zda je bude chtít zkontrolovat jednotlivě.

Evidence citací je jen opačnou stranou stejné relace. U citované publikace se zobrazí seznam publikací, které ji citují. Na této straně relace není možné citace upravovat, jen mazat.

Správa vlastních publikací znamená především spojení mezi autorem publikací a uživatelem. Uživatel pak může zobrazovat vlastní publikace.

Evidence štítků u publikací znamená možnost vytvářet uživatelské štítky a tyto přiřazovat k publikacím. Podobně jako anotace mohou být tyto štítky veřejné nebo privátní.

Rozšířené vyhledávání zohlední nově přidané možnosti pro vyhledávání publikací. Zároveň také umožní vyhledávání podle kategorií, které je v současné době poněkud problematické.

Přiřazení více ISBN a ISSN k publikaci, ročníku konference a časopisu umožní mít u každé publikace libovolný počet ISBN/ISSN.

\subsection{Nefunkční požadavky}
Uvádím všechny nefunkční požadavky, které má aplikace splňovat.
\begin{itemize}
	\item Webová aplikace
	\item Uživatelská přívětivost
	\item Bezpečnost
\end{itemize}

Aplikace byla od počátku vyvíjena jako webová aplikace a není možné ani vhodné na tom něco měnit. Výhodou je možnost použití na různých zařízeních a operačních systémech bez nutnosti něco instalovat na klientské počítače. Další výhodou je snadná správa, kdy případné aktualizace je možné provádět na serveru, tedy na jednom místě.

Uživatelská přívětivost je dána použitým front-end frameworkem, javascriptovými knihovnami a rozmístěním jednotlivých prvků. Na základě konkrétních připomínek uživatelů provádím změny směřující k jejímu vylepšení.

Přestože otázka bezpečnosti není hlavním předmětem této práce, podařilo se mi najít několik míst, kde bylo možné provést úpravy směřující k lepší bezpečnosti aplikace.

\section{Role v systému}
Role vycházejí z~původního systému. Není třeba vytvářet nové role ani rušit některou z~rolí. Obrázek \ref{fig:roles} ukazuje role v~systému.
\begin{figure}\centering
 	\includegraphics[width=0.5\textwidth]{roles}
 	\caption[Role v systému]{Role v systému}\label{fig:roles}
\end{figure}

\subsection{Host}
Výchozí role. Může se přihlásit do systému, čímž se stane přihlášeným uživatelem s jednou nebo více dalšími rolemi. Dále může požádat o obnovu zapomenutého hesla.

\subsection{Čtenář publikací}
Čtenář publikací může vyhledávat, filtrovat a~zobrazovat publikace a~pracovat s~vlastním uživatelským profilem.

\subsection{Zadavatel publikací}
Zadavatel publikací může provádět vše, co Čtenář publikací. Navíc může spravovat autory publikací, kategorie publikací, formáty citací, skupiny, časopisy a~především publikace.

\subsection{Uživatel konferencí}
Uživatel konferencí může zobrazovat konference a~svůj uživatelský profil.

\subsection{Moderátor konferencí}
Moderátor konferencí může provádět to, co Uživatel konferencí. Navíc může spravovat kategorie konferencí a~ACM kategorie, skupiny, konference a~seznam veřejných databází publikací.

\subsection{Administrátor}
Administrátor může vše, co Zadavatel publikací a~Moderátor konferencí. Navíc může spravovat uživatele a~nastavení systému.

\section{Případy užití}
Níže uvádím případy užití, které jsou v~rámci této práce nové nebo dochází k jejich zásadní úpravě. Některé úpravy v~rámci práce vyžadují jen drobnou změnu stávajících případů užití, a~proto je zde nerozepisuji. Jedná se zejména~o tyto úpravy:
\begin{itemize}
        \item odstranění drobných chyb, vylepšení uživatelské přívětivosti,
        \item zavedení více ISBN a ISSN u~ročníků konferencí, časopisů a~publikací,
        \item vylepšení vyhledávání publikací (podle kombinace různých kritérií, vyhledávání podle poznámek, tagů).
\end{itemize}

Obrázek \ref{fig:UC} ukazuje případy užití, které budu přidávat do aplikace nebo je významněji upravovat.

\begin{figure}\centering
 	\includegraphics[width=1\textwidth]{UC}
 	\caption[Případy užití]{Případy užití}\label{fig:UC}
\end{figure}

\subsection{UC 1 - Zobrazit seznam referencí}
\begin{description}
	\item[Aktéři] Čtenář publikací, systém
	\item[Počáteční podmínky] Čtenář publikací se nachází v~detailu publikace
	\item[Hlavní scénář]
\end{description}
\begin{enumerate}
	\item Případ užití začíná, když Čtenář publikací chce zobrazit reference.
	\item Čtenář publikací zvolí funkci \uv{zobrazit seznam referencí}.
	\item Systém zobrazí seznam referencí publikace.
\end{enumerate}

\subsection{UC 2 - Přidat referenci}
\begin{description}
	\item[Aktéři] Zadavatel publikací, systém
	\item[Počáteční podmínky] Zadavatel publikací se nachází v~seznamu referencí u~publikace
	\item[Hlavní scénář]
\end{description}
\begin{enumerate}
	\item Případ užití začíná, když Zadavatel publikací chce přidat referenci.
	\item Zadavatel publikací zvolí funkci \uv{přidat referenci}.
	\item Systém nabídne seznam publikací.
	\item Zadavatel publikací vybere citovanou publikaci a~zvolí \uv{uložit}.
	\item Systém uloží referenci k publikaci.
\end{enumerate}
\begin{description}
	\item[Alternativní scénář]
\end{description}
\begin{enumerate}
  \setcounter{enumi}{3}
	\item Zadavatel publikací zvolí možnost \uv{zrušit}.
	\item Systém změny neuloží.
\end{enumerate}

\subsection{UC 3 - Přidat seznam textových referencí}
\begin{description}
	\item[Aktéři] Zadavatel publikací, systém
	\item[Počáteční podmínky] Zadavatel publikací se nachází v~seznamu referencí u~publikace
	\item[Hlavní scénář]
\end{description}
\begin{enumerate}
	\item Případ užití začíná, když Zadavatel publikací chce přidat textové reference k publikaci.
	\item Zadavatel publikací zvolí funkci \uv{přidat seznam referencí}.
	\item Systém nabídne prostor pro zadání referencí.
	\item Zadavatel publikací zadá seznam referencí v~textové podobě, každou referencí na~jeden řádek a zvolí \uv{uložit}.
	\item Systém uloží seznam referencí k publikaci.
\end{enumerate}
\begin{description}
	\item[Alternativní scénář]
\end{description}
\begin{enumerate}
  \setcounter{enumi}{3}
	\item Zadavatel publikací zvolí možnost \uv{zrušit}.
	\item Systém změny neuloží.
\end{enumerate}

\subsection{UC 4 - Úpravit textovou referenci}
\begin{description}
	\item[Aktéři] Zadavatel publikací, systém
	\item[Počáteční podmínky] Zadavatel publikací se nachází v~seznamu referencí u~publikace
	\item[Hlavní scénář]
\end{description}
\begin{enumerate}
	\item Případ užití začíná, když Zadavatel publikací chce upravit textovou referenci.
	\item Zadavatel publikací zvolí u~reference, kterou chce upravit, funkci \uv {upravit referenci}. Tato funkce je dostupná jen u~textových referencí, ne u~referencí zadaných formou výběru z~dostupných publikací.
	\item Systém nabídne text reference k úpravě.
	\item Zadavatel publikací upraví referenci a~vybere volbu \uv{uložit}.
	\item Systém uloží změny reference.
\end{enumerate}
\begin{description}
	\item[Alternativní scénář]
\end{description}
\begin{enumerate}
  \setcounter{enumi}{3}
	\item Zadavatel publikace zvolí možnost \uv{zrušit}.
	\item Systém změny neuloží.
\end{enumerate}

\subsection{UC 5 - Rozpoznat textovou referenci}
\begin{description}
	\item[Aktéři] Zadavatel publikací, systém
	\item[Počáteční podmínky] Zadavatel publikací se nachází v~seznamu referencí u~publikace
	\item[Hlavní scénář]
\end{description}
\begin{enumerate}
	\item Případ užití začíná, když Zadavatel publikací chce rozpoznat textovou referenci.
	\item Zadavatel publikací zvolí u~reference, kterou chce rozpoznat, volbu \uv{rozpoznat referenci}. Tato funkce je dostupná u~textově zadaných referencí, ne u~referencí zadaných formou výběru.
	\item Systém nabídne seznam publikací v~pořadí podle pravděpodobnosti (od nejvyšší k nejnižší), že odpovídají dané textové referenci.
	\item Zadavatel publikací vybere publikaci a~zvolí volbu \uv{uložit}.
	\item Systém uloží referenci. Tím se z~textové reference stane reference zadaná formou výběru.
\end{enumerate}
\begin{description}
	\item[Alternativní scénář]
\end{description}
\begin{enumerate}
  \setcounter{enumi}{3}
	\item Zadavatel publikací nevybere žádnou z~nabízených publikací a~zvolí \uv{zrušit}.
	\item Systém změny neuloží.
\end{enumerate}

\subsection{UC 6 - Smazat referenci}
\begin{description}
	\item[Aktéři] Zadavatel publikací, systém
	\item[Počáteční podmínky] Zadavatel publikací se nachází v~seznamu referencí u~publikace
	\item[Hlavní scénář]
\end{description}
\begin{enumerate}
	\item Případ užití začíná, když Zadavatel publikací chce smazat referenci.
	\item Zadavatel publikací zvolí u~reference, kterou chce smazat, funkci \uv{smazat}. Tato funkce je dostupná jak u~textově zadaných referencí, tak u~referencí zadaných formou výběru.
	\item Systém se zeptá na~potvrzení, zda má skutečně provést smazání reference.
	\item Zadavatel publikací potvrdí smazání reference volbou \uv{potvrdit}.
	\item Systém smaže referenci.
\end{enumerate}
\begin{description}
	\item[Alternativní scénář]
\end{description}
\begin{enumerate}
  \setcounter{enumi}{3}
	\item Zadavatel publikací zvolí \uv{zrušit}.
	\item Systém změny neuloží.
\end{enumerate}


\subsection{UC 7 - Zobrazit seznam referencí ke schválení}
\begin{description}
	\item[Aktéři] Administrátor, systém
	\item[Počáteční podmínky] Administrátor je přihlášený do systému
	\item[Hlavní scénář]
\end{description}
\begin{enumerate}
	\item Případ užití začíná, když Administrátor chce schválit rozpoznané reference.
	\item Administrátor zvolí funkci \uv{zobrazit seznam referencí ke schválení}.
	\item Systém zobrazí seznam referencí ke schválení.
\end{enumerate}

\subsection{UC 8 - Změnit stav reference}
\begin{description}
	\item[Aktéři] Administrátor, systém
	\item[Počáteční podmínky] Administrátor se nachází v~seznamu referencí ke schválení
	\item[Hlavní scénář]
\end{description}
\begin{enumerate}
	\item Případ užití začíná, když Administrátor chce změnit stav reference v~seznamu referencí ke schválení.
	\item Administrátor zvolí funkci \uv{schválit referenci} u~reference, kterou chce schválit.
	\item Systém nastaví referenci jako schválenou a~vyřadí ji ze seznamu referencí ke schválení.
\end{enumerate}
\begin{description}
	\item[Alternativní scénář]
\end{description}
\begin{enumerate}
  \setcounter{enumi}{1}
	\item Administrátor zvolí funkci \uv{zrušit referenci} u~reference, kterou chce zrušit.
	\item Systém vyřadí referenci ze seznamu referencí ke schválení.
\end{enumerate}

\subsection{UC 9 - Zobrazit seznam citací}
\begin{description}
	\item[Aktéři] Čtenář publikací, systém
	\item[Počáteční podmínky] Čtenář publikací se nachází v~detailu publikace
	\item[Hlavní scénář]
\end{description}
\begin{enumerate}
	\item Případ užití začíná, když Čtenář publikací chce zobrazit citace.
	\item Čtenář publikací zvolí funkci \uv{zobrazit seznam citací}.
	\item Systém zobrazí seznam referencí publikace.
\end{enumerate}

\subsection{UC 10 - Smazat citaci}
\begin{description}
	\item[Aktéři] Zadavatel publikací, systém
	\item[Počáteční podmínky] Zadavatel publikací se nachází v~seznamu citací u~publikace
	\item[Hlavní scénář]
\end{description}
\begin{enumerate}
	\item Případ užití začíná, když Zadavatel publikací chce smazat citaci.
	\item Zadavatel publikací zvolí u~citace, kterou chce smazat, funkci \uv{smazat}.
  \item Systém se zeptá na~potvrzení, zda má skutečně provést smazání citace.
	\item Zadavatel publikací potvrdí smazání citace volbou \uv{potvrdit}.
	\item Systém smaže citaci.
\end{enumerate}
\begin{description}
	\item[Alternativní scénář]
\end{description}
\begin{enumerate}
  \setcounter{enumi}{3}
	\item Zadavatel publikací zvolí \uv{zrušit}.
	\item Systém změny neuloží.
\end{enumerate}


\subsection{UC 11 - Zobrazit vlastní publikace}
\begin{description}
	\item[Aktéři] Zadavatel publikací, systém
	\item[Počáteční podmínky] Zadavatel publikací se nachází v~seznamu publikací
	\item[Hlavní scénář]
\end{description}
\begin{enumerate}
	\item Případ užití začíná, když Zadavatel publikací chce zobrazit vlastní publikace.
	\item Zadavatel publikací zvolí filtr \uv{zobrazit vlastní publikace}.
	\item Systém zobrazí stránkovaný seznam publikací daného uživatele. Uživatel může publikace dále filtrovat podle dalších kritérií.
\end{enumerate}

\subsection{UC 12 - Zobrazit vlastní štítky}
\begin{description}
	\item[Aktéři] Zadavatel publikací, systém
	\item[Počáteční podmínky] Zadavatel publikací je přihlášen do systému
	\item[Hlavní scénář]
\end{description}
\begin{enumerate}
	\item Případ užití začíná, když Zadavatel publikací chce zobrazit seznam vlastních štítků.
	\item Zadavatel publikací zvolí funkci \uv{zobrazit seznam vlastních štítků}.
	\item Systém zobrazí štítky přihlášeného zadavatele publikací.
\end{enumerate}

\subsection{UC 13 - Vytvořit vlastní štítek}
\begin{description}
	\item[Aktéři] Zadavatel publikací, systém
	\item[Počáteční podmínky] Zadavatel publikací se nachází v~seznamu vlastních štítků
	\item[Hlavní scénář]
\end{description}
\begin{enumerate}
	\item Případ užití začíná, když Zadavatel publikací chce vytvořit štítek.
	\item Zadavatel publikací zvolí funkci \uv{vytvořit štítek}.
	\item Systém nabídne možnost zadání názvu štítku a~volbu, zda je privátní nebo globální.
	\item Zadavatel publikací vyplní název štítku, jeho viditelnost a~zvolí \uv{uložit}.
	\item Systém uloží štítek.
\end{enumerate}
\begin{description}
	\item[Alternativní scénář]
\end{description}
\begin{enumerate}
  \setcounter{enumi}{3}
	\item Zadavatel publikací zvolí možnost \uv{zrušit}.
	\item Systém změny neuloží.
\end{enumerate}

\subsection{UC 14 - Úprava vlastního štítku}
\begin{description}
	\item[Aktéři] Zadavatel publikací, systém
	\item[Počáteční podmínky] Zadavatel publikací se nachází v~seznamu vlastních štítků
	\item[Hlavní scénář]
\end{description}
\begin{enumerate}
	\item Případ užití začíná, když Zadavatel publikací chce upravit štítek.
	\item Zadavatel publikací zvolí funkci \uv{upravit štítek} u~konkrétního štítku.
	\item Systém nabídne možnost změny názvu štítku a~volby, zda je privátní nebo globální.
	\item Zadavatel publikací vyplní název štítku, jeho viditelnost a~zvolí \uv{uložit}.
	\item Systém uloží štítek.
\end{enumerate}
\begin{description}
	\item[Alternativní scénář]
\end{description}
\begin{enumerate}
  \setcounter{enumi}{3}
	\item Zadavatel publikací zvolí možnost \uv{zrušit}.
	\item Systém změny neuloží.
\end{enumerate}

\subsection{UC 15 - Smazání vlastního štítku}
\begin{description}
	\item[Aktéři] Zadavatel publikací, systém
	\item[Počáteční podmínky] Zadavatel publikací se nachází v~seznamu vlastních štítků
	\item[Hlavní scénář]
\end{description}
\begin{enumerate}
	\item Případ užití začíná, když Zadavatel publikací chce smazat štítek.
	\item Zadavatel publikací zvolí funkci \uv{smazat štítek} u~konkrétního štítku.
	\item Systém se zeptá na~potvrzení smazání štítku.
	\item Zadavatel publikací potvrdí smazání štítku volbou \uv{potvrdit}.
	\item Systém vymaže štítek.
\end{enumerate}
\begin{description}
	\item[Alternativní scénář]
\end{description}
\begin{enumerate}
  \setcounter{enumi}{3}
	\item Zadavatel publikací zvolí možnost \uv{zrušit}.
	\item Systém neprovede vymazání štítku.
\end{enumerate}

\subsection{UC 16 - Zobrazení štítků u publikace}
\begin{description}
	\item[Aktéři] Čtenář publikací, systém
	\item[Počáteční podmínky] Čtenář publikací se nachází v~detailu publikace
	\item[Hlavní scénář]
\end{description}
\begin{enumerate}
	\item Případ užití začíná, když Čtenář publikací chce zobrazit seznam štítků u~publikace.
	\item Čtenář publikací zvolí funkci \uv{zobrazit štítky}.
	\item Systém zobrazí všechny globální štítky k dané publikaci a~privátní štítky aktuálního uživatele k dané publikaci.
\end{enumerate}

\subsection{UC 17 - Přidání štítku k publikaci}
\begin{description}
	\item[Aktéři] Zadavatel publikací, systém
	\item[Počáteční podmínky] Zadavatel publikací se nachází v~seznamu štítků u~publikace
	\item[Hlavní scénář]
\end{description}
\begin{enumerate}
	\item Případ užití začíná, když Zadavatel publikací chce přidat štítek k publikaci.
	\item Zadavatel publikací zvolí funkci \uv{přidat štítek}.
	\item Systém nabídne seznam štítků uživatele.
	\item Zadavatel publikací vybere štítek a~zvolí \uv{uložit}.
	\item Systém uloží štítek k publikaci.
\end{enumerate}
\begin{description}
	\item[Alternativní scénář]
\end{description}
\begin{enumerate}
  \setcounter{enumi}{3}
	\item Zadavatel publikací zvolí možnost \uv{zrušit}.
	\item Systém změny neuloží.
\end{enumerate}


\subsection{UC 18 - Odebrání štítku od publikace}
\begin{description}
	\item[Aktéři] Zadavatel publikací, systém
	\item[Počáteční podmínky] Zadavatel publikací se nachází v~seznamu štítků u~publikace
	\item[Hlavní scénář]
\end{description}
\begin{enumerate}
	\item Případ užití začíná, když Zadavatel publikací chce odebrat štítek od publikace.
	\item Zadavatel publikací zvolí funkci \uv{odebrat štítek} u~konkrétního štítku.
	\item Systém se zeptá na~potvrzení odebrání štítku.
	\item Zadavatel publikací potvrdí odebrání štítku volbou \uv{potvrdit}.
	\item Systém odebere štítek od publikace.
\end{enumerate}
\begin{description}
	\item[Alternativní scénář]
\end{description}
\begin{enumerate}
  \setcounter{enumi}{3}
	\item Zadavatel publikací zvolí možnost \uv{zrušit}.
	\item Systém neprovede odebrání štítku od publikace.
\end{enumerate}

\section{Stručný popis datového modelu původní aplikace}
Obrázek \ref{fig:class2} ukazuje stav datového modelu na~počátku vývoje. Aby nebyly rozměry obrázku neúnosně velké, obrázek neobsahuje ty vazební entity, jejichž účelem je výhradně vazba mezi objekty a~samy o~sobě nenesou žádnou hodnotu. Dále v~obrázku kvůli přehlednosti nejsou zobrazeny ty vazby na~entitu \texttt{submitter}, které nesouvisí s~business logikou aplikace a~jsou tam jen z~důvodu auditování. V~takovém případě je v~dané tabulce uveden atribut \texttt{submitter\_id}.

\begin{landscape}
  \begin{figure}\centering
   	\includegraphics[width=1\textwidth]{class2}
   	\caption[UML Class diagram: původní stav]{UML Class diagram: původní stav}\label{fig:class2}
  \end{figure}
\end{landscape}

\subsection{Tabulka \texttt{acm\_category}}
Tabulka obsahuje ACM kategorie \cite{acm}. Tyto kategorie mají stromovou strukturu, tabulka tedy kromě názvu obsahuje cizí klíč na~nadřazenou kategorii.
\subsection{Tabulka \texttt{annotation}}
Tabulka obsahuje uživatelské poznámky k publikacím. Poznámka patří konkrétnímu uživateli a~je veřejná nebo soukromá.
\subsection{Tabulka \texttt{attributes}}
Tabulka obsahuje definici atributů k publikacím.
\subsection{Tabulka \texttt{attrib\_storage}}
Tabulka slouží k ukládání hodnot atributů publikací. Jedná se vlastně o~vazební tabulku mezi tabulkami attributes a~attrib\_storage, ale navíc obsahuje hodnotu atributu.
\subsection{Tabulka \texttt{author}}
Tabulka obsahuje autory publikací. Autor má jméno, prostřední jméno a~příjmení. Tabulka dále obsahuje cizí klíč na~uživatele, který záznam vytvořil.
\subsection{Tabulka \texttt{author\_has\_publication}}
Vazební tabulka mezi autory a~publikacemi.
\subsection{Tabulka \texttt{auth\_ldap}}
Tabulka slouží k autentizaci uživatelů přes LDAP. Kromě cizího klíče na~uživatele obsahuje uživatelské jméno v~rámci LDAP. Protože se místo autentizace přes LDAP využívá Shibboleth, je tabulka prázdná.
\subsection{Tabulka \texttt{auth\_login\_password}}
Tabulka služí k autentizaci uživatelů přes uživatelské jméno a~heslo. Kromě cizího klíče na~uživatele obsahuje uživatelské jméno, hash hesla a~salt pro zvýšení bezpečnosti hesla.
\subsection{Tabulka \texttt{auth\_shibboleth}}
Tabulka slouží k autentizaci uživatelů přes Shibboleth. Kromě cizího klíče na~uživatele obsahuje uživatelské jméno a~e-mail uživatele.
\subsection{Tabulka \texttt{categories}}
Tabulka obsahuje kategorie publikací. Kategorie mohou tvořit stromovou strukturu, proto jeden ze sloupců tabulky obsahuje cizí klíč na~tabulku samotnou (na nadřazenou kategorii). Dále tabulka obsahuje název kategorie a~cizí klíč na~uživatele, který kategorii vytvořil.
\subsection{Tabulka \texttt{categories\_has\_publication}}
Vazební tabluka mezi kategoriemi publikací a~publikacemi.
\subsection{Tabulka \texttt{conference}}
Tabulka konferencí obsahuje název konference, zkratku, cizí klíč na~uživatele, který konferenci vytvořil, popis, první rok a~stav konference.
\subsection{Tabulka \texttt{conference\_category}}
Tabulka kategorií konferencí. Protože kategorie konferencí mohou tvořit stromovou strukturu, obsahuje tabulka kromě názvu také cizí klíč na~tabulku samotnou (na nadřazenou kategorii).
\subsection{Tabulka \texttt{conference\_has\_acm\_category}}
Vazební tabulka mezi konferencemi a~ACM kategoriemi.
\subsection{Tabulka \texttt{conference\_has\_category}}
Vazební tabulka mezi konferencemi a~kategoriemi konferencí.
\subsection{Tabulka \texttt{conference\_year}}
Tabulka ročníků konferencí. Kromě cizího klíče na~konferenci, na~uživatele, který ročník konference vytvořil, a~na tabulku samotnou (nadřazený ročník konference) obsahuje tabulka ještě název, zkratku, rok, datum začátku, datum konce, datum deadline, datum notifikace, datum finální verze, místo, popis, stav, ISBN, ISSN, DOI a~odkaz na~web.
\subsection{Tabulka \texttt{conference\_year\_is\_indexed}}
Vazební tabulka mezi ročníkem konference a~informací o~indexaci sborníků konferencí ve veřejných databázích publikací.
\subsection{Tabulka \texttt{cu\_group}}
Tabulka pro skupiny kategorií konferencí. Obsahuje název kategorie.
\subsection{Tabulka \texttt{cu\_group\_has\_conference\_category}}
Vazební tabulka mezi skupinami kategorií konferencí a~kategoriemi konferencí.
\subsection{Tabulka \texttt{documents}}
Tabulka slouží pro dokumenty nahrané k publikacím. Kromě cizího klíče na~publikaci obsahuje název dokumentu a~obsah dokumentu, pokud se jej podařilo z~dokumentu načíst.
\subsection{Tabulka \texttt{document\_index}}
Tabulka obsahuje veřejné databáze publikací (název a~odkaz na~web).
\subsection{Tabulka \texttt{format}}
Tabulka obsahuje formáty citací pro export z~detailu publikace. Kromě názvu se jedná o~šablonu samotnou a~timestamp.
\subsection{Tabulka \texttt{general\_settings}}
Tabulka obsahuje obecná nastavení aplikace. Jedná se o~počet položek na~stránce při stránkování, spring\_token a~počet dnů pro notifikaci s~předstihem.
\subsection{Tabulka \texttt{group}}
Tabulka slouží pro skupiny publikací. Kromě názvu skupiny obsahuje cizí klíč na~uživatele, který skupinu vytvořil.
\subsection{Tabulka \texttt{group\_has\_publication}}
Vazební tabulka mezi skupinami publikací a~publikacemi.
\subsection{Tabulka \texttt{journal}}
Tabulka časopisů. Obsazuje název časopisu, ISSN, DOI, zkratku a~cizí klíč na~uživatele, který časopis přidal.
\subsection{Tabulka \texttt{publication}}
Tabulka publikací. Obsahuje cizí klíče na~časopis, vydavatele, ročník konference a~uživatele, který publikaci vytvořil. Dále řadu textových položek, příznak, zda je publikace schválená administrátorem, a~datum vydání.
\subsection{Tabulka \texttt{publisher}}
Tabulka vydavatelů. Obsahuje název a~adresu vydavatele a~cizí klíč na~uživatele, který záznam vytvořil.
\subsection{Tabulka \texttt{retrieve}}
Tabulka slouží k možnosti resetování hesla. Obsahuje cizí klíč na~uživatele a~hash pro potvrzení resetování hesla.
\subsection{Tabulka \texttt{submitter}}
Tabulka obsahuje uživatele aplikace. Poněkud neobvyklý název je dán historicky. Obsahuje jméno, příjmení, uživatelské jméno a~e-mail.
\subsection{Tabulka \texttt{submitter\_favourite\_conference}}
Vazební tabulka mezi uživateli a~konferencemi slouží k zaznamenání oblíbených konferencí uživatele (označení hvězdičkou).
\subsection{Tabulka \texttt{submitter\_has\_cu\_group}}
Vazební tabulka mezi uživateli a~skupinami kagegorií konferencí.
\subsection{Tabulka \texttt{submiter\_has\_group}}
Vazební tabulka mezi uživateli a~skupinami publikací.
\subsection{Tabulka \texttt{submitter\_has\_publication}}
Vazební tabulka mezi uživateli a~publikacemi slouží k zaznamenání oblíbených publikací uživatele (označení hvězdičkou).
\subsection{Tabulka \texttt{user\_role}}
Tabulka obsahuje přiřazení uživatelů k rolím. Kromě cizího klíče na~uživatele obsahuje název role, která je uživateli přiřazena.
\subsection{Tabulka \texttt{user\_settings}}
Tabulka obsahuje uživatelská nastavení jednotlivých uživatelů. Kromě cizího klíče na~uživatele obsahuje počet položek na~stránce při stránkování a~počet dnů pro notifikaci s~předstihem.

\section{Návrh změn datového modelu}
Data z~původního datového modelu musí zůstat zachována. Je však nutné přidat některé nové entitní typy a~přidat atributy do jiných entitních typů. V~souvislosti s~tím bude třeba provést transformaci dat. Další entitní typy a~atributy je možné odstranit.

Obrázek \ref{fig:class3} ukazuje tabulky, které jsem nově vytvářel, prováděl v~nich změny nebo které s~takovými tabulkami úzce souvisí. Níže popisuji změny podrobněji.

\begin{figure}\centering
 	\includegraphics[width=1\textwidth]{class3}
 	\caption[UML Class diagram: návrh změn]{UML Class diagram: návrh změn}\label{fig:class3}
\end{figure}


\subsection{Změny v tabulce \texttt{publication}}
Dosud byl rok a~měsíc u~publikace v~tabulce uložen jako datový typ datetime. Přestože řadě případů je tento formát pro uložení data vhodný, v~tomto případě se ukázal opak. U některých publikací je totiž vyplněn pouze rok, u~jiných rok a~měsíc. Den se nevyplňuje. Proto se pro uložení roku a~měsíce místo jednoho sloupce typu datetime použijí dva sloupce typu integer.

\subsection{Změny v tabulce \texttt{author}}
Z funkčních požadavků vyplývá, že je třeba propojit uživatele aplikace a~autory publikací. Jednou z~možností by bylo zcela spojit tabulky autorů a~uživatelů. To se ukazuje jako problematické, protože počet autorů je řádově vyšší, než počet uživatelů. Zvolil jsem tedy řešení formou přidání sloupce do \texttt{user\_id} do tabulky \texttt{author}. Tím je možné každému autorovi přiřadit uživatele. Je možné přiřadit jednoho uživatele i~více autorů, pokud by byly v~aplikaci duplicitní. V~takovém případě je však vhodnější záznamy sloučit.

\subsection{Vytvoření tabulek \texttt{conference\_year\_isbn}, \texttt{journal\_isbn} a \texttt{publication\_isbn}}
Nově přidané tabulky \texttt{conference\_year\_isbn}, \texttt{journal\_isbn} a~\texttt{publication\_isbn} umožní ke každému ročníku konference, časopisu a~publikaci přiřadit několik ISBN/ISSN. Dosud bylo možné mít pouze jedno ISBN a~jedno ISSN u~ročníku konference, jedno ISSN u~časopisu a~jedno ISBN u~publikace. Navíc je ke každému ISBN/ISSN možné přidat poznámku.

\subsection{Vytvoření tabulky \texttt{tag}}
Z funkčních požadavků vyplývá potřeba zaznamenávat štítky k publikacím. Nově vytvořená tabulka štítků bude obsahovat název štítku, vlastníka štítku a~informaci o~tom, zda se jedná o~globální nebo privátní štítek.

\subsection{Vytvoření tabulky \texttt{publication\_has\_tag}}
Nově přidaná vazební tabulka mezi publikacemi a~štítky.

\subsection{Odstranění tabulky \texttt{format}}
 Tabulka format obsahovala formáty citací. Vytvoření tabulky bylo součástí zadání jedné z~předchozích prací, ale v této práci jsem ji odstranil. Detailům se věnuji v další kapitole.

 \subsection{Přidání tabulky \texttt{reference}}
Nově přidaná tabulka slouží buď jako vazební tabulka mezi dvěma publikacemi (citující a~citovanou), nebo jako textová podoba citace k dané publikaci. V~takovém případě obsahuje ještě rozpoznaný titulek reference, který umožní snazší spárování, pokud publikace odkazovaná v~textové referenci již v~databázi existuje. Vedle toho se v~tabulce bude ukládat id uživatele, který referenci zadal (\texttt{submitter\_id}).


Obrázek \ref{fig:class4} ukazuje konečný stav databáze. Aby nebyly rozměry obrázku neúnosně velké, obrázek neobsahuje ty vazební tabulky, jejichž účelem je výhradně vazba mezi objekty a~samy o~sobě nenesou žádnou hodnotu. Dále v~obrázku kvůli přehlednosti nejsou zobrazeny ty vazby na~tabulku, které nesouvisí s~business logikou aplikace a~jsou tam jen z~důvodu auditování. V~takovém případě je v~dané tabulce uveden atribut \texttt{submitter\_id}.

\begin{landscape}
  \begin{figure}\centering
   	\includegraphics[width=1.25\textwidth]{class4}
   	\caption[UML Class diagram: finální stav]{UML Class diagram: finální stav}\label{fig:class4}
  \end{figure}
\end{landscape}

\chapter{Realizace}

\section{Implementace nových funkcí}

Nové funkce jsem implementoval iterativně. Po každé iteraci následovalo lokální otestování funkčnosti. Po dokončení většího celku jsem provedl nahrání tohoto celku do repozitáře a~na produkční server, kde ho mohl vyzkoušet vedoucí práce a~další uživatelé.

\section{Nové CRUD komponenty}
CRUD operace jsou operace vytváření, editace, načítání a~mazání záznamů. Tato zkratka představuje čtveřici slov: create, read, update, delete. \cite{svoboda} V~rámci této práce několik CRUD komponent upravuji a~přidávám 4 nové:
\begin{description}
		\item[\texttt{CitationCrud}] slouží k práci s~referencí na~citované straně. Zobrazuje seznam citací a~umožňuje je po potvrzení smazat. Neumožňuje však reference přidávat nebo jakkoliv upravovat.
		\item[\texttt{ReferenceCrud}] slouží pro práci s~referencí na~citující straně. Zobrazuje seznam referencí, umožňuje je přidávat formou výběru nebo formou textových referencí, upravovat i~mazat.
		\item[\texttt{TagCrud}] slouží ke  správě uživatelských štítků. Umožňuje jejich vytváření, editaci i~mazání.
		\item[\texttt{PublicationTagCrud}] slouží ke správě štítků u~publikací. Umožňuje zobrazit seznam štítků u~publikace a~tyto štítky přidávat i~odebírat.
\end{description}

\section{Rozpoznávání referencí}
\subsection{Parsování referencí}
Při zadávání referencí formou textu je nutné zadat každou referenci na~právě jeden řádek. V~opačném případě by bylo velmi obtížné oddělit jednotlivé reference od sebe, a~proto by nebylo možné je rozpoznat.

K parsování referencí slouží třída \texttt{ReferenceParser}. Konstruktor třídy přijímá text reference. Samotné parsování se provádí metodou \texttt{parse()}. Po úspěšném parsování je třída metodou \texttt{getAuthors()} schopna vrátit pole autoru, metodou \texttt{getTitle()} titulek publikace a~metodou \texttt{getYear()} rok publikace.

Při implementaci parsování referencí jsem postupoval jakousi obdobou test-driven development. Vybral jsem si řetězec, stanovil, jaké mají být výstupy, a~postupně upravoval třídu \texttt{ReferenceParser} tak, abych dostal požadovaný výsledek. Po přidání několik různých řetězců již úspěšné parsování dalšího řetězce nevyžadovalo úpravu algoritmu.

Při implementaci parsování jsem předpokládal, že budu rozpoznávat citace podle více kritérií. V~praxi se ukázalo, že pro úspěšné rozpoznání citované publikace stačí znát její název.

\subsection{Rozpoznávání referencí formou přesné shody}
Podle názvu, který jsem si uložil do databáze při zadávání textových referencí na~základě jejich parsování, mohu tyto reference spojit s~publikacemi pomocí přesné shody názvu s názvem. Tato metoda má výhodu v~tom, že prakticky nedochází k chybnému rozpoznání. Na druhou stranu je rozpoznána jen část publikací, které ve skutečnosti jsou v~databázi. Tuto metodu označuji v dalším textu jako metodu A.

\subsection{Rozpoznávání referencí přes FULLTEXT index}
Při této metodě vyhledávám publikaci pomocí MySQL Fulltext v Boolean módu \cite{booleanfulltext}. To provádím ve dvou variantách:
\begin{itemize}
  \item vyhledávání celé textové reference v názvech publikací (dále označeno jako metoda B1),
  \item vyhledávání parsovaného titulku z reference v názvech publikací (dále označeno jako metoda B2).
\end{itemize}

\subsection{Porovnávání metod rozpoznávání referencí}
Cílem tohoto porovnání je zjistit, jaký způsob rozpoznávání referencí je nejvýhodnější. V~době provedení tohoto měření měla databáze 619 publikací, z~toho 281 bylo vydáno po roce 2000, 199 před rokem 2000 a~u 139 publikací nebyl rok vydání vyplněn. Z publikací vydaných po roce 2000 jsem náhodně vybral 30 publikací. Publikace vydané pro roce 2000 jsem zvolil proto, že je u~nich větší pravděpodobnost, že citované publikace budou v~databázi.

U takto 30 vybraných publikací jsem se pokusil v~databázi ručně dohledat všechny reference. Jednu z~publikací nebylo jednu možné použít, protože se jednalo o~knihu, která měla stovky citací a~nebylo tedy reálné všechny dohledat. Další z~publikací nebylo možné použít proto, že v~systému neměla vůbec nahrané pdf. Další z~publikací měla pdf v~podobě, která vůbec neumožňovala kopírování textu referencí. Tyto 3 publikace nebyly do zkoumání zahrnuty. U několika dalších publikací se vyskytly problémy při kopírování seznamu referencí, nicméně většinu se s~drobnými úpravami podařilo zkopírovat, a~do zkoumání jsem je tedy zařadil.

Výše uvedených 27 pulikací obsahuje celkem 668 řádků referencí. Zkopírovat se jich podařilo 663, zbývajících 5 bylo nečitelných. Z těchto 663 referencí databáze obsahuje 137 publikací.

Metoda A dokázala správně rozpoznat 56 referencí.  526 referencí nebylo v databázi nalezeno, přižemž se v databázi skutečně nenacházejí. Neobsahovala žádné falešně pozitivní ani chybné výsledky, ale 81 výsledků bylo falešně negativních.

Metoda B1 dokázala správně rozpoznat 132 referencí.  13 referencí nebylo v databázi nalezeno, přičemž se v databázi skutečně nenacházejí. 3 reference byly rozpoznány chybně, 513 bylo falešně pozitivních a~2 reference byly falešně negativní

Metoda B2 dokázala správně rozpoznat 117 referencí. 73 referencí nebylo v databázi nalezeno, přičemž se tam skutečně nenacházejí. 8 referencí bylo rozpoznáno chybně, 12 referencí bylo falešně negativních a~453 bylo falešně pozitivních.

\begin{table}\centering
	\caption[Úspěšnost rozpoznávání referencí]{Úspěšnost rozpoznávání referencí}\label{tab:reference1}
	\begin{tabular}{|l|c|c|c|}\hline
		Metoda		& A & B1 & B2	\tabularnewline \hline \hline
		Správně nalezeno		& 56	& 132	& 117		\tabularnewline \hline
		Správně nenalezeno	& 526	& 13	& 73		\tabularnewline \hline
		Chybně nalezeno			& 0		& 3		& 8 		\tabularnewline \hline
		Falešně pozitivní 	& 0		& 513	& 12 		\tabularnewline \hline
		Falešně negativní 	& 81	& 2		& 453 	\tabularnewline \hline
	\end{tabular}
\end{table}

Jako správně rozpoznané označuji ty rozpoznané reference, kde byla rozpoznaná publikace shodná s ručně dohledanou publikací. Jako falešně negativní označuji ty, kde algoritmus nerozpoznal publikaci přesto, že se v systému nachází. Jako chybné označuji ty výsledky, kde algoritmus nalezl jinou publikaci, než jaká byla dohledána ručně. Jako falešně pozitivní označuji situaci, kdy systém nalezl publikaci přesto, že správná publikace se v databázi vůbec nenachází. Výsledky zkoumání obsahuje tabulka \ref{tab:reference1}.


\begin{table}\centering
	\caption[Shrnutí úspěšnosti rozpoznávání referencí]{Shrnutí úspěšnosti rozpoznávání referencí}\label{tab:reference2}
	\begin{tabular}{|l|c|c|c|}\hline
		Metoda		& A & B1 & B2	\tabularnewline \hline \hline
		Správně		& 88 \%	& 22 \% & 29 \%		\tabularnewline \hline
		Chybně		& 12 \%	& 78 \% & 71 \% 		\tabularnewline \hline
	\end{tabular}
\end{table}

V souhrnné tabulce \ref{tab:reference2} jsou jako správné rozpoznání uvedeny případy, kdy:
\begin{itemize}
 		\item je publikace v databázi přítomna a byla správně rozpoznána,
		\item není publikace v databázi přítomna a metoda žádnou publikaci v databázi nenašla.
\end{itemize}
Všechny ostatní případy jsou uvedeny jako chybné.

Podle těchto kritérií je jednoznačně nejlepší z uvedených metod metoda A a tato metoda se tedy používá pro navrhování rozpoznaných referencí administrátorovi. Přesto metody B1 a B2 zcela nezavrhuji. Lze je použít v případě, kdy je mnohem důležitější správné rozpoznání publikací, které se v databázi nacházejí, než zjištění faktu, že se publikace v databázi nenachází. Proto metodu B1 používám pro navrhování publikací uživateli.

\section{Dependency Injection}
Jednou z~dobrých praxí ve frameworku Nette je využívání Dependency Injection \cite{depentencyinjection}

\subsection{Sjednocení předávání závislostí}
Jak uvádí manuál \cite{diusage}, v~Nette Frameworku existují v~zásadě 4 způsoby předávání závislostí v~souladu s~principem Dependency Injection:
\begin{description}
		\item[Konstruktor] je základní metodu předávání závislostí. Závislosti se předávají v~okamžiku vytváření objektu. V~Nette se správné parametry na~základě hintů předají automaticky.
		\item[Setter] znamená, že závislosti jsou předány po vytvoření objektu metodou set*. Metodu je ovšem nutné zavolat ručně.
		\item[Metoda inject*] je speciálním případem setteru. Nette dokáže v~případě presenterů předat parametry automaticky.
		\item[Anotace @inject] znamená, že do public proměnné s~touto anotací a~typem závislosti v~dokumentačním komentáři se proměnná předá automaticky. Funguje to však jen v~presenterech.
\end{description}

Dalším způsobem je využití rozšíření Kdyby/Autowired \cite{autowired}. Používá anotaci @autowired. Jedná se o~obdobu anotace @inject, která ovšem funguje i~mimo presentery a~vyžaduje mít instalované rozšíření.

Nevýhodou anotací @inject a~@autowired je, že proměnná, do které se závislost vkládá, musí být public. Tím může dojít k porušení zapouzdření. Výhodou je zásadní zvýšení čitelnosti kódu v~presenterech.

V důsledku toho, že na~aplikaci pracovalo postupně více autorů, využívají se snad s~výjimkou setterů všechny výše uvedené metody. Mou snahou bylo dosáhnout v~celé aplikaci využívání pouze těchto dvou metod:
\begin{itemize}
	\item{anotace @inject} pro presentery,
	\item{konstruktor} pro všechny ostatní třídy.
\end{itemize}

\subsection{Vytváření instancí tříd pomocí továrniček}
Tato praxe již byla v~aplikaci použita, pokouším se ji však rozšířit. Vytváření tříd pomocí továrniček je alternativou k vytváření instancí tříd pomocí new přímo v~presenterech.


\subsection{Odstranění přístupů ke kontextu z presenteru}
V aplikaci existovala místa, kde se princip Dependency Injection nevyužíval vůbec. Jedná se například o~přístup z~presenteru  přímo ke kontextu. V~rámci úprav jsem tyto přístupy nahrazoval předáváním závislostí v~pomocí Dependency Injection.

\section{Zabezpečení}

\subsection{Odstranění šablon formátů}
Jak ukázala první část analýzy v~této práci, ukládání šablon do databáze znamená riziko v~podobě možnosti spuštění libovolného kódu na~serveru ze strany zadavatele publikací (či spíše uživatele, kterému by se oprávnění zadavatele publikací podařilo neoprávněně získat). Navíc uživatelská přívětivost editace formátů citace nebyla o~mnoho vyšší než editace přímo ve zdrojovém kódu. Proto jsem tabulku po dohodě s~vedoucím práce odstranil. Šablony je možné editovat přímo ve zdrojovém kódu v~adresáři \texttt{app/templates/Publication/}.

\subsection{Algoritmus pro hashování hesel}
V aplikaci jsem nahradil dosavadní algoritmus hashování hesel za bcrypt. Přestože heslo pro přihlášení do aplikace používá minimum uživatelů a tato změna tedy není příliš významná, považuji to za správný krok jak s ohledem na bezpečnost, tak vzhledem k tomu, že bcrypt je de-facto standard v PHP \cite{phppass}.

\subsection{Doplnění hlaviček pro ochranu proti CSRF}
Přestože nemohu zasahovat do konfigurace serveru, doporučil bych správci serveru zavést Content Security Policy HTTP hlavičky \cite{csrf}, což uživatele pomůže ochránit proti CSRF. Je to mnohem efektivnější řešení, než zavádět nějakou formu ochrany pomocí tokenů do celé aplikace, což by bylo velmi časově náročné a lze snadno na ochranu některé funkce zapomenout.


\section{Správa závislostí pomocí Composeru}
Composer je nástroj pro správu závislostí v~PHP \cite{composer}. V~tomto projetku byl již použit, ale protože neměl ošetřené závislosti na~úrovni rozšíření PHP, nebylo úplně snadné zprovoznit vlastní instanci aplikace.
Do závislostí v \texttt{composer.json} jsem přidal některá rozšíření PHP.


\section{Aktualizace knihoven}
Základní framework Nette jsem aktualizoval na~verzi 2.3 a~provedl jsem některé úpravy, které v~budoucnu usnadní aktualizaci na~verzi 2.4, resp. na~verze řady 3. To vyžadovalo řadu úprav kódu.


\chapter{Testování}
Zadání požaduje důkladné otestování těch částí aplikace, ve kterých jsem prováděl úpravy. Zadání dále požaduje provedení uživatelského testování. Případně je možné zavést automatizované testování.

V průběhu celého vývoje docházelo k průběžnému testování funkcionality mnou, vedoucím práce a~následně ostatními uživateli.

K zavedení automatizovaného testování, ať už formou integračních testů nebo unit testů, jsem se z časových důvodů bohužel nedostal.


\begin{conclusion}
Cílem diplomové práce bylo navázat na předchozí bakalářskou a diplomovou práci, které se zabývaly problematikou databáze konferencí a publikací. Úkol spočíval ve vylepšení uživatelské přívětivosti, zavedení evidencí citací publikací, automatického rozpoznávání referencí publikací, správy vlastních (autorských) publikací, uživatelských tagů u publikací, vylepšení vyhledávání publikací a odstranění drobných chyb aplikace.

V práci byl proveden obecný a technický popis aplikace a zhodnoceny některé aspekty jejího zabezpečení. Zároveň jsem popsal požadavky na úpravu aplikace a navrhnul změny datového modelu.

Podařilo se mi iterativně implementovat nové funkce a zároveň po každé iteraci provést lokální otestování funkčnosti. Tyto celky byly k dispozici uživatelům aplikace. Pro vylepšení fungování aplikace jsem zavedl nové CRUD komponenty. Pro rozpoznávání referencí jsou v práci využity metody parsování referencí, rozpoznávání názvů publikací formou přesné shody a pomocí FULLTEXT indexu, které jsou podrobněji popsány a vyhodnoceny.

Nepodařilo se zavést automatizované testování, ke kterému jsem se nedostal v~předpokládané šíři z~časových důvodů. Také rozšíření vyhledávání se nepodařilo provést v plné šíři. Provedl jsem však rozsáhlou údržbu kódu, která byla nezbytná pro zachování možnosti pokračovat ve vývoji aplikace do budoucna. Odstranil jsem také několik bezpečnostních problémů.

Je možné v tomto projektu pokračovat dopracováním unit a~integračních testů a~následně přechodem na~ORM Doctrine místo stávající knihovny Nette Database. Další možností je zabývat se podrobněji zabezpečením aplikace.
\end{conclusion}

\bibliographystyle{csn690}
\bibliography{mybibliographyfile}

\appendix

\chapter{Seznam použitých zkratek}
% \printglossaries
\begin{description}
  \item[HTTP] Hypertext Transfer Protocol
  \item[PHP] PHP: Hypertext Preprocessor
  \item[XSS] Cross-site scripting
  \item[CSRF] Cross-site request forgery
  \item[CRUD] Create, Read, Update, Delete
  \item[SSO] Single sign-on
  \item[LDAP] Lightweight Directory Access Protocol
  \item[SHA] Secure Hash Algorithm
	\item[JS] Java Script
\end{description}


\chapter{Obsah přiloženého CD}

%upravte podle skutecnosti

\begin{figure}
	\dirtree{%
		.1 readme.txt\DTcomment{stručný popis obsahu CD}.
		.1 exe\DTcomment{adresář se spustitelnou formou implementace}.
		.1 src.
		.2 impl\DTcomment{zdrojové kódy implementace}.
		.2 thesis\DTcomment{zdrojová forma práce ve formátu \LaTeX{}}.
		.1 text\DTcomment{text práce}.
		.2 thesis.pdf\DTcomment{text práce ve formátu PDF}.
		.2 thesis.ps\DTcomment{text práce ve formátu PS}.
	}
\end{figure}

\end{document}
