Skip to content
GitLab
Explore
Sign in
Commits on Source (1)
Vaihe 7.1.4 - Tietojen syotto ja oikeellisuustarkistus
· 6d3e7925
Vesa Lappalainen
authored
Jan 06, 2020
6d3e7925
Hide whitespace changes
Inline
Side-by-side
kelmit/nimet.dat
View file @
6d3e7925
5
1
5
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 1
3
|12345|ANKKALINNA|12-1234|||1996|50.0|30.0|Velkaa Roopelle
3|Ankka Aku 9147|020128-350L|Paratiisitie 1
3
|12345|ANKKALINNA|12-1234|||1996|50.0|30.0|Velkaa Roopelle
4|Ankka Aku 8302|120246-5919|Paratiisitie 1
3
|12345|ANKKALINNA|12-1234|||1996|50.0|30.0|Velkaa Roopelle
2|Ankka Aku 1704|170478-714B|Paratiisitie 1
4
|12345|ANKKALINNA|12-1234|||1996|50.0|30.0|Velkaa Roopelle
3|Ankka Aku 9147|020128-350L|Paratiisitie 1
5
|12345|ANKKALINNA|12-1234|||1996|50.0|30.0|Velkaa Roopelle
4|Ankka Aku 8302|120246-5919|Paratiisitie 1
6
|12345|ANKKALINNA|12-1234|||1996|50.0|30.0|Velkaa Roopelle
kerho.jar
View file @
6d3e7925
No preview for this file type
src/fxKerho/JasenDialogController.java
View file @
6d3e7925
...
...
@@ -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ä
...
...
src/fxKerho/JasenDialogView.fxml
View file @
6d3e7925
...
...
@@ -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>
...
...
src/fxKerho/KerhoGUIController.java
View file @
6d3e7925
...
...
@@ -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
());
}
}
/**
...
...
src/kanta/HetuTarkistus.java
View file @
6d3e7925
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ä
...
...
src/kanta/SisaltaaTarkistaja.java
0 → 100644
View file @
6d3e7925
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
;
}
}
src/kerho/Jasen.java
View file @
6d3e7925
...
...
@@ -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
;
...
...
src/kerho/Jasenet.java
View file @
6d3e7925
...
...
@@ -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
=
1
5
;
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
);
}
...
...
src/kerho/Kerho.java
View file @
6d3e7925
...
...
@@ -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
...
...
src/test/AllTests.java
View file @
6d3e7925
...
...
@@ -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
,
...
...