\chapter{Atomizer: Atom-feed weboldalból}

\section{Motiváció}

Célom egy nagyon egyszerű alkalmazás elkészítése volt, amely jól példázza a feedek sokoldalú hasznosíthatóságát. A végeredmény egy olyan webalkalmazás lett, amely egy weboldalon linkelt zeneszámokat egy olyan listába gyűjti, amelyet egy alkalmas lejátszó alkalmazás megért, és lejátszási listaként használhatja, illetve rendszeresen frissítheti ezt a listát, az eredeti weboldal frissítésének megfelelően. A webalkalmazásnak az \emph{Atomizer} nevet adtam, mert az Atom formátumot használja fel a lista szállításához. A végeredmény egy úgynevezett podcast.

\begin{figure}
\begin{center}
\includegraphics[width=\textwidth]{amarok.eps}
\end{center}
\caption{Amarok: a feed értelmezve}
\label{fig:amaroka}
\end{figure}

\section{Felhasznált elemek és környezet}
Az alkalmazás elkészítéséhez a Java nyelvet választottam, egyrészt, hogy megismerkedjek a servletekel, másrészt a feedeket kezelő API-k sokasága miatt. Ezek közül én a ROME rendszert választottam: ezt találtam a legkiforrottabb keretrendszernek. Nem szabad azonban megfeledkezni a többiről sem, a legfontosabbak: Groovy, Atom4J, Jakarta FeedParser.

A munkám során kizárólag nyílt forráskódú szoftvereket használtam fel. Így például a servletkonténerként az Apache Tomcatet, fejlesztői környezetként a Eclipse rendszert használtam. Az alkalmazás elkészítéséhez szükségem volt még egy komponensre, a JTidy-ra: ez képes a szabálytalan HTML-oldalakat szabályos formára hozni és végül elemezni; szerencsére ez is nyílt forrású. A ROME függőségeként a JDOM nevű rendszer is szükséges volt a fejlesztéshez.

\subsection{Apache Tomcat}

A Tomcat egy jól ismert servletkonténer, az Apache Software Foundation gondozásában: egyszerű, tiszta Java-alapú webszerverkörnyezetet biztosít Java kódok futtatásához. Én az 5.5.25-ös verziót használtam, amely a Java Enterprise Edition Servlet 2.4 és JSP 2.0 verzióját támogatja. A Tomcat nyílt forráskódú szoftver, így szabadon felhasználható bármilyen célra, teljesen kézenfekvő választás egy kisméretű webalkalmazás elkészítéséhez.

A munkám során messze nem használtam ki a Tomcat összes lehetőségét, JSP-t is csak érintőlegesen.

\subsection{ROME}

A ROME egy osztálykönyvtár, amely Atom és RSS feedek beolvasására, reprezrentálására és generálására szolgál. Támogatja az RSS és Atom formátumok minden változatát, céljai közé is tartozik, hogy egyetlen interfész segítségével kezeljen minden ilyen feedet. Jelenleg a 0.9-es verzió áll rendelkezésre. Nyílt forráskódú projekt, az Apache Licence 2.0 alatt adják ki. Mindössze egyetlen osztálygyűjteményre, a JDOM-ra támaszkodik \cite{rome}.

Bár a ROME képes egységesen kezelni a feedet, annak tulajdonságait, a feedelemeket és azok tulajdonságait is, függetlenül a végül kiválasztott formátumtól, én első körben a Atom formátumra koncentráltam, és közvetlenül az Atomnak megfelelő formátumban hoztam létre a feedet osztályszinten. Fejlesztési lehetőség, hogy az Atomizer ne csak Atom formátumban szolgáltasson feedet, mert bár meggyőződésem, hogy az RSS formátuma ,,nehézkes'' és nem szabványos, nem szabad elfelejteni, hogy még mindig elterjedtebb. Sajnos találkoztam olyan aggregátorral, amely nem volt képes értelmezni az előállított Atom-feedet. RSS-t minden bizonnyal sikerült volna.

\begin{figure}
\begin{center}
\includegraphics[width=\textwidth]{vorbis.eps}
\end{center}
\caption{A Vorbis audiokodek zenei oldala}
\label{fig:vorbis}
\end{figure}

\subsection{JDOM}

A JDOM osztálygyűjtemény XML állományok belső reprezentálására almalmas. A World Wide Web Consortium (W3C) DOM specifikációjához hasonló, azonban a Java nyelv és környezet sajátosságait figyelembe vevő, jóval egyszerűbben kezelhető rendszer, amely XML állományok betöltésére és szerializálására nem képes, de gyakorlatilag bármely ilyen implementációval együttműködik, így a Java alapértelmezett SAX és DOM megvalósításával is. Támogatja az XPath-t és az XSLT-t is. Ez is nyílt forráskódú szoftver, licensze az Apache Licence-hez hasonló, de annál megengedőbb.

A JDOM nem játszott közvetlen szerepet a fejlesztésben, csak a ROME függőségeként került be.

\subsection{JTidy}

A JTidy a HTMLTidy Java nyelvű portja, ennek megfelelően képes HTML forráskódot ellenőrizni, javítani, és beolvasni -- sőt, DOM interfészt biztosít a beolvasott tartalom feldolgozására. Ez az egyik alapját képezi az alkalmazásnak: ez segít begyűjteni a weboldalon található hiperhivatkozásokat, oly módon, hogy a HTML-kód értelmezése során rendezi a kódot, majd XML-ként értelmezve azt DOM-fát épít. Ebben a fában XPath segítségével kereshetővé válnak a weboldalon elhelyezett linkek.

\subsection{Fejlesztői környezet: Eclipse}

A munkámhoz egy kiváló nyílt forráskódú fejlesztői környezetet választottam, az Eclipse-et, több változata közül is a Java Enterprise Edition változatához megfelelőt. Ezt az IDE-t találtam a legkézreállóbb megoldásnak, rengeteg kényelmi funkcióval. Csak pozitív jelzőkkel tudom illetni az Eclipse-et, nagyon gyorsan lehetett vele dolgozni, és kiváló a támogatása a webes alkalmazások fejlesztéséhez, valamint a Tomcat-hez.

\begin{figure}
\begin{center}
\includegraphics[width=\textwidth]{fxpodcast.eps}
\end{center}
\caption{A podcast nézete Mozilla Firefoxban}
\label{fig:fxpodcast}
\end{figure}

\section{A konstrukció}

Maga az alkalmazás egyetlen servletből áll, amely néhány, jól meghatározott feladattal és szerepkörrel rendelkező osztály működését koordinálja.

A \verb+WebScraper+ osztály szerepe a webes feladatok ellátása, ezek közé tartozik az egy weboldalon megjelenő linkek összegyűjtése, egy megadott URL-hez tartozó oldal adatainak lekérdezése, illetve ez végzi egy linklista elemein a megadott szűrő lefuttatását, azaz a lista szűrését.

A linkek összegyűjtése a következő módon történik. Egy JTidy-objektum létrehozásával megkezdődik az URL-ről lekért tartalom szabályos alakra hozása és abból DOM-fa építése. Ebben a DOM-fában XPath kifejezés használatával kikereshetők azok az \verb+a+ elemek, amelyek rendelkeznek \verb+href+ attribútummal. Ezekből linkeket készítünk.

A linkek a \verb+Href+ osztály egyes példányaiban tárolódnak, amelyben megjelenik a linkek URL-je, a hivatkozás szövege, illetve emellett tárolható későbbiekben a hivatkozott tartalom médiatípusa, mérete, kódolása, frissítésének ideje, kivonata, illetve bármi más, amely a fejlécekből kideríthető.

A \verb+MusicHrefFilter+ osztály megvalósítja az általam definiált \verb+HrefFilter+ interfészt. Az interfész tetszőleges linkszűrő létrehozására lehetőséget ad, abban a konkrét esetben, amikor a \verb+WebScraper+nek a \verb+MusicHrefFilter+ egy példányát adjuk át szűrésre, az a linkeket aszerint szűri le, hogy a hivatkozott URL-en található tartalom zenei típusú vagy sem. Ezt úgy tudja meg, hogy a \verb+WebScraper+ segítségével egy HTTP HEAD-kérést küld az URL-re, a kérésre adott válaszban így csak fejlécadatok szerepelnek, s azok között a webes erőforrás médiatípusa is. Ezt, és még néhány adatot eltárol az átadott link példányában. Maga a filter nem kezel listát, csak egy linkről állapítja meg, hogy a listába tartozik-e vagy sem, illetve további adatokkal látja el, ha szükséges. A lista szűréséről a \verb+WebScraper+ gondoskodik, amely egyenként nézi végig a linkeket.

Amint elkészül a lista a zenefájlokat címző linkekről, a \verb+FeedGenerator+ kapja meg a vezérlést, és előállítja a feed XML-szövegét. Ehhez felhasználja a feedelemeknél a link szövegét a feedelem címeként, a hivatkozott tartalom utolsó módosítási idejét a feedelem utolsó módosítási idejeként, a tartalom URL-jét és médiatípusát a feedelem enclosure típusú linkjeként és a tartalmaként is, hivatkozva. A feed módosítási ideje a ,,legfiatalalabb'' tartalom ideje lesz.

Összefoglalva: a servlet összegyűjti a linkeket a \verb+WebScraper+ segítségével, megszűri és adatokkal látja el a linkeket a \verb+WebScraper+ és a \verb+MusicHrefFilter+ segítségével, és előállítja a feedet a \verb+FeedGenerator+ segítségével. A végeredmény a kezdeményező ágensnél megjelenik.

A servletnek az ,,atomizálni'' kívánt oldal URL-jét GET-paraméterként kell átadni, a paraméter neve \verb+url+. Ennek megkönnyítésére a webalkalmazás kontextusának gyökerében egy HTML-lapon egy űrlapon is megadható.

\section{Az eredmények}

Az Atomizer kimenetét egy azt megérteni képes aggregátorban lehet felhasználni, többek között ilyen aggregátorként használható az Amarok nevű zenelejátszó program. Ezt szemlélteti \aref{fig:amaroka}. és \aref{fig:amarokb}. ábra (\apageref{fig:amaroka}. és \apageref{fig:amarokb}. oldalon). Az eredeti oldalt mutatja \aref{fig:vorbis}. ábra, az eredményezett feed képét a böngészőben pedig \aref{fig:fxpodcast}. ábrán láthatja a kedves olvasó. Ez utóbbi képen a böngésző címsorában lévő URL-t kell bejegyezni az aggregátorba, hogy a kívánt oldalról szóló feedet kapja. Az aggregátor ezután rendszeresen frissíti azt, és így nyilvánvalóan az oldal tartalmának megfelelő lesz a feed is.

Teljesen nyilvánvaló, hogy ez a nagyon egyszerű alkalmazás csupán szemléltetni kívánja: egy egyszerű formátum milyen sokoldalúan használható fel. Az ötlet emögött az, hogy néhány, elsőre egymástól távolinak tűnő alkalmazást hozunk közelebb egy közös platformmal, a webbel, és -- talán nyugodtan kijelenthető -- annak nyelvével, az XML-lel.

Az Atomizer jelenlegi állapotában nem használ adatbázist \emph{back-end}-ként, jóllehet profitálhatna belőle. Szélesebb körű, komoly felhasználása esetén problémát jelentene, hogy az atomizált oldalt minden alkalommal újra letölti. Ez elkerülhető, ha egy adatbázisban tárolja egy oldal korábbi lekérésének eredményét, és csak HEAD-kérést küldene az oldalnak, így, ha az nem változott, a korábbi feed-et adhatja vissza (cache-elhet).

A fejlesztés melléktermékeként az eredeti témámtól eltérő tapasztalatot is szereztem, nevezetesen a weboldalak bejárásával és azokon megjelenő adatok tárolásával kapcsolatban.

\begin{figure}
\begin{center}
\includegraphics[width=\textwidth]{amarok2.eps}
\end{center}
\caption{Amarok: az első feedelem lejátszása}
\label{fig:amarokb}
\end{figure}
