Skip to content
Snippets Groups Projects
Commit aa300df6 authored by Vesa Lappalainen's avatar Vesa Lappalainen :bicyclist:
Browse files

Vaihe 8.2 - Tietueet rajapinta ja taulukosta muokkaus

parent eef5eda8
Branches tyo8.2
Tags vaihe8.2
No related merge requests found
Showing
with 2118 additions and 57 deletions
......@@ -10,14 +10,8 @@
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>
2|2|Pitsin nypläys|1937|48
3|2|Pitsin nypläys|1952|12
7|4|Pitsin nypläys|1960|56
8|4|Susiansat|1961|12
9|2|Possujen jahtaaminen|1955|30
10|2|Kelmien kerho|1954|2
1|1|kalastus|1955|20
2|1|laiskottelu|1950|20
3|1|työn pakoilu|1952|40
8|4|susiansojen rakentaminen|1956|15
9|2|possujen jahtaaminen|1954|20
10|2|kelmien kerho|1962|2
12|5|Rahan keruu|1923|45
13|5|Nuukailu|1922|30
14|6|Sudenpennut|1958|8
15|6|Koulun välttely|1956|20
16|5|Pennin venytys|1921|4
Kelmien kerho ry
4
5
1|Ankka Aku|010245-123U|Paratiisitie 13|12345|ANKKALINNA|12-12324|||0|0.00|0.00|Velkaa Roopelle
2|Susi Sepe|020347-123T||12555|Takametsä||||0|0.00|0.00|
4|Ponteva Veli|030455-3333||12555|Takametsä||||0|0.00|0.00|porukan fiksuin
5|Ankka Roope|121212-121D|Rahasäiliö|77777|RAHASÄILIÖ|1234|||0|0.00|0.00|
\ No newline at end of file
5|Ankka Roope|121212-121D|Rahasäiliö|77777|RAHASÄILIÖ|1234|||0|0.00|0.00|
6|Ankka Lupu||||||||0|0.00|0.00|
No preview for this file type
......@@ -11,6 +11,8 @@ import java.util.Collection;
import java.util.List;
import java.util.ResourceBundle;
import javax.swing.SwingConstants;
import fi.jyu.mit.fxgui.ComboBoxChooser;
import fi.jyu.mit.fxgui.Dialogs;
import fi.jyu.mit.fxgui.ListChooser;
......@@ -30,7 +32,7 @@ import javafx.scene.layout.GridPane;
import kerho.Harrastus;
import kerho.Jasen;
import kerho.Kerho;
import kerho.SailoException;
import kanta.SailoException;
/**
* Luokka kerhon käyttöliittymän tapahtumien hoitamiseksi.
......@@ -167,17 +169,36 @@ public class KerhoGUIController implements Initializable {
for (int i=0, k=eka; k<lkm; i++, k++) headings[i] = apuharrastus.getKysymys(k);
tableHarrastukset.initTable(headings);
tableHarrastukset.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
tableHarrastukset.setEditable(false);
// tableHarrastukset.setEditable(false);
for (int i=0, k=apuharrastus.ekaKentta(); k < apuharrastus.getKenttia(); i++, k++) {
int pos = apuharrastus.getKentta(k).getSijainti();
tableHarrastukset.setAlignment(i, pos);
if ( pos == SwingConstants.RIGHT ) tableHarrastukset.setColumnWidth(i, 50);
}
// kentän tekstit, lajitteluehdot ja muokkaus sekä double click kuuntelu
tableHarrastukset.setPlaceholder(new Label("Ei vielä harrastuksia"));
// Tämä on vielä huono, ei automaattisesti muutu jos kenttiä muutetaan.
tableHarrastukset.setColumnSortOrderNumber(1);
tableHarrastukset.setColumnSortOrderNumber(2);
tableHarrastukset.setColumnWidth(1, 60);
tableHarrastukset.setColumnWidth(2, 60);
tableHarrastukset.setOnCellString( (g, harrastus, defValue, r, c) -> harrastus.anna(c+harrastus.ekaKentta()) );
tableHarrastukset.setOnCellValue( (g, harrastus, defValue, r, c) -> harrastus.getAvain(c+harrastus.ekaKentta()) );
tableHarrastukset.setOnGridLiveEdit((g, harrastus, defValue, r, c, edit) -> {
String virhe = harrastus.aseta(c+harrastus.ekaKentta(), defValue);
if ( virhe == null ) {
edit.setStyle(null);
kerho.setHarrastusMuutos();
Dialogs.setToolTipText(edit,"");
} else {
edit.setStyle("-fx-background-color: red");
Dialogs.setToolTipText(edit,virhe);
}
return defValue;
});
tableHarrastukset.setOnMouseClicked( e -> { if ( e.getClickCount() > 1 ) muokkaaHarrastusta(); } );
tableHarrastukset.setOnKeyPressed( e -> {if ( e.getCode() == KeyCode.F2 ) muokkaaHarrastusta();});
tableHarrastukset.setOnMouseClicked( e -> { if ( e.getClickCount() == 2 ) muokkaaHarrastusta(); } );
Platform.runLater(()-> hakuehto.requestFocus());
}
......@@ -278,7 +299,7 @@ public class KerhoGUIController implements Initializable {
if ( kohdalla != null ) jnro = kohdalla.getTunnusNro();
}
int k = cbKentat.getSelectionModel().getSelectedIndex() + apujasen.ekaKentta();
int k = cbKentat.getSelectedIndex() + apujasen.ekaKentta();
String ehto = hakuehto.getText();
if (ehto.indexOf('*') < 0) ehto = "*" + ehto + "*";
......@@ -307,7 +328,7 @@ public class KerhoGUIController implements Initializable {
protected void uusiJasen() {
try {
Jasen uusi = new Jasen();
uusi = TietueDialogController.kysyTietue(null, uusi, 1);
uusi = TietueDialogController.kysyTietue(null, uusi, 1, "Uusi jäsen");
if ( uusi == null ) return;
uusi.rekisteroi();
kerho.lisaa(uusi);
......@@ -326,23 +347,13 @@ public class KerhoGUIController implements Initializable {
try {
List<Harrastus> harrastukset = kerho.annaHarrastukset(jasen);
if ( harrastukset.size() == 0 ) return;
for (Harrastus har: harrastukset)
naytaHarrastus(har);
tableHarrastukset.add(harrastukset);
} catch (SailoException e) {
naytaVirhe(e.getMessage());
}
}
private void naytaHarrastus(Harrastus har) {
int kenttia = har.getKenttia();
String[] rivi = new String[kenttia-har.ekaKentta()];
for (int i=0, k=har.ekaKentta(); k < kenttia; i++, k++)
rivi[i] = har.anna(k);
tableHarrastukset.add(har,rivi);
}
/**
* Tekee uuden tyhjän harrastuksen editointia varten
*/
......@@ -350,12 +361,12 @@ public class KerhoGUIController implements Initializable {
if ( jasenKohdalla == null ) return;
try {
Harrastus uusi = new Harrastus(jasenKohdalla.getTunnusNro());
uusi = TietueDialogController.kysyTietue(null, uusi, 0);
uusi = TietueDialogController.kysyTietue(null, uusi, 0, "Uusi harrastus");
if ( uusi == null ) return;
uusi.rekisteroi();
kerho.lisaa(uusi);
naytaHarrastukset(jasenKohdalla);
tableHarrastukset.selectRow(1000); // järjestetään viimeinen rivi valituksi
tableHarrastukset.selectRow(1000); // järjestetään viimeinen rivi valituksi
} catch (SailoException e) {
Dialogs.showMessageDialog("Lisääminen epäonnistui: " + e.getMessage());
}
......@@ -369,9 +380,9 @@ public class KerhoGUIController implements Initializable {
if ( har == null ) return;
int k = tableHarrastukset.getColumnNr()+har.ekaKentta();
try {
har = TietueDialogController.kysyTietue(null, har.clone(), k);
har = TietueDialogController.kysyTietue(null, har.clone(), k, "Harrastus");
if ( har == null ) return;
kerho.korvaaTaiLisaa(har);
kerho.lisaa(har);
naytaHarrastukset(jasenKohdalla);
tableHarrastukset.selectRow(r); // järjestetään sama rivi takaisin valituksi
} catch (CloneNotSupportedException e) { /* clone on tehty */
......@@ -385,7 +396,7 @@ public class KerhoGUIController implements Initializable {
if ( jasenKohdalla == null ) return;
try {
Jasen jasen;
jasen = TietueDialogController.kysyTietue(null, jasenKohdalla.clone(), k);
jasen = TietueDialogController.kysyTietue(null, jasenKohdalla.clone(), k, "Jäsen");
if ( jasen == null ) return;
kerho.korvaaTaiLisaa(jasen);
hae(jasen.getTunnusNro());
......
......@@ -42,6 +42,7 @@ public class TietueDialogController<TYPE extends Tietue> implements ModalControl
return;
}
ModalController.closeStage(labelVirhe);
palautus = tietueKohdalla;
}
......@@ -52,6 +53,7 @@ public class TietueDialogController<TYPE extends Tietue> implements ModalControl
// ========================================================
private TYPE tietueKohdalla;
private TYPE palautus = null;
private TextField[] edits;
private int kentta = 0;
......@@ -102,6 +104,14 @@ public class TietueDialogController<TYPE extends Tietue> implements ModalControl
if ( edit != null )
edit.setOnKeyReleased( e -> kasitteleMuutosTietueeseen((TextField)(e.getSource())));
// panelTietue.setFitToHeight(true);
ModalController.getStage(labelVirhe).setOnCloseRequest((event) -> {
if ( tietueKohdalla != null && tietueKohdalla.anna(tietueKohdalla.ekaKentta()).trim().equals("") ) {
naytaVirhe("Ei saa olla tyhjä");
event.consume();
return;
}
palautus = tietueKohdalla;
});
}
......@@ -115,7 +125,7 @@ public class TietueDialogController<TYPE extends Tietue> implements ModalControl
@Override
public TYPE getResult() {
return tietueKohdalla;
return palautus;
}
......@@ -185,12 +195,13 @@ public class TietueDialogController<TYPE extends Tietue> implements ModalControl
* @param modalityStage mille ollaan modaalisia, null = sovellukselle
* @param oletus mitä dataan näytetään oletuksena
* @param kentta mikä kenttä saa fokuksen kun näytetään
* @param otsikko Mikä otsikko näytetään dialogiin
* @return null jos painetaan Cancel, muuten täytetty tietue
*/
public static<TYPE extends Tietue> TYPE kysyTietue(Stage modalityStage, TYPE oletus, int kentta) {
public static<TYPE extends Tietue> TYPE kysyTietue(Stage modalityStage, TYPE oletus, int kentta, String otsikko) {
return ModalController.<TYPE, TietueDialogController<TYPE>>showModal(
TietueDialogController.class.getResource("TietueDialogView.fxml"),
"Kerho",
otsikko,
modalityStage, oletus,
ctrl -> ctrl.setKentta(kentta)
);
......
package fxKerho;
import fi.jyu.mit.fxgui.Dialogs;
import fi.jyu.mit.fxgui.ModalController;
import fi.jyu.mit.fxgui.ModalControllerInterface;
import javafx.fxml.FXML;
......
......@@ -77,6 +77,19 @@ public class DoubleKentta extends PerusKentta {
}
/**
* @return vertailee kahta oliota keskenään
*/
@Override
public int compareTo(Kentta k) {
if ( !(k instanceof DoubleKentta) ) return super.compareTo(k);
double ero = getValue() - ((DoubleKentta)k).getValue();
if ( ero < 0 ) return -1;
if ( ero > 0 ) return 1;
return 0;
}
/**
* @return vaakasuuntainen sijainti kentälle
*/
......
package kanta;
import java.util.HashMap;
/**
* Kenttä ykiskätteisen id-numeron hoitamiseksi
* @author vesal
* @version 31.3.2008
*
*/
public class IdKentta extends IntKentta {
/* rakenne, jossa tallessa kaikkien seuraavien numeroiden arvot */
private static final HashMap<String,IntKentta> seuraavatNumerot = new HashMap<>();
private IntKentta seuraavaNumero; // sama viite kaikilla saman tunnisteen kentillä
/**
* Alustetaan kenttä kysymyksellä ja seuraavan numeron tunnisteella
* @param kysymys joka näytetään kenttää kysyttäessä.
* @param tunniste saman tunnisteen alle luodut numerot pidetään samoina
* @example
* <pre name="test">
* IdKentta id1 = new IdKentta("id1","jäsenId__testIdKentta");
* IdKentta id2 = new IdKentta("id1","jäsenId__testIdKentta");
* IdKentta id3 = new IdKentta("id3","harrastusId__testIdKentta");
* id1.rekisteroi();
* id2.rekisteroi();
* id3.rekisteroi();
* id1.getValue() === 1;
* id2.getValue() === 2;
* id3.getValue() === 1;
* </pre>
*/
public IdKentta(String kysymys,String tunniste) {
super(kysymys);
IntKentta nro = seuraavatNumerot.get(tunniste);
if ( nro == null ) {
nro = new IntKentta(tunniste);
nro.setValue(1);
}
seuraavaNumero = nro;
seuraavatNumerot.put(tunniste, nro);
}
/**
* @return tämän kentän seuraavan numeron tunniste
* @example
* <pre name="test">
* IdKentta id1 = new IdKentta("id1","jäsenId__testTunniste");
* id1.getTunniste() === "jäsenId__testTunniste";
* </pre>
*/
public String getTunniste() {
return seuraavaNumero.getKysymys();
}
/**
* Asetetaan kentän arvo kokonaislukuna. Jos arvo on isompi kuin
* seuraava numero, niin seuraava numero laitetaan tätä suuremmaksi.
* @param value asetettava kokonaislukuarvo
* @example
* <pre name="test">
* IdKentta id1 = new IdKentta("id1","jäsenId__testSetValue");
* id1.setValue(20);
* id1.getSeuraavaNro() === 21;
* id1 = new IdKentta("id1","jäsenId__testSetValue");
* id1.aseta("33");
* id1.getSeuraavaNro() === 34;
* </pre>
*/
@Override
public void setValue(int value) {
if ( value >= seuraavaNumero.getValue() ) seuraavaNumero.setValue(value+1);
super.setValue(value);
}
/**
* @return tähän id:hen liittyvä seuraava numero
* <pre name="test">
* IdKentta id1 = new IdKentta("id1","jäsenId__testSeuraavaNro");
* id1.getSeuraavaNro() === 1;
* id1.setValue(20);
* id1.getSeuraavaNro() === 21;
* </pre>
*/
public int getSeuraavaNro() {
return seuraavaNumero.getValue();
}
/**
* Antaa kentälle seuraavan vapaan numeron
* @return kentälle annettu arvo
* <pre name="test">
* IdKentta id1 = new IdKentta("id1","jäsenId__testRekisteroi");
* id1.rekisteroi();
* id1.getValue() === 1;
* id1.rekisteroi(); // ei vaikuta kun numero on jo saatu
* id1.getValue() === 1;
* </pre>
*/
public int rekisteroi() {
if ( getValue() != 0 ) return getValue();
setValue(getSeuraavaNro()); // hoitaa seuraavan numeron kasvatuksen
return getValue();
}
}
......@@ -18,20 +18,20 @@ public class IntKentta extends PerusKentta {
*/
public IntKentta(String kysymys) { super(kysymys); }
/**
* @return kentän arvo kokonaislukuna
*/
public int getValue() { return arvo; }
/**
* Asetetaan kentän arvo kokonaislukuna
* @param value asetettava kokonaislukuarvo
*/
public void setValue(int value) { arvo = value; }
/**
* Kentän arvo merkkijonona.
* @return kenttä merkkijonona
......@@ -67,7 +67,7 @@ public class IntKentta extends PerusKentta {
public String aseta(String jono) {
StringBuffer sb = new StringBuffer(jono);
try {
this.arvo = Mjonot.erotaEx(sb,' ',0);
setValue(Mjonot.erotaEx(sb,' ',0));
return null;
}
catch (NumberFormatException ex) {
......@@ -112,6 +112,16 @@ public class IntKentta extends PerusKentta {
}
/**
* @return vertailee kahta oliota keskenään
*/
@Override
public int compareTo(Kentta k) {
if ( !(k instanceof IntKentta) ) return super.compareTo(k);
return getValue() - ((IntKentta)k).getValue();
}
/**
* @return vaakasuuntainen sijainti kentälle
*/
......
......@@ -31,6 +31,12 @@ public interface Kentta extends Cloneable, Comparable<Kentta>{
*/
String getKysymys();
/**
* @param kysymys asetettava kysymyksen teksti
*/
void setKysymys(String kysymys);
/**
* Asettaa kentän sisällön ottamalla tiedot
* merkkijonosta.
......@@ -62,7 +68,7 @@ public interface Kentta extends Cloneable, Comparable<Kentta>{
/**
* @return syväkopio kentästä, tehtävä jokaiseen luokkaa toimivaksi
* @throws CloneNotSupportedException
* @throws CloneNotSupportedException mikäli ei tue cloonausta
* @example
* <pre name="test">
* #THROWS CloneNotSupportedException
......
package kanta;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.regex.Pattern;
/**
* Luokka merkistökoodauksen hoitamiseksi
* Käyttö
* <pre>
* - luo koodaus-olio attribuutiksi:
* private Koodaus koodus = new Koodaus(); // tulee AUTO
* - Ennen tiedoston lukemista tutki koodaus (jos et tiedä sitä varmasti):
* if ( !koodaus.tutkiKoodaus(getTiedostonNimi()) )
* throw new SailoException("Tiedosto " + getTiedostonNimi() + " ei aukea");
* - tämä toimii oletuksilla missä koodaus on AUTO
* - kun avaat tiedoston, avaa se lukemista varten:
* try ( BufferedReader fi = new BufferedReader(new InputStreamReader(
* new FileInputStream(getTiedostonNimi()), koodaus.getKoodaus())) ) {
* - ja vastaavasti kirjoittamista varten:
* try ( PrintWriter fo = new PrintWriter(new OutputStreamWriter(
* new FileOutputStream(ftied.getCanonicalPath()), koodaus.getKoodaus())) ) {
* </pre>
* @author vesal
* @version 15.6.2013
*/
public class Koodaus {
// private String koodaus = "UTF-8";
private String koodaus = "AUTO";
private String oletuskoodaus = "ISO-8859-15";
private String arvauskoodaus = oletuskoodaus;
/**
* Alustetaan oletuskoodauksella
*/
public Koodaus() {
// ei mitään
}
/**
* @param koodaus asetettava koodaus
*/
public Koodaus(String koodaus) {
this.koodaus = koodaus;
}
/**
* @return onko autommaattinen koodaus
* @example
* <pre name="test">
* Koodaus koodaus = new Koodaus();
* koodaus.isAuto() === true;
* </pre>
*/
public boolean isAuto() {
return koodaus.equalsIgnoreCase("AUTO");
}
/**
* Asetetaan automaattinen koodaus
*/
public void setAuto() {
koodaus = "AUTO";
}
/**
* @return käytetty koodaus, jos AUTO, niin viimeisin tunnistettu
*/
public String getKoodaus() {
if ( isAuto() ) return arvauskoodaus;
return koodaus;
}
/**
* Koodaus voi olla esim:
* <pre>
* UTF-8
* ISO-8859-15
* AUTO (oletus, lukee tiedoston ja etsii sieltä kumpiako skandeja on käytetty.)
* Jos ennen kirjoitusta ei lueta mitään, käytetään ISO-8859-15
* </pre>
* @param koodaus asetteava koodaus
*/
public void setKoodaus(String koodaus) {
this.koodaus = koodaus;
}
// Ä Ö Å ä ö å Ü ü €
private final static String[] UTF8Chars = {"Ä","Ö","Å","À","ö","Ã¥","Ü","ÃŒ","€"};
private final static Pattern skandit = Pattern.compile(".*[ÅÄÖÜåäöü€].*");
/**
* Yritetään arvata tiedoston merkistökoodaus
* @param tied tiedoston nimi
* @return tiedoston merkistö. null = tiedostoa ei voi lukea
*/
public String arvaaKoodaus(String tied) {
String arvaus = "ISO-8859-15";
try ( BufferedReader fi = new BufferedReader(new InputStreamReader(
new FileInputStream(tied), "ISO-8859-1")) ) {
String rivi;
while ((rivi = fi.readLine()) != null) {
for ( String s : UTF8Chars ) {
if ( rivi.indexOf(s) >= 0 ) { arvaus = "UTF-8"; break; }
if ( skandit.matcher(s).matches() ) break; // ISO skandi löytyi
}
}
arvauskoodaus = arvaus;
return arvauskoodaus;
} catch ( FileNotFoundException e ) {
return null;
} catch (IOException e) {
return null;
}
}
/**
* Tutkii onko koodaus asetettu muuksi kuin AUTOksi. Jos on palautetaan true.
* Jos on AUTO, tutkitaan tiedostoa ja jos koodausta ei voida selvittää, niin palautetaan false.
* Muuten true
* @param tiedostonNimi tiedosto joka tutkitaan jos koodaus on AUTO
* @return true jos koodaus on selvitetty, muuten false
*/
public boolean tutkiKoodaus(String tiedostonNimi) {
if ( isAuto() ) {
String arvaus = arvaaKoodaus(tiedostonNimi);
return arvaus != null;
}
return true;
}
}
......@@ -10,8 +10,8 @@ import javax.swing.SwingConstants;
* @version 1.0, 22.02.2003
* @version 1.3, 02.04.2003
*/
public abstract class PerusKentta implements Kentta { // NOPMD
private final String kysymys;
public abstract class PerusKentta implements Kentta {
private String kysymys;
/**
* Yleisen tarkistajan viite
......@@ -46,10 +46,20 @@ public abstract class PerusKentta implements Kentta { // NOPMD
* @see kanta.Kentta#getKysymys()
*/
@Override
public String getKysymys() { // NOPMD (jostain syystä luulee abstraktiksi metodiksi)
public String getKysymys() {
return kysymys;
}
/**
* @param kysymys asetettava kysymyksen teksti
*/
@Override
public void setKysymys(String kysymys) {
this.kysymys = kysymys;
}
/**
* @param jono josta otetaan kentän arvo
* @see kanta.Kentta#aseta(java.lang.String)
......@@ -68,7 +78,18 @@ public abstract class PerusKentta implements Kentta { // NOPMD
/**
* @return syväkopio oliosta
* @return syväkopio kentästä, tehtävä jokaiseen luokkaa toimivaksi
* @throws CloneNotSupportedException mikäli ei tue kloonausta
* @example
* <pre name="test">
* #THROWS CloneNotSupportedException
* IntKentta k1 = new IntKentta("määrä");
* k1.aseta("12");
* IntKentta k2 = k1.clone();
* k1.toString() === k2.toString();
* k1.aseta("5");
* k1.toString() == k2.toString() === false;
* </pre>
*/
@Override
public Kentta clone() throws CloneNotSupportedException {
......
package kanta;
import java.io.*;
import fi.jyu.mit.ohj2.Mjonot;
/**
* Tietue joka osaa mm. itse huolehtia tunnus_nro:staan.
* Oikean tietueen tekemiseksi tämä on perittävä ja lisättävä mm.
* Kentta-taulukko. 0's kenttä on aina id-numero.
*
* @author Vesa Lappalainen
* @version 1.0, 22.02.2003
* @version 1.1, 23.02.2012
* @example
* <pre name="testJAVA">
* public static class Harrastus extends PohjaTietue {
* public Harrastus() {
* super(new Kentta[]{
* new IdKentta("id","harrastusID_testPerustietue"),
* new IntKentta("jäsenId"),
* new JonoKentta("ala"),
* new IntKentta("aloitusvuosi"),
* new IntKentta("h/vko")
* },2);
* }
* @Override public Harrastus clone() throws CloneNotSupportedException {return (Harrastus)super.clone(); }
* public int getJasenNro() { return ((IntKentta)getKentta(1)).getValue(); }
* }
* </pre>
*/
public abstract class PerusTietue implements Cloneable,Tietue {
/**
* @param i seuraava id-numero jota tästä lähiten käytetään
*/
@SuppressWarnings("unused")
protected void setSeuraavaNro(int i) {
// perusmallissa ei tee mitään
}
/**
* Asetetaan kentät. Käytetään lähinnä kloonaamisessa
* @param kentat uudet kentät tietueelle
*/
abstract protected void setKentat(Kentta[] kentat);
/**
* @return tietueen kenttien lukumäärä
* @example
* <pre name="test">
* Harrastus har = new Harrastus();
* har.getKenttia() === 5;
* </pre>
*/
@Override
public int getKenttia() {
return getKentat().length;
}
/**
* @return ensimmäinen käyttäjän syötettävän kentän indeksi
* @example
* <pre name="test">
* Harrastus har = new Harrastus();
* har.ekaKentta() === 2;
* </pre>
*/
@Override
public int ekaKentta() {
return 1;
}
/**
* @param k Mikä kenttä halutaan
* @return k.s kenttä
* @example
* <pre name="test">
* Harrastus har = new Harrastus();
* har.parse(" 2 | 10 | Kalastus | 1949 | 22 t ");
* IntKentta kentta = (IntKentta)har.getKentta(3);
* kentta.getValue() === 1949;
* </pre>
*/
@Override
public Kentta getKentta(int k) {
return getKentat()[k];
}
/**
* @param k minkä kentän kysymys halutaan
* @return valitun kentän kysymysteksti
* @example
* <pre name="test">
* Harrastus har = new Harrastus();
* har.getKysymys(2) === "ala";
* </pre>
*/
@Override
public String getKysymys(int k) {
try {
return getKentta(k).getKysymys();
} catch (Exception ex) {
return "Ääliö";
}
}
/**
* @param k minkä kentän kysymys halutaan asettaa
* @param kysymys kentän kysymys
* @example
* <pre name="test">
* Harrastus har = new Harrastus();
* har.getKysymys(2) === "ala";
* har.setKysymys(2,"aihe");
* har.getKysymys(2) === "aihe";
* </pre>
*/
@Override
public void setKysymys(int k, String kysymys) {
try {
getKentta(k).setKysymys(kysymys);
} catch (Exception ex) {
// ei käsitellä
}
}
/**
* @return kaikkien näytettävien kysymysten otsikot merkkijonotaulukkona
* @example
* <pre name="test">
* #import java.util.Arrays;
* Harrastus har = new Harrastus();
* Arrays.toString(har.getOtsikot()) =R= "\\[ala, aloitusvuosi, h/vko.*";
* </pre>
*/
@Override
public String[] getOtsikot() {
int n = getKenttia() - ekaKentta();
String[] otsikot = new String[n];
for (int i=0,k=ekaKentta(); i<n; i++,k++)
otsikot[i] = getKysymys(k);
return otsikot;
}
/**
* @param k Minkä kentän sisältö halutaan
* @return valitun kentän sisältö
* @example
* <pre name="test">
* Harrastus har = new Harrastus();
* har.parse(" 2 | 10 | Kalastus | 1949 | 22 t ");
* har.anna(0) === "2";
* har.anna(1) === "10";
* har.anna(2) === "Kalastus";
* har.anna(3) === "1949";
* har.anna(4) === "22";
* </pre>
*/
@Override
public String anna(int k) {
try {
return getKentta(k).toString();
} catch (Exception ex) {
return "";
}
}
/**
* Kentän sisältö kokonaislukuna. Jos ei ole IntKentta,
* niin -1.
* @param k Minkä kentän sisältö halutaan
* @return valitun kentän sisältö kokonaislukuna.
* @example
* <pre name="test">
* Harrastus har = new Harrastus();
* har.parse(" 2 | 10 | Kalastus | 1949 | 22 t ");
* har.annaInt(0) === 2;
* har.annaInt(1) === 10;
* har.annaInt(2) === -1;
* har.annaInt(3) === 1949;
* har.annaInt(4) === 22;
* </pre>
*/
@Override
public int annaInt(int k) {
Kentta kentta = getKentta(k);
if ( !(kentta instanceof IntKentta) ) return -1;
return ((IntKentta)kentta).getValue();
}
/**
* Asetetaan valitun kentän sisältö. Mikäli asettaminen onnistuu,
* palautetaan null, muutoin virheteksti.
* @param k minkä kentän sisältö asetetaan
* @param s asetettava sisältö merkkijonona
* @return null jos ok, muuten virheteksti
* @example
* <pre name="test">
* Harrastus har = new Harrastus();
* har.aseta(3,"kissa") === "aloitusvuosi: Ei kokonaisluku (kissa)";
* har.aseta(3,"1940") === null;
* har.aseta(4,"kissa") === "h/vko: Ei kokonaisluku (kissa)";
* har.aseta(4,"20") === null;
* </pre>
*/
@Override
public String aseta(int k, String s) {
try {
String virhe = getKentta(k).aseta(s.trim());
if ( virhe == null && k == 0 ) setTunnusNro(getTunnusNro());
if ( virhe == null ) return virhe;
return getKysymys(k) +": " + virhe;
} catch (Exception ex) {
return "Virhe: " + ex.getMessage();
}
}
/**
* Tehdään identtinen klooni tietueesta
* @return Object kloonattu tietue
* @example
* <pre name="test">
* #THROWS CloneNotSupportedException
* Harrastus har = new Harrastus();
* har.parse(" 2 | 10 | Kalastus | 1949 | 22 t ");
* Object kopio = har.clone();
* kopio.toString() === har.toString();
* har.parse(" 1 | 11 | Uinti | 1949 | 22 t ");
* kopio.toString().equals(har.toString()) === false;
* kopio instanceof Harrastus === true;
* </pre>
*/
@Override
public Tietue clone() throws CloneNotSupportedException {
PerusTietue uusi;
uusi = (PerusTietue)super.clone();
uusi.setKentat(getKentat().clone());
for (int k = 0; k < getKenttia(); k++)
uusi.getKentat()[k] = getKentta(k).clone();
return uusi;
}
/**
* Tulostetaan tietueen tiedot
* @param out tietovirta johon tulostetaan
*/
@Override
public void tulosta(PrintWriter out) {
String erotin = "";
for (int k=ekaKentta(); k<getKenttia(); k++) {
out.print(erotin + anna(k));
erotin = " ";
}
out.println();
}
/**
* Tulostetaan tietueen tiedot
* @param os tietovirta johon tulostetaan
*/
@Override
public void tulosta(OutputStream os) {
tulosta(new PrintWriter(os, true)); // ilman autoflushia ei mitään
// tulostu!
}
/**
* Tulostetaan tietueen tiedot
* @param out tietovirta johon tulostetaan
*/
@Override
public void tulosta(PrintStream out) {
tulosta(new PrintWriter(out, true)); // ilman autoflushia ei mitään
// tulostu!
}
/**
* Antaa tietueelle seuraavan rekisterinumeron
* jollei numeroa jo ole
* @return tietueen uusi tunnus_nro
* @example
* <pre name="test">
* Harrastus pitsi1 = new Harrastus();
* pitsi1.getTunnusNro() === 0;
* pitsi1.rekisteroi();
* int n1 = pitsi1.getTunnusNro();
* Harrastus pitsi2 = new Harrastus();
* pitsi2.rekisteroi() === n1 + 1;
* int n2 = pitsi2.getTunnusNro();
* n1 === n2-1;
* pitsi1.rekisteroi();
* pitsi1.getTunnusNro() === n1;
* </pre>
*/
@Override
public int rekisteroi() {
return setTunnusNro(getSeuraavaNro());
}
/**
* Palautetaan tietueen oma id
* @return tietueen id
* @example
* <pre name="test">
* Harrastus harrastus = new Harrastus();
* harrastus.parse(" 2 | 10 | Kalastus | 1949 | 22 t ");
* harrastus.getTunnusNro() === 2;
* </pre>
*/
@Override
public int getTunnusNro() {
return ((IntKentta)(getKentta(0))).getValue();
}
/**
* Asettaa tunnusnumeron ja samalla varmistaa että
* seuraava numero on aina suurempi kuin tähän mennessä suurin.
* @param nr asetettava tunnusnumero
*/
private int setTunnusNro(int nr) {
IntKentta k = ((IntKentta)(getKentta(0)));
k.setValue(nr);
if (nr >= getSeuraavaNro()) setSeuraavaNro(nr + 1);
return k.getValue();
}
/**
* Palauttaa tietueen tiedot merkkijonona jonka voi tallentaa tiedostoon.
* @return tietue tolppaeroteltuna merkkijonona
* @example
* <pre name="test">
* Harrastus harrastus = new Harrastus();
* harrastus.parse(" 2 | 10 | Kalastus | 1949 | 22 t ");
* harrastus.toString() =R= "2\\|10\\|Kalastus\\|1949\\|22.*";
* </pre>
*/
@Override
public String toString() {
StringBuffer sb = new StringBuffer("");
String erotin = "";
for (int k = 0; k < getKenttia(); k++) {
sb.append(erotin);
sb.append(anna(k));
erotin = "|";
}
return sb.toString();
}
/**
* Selvittää tietueen tiedot | erotellusta merkkijonosta.
* Pitää huolen että seuraavaNro on suurempi kuin tuleva tunnusnro.
* @param rivi josta tietueen tiedot otetaan
* @example
* <pre name="test">
* Harrastus harrastus = new Harrastus();
* harrastus.parse(" 2 | 10 | Kalastus | 1949 | 22 t ");
* harrastus.getJasenNro() === 10;
* harrastus.toString() =R= "2\\|10\\|Kalastus\\|1949\\|22.*";
*
* harrastus.rekisteroi(); // ei vaikuta koska tunnusnumero on jo
* int n = harrastus.getTunnusNro();
* n === 2;
* harrastus.parse(""+(n+20));
* harrastus.toString() =R= "" + (n+20) + "\\|10\\|\\|1949\\|22.*";
* harrastus = new Harrastus(); // tällä ei ole numeroa
* harrastus.rekisteroi(); // tämä saa edellistä yhtä suuremman
* harrastus.getTunnusNro() === n+20+1;
* </pre>
*/
@Override
public void parse(String rivi) {
StringBuffer sb = new StringBuffer(rivi);
for (int k = 0; k < getKenttia(); k++)
aseta(k, Mjonot.erota(sb, '|'));
}
/**
* Antaa k:n kentän sisällön avain-merkkijonona
* jonka perusteella voi lajitella
* @param k monenenko kentän sisältö palautetaan
* @return kentän sisältö merkkijonona
*
* @example
* <pre name="test">
* Harrastus har = new Harrastus();
* har.parse(" 2 | 10 | Kalastus | 1949 | 22 t ");
* har.getAvain(0) === " 2";
* har.getAvain(1) === " 10";
* har.getAvain(2) === "KALASTUS";
* har.getAvain(20) === "";
* </pre>
*/
@Override
public String getAvain(int k) {
try {
return getKentta(k).getAvain();
} catch (Exception ex) {
return "";
}
}
/**
* Tutkii onko jäsenen tiedot samat kuin parametrina tuodun jäsenen tiedot
* @param obj tietue johon verrataan
* @return true jos kaikki tiedot samat, false muuten
* @example
* <pre name="test">
* Harrastus har1 = new Harrastus();
* har1.parse(" 2 | 10 | Kalastus | 1949 | 22 t ");
* Harrastus har2 = new Harrastus();
* har2.parse(" 2 | 10 | Kalastus | 1949 | 22 t ");
* Harrastus har3 = new Harrastus();
* har3.parse(" 3 | 12 | Kalastus | 1949 | 22 t ");
*
* har1.equals(har2) === true;
* har2.equals(har1) === true;
* har1.equals(har3) === false;
* har3.equals(har2) === false;
* har3.equals(null) === false;
* </pre>
*/
@Override
public boolean equals(Object obj) {
if ( !(obj instanceof Tietue) ) return false;
Tietue tietue = (Tietue)obj;
for (int k = 0; k < getKenttia(); k++)
if ( !anna(k).equals(tietue.anna(k)) ) return false;
return true;
}
@Override
public int hashCode() {
int hc = 0;
for (int k = 0; k < getKenttia(); k++)
hc += anna(k).hashCode();
return hc;
}
/**
* @param k mistä kentästä
* @return vaakasuuntainen sijainti kentälle
* @example
* <pre name="test">
* #import javax.swing.SwingConstants;
* Harrastus har = new Harrastus();
* har.getSijainti(3) === SwingConstants.RIGHT;
* </pre>
*/
@Override
public int getSijainti(int k) {
Kentta kentta = getKentta(k);
if ( kentta == null ) return 0;
return kentta.getSijainti();
}
}
This diff is collapsed.
package kanta;
import kanta.Kentta;
import kanta.PerusTietue;
/**
* PohjaTietue joka osaa mm. itse huolehtia tunnus_nro:staan.
* Jos tätä peritään, niin kaikilla perityillä on juokseva
* id-numero keskenään, jollei kenttätaulukon 1. kentäksi ole annettu
* IdKentta-tyyppistä kenttää.
*
* Voidaan käyttää myös suoraan luomalla
* kenttätaulukko ennen olion luomista, ks, muodostajan esimerkki.
* Tällöin taulukko pitää muistaa luoda jokaista luotavaa tietuetta kohti
* erikseen.
*
* @author Vesa Lappalainen
* @version 1.0, 22.02.2003
* @version 1.1, 23.02.2012 - tietueena
* @example
* <pre name="testJAVA">
* public static class Harrastus extends PohjaTietue {
* public Harrastus() {
* super(new Kentta[]{
* new IdKentta("id","harrastusID_testPohjatietue"),
* new IntKentta("jäsenId"),
* new JonoKentta("ala"),
* new IntKentta("aloitusvuosi"),
* new IntKentta("h/vko")
* },2);
* }
* public int getJasenNro() { return ((IntKentta)getKentta(1)).getValue(); }
* }
* </pre>
*
* @example
* <pre name="test_getOtsikot">
* #import java.util.Arrays;
* // getOtsikot()
* Harrastus har = new Harrastus();
* Arrays.toString(har.getOtsikot()) =R= "\\[ala, aloitusvuosi, h/vko.*";
* </pre>
*
* @example
* <pre name="test_anna">
* // anna(int)
* Harrastus har = new Harrastus();
* har.parse(" 2 | 10 | Kalastus | 1949 | 22 t ");
* har.anna(0) === "2";
* har.anna(1) === "10";
* har.anna(2) === "Kalastus";
* har.anna(3) === "1949";
* har.anna(4) === "22";
* </pre>
*
* @example
* <pre name="test_aseta">
* // aseta(int,String)
* Harrastus har = new Harrastus();
* har.aseta(3,"kissa") === "aloitusvuosi: Ei kokonaisluku (kissa)";
* har.aseta(3,"1940") === null;
* har.aseta(4,"kissa") === "h/vko: Ei kokonaisluku (kissa)";
* har.aseta(4,"20") === null;
* </pre>
*
* @example
* <pre name="test_rekisteroi">
* // rekisteroi()
* Harrastus pitsi1 = new Harrastus();
* pitsi1.getTunnusNro() === 0;
* pitsi1.rekisteroi();
* Harrastus pitsi2 = new Harrastus();
* pitsi2.rekisteroi();
* int n1 = pitsi1.getTunnusNro();
* int n2 = pitsi2.getTunnusNro();
* n1 === n2-1;
* </pre>
*
* @example
* <pre name="test_parse">
* // parse()
* Harrastus harrastus = new Harrastus();
* harrastus.parse(" 2 | 10 | Kalastus | 1949 | 22 t ");
* harrastus.getJasenNro() === 10;
* harrastus.toString() =R= "2\\|10\\|Kalastus\\|1949\\|22.*";
*
* harrastus.rekisteroi(); // ei vaikuta
* int n = harrastus.getTunnusNro();
* n === 2;
* harrastus.parse(""+(n+20));
* harrastus.toString() =R= "" + (n+20) + "\\|10\\|\\|1949\\|22.*";
* harrastus = new Harrastus();
* harrastus.rekisteroi();
* harrastus.getTunnusNro() === n+20+1;
* </pre>
*/
public class PohjaTietue extends PerusTietue {
/**
*/
private Kentta kentat[] = null;
private IdKentta idKentta = null;
int eka;
private static int seuraavaNro = 1;
@Override
public Kentta[] getKentat() {
return kentat;
}
@Override
protected final void setKentat(Kentta[] uudetKentat) {
kentat = uudetKentat;
idKentta = null;
if ( kentat.length == 0 ) return;
Kentta ekaKentta = getKentta(0);
if ( !(ekaKentta instanceof IdKentta) ) return;
idKentta = (IdKentta)ekaKentta;
}
/**
* @return seuraava numero joka tullaan antamaan rekisteröinnissä
* @example
* <pre name="test">
* Harrastus harrastus = new Harrastus();
* harrastus.rekisteroi();
* harrastus.getSeuraavaNro() === harrastus.getTunnusNro()+1;
* </pre>
*/
@Override
public int getSeuraavaNro() {
if ( idKentta != null ) return idKentta.getSeuraavaNro();
return seuraavaNro;
}
/**
* Antaa tietueelle uuden id-numeron mikäli sitä jo ei ole
* annettu.
* @return seuraava numero joka annettiin rekisteröinnissä
* @example
* <pre name="test">
* Harrastus harrastus = new Harrastus();
* harrastus.rekisteroi();
* int n = harrastus.getTunnusNro();
* harrastus.rekisteroi();
* n === harrastus.getTunnusNro(); // ei muutu koska oli jo
* harrastus.getSeuraavaNro() === n+1;
* </pre>
*/
@Override
public int rekisteroi() {
if ( idKentta != null ) return idKentta.rekisteroi();
return super.rekisteroi();
}
@Override
protected void setSeuraavaNro(int i) {
seuraavaNro = i;
}
/**
* Alustetaan pohjatietue uusilla kentillä
* @param kentat kenttätaulukko, jota jatkossa käytetään
* @param eka mikä on ekan kentän indeksi
* @example
* <pre name="test">
* #THROWS CloneNotSupportedException
* Kentta kentat[] = {
* new IdKentta("id","testPohjaTietueConstructor"),
* new IntKentta("jäsenId"),
* new JonoKentta("ala"),
* new IntKentta("aloitusvuosi"),
* new IntKentta("h/vko")
* };
* PohjaTietue har = new PohjaTietue(kentat,2);
* har.getKysymys(2) === "ala";
* har.parse(" 2 | 10 | Kalastus | 1949 | 22 t ");
* har.getSeuraavaNro() === 3;
* Tietue kopio = har.clone();
* kopio.toString() === har.toString();
* har.parse(" 1 | 11 | Uinti | 1949 | 22 t ");
* kopio.toString().equals(har.toString()) === false;
* kopio instanceof PohjaTietue === true;
* </pre>
*/
public PohjaTietue(Kentta[] kentat, int eka) {
setKentat(kentat);
this.eka = eka;
}
/**
* @return ensimmäinen käyttäjän syötettävän kentän indeksi
* @example
* <pre name="test">
* Harrastus har = new Harrastus();
* har.ekaKentta() === 2;
* </pre>
*/
@Override
public int ekaKentta() {
return eka;
}
/**
* Tehdään identtinen klooni tietueesta
* @return kloonattu tietue
* @example
* <pre name="test">
* #THROWS CloneNotSupportedException
* Harrastus har = new Harrastus();
* har.parse(" 2 | 10 | Kalastus | 1949 | 22 t ");
* Tietue kopio = har.clone();
* kopio.toString() === har.toString();
* har.parse(" 1 | 11 | Uinti | 1949 | 22 t ");
* kopio.toString().equals(har.toString()) === false;
* kopio instanceof Harrastus === true;
* </pre>
*/
@Override
public PohjaTietue clone() throws CloneNotSupportedException {
return (PohjaTietue)super.clone();
}
}
package kanta;
/**
* Poikkeusluokka tietorakenteesta aiheutuville poikkeuksille.
* @author Vesa Lappalainen
* @version 1.0, 22.02.2003
*/
public class SailoException extends Exception {
private static final long serialVersionUID = 1L;
/**
* Poikkeuksen muodostaja jolle tuodaan poikkeuksessa
* käytettävä viesti
* @param viesti Poikkeuksen viesti
* @example
* <pre name="test">
* SailoException e = new SailoException("Virhe");
* e.getMessage() === "Virhe";
* </pre>
*/
public SailoException(String viesti) {
super(viesti);
}
}
\ No newline at end of file
......@@ -16,6 +16,17 @@ public interface Tarkistaja {
* Tutkitaan käykö annettu merkkijono kentän sisällöksi.
* @param jono tutkittava merkkijono
* @return null jos jono oikein, muuten virheilmoitusta vastaava merkkijono
* @example
* <pre name="test">
* RegExpTarkistaja tar = new RegExpTarkistaja("[1-4]*");
* tar.tarkista("12") === null;
* tar.tarkista("15") === "Ei vastaa maskia: [1-4]*";
* tar.tarkista("") === null;
* tar = new RegExpTarkistaja("[1-4]+","Vain numeroita 1-4");
* tar.tarkista("15") === "Vain numeroita 1-4";
* tar.tarkista("") === "Vain numeroita 1-4";
* tar.tarkista("1") === null;
* </pre>
*/
String tarkista(String jono);
}
package kanta;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
/**
* Rajapinta tietueelle johon voidaan taulukon avulla rakentaa
......@@ -7,15 +11,32 @@ package kanta;
* @author vesal
* @version Mar 23, 2012
* @example
* <pre name="testJAVA">
* public static class Harrastus extends PerusTietue {
* private Kentta kentat[] = {
* new IntKentta("id"),
* new IntKentta("jäsenId"),
* new JonoKentta("ala"),
* new IntKentta("aloitusvuosi"),
* new IntKentta("h/vko")
* };
* private static int seuraavaNro = 1;
* @Override public int ekaKentta() { return 2; }
* @Override public Kentta[] getKentat() { return kentat; }
* @Override public int getSeuraavaNro() { return seuraavaNro; }
* @Override protected void setSeuraavaNro(int i) { seuraavaNro = i; }
* @Override protected void setKentat(Kentta[] kentat) { this.kentat = kentat; }
* @Override public Harrastus clone() throws CloneNotSupportedException {return (Harrastus)super.clone(); }
* public int getJasenNro() { return ((IntKentta)getKentta(1)).getValue(); }
* }
* </pre>
*/
public interface Tietue {
/**
* @return tietueen kenttien lukumäärä
* @example
* <pre name="test">
* #import kerho.Harrastus;
* Harrastus har = new Harrastus();
* har.getKenttia() === 5;
* </pre>
......@@ -34,6 +55,33 @@ public interface Tietue {
public abstract int ekaKentta();
/**
* @param k Mikä kenttä halutaan
* @return k.s kenttä
* @example
* <pre name="test">
* Harrastus har = new Harrastus();
* har.parse(" 2 | 10 | Kalastus | 1949 | 22 t ");
* IntKentta kentta = (IntKentta)har.getKentta(3);
* kentta.getValue() === 1949;
* </pre>
*/
public abstract Kentta getKentta(int k);
/**
* @return palautetaan viite koko kenttätaulukkoon.
* @example
* <pre name="test">
* Harrastus har = new Harrastus();
* har.parse(" 2 | 10 | Kalastus | 1949 | 22 t ");
* Kentta[] kentat = har.getKentat();
* ((IntKentta)(kentat[4])).getValue() === 22;
* </pre>
*/
public abstract Kentta[] getKentat();
/**
* @param k minkä kentän kysymys halutaan
* @return valitun kentän kysymysteksti
......@@ -46,6 +94,32 @@ public interface Tietue {
public abstract String getKysymys(int k);
/**
* @param k minkä kentän kysymys halutaan asettaa
* @param kysymys kentän kysymys
* @example
* <pre name="test">
* Harrastus har = new Harrastus();
* har.getKysymys(2) === "ala";
* har.setKysymys(2,"aihe");
* har.getKysymys(2) === "aihe";
* </pre>
*/
public void setKysymys(int k, String kysymys);
/**
* @return kaikkien näytettävien kysymysten otsikot merkkijonotaulukkona
* @example
* <pre name="test">
* #import java.util.Arrays;
* Harrastus har = new Harrastus();
* Arrays.toString(har.getOtsikot()) =R= "\\[ala, aloitusvuosi, h/vko.*";
* </pre>
*/
public abstract String[] getOtsikot();
/**
* @param k Minkä kentän sisältö halutaan
* @return valitun kentän sisältö
......@@ -63,6 +137,25 @@ public interface Tietue {
public abstract String anna(int k);
/**
* Kentän sisältö kokonaislukuna. Jos ei ole IntKentta,
* niin -1.
* @param k Minkä kentän sisältö halutaan
* @return valitun kentän sisältö kokonaislukuna.
* @example
* <pre name="test">
* Harrastus har = new Harrastus();
* har.parse(" 2 | 10 | Kalastus | 1949 | 22 t ");
* har.annaInt(0) === 2;
* har.annaInt(1) === 10;
* har.annaInt(2) === -1;
* har.annaInt(3) === 1949;
* har.annaInt(4) === 22;
* </pre>
*/
public abstract int annaInt(int k);
/**
* Asetetaan valitun kentän sisältö. Mikäli asettaminen onnistuu,
* palautetaan null, muutoin virheteksti.
......@@ -100,6 +193,58 @@ public interface Tietue {
public abstract Tietue clone() throws CloneNotSupportedException;
/**
* Tulostetaan tietueen tiedot
* @param out tietovirta johon tulostetaan
*/
public abstract void tulosta(PrintWriter out);
/**
* Tulostetaan tietueen tiedot
* @param os tietovirta johon tulostetaan
*/
public abstract void tulosta(OutputStream os);
/**
* Tulostetaan tietueen tiedot
* @param out tietovirta johon tulostetaan
*/
public abstract void tulosta(PrintStream out);
/**
* Antaa tietueelle seuraavan rekisterinumeron.
* @return tietueen uusi tunnus_nro
* @example
* <pre name="test">
* Harrastus pitsi1 = new Harrastus();
* pitsi1.getTunnusNro() === 0;
* pitsi1.rekisteroi();
* int n1 = pitsi1.getTunnusNro();
* Harrastus pitsi2 = new Harrastus();
* pitsi2.rekisteroi() === n1 + 1;
* int n2 = pitsi2.getTunnusNro();
* n1 === n2-1;
* </pre>
*/
public abstract int rekisteroi();
/**
* Palautetaan tietueen oma id
* @return tietueen id
* @example
* <pre name="test">
* Harrastus harrastus = new Harrastus();
* harrastus.parse(" 2 | 10 | Kalastus | 1949 | 22 t ");
* harrastus.getTunnusNro() === 2;
* </pre>
*/
public abstract int getTunnusNro();
/**
* Palauttaa tietueen tiedot merkkijonona jonka voi tallentaa tiedostoon.
* @return tietue tolppaeroteltuna merkkijonona
......@@ -113,4 +258,94 @@ public interface Tietue {
@Override
public abstract String toString();
/**
* Selvitää tietueen tiedot | erotellusta merkkijonosta.
* Pitää huolen että seuraavaNro on suurempi kuin tuleva tunnusnro.
* @param rivi josta tietueen tiedot otetaan
* @example
* <pre name="test">
* Harrastus harrastus = new Harrastus();
* harrastus.parse(" 2 | 10 | Kalastus | 1949 | 22 t ");
* harrastus.getJasenNro() === 10;
* harrastus.toString() =R= "2\\|10\\|Kalastus\\|1949\\|22.*";
*
* harrastus.rekisteroi();
* int n = harrastus.getTunnusNro();
* harrastus.parse(""+(n+20));
* harrastus.rekisteroi();
* harrastus.getTunnusNro() === n+20+1;
* harrastus.toString() =R= "" + (n+20+1) + "\\|10\\|\\|1949\\|22.*";
* </pre>
*/
public abstract void parse(String rivi);
/**
* @return seuraava vapaa id-numero
* @example
* <pre name="test">
* Harrastus harrastus = new Harrastus();
* harrastus.parse(" 2 | 10 | Kalastus | 1949 | 22 t ");
* harrastus.rekisteroi();
* harrastus.getSeuraavaNro() === harrastus.getTunnusNro()+1;
* </pre>
*/
public int getSeuraavaNro();
/**
* Antaa k:n kentän sisällön avain-merkkijonona
* jonka perusteella voi lajitella
* @param k monenenko kentän sisältö palautetaan
* @return kentän sisältö merkkijonona
* @example
* <pre name="test">
* Harrastus har = new Harrastus();
* har.parse(" 2 | 10 | Kalastus | 1949 | 22 t ");
* har.getAvain(0) === " 2";
* har.getAvain(1) === " 10";
* har.getAvain(2) === "KALASTUS";
* har.getAvain(20) === "";
* </pre>
*/
public abstract String getAvain(int k);
/**
* Tutkii onko tietueen tiedot samat kuin parametrina tuodun tietueen tiedot
* @param tietue tietue johon verrataan
* @return true jos kaikki tiedot samat, false muuten
* @example
* <pre name="test">
* Harrastus har1 = new Harrastus();
* har1.parse(" 2 | 10 | Kalastus | 1949 | 22 t ");
* Harrastus har2 = new Harrastus();
* har2.parse(" 2 | 10 | Kalastus | 1949 | 22 t ");
* Harrastus har3 = new Harrastus();
* har3.parse(" 3 | 12 | Kalastus | 1949 | 22 t ");
*
*
* har1.equals(har2) === true;
* har2.equals(har1) === true;
* har1.equals(har3) === false;
* har3.equals(har2) === false;
* </pre>
*/
@Override
public abstract boolean equals(Object tietue);
/**
* @param k mistä kentästä
* @return vaakasuuntainen sijainti kentälle
* @example
* <pre name="test">
* #import javax.swing.SwingConstants;
* IntKentta k1 = new IntKentta("määrä");
* k1.getSijainti() === SwingConstants.RIGHT;
* </pre>
*/
int getSijainti(int k);
}
\ No newline at end of file
package kanta;
import java.util.Comparator;
/**
* Luokka joka vertaa kahta tietuetta keskenään
*/
public class TietueVertailija implements Comparator<Tietue> {
private final int kenttanro;
/**
* Alustetaan vertailija vertailemaan tietyn kentän perusteella
* @param k vertailtavan kentän indeksi.
*/
public TietueVertailija(int k) {
this.kenttanro = k;
}
/**
* Vertaa kahta tietuetta keskenään.
* @param t1 1. verrattava jäsen
* @param t2 2. verrattava jäsen
* @return <0 jos t1 < t2, == 0 jos t1 == t2 ja muuten >0
* @example
* <pre name="test">
* #THROWS CloneNotSupportedException
* PohjaTietue t1 = new PohjaTietue(new Kentta[]{new IntKentta("id"),
* new IntKentta("int"), new JonoKentta("string"), },1);
* PohjaTietue t2 = t1.clone();
* PohjaTietue t3 = t1.clone();
* t1.parse("1|2|bbb|");
* t2.parse("2|12|aaa|");
* t3.parse("3|2|aaa|");
*
* TietueVertailija v0 = new TietueVertailija(0);
* v0.compare(t1,t2) < 0 === true;
* v0.compare(t2,t3) < 0 === true;
* v0.compare(t2,t1) > 0 === true;
*
* TietueVertailija v1 = new TietueVertailija(1);
* v1.compare(t1,t2) < 0 === true;
* v1.compare(t2,t3) > 0 === true;
* v1.compare(t1,t3) === 0;
*
* TietueVertailija v2 = new TietueVertailija(2);
* v2.compare(t1,t2) > 0 === true;
* v2.compare(t2,t3) === 0;
* v2.compare(t2,t1) < 0 === true;
*
* TietueVertailija vm1 = new TietueVertailija(-1);
* vm1.compare(t1,t2) == 0 === true;
* </pre>
*/
@Override
public int compare(Tietue t1, Tietue t2) {
/*
String s1 = t1.getAvain(kenttanro);
String s2 = t2.getAvain(kenttanro);
return s1.compareTo(s2);
*/
if ( kenttanro < 0 ) return 0;
return t1.getKentta(kenttanro).compareTo(t2.getKentta(kenttanro));
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment