Skip to content
Commits on Source (1)
5
15
1|Ankka Aku 6143|201185-895K|Paratiisitie 13|12345|ANKKALINNA|12-1234|||1996|50.0|30.0|Velkaa Roopelle
2|Ankka Aku 1704|170478-714B|Paratiisitie 13|12345|ANKKALINNA|12-1234|||1996|50.0|30.0|Velkaa Roopelle
3|Ankka Aku 9147|020128-350L|Paratiisitie 13|12345|ANKKALINNA|12-1234|||1996|50.0|30.0|Velkaa Roopelle
4|Ankka Aku 8302|120246-5919|Paratiisitie 13|12345|ANKKALINNA|12-1234|||1996|50.0|30.0|Velkaa Roopelle
2|Ankka Aku 1704|170478-714B|Paratiisitie 14|12345|ANKKALINNA|12-1234|||1996|50.0|30.0|Velkaa Roopelle
3|Ankka Aku 9147|020128-350L|Paratiisitie 15|12345|ANKKALINNA|12-1234|||1996|50.0|30.0|Velkaa Roopelle
4|Ankka Aku 8302|120246-5919|Paratiisitie 16|12345|ANKKALINNA|12-1234|||1996|50.0|30.0|Velkaa Roopelle
No preview for this file type
......@@ -3,6 +3,7 @@ package fxKerho;
import java.net.URL;
import java.util.ResourceBundle;
import fi.jyu.mit.fxgui.Dialogs;
import fi.jyu.mit.fxgui.ModalController;
import fi.jyu.mit.fxgui.ModalControllerInterface;
import javafx.fxml.FXML;
......@@ -33,11 +34,16 @@ public class JasenDialogController implements ModalControllerInterface<Jasen>,In
}
@FXML private void handleOK() {
if ( jasenKohdalla != null && jasenKohdalla.getNimi().trim().equals("") ) {
naytaVirhe("Nimi ei saa olla tyhjä");
return;
}
ModalController.closeStage(labelVirhe);
}
@FXML private void handleCancel() {
jasenKohdalla = null;
ModalController.closeStage(labelVirhe);
}
......@@ -57,10 +63,17 @@ public class JasenDialogController implements ModalControllerInterface<Jasen>,In
/**
* Tekee tarvittavat muut alustukset.
* Tekee tarvittavat muut alustukset. Mm laittaa edit-kentistä tulevan
* tapahtuman menemään kasitteleMuutosJaseneen-metodiin ja vie sille
* kentännumeron parametrina.
*/
protected void alusta() {
edits = new TextField[]{editNimi, editHetu, editKatuosoite, editPostinumero};
int i = 0;
for (TextField edit : edits) {
final int k = ++i;
edit.setOnKeyReleased( e -> kasitteleMuutosJaseneen(k, (TextField)(e.getSource())));
}
}
......@@ -86,6 +99,44 @@ public class JasenDialogController implements ModalControllerInterface<Jasen>,In
}
private void naytaVirhe(String virhe) {
if ( virhe == null || virhe.isEmpty() ) {
labelVirhe.setText("");
labelVirhe.getStyleClass().removeAll("virhe");
return;
}
labelVirhe.setText(virhe);
labelVirhe.getStyleClass().add("virhe");
}
/**
* Käsitellään jäseneen tullut muutos
* @param edit muuttunut kenttä
*/
private void kasitteleMuutosJaseneen(int k, TextField edit) {
if (jasenKohdalla == null) return;
String s = edit.getText();
String virhe = null;
switch (k) {
case 1 : virhe = jasenKohdalla.setNimi(s); break;
case 2 : virhe = jasenKohdalla.setHetu(s); break;
case 3 : virhe = jasenKohdalla.setKatuosoite(s); break;
case 4 : virhe = jasenKohdalla.setPostinumero(s); break;
default:
}
if (virhe == null) {
Dialogs.setToolTipText(edit,"");
edit.getStyleClass().removeAll("virhe");
naytaVirhe(virhe);
} else {
Dialogs.setToolTipText(edit,virhe);
edit.getStyleClass().add("virhe");
naytaVirhe(virhe);
}
}
/**
* Näytetään jäsenen tiedot TextField komponentteihin
* @param edits taulukko jossa tekstikenttiä
......
......@@ -13,7 +13,7 @@
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.layout.VBox?>
<BorderPane xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fxKerho.JasenDialogController">
<BorderPane stylesheets="@kerho.css" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fxKerho.JasenDialogController">
<bottom>
<VBox BorderPane.alignment="CENTER">
<children>
......
......@@ -269,16 +269,17 @@ public class KerhoGUIController implements Initializable {
* Luo uuden jäsenen jota aletaan editoimaan
*/
protected void uusiJasen() {
Jasen uusi = new Jasen();
uusi.rekisteroi();
uusi.vastaaAkuAnkka();
try {
Jasen uusi = new Jasen();
uusi = JasenDialogController.kysyJasen(null, uusi);
if ( uusi == null ) return;
uusi.rekisteroi();
kerho.lisaa(uusi);
hae(uusi.getTunnusNro());
} catch (SailoException e) {
Dialogs.showMessageDialog("Ongelmia uuden luomisessa " + e.getMessage());
return;
}
hae(uusi.getTunnusNro());
}
......@@ -320,9 +321,20 @@ public class KerhoGUIController implements Initializable {
}
private void muokkaa() {
JasenDialogController.kysyJasen(null, jasenKohdalla);
}
private void muokkaa() {
if ( jasenKohdalla == null ) return;
try {
Jasen jasen;
jasen = JasenDialogController.kysyJasen(null, jasenKohdalla.clone());
if ( jasen == null ) return;
kerho.korvaaTaiLisaa(jasen);
hae(jasen.getTunnusNro());
} catch (CloneNotSupportedException e) {
//
} catch (SailoException e) {
Dialogs.showMessageDialog(e.getMessage());
}
}
/**
......
package kanta;
import static kanta.SisaltaaTarkistaja.*;
/**
* Luokka henkilötunnuksen tarkistamiseksi
......@@ -12,6 +13,66 @@ public class HetuTarkistus {
// 0123456789012345678901234567890
public static final String TARKISTUSMERKIT = "0123456789ABCDEFHJKLMNPRSTUVWXY";
/** Kuukausien maksimipituudet */
// 1 2 3 4 5 6 7 8 9 10 11 12
public static int[] KUUKAUDET = {31,29,31,30,31,30,31,31,30,31,30,31};
/**
* Tarkistetaan hetu. Sallitaan myös muoto jossa vain syntymäaika.
* @param hetu joka tutkitaan.
* @return null jos oikein, muuten virhettä kuvaava teksti
* TODO tarkistukset kuntoon myös karkausvuodesta.
* @example
* <pre name="test">
* #PACKAGEIMPORT
* HetuTarkistus hetut = new HetuTarkistus();
* hetut.tarkista("12121") === "Hetu liian lyhyt";
* hetut.tarkista("k") === "Hetu liian lyhyt";
* hetut.tarkista("12121k") === "Alkuosassa saa olla vain numeroita";
* hetut.tarkista("121212") === null; // sallitaan pelkkä syntymäaika
* hetut.tarkista("001212") === "Liian pieni päivämäärä";
* hetut.tarkista("321212") === "Liian suuri päivämäärä";
* hetut.tarkista("300212") === "Liian suuri päivämäärä";
* hetut.tarkista("310412") === "Liian suuri päivämäärä";
* hetut.tarkista("121312") === "Liian suuri kuukausi";
* hetut.tarkista("120012") === "Liian pieni kuukausi";
* hetut.tarkista("121212B222Q") === "Väärä erotinmerkki";
* hetut.tarkista("121212-2k2Q") === "Yksilöosassa kirjaimia";
* hetut.tarkista("121212-2") === "Yksilöosa liian lyhyt";
* hetut.tarkista("121212-") === "Yksilöosa liian lyhyt";
* hetut.tarkista("121212-12345")=== "Hetu liian pitkä";
* hetut.tarkista("121212-222S") === "Tarkistusmerkin kuuluisi olla N";
* hetut.tarkista("121212-222N") === null;
* hetut.tarkista("121212-231Y") === null;
* hetut.tarkista("311212-2317") === null;
* </pre>
*/
public String tarkista(String hetu) {
int pituus = hetu.length();
if ( pituus < 6 ) return "Hetu liian lyhyt";
String pvm = hetu.substring(0,6);
if ( !onkoVain(pvm,NUMEROT)) return "Alkuosassa saa olla vain numeroita";
int pv = Integer.parseInt(pvm.substring(0,2));
int kk = Integer.parseInt(pvm.substring(2,4));
// int vv = Integer.parseInt(pvm.substring(4,6)); TODO vielä tarkempi pvm tarkistus
if ( kk < 1 ) return "Liian pieni kuukausi";
if ( 12 < kk ) return "Liian suuri kuukausi";
int pvmkk = KUUKAUDET[kk-1];
if ( pv < 1 ) return "Liian pieni päivämäärä";
if ( pvmkk < pv ) return "Liian suuri päivämäärä";
if ( pituus == 6 ) return null; // pelkkä syntymäaika kelpaa
if ( pituus < 11 ) return "Yksilöosa liian lyhyt";
if ( pituus > 11 ) return "Hetu liian pitkä";
String erotin = hetu.substring(6,7);
if ( !onkoVain(erotin,"+-A")) return "Väärä erotinmerkki";
String yksilo = hetu.substring(7,10);
if ( !onkoVain(yksilo,NUMEROT)) return "Yksilöosassa kirjaimia";
char merkki = hetunTarkistusMerkki(hetu);
if ( hetu.charAt(10) != merkki ) return "Tarkistusmerkin kuuluisi olla " + merkki;
return null;
}
/**
* Palauttaa mikä olisi hetun tarkistumerkki. Tuotava parametrinä
......
package kanta;
/**
* Tarkistaja joka tarkistaa että jono sisältää vain valittuja merkkejä.
* Hyväksyy tyhjän jonon.
* @author vesal
*
*/
public class SisaltaaTarkistaja {
/** Numeroita vastaavat kirjaimet */
public static final String NUMEROT = "0123456789";
/** Desimaalilukuun käyvät kirjaimet */
public static final String DESIMAALINUMEROT = "0123456789.,";
/**
* Onko jonossa vain sallittuja merkkejä
* @param jono tutkittava jono
* @param sallitut merkit joita sallitaan
* @return true jos vain sallittuja, false muuten
* @example
* <pre name="test">
* onkoVain("123","12") === false;
* onkoVain("123","1234") === true;
* onkoVain("","1234") === true;
* </pre>
*/
public static boolean onkoVain(String jono, String sallitut) {
for (int i=0; i<jono.length(); i++)
if ( sallitut.indexOf(jono.charAt(i)) < 0 ) return false;
return true;
}
private final String sallitut;
/**
* Luodaan tarkistaja joka hyväksyy sallitut merkit
* @param sallitut hyväksyttävät merkit
*/
public SisaltaaTarkistaja(String sallitut) {
this.sallitut = sallitut;
}
/**
* Tarkistaa että jono sisältää vain valittuja numeroita
* @param jono tutkittava jono
* @return null jos vain valittujan merkkejä, muuten virheilmoitus
* @example
* <pre name="test">
* SisaltaaTarkistaja tar = new SisaltaaTarkistaja("123");
* tar.tarkista("12") === null;
* tar.tarkista("14") === "Saa olla vain merkkejä: 123";
* tar.tarkista("") === null;
* </pre>
*/
public String tarkista(String jono) {
if ( onkoVain(jono, sallitut) ) return null;
return "Saa olla vain merkkejä: " + sallitut;
}
}
......@@ -3,6 +3,8 @@ package kerho;
import java.io.*;
import fi.jyu.mit.ohj2.Mjonot;
import kanta.HetuTarkistus;
import static kanta.HetuTarkistus.*;
/**
......@@ -11,7 +13,7 @@ import static kanta.HetuTarkistus.*;
* @author Vesa Lappalainen
* @version 1.0, 22.02.2003
*/
public class Jasen {
public class Jasen implements Cloneable {
private int tunnusNro;
private String nimi = "";
private String hetu = "";
......@@ -67,7 +69,51 @@ public class Jasen {
}
/**
/**
* @param s jäsenelle laitettava nimi
* @return virheilmoitus, null jos ok
*/
public String setNimi(String s) {
nimi = s;
return null;
}
private HetuTarkistus hetut = new HetuTarkistus();
/**
* @param s jäsenelle laitettava hetu
* @return virheilmoitus, null jos ok
*/
public String setHetu(String s) {
String virhe = hetut.tarkista(s);
if ( s != null ) return virhe;
hetu = s;
return null;
}
/**
* @param s jäsenelle laitettava katuosoite
* @return virheilmoitus, null jos ok
*/
public String setKatuosoite(String s) {
katuosoite = s;
return null;
}
/**
* @param s jäsenelle laitettava postinumero
* @return virheilmoitus, null jos ok
*/
public String setPostinumero(String s) {
if ( !s.matches("[0-9]*") ) return "Postinmeron oltava numeerinen";
postinumero = s;
return null;
}
/**
* Apumetodi, jolla saadaan täytettyä testiarvot jäsenelle.
......@@ -236,6 +282,28 @@ public class Jasen {
}
/**
* Tehdään identtinen klooni jäsenestä
* @return Object kloonattu jäsen
* @example
* <pre name="test">
* #THROWS CloneNotSupportedException
* Jasen jasen = new Jasen();
* jasen.parse(" 3 | Ankka Aku | 123");
* Jasen kopio = jasen.clone();
* kopio.toString() === jasen.toString();
* jasen.parse(" 4 | Ankka Tupu | 123");
* kopio.toString().equals(jasen.toString()) === false;
* </pre>
*/
@Override
public Jasen clone() throws CloneNotSupportedException {
Jasen uusi;
uusi = (Jasen) super.clone();
return uusi;
}
@Override
public boolean equals(Object jasen) {
if ( jasen == null ) return false;
......
......@@ -22,7 +22,7 @@ import java.util.NoSuchElementException;
* @version 1.2, 23.02.2014 - tiedostot hakemistossa
*/
public class Jasenet implements Iterable<Jasen> {
private static final int MAX_JASENIA = 5;
private static final int MAX_JASENIA = 15;
private boolean muutettu = false;
private int lkm = 0;
private String kokoNimi = "";
......@@ -51,15 +51,12 @@ public class Jasenet implements Iterable<Jasen> {
* jasenet.lisaa(aku1); jasenet.getLkm() === 1;
* jasenet.lisaa(aku2); jasenet.getLkm() === 2;
* jasenet.lisaa(aku1); jasenet.getLkm() === 3;
* jasenet.anna(0) === aku1;
* jasenet.anna(1) === aku2;
* jasenet.anna(2) === aku1;
* jasenet.anna(1) == aku1 === false;
* jasenet.anna(1) == aku2 === true;
* jasenet.anna(3) === aku1; #THROWS IndexOutOfBoundsException
* Iterator<Jasen> it = jasenet.iterator();
* it.next() === aku1;
* it.next() === aku2;
* it.next() === aku1;
* jasenet.lisaa(aku1); jasenet.getLkm() === 4;
* jasenet.lisaa(aku1); jasenet.getLkm() === 5;
* jasenet.lisaa(aku1); #THROWS SailoException
* </pre>
*/
public void lisaa(Jasen jasen) throws SailoException {
......@@ -70,14 +67,55 @@ public class Jasenet implements Iterable<Jasen> {
}
/**
* Korvaa jäsenen tietorakenteessa. Ottaa jäsenen omistukseensa.
* Etsitään samalla tunnusnumerolla oleva jäsen. Jos ei löydy,
* niin lisätään uutena jäsenenä.
* @param jasen lisätäävän jäsenen viite. Huom tietorakenne muuttuu omistajaksi
* @throws SailoException jos tietorakenne on jo täynnä
* <pre name="test">
* #THROWS SailoException,CloneNotSupportedException
* #PACKAGEIMPORT
* Jasenet jasenet = new Jasenet();
* Jasen aku1 = new Jasen(), aku2 = new Jasen();
* aku1.rekisteroi(); aku2.rekisteroi();
* jasenet.getLkm() === 0;
* jasenet.korvaaTaiLisaa(aku1); jasenet.getLkm() === 1;
* jasenet.korvaaTaiLisaa(aku2); jasenet.getLkm() === 2;
* Jasen aku3 = aku1.clone();
* aku3.setPostinumero("00130");
* Iterator<Jasen> it = jasenet.iterator();
* it.next() == aku1 === true;
* jasenet.korvaaTaiLisaa(aku3); jasenet.getLkm() === 2;
* it = jasenet.iterator();
* Jasen j0 = it.next();
* j0 === aku3;
* j0 == aku3 === true;
* j0 == aku1 === false;
* </pre>
*/
public void korvaaTaiLisaa(Jasen jasen) throws SailoException {
int id = jasen.getTunnusNro();
for (int i = 0; i < lkm; i++) {
if ( alkiot[i].getTunnusNro() == id ) {
alkiot[i] = jasen;
muutettu = true;
return;
}
}
lisaa(jasen);
}
/**
* Palauttaa viitteen i:teen jäseneen.
* @param i monennenko jäsenen viite halutaan
* @return viite jäseneen, jonka indeksi on i
* @throws IndexOutOfBoundsException jos i ei ole sallitulla alueella
*/
public Jasen anna(int i) throws IndexOutOfBoundsException {
if ( i < 0 || lkm <= i ) throw new IndexOutOfBoundsException("Laiton indeksi: " + i);
protected Jasen anna(int i) throws IndexOutOfBoundsException {
if ( i < 0 || lkm <= i )
throw new IndexOutOfBoundsException("Laiton indeksi: " + i);
return alkiot[i];
}
......@@ -384,9 +422,9 @@ public class Jasenet implements Iterable<Jasen> {
System.out.println("============= Jäsenet testi =================");
for (int i = 0; i < jasenet.getLkm(); i++) {
Jasen jasen = jasenet.anna(i);
System.out.println("Jäsen nro: " + i);
int i = 0;
for (Jasen jasen: jasenet) {
System.out.println("Jäsen nro: " + i++);
jasen.tulosta(System.out);
}
......
......@@ -53,6 +53,18 @@ public class Kerho {
}
/**
* Korvaa jäsenen tietorakenteessa. Ottaa jäsenen omistukseensa.
* Etsitään samalla tunnusnumerolla oleva jäsen. Jos ei löydy,
* niin lisätään uutena jäsenenä.
* @param jasen lisätäävän jäsenen viite. Huom tietorakenne muuttuu omistajaksi
* @throws SailoException jos tietorakenne on jo täynnä
*/
public void korvaaTaiLisaa(Jasen jasen) throws SailoException {
jasenet.korvaaTaiLisaa(jasen);
}
/**
* Listään uusi harrastus kerhoon
* @param har lisättävä harrastus
......
......@@ -12,6 +12,7 @@ import org.junit.runners.Suite.SuiteClasses;
@RunWith(Suite.class)
@SuiteClasses({
kanta.test.HetuTarkistusTest.class,
kanta.test.SisaltaaTarkistajaTest.class,
kerho.test.JasenTest.class,
kerho.test.JasenetTest.class,
kerho.test.HarrastusTest.class,
......