följer Tre-lager-arkitektur De tre lagren presentation: användarhändelser+grafik+resultat domänlogik: håller systemets funktioner databasaccess: databas + sql-hantering Paketen i : climate.ui (inkl climate.ui.action och climate.ui.) är presentation climate.domain är domänlogik climate.database är databasaccess Varför lager: separera olika uppgifter i olika delar statisk uppdelning: vilken fil/klass gör vad Viktiga domänklasser i 1 n ObservationFile 1 n Observation Domänobjekt - domänlogiklagret Domänlogiken uttrycker data och logiska operationer på data ex: observationer, filer, fil-attribut, inläsningfilter Motsvarande data: METDATA97010100 METDATA97010103.utf-16 METDATA97010106 FileIdentity: 97010100 Coding: ISO-8859-1 Long: 0.120000E+07 Lat: 0.766000E+07 Domänobjekten håller aktuell data Domänobjekt är grunden i OO-design de förändras lite/sakta de är nära besläktade med problemdomänen..förutom data ( tillstånd ) håller dessa klassers objekt systemets funktionalitet. Dessa två tillsammans kan man kalla domänlogik tillstånd/data är viktigare än funktion: metoder kan läggas till gradvis
Labb 2: uppgift 1 Visa inlästa filer lyssna på climate.domain visa resultat climate.ui..savefilelist Göra knappar skapa grafik : grafik och swing-lyssnare javax.swing.: skapar en knapp ex: b = ("I'm a Swing button!"); javax.swing.abstractaction gör subklass ger en ActionListener se t ex ReadFileAction tilldela en lyssnare till en knapp JLabel JFrame associera lyssnare climate.ui.savetodatabasepanel ex: b.addactionlistener(listener) använder metadata för text ex: metadata.get Använd javadoc! Exempel: ReadFileAction Läs Plockar data från domänlagret Testar om alla data är ifylld annars popup Om allt är ok läs in från fil/katalog Anrop till domän! Ex: skapa lyssnaren på läs-knappen main Window ReadFromFile Panel addaction Listener(rf) readfilebutton: rf: ReadFile Action Dvs framtida knapp-händelser till rf
UI-objekt - presentationslagret Två typer av objekt: grafik: grafiskt innehåll och layout lyssnare: lyssnar efter händelser och agerar på dem Två typer av lyssnare: användarhändelser action : t ex Swing-lyssnare på komponenter systemhändelser : t ex Observable/Observer på domänlogik Exempel: Användarhändelse läs in readfilebut: ReadFile Action actionperformed readfromfile readfromfile ObservationFile filterrow Observation Filter climate.ui innehåller grafik-klasser climate.ui.action Swing-lyssnare climate.ui. Observer-lyssnare JList: Swing-komponent för listor Används för att lista strängar eller andra swingkomponenter vertikalt eller horisontellt JList använder en JListModel som håller innehållet i listan Exempel: UI- ny fil inläst till flik Spara SaveFileList addelement DefaultList Model Skapad av SaveToDatabase Panel uppdaterar man modellen uppdateras grafiken använder en subklass DefaultListModel
Laboration 2 - uppgift 2 Databas-access via JDBC (skiss) Spara observationer och fildata i MySQLdatabas Editera i alla tre lagren för användarfallet spara Klasser som påverkas: Java klientklass java.sql.connection Java.sql.Statement Databas SaveToDatabaseAction/Worker ObservationFile Java.sql.ResultSet DatabaseService Sparandet ska ske så att flikens JProgressBar uppdateras kontinuerligt. Litet exempel på JDBC-koppling JDBC i Climate Klassen Database skapar ett java.sql.connectionobjekt val av host/databas/användare/lösen sätts i settings.properties Observera att endast ett Connection-objekt skapas per körning DatabaseService bygger SQL-statements och skickar via detta Connection-objekt
Lagret för databas-access Avbilda objekt på relationer Enkel lösning: transaktionsskript (Fowler) hantera SQL i Java - metaprogrammering Separera ut SQL-källkod från löpande Java-källkod Hantera process-koppling värddator + sökväg föränderlig konfigureringsdata Modell-vy-kontroll (MVC) namnet på denna kommunikationsmodell mellan domänlogik och presentation. SaveFileList Vy Modell Kontroll Domänlogik Presentation Hantera tillfälliga avbrott och omstart ReadFromFilePanel SaveToDatabasePanel ReadFileAction SwingWorker - bakgrundsprocess Undvik att krävande operationer fryser grafiken introducera trådar (eng thread) som kör separat process climate.ui.swingworker skapar en tråd SaveToDatabaseWorker ärver av SwingWorker måste implementera construct()-metoden trådar startas med med metoden start() SaveToDatabaseAction ska starta SaveToDatabaseWorker Swing körs i sin egen tråd ( the Swing thread ) SwingUtilities: invokeandwait och invokelater Sekvensdiagram för Spara : från presentation till databas savebut: action Performed SaveToDb Action Swing-tråden start SaveToDb Worker saveto Database Obs saveprogress Obs Obs Database Service SwingWorker-tråden execute - - - - Connection
Spara i omgångar och ProgressBar Spara : från databas till presentation Observer/Observable: ui-lagret lyssnar även inåt mot domain då använder vi java.util.observer SaveProgress JProgressBar Se paketet climate.ui. markerar hur långt man kommit setsaveprogressmax: sätter hur lång nuvarande fil är setsaveprogress: sätter hur många obs som sparats I MetaData finns en metod getdatabasebatchsize anger antal observationer som ska sparas åt gången. Vid varje progressionsmarkering anropas alla Observer-objekt för SaveProgress lyssnar efter progressions-händelser Progressions-grafiken nollställs för varje sparad fil getstringprop getstringprop getstringprop SwingWorker-tråden display(true) setmaximum setvalue setvalue Swing-tråden DatabaseService: Data Mapper i Kopplar domänobjekt och databasrepresentation Objektorienterad modell till relationsmodell - O/R bridge Tre publika metoder i DatabaseService saveobservations: sparar ner ett segment ur en observationsfil registerin: registrerar vilken observationssamling som just sparats (labb 2) selectobservations: gör en selektion baserat på givna sökkriterier (labb 3) Statement: s object-klass Skapa en speciell klass/metoder som bygger upp en databas-uppdatering (insert, delete, replace etc) Statement: objekt som utifrån ett eller flera ValueSet tilldelar query = REPLACE INTO + table + VALUES addvalueset: lägger till värden efter VALUES execute: skickar värdet på query till databasen
Summering Tre-lager-arkitektur: olika uppgifter i olika lager Labb 2, del 1: arbeta med swing-grafik och uppdatering via Observable/Observer Domänlogik och presentation arbetar ihop via MVC lyssnare åt två håll: på användaren och på systemet I : action och Labb 2, del 2: JDBC/SQL enbart i databaslagret Separat tråd för tung beräkning DataMapper och Object