package kerho; import java.io.*; import kanta.HetuTarkistus; import fi.jyu.mit.ohj2.Mjonot; import static kanta.HetuTarkistus.*; /** * Kerhon jäsen joka osaa mm. itse huolehtia tunnusNro:staan. * * @author Vesa Lappalainen * @version 1.0, 22.02.2003 * @version 2.0, 09.01.2011 - kentät indeksoituna */ public class Jasen implements Cloneable { private int tunnusNro; private String nimi = ""; private String hetu = ""; private String katuosoite = ""; private String postinumero = ""; private String postiosoite = ""; private String kotipuhelin = ""; private String tyopuhelin = ""; private String autopuhelin = ""; private int liittymisvuosi = 0; private double jmaksu = 0; private double maksu = 0; private String lisatietoja = ""; private static int seuraavaNro = 1; /** * Palauttaa jäsenen kenttien lukumäärän * @return kenttien lukumäärä */ public int getKenttia() { return 13; } /** * Eka kenttä joka on mielekäs kysyttäväksi * @return eknn kentän indeksi */ public int ekaKentta() { return 1; } /** * Alustetaan jäsenen merkkijono-attribuuti tyhjiksi jonoiksi * ja tunnusnro = 0. */ public Jasen() { // Toistaiseksi ei tarvita mitään } /** * @return jäsenen nimi * @example *
     *   Jasen aku = new Jasen();
     *   aku.vastaaAkuAnkka();
     *   aku.getNimi() =R= "Ankka Aku .*";
     * 
*/ public String getNimi() { return nimi; } /** * Antaa k:n kentän sisällön merkkijonona * @param k monenenko kentän sisältö palautetaan * @return kentän sisältö merkkijonona */ public String anna(int k) { switch (k) { case 0: return "" + tunnusNro; case 1: return "" + nimi; case 2: return "" + hetu; case 3: return "" + katuosoite; case 4: return "" + postinumero; case 5: return "" + postiosoite; case 6: return "" + kotipuhelin; case 7: return "" + tyopuhelin; case 8: return "" + autopuhelin; case 9: return "" + liittymisvuosi; case 10: return "" + jmaksu; case 11: return "" + maksu; case 12: return "" + lisatietoja; default: return "Äääliö"; } } /** * Asettaa k:n kentän arvoksi parametrina tuodun merkkijonon arvon * @param k kuinka monennen kentän arvo asetetaan * @param jono jonoa joka asetetaan kentän arvoksi * @return null jos asettaminen onnistuu, muuten vastaava virheilmoitus. * @example *
     *   Jasen jasen = new Jasen();
     *   jasen.aseta(1,"Ankka Aku") === null;
     *   jasen.aseta(2,"kissa") =R= "Hetu liian lyhyt"
     *   jasen.aseta(2,"030201-1111") === "Tarkistusmerkin kuuluisi olla C"; 
     *   jasen.aseta(2,"030201-111C") === null; 
     *   jasen.aseta(9,"kissa") === "Liittymisvuosi väärin jono = \"kissa\"";
     *   jasen.aseta(9,"1940") === null;
     * 
*/ public String aseta(int k, String jono) { String tjono = jono.trim(); StringBuffer sb = new StringBuffer(tjono); switch (k) { case 0: setTunnusNro(Mjonot.erota(sb, '§', getTunnusNro())); return null; case 1: nimi = tjono; return null; case 2: HetuTarkistus hetut = new HetuTarkistus(); String virhe = hetut.tarkista(tjono); if (virhe != null) return virhe; hetu = tjono; return null; case 3: katuosoite = tjono; return null; case 4: postinumero = tjono; return null; case 5: postiosoite = tjono; return null; case 6: kotipuhelin = tjono; return null; case 7: tyopuhelin = tjono; return null; case 8: autopuhelin = tjono; return null; case 9: try { liittymisvuosi = Mjonot.erotaEx(sb, '§', liittymisvuosi); } catch (NumberFormatException ex) { return "Liittymisvuosi väärin " + ex.getMessage(); } return null; case 10: jmaksu = Mjonot.erota(sb, '§', jmaksu); return null; case 11: maksu = Mjonot.erota(sb, '§', maksu); return null; case 12: lisatietoja = Mjonot.erota(sb, '§', lisatietoja); return null; default: return "ÄÄliö"; } } /** * Palauttaa k:tta jäsenen kenttää vastaavan kysymyksen * @param k kuinka monennen kentän kysymys palautetaan (0-alkuinen) * @return k:netta kenttää vastaava kysymys */ public String getKysymys(int k) { switch (k) { case 0: return "Tunnus nro"; case 1: return "nimi"; case 2: return "hetu"; case 3: return "katuosoite"; case 4: return "postinumero"; case 5: return "postiosoite"; case 6: return "kotipuhelin"; case 7: return "tyopuhelin"; case 8: return "autopuhelin"; case 9: return "liittymisvuosi"; case 10: return "jmaksu"; case 11: return "maksu"; case 12: return "lisatietoja"; default: return "Äääliö"; } } /** * Apumetodi, jolla saadaan täytettyä testiarvot jäsenelle. * @param apuhetu hetu joka annetaan henkilölle */ public void vastaaAkuAnkka(String apuhetu) { nimi = "Ankka Aku " + rand(1000, 9999); hetu = apuhetu; katuosoite = "Ankkakuja 6"; postinumero = "12345"; postiosoite = "ANKKALINNA"; kotipuhelin = "12-1234"; tyopuhelin = ""; autopuhelin = ""; liittymisvuosi = 1996; jmaksu = 50.00; maksu = 30.00; lisatietoja = "Velkaa Roopelle"; } /** * Apumetodi, jolla saadaan täytettyä testiarvot jäsenelle. * Henkilötunnus arvotaan, jotta kahdella jäsenellä ei olisi * samoja tietoja. */ public void vastaaAkuAnkka() { String apuhetu = arvoHetu(); vastaaAkuAnkka(apuhetu); } /** * Tulostetaan henkilön tiedot * @param out tietovirta johon tulostetaan */ public void tulosta(PrintStream out) { out.println(String.format("%03d", tunnusNro, 3) + " " + nimi + " " + hetu); out.println(" " + katuosoite + " " + postinumero + " " + postiosoite); out.println(" k: " + kotipuhelin + " t: " + tyopuhelin + " a: " + autopuhelin); out.print(" Liittynyt " + liittymisvuosi + "."); out.println(" Jäsenmaksu " + String.format("%4.2f", jmaksu) + " e." + " Maksettu " + String.format("%4.2f", maksu) + " e."); out.println(" " + lisatietoja); } /** * Tulostetaan henkilön tiedot * @param os tietovirta johon tulostetaan */ public void tulosta(OutputStream os) { tulosta(new PrintStream(os)); } /** * Antaa jäsenelle seuraavan rekisterinumeron. * @return jäsenen uusi tunnusNro * @example *
     *   Jasen aku1 = new Jasen();
     *   aku1.getTunnusNro() === 0;
     *   aku1.rekisteroi();
     *   Jasen aku2 = new Jasen();
     *   aku2.rekisteroi();
     *   int n1 = aku1.getTunnusNro();
     *   int n2 = aku2.getTunnusNro();
     *   n1 === n2-1;
     * 
*/ public int rekisteroi() { tunnusNro = seuraavaNro; seuraavaNro++; return tunnusNro; } /** * Palauttaa jäsenen tunnusnumeron. * @return jäsenen tunnusnumero */ public int getTunnusNro() { return tunnusNro; } /** * Asettaa tunnusnumeron ja samalla varmistaa että * seuraava numero on aina suurempi kuin tähän mennessä suurin. * @param nr asetettava tunnusnumero */ private void setTunnusNro(int nr) { tunnusNro = nr; if (tunnusNro >= seuraavaNro) seuraavaNro = tunnusNro + 1; } /** * Palauttaa jäsenen tiedot merkkijonona jonka voi tallentaa tiedostoon. * @return jäsen tolppaeroteltuna merkkijonona * @example *
     *   Jasen jasen = new Jasen();
     *   jasen.parse("   3  |  Ankka Aku   | 030201-111C");
     *   jasen.toString().startsWith("3|Ankka Aku|030201-111C|") === true; // on enemmäkin kuin 3 kenttää, siksi loppu |
     * 
*/ @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(); } /** * Selvitää jäsenen tiedot | erotellusta merkkijonosta * Pitää huolen että seuraavaNro on suurempi kuin tuleva tunnusNro. * @param rivi josta jäsenen tiedot otetaan * * @example *
     *   Jasen jasen = new Jasen();
     *   jasen.parse("   3  |  Ankka Aku   | 030201-111C");
     *   jasen.getTunnusNro() === 3;
     *   jasen.toString().startsWith("3|Ankka Aku|030201-111C|") === true; // on enemmäkin kuin 3 kenttää, siksi loppu |
     *
     *   jasen.rekisteroi();
     *   int n = jasen.getTunnusNro();
     *   jasen.parse(""+(n+20));       // Otetaan merkkijonosta vain tunnusnumero
     *   jasen.rekisteroi();           // ja tarkistetaan että seuraavalla kertaa tulee yhtä isompi
     *   jasen.getTunnusNro() === n+20+1;
     *     
     * 
*/ public void parse(String rivi) { StringBuffer sb = new StringBuffer(rivi); for (int k = 0; k < getKenttia(); k++) aseta(k, Mjonot.erota(sb, '|')); } /** * Tehdään identtinen klooni jäsenestä * @return Object kloonattu jäsen * @example *
     * #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;
     * 
*/ @Override public Jasen clone() throws CloneNotSupportedException { // NOPMD Jasen uusi; uusi = (Jasen)super.clone(); return uusi; } /** * Tutkii onko jäsenen tiedot samat kuin parametrina tuodun jäsenen tiedot * @param jasen jäsen johon verrataan * @return true jos kaikki tiedot samat, false muuten * @example *
     *   Jasen jasen1 = new Jasen();
     *   jasen1.parse("   3  |  Ankka Aku   | 030201-111C");
     *   Jasen jasen2 = new Jasen();
     *   jasen2.parse("   3  |  Ankka Aku   | 030201-111C");
     *   Jasen jasen3 = new Jasen();
     *   jasen3.parse("   3  |  Ankka Aku   | 030201-115H");
     *   
     *   jasen1.equals(jasen2) === true;
     *   jasen2.equals(jasen1) === true;
     *   jasen1.equals(jasen3) === false;
     *   jasen3.equals(jasen2) === false;
     * 
*/ public boolean equals(Jasen jasen) { // NOPMD for (int k = 0; k < getKenttia(); k++) if (!anna(k).equals(jasen.anna(k))) return false; return true; } /** * Testiohjelma jäsenelle. * @param args ei käytössä */ public static void main(String args[]) { Jasen aku = new Jasen(), aku2 = new Jasen(); aku.rekisteroi(); aku2.rekisteroi(); aku.tulosta(System.out); aku.vastaaAkuAnkka(); aku.tulosta(System.out); aku2.vastaaAkuAnkka(); aku2.tulosta(System.out); aku2.vastaaAkuAnkka(); aku2.tulosta(System.out); } }