%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% :WSDL
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Web Services Description Language} \label{WSDL}
WSDL je XML jazyk určený pro popis webové služby. Na rozdíl od programátorské dokumentace nebo uživatelské příručky je ovšem navržen tak, aby z~něj bylo možné jednoznačně a~přitom automatizovaně vytvořit zdrojový kód pro volání metod webové služby. WSDL je dosti komplikovaný jazyk s~objemnými vyjadřovacími schopnostmi, proto si v~této kapitole ukážeme pouze jeho základ. Pro praktické použití to však vůbec nevadí, jelikož dnešním standardem je právě automatizovaná práce s~WSDL. Programátor si nemusí popisovací soubor v~jazyce WSDL psát sám, není proto potřeba tento jazyk znát dokonale. Pokud by bylo potřeba, vždy se můžete podívat do specifikace \cite{WSDL Specifications} na potřebné detaily.
\fcolorbox{boxout}{boxin}{
\parbox{0.98\linewidth}{
WSDL byl navržen společně s~protokolem SOAP, ovšem jako obecný popisovací soubor pro všechny typy webových služeb. Cenou za tuto obecnost je velká komplikovanost jazyka, který prochází několika úrovněmi abstrakce a~mapování. Je ironií, že jediná konkurenční technologie RESTful webových služeb jazyk WSDL nevyužívá, jelikož je stavěna na jiných principech. WSDL tak zůstává obecným jazykem, který má využití pouze u~jediné technologie.
}}
\subsection{Popisovací souboru}
Pro popis webové služby slouží soubor napsaný v~jazyce WSDL. Termíny jazyk WSDL a~popisovací soubor WSDL často splývají, protože WSDL se už nikde jinde nepoužívá. Pro začátek si ukažme kostru WSDL souboru. V~kořenovém elementu \texttt{definitions} máme uvedený jmenný prostor služby spolu s~jejím názvem a~typicky bohatým výčtem XML jmenných prostorů..
\begin{Verbatim}
\end{Verbatim}
\fcolorbox{boxout}{boxin}{
\parbox{0.98\linewidth}{
Název webové služby je pouze informativní, při komunikaci pomocí protokolu SOAP jej nevyužijeme.
}}
Soubor WSDL se dále dělí na čtyři části --- \texttt{message}, \texttt{portType}, \texttt{binding} a~\texttt{service}. V~dalším textu si ukážeme každou z~těchto čtyřech částí. Informace o~webové službě se budují odzdola nahoru, tedy nejkonkrétnější informace jsou uvedené až na konci. Zkusme si tedy i~my vybudovat soubor od konce. Pro zjednodušení v~dalších příkladech vypustíme některé atributy XML elementu \texttt{definitions}.
\subsection{Service}
Poslední částí WSDL souboru je část \texttt{service}. Je reprezentována jediným XML elementem, který obsahuje názvy všech koncových bodů (v~terminologii WSDL portů) spolu s~adresami. Příklad ukazuje, jak deklarovat port s~adresou \emph{http://www.piggybank.com/account}. Název portu je uveden v~atributu \texttt{name} XML elementu \texttt{port}.
\begin{Verbatim}
\codeHighlight{}
\codeHighlight{ }
\codeHighlight{ }
\codeHighlight{ }
\codeHighlight{}
\end{Verbatim}
\subsection{PortType}
Jako další potřebujeme vyjmenovat metody (v~terminologii WSDL operace), které daný port nabízí. V~našem případě je to pouze jedna operace --- \texttt{deposit}. V~ní uvedeme odkaz na vstupní a~výstupní zprávu (jejich definice doplníme později).
\begin{Verbatim}
\codeHighlight{}
\codeHighlight{ }
\codeHighlight{ }
\codeHighlight{ }
\codeHighlight{ }
\codeHighlight{}
\end{Verbatim}
\subsection{Message}
Část \texttt{message} obsahuje informace o~všech požadavcích a~odpovědích, které je možné v~rámci webové služby zaslat. Každou zprávu představuje jeden XML element \texttt{message}. Ve většině případů existuje zpráv více, jejich XML elementy jsou pak uvedeny za sebou, bez obalovacího elementu. Příklad ukazuje, jak deklarovat zprávy \texttt{deposit} a~\texttt{depositResponse}. XML elementy \texttt{part} popisují parametry u~požadavku, resp. návratovou hodnotu u~odpovědi. Pokud by bylo parametrů více, následovali by elementy \texttt{part} za sebou.
\begin{Verbatim}
\codeHighlight{}
\codeHighlight{ }
\codeHighlight{}
\codeHighlight{}
\codeHighlight{ }
\codeHighlight{}
\end{Verbatim}
\subsection{Binding}
Jako poslední krok musíme uvést, že chceme komunikovat pomocí protokolu SOAP (to je pouze formalita, jiná možnost není). Všimněte si také atributů \texttt{style} a~\texttt{use}, které jsou nastavené na kombinaci hodnot RPC/LITERAL.
\begin{Verbatim}
\codeHighlight{}
\codeHighlight{ }
\codeHighlight{ }
\codeHighlight{ }
\codeHighlight{ }
\codeHighlight{ }
\codeHighlight{ }
\codeHighlight{ }
\codeHighlight{ }
\end{Verbatim}
\subsection{Generace WSDL souboru ze zdrojového kódu}
Naštěstí není nutné psát WSDL soubory ručně. Pro webové služby vytvořené ve frameworku JAX-WS existuje pohodlná a~automatizovaná možnost jeho vytvoření. Nástroj, který toto zařizuje se jmenuje \texttt{wsgen} a~jeho použití je velmi jednoduché. Spouštěcí soubor nástroje stačí najít v~adresáři Javy (na Linuxu openSUSE je to adresář \emph{/usr/lib/jvm/java-1.6.0/bin/} a~poté v~příkazové řádce zavolat:
\begin{Verbatim}
> wsgen -wsdl NAZEV_TRIDY
\end{Verbatim}
kde \texttt{NAZEV\_TRIDY} je název třídy webové služby. Tato třída musí být zařazena do proměnné prostředí CLASSPATH a~také musí být doplněna anotací \texttt{@WebService} (viz. kapitola \ref{JAX-WS}). Všechny možnosti nástroje se můžete dozvědět na \cite{wsgen} nebo po zavolání příkazu \texttt{wsgen -help}. Moderní vývojová prostředí jako NetBeans ho umí zavolat sami a~optimálně nastavit parametry.
\subsection{Závěr}
Jazyk WSDL umožňuje přesný popis SOAP webové služby, jeho návrh je však z~hlediska čitelnosti a~snadného pochopení poněkud nešťastný. Hlavní využití najde WSDL při automatickém generování klientského kódu k~webové službě. Pro lidského uživatele je lepší vytvořit uživatelskou příručku se slovním popisem celé služby.
Použitá literatura:\\
\cite{Enterprise JavaBeans 3.0} \emph{Enterprise JavaBeans 3.0 -- Kapitoly 18 a~19}\\
\cite{Web Services Essentials} \emph{Web Services Essentials}\\
\cite{WSDL Wikipedia} \emph{WSDL at Wikipedia}\\
\cite{WSDL Specifications} \emph{WSDL Specifications}\\
\cite{wsgen} \emph{Generátor \tt wsgen}\\