Praktiskais darbs - Kešošanas robots

Darba mērķis

Īss apraksts:
Iepazīties ar objektiem, to uzvedības testēšanu un noglabāšanu datubāzē, kā arī ar Spring aplikāciju ietvaru un JPA pastāvīguma ietvaru (persistence framework). Šī praktiskā darba uzdevums ir izveidot ar Spring konfigurējamu konsoles aplikāciju, kura noglabā (kešo) datubāzē saites un resursus, kas iegūti no Interneta vai arī glabājas lokālajā failu sistēmā.
Vēlamās priekšzināšanas:
Objektmodelēšana, t.sk. klašu diagrammu zīmēšana. Javas klašu, abstrakto klašu un interfeisu sintakse. Java 1.5 anotācijas. Relāciju datubāžu projektēšana, ER diagrammas. JDBC un O2R attēlojumu pamati. Spring IoC komponentu konteiners.
Apgūstamā pieredze:
Klašu diagrammu modelēšana uz papīra vai arī ar Visio, Eclipse Omondo vai līdzīgu UML diagrammu zīmēšanas rīku. JUnit testu veidošana. Imitāciju objektu (mock object) lietošana testēšanā. Oracle XE un/vai MySQL datubāzu vadības sistēmas uzstādīšana un konfigurēšana. Datubāzu aplikāciju komponentu testēšana ar operatīvās atmiņas datubāzi (in-memory database) HSQLDB. Eclipse DALI spraudņa lietošana O2R attēlojumiem. Spring'a konfigurācijas fails applicationContext.xml un tā sintakse.

Situācijas apraksts

Ja galamērķis ir izveidot portālu informācijas iegūšanai par kādu tematu, tad pirmais apakšuzdevums ir informācijas apkopošana.

Lai iegūtu portālā attēlojamos datus, tie ir jāapkopo no dažādām mantotajām (legacy) sistēmām. Pieņemsim, ka šīs mantotās sistēmas ir lietotāju grāmatzīmes, kas apkopotas publiskās grāmatzīmju apmaiņas vietās (piemēram, http://del.icio.us) vai arī atrodas lietotāju privāto pārlūkprogrammu grāmatzīmēs (favourites, bookmarks).

Kādēļ vajadzīga kešošana

Definīcija:
Kešošana ir programmatūras izstrādē bieži lietota optimizācijas stratēgjija, kur resursam, kuram piekļuves laiks ir ilgs, izveido vieglāk pieejamu kopiju un turpmāko apstrādi veic ar šīm kopijām nevis pirmavotiem. Pašas šīs datu dublikācijas krātuves sauc par "kešu". Lai paātrinātu procesora darbību, "keša atmiņa" ir reizēm ieviesta arī datora dzelžu (hardware) līmenī. Šī praktiskā darba kontekstā "keša atmiņa" ir datubāze, bet tajā iekešotie objekti ir Internetā vai failu sistēmā atrodamie linki un dokumenti.

Tā kā piekļuve Internetam utml. tīkla resursiem var būt lēna un nedroša, toties informācijas sistēmas (piemēram, portāla) lietotājam var vajadzēt meklēt datus daudzos resursos vienlaicīgi, tad nav praktiski datus ikreiz pieprasīt no pirmavotiem. Tai vietā tīklu vienreiz vai arī regulāros laika intervālos apstaigā "kešošanas robots" un portāls balstās uz šī robota darbības rezultātu - datubāzē "iekešotajiem" resursiem.

Ir vairāku tipu resursi, kas datubāzei jāsinhronizē ar ārpasauli:

  1. RSS-veidīgi linku saraksti no http://del.icio.us, kopā ar tiem pievienotajiem tagiem un lietotāju identifikāciju.
  2. Grāmatzīmes, kas izeksportētas no Internet Explorer vai Firefox pārlūkprogrammām.
  3. Web resursi, kas atbilst RSS failos vai grāmatzīmēs norādītajiem linkiem.

Rīki un izmantojamie resursi

Sk. Instalāciju instrukcijas, kur detalizēti aprakstīts, kā instalēt visu programmatūru, kas nepieciešama šim praktiskajam darbam. Zemāk dots ļoti īss pārskats ar darbībām, kas jāveic, instalējot šo programmatūru:

  • JDK 6 Update 2 - instalēt un uzstādīt JAVA_HOME sistēmas vides mainīgo, kam ir vērtība C:\Program Files\Java\jdk1.6.0 un pierakstīt PATH sistēmas vides mainīgā vērtībai pašā sākumā %JAVA_HOME%\bin;
  • Eclipse WTP 1.5.5 - atarhivēt ZIP failu zem c:\tools, izveidot uz darbvirsmas īsinājumikonu (shortcut) uz izpildāmo failu eclipse.exe.
  • Subclipse 1.2.x - Izpildīt šo instrukciju, izmantojot Eclipse platformas Software Updates -> Find and Install funkciju.
  • Maven 2.0.7 - atarhivēt zem c:\tools, uzstādīt M2_HOME vides mainīgo un pierakstīt PATH sistēmas vides mainīgā vērtībai pašā sākumā %M2_HOME%\bin;. Ja darbojaties aiz ugunsmūra, tad direktorijā $USER_HOME/.m2 jāiekopē fails settings.xml ar norādi uz starpniekserveri:
    <settings>
      <proxies>
        <proxy>
          <protocol>http</protocol>
          <host>proxy.accenture.lv</host>
          <port>8080</port>
          <nonProxyHosts>localhost</nonProxyHosts>
        </proxy>
      </proxies>
    </settings>
    
  • Oracle Database 10g Express Edition - atarhivēt un instalēt. Pirms instalācijas apturēt visas aplikāciju programmas un servisus, kas varētu būt aizņēmuši portus uz Jūsu mašīnas.
  • MySQL 5.0 Community Server

Vēlams instalēt vēl arī dažus palīgrīkus, lai būtu vieglāk manipulēt ar komandrindu un teksta failiem:

Ieteicamā izstrādes kārtība

Iepazīšanās ar JDBC piemēru

Daudzas datubāzu piekļuves problēmas var atklāt savlaicīgi, ja izmanto nevis JPA, bet pašu vienkāršāko piekļuves metodi datubāzei - JDBC. Šajā nolūkā sk. vingrinājumu Demo JDBC.

Koda sagataves darbināšana

  1. Rīkā Eclipse atver "SVN Repository Exploring" perspektīvu (pirms tam jāuzinstalē Eclipsei Subclipse spraudnis).
  2. Pievieno jaunu SVN repozitoriju - http://java-eim.googlecode.com/svn/trunk.
  3. Izčeko projektu "java-eim-lab01-robot" - tam jābūt jaunam Javas projektam Jūsu parastajā Eclipses darba direktorijā, piemēram c:\workspace).
  4. Izčeko vēl citu projektu zem tā paša SVN repozitorija - "java-eim-maven-lib". Izpilda direktorijā c:\workspace\java-eim-maven-lib visus *.bat failus. Ar tiem Mavena repozitorijā tiek instalēti tie JAR faili, kurus nevar dabūt Internetā.
  5. Projekta saknes direktorijā atver DOS logu (piemēram, ar Total Commander navigē uz c:\workspace\java-eim-lab01-robot un izpilda komandrindu:
    mvn eclipse:clean eclipse:eclipse
    

    Ja Maven kopā ar Eclipse darbiniet pirmo reizi, tad arī šādu komandrindu:

    mvn -Declipse.workspace=c:/workspace eclipse:add-maven-repo
    

    kur "c:/workspace" apzīmē to direktoriju, kuru esat izvēlējušies kā Eclipse "workspace" (t.i. kur Eclipse izvieto visiem projektiem kopīgos iestatījumus un šajā direktorijā Eclipse pēc noklusēšanas veido arī visus jaunos projektus).

  6. Atgriezties Eclipse vidē un uztaisīt "Refresh" "java-eim-lab01-robot" projektam. Kompilācijas kļūdām ir jāpazūd. Var pārliecinaties, ka komanda "mvn eclipse:eclipse" ir sagjenerējusi nepieciešamās atkarības - t.i. eksistē fails java-eim-lab01-robot/.classpath un un java-eim-lab01-robot/.project, kā arī šīs atkarības var apskatīt, Eclipse Javas projektam "java-eim-lab01-robot" uzklikšķinot iekš "Package Explorer" lodziņa ar labo peles pogu, pajautājot Properties un izvēloties kategoriju Java Build Path un pēc tam - "Libraries". Atkarībām aptuveni jāsakrīt ar to, kas norādīts projekta pom.xml failā un nedrīkst būt kļūdu paziņojumu par neesošām ārējām bibliotēkām.
  7. Ja esat nolēmuši strādāt komandā, tad pašreizējie ".svn" faili (Subversion smilšukastes konfigurācija) Jums neder, jo repozitoriju "java-eim.googlecode.com" kontrolē kursa pasniedzēji un tajā Jūs savu kodu nevarat iečekot. Lai sāktu strādāt ar Subversion, ir vispirms jāizdzēš visi ".svn" faili. To izdara, atverot "java-eim-lab01-robot" saknes direktorijā DOS lodziņu un izpildot komandu
    ant clean-svn
    

    (tiek izpildīts Ant skripts "java-eim-lab01-robot/build.xml"). Šajā brīdī pazūd visi vecie ".svn" faili.

  8. Izveidot savā Subversion repozitorijā (zem "trunk") tukšu projektu ar līdzīgu nosaukumu "lab01-robot" vai tml. Izčekot šo tukšo projektu uz Eclipse.
  9. Pārkopēt koda prototipu, kas atrodas zem "c:\workspace\java-eim-lab01-robot" uz jaunizveidoto un gandrīz tukšo "lab01-robot" (var pārrakstīt .project failu). Nospiest "Refresh" uz projekta "lab01-robot" (menu no labās peles pogas). Pēc tam no labās peles pogas izvēlnes izvēlas Team -> Update un Team -> Commit.
  10. Šajā brīdī Jūsu repozitorijā ir iečekota koda sagatave un to var sākt labot. (Otrs komandas biedrs var veikt šī projekta pilnu "Checkout" un sākt programmēt kopā ar pirmo komandas biedru.).
  11. Parasti .project un .classpath failus neglabā Subversion versiju kontrolē. Var gadīties, ka no repozitorija projekts izčekojas ne kā Javas projekts - tad var šo projektu izdzēst no Eclipse (neizdzēšot tā izejas tekstu uz diska) un pēc tam izveidot jaunu Javas projektu "From existing source". .project un .classpath failus uz lokālās mašīnas atjauno, izpildot "mvn eclipse:eclipse" komandas.
  12. Pārliecināties, ka MySQL datubāze ar lietotāju "root/root" eksistē. Izveidot jaunu MySQL datubāzes lietotāju "robotuser/robotpassword" un izveidot arī datubāzes struktūru (sk. SQL komandas failā java-eim-lab01-robot\src\main\resources\init.sql.
  13. Pārliecināties, vai Jūsu dators ir pieslēgts Internetam (un gadījumā, ja ir aktīvs proxy serveris, tad izmainīt konfigurācijas failu java-eim-lab01-robot\src\main\resources\applicationContext.xml atkomentējot tajā proxy servera iestatījumus.
  14. Darbināt programmu com.web.robot.WebRobotMain.java un pārliecināties, ka tā ieraksta MySQL datubāzes tabulā "webrobot.bookmark" apmēram 60 jaunus ierakstus.
  15. Ja ieraksti datubāzē izdodas, tad tas nozīmē, ka prototips sekmīgi strādā un var ķerties pie praktiskā darba izstrādes.

Izstrādes cikli

Prasību apraksts

Robots apstaigā Spring konfigurācijas failā norādītos RSS failu adreses, tās, kuras izdodas sekmīgi savākt, parsē, iegūstot datu struktūru, kas sastāv no 4 veidu objektiem: Bookmarks, Annotations, Users un Tags. Šie objekti ir jāpersistē datubāzē, izmantojot Java JPA pieeju.

UML klašu diagramma robota savāktajiem datiem

Robota darbības efektivitāte

Apstaigājot Internetu, nevajadzētu radīt nevajadzīgi lielu trafiku - robotiem piemērota norma ir viens pieprasījums uz konkrēto domēnu vienā minūtē.

Lai izvairītos no nevajadzīgi biežas resursu apstaigāšanas, robots izmanto kešošanu - t.i. datubāzē ikvienam resursam atceras, kad tas pēdējo reizi ticis iegūts (un kad jāplāno atkārtota apstaigāšana), kā arī uzglabā kontrolsummu, lai varētu atpazīt identiskus dokumentus.

Darba testēšana un vērtēšana

Piegādājamais fails

Failu vajag saarhivēt un iesniegt palaižot Ant skriptu "lab01-robot" saknes direktorijā:

ant submit

Izveidoto failu apakšdirektorijā target/lab01-robot.zip var nosūtīt uz Kalvja gmail.com e-pastu.

Testu dati un testu pārklājums

Konkrētajā darbā piedāvāsim apkopot teksta dokumentus un Web lapas par Javas, J2EE un Web programmēšanas jautājumiem, t.i. iegūt savdabīgu šī mācību kursa bibliogrāfiju. Lai gan līdzīgu uzdevumu var izvirzīt arī par jebkuru citu tēmu.

Vērtēšanas kārtība

Īsi pirms iesniegšanas termiņa būs pieejami JUnit testi (gan komponenšu, gan integrācijas testi), kurus varēs izmantot projekta uzvedības pārbaudei. Instrukcijas šo testu palaišanai tiks pievienotas vēlāk.

Kļūdu labojumi

Šeit ievietojami datēti labojumi un precizējumi, kas pamanīti pēc praktiskā darba izziņošanas.