Tietokantarakenteet, k2011 Niemistö, Jesse; m Viitanen, Lauri; Drinkkitietokanta

Koko: px
Aloita esitys sivulta:

Download "Tietokantarakenteet, k2011 Niemistö, Jesse; m0703165 Viitanen, Lauri; 0803739. Drinkkitietokanta"

Transkriptio

1 Tietokantarakenteet, k2011 Niemistö, Jesse; m Viitanen, Lauri; Drinkkitietokanta _' _ =. ' o. o o _o_._'_ / \ o_. '\~~~~~/ =1 \~~~~~/ '-.-' =9 '-.-' -9 _ _ _9_ _ _ `"""` _._ `"""` `"""`

2 Sisällysluettelo Johdanto Tietokanta Hibernate Toiminnallisuus Käyttöliittymä Yhteenveto Liitteet Liite 1: SQL-tietokannan luontiskripti Liite 2: Hibernate XML-tiedosto Liite 3: Java-lähdekoodit Liite 4: Drinkkiclubi.fi crawlerin lähdekoodi

3 Johdanto Tässä raportissa kuvataan Metropoliassa keväällä 2011 järjestetylle Tietokantarakenteet-kurssille tehtyä harjoitustyötä. Harjoitustyössä on tarkoitus suunnitella ja toteuttaa relaatiotietokanta, johon on talletettu tiedot erilaisista alkoholijuomista (drinkeistä) ja niiden koostumuksista. Kaikkea kannassa olevaa tietoa pitää pystyä lukea, lisätä ja poistaa. Tietokantaa käytetään Hibernate-teknologian tarjoaman rajapinnan kautta. Graafinen käyttöliittymä rakennetaan MVC-mallilla käyttämällä Javan Swing-kirjastoa. Tietokanta Drinkki on alkoholipohjainen juomasekoitus, jolla on enemmän tai vähemmän kuvaava nimi. Sekoitus koostuu erilaisista alkoholijuomista ja se tarjoillaan usein tietynlaisesta lasista. Juomaa voi koristaa hedelmä tai vaikka paperinen sateenvarjo. On myös paljon muita yksityiskohtia, jotka juomaan halutaan tallentaa, kuten nauttimisajankohta ja -lämpötila, makeus ja sekoitusmenetelmä. Tämän lisäksi juoman teko-ohjeet tallennetaan siltä varalta, että joku haluaa kokeilla sen tekemistä kotona. Tiedonhallinnallista ongelmaa lähdettiin ratkomaan tietokannan normalisoinnin näkökulmasta. Koska tietoa ei haluttu monistaa laisinkaan, päätettiin jokaiselle drinkkiin liittyvälle ominaisuudelle tehdä oma taulu. Tämä oli kivuton ratkaisu kaikkien muiden ominaisuuksien kuin ainesosien osalta, koska yksi drinkki koostuu useasta raaka-aineesta ja samaa raaka-ainetta voidaan käyttää useassa eri drinkissä. Drinkkien ainesosille tehtiin oma linkkitaulu, jossa drinkit ja ainesosat liitetään toisiinsa. Lopulliset taulut ovat siis - Ainesosat: sisältää erilaiset ainesosat ja niiden kuvauksen - Ajankohdat: sisältää nauttimisajankohdat ja niiden kuvaukset - Makeudet: sisältää erilaiset makeusasteet - Lasit: sisältää lasit - Lämpötilat - Menetelmät - Drinkit - Nimet - Drinkki_Ainesosa: sisältää drinkki-ainesosa-arvopareja. Tietokannan luontiskriptit ovat luettavissa liitteessä 1. Tietokanta päätettiin toteuttaa SQLite-tietokantana. Tämä mahdollistaa sen, että tietokanta operaatioita voidaan suorittaa lokaalisti, ilman verkkoyhteyttä. Koko tietokanta on tallennettu yhteen tiedostoon, joka löytyy db-hakemiston alta.

4 Hibernate Hibernate on tietokantaohjelmointiin kehitetty avustustyökalu. Hibernaten tarkoitus on kuvata tietokannan taulut olioina, jossa yksi tietokannan rivi on yksi olion ilmentymä. Tämän tarkoituksena on saada piilotettua kehittäjiltä kokonaan SQL-kieli. Teoriassa tämä on loistava idea, mutta käytäntö ei aina vastaa teoriaa. Hyvin usein ratkaisussa joudutaan käyttämään HQL-kieltä, joka muistuttaa erittäin vahvasti SQL-kieltä. Hibernate saatiin integroitumaan projektiin ongelmitta, pääosin Netbeansin avustuksella. Jokaiselle kannan taululle toteutettiin hibernate-mapping tiedosto, jotka sijaitsevat db.resources-paketissa. Hibernate-tiedostot ovat luettavissa liitteessä 2. Hibernaten ja SQLiten yhteistoiminta on hieman ongelmallista, mutta tähän löytyi ratkaisuksi avoimen lähdekoodin projekti hibernate-sqlite ( Käytännössä tästä projektista liimattiin mukaan SQLiteDialect.java-tiedosto, joka kertoo Hibernatelle kuinka tiettyjä operaatioita tulee toteuttaa. Projektiin piti myös lisätä sqlite-jdbc -ajuri, joka sisältää Java-rajapinnan SQLitelle. Toiminnallisuus Drinkkitietokantaan haluttiin alusta alkaen sisällyttää mahdollisimman monia käyttöä helpottavia, intuitiivisia ratkaisuja. Suunnittelu oli hyvin käyttäjäkokemuskeskeistä ja myös ylläpidollisiin seikkoihin kiinnitettiin paljon huomiota. Koska aikaa oli kuitenkin vain hyvin rajallisesti, piti monia toiminnallisuuksia karsia pois järjestelmän tästä versiosta, mutta tämä tulevaisuuden laajennusvara on otettu huomioon. Tietokantaan toteutettiin ensimmäisenä ja tärkeimpänä tietojen hakuominaisuus. Todettiin, että hakuja on kahdenlaisia: on tietojen listausta ja räätälöityjä hakuja. Tietojen listaukset oli helppo toteuttaa - haetaan yhden taulun yhden sarakkeen kaikki alkiot. Tällaisilla listauksilla täytettiin alasvetovalikoita. Räätälöidyt haut olivat huomattavasti työläämpiä, sillä niissä piti yhdistää monenlaisia tietoalkioita ympäri tietokantaa. Toteutus onnistui kuitenkin lopulta hyvin. Toinen tärkeä ominaisuus eli tietojen poistamien määriteltiin heti projektin alussa. Koska monet yksinkertaiset tietotyypit kuten ainesosa, lasi tai nauttimisajankohta jakaantuvat yleensä monen drinkin kesken, on kyseenalaista drinkkiä poistettaessa nähdä vaivaa koko kannan läpikäymiseen ylimääräisten tietojen poistamiseksi, koska niitä tuskin syntyy vähänkään isommassa kannassa. Lisäksi uusia drinkkejä luotaessa juuri tämän tiedon runsaan jakamisen seurauksena "juuri äsken" poistettua tietoa kuitenkin tarvittaisiin suurella todennäköisyydellä, jolloin se pitäisi luoda uudestaan. Totesimme, että paras ratkaisu on drinkkiä poistettaessa poistaa vain itse drinkki ja jättää kaikki muu koskemattomaksi. Yksinkertaisten perusalkioiden poistoa ei toteutettu lainkaan juuri edellä mainituista (hyvistä) syistä. Jossain vaiheessa kantaa kuitenkin halutaan siivota ja siihen järjestelmä tarjoaa mahdollisuuden erillisellä "siivoa tietokanta"-toiminnallisuudellaan, joka poistaa kannasta kaikki tietoalkiot, joihin ei ole viittauksia mistään drinkistä. Viimeinen ja vähiten tärkeä toiminnallisuus oli tietojen päivittäminen. Koska moni drinkki voi viitata yhteen ja samaan alkeistietoalkioon kuten ainesosaan, lämpötilaan tai lasiin, niin virheellinen tai liian raju muutos, joka saattaisi olla perusteltu yhden drinkin kannalta, voi olla monen muun kannalta epäedullinen muutos ja siksi yksittäisten alkeistietojen päivitys kiellettiin järjestelmässä kokonaan. Ainoa päivitys, jonka järjestelmä käyttäjälle sallii on drinkkien päivittäminen. Jos drinkkiä päivitettäessä siihen vaikka lisätään ainesosa, jota kannassa ei vielä ole, niin sellainen luodaan kantaan ja se sidotaan päivitettyyn drinkkiin. Samalla periaatteella menetellään drinkkiä päivitettäessä vähempiainesosaiseksi.

5 Käyttöliittymä Projekti toteutetaan koulussa paljon promotulla MVC-mallilla. Näin erotetaan tietokantaa käsittelevä koodi kokonaan käyttäjälle tarjottavasta käyttöliittymästä. Käyttöliittymää siis voitaisiin vaihtaa vaikka lennosta ja alkuperäinen ajatus olikin, että tarjottaisiin käyttäjälle sekä CLI että GUI, mutta ajan puutteessa päätettiin toteuttaa pelkästään graafinen käyttöliittymä Javan Swing-teknologialla. Käyttöliittymään valittiin tarkasti vain tärkeimmät ominaisuudet joita ohjelman toiminnallisuuden esittelemisessä ja kevyessä arkikäytössä tarvittaisiin. Uusien ainesosien, juomalasien ja valmistusmenetelmien lisääminen tapahtuu syöttämällä sen kuvaus tekstikenttään ja painamalla "lisää"-painiketta. Juomien poisto tapahtuu helpointen jos niitä saa valita valmiista nimilistasta ja painaa "poista"-painiketta. Juomien haku oli käyttöliittymän hankalin ja työläin osa, sillä juomien nimiä ei ole mukavaa selata pitkästä listasta ja raaka-aineitakin voidaan haluta hakea useampaa erilaista, joten niille täytyy toteuttaa jonkinlaiset monisyöttöelementit. Päädyimme ajan puutteessa yksinkertaisiin tekstilaatikoihin, joihin käyttäjä voi syöttää pilkulla eroteltuna useita nimi- tai ainesosa-arvoja. Muut hakuehdot kuten lämpötila ja makeus on näppärää etsiä lyhyestä vetovalikosta. Lopuksi käyttäjä painaa "hae" painiketta. Samaa syötevalikkoa käytetään yksinkertaisuuden vuoksi myös uusien drinkkien lisäämisessä tai sellaisen ollessa jo olemassa vanhan tiedon päivittämisessä. Käyttäjälle ohjelma kommunikoi tekstipäätettä simuloivan tekstilaatikon välityksellä. Tämä ratkaisu valittiin sen yksinkertaisuuden ja tehokkuuden vuoksi. Käyttöliittymän lähdekoodit ovat liitteessä 3. Yhteenveto Drinkkitietokantaprojekti lähti käyntiin hyvin ja liike-energiaa löytyi kautta projektin keston. Valitettavasti testaus aloitettiin kuitenkin vasta viime hetkellä, jolloin suurimmat epäkohdat ja käytännön ongelmat tulivat ilmi. Juomien tietojen muuttamisen mahdollistavissa toiminnallisuuksissa havaittiin vakavia puutoksia, joita sitten kiireellä paikattiin. Työkalut olivat onneksi tulleet tutuiksi ja liitä osattiin luotettavasti käyttää. Vaikka projektin alkuperäinen määritys oli perin yksinkertainen ja vaatimukset hyvin väljät, huomattiin, että drinkkitietokannasta tulee sitä monimutkaisempi ja sovelluksesta sitä vaikeampi toteuttaa mitä käyttäjäystävällisempi siitä haluttiin. On helppoa mennä suoraan kantaan ylläpitäjän tunnuksilla kirjoittamaan kyselyitä, mutta asiakas haluaa aina helpon, intuitiivisen ja tehokkaan järjestelmän käyttöönsä. Koska projektille annettu aikakin oli muun opiskelun oheen liitettynä kovin vähäistä, jouduttiin tekemään rajuja kompromisseja toteutettavien ja odottavien tehtävien listalle joutuvien tehtävien suhteen. Toteutettu versio ei esimerkiksi tue lainkaan yksittäisten ainesosien tai drinkkilasien poistamista tietokannasta, perustietoalkioiden muuttamista tai drinkkien kehittyneitä hakuehtoja, joissa voisi käyttää loogisia operaattoreita lause-ehtojen yhdistämiseen monimutkaisten hakujen luomiseksi. Suurin osa näistä kompromisseista on dokumentoitu tähän raporttiin ja loput tulevat ilmi ohjelmaa käytettäessä. Hampaankoloonkin jäi projektista muutama asia: Tietokanta ei tällä hetkellä tue ollenkaan drinkissä ainesosien määriä, vaikka tämän toteutus olisi ollut hyvinkin yksinkertaista esimerkiksi lisäämällä Drinkki_Ainesosa-tauluun uusi sarake, joka kuvaisi ainesosan määrää drinkissä. Tämä kuitenkin tajuttiin liian myöhäisessä vaiheessa projektin toteutusta, jolloin se jäi toteuttamatta.

6 Liitteet -- Liite 1 -- Tietokannan luontiskriptit DROP TABLE IF EXISTS Ainesosat; DROP TABLE IF EXISTS Ajankohdat; DROP TABLE IF EXISTS Makeudet; DROP TABLE IF EXISTS Lasit; DROP TABLE IF EXISTS Lämpötilat; DROP TABLE IF EXISTS Menetelmät; DROP TABLE IF EXISTS Drinkit; DROP TABLE IF EXISTS Nimet; DROP TABLE IF EXISTS Drinkki_Ainesosa; CREATE TABLE Ainesosat ( id INTEGER NOT NULL, nimi VARCHAR(64) NOT NULL, PRIMARY KEY(id) CREATE TABLE Ajankohdat ( id INTEGER NOT NULL, kuvaus VARCHAR(64) NOT NULL, PRIMARY KEY(id) CREATE TABLE Makeudet ( id INTEGER NOT NULL, kuvaus VARCHAR(64) NOT NULL, PRIMARY KEY(id) CREATE TABLE Lasit ( id INTEGER NOT NULL, kuvaus VARCHAR(64) NOT NULL, PRIMARY KEY(id) CREATE TABLE Lämpötilat ( id INTEGER NOT NULL, kuvaus VARCHAR(64) NOT NULL, PRIMARY KEY(id) CREATE TABLE Menetelmät ( id INTEGER NOT NULL, kuvaus VARCHAR(64) NOT NULL, PRIMARY KEY(id) CREATE TABLE Drinkit ( id INTEGER NOT NULL, ajankohta_id INTEGER NOT NULL, makeus_id INTEGER NOT NULL, lasi_id INTEGER NOT NULL, lämpötila_id INTEGER NOT NULL, menetelmä_id INTEGER NOT NULL, ohje VARCHAR(512), PRIMARY KEY (id), FOREIGN KEY (Ajankohta_id) REFERENCES ajankohdat(id), FOREIGN KEY (makeus_id) REFERENCES makeudet(id),

7 FOREIGN KEY (lasi_id) REFERENCES lasit(id), FOREIGN KEY (lämpötila_id) REFERENCES lämpötilat(id), FOREIGN KEY (menetelmä_id) REFERENCES menetelmät(id) CREATE TABLE Nimet ( id INTEGER NOT NULL, nimi VARCHAR(64) NOT NULL, drinkki_id INTEGER NOT NULL, yleisyys INTEGER NOT NULL, PRIMARY KEY(id), FOREIGN KEY(drinkki_id) REFERENCES Drinkit(id) CREATE TABLE Drinkki_Ainesosa ( id INTEGER NOT NULL, drinkki_id INTEGER NOT NULL, ainesosa_id INTEGER NOT NULL, PRIMARY KEY(id), FOREIGN KEY(drinkki_id) REFERENCES Drinkit(id), FOREIGN KEY(ainesosa_id) REFERENCES Ainesosat(id)

8 -- Liite 2 -- Hiberaten tiedostot <!--db/resoures/ainesosa.hbm.xml --> <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" " <hibernate-mapping package="db"> <class name="ainesosa" table="ainesosat"> <id column="id" name="id" type="integer"> <generator class="native"/> </id> <property column="nimi" name="nimi" type="string"/> </class> </hibernate-mapping> <!--db/resoures/ajankohta.hbm.xml --> <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" " <hibernate-mapping package="db"> <class name="ajankohta" table="ajankohdat"> <id column="id" name="id" type="integer"> <generator class="native"/> </id> <property column="kuvaus" name="kuvaus" type="string"/> </class> </hibernate-mapping> <!--db/resoures/drinkki.hbm.xml --> <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" " <hibernate-mapping package="db"> <class name="drinkki" table="drinkit"> <id column="id" name="id" type="integer"> <generator class="native"/> </id> <property column="ohje" name="ohje" type="string"/> <many-to-one column="ajankohta_id" name="ajankohta" not-null="true"/> <many-to-one column="makeus_id" name="makeus" not-null="true"/> <many-to-one column="lasi_id" name="lasi" not-null="true"/> <many-to-one column="lämpötila_id" name="lämpötila" not-null="true"/> <many-to-one column="menetelmä_id" name="menetelmä" not-null="true"/> </class> </hibernate-mapping> <!--db/resoures/drinkki_ainesosa.hbm.xml --> <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" " <hibernate-mapping package="db"> <class name="drinkki_ainesosa" table="drinkki_ainesosa"> <id column="id" name="id" type="integer"> <generator class="native"/> </id> <many-to-one column="drinkki_id" name="drinkki" not-null="true"/> <many-to-one column="ainesosa_id" name="ainesosa" not-null="true"/> </class>

9 </hibernate-mapping> <!--db/resoures/lasi.hbm.xml --> <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" " <hibernate-mapping package="db"> <class name="lasi" table="lasit"> <id column="id" name="id" type="integer"> <generator class="native"/> </id> <property column="kuvaus" name="kuvaus" type="string"/> </class> </hibernate-mapping> <!--db/resoures/lämpötila.hbm.xml --> <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" " <hibernate-mapping package="db"> <class name="lämpötila" table="lämpötilat"> <id column="id" name="id" type="integer"> <generator class="native"/> </id> <property column="kuvaus" name="kuvaus" type="string"/> </class> </hibernate-mapping> <!--db/resoures/makeus.hbm.xml --> <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" " <hibernate-mapping package="db"> <class name="makeus" table="makeudet"> <id column="id" name="id" type="integer"> <generator class="native"/> </id> <property column="kuvaus" name="kuvaus" type="string"/> </class> </hibernate-mapping> <!--db/resoures/menetelmä.hbm.xml --> <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" " <hibernate-mapping package="db"> <class name="menetelmä" table="menetelmät"> <id column="id" name="id" type="integer"> <generator class="native"/> </id> <property column="kuvaus" name="kuvaus" type="string"/> </class> </hibernate-mapping> <!--db/resources/nimi.hbm.xml --> <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" " <hibernate-mapping package="db">

10 <class name="nimi" table="nimet"> <id column="id" name="id" type="integer"> <generator class="native"/> </id> <property column="nimi" name="nimi" type="string"/> <property column="yleisyys" name="yleisyys" type="integer"/> <many-to-one column="drinkki_id" name="drinkki" not-null="true"/> </class> </hibernate-mapping> <!--db/resources/hibernate.cfg.xml --> <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" " <hibernate-configuration> <session-factory> <property name="show_sql">true</property> <property name="format_sql">true</property> <property name="dialect">db.dialect.sqlitedialect</property> <property name="hibernate.connection.driver_class"> org.sqlite.jdbc</property> <property name="hibernate.connection.url"> jdbc:sqlite:db/database.db</property> <property name="hibernate.connection.username"></property> <property name="hibernate.connection.password"></property> <property name="hibernate.current_session_context_class"> thread</property> <mapping resource="db/resources/ainesosa.hbm.xml" /> <mapping resource="db/resources/ajankohta.hbm.xml" /> <mapping resource="db/resources/makeus.hbm.xml" /> <mapping resource="db/resources/lasi.hbm.xml" /> <mapping resource="db/resources/lämpötila.hbm.xml" /> <mapping resource="db/resources/menetelmä.hbm.xml" /> <mapping resource="db/resources/drinkki.hbm.xml" /> <mapping resource="db/resources/nimi.hbm.xml" /> <mapping resource="db/resources/drinkki_ainesosa.hbm.xml" /> </session-factory> </hibernate-configuration>

11 -- Liite 3 -- Java-luokkien lähdekoodit package view; import java.awt.event.actionevent; import ctrl.ctrl; /** Defines interface that all views must implement. public interface Ui /** Binds a controller to view. public void set(ctrl c /** Initializes and displays view. public void init( /** Callback function for Java Action Events. public void actionperformed(actionevent e package view; import java.awt.dimension; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.awt.gridlayout; import javax.swing.*; import java.util.list; import db.*; import ctrl.ctrl; import java.util.arraylist; import java.util.collections; public class Gui extends JFrame implements ActionListener, Ui final int WIN_W = ; final int WIN_H = ; private Ctrl ctrl; private JButton btnaddaine = new JButton("Lisää ainesosa" private JButton btnaddlasi = new JButton("Lisää lasi" private JButton btnaddmenetelmä = new JButton("Lisää menetelmä" private JButton btndeldrinkki = new JButton("Poista drinkki" private JButton btnaddupdrinkki = new JButton("Lisää/Päivitä drinkki" private JButton btnsearchdrinkki = new JButton("Etsi drinkki" private JComboBox cmbdrinkki = new JComboBox( private JComboBox cmblasi = new JComboBox( private JComboBox cmbmenetelmä = new JComboBox( private JComboBox cmbmakeus = new JComboBox( private JComboBox cmblämpö = new JComboBox( private JComboBox cmbaika = new JComboBox( private JLabel lblname = new JLabel("Nimi:", JLabel.RIGHT private JLabel lblaine = new JLabel("Ainesosat:", JLabel.RIGHT private JLabel lblaika = new JLabel("Aika:", JLabel.RIGHT private JLabel lblmakeus = new JLabel("Makeus:", JLabel.RIGHT private JLabel lbllasi = new JLabel("Lasi:", JLabel.RIGHT private JLabel lbllämpö = new JLabel("Lämpötila:", JLabel.RIGHT private JLabel lblmenetelmä = new JLabel("Menetelmä:", JLabel.RIGHT private JLabel lblohje = new JLabel("Ohje:", JLabel.LEFT private JPanel pnladditem = new JPanel(

12 private JPanel pnlconsole = new JPanel( private JPanel pnldeldrinkki = new JPanel( private JPanel pnldrinkki = new JPanel( private JPanel pnldrinkkibtn = new JPanel( private JPanel pnlohjedrinkki = new JPanel( private JPanel pnlinput = new JPanel( private JScrollPane sbrconsole = null; private JTextArea txtohje = new JTextArea( private JTextArea txtconsole = new JTextArea("Welcome to JCOCKtail 1.0\n\n>", WIN_H/19, (WIN_W-24)/18 private JTextField txtaddaine = new JTextField( private JTextField txtaddlasi = new JTextField( private JTextField txtaddmenetelmä = new JTextField( private JTextField txtname = new JTextField( private JTextField txtaine = new JTextField( public Gui() btnaddaine.addactionlistener(this btnaddlasi.addactionlistener(this btnaddmenetelmä.addactionlistener(this btndeldrinkki.addactionlistener(this btnaddupdrinkki.addactionlistener(this btnsearchdrinkki.addactionlistener(this txtconsole.setlinewrap(true txtconsole.seteditable(false sbrconsole = new JScrollPane(txtConsole sbrconsole.setverticalscrollbarpolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS txtohje.setlinewrap(true cmbdrinkki.addactionlistener (new ActionListener () public void actionperformed(actionevent e) if (cmbdrinkki.getselecteditem()!= null) populatesearchpanel(string.valueof( cmbdrinkki.getselecteditem()) ////////////////////////////////////////////////////////////// // Add item panel ////////////////////////////////////////////////////////////// pnladditem.setlayout(new GridLayout(3, 2) pnladditem.add(txtaddaine pnladditem.add(btnaddaine pnladditem.add(txtaddlasi pnladditem.add(btnaddlasi pnladditem.add(txtaddmenetelmä pnladditem.add(btnaddmenetelmä ////////////////////////////////////////////////////////////// // Del Drinkki panel ////////////////////////////////////////////////////////////// pnldeldrinkki.add(cmbdrinkki pnldeldrinkki.add(btndeldrinkki ////////////////////////////////////////////////////////////// // Drinkki panel ////////////////////////////////////////////////////////////// pnldrinkki.setlayout(new GridLayout(7, 2) pnldrinkki.add(lblname

13 pnldrinkki.add(txtname pnldrinkki.add(lblaine pnldrinkki.add(txtaine pnldrinkki.add(lblaika pnldrinkki.add(cmbaika pnldrinkki.add(lblmakeus pnldrinkki.add(cmbmakeus pnldrinkki.add(lbllasi pnldrinkki.add(cmblasi pnldrinkki.add(lbllämpö pnldrinkki.add(cmblämpö pnldrinkki.add(lblmenetelmä pnldrinkki.add(cmbmenetelmä ////////////////////////////////////////////////////////////// // Drink button panel ////////////////////////////////////////////////////////////// pnldrinkkibtn.setlayout(new BoxLayout(pnlDrinkkiBtn, BoxLayout.LINE_AXIS) pnldrinkkibtn.add(btnaddupdrinkki pnldrinkkibtn.add(btnsearchdrinkki ////////////////////////////////////////////////////////////// // Ohje panel ////////////////////////////////////////////////////////////// pnlohjedrinkki.setlayout(new BoxLayout(pnlOhjeDrinkki, BoxLayout.PAGE_AXIS) pnlohjedrinkki.add(lblohje pnlohjedrinkki.add(txtohje pnlohjedrinkki.add(pnldrinkkibtn ////////////////////////////////////////////////////////////// // Input panel ////////////////////////////////////////////////////////////// pnlinput.setlayout(new BoxLayout(pnlInput, BoxLayout.PAGE_AXIS) pnlinput.setpreferredsize(new Dimension(WIN_W/2, WIN_H) pnlinput.add(pnladditem pnlinput.add(pnldrinkki pnlinput.add(pnlohjedrinkki pnlinput.add(pnldeldrinkki ////////////////////////////////////////////////////////////// // Console panel ////////////////////////////////////////////////////////////// pnlconsole.add(sbrconsole ////////////////////////////////////////////////////////////// // Main panel ////////////////////////////////////////////////////////////// setlayout(new GridLayout(1, 2) setsize(new Dimension(WIN_W, WIN_H) settitle("jcock" add(pnlinput add(pnlconsole public void set(ctrl c) ctrl = c; public void actionperformed(actionevent e) if (e.getsource().equals(btnsearchdrinkki)) String sn[] = txtname.gettext().split(", " String sa[] = txtaine.gettext().split(", "

14 (String)cmbAika. + drinkkiä " + \n\n" s + List<String> ls = ctrl.search(sn, sa, getselecteditem(), (String)cmbLasi. getselecteditem(), (String)cmbLämpö. getselecteditem(), (String)cmbMakeus. getselecteditem(), (String)cmbMenetelmä. getselecteditem() if (ls.isempty()) txtconsole.settext(txtconsole.gettext() return; "Yhtään hakua vastaavaa "ei löytynyt.\n>" txtconsole.settext(txtconsole.gettext() + " for (String s : ls) txtconsole.settext(txtconsole.gettext() + "\n>" if (ls.size() == 1) String s[] = ls.get(0).split("\n" cmbdrinkki.setselecteditem(s[0] else if (e.getsource().equals(btnaddaine)) boolean ok = ctrl.addainesosa(txtaddaine.gettext() "+ "\n>" + txtconsole.settext(txtconsole.gettext()+"ainesosan txtaddaine.gettext() + " lisääminen " + (ok? "onnistui." : "ei onnistunut.") + else if (e.getsource().equals(btnaddlasi)) if (ctrl.addlasi(txtaddlasi.gettext())) txtconsole.settext(txtconsole.gettext() + "Lasi " + txtaddlasi.gettext() else " lisätty.\n>" populatelasilist( txtconsole.settext(txtconsole.gettext()+ "Oho, nyt tuli virhe...\n>" else if (e.getsource().equals(btnaddmenetelmä)) if (ctrl.addmenetelmä(txtaddmenetelmä.gettext())) txtconsole.settext(txtconsole.gettext() + "Menetelmä " + txtaddmenetelmä. gettext() + " lisätty.\n>" populatemenetelmälist( else txtconsole.settext(txtconsole.gettext()+ "Oho, nyt tuli virhe...\n>"

15 poistettu\n>" else if (e.getsource().equals(btndeldrinkki)) String s = (String)cmbDrinkki.getSelectedItem( if (ctrl.removedrinkki(s)) txtconsole.settext(txtconsole.gettext() + "Drinkki" + s + " else populatedrinkkilist( txtconsole.settext(txtconsole.gettext()+ "Oho, nyt tuli virhe...\n>" else if (e.getsource().equals(btnaddupdrinkki)) boolean ok = ctrl.adddrinkki(txtname.gettext(). split(", "), txtaine.gettext(). split(", "), (String)cmbAika. getselecteditem(), (String)cmbLasi. getselecteditem(), (String)cmbLämpö. getselecteditem(), (String)cmbMakeus. getselecteditem(), (String)cmbMenetelmä. getselecteditem(), txtohje.gettext() + if (ok) else txtconsole.settext(txtconsole.gettext() + "Drinkki " + txtname.gettext() " luotu/päivitetty.\n>" populatedrinkkilist( txtconsole.settext(txtconsole.gettext()+ "Oho, nyt tuli virhe...\n>" public void init() List<Ajankohta> lt = ctrl.listajankohta( lt.add(0, new Ajankohta() for (Ajankohta x : lt) cmbaika.additem(x.getkuvaus() populatedrinkkilist( populatelasilist( List<Lämpötila> lt = ctrl.listlämpötila( lt.add(0, new Lämpötila() for (Lämpötila x : lt) cmblämpö.additem(x.getkuvaus() List<Makeus> ls = ctrl.listmakeus( ls.add(0, new Makeus() for (Makeus x : ls) cmbmakeus.additem(x.getkuvaus() populatemenetelmälist( validate( setdefaultcloseoperation(exit_on_close setlocationrelativeto(null pack( setvisible(true

16 private void populatedrinkkilist() cmbdrinkki.removeallitems( List<Drinkki> ld = ctrl.listdrinkki( List<String> ls = new ArrayList<String>( for (Drinkki x : ld) ls.add(x.gettehnimi() Collections.sort(ls for (String s : ls) cmbdrinkki.additem(s private void populatelasilist() cmblasi.removeallitems( List<Lasi> lg = ctrl.listlasi( lg.add(0, new Lasi() for (Lasi x : lg) cmblasi.additem(x.getkuvaus() private void populatemenetelmälist() cmbmenetelmä.removeallitems( List<Menetelmä> lm = ctrl.listmenetelmä( lm.add(0, new Menetelmä() for (Menetelmä x : lm) cmbmenetelmä.additem(x.getkuvaus() private void populatesearchpanel(string nimi) String ss[] = ctrl.getdrinkvalues(nimi txtname.settext(ss[0] txtaine.settext(ss[1] cmbaika.setselecteditem(ss[2] cmbmakeus.setselecteditem(ss[3] cmblasi.setselecteditem(ss[4] cmblämpö.setselecteditem(ss[5] cmbmenetelmä.setselecteditem(ss[6] txtohje.settext(ss[7] package view; import java.awt.event.actionevent; import ctrl.ctrl; public class Cli implements Ui private Ctrl ctrl; public Cli() public void set(ctrl c) ctrl = c; public void actionperformed(actionevent e) public void init() package db; import org.hibernate.query;

17 public class Makeus extends Item private int id; private String kuvaus; public Makeus() public int getid() return id; public void setid(int id) this.id = id; public String getkuvaus() return kuvaus; public void setkuvaus(string kuvaus) this.kuvaus = kuvaus; public static Makeus search(string nimi) Query q = DatabaseAccess.getInstance().createQuery( "FROM db.makeus as makeus WHERE " + "makeus.kuvaus = :nimi" q.setparameter("nimi", nimi return (Makeus) q.uniqueresult( package db; import org.hibernate.query; public class Lämpötila extends Item private int id; private String kuvaus; public Lämpötila() public int getid() return id; public void setid(int id) this.id = id; public String getkuvaus() return kuvaus; public void setkuvaus(string kuvaus) this.kuvaus = kuvaus; public static Lämpötila search(string nimi) Query q = DatabaseAccess.getInstance().createQuery(

18 "FROM db.lämpötila as lämpötila WHERE " + "lämpötila.kuvaus = :nimi" q.setparameter("nimi", nimi return (Lämpötila) q.uniqueresult( package db; import java.util.arraylist; import java.util.list; import org.hibernate.query; public class Ainesosa extends Item private int id; private String nimi; public Ainesosa() public Ainesosa(String nimi) setnimi(nimi public int getid() return id; public void setid(int id) this.id = id; public String getnimi() return nimi; public final void setnimi(string nimi) this.nimi = nimi; public static Ainesosa searchexactmatch(string nimi) Query q = DatabaseAccess.getInstance().createQuery( "FROM db.ainesosa as ainesosa WHERE " + "ainesosa.nimi = :nimi" q.setparameter("nimi", nimi return (Ainesosa) q.uniqueresult( public static List<Ainesosa> search(string nimi) Query q = DatabaseAccess.getInstance().createQuery( "FROM db.ainesosa as ainesosa WHERE " + "ainesosa.nimi LIKE :nimi" q.setparameter("nimi", "%" + nimi + "%" return q.list( public static List<Ainesosa> search(string[] nimet) if (nimet == null nimet.length == 0) return null;

19 List<Ainesosa> ainesosat = new ArrayList<Ainesosa>( for (String nimi : nimet) if (nimi!= null &&!nimi.isempty()) ainesosat.addall(search(nimi) return public String tostring() return getnimi( package db; import org.hibernate.session; import org.hibernate.sessionfactory; import org.hibernate.cfg.configuration; /** * Singleton instance for Hibernate session. public class DatabaseAccess private static SessionFactory factory; private static Session session; private static DatabaseAccess instance; private DatabaseAccess() factory = new Configuration().configure( "db/resources/hibernate.cfg.xml").buildsessionfactory( session = factory.opensession( public static Session getinstance() if (instance == null) instance = new DatabaseAccess( if (session.isconnected()) return session; else return session = factory.opensession( package db; import java.util.arraylist; import java.util.list; import org.hibernate.query; public class Drinkki extends Item implements java.lang.comparable

20 private int id; private String ohje; private Ajankohta ajankohta; private Makeus makeus; private Lasi lasi; private Lämpötila lämpötila; private Menetelmä menetelmä; public Drinkki() public Ajankohta getajankohta() return ajankohta; public void setajankohta(ajankohta ajankohta) this.ajankohta = ajankohta; public int getid() return id; public void setid(int id) this.id = id; public Lasi getlasi() return lasi; public void setlasi(lasi lasi) this.lasi = lasi; public Lämpötila getlämpötila() return lämpötila; public void setlämpötila(lämpötila lämpötila) this.lämpötila = lämpötila; public Makeus getmakeus() return makeus; public void setmakeus(makeus makeus) this.makeus = makeus; public Menetelmä getmenetelmä() return menetelmä; public void setmenetelmä(menetelmä menetelmä) this.menetelmä = menetelmä; public String getohje() return ohje; public void setohje(string ohje)

21 this.ohje = ohje; " + /** * simple checker if this drink has that ingredient public boolean hasainesosa(ainesosa ainesosa) Query q = DatabaseAccess.getInstance().createQuery( "FROM db.drinkki_ainesosa as drinkki_ainesosa WHERE "drinkki_ainesosa.drinkki = :drinkki AND " + "drinkki_ainesosa.ainesosa = :ainesosa" q.setparameter("drinkki", this q.setparameter("ainesosa", ainesosa return (q.list().size() == 0)? false : true; " + /** * get all the ingredients of this COCKtail. ingredients public List<Ainesosa> getainesosat() Query q = DatabaseAccess.getInstance().createQuery( "FROM db.drinkki_ainesosa as drinkki_ainesosa WHERE "drinkki_ainesosa.drinkki = :drinkki" q.setparameter("drinkki", this List<Ainesosa> ainesosat = new ArrayList<Ainesosa>( for (Drinkki_Ainesosa drinkki_ainesosa : (List<Drinkki_Ainesosa>)q.list()) ainesosat.add(drinkki_ainesosa.getainesosa() return ainesosat; /** all the aliases for this drink. public List<Nimi> getnimet() Query q = DatabaseAccess.getInstance().createQuery( "FROM db.nimi as drinkki_nimi WHERE " + "drinkki_nimi.drinkki = :drinkki" q.setparameter("drinkki", this return q.list( /** the single most important name for this drink. public String gettehnimi() List<Nimi> nimet = getnimet(

22 int value = -1; String nimi = ""; for (Nimi n : nimet) if (n.getyleisyys() > value) nimi = n.getnimi( value = n.getyleisyys( return nimi; public int compareto(object o) if (o instanceof Drinkki) Drinkki other = (Drinkki) o; if (other.getid() > id) return 1; else if (other.getid() == id) return 0; else return -1; else throw new ClassCastException("Unable to compare" package db.dialect; /* * The author disclaims copyright to this source code. In place of * a legal notice, here is a blessing: * * May you do good and not evil. * May you find forgiveness for yourself and forgive others. * May you share freely, never taking more than you give. * import java.sql.types; import org.hibernate.dialect.dialect; import org.hibernate.dialect.function.standardsqlfunction; import org.hibernate.dialect.function.sqlfunctiontemplate; import org.hibernate.dialect.function.varargssqlfunction; import org.hibernate.hibernate; public class SQLiteDialect extends Dialect public SQLiteDialect() super( registercolumntype(types.bit, "integer" registercolumntype(types.tinyint, "tinyint" registercolumntype(types.smallint, "smallint" registercolumntype(types.integer, "integer" registercolumntype(types.bigint, "bigint" registercolumntype(types.float, "float" registercolumntype(types.real, "real" registercolumntype(types.double, "double" registercolumntype(types.numeric, "numeric" registercolumntype(types.decimal, "decimal" registercolumntype(types.char, "char" registercolumntype(types.varchar, "varchar" registercolumntype(types.longvarchar, "longvarchar"

23 registercolumntype(types.date, "date" registercolumntype(types.time, "time" registercolumntype(types.timestamp, "timestamp" registercolumntype(types.binary, "blob" registercolumntype(types.varbinary, "blob" registercolumntype(types.longvarbinary, "blob" // registercolumntype(types.null, "null" registercolumntype(types.blob, "blob" registercolumntype(types.clob, "clob" registercolumntype(types.boolean, "integer" registerfunction("concat", new VarArgsSQLFunction(Hibernate.STRING, "", " ", "") registerfunction("mod", new SQLFunctionTemplate(Hibernate.INTEGER, "?1 %?2") registerfunction("substr", new StandardSQLFunction("substr", Hibernate.STRING) registerfunction("substring", new StandardSQLFunction("substr", Hibernate.STRING) public boolean supportsidentitycolumns() return true; /* public boolean supportsinsertselectidentity() return true; // As specify in NHibernate dialect public boolean hasdatatypeinidentitycolumn() return false; // As specify in NHibernate dialect /* public String appendidentityselecttoinsert(string insertstring) return new StringBuffer(insertString.length()+30). // As specify in NHibernate dialect append(insertstring). append("; ").append(getidentityselectstring()). tostring( public String getidentitycolumnstring() // return "integer primary key autoincrement"; return "integer"; public String getidentityselectstring() return "select last_insert_rowid()"; public boolean supportslimit() return true; public String getlimitstring(string query, boolean hasoffset) return new StringBuffer(query.length() + 20).append(query).append(

24 ?").tostring( hasoffset? " limit? offset?" : " limit public boolean supportstemporarytables() return true; public String getcreatetemporarytablestring() return "create temporary table if not exists"; public boolean droptemporarytableafteruse() return false; public boolean supportscurrenttimestampselection() return true; public boolean iscurrenttimestampselectstringcallable() return false; public String getcurrenttimestampselectstring() return "select current_timestamp"; public boolean supportsunionall() return true; public boolean hasaltertable() return false; // As specify in NHibernate dialect public boolean dropconstraints() return false; public String getaddcolumnstring() return "add column"; public String getforupdatestring() return ""; public boolean supportsouterjoinforupdate() return false; public String getdropforeignkeystring() throw new UnsupportedOperationException( "No drop foreign key syntax supported by SQLiteDialect" public String getaddforeignkeyconstraintstring(string constraintname, String[] foreignkey, String referencedtable, String[] primarykey, boolean referencesprimarykey) throw new UnsupportedOperationException(

25 SQLiteDialect" "No add foreign key syntax supported by public String getaddprimarykeyconstraintstring(string constraintname) throw new UnsupportedOperationException( "No add primary key syntax supported by SQLiteDialect" public boolean supportsifexistsbeforetablename() return true; public boolean supportscascadedelete() return false; package db; import org.hibernate.query; public class Menetelmä extends Item private int id; private String kuvaus; public Menetelmä() public Menetelmä(String kuvaus) setkuvaus(kuvaus public int getid() return id; public void setid(int id) this.id = id; public String getkuvaus() return kuvaus; public final void setkuvaus(string kuvaus) this.kuvaus = kuvaus; public static Menetelmä search(string nimi) Query q = DatabaseAccess.getInstance().createQuery( "FROM db.menetelmä as menetelmä WHERE " + "menetelmä.kuvaus = :nimi" q.setparameter("nimi", nimi return (Menetelmä) q.uniqueresult( package db; import org.hibernate.query; public class Lasi extends Item private int id;

26 private String kuvaus; public Lasi() public Lasi(String kuvaus) setkuvaus(kuvaus public int getid() return id; public void setid(int id) this.id = id; public String getkuvaus() return kuvaus; public final void setkuvaus(string kuvaus) this.kuvaus = kuvaus; public static Lasi search(string nimi) Query q = DatabaseAccess.getInstance().createQuery( "FROM db.lasi as lasi WHERE " + "lasi.kuvaus = :nimi" q.setparameter("nimi", nimi return (Lasi) q.uniqueresult( package db; import org.hibernate.query; public class Ajankohta extends Item private int id; private String kuvaus; public Ajankohta() public int getid() return id; public void setid(int id) this.id = id; public String getkuvaus() return kuvaus; public void setkuvaus(string kuvaus) this.kuvaus = kuvaus; public static Ajankohta search(string nimi) Query q = DatabaseAccess.getInstance().createQuery( "FROM db.ajankohta as ajankohta WHERE " + "ajankohta.kuvaus = :nimi"

27 q.setparameter("nimi", nimi return (Ajankohta) q.uniqueresult( package db; import java.util.list; import org.hibernate.session; /** * Base class for all shared shitz. public class Item public List<?> list() return DatabaseAccess.getInstance().createQuery( "FROM " + this.getclass().getname()).list( package db; import java.util.arraylist; import java.util.list; import org.hibernate.query; import org.hibernate.session; public class Nimi extends Item private int id; private String nimi; private Drinkki drinkki; private int yleisyys; public Nimi() public Drinkki getdrinkki() return drinkki; public void setdrinkki(drinkki drinkki) this.drinkki = drinkki; public int getid() return id; public void setid(int id) this.id = id; public String getnimi() return nimi; public void setnimi(string nimi) this.nimi = nimi;

28 public int getyleisyys() return yleisyys; public void setyleisyys(int yleisyys) this.yleisyys = yleisyys; /** Checks if this class is an alias for cocktail given as param public boolean isaliasof(drinkki drinkki) Query q = DatabaseAccess.getInstance().createQuery( "FROM db.nimi as nimi WHERE " + "nimi.drinkki = :drinkki" q.setparameter("drinkki", drinkki return (q.list().size() == 0)? false : true; public static Nimi searchexactmatch(string nimi) Query q = DatabaseAccess.getInstance().createQuery( "FROM db.nimi as nimi WHERE " + "nimi.nimi LIKE :nimi" q.setparameter("nimi", nimi return (Nimi) q.uniqueresult( public static List<Nimi> search(string nimi) Query q = DatabaseAccess.getInstance().createQuery( "FROM db.nimi as nimi WHERE " + "nimi.nimi LIKE :nimi" q.setparameter("nimi", "%" + nimi + "%" return q.list( public static List<Nimi> search(string[] nimet) if (nimet == null nimet.length == 0) return null; List<Nimi> nimmet = new ArrayList<Nimi>( for (String nimi : nimet) if (nimi!= null &&!nimi.isempty()) nimmet.addall(search(nimi) return nimmet; package db; import org.hibernate.query; public class Drinkki_Ainesosa extends Item private int id;

29 private Drinkki drinkki; private Ainesosa ainesosa; public Drinkki_Ainesosa() public Ainesosa getainesosa() return ainesosa; public void setainesosa(ainesosa ainesosa) this.ainesosa = ainesosa; public Drinkki getdrinkki() return drinkki; public void setdrinkki(drinkki drinkki) this.drinkki = drinkki; public int getid() return id; public void setid(int id) this.id = id; /** * Function used for maintaining the integrity of the database. drinkki public static void removebydrinkki(drinkki drinkki) Query q = DatabaseAccess.getInstance().createQuery( "DELETE FROM db.drinkki_ainesosa as da WHERE " + "da.drinkki = :drinkki" q.setparameter("drinkki", drinkki q.executeupdate( package ctrl; import java.util.arraylist; import java.util.list; import db.*; import model.model; import view.ui; public class Ctrl private Ui ui; private Model model; public Ctrl(Ui u, Model m) ui = u; model = m; public List<Ajankohta> listajankohta()

30 return model.listajankohta( public List<Lasi> listlasi() return model.listlasi( public List<Lämpötila> listlämpötila() return model.listlämpötila( public List<Menetelmä> listmenetelmä() return model.listmenetelmä( public List<Makeus> listmakeus() return model.listmakeus( public List<Drinkki> listdrinkki() return model.listdrinkki( public boolean addainesosa(string nimi) boolean ret = false; try if (!nimi.isempty()) model.addainesosa(nimi ret = true; catch (Exception e) // We can assume that this failed. e.printstacktrace( finally return ret; public boolean addlasi(string kuvaus) boolean ret = false; try if (!kuvaus.isempty()) model.addlasi(kuvaus ret = true; catch (Exception e) // We can assume that this failed. e.printstacktrace( finally return ret; null && public boolean adddrinkki(string[] nimet, String[] ainesosat, String aika, String lasi, String lämpötila, String makeus, String menetelmä, String ohje) boolean ret = false; try if (aika!= null && lasi!= null && lämpötila!= makeus!= null && menetelmä!= null &&

31 * ohje nimet.length * ainesosat.length * aika.length() lasi.length() * lämpötila.length() * makeus.length() * menetelmä.length() > 0) model.addorupdatedrinkki( nimet, ainesosat, aika, lasi, lämpötila, makeus, menetelmä, ret = true; catch (Exception e) // We can assume that this failed. e.printstacktrace( finally return ret; public boolean addmenetelmä(string kuvaus) boolean ret = false; try if (!kuvaus.isempty()) model.addmenetelmä(kuvaus ret = true; catch (Exception e) // We can assume that this failed. e.printstacktrace( finally return ret; public boolean removedrinkki(string kuvaus) boolean ret = false; try if (!kuvaus.isempty()) model.removedrinkki(kuvaus ret = true; catch (Exception e) e.printstacktrace( finally return ret; public List<String> search(string[] nimet, String[] ainesosat, String aika, String lasi, String lämpötila, String makeus, String menetelmä) Ajankohta _ajankohta = Ajankohta.search(aika Lasi _lasi = Lasi.search(lasi Lämpötila _lämpötila = Lämpötila.search(lämpötila Makeus _makeus = Makeus.search(makeus Menetelmä _menetelmä = Menetelmä.search(menetelmä? ainesosat = (ainesosat.length == 1 && ainesosat[0].isempty()) null : ainesosat;

32 nimet = (nimet.length == 1 && nimet[0].isempty())? null : nimet; List<Ainesosa> _ainesosat = Ainesosa.search(ainesosat List<Nimi> _nimet = Nimi.search(nimet List<Drinkki> drinkit = model.search( _nimet, _ainesosat, _ajankohta, _lasi, _lämpötila, _makeus, _menetelmä List<String> ls = new ArrayList<String>( for (Drinkki d : drinkit) String s = d.gettehnimi() + "\n("; for (Nimi n : d.getnimet()) s = s.concat(n.getnimi() + ", " if (s.endswith(", ")) s = s.substring(0, s.length()-2 s = s.concat(")\n\n" + d.getainesosat() + "\n\n" + d.getohje() + "\n\n" ls.add(s return ls; public String[] getdrinkvalues(string nimi) Drinkki d = Nimi.searchExactMatch(nimi).getDrinkki( String ret[] = new String[8]; for (int i = 0; i < 8; ++i) ret[i] = new String("" List<Nimi> nimet = d.getnimet( for (Nimi n : nimet) ret[0] = ret[0].concat(n.getnimi()) + ", "; ret[0] = ret[0].substring(0, ret[0].length()-2 List<Ainesosa> aineet = d.getainesosat( for (Ainesosa a : aineet) ret[1] = ret[1].concat(a.getnimi()) + ", "; ret[1] = ret[1].substring(0, ret[1].length()-2 ret[2] = d.getajankohta().getkuvaus( ret[3] = d.getmakeus().getkuvaus( ret[4] = d.getlasi().getkuvaus( ret[5] = d.getlämpötila().getkuvaus( ret[6] = d.getmenetelmä().getkuvaus( ret[7] = d.getohje( return ret; /* * To change this template, choose Tools Templates * and open the template in the editor. package ctrl; import java.awt.dimension; import java.awt.frame; import java.awt.insets;

33 /** * Example from Chapter 3 * * Simple object to prompt for user id/password. * Jeff Heaton 1.0 public class SecurePrompt extends javax.swing.jdialog public SecurePrompt(Frame parent) super(parent, true //INIT_CONTROLS settitle("security" getcontentpane().setlayout(null setsize(403, 129 setvisible(false JLabel1.setText("Käyttäjätunnus:" getcontentpane().add(jlabel1 JLabel1.setBounds(12, 12, 48, 24 JLabel2.setText("Sanasala:" getcontentpane().add(jlabel2 JLabel2.setBounds(12, 48, 72, 24 _uid.settext("admin" getcontentpane().add(_uid _uid.setbounds(72, 12, 324, 24 _ok.settext("ok" getcontentpane().add(_ok _ok.setbounds(60, 84, 84, 24 getcontentpane().add(_pwd _pwd.setbounds(72, 48, 324, 24 _cancel.settext("cancel" getcontentpane().add(_cancel _cancel.setbounds(264, 84, 84, 24 // //REGISTER_LISTENERS SymAction lsymaction = new SymAction( _ok.addactionlistener(lsymaction _cancel.addactionlistener(lsymaction public final void setvisible(boolean b) if (b) setlocation(50, 50 public void addnotify() // Record the size of the window prior to calling parents addnotify. Dimension size = getsize( super.addnotify( if (framesizeadjusted) return; framesizeadjusted = true; // Adjust size of frame according to the insets

34 Insets insets = getinsets( setsize(insets.left + insets.right + size.width, insets.top + insets.bottom + size.height // Used by addnotify boolean framesizeadjusted = false; //DECLARE_CONTROLS javax.swing.jlabel JLabel1 = new javax.swing.jlabel( javax.swing.jlabel JLabel2 = new javax.swing.jlabel( /** * The user ID entered. javax.swing.jtextfield _uid = new javax.swing.jtextfield( /** javax.swing.jbutton _ok = new javax.swing.jbutton( /** * The password is entered. javax.swing.jpasswordfield _pwd = new javax.swing.jpasswordfield( javax.swing.jbutton _cancel = new javax.swing.jbutton( // class SymAction implements java.awt.event.actionlistener public void actionperformed(java.awt.event.actionevent event) Object object = event.getsource( if (object == _ok) Ok_actionPerformed(event else if (object == _cancel) Cancel_actionPerformed(event /** * Called when ok is clicked. * event void Ok_actionPerformed(java.awt.event.ActionEvent event) setvisible(false /** * Called when cancel is clicked. * event void Cancel_actionPerformed(java.awt.event.ActionEvent event) _uid.settext("" _pwd.settext("" setvisible(false package ctrl;

35 import db.databaseaccess; import javax.swing.joptionpane; import javax.swing.swingutilities; import javax.swing.uimanager; import model.model; import view.gui; public class Main public Main() SecurePrompt sp = new SecurePrompt(null while (true) sp.setvisible(true while (sp.isvisible()) try Thread.currentThread().sleep(100 catch (InterruptedException ex) // This be ugly hack: program dies if user tries // to login using empty username and password... if (sp._uid.gettext().length() + sp._pwd.getpassword().length == 0) sp.dispose( return; password." if (!Model.login(sp._uid.getText(), String.valueOf( sp._pwd.getpassword()))) JOptionPane.showMessageDialog(sp, "Incorrect username and/or else break; Gui ui = new Gui( Model mdl = new Model( Ctrl ctrl = new Ctrl(ui, mdl ui.set(ctrl ui.init( mdl.removeorphans( DatabaseAccess.getInstance().close( public static void main(string[] args) SwingUtilities.invokeLater(new Runnable() public void run() try UIManager.setLookAndFeel(UIManager. set " + getsystemlookandfeelclassname() catch (Exception exception) System.out.println("Could not "look and feel." //Turn off metal's use of bold fonts. UIManager.put("swing.boldMetal", false

36 new Main( package model; import db.*; import java.util.arraylist; import java.util.list; import java.util.set; import java.util.treeset; import org.hibernate.transaction; public class Model Transaction transaction; public Model() /** * Adds ainesosa (ingredient) to database. ainesosa to add Ainesosa added to db public Ainesosa addainesosa(string nimi) Ainesosa a = Ainesosa.searchExactMatch(nimi if (a == null) a = new Ainesosa( a.setnimi(nimi transaction = DatabaseAccess.getInstance().beginTransaction( DatabaseAccess.getInstance().saveOrUpdate(a transaction.commit( return a; /** * Adds lasi to database. lasin sanallinen kuvaus Lasi added to db public Lasi addlasi(string kuvaus) Lasi l = Lasi.search(kuvaus if (l == null) l = new Lasi( l.setkuvaus(kuvaus transaction = DatabaseAccess.getInstance().beginTransaction( DatabaseAccess.getInstance().saveOrUpdate(l transaction.commit( return l; /**

37 * Adds menetelmä to database menetelmän kuvaus Menetelmä added to db public Menetelmä addmenetelmä(string kuvaus) Menetelmä m = Menetelmä.search(kuvaus if (m == null) m = new Menetelmä( m.setkuvaus(kuvaus transaction = DatabaseAccess.getInstance().beginTransaction( DatabaseAccess.getInstance().saveOrUpdate(m transaction.commit( return m; /** * Adds or updates the cocktail. * nimet ainesosat aika lasi lämpötila makeus menetelmä ohje created cocktail. public Drinkki addorupdatedrinkki(string[] nimet, String[] ainesosat, String aika, String lasi, String lämpötila, String makeus, String menetelmä, String ohje) throws Exception Drinkki x = null; // prevent users' from doing anything stupid. for (String nimi : nimet) Nimi n = Nimi.searchExactMatch(nimi if (n == null) continue; if (x == null) x = n.getdrinkki( continue; ok. nono. if (x == n.getdrinkki() // Alias for same drink: null == n.getdrinkki()) // New alias: accept. continue; else // Alias refers to ANOTHER drink - a big throw new Exception("You fool." Lasi _lasi = addlasi(lasi Ajankohta _aika = Ajankohta.search(aika

Listarakenne (ArrayList-luokka)

Listarakenne (ArrayList-luokka) Listarakenne (ArrayList-luokka) Mikä on lista? Listan määrittely ArrayList-luokan metodeita Listan läpikäynti Listan läpikäynti indeksin avulla Listan läpikäynti iteraattorin avulla Listaan lisääminen

Lisätiedot

JAVA-OHJELMOINTI 3 op A274615

JAVA-OHJELMOINTI 3 op A274615 JAVA-OHJELMOINTI 3 op A274615 JFC & Swing, Look & Feel, Events Teemu Saarelainen teemu.saarelainen@kyamk.fi Lähteet: http://java.sun.com/docs/books/tutorial/index.html Vesterholm, Kyppö: Java-ohjelmointi,

Lisätiedot

Olio-ohjelmointi Käyttöliittymä

Olio-ohjelmointi Käyttöliittymä Olio-ohjelmointi 2016 Käyttöliittymä n Javalla on helppo toteuttaa yksinkertainen graafinen käyttöliittymä n AWT/Swing n JFC (Java Foundation Collection) n AWT-sisältää Javan grafiikka GUI-komponmentit

Lisätiedot

Tehtävä 1. Tietojen lisääminen, poistaminen, päivittäminen ja tulostaminen

Tehtävä 1. Tietojen lisääminen, poistaminen, päivittäminen ja tulostaminen Esimerkki: Tehtävä 1. Tietojen lisääminen, poistaminen, päivittäminen ja tulostaminen Luo tietokanta Koulu. Tietokantaan lisätään 3 taulua. Kurssit-taulu: kurssiid not null primary key INTEGER aineid not

Lisätiedot

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti Rinnakkaisohjelmointi kurssi Opintopiiri työskentelyn raportti Opintopiiri: Heikki Karimo, Jesse Paakkari ja Keijo Karhu Päiväys: 15.12.2006 Ohjelmointitehtävä C i C i : Säikeet ja kriittisen vaiheen kontrollointi

Lisätiedot

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma. Välikoe / 20.3 Vastaa neljään (4) tehtävään. Jos vastaat 5:een, 4 huonointa arvostellaan. Kunkin tehtävän vastaus eri konseptille. 1. Pöytätesti Pöytätestaa seuraava ohjelma. Tutki ohjelman toimintaa pöytätestillä

Lisätiedot

Tapahtumapohjainen ohjelmointi. Juha Järvensivu juha.jarvensivu@tut.fi 2007

Tapahtumapohjainen ohjelmointi. Juha Järvensivu juha.jarvensivu@tut.fi 2007 Tapahtumapohjainen ohjelmointi Juha Järvensivu juha.jarvensivu@tut.fi 2007 Sisältö Tapahtumapohjainen ohjelmointi Käyttöliittymän rakenne Pääikkuna (top-level window) Lapsi-ikkuna (child window) Dialogit

Lisätiedot

Java UI-komponentit (JTable) Juha Järvensivu juha.jarvensivu@tut.fi 2007

Java UI-komponentit (JTable) Juha Järvensivu juha.jarvensivu@tut.fi 2007 Java UI-komponentit (JTable) Juha Järvensivu juha.jarvensivu@tut.fi 2007 JTable Datan esittäminen taulukkomuodossa Datan valitseminen taulukosta Datan muokkaaminen (lisääminen, muokkaaminen, poistaminen)

Lisätiedot

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena Ohjelmointikielet ja -paradigmat 5op Markus Norrena Ko#tehtävä 4 Viimeistele "alkeellinen kuvagalleria". Käytännössä kaksi sivua Yksi jolla voi ladata kuvia palvelimelle (file upload) Toinen jolla ladattuja

Lisätiedot

Ohjelmointi 2 / 2010 Välikoe / 26.3

Ohjelmointi 2 / 2010 Välikoe / 26.3 Ohjelmointi 2 / 2010 Välikoe / 26.3 Välikoe / 26.3 Vastaa neljään (4) tehtävään ja halutessa bonustehtäviin B1 ja/tai B2, (tuovat lisäpisteitä). Bonustehtävät saa tehdä vaikkei olisi tehnyt siihen tehtävään

Lisätiedot

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

812341A Olio-ohjelmointi Peruskäsitteet jatkoa 812341A Olio-ohjelmointi 2106 Peruskäsitteet jatkoa Luokkakohtaiset piirteet n Yhteisiä kaikille saman luokan olioille n Liittyvät luokkaan, eivät yksittäiseen olioon n Kaikki ko. luokan oliot voivat käyttää

Lisätiedot

FinFamily Installation and importing data (11.1.2016) FinFamily Asennus / Installation

FinFamily Installation and importing data (11.1.2016) FinFamily Asennus / Installation FinFamily Asennus / Installation 1 Sisällys / Contents FinFamily Asennus / Installation... 1 1. Asennus ja tietojen tuonti / Installation and importing data... 4 1.1. Asenna Java / Install Java... 4 1.2.

Lisätiedot

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki Tehtävä 1 Koherentti selitys Koherentti esimerkki ½p ½p Tehtävä 2 Täysiin pisteisiin edellytetään pelaajien tulostamista esimerkin järjestyksessä. Jos ohjelmasi tulostaa pelaajat jossain muussa järjestyksessä,

Lisätiedot

Tietokannat II -kurssin harjoitustyö

Tietokannat II -kurssin harjoitustyö Tietokannat II -kurssin harjoitustyö Jyri Lehtonen (72039), jkoleh@utu.fi Azad Hajipour (72187), azhaji@utu.fi 10.6.2007 Sisältö 1. Tietokannan kuvaus... 1 1.1 Tietokannan rakenne... 1 1.2 Relaatiokaava

Lisätiedot

Java-API, rajapinnat, poikkeukset, UML,...

Java-API, rajapinnat, poikkeukset, UML,... Java-API, rajapinnat, r poikkeukset, UML,... Janne Käki 12.10.2006 Keskeisimmät Java-API:n pakkaukset API = Application Programming Interface eli sovellusohjelmointirajapinta (!) pakkaus (engl. package)

Lisätiedot

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys) 1(37) PERIYTYMINEN (inheritance) YLILUOKKA (superclass) ALILUOKKA (subclass) A) on käytännöllinen ohjelmointitekniikka = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys) B) on käsitteiden

Lisätiedot

HSMT Tietokannoista. Ville Leppänen. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.1/32

HSMT Tietokannoista. Ville Leppänen. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.1/32 HSMT Tietokannoista Ville Leppänen HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.1/32 Missä mennään... 1. Johdanto (1h) 2. Säikeet (2h) 3. Samanaikaisuudesta (2h) 4. Hajautetuista sovelluksista (1h)

Lisätiedot

XNA grafiikka laajennus opas. Paavo Räisänen. www.ohjelmoimaan.net. Tämän oppaan lähdekoodit ovat ladattavissa näiden sivujen Ladattavat osiossa.

XNA grafiikka laajennus opas. Paavo Räisänen. www.ohjelmoimaan.net. Tämän oppaan lähdekoodit ovat ladattavissa näiden sivujen Ladattavat osiossa. XNA grafiikka laajennus opas Paavo Räisänen www.ohjelmoimaan.net Tämän oppaan lähdekoodit ovat ladattavissa näiden sivujen Ladattavat osiossa. Tätä opasta saa vapaasti kopioida, tulostaa ja levittää ei

Lisätiedot

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++? JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS Teemu Saarelainen teemu.saarelainen@kyamk.fi Lähteet: http://java.sun.com/docs/books/tutorial/index.html Vesterholm, Kyppö: Java-ohjelmointi,

Lisätiedot

Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014

Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014 Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014 Kirjoita jokaiseen palauttamaasi konseptiin kurssin nimi, kokeen päivämäärä, oma nimi ja opiskelijanumero. Vastaa kaikkiin tehtäviin omille konsepteilleen.

Lisätiedot

Mikä yhteyssuhde on?

Mikä yhteyssuhde on? 1 Yhteyssuhde Mikä yhteyssuhde on? Yhteyssuhde Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma 1 Mikä yhteyssuhde on? Tili - : String - : double * 1 Asiakas - hetu: String - : String

Lisätiedot

GRAAFISEN KÄYTTÖLIITTYMÄN OHJELMOINTI JAVA SWING

GRAAFISEN KÄYTTÖLIITTYMÄN OHJELMOINTI JAVA SWING GRAAFISEN KÄYTTÖLIITTYMÄN OHJELMOINTI JAVA SWING Käyttöliittymäkomponentteja Sovelluksen pääikkunan luominen Rinnakkainen toiminnallisuus Miten käyttöliittymä lopetetaan? Ikkunan peruskomponentit Mihin

Lisätiedot

Olio-ohjelmointi Javalla

Olio-ohjelmointi Javalla 1 Olio-ohjelmointi Javalla Olio-ohjelmointi Luokka Attribuutit Konstruktori Olion luominen Metodit Olion kopiointi Staattinen attribuutti ja metodi Yksinkertainen ohjelmaluokka Ohjelmaluokka 1 Olio-ohjelmointi

Lisätiedot

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Tietorakenneluokkia 2: HashMap, TreeMap Tietorakenneluokkia ja -rajapintoja Java tarjoaa laajan kokoelman tietorakennerajapintoja ja - luokkia. Aiemmin

Lisätiedot

Java ja grafiikka. Ville Sundberg 12.12.2007

Java ja grafiikka. Ville Sundberg 12.12.2007 Java ja grafiikka Ville Sundberg 12.12.2007 What happen Viritetty JPanel Graphics ja Graphics2D ImageIO ja BufferedImage Animaatio ja ajastus Optimoinnista Kehykset import javax.swing.jframe; public class

Lisätiedot

Luokan sisällä on lista

Luokan sisällä on lista 1 Luokan sisällä on lista Luokan sisällä lista Listan sisältävä luokka Konstruktorit get-metodi Lista muissa metodeissa addxx-metodi Yksinkertainen pääohjelma Kertauksen List-luokan metodeja 1 Luokan sisällä

Lisätiedot

Kirjasto Relaatiotietokannat Kevät 2001. Auvinen Annemari Niemi Anu Passoja Jonna Pulli Jari Tersa Tiina

Kirjasto Relaatiotietokannat Kevät 2001. Auvinen Annemari Niemi Anu Passoja Jonna Pulli Jari Tersa Tiina Kirjasto Kevät 2001 Auvinen Annemari Niemi Anu Harjoitustyö 7.4.2001 Sisällysluettelo 1. Yleiskuvaus... 3 2. Vaatimukset... 3 2.1. Toiminnalliset... 3 2.1.1. Sisäänkirjautuminen... 3 2.1.2. Nimikkeiden

Lisätiedot

Toisessa viikkoharjoituksessa on tavoitteena tutustua JUnit:lla testaukseen Eclipse-ympäristössä.

Toisessa viikkoharjoituksessa on tavoitteena tutustua JUnit:lla testaukseen Eclipse-ympäristössä. Toisessa viikkoharjoituksessa on tavoitteena tutustua JUnit:lla testaukseen Eclipse-ympäristössä. JUnit-ympäristö 1. Luo tests -pakkaukseen uusi luokka. Nimeä VHTestit. 2. Laita VHTestit periytymään TestCase:sta

Lisätiedot

Rajapinta (interface)

Rajapinta (interface) 1 Rajapinta (interface) Mikä rajapinta on? Rajapinta ja siitä toteutettu luokka Monimuotoisuus ja dynaaminen sidonta Rajapinta vs periytyminen 1 Mikä rajapinta on? Rajapintoja käytetään, kun halutaan määritellä

Lisätiedot

FinFamily PostgreSQL installation ( ) FinFamily PostgreSQL

FinFamily PostgreSQL installation ( ) FinFamily PostgreSQL FinFamily PostgreSQL 1 Sisällys / Contents FinFamily PostgreSQL... 1 1. Asenna PostgreSQL tietokanta / Install PostgreSQL database... 3 1.1. PostgreSQL tietokannasta / About the PostgreSQL database...

Lisätiedot

Tietokannat II -kurssin harjoitustyö

Tietokannat II -kurssin harjoitustyö Tietokannat II -kurssin harjoitustyö Olli Opiskelija (123), olli.opiskelija@foo.fi Maija Mallioppilas (321), maija.mallioppilas@foo.fi 13.3. 2007 1 Sisältö 1 Tietokannan kuvaus 3 1.1 Tietokannan rakenne..................................

Lisätiedot

1 Tehtävän kuvaus ja analysointi

1 Tehtävän kuvaus ja analysointi Olio-ohjelmoinnin harjoitustyön dokumentti Jyri Lehtonen (72039) Taneli Tuovinen (67160) 1 Tehtävän kuvaus ja analysointi 1.1 Tehtävänanto Tee luokka, jolla mallinnetaan sarjaan kytkettyjä kondensaattoreita.

Lisätiedot

Rinnakkaisohjelmointi, Syksy 2006

Rinnakkaisohjelmointi, Syksy 2006 Rinnakkaisohjelmointi, Syksy 2006 17.12.2006 Opintopiiri WTF Mika Holmström Paula Kemppi Janne Piippo Lasse Lukkari Javan semaforit 1. Menetelmän käyttötarkoitus ja sovellusalue Semaforin idea kehitettiin

Lisätiedot

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä OULUN YLIOPISTO Tietojenkäsittelytieteiden laitos Johdatus ohjelmointiin 81122P (4 ov.) 30.5.2005 Ohjelmointikieli on Java. Tentissä saa olla materiaali mukana. Tenttitulokset julkaistaan aikaisintaan

Lisätiedot

T Henkilökohtainen harjoitus: FASTAXON

T Henkilökohtainen harjoitus: FASTAXON T-76.115 Henkilökohtainen harjoitus: FASTAXON Suunnittelumallit Group: Muuntaja Pentti Vänskä 52572W 2 1. Toteutus Tämä henkilökohtainen harjoitustyö käsitteli suunnittelumallien (Design Patterns) käyttöä

Lisätiedot

14. Poikkeukset 14.1

14. Poikkeukset 14.1 14. Poikkeukset 14.1 Sisällys Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla poikkeuksella? Poikkeusten heittäminen.

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 15.3.2010 T-106.1208 Ohjelmoinnin perusteet Y 15.3.2010 1 / 56 Tiedostoista: tietojen tallentaminen ohjelman suorituskertojen välillä Monissa sovelluksissa ohjelman

Lisätiedot

Pino S on abstrakti tietotyyppi, jolla on ainakin perusmetodit:

Pino S on abstrakti tietotyyppi, jolla on ainakin perusmetodit: Pino (stack) Pino: viimeisenä sisään, ensimmäisenä ulos (LIFO, Last In, First Out) -tietorakenne kaksi perusoperaatiota: alkion lisäys pinon päälle (push), ja päällimmäisen alkion poisto (pop) Push(alkio)

Lisätiedot

Osio 4: Graafinen käyttöliittymä

Osio 4: Graafinen käyttöliittymä Javan Swing-tekniikan perusteet: Muistutus: Tarvitset seuraavia komponentteja harjoituksissa: otsikkoteksti (label) muokkausruutu (text field) komentopainike (button) yhdistelmäruutu (combo box) paneeli

Lisätiedot

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä OULUN YLIOPISTO Tietojenkäsittelytieteiden laitos Johdatus ohjelmointiin 811122P (5 op.) 12.12.2005 Ohjelmointikieli on Java. Tentissä saa olla materiaali mukana. Tenttitulokset julkaistaan aikaisintaan

Lisätiedot

Java ja tietokannan käsittely (JDBC)

Java ja tietokannan käsittely (JDBC) Java ja tietokannan käsittely (JDBC) Javan tietokannan käsittely luokat (java.sql.*) Yhteys tietokantaan Tietokannan yhteyden sulkeminen Tiedon haku tietokannasta Tiedon päivitys tietokantaan Transaktio

Lisätiedot

Java kahdessa tunnissa. Jyry Suvilehto

Java kahdessa tunnissa. Jyry Suvilehto Java kahdessa tunnissa Jyry Suvilehto Ohjelma Ohjelmointiasioita alkeista nippelitietoon n. 45 min Tauko 10 min Oliot, luokat ja muut kummajaiset n. 45 min Kysykää Sisältöä ei oikeasti ole 2x45 min täytteeksi,

Lisätiedot

Metodien tekeminen Javalla

Metodien tekeminen Javalla 1 Metodien tekeminen Javalla Mikä metodi on? Metodin syntaksi Metodi ja sen kutsuminen Parametreista Merkkijonot ja metodi Taulukot ja metodi 1 Mikä metodi on? Metodilla toteutetaan luokkaan toiminnallisuutta.

Lisätiedot

Harjoitus 7. 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Harjoitus 7. 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti: Harjoitus 7 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti: class Lintu //Kentät private int _siivenpituus; protected double _aivojenkoko; private bool _osaakolentaa; //Ominaisuudet public int

Lisätiedot

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma. 2. Taulukot 2.1 Sisältö Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.2 Yleistä

Lisätiedot

JWT 2016 luento 11. to 21.4.2016 klo 14-15. Aulikki Hyrskykari. PinniB 1097. Aulikki Hyrskykari

JWT 2016 luento 11. to 21.4.2016 klo 14-15. Aulikki Hyrskykari. PinniB 1097. Aulikki Hyrskykari JWT 2016 luento 11 to 21.4.2016 klo 14-15 Aulikki Hyrskykari PinniB 1097 1 Viime luennolla o AJAX ja JSON, harjoitustyön tehtävänanto, vierailuluento avoimesta datasta Tänään o APIt rajapinnoista yleisesti

Lisätiedot

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Sisällys. 14. Poikkeukset. Johdanto. Johdanto Sisällys 14. Poikkeukset Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Miten varautua poikkeukseen metodissa? Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla

Lisätiedot

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004 Vertailulauseet Ehtolausekkeet Ehdot, valintalausekkeet Boolean-algebra == yhtäsuuruus!= erisuuruus < pienempi suurempi >= suurempi tai yhtäsuuri Esimerkkejä: int i=7; int j=10;

Lisätiedot

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Sisällys. 14. Poikkeukset. Johdanto. Johdanto Sisällys 14. Poikkeukset Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla poikkeuksella? Poikkeusten heittäminen.

Lisätiedot

Teskstialue (JTextArea) ja Scrollaus (JScrollPane)

Teskstialue (JTextArea) ja Scrollaus (JScrollPane) HELIA OHJELMOINTI ict1tn006 1 (32) Viikon 14 materiaalia Teskstialue (JTextArea) ja Scrollaus (JScrollPane) JTextArea on tekstialue, jossa on useita rivejä Muodostimia: public JTextArea(int rows, int columns)

Lisätiedot

Ohjelmointityö 3. Mikko Laamanen 185667

Ohjelmointityö 3. Mikko Laamanen 185667 Ohjelmointityö 3 Mikko Laamanen 185667 Sisällysluettelo Tehtävän määrittely ja ratkaisuperiaate... 1 Tehtävän määrittely... 1 Ratkaisuperiaate... 1 Ohjelman käyttöohje... 1 Syötteet ja tulosteet... 1 Ohjelman

Lisätiedot

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista. 1 Luokka Murtoluku uudelleen Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista. Sievennettäessä tarvitaan osoittajan ja nimittäjän suurin yhteinen tekijä (syt).

Lisätiedot

Sisältö. 2. Taulukot. Yleistä. Yleistä

Sisältö. 2. Taulukot. Yleistä. Yleistä Sisältö 2. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.1 2.2 Yleistä

Lisätiedot

Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys

Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys Tällä kurssilla on tutustuttu ohjelmistojen mallintamiseen oliomenetelmiä ja UML:ää käyttäen Samaan aikaan järjestetyllä kurssilla on käsitelty

Lisätiedot

18. Abstraktit tietotyypit 18.1

18. Abstraktit tietotyypit 18.1 18. Abstraktit tietotyypit 18.1 Sisällys Johdanto abstrakteihin tietotyyppeihin. Pino ja jono. Linkitetty lista. Pino linkitetyllä listalla toteutettuna. 18.2 Johdanto Javan omat tietotyypit ovat jo tuttuja:

Lisätiedot

SQL-perusteet, SELECT-, INSERT-, CREATE-lauseet

SQL-perusteet, SELECT-, INSERT-, CREATE-lauseet SQL-perusteet, SELECT-, INSERT-, CREATE-lauseet A271117, Tietokannat Teemu Saarelainen teemu.saarelainen@kyamk.fi Lähteet: Leon Atkinson: core MySQL Ari Hovi: SQL-opas TTY:n tietokantojen perusteet-kurssin

Lisätiedot

Sisältö. 22. Taulukot. Yleistä. Yleistä

Sisältö. 22. Taulukot. Yleistä. Yleistä Sisältö 22. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko metodin parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 22.1 22.2 Yleistä

Lisätiedot

KOHDELUOKAN MÄÄRITTELY

KOHDELUOKAN MÄÄRITTELY KOHDELUOKAN MÄÄRITTELY Kohdeluokka, mitä se sisältää Luokan määrittely Olion ominaisuudet eli attribuutit Olion metodit Olion luonti Olion tuhoutuminen Metodin kutsu luokan ulkopuolelta Taulukon alkiona

Lisätiedot

20. Javan omat luokat 20.1

20. Javan omat luokat 20.1 20. Javan omat luokat 20.1 Sisällys Application Programming Interface (API). Pakkaukset. Merkkijonoluokka String. Math-luokka. Kääreluokat. 20.2 Java API Java-kielen Application Programming Interface (API)

Lisätiedot

14. Poikkeukset 14.1

14. Poikkeukset 14.1 14. Poikkeukset 14.1 Sisällys Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Miten varautua poikkeukseen metodissa? Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla

Lisätiedot

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang Sisällys 20. Javan omat luokat Application Programming Interface (API). Pakkaukset. Merkkijonoluokka String. Math-luokka. Kääreluokat. 20.1 20.2 Java API Java-kielen Application Programming Interface (API)

Lisätiedot

Projekti 1 Säikeet ja kriittisen vaiheen kontrollointi javalla

Projekti 1 Säikeet ja kriittisen vaiheen kontrollointi javalla Projekti 1 Säikeet ja kriittisen vaiheen kontrollointi javalla Lasse Leino ja Marko Kahilakoski Helsingin Yliopisto Tietojenkäsittelytieteen laitos Rinnakkaisohjelmointi 18. joulukuuta 2006 Sisältö 1 Säikeet

Lisätiedot

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä LUOKAN MÄÄRITTELY Luokka, mitä se sisältää Luokan määrittely Olion ominaisuudet eli attribuutit Olion metodit Olion muodostimet ja luonti Olion tuhoutuminen Metodin kutsu luokan ulkopuolelta Olion kopioiminen

Lisätiedot

Harjoitustyö (TKO_2023)

Harjoitustyö (TKO_2023) Harjoitustyö (TKO_2023) Jyri Lehtonen (72039) (alkuperäinen 29.1.2008) päivitetty: 8.2.2008 1 Tehtävän kuvaus ja analysointi 1.1 Tehtävänanto Tee Java-appletti, joka kysyy käyttäjältä asioita Java-kielestä.

Lisätiedot

Lohdutus - tietokantadokumentti

Lohdutus - tietokantadokumentti Lohdutus - tietokantadokumentti Ohjelmiston tietokanta on toteutettu Oracle-ympäristöön, ja sitä käytetään ohjelmassa Hibernaten kautta. Tietokannan rakenne Tietokannan taulujen merkitykset Taulu Project

Lisätiedot

16. Javan omat luokat 16.1

16. Javan omat luokat 16.1 16. Javan omat luokat 16.1 Sisällys Johdanto. Object-luokka: tostring-, equals-, clone- ja getclass-metodit. Comparable-rajapinta: compareto-metodi. Vector- ja ArrayList-luokat. 16.2 Javan omat luokat

Lisätiedot

Pedacode Pikaopas. Tietokantaa hyödyntävän sovelluksen luominen

Pedacode Pikaopas. Tietokantaa hyödyntävän sovelluksen luominen Pedacode Pikaopas Tietokantaa hyödyntävän sovelluksen luominen Pikaoppaan sisältö Pikaoppaassa kuvataan, Netbeans-työkalulla luodaan uusi yksinkertainen Java DB -tietokantaa hyödyntävä sovellus. Opas kattaa

Lisätiedot

Tietorakenteet, laskuharjoitus 7,

Tietorakenteet, laskuharjoitus 7, Tietorakenteet, laskuharjoitus 7, 14.-19.3. 1. "Tira meets software engineering, osa 1" Lue luentomonisteen kalvot 233-236. Toteuta luokka Opiskelijarekisteri joka tarjoaa seuraavat palvelut: opiskelijoiden

Lisätiedot

Periytyminen (inheritance)

Periytyminen (inheritance) 1 Periytyminen (inheritance) Mitä periytyminen on? Yli- ja aliluokka Konstruktorit Get- ja set-metodi Muut metodit tostring Yksinkertainen pääohjelma 1 Mitä periytyminen on? Periytymisen avulla olemassa

Lisätiedot

582104 Ohjelmistojen mallintaminen, olioja relaatiomallinnuksen suhteesta

582104 Ohjelmistojen mallintaminen, olioja relaatiomallinnuksen suhteesta 582104 Ohjelmistojen mallintaminen, olioja relaatiomallinnuksen suhteesta 1 Tietojen pysyvyys liiketoiminnan edellytys Tällä kurssilla on keskitytty oliomenetelmiä hyödyntävään ohjelmistojen mallintamiseen

Lisätiedot

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä Matti Luukkainen 10.12.2009 Tässä esitetty esimerkki on mukaelma ja lyhennelmä Robert Martinin kirjasta Agile and Iterative Development löytyvästä

Lisätiedot

Tech Conference 28.-29.5.2015. Visual Studio 2015, C#6,.NET4.6. Heikki Raatikainen. #TechConfFI

Tech Conference 28.-29.5.2015. Visual Studio 2015, C#6,.NET4.6. Heikki Raatikainen. #TechConfFI Tech Conference 28.-29.5.2015 Visual Studio 2015, C#6,.NET4.6 Heikki Raatikainen #TechConfFI Yleistä Avoimuus Open Source ja tuki yleisesti käytetyille ei-ms työkaluille Kaikki alustat tuettuna:.net 5

Lisätiedot

Poikkeustenkäsittely

Poikkeustenkäsittely 1 Poikkeustenkäsittely Mitä poikkeustenkäsittely tarkoittaa? Poikkeuksen käsitteleminen Poikkeusluokkien hierarkia Poikkeuksen heittäminen 1 Mitä poikkeustenkäsittely tarkoittaa? Poikkeus (Exception) on

Lisätiedot

9. Periytyminen Javassa 9.1

9. Periytyminen Javassa 9.1 9. Periytyminen Javassa 9.1 Sisällys Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Metodien korvaaminen ja super-attribuutti. Attribuutin peittäminen periytymisen kautta. Rakentajat

Lisätiedot

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit Tietorakenteet ja algoritmit Taulukon edut Taulukon haitat Taulukon haittojen välttäminen Dynaamisesti linkattu lista Linkatun listan solmun määrittelytavat Lineaarisen listan toteutus dynaamisesti linkattuna

Lisätiedot

Osio 4: Graafinen käyttöliittymä

Osio 4: Graafinen käyttöliittymä Tavoite: Opiskelija tuntee käyttöliittymän suunnittelun perusteita Opiskelija tuntee Javan Swing-tekniikan perusteet Opiskelija osaa työasemakäyttöliittymän toteutuksen perusteet käyttäen Javan Swing-tekniikkaa

Lisätiedot

9. Periytyminen Javassa 9.1

9. Periytyminen Javassa 9.1 9. Periytyminen Javassa 9.1 Sisällys Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Ilmentymämetodien korvaaminen. Luokkametodien peittäminen. Super-attribuutti. Override-annotaatio.

Lisätiedot

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena Ohjelmointikielet ja -paradigmat 5op Markus Norrena Kotitehtävä 6, toteuttakaa alla olevan luokka ja attribuutit (muuttujat) Kotitehtävä 6, toteuttakaa alla olevan luokka ja attribuutit (muuttujat) Huom!

Lisätiedot

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma 1 Kompositio Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma 1 Mikä kompositio on? Tili - : String - : double 1 1 Kayttoraja

Lisätiedot

Graafisen käyttöliittymän automaattinen testaus

Graafisen käyttöliittymän automaattinen testaus Heikki-Jussi Niemi Graafisen käyttöliittymän automaattinen testaus Tietotekniikan kandidaatintutkielma 28. kesäkuuta 2012 Jyväskylän yliopisto Tietotekniikan laitos Jyväskylä Tekijä: Heikki-Jussi Niemi

Lisätiedot

CSE-A1200 Tietokannat

CSE-A1200 Tietokannat CSE-A1200 Tietokannat 29.3.2016 CSE-A1200 Tietokannat 29.3.2016 1 / 40 Oppimistavoitteet: tämän luennon jälkeen Tiedät, miten tietokannan relaatioiden (taulujen) määrittelyt kirjoitetaan SQL:llä. Osaat

Lisätiedot

Laskennallisesti Älykkäät Järjestelmät. Sumean kmeans ja kmeans algoritmien vertailu

Laskennallisesti Älykkäät Järjestelmät. Sumean kmeans ja kmeans algoritmien vertailu Laskennallisesti Älykkäät Järjestelmät Sumean kmeans ja kmeans algoritmien vertailu Annemari Auvinen (annauvi@st.jyu.fi) Anu Niemi (anniemi@st.jyu.fi) 28.5.2002 1 Tehtävän kuvaus Tehtävänämme oli verrata

Lisätiedot

Web Services tietokantaohjelmoinnin perusteet

Web Services tietokantaohjelmoinnin perusteet ASP.NET Web Services Web Services tietokantaohjelmoinnin 2 (22) Sisällys Harjoitus 1: Tietokannat ja Web Services... 3 Harjoitus 2: Windows Client... 10 Harjoitus 3: Datan päivitys TableAdapterin avulla...

Lisätiedot

Testivetoinen ohjelmistokehitys

Testivetoinen ohjelmistokehitys Testivetoinen ohjelmistokehitys Ohjelman luominen pienin askelin 1. Kirjoita testi, joka testaa ohjelmalle myöhemmin lisättävää toiminnallisuutta. 2. Suorita testi. Testin ei tule mennä läpi. Mikäli testi

Lisätiedot

Ohjelmointi 2 / 2011 Välikoe / 25.3

Ohjelmointi 2 / 2011 Välikoe / 25.3 Välikoe / 25.3 Vastaa neljään (4) tehtävään ja halutessa bonustehtäviin B1 ja/tai B2, (tuovat lisäpisteitä). Bonustehtävät saa tehdä vaikkei olisi tehnyt siihen tehtävään liittyvää tehtävää. Aikaa 4 tuntia.

Lisätiedot

Javan GUI Scratchaajalle

Javan GUI Scratchaajalle Javan GUI Scratchaajalle Tehtävä: Kasvukausi_1 Kun puutarha nyt näyttää oikealta, sitä olisi hyvä alkaa ohjelmoida toimivaksi. Tehdään aluksi istutukselle kuuntelija, jotta sitä klikkaamalla multaan voi

Lisätiedot

Salasanan vaihto uuteen / How to change password

Salasanan vaihto uuteen / How to change password Salasanan vaihto uuteen / How to change password Sisällys Salasanakäytäntö / Password policy... 2 Salasanan vaihto verkkosivulla / Change password on website... 3 Salasanan vaihto matkapuhelimella / Change

Lisätiedot

Ohjelmointi 2, välikoe

Ohjelmointi 2, välikoe Ohjelmointi 2, välikoe 21.3.2014 Vastaa neljään tehtävään kuudesta siten, että jokainen tehtävä tulee omalle konseptilleen. Mikäli vastaat useampaan kuin neljään tehtävään, pisteiden laskussa huomioidaan

Lisätiedot

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2008

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2008 Tapahtumapohjainen ohjelmointi Juha Järvensivu juha.jarvensivu@tut.fi 2008 Sisältö Tapahtumapohjainen ohjelmointi Käyttöliittymän rakenne Pääikkuna (top-level window) Lapsi-ikkuna (child window) Dialogit

Lisätiedot

15. Ohjelmoinnin tekniikkaa 15.1

15. Ohjelmoinnin tekniikkaa 15.1 15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Lueteltu tyyppi enum. Override-annotaatio. Geneerinen ohjelmointi. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien

Lisätiedot

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op Assembly ja konekieli Tietokoneen ja ohjelmiston rakenne Loogisilla piireillä ja komponenteilla rakennetaan prosessori ja muistit Prosessorin rakenne

Lisätiedot

Java-kielen perusteita

Java-kielen perusteita Java-kielen perusteita valintalauseet 1 Johdantoa kontrollirakenteisiin Tähän saakka ohjelmissa on ollut vain peräkkäisyyttä eli lauseet on suoritettu peräkkäin yksi kerrallaan Tarvitsemme myös valintaa

Lisätiedot

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto Sisällys 18. bstraktit tietotyypit Johdanto abstrakteihin tietotyyppeihin. Pino ja jono. Linkitetty lista. Pino linkitetyllä listalla toteutettuna. 18.1 18.2 Johdanto Javan omat tietotyypit ovat jo tuttuja:

Lisätiedot

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti: 1 (7) Tiedon lukeminen näppäimistöltä Scanner-luokan avulla Miten ohjelma saa käyttöönsä käyttäjän kirjoittamaa tekstiä? Järjestelmässä on olemassa ns. syöttöpuskuri näppäimistöä varten. Syöttöpuskuri

Lisätiedot

P e d a c o d e ohjelmointikoulutus verkossa

P e d a c o d e ohjelmointikoulutus verkossa P e d a c o d e ohjelmointikoulutus verkossa Java-kielen perusteet Teoria ja ohjelmointitehtävät Java-kielen perusteet 3 YLEISKATSAUS KURSSIN SISÄLTÖIHIN 10 JAVA-KIELEN PERUSTEET 10 OPISKELUN ALOITTAMINEN

Lisätiedot

Mitä poikkeuskäsittely tarkoittaa?

Mitä poikkeuskäsittely tarkoittaa? Poikkeuskäsittely Mitä poikkeuskäsittely tarkoittaa? Poikkeuskäsittelyluokkien hierakkia Poikkeuksen sieppaaminen Mihin järjestykseen try-catch-lauseen ExceptionType-poikkeukset laitetaan? Poikkeuksen

Lisätiedot

Javascript 2: Ohjelmointikielen ominaisuudet. Jaana Holvikivi Metropolia

Javascript 2: Ohjelmointikielen ominaisuudet. Jaana Holvikivi Metropolia Javascript 2: Ohjelmointikielen ominaisuudet Jaana Holvikivi Metropolia HTML - sivun rakenne ja osiot HTML HEAD STYLE SCRIPT STYLEsheet Javascript file BODY Javascript

Lisätiedot

TIETORAKENTEET JA ALGORITMIT

TIETORAKENTEET JA ALGORITMIT TIETORAKENTEET JA ALGORITMIT Timo Harju 1999-2004 1 typedef link List; /* Vaihtoehtoisia nimiä */ typedef link Stack; /* nodepointterille */ typedef link Queue typedef struct node Node; /* itse nodelle

Lisätiedot

RINNAKKAINEN OHJELMOINTI A,

RINNAKKAINEN OHJELMOINTI A, RINNAKKAINEN OHJELMOINTI 815301A, 18.6.2005 1. Vastaa lyhyesti (2p kustakin): a) Mitkä ovat rinnakkaisen ohjelman oikeellisuuskriteerit? b) Mitä tarkoittaa laiska säikeen luominen? c) Mitä ovat kohtaaminen

Lisätiedot

Osio 4: Graafinen käyttöliittymä

Osio 4: Graafinen käyttöliittymä Javan Swing-tekniikan perusteet: Muistutus: Tarvitset seuraavia komponentteja harjoituksissa: otsikkoteksti (label) muokkausruutu (text field) komentopainike (button) yhdistelmäruutu (combo box) paneeli

Lisätiedot