\documentclass[12pt,a4paper]{article}
\usepackage[finnish]{babel}
\usepackage[dvips]{graphicx}
\usepackage{t1enc}
\usepackage{latexsym}
\begin{document}

%%%%%%%%%%%%% KANSILEHTI %%%%%%%%%%%%%%%%

\begin{titlepage}
\vspace*{1.8cm}
\noindent
\begin{flushleft}
\setlength{\baselineskip}{2\baselineskip}
{\Huge \bf JouTo} \\
{\large \bf Toimittajan ty�v�line} \\
\vspace{1cm}
{\Large \bf Suunnitteludokumentti} \\
{\large Versio 1.0}
\end{flushleft}
\vspace{2cm}

\noindent

\vspace{\fill}
\vspace{2.5cm}
\begin{tabbing}
mmmmmmmmmmmmmmmmm\= Projektiryhm�mmm\= Helena Ahonen-Mykam\= \kill
\> 9.3.2001 \\
\> {\sc Helsingin yliopisto} \\
\> Tietojenk�sittelytieteen laitos \\
\> Ohjelmistotuotantoprojekti, kev�t 2001, ryhm� 3\\
\> Projektiryhm�: \> Petri Hellemaa (PH)\\
\>                \> Antti Koskinen (AK)\\
\>                \> Lari Laine (LL)\\
\>                \> Jarno Saarto (JS)\\
\>                \> Eija Teitto (ET)\\
\>                \> Harri Tuuloskoski (HT)\\
\> Ohjaaja:       \> Kim Viljanen\\
\> Vastuuhenkil�: \> Raine Kauppinen\\
\> Asiakkaat:     \> Helena Ahonen-Myka\\
\>                \> Greger Lind�n\\
\end{tabbing}
\end{titlepage}

\setlength{\parindent}{0pt}
\setlength{\parskip}{1.0ex plus 0.5ex minus 0.2ex}
\advance\textheight by 15mm
\advance\textwidth by 10mm
\hoffset=-4mm
\advance\hsize by 10mm
\pagestyle{empty}
\markright{}

%%%%%%%%%%%%% VERSIOHISTORIA %%%%%%%%%%%%%%%%

{\large \bf Dokumentin versiohistoria}
{\small
\begin{tabbing}
00.0m\= 00.00.0000mi\= \kill
0.1 \> 19.02.2001 \> Ensimm�inen hahmotelma (AK) \\
0.2 \> 23.02.2001 \> Lis�tty arkkitehtuurikuvaus sek� tyyliohje (AK) \\
0.3 \> 26.02.2001 \> Korjattu yleiskuvaus ja arkkitehtuurikuvausta (AK) \\
0.9 \> 5.3.2001   \> Kasattu kokonaisuudeksi (AK) \\
1.0 \> 9.3.2001	  \> Korjattu virheit� ja yhdistelty irrallisia kappaleita (AK) \\

\end{tabbing}

T�st� dokumentista vastaa Antti Koskinen (AK).
}

\newpage
\tableofcontents
\newpage

\pagestyle{myheadings}
\markright{}
\setcounter{page}{1}

%%%%%%%%%%%%% ASIASIS�LT� %%%%%%%%%%%%%%%%
%%%%%%%%% JOHDANTO %%%%%%%%%
\section{Johdanto (AK)}\label{Johdanto}

T�ss� suunnitteludokumentissa esitellaan JouTo-ohjelmistotuotantoprojektin tuotteena syntyv� uutistoimittajan ty�v�line. JouTo on lyhenne englannin kielen sanoista {\it "A Journalist's Tool"}.

\subsection{M��ritelm�t, termit, lyhenteet}\label{M��ritelm�t, termit, lyhenteet}

{\small
\begin{description}
\item[CSS] Cascading Style Sheets, W3C:n kehitt�m�, suosittu
HTML- ja XML-dokumenttien ulkoasun m��rittelyyn tarkoitettu kieli. \\
{\footnotesize Lis�tietoja: {\tt http://www.w3.org/Style/CSS/}}
\item[DoReMi] Document Management, Information Retrieval, Text and Data Mining.
TKTL:n tutkimusryhm�, joka vet�� TYTTI-projektia. \\
{\footnotesize Lis�tietoja: {\tt http://www.cs.helsinki.fi/research/doremi/}}
\item[DTD] Document Type Definition, W3C:n kehitt�m�
rakenteisten dokumenttien rakenteen m��rittelykieli. \\
\item[EPS] Encapsulated PostScript, kehystetty versio PostScript-kielisest�
ohjelmasta. Ohjelmatiedostoon lis�tty kehys m��ritt�� rajat tiedoston
sis�ll�lle ja mahdollistaa sen sijoittamisen haluttuun kohtaan sivua.
\item[HTML] Hypertext Markup Language, WWW-sivujen sis�ll�n
kuvauksessa k�ytetty koodaus. \\
{\footnotesize Lis�tietoja: {\tt http://www.w3.org/pub/WWW/MarkUp/}}
\item[IPTC] International Press Telecommunications Council, kansainv�linen yhteisty�elin,
joka organisoi uutisten m��rittely� ja ryhmittely�.\\
{\footnotesize Lis�tietoja: {\tt http://www.iptc.org/}}
\item[Java] Sunin kehitt�m� ohjelmointikieli ja j�rjestelm�riippumaton
ajoymp�rist�. \\
{\footnotesize Lis�tietoja: {\tt http://www.sun.com/java/}}
\item[Javadoc] Sunin kehitt�m� java-koodin dokumentointi kieli\\
{\footnotesize Lis�tietoja: {\tt http://www.sun.com/java/}}
\item[Java SDK] Sunin kehitt�m� Java-ohjelmointiymp�rist�.\\
{\footnotesize Lis�tietoja: {\tt http://www.javasoft.com/products/}}
\item[JDBC] Java Database Connectivity, Java-kielen rajapinta tietokantojen k�ytt��n.
\item[NITF] News Industry Text Format, toimittajien kehitt�m� ja standardoima
XML-pohjainen uutisartikkelien m��rittelykieli.
{\footnotesize Lis�tietoja: {\tt http://www.nitf.org}}
\item[PostScript] Adoben kehitt�m� suosittu sivunkuvauskieli.
Tulostettava sivu voidaan l�hett�� PostScript-kirjoittimelle tiiviin�
PostScript-ohjelmana tilaaviev�n raakadatan sijaan.
\item[TKTL] Helsingin yliopiston tietojenk�sittelytieteen laitos. \\
{\footnotesize Lis�tietoja: {\tt http://www.cs.helsinki.fi}}
\item[TYTTI] Tietoty�l�isen ty�asema. Vuosina 2000-2002 k�ynniss�
oleva tutkimusprojekti Helsingin yliopiston tietojenk�sittelytieteen
laitoksella, rahoittajina TEKES sek� viisi
suomalaisyrityst�: Nokia, Alma Media, Sanoma-WSOY, Vaisala ja
Lingsoft. TYTTI-projektin vastuuhenkil� Helena Ahonen-Myka ja
projektip��llikk� Greger Lind�n toimivat JouTo-projektin
asiakkaina. \\
{\footnotesize Lis�tietoja: {\tt http://www.cs.helsinki.fi/research/doremi/TYTTI/index.html}}
\item[W3C] World Wide Web Consortium, kansainv�linen yhteisty�elin,
joka koordinoi WWW-tekniikan ja -standardien kehityst�. \\
{\footnotesize Lis�tietoja: {\tt http://www.w3.org/pub/WWW/Consortium/}}
\item[WWW] World-Wide Web, Internetiss� toimiva palvelu, joka
mahdollistaa tekstin ja kuvien jakamisen helposti ja edullisesti
verkon lukemattomille k�ytt�jille. WWW:ss� aineisto jaetaan
sivuihin, jotka sijoitetaan WWW-palvelimelle tavallisina tiedostoina
ja hakemistoina.
\item[XML] Extensible Markup Language, W3C:n kehitt�m�
rakenteisten dokumenttien m��rittelykieli. \\
{\footnotesize Lis�tietoja: {\tt http://www.w3.org/XML/}}
\item[XSL] Extensible Stylesheet Language, W3C:n kehitt�m�
XML-dokumenttien ulkoasun m��ritykseen tarkoitettu kieli. \\
{\footnotesize Lis�tietoja: {\tt http://www.w3.org/Style/XSL/}}
\end{description}
}

\subsection{Viitteet}\label{Viitteet}

{\small
\begin{description}
\item{NITFDTD} News Industry Text Format DTD version 2.5 8/2000, {\tt http://www.nitf.org}
\item{HTTP-protokolla} Hypertext Transfer Protocol -- HTTP/1.1,  {\tt ftp://ftp.isi.edu/in-notes/rfc2616.txt}
\end{description}
}

\subsection{Dokumentin rakenne}\label{Dokumentin rakenne}

Ensimm�inen luku, Johdanto, esittelee t�m�n dokumentin rakenteen. Luvussa k�yd��n l�pi my�s dokumentiss� k�ytett�v�t termit, lyhenteet ja m��ritelm�t. 

Toinen luku kertoo ohjelmiston yleiskuvauksen. Luvussa k�yd��n l�pi ohjelman laitteisto ja ohjelmistoymp�rist�j�.

Kolmannessa luvussa on k�sitelty ohjelman arkkitehtuurikuvaus. Kuvaus k�yd��n l�pi usealla eri tasolla. T�ss� luvussa k�yd��n l�pi my�s ohjelman eri luokkien v�liset suhteet.

Nelj�s luku, Luokkakuvaukset, k�y l�pi yksityiskohtaisesti ohjelman eri luokat ja niiden kuvaukset.

Viidenness� luvussa esitell��n k�ytt�liittym�n suunnittelu. Luvussa k�yd��n l�pi k�ytt�liittym�n eri osat ja kuvataan ne.

\newpage

\section{Yleiskuvaus (AK,ET,HT)}\label{Yleiskuvaus}

\subsection{Sovellusalueen kuvaus}\label{Sovellusalueen kuvaus}

JouTo-ohjelmistotuotanto\-projekti on kev��ll� 2001 Helsingin yliopiston
tietojen\-k�sittely\-tieteen laitoksella j�rjestett�v�n 
Ohjelmisto\-tuotanto\-projekti-kurssin n�ytety�.
\\ \\
Ty� liittyy osittain my�s laitoksella k�ynniss� olevaan 
DoReMi\--tutkimus\-ryhm�n "TYTTI- Tietoty�\-l�isen ty�asema"-projektiin, 
jossa on mukana rahoittajina joukko suomalaisia teknologia\-yrityksi� ja 
Teknologian kehitt�miskeskus. JouTo-projektin tarkoituksena ei kuitenkaan 
ole valmistaa valmista tuotetta kaupalliseen tarkoitukseen. Tuotettava 
ohjelmisto toimii prototyyppin�, jota voidaan kehitt�� my�hemmin lis��
seuraavissa Ohjelmistotuotanto-projekteissa. 

\subsection{Laitteistoymp�rist� (ET,HT)}\label{Laitteistoymp�rist�}    

Ohjelmiston arkkitehtuuri on asiakas-palvelin pohjainen.
Asiakaskoneissa py�ritett�v� sovellus vaatii Pentium-teholuokan koneen,
jossa on toimiva tietoliikeneyhteys. Palvelimen puolen 
tehovaatimukset on esitetty m��rittelydokumentissa kappaleessa 7.2. 
{\em{Palvelimen suorituskyky}}. Toimintaynp�rist�ksi oletetaan 
toimituksen sis�inen verkko.

\subsection{Ohjelmistoymp�rist� (ET,HT)}\label{Ohjelmistoymp�rist�}

Ohjelmistoa k�ytet��n WWW-selaimen kautta. Ohjelmiston asiakkaan puolen 
k�ytt�liittym�, editori, toteutetaan  WWW-selaimessa toimivana graafisena
Java Applettina. Appletissa k�ytet��n Javan version 1.2 ominaisuuksia ja
valmiita komponentteja, kuten Swing-kirjastoa. Lis�ksi k�ytet��n
JouTo-projektin ulkopuolella toteutettuja Java-kirjastoja, Xerces XML-parseria
ja Mark Wutkan tekem��n DTD-parseria. N�iden lis�ksi ohjelmistossa luodaan
omia tietorakenteita sek� XML-puun k�sittely� ett� varsinaisen artikkelin
muokkausta varten.
\\
Artikkelit ja artikkelipohjat tallennetaan tietokantaan XML-muidossa, josta ne pystyt��n 
my�s hakemaan jatkomuokkausta varten. Tietokanta-operaatioista ja tietokannan 
k�sittelyst� huolehtivat JouTo-projektissa luodut Java Servlet-komponentit. 
N�m� komponentit k�ytt�v�t JDBC-rajapintaa tietokannan k�sittelyss�. 
JDBC-tietokantarajapinta kuuluu osana Java 1.2 - standardiin. \\
\\
Palvelinpuolen Servlettien ja asiakkaanpuolen Appletin v�lill� tietoja
v�lit�� tietoliikenne-komponentti. T�m� komponentti luodaan JouTo-projektin
toimesta.

\subsection{Toteutuksen keskeiset reunaehdot}\label{Toteutuksen keskeiset reunaehdot}

Ohjelmiston tulee toimiva Helsingin Yliopiston tietokonej�rjestelm�ss� sek� Linux- ett�
Windows-ymp�rist�iss�. Ohjelmiston on oltava valmis viimeist��n 24.4.2001, jolloin se
palautetaan asiakkaille ja ohjaajille.

%%%%%%%%% ARKKITEHTUURIN KUVAUS %%%%%%%%%

\section{Ohjelmiston arkkitehtuurikuvaus (PH, ET ja HT)}
	\label{Ohjelmiston arkkitehtuurikuvaus}

T�ss� kappaleessa selvitet��n ohjelmiston arkkitehtuuria. 
Kappale \ref{Yleinen arkkitehtuurikuvaus} kuvaa ohjelmiston arkkitehtuuria
yleisell� tasolla. Kappale \ref{Tarkempi arkkitehtuurikuvaus} kuvaa arkkitehtuuria
tarkemmalla tasolla tietovuokaavioiden avulla. 
Kappaleessa \ref{Palvelimen yksityiskohtainen arkkitehtuurikuvaus} kuvataan palvelimen
puolen arkkitehtuuri yksityiskohtaisesti.
Kappaleessa \ref{Luokkien v�liset suhteet} kuvataan j�rjestelm�n luokat ja niiden
v�liset suhteet. T�ss� kappaleessa kuvataan my�s asiakaspuolen yksityskohtainen 
arkkitehtuuri.

\subsection{Yleinen arkkitehtuurikuvaus}\label{Yleinen arkkitehtuurikuvaus}

Ohjelmiston arkkitehtuuri on asiakas-palvelin pohjainen. Asiakkaan puolen 
ohjelmisto on WWW-selaimessa toimiva Java-sovelma (Applet), ja palvelimen
puolen ohjelmisto (Servlet) huolehtii tietojen tallennuksesta sek�
latauksesta tietokannasta.
\\
\begin{figure}[!h]
\centering  
\includegraphics{arkkit.eps} 
\caption{Ohjelmiston arkkitehtuuri}\label{Ohjelmiston arkkitehtuuri} 
\end{figure} 
\\
Kuvassa \ref{Ohjelmiston arkkitehtuuri} n�hd��n ohjelmiston arkkitehtuuri yleisell� tasolla.\\

\subsection{Tarkempi arkkitehtuurikuvaus}\label{Tarkempi arkkitehtuurikuvaus}

T�ss� kappaleessa kuvataan ohjelmiston arkkitehtuuria hieman tarkemmin kuin 
kappaleessa \ref{Yleinen arkkitehtuurikuvaus}
\\
\begin{figure}[!h]
\centering  
\includegraphics{taso1.eps} 
\caption{Ohjelmiston tietovuokaavio - 1. taso}\label{Ohjelmiston tietovuokaavio - 1. taso}
\end{figure} 
\\
Kuvassa \ref{Ohjelmiston tietovuokaavio - 1. taso} n�hd��n ohjelmiston toiminta yleisell� tasolla (tietovuokaavion 1. taso). \\

\begin{figure}[!h]  
\centering
\includegraphics{taso2.eps} 
\caption{Ohjelmiston tietovuokaavio - 2. taso}\label{Ohjelmiston tietovuokaavio - 2. taso} 
\end{figure} 

Kuvassa \ref{Ohjelmiston tietovuokaavio - 2. taso} n�hd��n ohjelmiston komponenttien 
ja erilaisten tietovarastojen sijoittelu ja niiden keskin�inen toimintalogiikka.
\\
K�ytt�j� k�ytt�� editoria artikkelien k�sittelyyn. Editori on
toteutettu Java-sovelmalla (Applet), joka toimii k�ytt�j�n 
WWW-selaimessa. K�ytt�j�n ohjelmisto on jakautunut nelj��n osa-alueeseen,
moottoriin, editoriin, DTD-j�sentimeen sek� tallennus/lataus-osaan.
\\
\emph{Editori-osa} huolehtii k�ytt�liittym�n luomisesta k�ytt�j�lle, sek� k�ytt�j�n
sy�tteiden v�litt�misest� eteenp�in moottorille. Editori-osa muokkaa
k�ytt�liittym�n valitun artikkelin mukaisesti ja huolehtii ett� k�ytt�j� voi
luoda vain valitun artikkelin mukaisia rakenteita. Editori-osa toimii 
rajapintana k�ytt�j�n ja varsinaisen ohjelmiston toiminnan v�lill�.
\\
\emph{DTD-j�sennin} huolehtii valitun DTD:n tulkitsemisesta ja s��nt�verkon luomisesta.
T�m�n verkon avulla valitun artikkelin oikeellisuutta pystyt��n tarkkailemaan ja 
k�ytt�liittym�n avulla ohjaamaan.
\\
\emph{Tallennus/lataus-osa} huolehtii kommunikoinnista palvelimen puolen ohjelmiston
(Servlet) kanssa. Tallennus/lataus-osan rajapinnan kautta suoritetaan kaikki
lataus- ja tallennusoperaatiot.
\\
\emph{Mootori} huolehtii ohjelman toimintalogiikasta ja muiden osien ohjaamisesta. 
Moottori huolehtii muiden osien keskin�isest� kommunikoinnista sek� suorittaa 
tarvittavat operaatiot ohjelman ajamiseksi.
\\ \\
Servlet huolehtii artikkelien ja DTD:ien latauksesta, tallennuksesta ja
poistamisesta tietokannasta. Servlet on toteuttu Java-sovelluksena, joka 
py�rii palvelimen Java-moottorin (Java-engine) avulla palvelimen prosessina.
Servlet ottaa vastaan editorista tulleita sy�tteit�, tekee tarvittavat
toimenpiteet palvelimen puolella ja palauttaa tulosteet takaisin editorille.
Servlet on ainoa komponentti, joka p��see k�sittelem��n tietokannan sis�lt��.
Servlet tarjoaa appletille rajapinnan tietokanta-operaatiohin. N�in tietokannan
rakenne pysyy ehe�n� ja toteutus piilossa ulkopuolisilta elementeilt�.
\\ \\
Tietokantaan on tallennettuna eri DTD:t, DTD:den mukaiset artikkelit, eri
k�ytt�jien tiedot sek� muut JouTo-ohjelmiston tarvitsema informaatio.
Tietokanta on Oracle 8-pohjainen ja sijaitsee Helsingin Yliopiston 
atk-keskuksen \emph{Kontti}-\-tieto\-kanta\-palvelimella. Tietokantaan on luotu
tarvittavat taulut ja oikeudet, jotta JouTo-ohjelmistoa pystyy ajamaan.
\\
Tarkempaa tietoa tietokannasta ja sen rakenteesta l�ytyy kappaleesta \ref{Tietokannan kuvaus}

\subsection{Palvelimen yksityiskohtainen arkkitehtuurikuvaus}\label{Palvelimen yksityiskohtainen arkkitehtuurikuvaus}

Kuvassa \ref{Palvelimen tietovuokaavio - 3. taso} n�hd��n palvelimen ohjelmiston komponenttien ja erilaisten tietovarastojen
sijoittelu ja niiden keskin�inen toimintalogiikka.

\begin{figure}[!h]  
\centering
\includegraphics{servlet1.eps} 
\caption{Palvelimen tietovuokaavio - 3. taso}\label{Palvelimen tietovuokaavio - 3. taso} 
\end{figure} 

\emph{Database} hoitaa rajapinnan ja liikenn�innin tietokantaan.


\emph{loadArticle} huolehtii halutun artikkelin lataamisesta tietokannasta.
T�m�n servletin kautta hoidetaan artikkelien siirt�minen asiakassovellukselle palvelimelta.
Jos tietokantaoperaatio ep�onnistuu palautetaan virheilmoitus\\
\\ \\
\emph{loadDTD} huolehtii halutun DTD:n lataamisesta tietokannasta.
T�m�n servletin kautta hoidetaan DTD:iden siirt�minen asiakassovellukselle palvelimelta.
Jos tietokantaoperaatio ep�onnistuu palautetaan virheilmoitus\\
\\ \\
\emph{saveArticle} huolehtii asiakassovellukselta tulleen artikkelin tallennuksesta
tietokantaan. Servletti pit�� my�s yll� muita artikkeliin liittyvi� kentti� tietokannassa.
Jos tietokantaoperaatio ep�onnistuu palautetaan virheilmoitus\\
\\ \\
\emph{listArticles} listaa tietokannassa olevista artikkeleista otsikkotietoja, jotka se 
l�hett�� asiakassovellukselle.
Jos tietokantaoperaatio ep�onnistuu palautetaan virheilmoitus\\
\\ \\
\emph{listDTD} listaa tietokannassa olevista DTD:ist� otsikkotietoja, jotka se 
l�hett�� asiakassovellukselle.
Jos tietokantaoperaatio ep�onnistuu palautetaan virheilmoitus\\

\subsection{Luokkien v�liset suhteet}\label{Luokkien v�liset suhteet}

T�ss� kappaleessa kuvataan eri luokkien ja osaohjelmistojen v�liset suhteet ja
riippuvaisuudet.

Kuvassa \ref{Moduulien rakenne} (Liite \ref{liite1}, sivulla \pageref{Moduulien rakenne}) olevat moduulit voidaan jakaa toimintojensa puolesta
kolmeen selke��n osaan. N�m� osakokonaisuudet ovat sis�ll�n k�sittelyyn keskittyneet
moduulit, tiedon tallennukseen ja lataukseen keskittyneet moduulit sek� k�ytt�j�n kanssa
kommunikointiin keskittyneet moduulit.

\begin{figure}[!h]
\centering
\includegraphics{uimanager.eps}
\caption{K�ytt�liittym�n rakenne}\label{K�ytt�liittym�n rakenne}
\end{figure}

Kuvasta \ref{K�ytt�liittym�n rakenne} n�hd��n k�ytt�j�n kanssa kommunikointiin keskittyneet
luokat. N�ist� rungon muodostaa UIManager-luokka, joka sis�lt�� viitteet kaikkiin
k�ytt�liittym�n komponentteihin. UIManager toimii k�ytt�liittym�n runkona. Se toteuttaa
kaikki k�ytt�liittym�lt� saatavat komennot ja hoitaa my�skin k�ytt�liittym�n piirt�misen.

\begin{figure}[!h]
\centering
\includegraphics{treemanager.eps}
\caption{Tietosis�ll�n rakenne}\label{Tietosis�ll�n rakenne}
\end{figure}

Kuvasta \ref{Tietosis�ll�n rakenne} n�hd��n tietosis�ll�n muokkaamiseen tarvittavia luokkia.
Kuvassa n�kyv� luokka TreeManager toimii ohjelman tietosis�ll�n runkona ja samalla my�s
muodostettavan puun vastaavana elementtin�. TreeManagerista voidaan suorittaa koko puuta
koskevat yleiset operaatiot. Puu rakennetaan Node-elementeist�, jotka sis�lt�v�t 
yksil�kohtaisia operaatioita, jotka kohdistuvat juuri tiettyyn kohtaan puuta. TreeManager
on my�s yhteydess� XMLParseriin sek� DTDWutka-parseriin, joita k�ytet��n uutta puuta luotaessa.

\begin{figure}[!h]
\centering
\includegraphics{communications.eps}
\caption{IO rakenne}\label{IO rakenne}
\end{figure}

Kolmannen osakokonaisuuden muodostaa kuvassa \ref{IO rakenne} olevat Communications-luokka
sek� servletit ja Database-luokka. N�m� elementit vastaavat ohjelmiston tiedon fyysisest�
tallennuksesta ja latauksesta.

\begin{figure}[!h]
\centering
\includegraphics{p��osat.eps}
\caption{Yleisrakenne}\label{Yleisrakenne}
\end{figure}

Kuvassa \ref{Yleisrakenne} n�hd��n miten eri osakokonaisuudet liittyv�t toisiinsa.
UIManager toimii TreeManagerin toimintojen kutsujana ja tiedon v�litt�j�n�. UIManager
toimii my�s kutsujana ja tiedonv�litt�j�n� tallennus ja lataus tapauksissa.

\subsection{Tietokannan kuvaus (JS)}\label{Tietokannan kuvaus}
J�rjestelm��n kuluva tietokanta rakentuu nelj�st� taulusta (kuva \ref{Taulujen kuvaus}):
\emph{alias, journalist, document ja dtd}. Jokaisessa taulussa on
sarake \emph{lid}, joka yksil�i rivin. T�m� sarake on my�s
jokaisen taulun p��avain. Tietokantaan kirjoittamisen ja sielt�
lukemisen hoitaa yksinomaan palvelinohjelmisto.

\begin{figure}[!h]
\centering
\includegraphics{tietokanta8.eps}
\caption{Taulujen kuvaus}\label{Taulujen kuvaus}
\end{figure}

\subsubsection{Taulu alias}\label{Taulu alias}
\emph{Alias}-tauluun tallennetaan toimittajien mahdolliset
nimimerkit eli aliakset. Jokaisella toimittajalla voi olla
rajattomasti aliaksia. Ohessa jokainen taulun sarake kuvauksineen.
\begin{tabbing}

mmmmmmmmmm \= mmmmmmmmmmmmmmm  \kill

\bf{Sarake:} \> \bf{Teht�v�:} \\
\>  \\

lid \> P��avain (\emph{number}), joka yksil�i aliaksen.    \\

ljournalistid  \>  Vierasavain (\emph{number}), joka viittaa journalist-taulun    \\
\> p��avaimeen (\emph{lid}). Sarakkeen avulla selvi�� kenen
\\
\> toimittajan alias on kyseess�.
\\

salias \>   Alias tekstin� (\emph{varchar}).  \\

\end{tabbing}


\subsubsection{Taulu document}\label{Taulu document}
Tauluun \emph{document} tallennetaan editorilla tehdyt dokumentit.
Pelk�n asiakirjan lis�ksi tauluun tallennetaan monia tietoja muun
muassa hakujen helpottamiseksi. Ohessa jokainen taulun sarake
kuvauksineen.

\begin{tabbing}

mmmmmmmmmm \= mmmmmmmmmmmmmmm  \kill


\bf{Sarake:} \> \bf{Teht�v�:} \\
\>  \\

lid \> P��avain (\emph{number}), joka yksil�i aliaksen.    \\

sname \> Dokumentin nimi muodossa \emph{varchar}.    \\

sdescription \> Pidempi selitys dokumentin sis�ll�st� (\emph{varchar}).    \\

date \> Dokumentin viimeisin tallennusaika (muodossa \emph{date}).    \\

skeywords \> Kuvaavia hakusanoja, jotka helpottavat hakua (\emph{varchar}).    \\

sdata \> Sarake, johon itse dokumentti on tallennettu (\emph{long}).    \\

llock \> Kirjoituslukko, joka toimii samalla vierasavaimena journalist\\
\>-tauluun. Jos lukko on m��ritelty, n�kee samalla kuka sen on\\
\> varannut.\\

lockdate \> Lukon asetusaika (muodossa \emph{date}). T�t� tietoa k�ytet��n     \\
\> varmistamaan, ett� lukko ei ole j��nyt p��lle esimerkiksi
\\
\> tietoliikenneyhteyden katkeamisen vuoksi.\\

ldtdid \> Vierasavain, joka osoittaa dtd-taulun p��avaimeen.
\\
\> Sarakkeesta k�y ilmi mink� dtd:n mukaan asiakirja on luotu. \\

ljournalistid  \>  Vierasavain (\emph{number}), joka viittaa journalist-taulun     \\
\>p��avaimeen (\emph{lid}). T�m�n sarakkeen avulla selvi�� \\
\>dokumentin edellinen tallentaja.\\

salias \>   Alias tekstin� (\emph{varchar}).  \\

\end{tabbing}

\subsubsection{Taulu dtd}\label{Taulu dtd}
Tauluun \emph{dtd} tallennetaan dokumenttirakenteen m��r��v�t
dtd-tiedostot. P��avaimen \emph{lid} lis�ksi tauluun tallennetaan
dtd:n nimi (\emph{sname}), kuvaus (\emph{description}) ja itse
dtd, joka tulee sarakkeeseen (\emph{sdata}). Ohessa jokainen
taulun sarake kuvauksineen.

\begin{tabbing}

mmmmmmmmmm \= mmmmmmmmmmmmmmm  \kill

\bf{Sarake:} \> \bf{Teht�v�:} \\
\>  \\

lid \> P��avain (\emph{number}), joka yksil�i DTD:n.    \\

sname  \>  DTD:n nimi \emph{(varchar)}.    \\
sdescription \> Pidempi kuvaus DTD:st� \emph{(varchar)}.
\\

sdata \> Sarake, johon itse DTD on tallennettu (\emph{long}).

\end{tabbing}


\subsubsection{Taulu journalist}\label{Taulu journalist}
Tauluun \emph{journalist} tallennetaan toimittajien tiedot.
Taulussa on p��avaimen \emph{lid} lis�ksi \emph{sname}, johon
tallennetaan toimittajan nimi. Ohessa jokainen taulun sarake
kuvauksineen.

\begin{tabbing}

mmmmmmmmmm \= mmmmmmmmmmmmmmm  \kill

\bf{Sarake:} \> \bf{Teht�v�:} \\
\>  \\

lid \> P��avain (\emph{number}), joka yksil�i DTD:n.    \\

sname  \>  Toimittajan nimi \emph{(varchar)}.    \\

\end{tabbing}

%%%%%%%%%%%%%%%%%%%%%% LEIKEP�YT�

\subsection{Leikep�yt�toiminnot}

Tavallisesti appletit eiv�t p��se k�siksi k�ytt�j�rjestelm�n
leikep�yt��n, ainakaan selaimissa. Microsoft jakelee
kuitenkin pakettia, jolla oikeudet voidaan antaa
Explorer-selaimessa toimivalle sovelmalle.
JouTon editorin leikep�yt�toiminnot rakennetaan
varautuen mahdollisuuteen k�ytt�� j�rjestelm�n
leikep�yt��. K�ytt�j�rjestelm�n leikep�yd�n avulla
ainakin tekstimuotoista tietoa voitaisiin siirt��
eri sovellusten v�lill�.

Leikep�yt� toteutetaan Javassa {\em Clipboard}-oliona,
jolle voidaan antaa sis�ll�ksi {\em Transferable}-rajapintaa
soveltava olio. JouTossa leikep�yt�toimintoja
hallinnoi erityinen {\em ClipboardManager}-luokka, joka
sis�lt�� Clipboard-olion. T�m�n se luo
k�ytt�j�rjestelm�n leikep�yd�ksi, mik�li mahdollista.
ClipboardManager sis�lt�� my�s edellisen leikep�yd�n
sis�ll�n peruutustoimintoa varten. Olio kuuntelee
leikep�yt�toimintoja k�skytt�vi� {\em copy-}, {\em cut-} ja
{\em paste}-painikkeita sek� {\em Edit}-valikon vastaavia
valintarivej�.

ClipboardManager ottaa vastaan joko merkkijonomuotoista
sy�tett� mist� tahansa editorin tekstikent�st� tai
puurakenteista sy�tett� dokumentin rungon
muokkauskomponentin ({\em Body}-olion) k�skytt�m�n�.
Sy�te haetaan viimeksi fokusoidusta komponentista.
Tieto viimeksi aktivoituneesta komponentista on
UIManagerilla, jolta ClipboardManager saa selville
leikep�yt�sy�tteen l�hteen.
Jokaisen tekstikent�n aktivoitumista t�ytyy kuunnella.

\subsection{Peruutustoiminto}

JouTo-editorissa on yhden askelen peruutustoiminto.
Kaikki TreeManager-luokan kautta elementtipuuhun
kohdistuvat muutokset ovat peruutettavissa.
My�s {\em cut}- ja {\em paste}-leikep�yt�toiminnot ovat
peruutettavia. {\em Copy}-k�sky� ei peruuteta, koska
se muuttaa vain leikep�yd�n sis�lt��.
Leikep�yt�toimintojen peruuttamisesta
huolehtii ClipboardManager ja puun muutoksien
peruuttamisesta TreeManager. Peruutuspainiketta ja
Edit-valikon {\em undo}-valintaa kuuntelee kuitenkin
UIManager, joka tiet��, oliko edellinen muokkaustoiminto
leikep�yt�toiminto vai muu suoraan puun rakenteeseen
kohdistettu muokkausk�sky.

Jokaisen cut- ja paste-toimenpiteen p��tteeksi
ClipboardManager suorittaa UIManagerin
{\em setUndoer}-metodin ja antaa viitteen itseens�.
TreeManager toimii vastaavasti.
Kun k�ytt�j� antaa peruutusk�skyn, ClipboardManager
kutsuu {\em undoer}-olion {\em undo}-metodia.

Jokaisen peruutettavan muokkaustoiminnon yhteydess�
ClipboardManager ja TreeManager p�ivitt�v�t
oman undo-muuttujansa, joka osoittaa sen metodin, joka
suoritetaan, jos UIManager kutsuu undo-metodia.

Edellisen muutoksen peruuttamiseksi TreeManagerill�
on muistissa kokonaisina viimeksi muutetut
lapsielementtivektori ja attribuuttitaulukko.
Pelkki� olioviitteit� sis�lt�vi� vektoreita ja
taulukoita on nopea kopioida.

Kun leikep�yd�lle tuodaan uusi sis�lt�, se pit��
kopioida. Vastaavasti paste-k�skyn yhteydess�
sijoitetaan kohteeseen leikep�yd�n sis�ll�n kopio.
Huomattavan suuria puurakenteita kopioitaessa
saattaa esiinty� viivett�. {\em TreeNode}-olioiden
{\em cloneTree}-metodi palauttaa solmusta alkavan
alipuun kopion.

Yhden askelen peruutustoiminto tarkoittaa, ett�
peruutustoiminnon peruuttaminen johtaa tilaan ennen
edellist� peruutusk�sky� ({\em redo}). ClipboardManageriss�
t�m� tarkoittaa leikep�yd�n korvaamista viimeksi
korvatulla leikep�yd�n sis�ll�ll�.
TreeManageriss� vastaavasti vaihdetaan viimeksi
luotu lapsielementtivektori sen korvaamaan
vektoriin tai viimeksi luotu attribuuttitaulukko
sen korvaamaan taulukkoon.

Kun esimerkiksi poistetaan elementti, muutos kohdistuu
sen is�elementin lapsivektoriin. Asetetaan {\em oldChildren}
viittaamaan t�h�n lapsivektoriin, luodaan vektorin
pohjalta kokonaan uusi lapsivektori j�tt�m�ll�
kohde-elementti v�list� pois ja linkitet��n
is�elementti t�h�n uuteen lapsivektoriin.
"Poistettua" elementti� ei siis tuhottu, vaan
is�elementin n�kym�� solmuihin rajoitettiin.
Peruutustoiminto on nopea --- tarvitsee vain
vaihtaa kesken��n {\em oldChildren}-viite ja is�elementin
{\em children}-viite.

ClipboardManagerin cut- ja paste-toiminnot koostuvat
my�s puun muokkaustoiminnoista, joten peruuttavat
metodit {\em uncut} ja {\em unpaste} kutsuvat
TreeManagerin undo-metodia. cut- ja paste-metodeissa
on pidett�v� huolta siit�, ett� UIManagerille
ilmoitetaan {\em undoer} puun muokkausmetodien
kutsumisen j�lkeen, koska niiss� TreeManager ilmoittaa
"peruuttajaksi" itsens�.


%%%%%%%%% LUOKKAKUVAUKSET %%%%%%%%%

\section{Luokkakuvaukset}\label{Luokkakuvaukset}

T�ss� luvussa esitelt��n ohjelman eri luokat. Luokat kuvataan yksitellen. Jokaisesta luokasta kerrotaan sanallisesti luokan toimintaa, sek� luetellaan luokan attribuutit ja metodit lyhyine kuvauksineen.

\subsection{UIManager (JS)}\label{UIManager} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

UIManager-olio k�ynnist�� sovelluksen. Se toimii hallinnoivana
luokkana, ja luo kahvat muihin luokkiin constructorissaan. Sen
teht�v� on huolehtia k�ytt�liittym�n toiminnasta ja dokumentin
editoinnista. K�ytt�liittym�oliot kutsuvat UIManageria ja
k�ynnist�v�t toimintoja. UIManager jakautuu metodeihin, jotka
k�yv�t ilmi kuvasta \ref{Kuva: UIManager}.

\begin{figure}[!h]
\centering
\includegraphics{uim.eps} \caption{UIManager-luokan metodit}
 \label{Kuva:
UIManager}
\end{figure}


\subsubsection{Rajapinnat (JS)} Koska UIManager on muita luokkia
hallinnoiva luokka, sill� on paljon rajapintoja. UIManagerista on
rajapinta jokaiseen graafiseen komponenttiin, jota editorissa
esiintyy. N�it� komponentteja ovat: Body, Menu, Toolbar, Headers,
SaveAsDialog, NewDocumentDialog, OpenDocumentDialog ja TextDialog.
Graafisten komponenttien lis�ksi on rajapinnat Communications ja
TreeManager -luokkiin. Koko j�rjestelm�n rajapinnat k�yv�t ilmi
kuvasta \ref{Kuva: ohjelmiston rakenne}.

\subsubsection{Attribuutit}
{\em private Body body}\\
Kahva Body-elementtiin.\\\\
{\em private Menu menu}\\
Kahva Menu-elementtiin.\\\\
{\em private Toolbar toolbar}\\
Kahva Toolbar-elementtiin.\\\\
{\em private Headers headers}\\
Kahva Headers-elementtiin.\\\\
{\em private SaveAsDialog saveAsDialog}\\
Kahva SaveAsDialog-elementtiin.\\\\
{\em private OpenDocumentDialog openDocumentDialog}\\
Kahva OpenDocumentDialog-elementtiin.\\\\
{\em private TextDialog textDialog}\\
Kahva TextDialog-elementtiin.\\\\
{\em private Communications communications}\\
Kahva Communications-elementtiin.\\\\
{\em private TreeManager treeManager}\\
Kahva TreeManager-elementtiin.\\\\
{\em private ClipBoardManager clipBoardManager}\\
Kahva ClipBoardManager-elementtiin.\\\\
{\em private Node bodyRoot}\\
Kahva ensimm�iseen Body-solmuun (juureen).\\\\
{\em private Node headersRoot}\\
Kahva ensimm�iseen Headers-solmuun (juureen).\\\\
{\em private Object undoer}\\
Tieto edellisen muutoksen tekij�st�.\\\\
{\em private int documentID}\\
Tieto k�sitelt�v�n dokumentin ID:st�.

\subsubsection{Metodit (JS)} Luokan metodit kuvataan t�ss� osassa.

\subsubsection*{boolean cut()}
\begin{description}
\item[parametrit:] -
\item[palauttaa:] Boolean arvon, josta k�y ilmi poiston onnistuminen
\item[toiminta:] Metodi kutsuu Body-metodin getSelectedArea-metodia,
joka palauttaa valitun alueen. Se kutsuu ClipBoardManagerin
cut-metodia, joka laittaa valitun rakenteen leikep�yd�lle. Valittu
alue poistetaan my�s k�ytt�liittym�st�.
\end{description}
Hahmotelma metodin toiminnasta:
\begin{verbatim}
if (clipBoardManager.cut(body.getSelectedArea())){
   body.DeleteArea();
   return true;
}
return false;

\end{verbatim}

\subsubsection*{boolean copy()}
\begin{description}
\item[parametrit:] -
\item[palauttaa:] Boolean arvon, josta k�y ilmi kopioinnin onnistuminen
\item[toiminta:] Metodi kutsuu Body-metodin getSelectedArea-metodia,
joka palauttaa valitun alueen, ja ClipBoardManagerin copy-metodia,
joka kopioi tiedot leikep�yd�lle.
\end{description}
Hahmotelma metodin toiminnasta:
\begin{verbatim}
return clipBoardManager(body.getSelectedArea());
\end{verbatim}


\subsubsection*{boolean paste()}
\begin{description}
\item[parametrit:] -
\item[palauttaa:] Boolean arvon, josta k�y ilmi liit�misen onnistuminen
\item[toiminta:] Metodi selvitt�� valitun kohteen Bodyn getCursorPosition
metodilla. Se kutsuu ClipBoardManagerin paste-metodia, joka
yritt�� leikep�yd�n sis�ll�n valittuun kohtaan. Jos liitt�minen
onnistuu, metodi kirjoittaa tiedot my�s k�ytt�liittym��n.
\end{description}
Hahmotelma metodin toiminnasta:
\begin{verbatim}
if (clipBoardManager(body.getCursorPosition()){
   paintToBody(clipBoardData);
   return true;
}
return false;
\end{verbatim}

\subsubsection*{void flush()}
\begin{description}
\item[parametrit:] -
\item[palauttaa:] -
\item[toiminta:] Metodi kutsuu kaikkia k�ytt�liittym�komponenttien
flush-metodeja. Metodit kirjoittavat puskureissa olevan datan
tietorakenteeseen.
\end{description}
Hahmotelma metodin toiminnasta:
\begin{verbatim}
body.flush();
.
.
\end{verbatim}

\subsubsection*{void save()}
\begin{description}
\item[parametrit:] -
\item[palauttaa:] -
\item[toiminta:] Metodi kutsuu aluksi flush-metodia ja sitten
TreeManagerin toString-metodia, joka palauttaa tietorakenteen
sis�ll�n xml-muotoon muunnettuna. Se yhdist�� n�m� tiedot muihin
k�ytt�liittym�st� saataviin tietoihin, ja kutsuu
Communications-luokan save-metodia, joka tallentaa tiedot.
K�ytt�j�� informoidaan onnistumisesta.
\end{description}
Hahmotelma metodin toiminnasta:
\begin{verbatim}
flush();

String saveData[4]=new String(documentID,saveAsDialog.DTDID,
   saveAsDialog.description,treeManager.toString());

if (communications.save(saveData))
   statusBar.write("Document saved.");

textDialog.write("Save failed.");
\end{verbatim}

\subsubsection*{Node load()}
\begin{description}
\item[parametrit:] -
\item[palauttaa:] Viitteen Bodyn ensimm�iseen solmuun.
\item[toiminta:] Metodi kutsuu aluksi Communications-luokan loadDTD ja
loadArticle-metodeja. N�m� palauttavat DTD:n ja artikkelin
String-muodossa. T�m�n j�lkeen metodi kutsuu TreeManagerin
createTree-metodia, joka luo puun n�ist� tiedoista. CreateTree
palauttaa viitteen ensimm�iseen solmuun. Lopuksi load p�ivitt��
k�ytt�liittym�n.
\end{description}
Hahmotelma metodin toiminnasta:
\begin{verbatim}
documentID=loadDialog.documentID;
String DTD=Communications.loadDTD(loadDialog.DTDID);
String article=Communications.loadArticle(documentID);
bodyRoot=treeManager.createTree(article,DTD);
return bodyRoot;
\end{verbatim}

\subsubsection*{String[][] listArticles()}
\begin{description}
\item[parametrit:] -
\item[palauttaa:] Artikkelilistan muodossa
(ID,DTDID,Nimi,Selitys).
\item[toiminta:] Metodi listArticles hakee tietokannasta listan tallennetuista
artikkeleista Communications luokan getArticleList-metodilla, ja
palauttaa sen kutsujalle.
\end{description}
Hahmotelma metodin toiminnasta:
\begin{verbatim}
return communications.getArticleList();
\end{verbatim}

\subsubsection*{String[][] listDTDs()}
\begin{description}
\item[parametrit:] -
\item[palauttaa:] DTD-listan muodossa (ID,Nimi).
\item[toiminta:] Metodi listArticles hakee tietokannasta listan tallennetuista
artikkeleista Communications-luokan getDTDList-metodilla, ja
palauttaa sen kutsujalle.
\end{description}
Hahmotelma metodin toiminnasta:
\begin{verbatim}
return communications.getDTDList();
\end{verbatim}

\subsubsection*{void redrawWindows()}
\begin{description}
\item[parametrit:] -
\item[palauttaa:] -
\item[toiminta:] Piirt�� kaikki n�yt�ll� olevat ikkunat uudestaan
tietorakenteen mukaisella datalla.
\end{description}
Hahmotelma metodin toiminnasta:
\begin{verbatim}
for each open dialog{
   killdialog;
   createdialog;
}
\end{verbatim}

\subsubsection*{boolean undo()}
\begin{description}
\item[parametrit:] -
\item[palauttaa:] Boolean arvon, joka kertoo toiminnon
onnistumisesta.
\item[toiminta:] Kutsuu ClipboarManagerin undo-metodia, joka
palauttaa ennen edellist� muutosta olleen tilanteen.
\end{description}
Hahmotelma metodin toiminnasta:
\begin{verbatim}
if (clipBoardManager.undo())
   return reDrawWindows();
return false;
\end{verbatim}

\subsubsection*{boolean setUndoer(Reference: Object)}
\begin{description}
\item[parametrit:] Viite kutsujaan.
\item[palauttaa:] -
\item[toiminta:] Asettaa viimeisen muutoksen tekij�ksi
parametrinaan saamansa olion attribuuttiin undoer.
\end{description}
Hahmotelma metodin toiminnasta:
\begin{verbatim}
undoer=Reference;
\end{verbatim}


\subsection{TreeManager (PH)} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
TreeManager-olio huolehtii yhden NITF-dokumentin hallinnasta kokonaisuutena.
Se vastaanottaa dokumentin merkkijonona UIManagerin v�lityksell�
Communications-oliolta ja rakentaa sen pohjalta
elementtipuun. Vaihtoehtoisesti se voi rakentaa uuden artikkelin pohjan.
Kun puu on luotu,
dokumentin muokkaaminen tapahtuu TreeManagerin muokkausmetodien kautta.
Metodit pit�v�t huolen siit�, ett� jokaisen muutoksen
j�lkeen dokumentti noudattaa rakennem��rittely�.
Tarvittaessa TreeManager palauttaa puun sis�ll�n XML-muodossa.

TreeManager perii luokalta {\em org.xml.sax.helpers.DefaultHandler}
rajapinnan SAX-j�sentimeen tapahtumank�sittelymetodeineen.
Puun elementit ovat Element-olioita ja elementtien attribuutit Attribute-olioita.

Kun sovelma vastaanottaa DTD:n, pit�� luoda uusi TreeManager-olio.
Kutsutaan createDTD-metodia, jolle annetaan rakennem��rittely parametrina
merkkijonomuodossa. Merkkijono k�sitell��n
{\em Mark Wutkan} DTD-j�sentimell�\footnote{http://www.wutka.com/dtdparser.html},
joka luo {\em DTD}-olion.
T�m� puolestaan sis�lt�� rakennem��rittelyss� esitellyt elementit
hajautustaulussa. Elementtien ja attribuuttien m��rittelyt j�sentyv�t eri
luokkien olioiksi. J�sennin ja sen luoma tietorakenne on kuvattu osoitteessa\\
{\tt http://www.wutka.com/dtdparserapi/}

Kun DTD on j�sennetty, TreeManager k�y l�pi elementtien lapsirajoitteet
ja tekee s��nn�llisist� lausekkeista ep�deterministisi� ��rellisi�
automaatteja muistuttavia s��nt�verkkoja.
S��nt�verkot rakentuvat ANode-olioista.
S��nt�verkot sijoitetaan hajautustauluun
{\em childConstraints} elementtien nimill�,
joilla validointiin k�ytett�v�t solmujen metodit p��sev�t niihin k�siksi.
%sek� DTDAny- ja DTDEmpty-oliot.

S��nt�verkkojen avulla tarkistetaan, johtaako elementin lapsisarjaan kohdistuva
muok\-kaus\-toi\-minto\footnote{Lapsisarjaan kohdistuvia muutoksia ovat
  lasten lis�ys, poisto, j�rjestyksen muuttaminen ja korvaaminen.}
DTD:n sallimaan rakenteeseen.
Elementin lapsisarjaan kohdistuva muutos sallitaan vain, jos sen
s��nn�llinen lauseke tai siit� luotu s��nt�verkko tuottaa
muutoksen tuloksena syntyv�n lapsisarjan.

Attribuutteihin liittyv�t rajoitteet selvi�v�t
DTD-j�sentimen elementtikohtaisesti luomista DTDAttribute-olioista.

Kun tietokannasta ladataan artikkeli, k�ytet��n elementtipuun
rakentamiseen {\em A\-pa\-che Xer\-ces Java}
-kirjaston\footnote{http://xml.apache.org/xerces-j/}
SAX-j�sennint�. XML-kirjaston dokumentaatio on osoitteessa\\
{\tt http://xml.apache.org/xerces-j/api.html}

Koska DTD:t ovat tietokannassa eik� niill� ole URL-osoitetta,
tieto DTD:st� ei kulje itse XML-osuuden mukana.
SAX-j�sennin tarkistaa vain vastaanotettavan dokumentin hyv�muotoisuuden.
J�sennint� k�ytet��n vain rakennettaessa ladatusta dokumentista
elementtipuuta.

Dokumentin j�sennys SAX-rajapinnalla on tapahtumaohjattua.
J�sennin lukee dokumenttia suoraviivaisesti alusta loppua kohti ja
jokaisen elementin alkaessa ja loppuessa l�hett�� SAX-tapahtuman.
XML-elementti validoidaan vasta
j�sentimen kohdatessa elementin lopun, jolloin vastaava SAX-tapahtuma siirt��
suorituksen {\em endElement}-metodiin.
Vasta t�ll�in kaikki lapsielementit ovat tiedossa. Lapsisarja validoidaan
s��nt�verkoilla ja attribuutit DTD-j�sentimen luomien
DTDAttribute-olioiden tiedoilla.

TreeManagerin {\em toString}-metodi palauttaa artikkelin XML-muodossa.

Kun luodaan uusi artikkeli, TreeManager rakentaa hyv�ksytt�v�n artikkelipohjan
l�pik�ym�ll� s��nt�verkkojen solmuja. Elementille lis�t��n aina
verkon ensimm�isen polun m��rittelem� lapsisarja.
Verkot rakennetaan niin, ett� ensimm�inen polku on p��s��nt�isesti lyhin mahdollinen.
Jos elementti ei vaadi lapsielementtej�, niit� ei luoda.

% Peruutustoiminto?
% Alue voidaan korvata leikep�yd�n sis�ll�ll� tai n�pp�intapahtuman merkill�.
% Kohde voidaan my�s tuhota.
% Leikep�yt�?

\subsubsection{Attribuutit}
{\bf private DTD dtd}\\
DTD-j�sentimen palauttama DTD-olio.

{\bf private UIManager UIManager}\\
Viite UIManageriin.

{\bf private Element root}\\
Viite elementtipuun juurisolmuun, joka on NITF-elementti.

{\bf private Element head}\\
Viite head-elementtiin.

{\bf private Element body}\\
Viite body-elementtiin.

%{\bf private Attribute docID}\\
%Viite dokumentin ID:hen,
%{\footnotesize nitf : head : docdata : doc-id(id-string)}.

%{\bf private Element docName}\\
%Viite dokumentin nimen sis�lt�v��n elementtiin,
%{\footnotesize \footnotesize nitf : head : title}.

%{\bf private Element docDate}\\
%Viite dokumentin muutosp�iv�m��r�n sis�lt�v��n elementtiin,
%{\footnotesize nitf : head : docdata : date.issue}.

%{\bf private Element keyList}\\
%Viite dokumentin avainsanat sis�lt�v��n elementtiin,
%{\footnotesize nitf : head : docdata : key-list}.

{\bf private Attribute[] childConstraints}\\
Hajautustaulu, joka sis�lt�� jokaista DTD:ss� m��ritelty�
elementti� kohti sen lapsirajoitteet esitt�v�n s��nn�llisen lausekkeen
pohjalta rakennetun s��nt�verkon. %tai DTDAny-olion tai DTDEmpty-olion.
Hajautustaulun avaimina k�ytet��n elementtien nimi�.

{\bf public final Hashtable BLOCKS}\\
Hajautustaulu, jossa luetellaan kaikkien lohkotyyppisten elementtien
tunnistenimet. Lohkoista tehd��n Block-olioita.

{\bf private Element curParent}\\
Elementti, jonka lapsia tai attribuutteja viimeksi muutettiin.

{\bf private Vector oldChildren}\\
{\em curParentin} edellinen lapsisarja.

{\bf private Attribute[] oldAttributes}\\
{\em curParent}in edellinen attribuuttisarja.

{\bf private Stack stack}\\
Pino, jota k�ytet��n rakennettaessa puuta XML-merkkijonosta.

{\bf private int undo}\\
Ilmaisee nykyisen peruutustoiminnon ja saa seuraavia arvoja:\\
{\footnotesize
{\bf public static final int NONE = 0}\\
{\bf public static final int RESTORE\_CHILDREN = 1}\\
{\bf public static final int RESTORE\_ATTRIBUTES = 2}}\\
Kun kutsutaan {\em undo}-metodia, se kutsuu {\em undo}-muuttujan arvon osoittamaa
metodia.


\subsubsection{Metodit}
{\bf public TreeManager(UIManager uim)}\\
Luo tyhj�n TreeManager-olion. Parametri {\em uim} on viite UIManageriin.
DTD ja dokumentti rakennetaan UIManagerin pyynn�st� erillisill� metodeilla,
jotka voivat l�hett�� poikkeuksen.

{\bf public void createDTD(String dtd) throws IOException}\\
J�sent�� rakennem��rittelyn ja palauttaa DTD-olion.
{\em dtd} on rakennem��rittely merkkijonomuodossa.
Jos j�sennys ep�onnistuu, l�hetet��n poikkeus.
J�sennys tehd��n luomalla Mark Wutkan DTDParser-pakkauksen {\em DTDParser}-luokan
olio, v�litt�m�ll� sille DTD merkkijonomuodossa ja kutsumalla olion {\em parse}-metodia.
T�m�n j�lkeen kutsutaan viel� metodia {\em makeChildConstraintGrammars},
joka luo elementtien lapsirajoitteista kielioppis��nt�verkot.

{\bf public void createTree(String doc) throws Exception}\\
Luo elementtipuun merkkijonosta {\em doc}.
Jos puun rakentaminen ep�onnistuu, l�hetet��n poikkeus.

{\bf public void createTree()}\\
Luo sis�ll�tt�m�n, hyv�ksytt�v�n puun DTD-olion pohjalta.
Luo nitf-juurielementin ja soveltaa siihen {\em buildValidSubtrees}-metodia.

{\bf public void createTree(String dtd, String doc) throws Exception}\\
Yhdist�� rakennem��rittelyn ja dokumentin lataamisen.
L�hett�� poikkeuksen, jos jotain menee pieleen.
Kutsuu {\em createDTD}-metodia.
Jos {\em doc} on null, kutsuu parametritonta {\em createTree}-metodia,
muutoin createTree-metodia parametrilla {\em doc}.

{\bf public Element getRoot()}\\
Palauttaa viitteen puun juurielementtiin.

{\bf public Element getHead()}\\
Palauttaa viitteen puun head-elementtiin.
Viite v�litet��n artikkelin metatietojen muokkauskomponentille.

{\bf public Element getBody()}\\
Palauttaa viitteen puun body-elementtiin.
Viite v�litet��n artikkelin rungon muokkauskomponentille.

{\bf public String getDocID()}\\
Palauttaa dokumentin ID:n. %{\em docID}.

{\bf public void setDocID(String id)}\\
Asettaa dokumentin ID-arvoksi merkkijonon {\em id}.

{\bf public String getDocName()}\\
Palauttaa dokumentin nimen. %{\em docName}.

{\bf public String getDocDate()}\\
Palauttaa dokumentin muutosp�iv�m��r�n. %{\em docDate}.

{\bf public String[] getDocKeywords()}\\
Palauttaa avainsanat. %, jokaisen {\footnotesize nitf : head : docdata : key-list : keyword(key)}.

{\bf public String toString()}\\
Palauttaa puun XML-merkkijonomuodossa.
Jatkaa vakiorivej�\\
\verb+<?xml version="1.0" encoding="UTF-8"?>+\\
\verb+<!DOCTYPE nitf SYSTEM "nitf.dtd">+\\
juurielementin {\em root} {\em toString}-arvolla.

Seuraavilla SAX-tapahtumank�sittelymetodeilla rakennetaan puuta ladattua dokumenttia luettaessa:

%{\bf public void startDocument()}\\
%Kohdattiin dokumentin alku.
%{\bf public void endDocument()}\\
%Kohdattiin dokumentin loppu.

{\bf public void startElement(String uri, String name, String qName, Attributes atts)}\\
Kohdattiin elementin alku. {\em name} on elementin nimi ja
{\em atts} sis�lt�� kaikki elementin attribuutit. Muita parametreja ei k�sitell�.
Luodaan uusi {\em name}-niminen elementti, lis�t��n sille attribuutit {\em atts} ja
kaikki mahdolliset muut attribuutit tyhjin� merkkijonoina.
Jos pinossa on p��llimm�isen� PCData-olio, poistetaan se pinosta (vertaa {\em characters}-metodiin).
Lis�t��n elementti pinoon.
J�sennys keskeytet��n, jos tuli vieraan niminen elementti tai attribuutti
tai attribuutti v��r�ll� arvolla.

{\bf public void endElement(String uri, String name, String qName)}\\
Kohdattiin elementin loppu. Parametreja ei k�sitell�.
T�ss� vaiheessa kaikki lapsielementit ovat tiedossa, joten tarkistetaan, onko lapsisarja
hyv�ksytt�v� metodilla {\em hasValidChildren}. Mik�li ei, j�sennys keskeytet��n.
Ennen j�sennyksen jatkamista elementti poistetaan pinosta.

{\bf public void characters(char[] ch, int start, int length)}\\
Luettiin {\em length} merkki� PCDATAa taulukoksi {\em ch}.
Luettu osuus alkoi sarakkeesta {\em start}.
{\em ch} ei v�ltt�m�tt� kata kokonaista PCDATA-osaa, joten tarkistetaan, onko
pinon p��llimm�isen� ennest��n PCData-olio. Jos on, liitet��n {\em ch} sen per��n.
Muutoin luodaan uusi PCData-olio ja laitetaan se pinoon.

{\bf private void makeChildConstraintGrammars()}\\
Yksityinen metodi, jolla luodaan s��nt�verkot sis�lt�v�
hajautustaulu {\em childConstraints}.
L�pik�yd��n kaikki rakannem��rittelyss� esitellyt elementit,
jotka ovat DTDElement-olioina vektorissa {\em dtd.elements}.
Kutsutaan {\em buildGrammar(item, null)}, miss� {\em item} on DTDElementin
{\em content}-kentt�, joka sis�lt�� DTDItem-olion.
Katso DTD-j�sentimen dokumentaatiota.

{\bf public ANode buildGrammar(DTDItem item, ANode suc)}\\
Rekursiivinen metodi. Luo s��nn�llisen lausekkeen osasta
{\em item} s��nt�verkon, joka p��ttyy viitteeseen {\em suc}.
Ylimm�ll� tasolla {\em suc} on null.
Verkko rakennetaan kuvan \ref{anodeeps} (ks. luokka ANode)
esitt�min periaattein.

{\bf public void undo()}\\
Peruuttaa edellisen muokkaustoimenpiteen kutsumalla {\em undo}-muuttujaa
vastaavaa peruutusmetodia.

{\bf private void restoreChildren()}\\
Peruuttaa elementin {\em curParent} lapsisarjaan kohdistuneen muutoksen.
{\em curParent}in lapsiksi asetetaan taas {\em oldChildren}.
{\em oldChildren} puolestaan saa {\em curParent}in nykyiset lapset.

{\bf private void restoreAttributes()}\\
Peruuttaa elementin {\em curParent} attribuuttisarjaan kohdistuneen muutoksen.
{\em curParent}in attribuuteiksi asetetaan taas {\em oldAttributes}.
{\em oldAttributes} puolestaan saa {\em curParent}in nykyiset attribuutit.

{\bf public boolean canReplace(Element parent, int startChild, int startChar,
  int endChild, int endChar, Vector source)}\\
Voiko {\em replace}-metodin muokkaustoimenpiteen suorittaa.
Rakennetaan elementtien nimi� vastaavista merkkijonoista korvaamisen tuloksena
syntyv�n lapsisarjan prototyyppi ja kysyt��n, tuottaako elementti� {\em parent}
vastaava s��nt�verkko sellaisen lapsisarjan (s��nt�verkon aloittavan ANoden
metodilla {\em acceptPath}).

{\bf public boolean replace(Element parent, int startChild, int startChar,
  int endChild, int endChar, Vector source)}\\
Jos rakennem��rittely sallii muokkaustoimenpiteen,
asetetaan elementille {\em parent} uusi lapsivektori, joka on kuin {\em parent.children},
jossa v�li ({\em startChild}, {\em startChar}) ... ({\em endChild}, {\em endChar}) on korvattu
vektorin {\em source} noodeilla.
{\em startChild} on ensimm�isen korvattavan lapsen indeksi.
{\em startChar} (>= 0) ilmaisee ensimm�isen korvattavan merkin indeksin
{\em startChild}-lapsessa.
{\em endChild} on ensimm�isen ei-kokonaan korvattavan lapsen indeksi.
{\em endChar} (>= 0) ilmaisee ensimm�isen ei-korvattavan merkin indeksin
{\em endChild}-lapsessa.
Mik�li {\em startChild}-lapsi ei ole PCData, {\em startChar}-arvon tulee olla 0.
Mik�li {\em endChild}-lapsi ei ole PCData, {\em endChar}-arvon tulee olla 0.
Reunoille mahdollisesti syntyv�t per�kk�iset PCDatat yhdistet��n.

{\bf public boolean canDelTree(Element parent, int startChar, int endChild, int endChar)}\\
Voiko {\em delTree}-metodin muokkaustoimenpiteen suorittaa.

{\bf public boolean delTree(Element parent, int startChar, int endChild, int endChar)}\\
Sama kuin {\em replace(parent, startChild, startChar, endChild, endChar, new Vector(0))}.
Poistaa alueen ({\em startChild}, {\em startChar}) ... ({\em endChild}, {\em endChar}).

{\bf public boolean canAdd(Element parent, int child, int char, Vector source)}\\
Voiko {\em add}-metodin muokkaustoimenpiteen suorittaa.

{\bf public boolean add(Element parent, int child, int char, Vector source)}\\
Sama kuin {\em replace(parent, child, char, child, char, source)}.
Lis�� kohtaan ({\em child}, {\em char}) vektorin {\em source} elementit.

{\bf public boolean canEncapsulate(Element parent, int startChild, int startChar, int endChild, int endChar, String encapsulator)}\\
Voiko {\em encapsulate}-metodin muokkaustoimenpiteen suorittaa.

{\bf public boolean encapsulate(Element parent, int startChild, int startChar, int endChild, int endChar, String encapsulator)}\\
Lis�� uuden {\em encapsulator}-nimisen elementin alueen
({\em startChild}, {\em startChar}) ... ({\em endChild}, {\em endChar}) is�elementiksi ja
samalla elementin {\em parent} lapseksi.

{\bf public boolean canDecapsulate(Element parent, int index)}\\
Voiko {\em decapsulate}-metodin muokkaustoimenpiteen suorittaa.
Sama toimintaperiaate kuin {\em canReplace}-metodissa.

{\bf public boolean decapsulate(Element parent, int index)}\\
Poistaa elementin {\em parent} lapsen {\em index}, jos se on sallittua.
T�m�n j�lkeen tuhotun elementin paikalle ilmestyv�t sen mahdolliset lapset.

{\bf public void setAttributes(Element parent, Attribute[] source)}\\
Korvaa elementin {\em parent} attribuuttitaulun attribuuttitaululla {\em source}.

{\bf public String[] getAcceptableReplacement(Element parent, int int startChild, int startChar, int endChild, int endChar)}\\
Palauttaa annetun alueen korvaajiksi k�yvien yksitt�isten elementtien nimet merkkijonotaulukkona.
Otetaan huomioon koko lapsisarja. T�ll� metodilla saadaan selville, mitk� ty�kalupalkin painikkeet
voidaan aktivoida. Rakennetaan lapsisarjasta prototyyppi (merkkijonotaulukko) ja katsotaan,
generoiko elementti� {\em parent} vastaava s��nt�verkko t�m�n merkkijonotaulukon.

{\bf public void buildValidSubtrees(Element parent)}\\
Rakentaa elementille {\em parent} hyv�ksytt�v�t alipuut, jos rakennem��rittely
vaatii elementille lapsia.
{\em childConstraints}-hajautustaulusta l�ytyy s��nt�verkko, jonka
aloitussolmun (ANode) {\em getFirstPath}-metodi palauttaa
hyv�ksytt�v�n lapsisarjan mallin merkkijonotaulukkona. Jokaisesta merkkijonosta
syntyy vastaavanniminen elementti tai PCData-olio. Kaikkiin uusiin
elementteihin sovelletaan rekursiivisesti buildValidSubtrees-metodia.
Usein elementti ei vaadi yht��n lapsielementti�.

\subsection{TreeNode (PH)} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Elementtipuu rakennetaan abstraktin {\bf TreeNode}-luokan aliluokkien
olioista. Luokalta perit��n nimikentt� {\em name}
ja metodi {\em toString}, joka tulostaa solmun sis�ll�n.
Kaikki TreeNodet ovat alipuineen my�s kloonattavia metodilla
{\em cloneTree}.

{\bf PCData}-olio vastaa XML-dokumentin PCDATA-osuutta eli teksti�.
Tekstisolmuilla ei ole lapsisolmuja.

{\bf Element}-luokan olio vastaa XML-elementti�.
Element-olioilla on vektori lapsielementeille ja hajautustaulu attribuuteille.

Lohkoelementit ovat {\em Block}-olioita.
Block on kuin Element, mutta se muistaa korkeutensa rivein� ja
tuntee is�elementtins�. Dokumentin selaaminen riveitt�in
perustuu lohkojen korkeustietoihin. Kun luodaan uusi
tyhj� lohko, sen korkeudeksi asetetaan 1. Samalla lis�t��n
is�elementin korkeutta yhdell� rivill�. Aina kun korkeutta
muutetaan, muutetaan elementin is�n korkeutta yht� paljon.
Kun lohko tuhotaan, v�hennet��n is�lohkon korkeutta tuhotun
lohkon korkeuden verran.
Lohkoja k�ytet��n vain dokumentin body-elementin alipuussa.
bodyn is�elementiksi asetetaan null-osoite.
Body on linkitetty body-elementtiin.

DTD:ss� ei rivi- ja lohkoelementtej� ole eritelty, vaan
TreeManager-luokan hajautustaulussa {\em BLOCKS} on kaikkien
lohkotyyppisten elementtien tunnistenimet. Jos body-alipuun
elementti mainitaan taulussa, siit� tehd��n Block, muutoin Element.
body-alipuun ulkopuolella kaikki elementit ovat tavallisia Element-olioita.

{\bf Attribute} on elementtien attribuuttien luokka.
Attribuutilla on nimi ja arvo.

Kuva \ref{treenodes} esitt�� puun solmujen luokkahierarkian.
Esimerkki puun rakenteesta on kuvassa \ref{liukku}.

\subsubsection{Attribuutit}
{\bf protected String name}\\
Elementin tunnistenimi tai attribuutin nimi.
PCData-olion nimi on aina "\#PCDATA".
CommentBlock-olion nimi on aina "\#COMMENT".

\subsubsection{Metodit}
{\bf public String getName()}\\
Palauttaa solmun nimen.

{\bf public String toString()}\\
Palauttaa solmun XML-esityksen.

{\bf public TreeNode cloneTree()}\\
Palauttaa solmun aloittavan alipuun kopion.
Metodia k�ytet��n kopioitaessa alueita leikep�yd�lle.

\begin{figure}[!h]
\centering \includegraphics{treenodes.eps}
\caption{Elementtipuun solmujen luokat.}\label{treenodes}
\end{figure}

\begin{figure}[!h]
\centering \includegraphics{liukku.eps}
\caption{Puun rakennetta.}\label{liukku}
\end{figure}

\subsection{PCData (PH)} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
PCData-olio vastaa PCDATAa XML-dokumentissa.
\subsubsection{Attribuutit}
{\bf private StringBuffer text}\\
Teksti.

\subsubsection{Metodit}
{\bf public PCData()}\\
Luo PCData-olion, joka sis�lt�� tyhj�n merkkijonon.

{\bf public PCData(String s)}\\
Luo PCData-olion, joka sis�lt�� merkkijonon {\em s}.

{\bf public String getText()}\\
Palauttaa tekstin.

{\bf public void setText(String text)}\\
Asettaa tekstiksi merkkijonon {\em text}.

{\bf public String getText(int start, int end)}\\
Palauttaa {\em text}-muuttujan sis�ll�n merkkiv�lill� {\em start}...{\em end}-1.

{\bf public void setText(int start, int end, String s)}\\
Korvaa {\em text}-muuttujan sis�ll�n merkkiv�lill� {\em start}...{\em end}-1
merkkijonolla {\em s}.


\subsection{Element (PH)} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Element-luokan olio esitt�� yht� XML-elementti�.
\subsubsection{Attribuutit}

{\bf private Vector children}\\
Elementin lapsielementit Element- ja PCData-olioina.

{\bf private Attribute[] attributes}\\
Elementin attribuutit Attribute-olioina.

\subsubsection{Metodit}

{\bf public Element(String name)}\\
Luo {\em name}-nimisen elementin.

{\bf public Vector getChildren()}\\
Palauttaa elementin lapsielementit.

{\bf public void setChildren(Vector children)}\\
Asettaa elementin lapsivektoriksi vektorin {\em children}.

{\bf public Attribute[] getAttributes()}\\
Palauttaa elementin attribuutit taulukkona.

{\bf public void setAttributes(Attribute[] atts)}\\
Asettaa elementin attribuuteiksi taulukon {\em atts} attribuutit.

%\subsection{Inline (PH)} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Rivielementtien luokka.
\subsection{Block (PH)} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
{\em Block} on lohkotyyppinen XML-elementti ja {\em Element} on sen yliluokka.
Dokumentin runkoa piirrett�ess� jokainen Block alkaa uudelta rivilt�.
Rungon selaaminen perustuu siihen, ett� jokainen lohko tuntee korkeutensa rivein�.
Lohkoja ovat muun muassa kappaleet, listat ja otsikot.
Kun uusi lohko luodaan, se saa korkeuden 1. Aina, kun korkeutta muutetaan, lis�t��n
my�s lohkon is�elementin korkeutta muutoksen verran.

\subsubsection{Attribuutit}
{\bf private int height}\\
Lohkon korkeus rivein�.

{\bf private Object parent}\\
Is�elementti tai vastaava.

\subsubsection{Metodit}
{\bf public Block(String name)}\\
Luo {\em name}-nimisen Blockin.

{\bf public Object getParent()}\\
Palauttaa is�elementin tai vastaavan.

{\bf public void setParent(Object parent)}\\
Asettaa is�elementiksi tai vastaavaksi olion {\em parent}.

{\bf public int getHeight()}\\
Palauttaa lohkon korkeuden rivein�.

{\bf public void setHeight(int height)}\\
Asettaa lohkon korkeudeksi {\em height} rivi�.
Jos {\em parent} ei ole null, vaan Block- tai Body-olio,
lis�� samalla sen korkeutta muutoksen verran kutsumalla
sen metodia {\em changeHeight}.

{\bf public void changeHeight(int incr)}\\
Lis�� korkeutta {\em incr} rivi�.

\subsection{CommentBlock (PH)} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CommentBlock on XML-kommenttilohko. K�ytt�j�n kannalta se on lohko
muistiinpanoja varten. CommentBlock kuormittaa {\em Block}-luokan metodeja.


\subsection{Attribute (PH)} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
T�m�n luokan olio esitt�� XML-elementin yht� attribuuttia.
\subsubsection{Attribuutit}
{\bf private String name}\\
Attribuutin nimi.

{\bf private String value}\\
Attribuutin arvo.

\subsubsection{Metodit}
{\bf public Attribute(String name, String value)}\\
Luo {\em name}-attribuutin arvolla {\em value}.

{\bf public String getValue()}\\
Palauttaa attribuutin arvon.

{\bf public void setValue(String value)}\\
Asettaa attribuutin arvoksi {\em value}.

\subsection{ANode (PH)} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ANode on s��nt�verkon solmu.
Solmulla on arvo ja taulukko seuraajasolmuja.
Seuraajasolmujen arvot kertovat siirtym�t.
Verkon polut p��ttyv�t null-viitteeseen.

Kunkin solmun seuraajataulukkoon asetetaan
seuraajat seuraavaan j�rjestykseen:
ensiksi mahdollinen ohitussiirtym�,
seuraavaksi kaikki ei-tyhj�t siirtym�t ja
viimeiseksi mahdollinen silmukkasiirtym�.
Kuvassa \ref{anodeeps} on esitetty verkon rakennuss��nn�t.

K�yt�nn�ss� solmut sis�lt�v�t elementtien nimi� ja
verkkoja k�ytet��n elementin lapsisarjan hyv�ksytt�vyyden
tarkistamiseen. Verkon aloitussolmun
{\em acceptPath}-metodia kutsutaan
parametreilla {\em path} ja {\em index}. {\em path}in pit�� sis�lt��
lapsisarjan elementtien nimet String-taulukossa ja
{\em index}-muuttujan arvon pit�� olla 0. {\em acceptPath} on
rekursiivinen metodi ja {\em index} osoittaa
kohtaa, johon asti polku on hyv�ksytty.
Silmukoiden v�ltt�miseksi matkan varrella merkit��n
tyhj�n merkkijonon solmut (joiden arvo on {\em LAMBDA}) kulloisellakin indeksill�.
Jos saavutaan lambda-solmuun samalla indeksill� kuin mill� se
on merkattu, tiedet��n, ett� jatkamalla jouduttaisiin silmukkaan.
N�iss� tilanteissa kurkistus hyl�t��n.

\begin{figure}[!h]
\centering \includegraphics{anodes.eps}
\caption{S��nt�verkon rakentaminen s��nn�llisest� lausekkeesta.}\label{anodeeps}
\end{figure}

Kun k�ytt�j� yritt�� lis�t� uuden lapsielementtej� vaativan elementin,
joudutaan luomaan validi alipuu soveltamalla aina solmun ensimm�isen seuraajan s��nt��.
Esimerkiksi lausekkeella (a | b) luodaan lapsi a,
lausekkeella (a | b)* ei luoda yht��n lasta,
ja lausekkeella (((a | b), c) | d)+ luodaan lapset a ja c.
My�hemmin k�ytt�j� voi tietysti korvata elementtej� joillakin toisilla.
Ensimm�isen s��nn�n periaate tulee
ottaa huomioon rakennem��rittely� kirjoitettaessa.

ANode-luokan {\em getFirstPath}-metodi palauttaa verkkoa vastaavalle
elementille hyv�ksytt�v�n lapsisarjan mallin String-taulukkona.
Itse elementtien luonti tehd��n {\em TreeManager}-luokan
{\em buildValidSubtrees}-metodilla.


\subsubsection{Attribuutit}
{\bf private String value}\\
Solmun tuottama merkkijono.

{\bf private int index}\\
Apukentt�, jolla voidaan merkit� kuljettu polku
silmukoiden v�ltt�miseksi.

{\bf private ANode[] successors}\\
Solmun seuraajat.

{\bf public static final String LAMBDA}\\
Tyhj� merkkijono "".

\subsubsection{Metodit}
{\bf public ANode(String value, ANode[] successors)}\\
Luodaan uusi solmu, jolle annetaan arvoksi {\em value} ja
seuraajiksi {\em successors}.

{\bf public boolean acceptPath(String[] path, int index)}\\
Kertoo, tuottaako jokin solmusta alkava polku
merkkijonot {\em path[index]...path[N]}, miss� {\em N} on taulukon suurin
indeksi.

{\bf public String[] getFirstPath()}\\
Palauttaa mallin verkkoa vastaavan elementin hyv�ksym�st� lapsisarjasta
String-taulukkona. Metodia k�ytt�� {\em TreeManager}-luokan
{\em buildValidSubtrees}-metodi.


\subsection{BodyPanel (PH)} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
T�m�n Panelin aliluokan olion avulla selataan dokumentin runkoa.
Se sis�lt�� vierityspalkin, kaksi painiketta ja varsinaisen {\em Body}-muokkauskomponentin,
joka kuuntelee painikkeita ja vierityspalkin s��t�tapahtumia.
Vierityspalkilla dokumenttia selataan riveitt�in ja
nuolen kuvin varustetuilla painikkeilla sivuttaissuunnassa puolen sivun verran
kerrallaan.
Sivuttaissuuntaista selausta tarvitaan pitkien esimuotoiltujen
tekstirivien katseluun.

\subsubsection{Attribuutit}
{\bf private Scrollbar lineBar}\\
Scrollbar, jolla dokumenttia selataan riveitt�in.

{\bf private Button left}\\
Painike vasemmalle selaamiseen.

{\bf private Button right}\\
Painike oikealle selaamiseen.

{\bf private Body body}\\
Varsinainen artikkelin rungon muokkauskomponentti.

\subsubsection{Metodit}
{\bf public BodyPanel()}\\
Luo BodyPanel-olion.

\subsection{Body (PH)} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Body-komponentin kautta k�ytt�j� muokkaa artikkelin runkoa.

Body pit�� muistissa kohdistimen kulloistakin paikkaa.
Sill� on muistissa paitsi rivi ja sarake my�s is�elementti, lapsen indeksi ja
positio lapsen sis�ll�.
Kohdistimen siirto uuteen paikkaan {\tt shift} pohjassa
tarkoittaa, ett� yritet��n valita vanhan ja uuden paikan v�linen alue.
Valinta tehd��n, mik�li vanhan ja uuden paikan is�elementit ovat samat.

Valittuun alueeseen kohdistetaan tavallisesti muokkaustoimenpiteit�.
Paitsi ett� alueen sis�lt�� voidaan muuttaa, sis�lt� voidaan kopioida
leikep�yd�lle copy- tai cut-toiminnolla.
Tieto alueesta palautetaan {\em AreaSelection}-oliona.
Itse alueen sis�lt� kopioituu vasta, kun suoritetaan muokkaustoiminto.
%TreeSelection sopii leikep�yd�n sis�ll�ksi.
Leikep�yt�toiminnoista huolehtii {\em ClipboardManager}-olio.

\subsubsection{Attribuutit}
{\bf public static final Font  TEXT\_FONT}\\
K�ytetty kirjasintyyppi.

{\bf public static final int   CHAR\_WIDTH}\\
Merkin leveys pikselein�.

{\bf public static final Color BG\_COLOR}\\
Taustav�ri.

{\bf public static final Color TEXT\_COLOR}\\
Tekstin v�ri.

{\bf public static final int   LINE\_HEIGHT}\\
Rivikorkeus.

{\bf public static final int   TOP\_MARGIN}\\
Yl�marginaali.

{\bf public static final int   BOTTOM\_MARGIN}\\
Alamarginaali.

{\bf public static final int   LEFT\_MARGIN}\\
Vasen marginaali.

{\bf public static final int   RIGHT\_MARGIN}\\
Oikea marginaali.

{\bf public static final int   MAX\_COLS}\\
Kuinka monta saraketta voidaan n�ytt�� kerralla.

{\bf public static final int   MIN\_COLS}\\
Kuinka monta saraketta rivin tulisi olla v�hint��n pitk�,
ennen kuin se voidaan katkaista.

{\bf public static final int   MAX\_LINES}\\
Kuinka monta rivi� voidaan n�ytt�� kerralla.

{\bf private int curLine, curCol}\\
Kohdistimen rivi ja sarake.

{\bf private int topLine}\\
Yl�reunassa n�kyv� rivi.

{\bf private int leftCol}\\
Vasemmassa reunassa n�kyv� sarake.

{\bf private Element curParent}\\
Elementti, jonka sis�ll� valittu alue sijaitsee.

{\bf private int curStartChild, curStartChar}\\
Kohdistimen nykyinen paikka elementin {\em curParent} sis�ll�.

{\bf private AreaSelection selectedArea}\\
Valittu alue. Jos ei ole valittu aluetta, muuttuja on null.

{\bf private BodyPanel bodyPanel}\\
Viite BodyPaneliin, joka sis�lt�� t�m�n komponentin.

{\bf private Scrollbar  lineBar}\\
Viite BodyPanelin vierityspalkkiin.

{\bf private Button left, right}\\
Viitteet BodyPanelin selauspainikkeisiin.

{\bf private Block      body}\\
Viite elementtipuun body-elementtiin.

{\bf private Image      hiddenImage}\\
Kuva piirtopuskurista.

{\bf private Graphics   hiddenGraphics}\\
Piirtopuskuri, johon teksti piirret��n ennen n�ytt�mist�.

{\bf private UIManager uim}\\
Viite UIManager-olioon.

{\bf private TreeManager tree}\\
Viite TreeManager-olioon.


\subsubsection{Metodit}

{\bf public Body(Scrollbar lineBar, Button left, Button right, UIManager uim)}\\
Luo Body-olion.
Parametreina v�litet��n viitteet BodyPanelin Scrollbariin ja selauspainikkeisiin,
joiden s��t�tapahtumia kuunnellaan ja UIManageriin. UIManagerilta saadaan viel�
viite TreeManageriin.

{\bf public void paint(Graphics vg)}\\
Piirt�� ja n�ytt�� n�kym�n artikkelin runkoon.
{\em vg} on viite n�kyv��n grafiikkaan.
Artikkelin sis�lt� ladotaan erityisell� rivitysalgoritmilla.
Jokainen Block alkaa ja loppuu omalla rivill��n, muut osat pyrit��n
sijoittamaan niin, ett� rivit t�yttyv�t.
Piirrett�ess� k�ytet��n tasalevyist� fonttia ja tasakorkuista
rivityst�. Kun k�ytt�j� painaa hiiren painiketta pisteess� ($x$, $y$),
voidaan laskea, mihin riviin ja sarakkeeseen kohdistin pyrit��n viem��n.
Elementtien tunnisteet piirret��n samoista kuvista kuin Toolbarin painikkeisto,
tunnisteet kehystet��n viivoin.

Rivitysalgoritmi p��piirteiss��n:
\begin{verbatim}
jos seuraavaksi tulostettava kokonaisuus mahtuu nykyiselle riville
  tulosta kokonaisuus ja siirry tulosteen pituuden verran oikealle
muutoin
  jos kyseess� on tunniste (jota ei voida katkaista)
    siirry seuraavalle riville ja aloita alusta
  muutoin (kyseess� on PCDATA)
    etsi katkeamiskohdasta alkua kohti v�lily�nti� tai v�liviivaa
    jos tultiin alkuun saakka
      jos kohta > MIN_COLS
        siirry seuraavalle riville ja aloita alusta
      muutoin
        katkaise merkkijono sivun oikeassa laidassa,
        tulosta, siirry seuraavalle riville ja aloita alusta
    muutoin
      katkaise merkkijono v�lily�nnin tai v�liviivan j�lkeen,
      tulosta, siirry seuraavalle riville ja aloita alusta
\end{verbatim}

{\bf public void drawTag(Graphics g, Element e, boolean isStart)}\\
Piirt�� elementin tunnisteen grafiikkaan {\em g}.
Piirret��n elementin {\em e} nime� {\em e.getName}
vastaava Image (saadaan UIManagerilta) ja ymp�r�id��n se viivalla.
Jos elementin jokin
muokattavissa oleva attribuutti sis�lt�� ep�tyhj�n
merkkijonon ja kyseess� on aloittava tunniste,
piirret��n tunnisteen oikeaan reunaan t�hti.

{\bf public void keyPressed(KeyEvent e)}\\
Suoritetaan, kun jokin erikoisn�pp�in painetaan alas
n�pp�intapahtumana {\em e}.

{\bf public void keyReleased(KeyEvent e)}\\
Suoritetaan, kun jokin erikoisn�pp�in vapautetaan
n�pp�intapahtumana {\em e}.

{\bf public void keyTyped(KeyEvent e)}\\
Tapahtumank�sittelymetodi, joka suoritetaan, kun
k�ytt�j� painaa tavallista kirjoitusn�pp�int�.
{\em e} on vastaava n�pp�intapahtuma.

{\bf public AreaSelection getSelectedArea()}\\
Palauttaa valitun alueen. Jos aluetta ei ole valittu, palauttaa null.


\subsection{AreaSelection (PH)}
Body palauttaa tiedon valitusta alueesta {\em AreaSelection}-oliona,
joka toimii vain tietueena.

\subsubsection{Attribuutit}
{\bf public Element parent}\\
Elementti, jonka sis�ll� valittu alue sijaitsee.

{\bf public int startChild}\\
Indeksi, joka osoittaa elementin {\em parent} ensimm�isen
ainakin osittain valitun lapsielementin.

{\bf public int startChar}\\
Indeksi, joka osoittaa ensimm�isen valitun lapsielementin
sis�ll� ensimm�isen valitun merkin.
{\em startChar} voi olla suurempi kuin 0 vain jos alue alkaa
PCData-olion sis�ll�.

{\bf public int endChild}\\
Indeksi, joka osoittaa elementin {\em parent} sis�ll�
sen lapsielementin, joka ei en�� ainakaan kokonaan kuulu alueeseen.

{\bf public int endChar}\\
Indeksi, joka osoittaa alueen lopettavan lapsielementin {\em endChild}
sis�ll� ensimm�isen ei-valitun merkin.
{\em endChar} voi olla suurempi kuin 0 vain jos alue loppuu
PCData-olion sis�ll�.

\subsubsection{Metodit}
{\bf public AreaSelection(Element parent, int startChild, int startChar, int endChild, int endChar)}\\
Konstruktori. Parametrit liitet��n samannimisiin kenttiin.


\subsection{TreeSelection (PH)}
{\em TreeSelection}-olio sis�lt�� valitun alueen kopion.
Se soveltaa {\em Transferable}-rajapintaa ja sopii
leikep�yd�n sis�ll�ksi.

\subsubsection{Attribuutit}
{\bf public Vector contents}\\
Kopio valitun alueen sis�ll�st� {\em TreeNode}-olioina.

{\bf public static final DataFlavor[] SUPPORTED\_FLAVORS}\\
Sis�lt�� yhden alkion, {\em DataFlavor.StringFlavor}, joka
on ainoa esitysmuoto, jossa sis�lt� voidaan palauttaa.


%{\footnotesize Sis�lt�� muilta osin samat attribuutit kuin {\em AreaSelection}.}

\subsubsection{Metodit}
{\bf public TreeSelection(AreaSelection s)}\\
Konstruktori. Alueen {\em s} sis�lt� (alipuut) kloonataan {\em contents}-muuttujaan.
T�ss� k�ytet��n hyv�ksi {\em TreeNode}-olioiden {\em cloneTree}-metodia.

{\bf public Vector cloneContents()}\\
Palauttaa kopion sis�ll�st�.

{\bf public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException}\\
Leikep�yd�n sis�ll�lt� vaadittu metodi.
Palauttaa sis�ll�n esitysmuodossa {\em flavor}.
Jos {\em flavor} ei ole merkkijonomuoto {\em DataFlavor.StringFlavor}, annetaan poikkeus.
Muutoin palautetaan sis�lt� merkkijonona, joka
saadaan katenoimalla {\em contents}-vektorin
sis�lt�mien {\em TreeNode}-olioiden {\em toString}-merkkijonot.

{\bf public boolean isDataFlavorSupported(DataFlavor flavor)}\\
Palauttaa true, jos {\em flavor} == {\em DataFlavor.StringFlavor},
muutoin false.

{\bf public DataFlavor[] getTransferDataFlavors()}\\
Palauttaa {\em SUPPORTED\_FLAVORS}-taulukon.

\subsection{ClipboardManager (PH)}
Leikep�yt�toimintojen hallintaan erikoistunut luokka, joka
sis�lt�� leikep�yd�n ja kaksi {\em TreeSelection}-olioita: {\em src} ja {\em bak}.
{\em TreeSelection} sis�lt�� jonkin elementtipuusta valitun alueen kopion.
{\em sr}c sis�lt�� copy- tai cut-komennon tuloksena kopioidun sy�tteen.
Leikep�yt� on luokan {\em java.awt.datatransfer.Clipboard} olio, joka sis�lt�� {\em src}:n.
{\em bak} puolestaan sis�lt�� peruutustoimintoa varten {\em src}:n vanhan sis�ll�n.

\subsubsection{Attribuutit}
{\bf private Clipboard clipboard}\\
Editorin k�ytt�m� leikep�yt�. K�ytt�j�rjestelm�n yleinen leikep�yt�, mik�li mahdollista.

{\bf private TreeSelection src}\\
Viimeksi leikep�yd�lle annettu sis�lt�.

{\bf private TreeSelection bak}\\
Edellinen {\em src} eli edellinen appletin asettama leikep�yd�n sis�lt�.

{\bf private int undo}\\
Ilmaisee nykyisen peruutustoiminnon ja saa seuraavia arvoja:\\
{\small
{\bf public static final int NONE = 0}\\
%{\bf public static final int UNCOPY = 1}\\
{\bf public static final int UNCUT = 1}\\
{\bf public static final int UNPASTE = 2}}\\
Kun kutsutaan {\em undo}-metodia, se kutsuu {\em undo}-muuttujan arvon osoittamaa
metodia.

\subsubsection{Metodit}
{\bf public ClipboardManager()}\\
Konstruktori.

{\bf public void undo()}\\
Peruuttaa edellisen muokkaustoimenpiteen kutsumalla
{\em undo}-muuttujan osoittamaa peruutusmetodia.

{\bf public void copy(AreaSelection s)}\\
Korvaa leikep�yd�n sis�ll�n alueen {\em s} osoittamalla puurakenteella.
T�t� ennen ottaa korvattavan sis�ll�n muistiin {\em bak}-muuttujaan.

%{\bf public void uncopy()}\\
{\bf public void cut(AreaSelection s)}\\
Korvaa leikep�yd�n sis�ll�n alueen {\em s} osoittaman puurakenteen kopiolla.
T�t� ennen ottaa korvattavan sis�ll�n muistiin {\em bak}-muuttujaan.
Lopuksi poistaa kopioidun puurakenteen TreeManagerin {\em delTree}-metodilla.

{\bf public void uncut(AreaSelection s)}\\
Peruuttaa cut- tai uncut-toiminnon.
Suoritetaan TreeManagerin undo ja
vaihdetaan leikep�yd�n sis�lt� ja {\em bak} kesken��n.

{\bf public void paste(AreaSelection s)}\\
Korvaa alueen {\em s} osoittaman puun osan leikep�yd�n sis�ll�n kopiolla.
Korvaaminen toteutetaan TreeManagerin {\em replace}-metodilla.

{\bf public void unpaste()}\\
Peruuttaa paste-toiminnon.
Suoritetaan TreeManagerin undo.

\subsection{XMLAssistant (PH)}
Kirjastoluokka, joka sis�lt�� muutaman yleisk�ytt�isen
apumetodin XML-dokumenttien k�sittelyyn.
\subsubsection{Metodit}
{\bf public static String toStringWithEntities(String s)}\\
Rakentaa merkkijonosta {\em s} merkkijonon, jossa
XML:n erotinmerkit on muutettu XML-entiteeteiksi.

{\bf public static String toStringWithoutEntities(String s)}\\
Rakentaa merkkijonosta {\em s} merkkijonon, jossa
XML-entiteetit on muutettu erotinmerkeiksi.

\subsection{ElementPopup (PH)}
{\em JPopupMenun} aliluokka. {\em ElementPopup}-olio n�ytt�� yhden elementin
muokkaustoiminnot (kuva \ref{elementpopup}). Se sis�lt�� seuraavat kent�t:
{\small
\begin{description}
\item[Attributes...] avaa {\em AttributesFrame}-ikkunan elementin attribuuttien muokkausta varten.
\item[Copy] kopioi elementin sis�lt�ineen leikep�yd�lle.
\item[Cut] kopioi elementin sis�lt�ineen leikep�yd�lle ja samalla poistaa sen artikkelista.
\item[Delete] poistaa elementin sis�lt�ineen.
\item[Un-markup] poistaa elementin mutta s�ilytt�� sis�ll�n.
\end{description}}
Body sulkee ElementPopupin, kun valitaan jokin muu kohde kyseinen elementti.

\begin{figure}[!h]
\centering \includegraphics{elementpopup.eps}
\caption{ElementPopup.}\label{elementpopup}
\end{figure}

\subsubsection{Metodit}
{\bf public ElementPopup(Element parent, int child, int x, int y}\\
Luo elementin {\em parent} lapsesta {\em child} JPopupMenun pisteeseen ($x$, $y$).

\subsection{AttributesFrame (PH)}
{\em JFrame}n aliluokka, jonka ilmentym� sis�lt�� tekstikent�t annetun elementin muokkausta varten.
Tekstikentt��n voi kirjoittaa vain, jos attribuutin arvo ei ole kiinnitetty.
Muutokset hyv�ksyt��n {\em Ok}-painikkeella tai hyl�t��n {\em Cancel}-painikkeella:
{\small
\begin{description}
\item[Ok] p�ivitet��n elementin attribuutit ja suljetaan ikkuna.
\item[Cancel] suljetaan ikkuna p�ivitt�m�tt� attribuutteja puuhun.
\end{description}}
Monivalinta-arvoisia attribuutteja ei ole.

\subsubsection{Attribuutit}
{\bf private Element element}\\
Elementti, jonka attribuutteja muokataan.

{\bf private Label elementLabel}\\
Otsikko, jossa muokattavan elementin nimen.

{\bf private Label[] attributeLabels}\\
Attribuuttien nimet tekstikentt�kohtaisesti.

{\bf private JTextField[] attributeTexts}\\
Tekstikent�t, joihin kirjoitetaan attribuuttikohtaisia arvoja.

{\bf private Button ok, cancel}\\
Painikkeet, joilla muutokset joko hyv�ksyt��n tai hyl�t��n.

\subsubsection{Metodit}
{\bf public AttributesFrame(Element e)}\\
Luo JFrame-olion, joka sis�lt�� tekstikent�t elementin {\em e} attribuuttien muokkausta varten
(kuva \ref{attributesframe}).
Muutokset hyv�ksyt��n {\bf Ok}-painikkeella tai hyl�t��n {\em Cancel}-painikkeella.
Tekstikent�t luodaan elementin {\em e} attribuuttitaulusta taulukoksi {\em JTextField}-olioita.

\begin{figure}[!h]
\centering \includegraphics{attributesframe.eps}
\caption{AttributesFrame.}\label{attributesframe}
\end{figure}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%% SERVERIN KAMA

\subsection{Communications.java}

T�m� olio tarjoaa rajapinnan palvelin puolelle. Communications-olioon on toteutettu saman nimiset 
functiot kuin palvelimella olevat servletit. Kaikki servleteille l�hetett�v� sis�lt� on ensin muutettava HTML-koodattuun muotoon. Virheen sattuessa Communications-luokan functiot aiheuttavat CommunicationsException-poikkeuksen.

\subsubsection{String loadArticle(integer articleID)}

\begin{description}
\item[parametrit:]	Artikkelin id-numero
\item[palauttaa:]	Tietokannasta ladatun artikkelin yhten� string oliona.
\item[toiminta:]	Kutsuu loadArticle nimist� servletti�, jolle l�hett�� parametrin� arikkelin 
id-numeron. Lukee servletin palauttaman artikkelin.
\end{description}

\subsubsection{String loadDTD(integer DTDID)}

\begin{description}
\item[parametrit:]	DTD:n id-numero	
\item[palauttaa:]	Tietokannasa ladatun DTD:n yhten� string oliona.
\item[toiminta:]	Kutsuu loadDTD nimist� servletti�, jolle l�hett�� parametrin� DTD:n id-numeron. Lukee 
servletin palauttaman DTD:n.
\end{description}

\subsubsection{String saveArticle(String[] artikkeli)}

\begin{description}
\item[parametrit:]	Saa parametrin� String-taulukon, joka sis�lt�� \ref{Taulu document} luvussa kuvatun 
taulun kentti� vastaavat tiedot. Taulussa kent�t ovat seuraavassa j�rjestyksess�: lid / sname / sdescription / skeywords / sdata / ldtdid / ljournalistid / salias.
\item[palauttaa:]	Palautetaan ok
\item[toiminta:]	Kutsutaan saveArticle-servletti� taulukossa saaduilla parametreill�. Luetaan 
servletin palauttama merkkijono ja palautetaan se.
\end{description}

\subsubsection{String[][] listArticles()}

\begin{description}
\item[parametrit:]	--
\item[palauttaa:]	String taulukon joka sis�lt�� kannassa olevien artikkeleiden listauksen.
\item[toiminta:]	Kutsutaan listArticles-servletti� ilman parametrej�. Se hakee kannasta artikkelien 
otsikot ja palauttaa ne yhten� merkkijonona t�lle funktiolle. Merkkijonossa on eri kent�t erotettu 
erotinmerkill�. Merkkijonon sis�lt� puretaan String-taulukkoon.
\end{description}

\subsubsection{String[][] listDTD()}

\begin{description}
\item[parametrit:]	---
\item[palauttaa:]	String taulukon joka sis�lt�� kannassa olevien DTD:iden otsikot
\item[toiminta:]	Kutsutaan listDTD-servletti� ilman parametrej�. Se hakee kannasta DTD:iden otsikot ja 
palauttaa ne yhten� merkkijonona t�lle funktiolle. Merkkijonossa on eri kent�t erotettu erotinmerkill�. 
Merkkijonon sis�lt� puretaan String-taulukkoon.
\end{description}

\subsection{CommunicationsException.java}

CommunicationsException on javan Exception-luokan laajennus, jota k�ytet��n Communications-luokan virheiden v�litt�miseen.

\section*{Servletit}

Servletit on toteutettu kirjoittamalla jokainen osakokonaisuus omaksi servletiksi. T�ll� saavutetaan 
pienempi� ja paremmin hallittavia moduleita. Koska servletit ottavat vastaan tietoa HTTP-POST -tekniikan
kautta, on jokaisen servletin kuvauksessa kerrottu saatavat parametrit.

Kaikki servletit rakentuvat yhdest� \emph{service}-functiosta. T�m�n lis�ksi ne kutsuvat Database-olion
functioita tietokannan k�ytt�miseksi. 

\subsection{loadArticle.java}

\begin{description}
\item[parametrit:]	Parametrin� saadaan articleid jonka arvona on artikkelin id-numero.
\item[palauttaa:]	Halutun artikkelin tai tietokannan virheilmoituksen
\item[toiminta:]	Hakee tietokannasta artikkelin id-numeron perusteella oikean artikkelin ja kirjoittaa
sen pyynn�n tekij�lle.
\end{description}

\subsection{loadDTD.java}

\begin{description}
\item[parametrit:]	Parametrina saadaan dtdid jonka arvona on DTD:n id-numero.
\item[palauttaa:]	Halutun DTD:n tai tietokannan virheilmoituksen
\item[toiminta:]	Hakee tietokannasta DTD:n id-numeron perusteella oikean DTD:n ja kirjoittaa sen
pyynn�n tekij�lle.
\end{description}

\subsection{saveArticle.java}

\begin{description}
\item[parametrit:]	Parametreina saveArticle saa \ref{Taulu document} kappaleessa kuvatun taulun kaikki 
alkiot saman nimisin� kuin ne ovat taulun kuvauksessa. T�h�n sis�ltyy my�s artikkeli kokonaisena.
\item[palauttaa:]	ok tai mahdollisen tietokantavirheen tuloste
\item[toiminta:]	Tallentaa parametreina saadut tiedot ja artikkeli suoraan tietokantaan. Jos 
artikkelin id-numeroa ei saada parametrina, generoidaan artikkelille uusi id-numero, joka liitet��n 
artikkeliin. T�ll�in artikkelia ei tallenneta vanhan p��lle vaan luodaan kantaan uusi rivi artikkelille.
\end{description}

\subsection{listArticles.java}

\begin{description}
\item[parametrit:]	---
\item[palauttaa:]	Servletti palauttaa artikkelin otsikko / id / description / DTD-id kent�t. Koska 
servletti voi palauttaa vain yhden merkkijonon t�ytyy kent�t erottaa toisillaan erotinmerkill�, jolloin 
vastaanottaja voi purkaa merkkijonon takaisin kentiksi. Virheen sattuessa servletti palauttaa tietokannan virheilmoituksen. 
\item[toiminta:]	Hakee tiedon artikkelit taulun sis�ll�st� ja kirjoittaa sen pyynn�n tekij�lle. 
\end{description}

\subsection{listDTD.java}

\begin{description}
\item[parametrit:]	---
\item[palauttaa:]	Servletti palauttaa DTD:n otsikko / id / kuvaus kent�t. Koska servletti voi palauttaa 
vain yhden merkkijonon t�ytyy kent�t erottaa toisillaan erotinmerkill�, jolloin vastaanottaja voi purkaa 
merkkijonon takaisin kentiksi. Virheen sattuessa servletti palauttaa tietokannan virheilmoituksen. 
\item[toiminta:]	Hakee tiedon DTD taulun sis�ll�st� ja kirjoittaa sen pyynn�n tekij�lle.
\end{description}

\subsection{Database.java}

Luokka tarjoaa tietokantayhteyden k�ytt��n rajapinnan.

\subsubsection{String openCon(String address, String user, String pass)}

\begin{description}	
\item[parametrit:]	Saa parametreina tietokannan osoitteen, k�ytt�j�tunnuksen ja salasanan. Tietokannan osoite annetaan muodossa: rajapinnnan nimi:ajurin nimi:koneen nimi:koneen portti:k�ytetyn tietokannan nimi. Esimerkiksi Oracle tapauksessa: jdbc:oracle:thin:@kontti.helsinki.fi:1522:tktb
\item[palauttaa:]		Palauttaa joko tyhj�n merkkijonon tai tietokannan virheilmoituksen.
\item[toiminta:]		Alustaa ja avaa parametrien mukaisesti Database-luokalle yhteyden tietokantaan.
\end{description}		

\subsubsection{String closeCon()}

\begin{description}
\item[parametrit:]	--
\item[palauttaa:]		Palauttaa tyhj�n tai virheen sattuessa tietokannan virheilmoituksen.
\item[toiminta:]		Suljetaan avoinna oleva tietokantayhteys. 
\end{description}

\subsubsection{ResultSet doQuery(String query)}

\begin{description}
\item[parametrit:]	Parametrina saadaan sql-kysely.
\item[palauttaa:]		Palautetaan javan ResultSet-olio, joka sis�lt�� tehdyn sql-kyselyn tuloksen.
\item[toiminta:]		Suorittaa parametrin� saadun kyselyn avoimena olevan tietokantayhteyden yli tietokantaan ja palauttaa tuloksen. Tietokantavirheen sattuessa p��st�� siit� syntyv�n poikkeuksen l�pi kutsujalle.
\end{description}

\subsubsection{String doUpdate(String query)}

\begin{description}
\item[parametrit:]	Parametrin� saadaan suoritettava sql-lause.
\item[palauttaa:]		Palauttaa tyhj�n merkkijonon jos operaatio onnistui tai tietokannan virheilmoituksen
\item[toiminta:]		Suorittaa parametrina saadun sql-lauseen tietokantaan.
\end{description}


\section{K�ytt�liittym�(HT ja ET)}\label{K�ytt�liittym�}

T�ss� kappaleessa kuvataan JouTo-ohjelmiston k�ytt�liittym� rakenne ja ulkoasu
sek� tekninen toteutus. Jokainen k�ytt�liittym�n osa on kuvattu omassa kappaleessan.

\subsection{K�ytett�v�t tekniikat(HT)}\label{K�ytett�v�t tekniikat}

Ohjelmiston kehityksess� k�ytet��n Bordland JBuider 4 -kehitysty�kalua ja sen
tarjoamia ominaisuuksia. JBuilder 4 k�ytt�� standardeja Java-kirjastoja sek�
AWT ett� Swing-komponentteja joita k�ytet��n k�ytt�liittym�n kehitt�misess�.
\\
Ohjelmistossa k�ytet��n Javan versiota 1.2.2 ja vastaavia Swing\--komponentteja.

\subsection{K�ytt�liittym�n elementit}\label{K�ytt�liittym�n elementit}

T�ss� luvussa kerrotaan JouTo-ohjelmiston asiakkaan puolen k�ytt�liittym�n eri
elementeist� ja niiden teknisest� toteutuksesta.

\subsubsection{Valikot}\label{Valikot} 

T�ss� kappaleessa kuvataan ohjelmistosta l�ytyv�t valikot ja niiden toteutusperiaatteet.

\subsubsection*{Valikkojen toiminta ja sis�lt�}\label{Valikkojen toiminta ja sis�lt�}

Ohjelmiston valikoista k�ytt�j� p��see ohjaaman monia ohjelman toimintoja. Ohjelmassa 
on nelj� valikkoa: File, Edit, Options ja About. 
\\
File-valikosta l�ytyv�t seuraavat toiminnot

\begin{itemize}
\item \emph{New}-toiminnolla k�ytt�j� voi avata uuden artikkelin.
\item \emph{Open}-toiminnolla k�ytt�j� voi avata aikaisemmin tallennetun artikkelin.
\item \emph{Save}-toiminnolla k�ytt�j� tallettaa editorissa olevan artikkelin.
\item \emph{Save As New}-toiminnolla k�ytt�j� voi tallettaa artikkelin uudella nimell� tallentamatta sit� edellisen artikkelin p��lle.
\item  \emph{Exit}-toiminnolla k�ytt�j� p��see pois ohjelmasta.
\end{itemize} 

Edit-valikosta l�ytyv�t seuraavat toiminnot                                    

\begin{itemize} 
\item \emph{Undo}-toiminnolla k�ytt�j� voi perua edellisen tekstinmuokkaustoimintonsa.
\item \emph{Redo}-toiminnolla k�ytt�j� voi perua edellisen Undo-operaation.
\item \emph{Cut}-toiminnolla k�ytt�j� voi leikata valitun tekstialueen.
\item \emph{Copy}-toiminnolla k�ytt�j� voi kopioida valitun tekstialueen.
\item \emph{Paste}-toiminnolla valittu tekstialue voidaan joko siirt�� tai kopioida.
\end{itemize}

Options-valikosta l�ytyv�t seuraavat toiminnot                                 

\begin{itemize} 
\item \emph{Article Options}-toiminnolla k�ytt�j� p��see muokkaamaan ja tarkastelemaan 
artikkeliin liittyvi� tietoja.
\end{itemize}

About-valikosta l�ytyv�t seuraavat toiminnot

\begin{itemize} 
\item \emph{About JouTo}-toiminnolla k�ytt�j� pystyy tarkastelemaan ohjelman tietoja.
\end{itemize}

\begin{figure}[!h]
\centering 

%\includegraphics{box.eps}

\caption{Valikot} \label{kuva_valikot}
\end{figure}

Kuvassa \ref{kuva_valikot} n�hd��n ohjelman valikot Java Swing-komponenteilla toteutettuna.

\subsubsection*{Valikkojen tekninen toteutus}\label{Valikkojen tekninen toteutus}

Menut sijaitsevat Appletin yl�laidassa ja ne on tehty Java Swing-komponenteilla.
Varsinaiset menujen luonnin ja niiden kiinnitt�miset suoritetaan sen luokan
konstruktorissa joka ne luo.Menubar pit�� kiinnitt�� johonkin top-level containeriin,
t�ss� tapauksessa JFrameen, jotta se n�kyy my�s k�ytt�j�lle.\\
Esimerkki menujen luomisesta:
\begin{verbatim}

   import javax.swing.*;

 ... // luokkajulistukset jne.

   JMenuBar menuBar;        // JMenuBar-komponentti luo menubarin
   JMenu menu,              // JMenu-komponentti luo yksitt�isen menun
   JMenuItem menuItem;      // JMenuItem-komponentti luo menun yhden valinnan

   //Luodaan varsinainen menubar
   menuBar = new JMenuBar();
   setJMenuBar(menuBar);

   //Luodaan varsinainen menu juuri luotuun menubariin
   menu = new JMenu("A Menu");
   menuBar.add(menu);

   //Luodaan menu-elementti juuri luotuun menuun
   menuItem = new JMenuItem("A text-only menu item")
   menu.add(menuItem);

\end{verbatim}
Menuihin voidaan my�s helposti liitt�� kuvia sek� pikan�pp�imi�.
\\ \\
Menuihin liittyy my�s menu-elementtien tapahtumakuuntelijat, jotka ilmaisevat
ohjelmalle k�ytt�j�n valinnat. T�ll�in luokan pit�� toteuttaa \emph{ActionListener}
-tapahtumakuuntelija sek� k�sitell� valikoista tulleet tapahtumat.
\\
\begin{verbatim}

// Luokka MenuDemo toteuttaa ActionListener-kuuntelijan, joka mahdollistaa
// valikoiden tapahtumien kuuntelemisen
public class MenuDemo ... implements ActionListener {
                                     
    ...
    // Luokan MenuDemo konstruktori lis�� tapahtumakuuntelijat menuihin
    public MenuDemo() {
        // Jokaiseen menu-elementtiin tulee vastaava kiinnitys
        menuItem.addActionListener(this);
        ...
    }
    
		// metodia actionPerfomed (ActionEvent e) kutsutaan kun jokin
		// ActionEvent-luokan totettanut luokka generoi tapahtuman. T�ss�
		// metodissa pit�� menujen tapahtumat k�sitell�
      public void actionPerformed(ActionEvent e) {
        
        // Otetaan selv�� mik� tapahtuma on kyseess�
        // Tehd��n tarpeelliset toimenpiteet
    
\end{verbatim}

\subsubsection{Tool Bar (ET,HT)}\label{Tool Bar}
 
Tool bar (ty�kalupalkki) sijaitsee Appletin yl�laidassa menun alapuolella
ja se on toteutettu Java Swing-komponenteilla.
      
\subsubsection*{Tool Barin kuvaus}
    
Tool bar on jaettu kahteen riviin, ja siit� l�ytyy kolmen tyyppisi� painikkita
\begin{itemize}
\item Tekstin ja ohjelman toimintoja: undo, redo, cut, copy, paste ja special.
\item Block-tason elementtien k�sittelyyn liittyv�t napit: paragraph, pre-formated,
		bulleted list, numbered list ja blockquote.
\item Inline-tason elementtien k�sittelyyn liittyv�t napit: person, location, 
 		organization ja quote.
\end{itemize}

N�ist� painikkeista aktivoidaan aina ne kuvakkeet jotka ovat sill� hetkell�
mahdollisia toimintoja ts. k�ytt�j�ll� on mahdollista tehd� kuvakkeen ilment�m�
toiminto siin� tilateessa. Tool barin kuvakkeiden tilojen muutoksista vastaa
UIManager-luokka.

\begin{figure}[!h]
  \centering 

%\includegraphics{box.eps}

  \caption{Tool bar} \label{kuva_toolbar}
\end{figure}

Kuvassa \ref{kuva_toolbar} n�hd��n kuva ty�kalupalkin toteutuksesta 
Java Swing-komponenteilla.

\subsubsection*{Tool Barin tekninen toteutus}
 
Tool barin ja sen komponenttien luonnin ja kiinnitt�minen suoritetaan sen luokan
konstruktorissa joka ne luo. JouTo-projektissa tool barin luo UIManager-luokka.
Tool bar kiinnitet��n Frameen valikon alapuolelle.
\\
Tool Barin luonti: 
\begin{verbatim} 
   // K�ytett�v� kirjasto 
   import javax.swing.*;

   ...

   // Luodaan ilmentym� JToolBar-luokasta 
   JToolBar toolBar = new JToolBar();
   // Lis��t��n napit (kts. seuraavaa ohjelmakoodia)
   addButtons(toolBar);	
   
   // Lis�t��n luotu Tool bar JPanel-containeriin
   JPanel contentPane = new JPanel();
   contentPane.setLayout(new BorderLayout());
   contentPane.add(toolBar, BorderLayout.NORTH);
 
\end{verbatim} 

Tool bariin voidaan lis�t� komponetteja ja konponentteihin voidaan liitt��
kuvia.

\begin{verbatim} 
 
    ...
   
   // T�t� metodia kutsuttiin edellisess� esimerkiss� lis��m��n kuvakkeen 
   // tool bariin
   protected void addButtons(JToolBar toolBar) {
   
      JButton button = null;
 
      //Esimerkiss� lis�t��n images-hakemistossa oleva left.gif - kuva
      button = new JButton(new ImageIcon("images/left.gif"));
         ... 
      toolBar.add(button);
         ...     
\end{verbatim} 

Tool bariin voidaan lis�t� my�s eroittimia.

\begin{verbatim} 
    
   toolBar.addSeparator();
 
\end{verbatim} 

Tool barin tapahtumakuuntelijat luodaan samalla tavoin kuin valikoiden
tapahtumakuuntelijat (katso lukua \ref{Valikot} saadaksesi lis�tietoa).
Jokaiseen tool bariin lis�tt�v�t komponentin on huolehdittava ett� lis��
itseens� tapahtumakuuntelijan.

Osa kuvakkeista aktivoidaan ja deaktivoidaan riippuen k�ytt�j�n valinnoista ja
sen hetkisest� tilasta. T�m� tehd��n kutsumalla \emph{setButtonsActive}-metodia.
Kutsumisesta ja parametrien oikeellisuudesta huolehtii UIManager-luokka.

\emph{public setButtonsActive(string[]buttonlist)}
	\begin{description}                 
	\item[parametrit:]	Osoite elementtilistan alkuun.
   \item[palauttaa:]		Boolean-arvon onnistumisesta
	\item[toiminta:]     Aktivoi listassa mainitut elementtikuvakkeet. Ilmoittaa
                			UIManagerille, ett� kuvakkeiden aktivoinnit on suoritettu.
	\end{description}


\subsection{Metatieto}
Luokkakuvauksissa oleva headers (katso lukua\ref{Moduulikuvaus})jakautuu t�ss� 
k�ytt�liittym�t -luvussa kahteen osaan 
\begin{itemize}
\item metatietoon, jossa on yleist� tietoa artikkelista ja sen kirjoittajasta.
\item artikkelin otsikkotietoihin, jotka ovat artikkelista riippuvia otsikkotietoja kuten
esimerkiksi artikkelin p��otsikko (katso lukua \ref{Artikkeli}).
\end{itemize}
Metatieto-osio sijaitsee tool barin (ty�kalupalkki) alla. Se on toteutettu 
Java Swing-komponenteilla.

\subsubsection*{Metatieto-osion kuvaus}

Metatieto-osiossa on yleist� tietoa artikkelista ja artikkelin kirjoittajasta.
Metatieto-osiosta l�ytyv�t seuraavat tiedot:

\begin{itemize}
\item Kirjoittajan nimi
\item Kirjoitusajankohta
\item Uutisen tyyppi
\end{itemize}

\begin{figure}[!h]
\centering 
%\includegraphics{box.eps}
\caption{Metatieto-osio} \label{kuva_metatieto}
\end{figure}

Kuvassa \ref{kuva_metatieto} n�hd��n Java Swing-komponenteilla toteutettu 
metatieto-osio.

\subsubsection*{Metatieto-osion tekninen totetutus}

Metadata-osio koostuu valmiista Swing-komponenteista eli JPanel-kent�st� ja sen sis��n 
laitettavista komponenteista (JTextField,JTextArea, JComboBox). Kent�n arvoja muokataan
ulkoa k�sin suoraan UIManager-luokasta antamalla komponenttien huolehtia itsens� 
piirt�misest�.
\\
Esimerkkikoodi:
\begin{verbatim}
   // K�ytet��n Swing-kirjastoa
   import javax.swing.*;
    ...

   // Luodaan uusi JPanel
   JPanel aPanel = new JPanel();
   // Asetetaan luotuun JPaneliin haluttu layout
   aPanel.setLayout(new BorderLayout());

   ...
   
   // Luodaan halutut komponentit, jotka on tarkoitus laittaa JPaneliin
   JTextField Poksi = new JTextField(20); 
   
   //Elementteihin laitetaan my�s k�sittelij�t tutkimaan niiden muutoksia
   // kuten kohdassa \ref{Menut}
   Poksi.addActionListener(this);
  

   // Lis�t��n elementit JPaneliin k�ytt�m�ll� add-metodia
   aPanel.add(Poksi);
   ...

	// Kirjoitetaan elementtiin
	aPanel.Poksi.setText="T�m� on teksti�";

\end{verbatim}

\subsubsection{Artikkeli}\label{Artikkeli}

Varsinainen artikkeli sijaitsee t�ss� osiossa. Artikkeli-osuus koostuu valmiista 
Java Swing-komponenteista ja JouTo-projektissa luodusta Body-komponentista. 

\subsubsection*{Artikkeli-osion kuvaus}

Varsinainen artikkeli sijaitsee t�ss� osiossa. Artikkelista riippuvat otsikkotiedot
sek� varsinainen artikkelin sis�lt� on jaettu erillisiin osiin. Otsikkotiedot n�ytet��n
Java Swing-komponenteissa artikkelista riippuvassa j�rjestyksess�, ja varsinainen
artikkelin runko pidet��n JouTo-projektissa luodussa Body-komponentissa.
\\
Sek� otsikkotiedot ett� artikkelin runko ovat tabulaattorilistassa omissa v�lilehdiss��n.

\begin{figure}[!h]
  \centering 
%\includegraphics{box.eps}
  \caption{Artikkelin otsikkotiedot} \label{kuva_otsikkotiedot}
\end{figure}

Kuvassa \ref{kuva_otsikkotiedot} n�hd��n esimerkki artikkelin otsikkotiedot-osiosta
toteutettuna Java Swing-komponenteilla.

\begin{figure}[!h]
\centering 
%\includegraphics{box.eps}
\caption{Artikkelin runko - Body-elementti} \label{kuva_body}
\end{figure}

Kuvassa \ref{kuva_body} n�hd��n varsinaisen artikkelin kirjoitukseen tarkoitetun 
Body-komponentin toteutus. Body-komponentti on JouTo-ohjelmistossa totetutettu komponentti.
Lis�tietoja Body-komponentista ja sen toteutuksesta l�ytyy kappaleesta 
\ref{Moduulikuvaus}

\subsubsection*{Artikkeli-osion tekninen toteutus}

Artikkeli-osio Java Swing-komponenteilla luotu artikkelista riippuva
komponenttiryhm�, johon sis�ltyy viel� JouTo-projektissa luotu Body-komponentti. 
JTabbelPane-komponentti pit�� sis�ll��n valitusta artikkelista 
riippuvien tietojen elementtej� toisessa tabulaattorilehdess��n ja artikkelin 
editointiin tarkoitettua Body-komponenttia toisessa.

JTabbedPane-komponentti voi sis�lt�� seuraavat Swing-komponentit
\begin{itemize}
\item JTextField
\item JTextArea
\item JComboBox
\item JScrollPanel
\end{itemize}

N�m� komponentit asetellaan JTabbedPane-komponenttiin artikkelista riippuvassa
j�rjestyksess�.

JTabbedPanel-komponettiin lis�t��n artikkelista riippuvat kent�t. (JTextField,
JTextArea) N�iden sis�lt�� muokataan suoraan UIManager-luokasta. 


\begin{verbatim}
   import javax.swing.*;
   ...

   JTabbelPane jTabbelPane = new JTabbelPane();
   JTextBox jTextBox = new JTextBox("Poksi");

   // Lis�t��n uusi tabulaattorilehti, jossa on teksti One ja
   // tooltip Does Nothing

   jTabbedPane.addTab("One", "Does nothing");
   // Indeksi 0 tarkoittaa ensimm�ist�
   tabbedPane.setSelectedIndex(0);

   ...
   
   // Lis�t��n komponentteja JTabbedPaneen
   jTabbedPane.add(jTextBox);

	...

\end{verbatim}


\subsubsection{Statusbar}\label{Statusbar}

Status baria k�ytet��n informaation v�litt�miseen ohjelmalta k�ytt�j�lle.

\subsubsection*{Status barin kuvaus}\label{Status barin kuvaus}

Status bar on ikkunan alalaidassa oleva osa. Status baria k�ytet��n n�ytt�m��n 
informaatiota ohjelmasta ja mahdollisia virheilmoituksia k�ytt�j�lle.

\begin{figure}[!h]
  \centering 

%\includegraphics{box.eps}

  \caption{Status bar} \label{kuva_statusbar}
\end{figure}

Kuvassa \ref{kuva_statusbar} n�hd��n ohjelmiston Status bar ja siin� oleva
esimerkkituloste.

\subsubsection*{Status barin tekninen toteutus}\label{Status barin tekninen toteutus}

Status bar sis�ltyy siihen ikkunaan, jossa ohjelmaa ajetaan eik� sit� tarvitse erikseen
luoda Javalla. Kuitenkin ikkunaa luodessa tulee Status bar luoda siihen ikkunaan
jossa ohjelmaa ajetaan, jotta sit� voidaan ylip��t��n k�ytt��. \\
Status baria k�sitell��n seuraavalla koodilla

\begin{verbatim}

    showStatus("T�m� teksti tulee Status Bariin")

\end{verbatim}

Seuraava metodi tarjotaan ulosp�in


\emph{public boolean writeToStatusBar(String text)}

	\begin{description}
	\item[parametrit:]	Status bariin tulostettava teksti
   \item[palaute:]	Boolean-arvo, joka ilmoittaa onnistumisen tai ep�onnistumisen
	\item[toiminta:]	Metodi kirjoittaa Status barin arvoksi annetun tekstin. Metodi
							tarkistaa annetun arvon j�rkevyyden ja huolehtii mahdollisien
							poikkeiksien k�sittelyst�. 
	\end{description}

\subsection{K�ytt�liittym�n dialogit (HT,ET)}\label{K�ytt�liittym�n dialogit}
 
Ohjelmistossa dialogeja k�ytet��n ottamaan vastaan k�ytt�j�n sy�tteit� sek�
n�ytt�m��n k�ytt�j�lle ohjelman vaihtoehtoja sek� tulosteita.
 
JouTo-ohjelmistossa on seuraavia dialogeja
\begin{itemize}
\item	New
\item	Open
\item	Save
\item	Save As New
\item	Textdialog
\end{itemize}
 
Kuvaukset dialogeista ja niiden toiminnoista l�ytyv�t seuraavista kappaleista.

\subsubsection{Dialogien kuvaukset (ET)}

\subsubsection*{New-dialogi}\label{kuvaus_New-dialogi}
 
K�ytt�liittym��n tuodaan Servletilt� listaus DTD:ist�, joista listan
ensimm�inen on se tyypillisin DTD. Tyypillisin DTD on my�s valittu,
jolloin k�ytt�j�n ei tarvitse muuta kuin jatkaa suoraan eteenp�in mik�li
k�ytt�j� ei halua valita jotakin muuta DTD:t�. Valitulta DTD:lt� saadaan
sen id, jonka perusteella haetaan Servletilt� DTD:n mukainen artikkelipohja.
K�ytt�liittym�ss� on OK -ja Cancel -painikkeet.

\begin{figure}[!h]
  \centering 

%\includegraphics{box.eps}

  \caption{New-dialogi} \label{dialogi_new}
\end{figure}
 
Kuvassa \ref{dialogi_new} n�hd��n Java Swing-komponenteilla toteutettu
dialogi.

\subsubsection*{Open-dialogi}\label{kuvaus_Open-dialogi}
 
K�ytt�liittym��n tuodaan Serletilt� listaus artikkeleista laskevassa
j�rjestyksess� kirjoitusp�iv�m��r�n mukaan, joista viimeisin artikkeli
on valittuna. Liittym�ss� n�ytet��n vain kymmenen ensimm�ist� artikkelia. 
Lis�� artikkeleita saa vieritt�m�ll� palkista. Artikkelista liittym�ss�
n�ytett�v�t tiedot ovat: p��otsikko, kuvaus, kirjoittaja ja kirjoitusp�iv�m��r�.
P��otsikon kent�n pituus on 25 merkki� ja kuvauksen 50 merkki�. Mik�li
merkkijonot ovat pitempi� kuin mit� liittym�ss� on mahdollista n�ytt��, 
n�ytet��n k�ytt�j�lle merkkijonon jatkuminen kolmella pisteell�. Valitulta   
artikkelista saadaan sen id, jonka perusteella saadaan Servletilt� artikkelin
DTD:n id. K�ytt�liittym��n haetaan ensin DTD:n mukainen artikkelipohja ja sen
j�lkeen t�ydennet��n pohjaan artikkelin tiedot. K�ytt�liittym�ss� on OK -ja
Cancel -painikkeet.
 
\begin{figure}[!h]
  \centering 

%\includegraphics{box.eps}

  \caption{Open-dialogi} \label{dialogi_open}
\end{figure}
 
Kuvassa \ref{dialogi_open} n�hd��n Java Swing-komponenteilla toteutettu dialogi.

\subsubsection*{Save-dialogi}\label{kuvaus_Save-dialogi} 
 
Tallennetaan k�ytt�j�n kirjoittama artikkeli sellaisenaan vanhan artikkelin
p��lle. Tallenuksen eteneminen n�ytet��n k�ytt�liittym�ss� tilariviss�, jossa
lukee: tallennetaan. K�ytt�j�lle annetaan palautetta editorin tilariviss� 
(status bar). T�ll�in k�ytt�ja n�kee, ett� j�rjestelm� suorittaa pyydetty�   
toimenpidett�. T�t� tilarivipalautetta k�ytt�liittym�ss� n�ytet��n my�s new
ja open -dialogien yhteydess�.
 
\begin{figure}[!h]
  \centering 

%\includegraphics{box.eps}

  \caption{Save-dialogi} \label{dialogi_save}
\end{figure}

Kuvassa \ref{dialogi_save} n�hd��n Save-dialogi 
Java Swing-komponenteilla toteutettuna.

\subsubsection*{Save As New-dialogi}\label{Save As New-dialogi}
 
K�ytt�liittym�ss� n�ytet��n artikkelin nimi ja kuvaus. Artikkelin nimen�   
k�ytet��n p��otsikkoa. Mik�li k�ytt�j� on kirjoittanut artikkelille kuvauksen,
tuodaan se liittym��n esille, k�ytt�j� voi tarvittaessa muuttaa kuvausta. 
Artikkelin kuvaus ei ole pakollinen. Tallennus-toiminnon yhteydess� artikkelille
muodostetaan sen id. K�ytt�liittym�ss� on OK -ja Cancel -painikkeet. 
 
\begin{figure}[!h]
  \centering 

%\includegraphics{box.eps}

  \caption{Save As New-dialogi} \label{dialogi_save_as_new}
\end{figure}
 
Kuvassa \ref{dialogi_save_as_new} n�hd��n Save as New-dialogi 
Java Swing-komponenteilla toteutettuna.

\subsubsection*{Tekstidialogi}\label{kuvaus_Tekstidialogi}

Tekstidialogissa n�ytet��n k�ytt�j�lle ohjelman tulosteita ja virheilmoituksia.
Dialogi sis�lt�� tilanteesta riippuvat tekstin ja \emph{OK}-nappulan, jolla
k�ytt�j� pystyy sulkemaan dialogi-ikkunan.

\begin{figure}[!h]
  \centering 

%\includegraphics{box.eps}

  \caption{Teksti-dialogi} \label{dialogi_teksti}
\end{figure}

Kuvassa \ref{dialogi_teksti} n�hd��n tekstidialogi esimerkkisy�tteell�.

T�llainen virheilmoitus saadaan aikaan kutsumalla tekstidialogia (katso lukua
\ref{Dialogien tekninen toteutus}) halutulla tekstill�.

Jos pyydetyn toimenpiteen seurauksena joko tietoja tuhoutuisi tai toimenpidett� ei 
voida muutoin suorittaa, pyydet��n k�ytt�j�lt� vahvistus toimenpiteen suorittamatta 
j�tt�miselle. Vain vakavissa virhetilanteissa k�ytt�j�lt� vaaditaan hyv�ksynt� 
suorittamatta j�tetylle toimenpiteelle. T�llainen toimenpide voisi olla artikkelin 
tallennuksen ep�onnistuminen.K�ytt�liittym�ss� pysyt��n toimenpidett� edelt�v�ss� 
tilassa. K�ytt�liittym�ss� on vain \emph{OK}-painike. 

Jos toimenpide voidaan suorittaa tuhoamatta varsinaista teksti�, t�lloin 
dialogissa on sek� \emph{OK}- ett� \emph{Cancel} -painike.

\begin{figure}[!h]
  \centering 

%\includegraphics{box.eps}

  \caption{Save-dialogi} \label{dialogi_virheilmo}
\end{figure}

Kuvassa \ref{dialogi_virheilmo} n�hd��n Java Swing-komponentilla toteutettu
esimerkki.

\subsubsection{Dialogien tekninen toteutus (HT)}\label{Dialogien tekninen toteutus}

Dialogit toteutetaan k�ytt�m�ll� Java Swing-kirjaston 
JOptionPane-komponenttia pohjana ja toteuttamalla siihen tarvittavat
lis�toiminnallisuudet dialogista riippuen. \\
Perustoiminnallisuus:
\begin{verbatim}

	// Kirjastot mukaan
	import javax.swing.*;

	// Todella yksinkertainen dialogi-ikkuna
	JOptionPane.showMessageDialog(frame,
                                 "Eggs aren't supposed to be green.",
                                 "Inane custom dialog",
                                 JOptionPane.INFORMATION_MESSAGE;
\end{verbatim}

Yo. ohjelmakoodi luo dialogin, jossa lukee {\em{Eggs arent's supposed to be green.}},
otsikossa lukee {\em{Iane custom dialog}} ja dialogi sis�lt�� viel� informaatiota
ilmoittavan huutomerkki-ikonin sinisell� taustalla.

Seuraavissa kappaleissa kuvataan eri dialogeihin liittyv�t erikoisominaisuudet ja metodit.

\subsubsection*{New-dialogi(ET)}

K�ytt�m�ll� suoraan JDialog:a JOptionPane:n sijasta saadaan dialogeja, jotka tapahtuvat
editorin n�yt�ll�. Mik�li dialogiin ei pysty sijoittamaan listaa DTD:st� tai artikkeleista,
toteukseen on t�ll�in k�ytett�v� jotakin muuta tapaa Java Swingin Dialog -komponentteja.

\begin{verbatim}
	// Kirjastot mukaan
	import javax.swing.*;

	// Monipainikkeinen dialogi-ikkuna 
	JDialog.showOptionDialog();	//Option:a saadaan
monipainikkeinen dialogi.
\end{verbatim}

JDialogi -metodeja, jotka luodaan dialogeja ovat

\begin{verbatim}
int showMessageDialog(...) 		//Yksipainikkeinen dialogi, jossa 
					hieman informaatiota.
int showOptionDialog(...) 		//J�rjestelm�kohtainen dialogi 
					(laajenpi kuin edellinen dialogi.).
int showConfirmDialog(...) 		//Kysyy k�ytt�j�lt� kysymyksen.
String showInputDialog(...)		//Ottaa k�yttj�lta vastaan 
					informatioita.
int showInternalMessageDialog(...)  	//Implementoi standardidialogia 
					framena
\end{verbatim}

Konstuktorissa voidaan dialogeille. JOptionPane:ssa ja JDialog:ssa luonti ja lis��minen 
tapahtuu samalla tavoin. 

\begin{verbatim}
	//Luodaan uusi dialogi 
	final JOptionPane optionPane = new JOptionPane(
	
	    //Diaoligin teksti
	    "The only way to close this dialog is by\n"
	    + "pressing one of the following buttons.\n"
	    + "Do you understand?",
	    
	    //Dialogin ikoni ja painikkeet
	    JOptionPane, QUESTION_MESSAGE,
	    JOptionPane.YES_NO_OPTION);
	
	    ...
		
	//Arvon asettaminen
        int value = ((Integer)optionPane.getValue()).intValue();
        if (value == JOptionPane.YES_OPTION) {
            setLabel("Good.");
        } else if (value == JOptionPane.NO_OPTION) {
            setLabel("Try using the window decorations "
                    + "to close the non-auto-closing dialog. "
                    + "You can't!");
        }
\end{verbatim}

Dialogin ominaisuuksia ovat

\begin{itemize}

\item{\em{Component parentComponent}} k�ytet��n vain JDialogi:ssa, jossa 
ainakin onoltava frame. Ominaisuuden lis��miseen k�ytet��n metodia 
{\em{JDialogsetLocationRelativeTo}}.

\item{\em{Object message}} lis�t��n "\verb|...\n|" -merkeill�.

\item{\em{String title}} lis�t��n dialogi-ikkunan otsikko.

\item{\em{int optionType}} lis�t��n standardipainikkeina joko  \verb|DEFAULT_OPTION|, \verb|YES_NO_OPTION|, \verb|YES_NO_CANCEL_OPTION| tai \verb|OK_CANCEL_OPTION|. 

\item{\em{int messageType}} OptionPaneen lis�t��n informaatioarvona joko \verb|PLAIN_MESSAGE| (ikoniton),  \verb|ERROR_MESSAGE| (viiva punaisessa monikulmion
pohjassa),  \verb|INFORMATION_MESSAGE| (i-kirjain sinisess� ympyr�n pohjassa), 
 \verb|WARNING_MESSAGE| (huutomerkki keltaisessa kolmion pohjassa) tai \verb|QUESTION_MESSAGE| (kysymysmerkki virhe�ss� neli�n pohjassa).  

\item{\em{Odject[] options}} lis�t��n standardialogeissa lis�informaatiota.

\item{\em{Object initialValue}} k�ytet��n virheilmoituksissa. 

\end{itemize}

Tekstin tuominen dialogiin

\begin{verbatim}
          String s = customDialog.getValidatedText();
          if (s != null) {
          	//Teksti�
          	setLabel("Congratulations!  "
           		+ "You entered \""
                	+ s
                        + "\".");
          }
\end{verbatim}

Latauksen ja tallenuksen yhteydess� k�ytett�v�n dialogin koodiin tulee laitta

\begin{verbatim}
	// Tiedoston lataus 
	public static final int LOAD
\end{verbatim}

Konstruktorissa luodaan frame

\begin{verbatim}
	// Luo tiedostodialogin frame  
	public FileDialog(Frame parent, String title) //parent - dialogin 
	omistaja, title - dialogin otsikko
\end{verbatim}

Dialogille luodaan muutostilaa kuunteleva tapahtumakuuntelija.

\begin{verbatim}
	//Dialogin tapahtumakuuntelija luodaan
	optionPane.addPropertyChangeListener(
                new PropertyChangeListener() {
                    public void propertyChange(PropertyChangeEvent e) {
                        String prop = e.getPropertyName();
			...

\end{verbatim}

\subsubsection*{Open-dialogi}

Open-dialogin toteutus tapahtuu samoilla keinoilla kuin New-dialogin
toteutus.

\subsubsection*{Save-dialogi}

Save-dialogin toteutus tapahtuu samoilla keinoin, k�ytet��n SAVE:a
LOAD:n sijasta ja konstruktorissa luodaan hieman toinenlainen frame.

\begin{verbatim}
	// Tiedoston tallennus  
	public static final int SAVE
\end{verbatim}

\begin{verbatim}
	// Luo tiedostodialogin   
	public FileDialog(Frame parent, String title, int mode) 
	//parent - dialogin omistaja, title - dialogin otsikko ja mode - SAVE.
\end{verbatim}

\subsubsection*{Save As New-dialogi}

Open-dialogin toteutus tapahtuu samalla tavoin kuin New-dialogin
toteutus.

\subsubsection*{Tekstidialogi}

Tekstidialogit toteutetaan saman perusmallin mukaan. Jos virheilmoitus 
toteutetaan dialogina, virheilmoituksen koodissa annetaan sellainen ominaisuus, 
jolla estet��n dialogon automaattinen sulkeminen. Vain k�ytt�j�n hyv�ksynt� 
sulkee dialogin. 

\begin{verbatim}
dialog.setDefaultCloseOperation(
                JDialog.DO_NOTHING_ON_CLOSE);
            dialog.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent we) {
                    setLabel("Thwarted user attempt to close window.");
                }
            });
\end{verbatim}


%%%%%%%%%%%%%%%% RAJAPINNAT %%%%%%%%%
%\subsection{Rajapinnat}\label{Rajapinnat}
%
%T�ss� luvussa kuvataan k�ytt�liittym�n ohjelmisto-rajapinnat ulosp�in sek� luokan tarjoamat rajapinnat muille luokille. Kappaleen tarkoituksena on antaa lukijalle kuva k�ytt�liittym�n tarvitsemista resursseista ja sen tarjoamista operaatioista. 

%\subsubsection{Sis�iset rajapinnat}\label{Sis�iset rajapinnat}

%Koska ohjelma jakaantuu kahteen erilliseen selk�esti erotettavaan
%kokonaisuuteen palvelimeen ja asiakassovellukseen, joutuvat n�m� kaksi
%kokonaisuutta keskustelemaan verkon ylitse. Keskusteluun
%k�ytet��n HTTP-POST -standardia, jonka avulla tietoa saadaan siirretty�
%verkossa

%\subsubsection{Rajapinnat ulosp�in}\label{Rajapinnat ulosp�in}

%JouTo tarjoaa muille ohjelmille rajapintanaan oman tietokantansa, jonne
%kaikki artikkelit on tallennettu.

%%%%%%%%% VIRHEK�SITTELY %%%%%%%%%

%\section{Virhek�sittely}\label{Virhek�sittely}

%%%%%%%%% J�TETYT RATKAISUT %%%%%%%%%%

%\section{Hyl�tyt ratkaisuvaihtoehdot}\label{Hyl�tyt ratkaisuvaihtoehdot}

%%%%%%%%%%%%%%%%%%%%%%% END OF DOCUMENT %%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%% LIITTEET %%%%%%%%%%%%%%%%
\newpage
\appendix
\section{Liite: Moduulien rakennekuva}\label{liite1}

\begin{figure}[!h]
\centering
%\includegraphics[width=\textwidth]{rakenne.eps}
\includegraphics[height=0.9\textheight]{rakenne.eps}
\caption{Moduulien rakenne}\label{Moduulien rakenne}
\end{figure}

\end{document}














































































