Harrastus.java |
1 package kerho; 2 3 import java.io.*; 4 5 import fi.jyu.mit.ohj2.Mjonot; 6 import static kanta.HetuTarkistus.rand; 7 8 /** 9 * Harrastus joka osaa mm. itse huolehtia tunnus_nro:staan. 10 * 11 * @author Vesa Lappalainen 12 * @version 1.0, 22.02.2003 13 */ 14 public class Harrastus implements Cloneable { 15 private int tunnusNro; 16 private int jasenNro; 17 private String ala; 18 private int aloitusvuosi; 19 private int tuntiaViikossa; 20 21 private static int seuraavaNro = 1; 22 23 24 /** 25 * Alustetaan harrastus. Toistaiseksi ei tarvitse tehdä mitään 26 */ 27 public Harrastus() { 28 // Vielä ei tarvita mitään 29 } 30 31 32 /** 33 * Alustetaan tietyn jäsenen harrastus. 34 * @param jasenNro jäsenen viitenumero 35 */ 36 public Harrastus(int jasenNro) { 37 this.jasenNro = jasenNro; 38 } 39 40 41 /** 42 * @return harrastukse kenttien lukumäärä 43 */ 44 public int getKenttia() { 45 return 5; 46 } 47 48 49 /** 50 * @return ensimmäinen käyttäjän syötettävän kentän indeksi 51 */ 52 public int ekaKentta() { 53 return 2; 54 } 55 56 /** 57 * @param k minkä kentän kysymys halutaan 58 * @return valitun kentän kysymysteksti 59 */ 60 public String getKysymys(int k) { 61 switch (k) { 62 case 0: 63 return "id"; 64 case 1: 65 return "jäsenId"; 66 case 2: 67 return "ala"; 68 case 3: 69 return "aloitusvuosi"; 70 case 4: 71 return "h/vko"; 72 default: 73 return "???"; 74 } 75 } 76 77 78 /** 79 * @param k Minkä kentän sisältö halutaan 80 * @return valitun kentän sisältö 81 * @example 82 * <pre name="test"> 83 * Harrastus har = new Harrastus(); 84 * har.parse(" 2 | 10 | Kalastus | 1949 | 22 t "); 85 * har.anna(0) === "2"; 86 * har.anna(1) === "10"; 87 * har.anna(2) === "Kalastus"; 88 * har.anna(3) === "1949"; 89 * har.anna(4) === "22"; 90 * 91 * </pre> 92 */ 93 public String anna(int k) { 94 switch (k) { 95 case 0: 96 return "" + tunnusNro; 97 case 1: 98 return "" + jasenNro; 99 case 2: 100 return ala; 101 case 3: 102 return "" + aloitusvuosi; 103 case 4: 104 return "" + tuntiaViikossa; 105 default: 106 return "???"; 107 } 108 } 109 110 111 /** 112 * Asetetaan valitun kentän sisältö. Mikäli asettaminen onnistuu, 113 * palautetaan null, muutoin virheteksti. 114 * @param k minkä kentän sisältö asetetaan 115 * @param s asetettava sisältö merkkijonona 116 * @return null jos ok, muuten virheteksti 117 * @example 118 * <pre name="test"> 119 * Harrastus har = new Harrastus(); 120 * har.aseta(3,"kissa") === "Aloitusvuosi väärin jono = \"kissa\""; 121 * har.aseta(3,"1940") === null; 122 * har.aseta(4,"kissa") === "Viikkotunnit väärin jono = \"kissa\""; 123 * har.aseta(4,"20") === null; 124 * 125 * </pre> 126 */ 127 public String aseta(int k, String s) { 128 String st = s.trim(); 129 StringBuffer sb = new StringBuffer(st); 130 switch (k) { 131 case 0: 132 setTunnusNro(Mjonot.erota(sb, '$', getTunnusNro())); 133 return null; 134 case 1: 135 jasenNro = Mjonot.erota(sb, '$', jasenNro); 136 return null; 137 case 2: 138 ala = st; 139 return null; 140 case 3: 141 try { 142 aloitusvuosi = Mjonot.erotaEx(sb, '§', aloitusvuosi); 143 } catch (NumberFormatException ex) { 144 return "Aloitusvuosi väärin " + ex.getMessage(); 145 } 146 return null; 147 148 case 4: 149 try { 150 tuntiaViikossa = Mjonot.erotaEx(sb, '§', tuntiaViikossa); 151 } catch (NumberFormatException ex) { 152 return "Viikkotunnit väärin " + ex.getMessage(); 153 } 154 return null; 155 156 default: 157 return "Väärä kentän indeksi"; 158 } 159 } 160 161 162 /** 163 * Tehdään identtinen klooni jäsenestä 164 * @return Object kloonattu jäsen 165 * @example 166 * <pre name="test"> 167 * #THROWS CloneNotSupportedException 168 * Harrastus har = new Harrastus(); 169 * har.parse(" 2 | 10 | Kalastus | 1949 | 22 t "); 170 * Harrastus kopio = har.clone(); 171 * kopio.toString() === har.toString(); 172 * har.parse(" 1 | 11 | Uinti | 1949 | 22 t "); 173 * kopio.toString().equals(har.toString()) === false; 174 * </pre> 175 */ 176 @Override 177 public Harrastus clone() throws CloneNotSupportedException { // NOPMD 178 return (Harrastus)super.clone(); 179 } 180 181 182 /** 183 * Apumetodi, jolla saadaan täytettyä testiarvot Harrastukselle. 184 * Aloitusvuosi arvotaan, jotta kahdella harrastuksella ei olisi 185 * samoja tietoja. 186 * @param nro viite henkilöön, jonka harrastuksesta on kyse 187 */ 188 public void vastaaPitsinNyplays(int nro) { 189 jasenNro = nro; 190 ala = "Pitsin nypläys"; 191 aloitusvuosi = rand(1900, 2000); 192 tuntiaViikossa = rand(0, 60); 193 } 194 195 196 /** 197 * Tulostetaan harrastuksen tiedot 198 * @param out tietovirta johon tulostetaan 199 */ 200 public void tulosta(PrintStream out) { 201 out.println(ala + " " + aloitusvuosi + " " + tuntiaViikossa); 202 } 203 204 205 /** 206 * Tulostetaan henkilön tiedot 207 * @param os tietovirta johon tulostetaan 208 */ 209 public void tulosta(OutputStream os) { 210 tulosta(new PrintStream(os)); 211 } 212 213 214 /** 215 * Antaa harrastukselle seuraavan rekisterinumeron. 216 * @return harrastuksen uusi tunnus_nro 217 * @example 218 * <pre name="test"> 219 * Harrastus pitsi1 = new Harrastus(); 220 * pitsi1.getTunnusNro() === 0; 221 * pitsi1.rekisteroi(); 222 * Harrastus pitsi2 = new Harrastus(); 223 * pitsi2.rekisteroi(); 224 * int n1 = pitsi1.getTunnusNro(); 225 * int n2 = pitsi2.getTunnusNro(); 226 * n1 === n2-1; 227 * </pre> 228 */ 229 public int rekisteroi() { 230 tunnusNro = seuraavaNro; 231 seuraavaNro++; 232 return tunnusNro; 233 } 234 235 236 /** 237 * Palautetaan harrastuksen oma id 238 * @return harrastuksen id 239 */ 240 public int getTunnusNro() { 241 return tunnusNro; 242 } 243 244 245 /** 246 * Asettaa tunnusnumeron ja samalla varmistaa että 247 * seuraava numero on aina suurempi kuin tähän mennessä suurin. 248 * @param nr asetettava tunnusnumero 249 */ 250 private void setTunnusNro(int nr) { 251 tunnusNro = nr; 252 if (tunnusNro >= seuraavaNro) seuraavaNro = tunnusNro + 1; 253 } 254 255 256 /** 257 * Palautetaan mille jäsenelle harrastus kuuluu 258 * @return jäsenen id 259 */ 260 public int getJasenNro() { 261 return jasenNro; 262 } 263 264 265 /** 266 * Palauttaa harrastuksen tiedot merkkijonona jonka voi tallentaa tiedostoon. 267 * @return harrastus tolppaeroteltuna merkkijonona 268 * @example 269 * <pre name="test"> 270 * Harrastus harrastus = new Harrastus(); 271 * harrastus.parse(" 2 | 10 | Kalastus | 1949 | 22 t "); 272 * harrastus.toString() === "2|10|Kalastus|1949|22"; 273 * </pre> 274 */ 275 @Override 276 public String toString() { 277 StringBuffer sb = new StringBuffer(""); 278 String erotin = ""; 279 for (int k = 0; k < getKenttia(); k++) { 280 sb.append(erotin); 281 sb.append(anna(k)); 282 erotin = "|"; 283 } 284 return sb.toString(); 285 } 286 287 288 /** 289 * Selvitää harrastuksen tiedot | erotellusta merkkijonosta. 290 * Pitää huolen että seuraavaNro on suurempi kuin tuleva tunnusnro. 291 * @param rivi josta harrastuksen tiedot otetaan 292 * @example 293 * <pre name="test"> 294 * Harrastus harrastus = new Harrastus(); 295 * harrastus.parse(" 2 | 10 | Kalastus | 1949 | 22 t "); 296 * harrastus.getJasenNro() === 10; 297 * harrastus.toString() === "2|10|Kalastus|1949|22"; 298 * 299 * harrastus.rekisteroi(); 300 * int n = harrastus.getTunnusNro(); 301 * harrastus.parse(""+(n+20)); 302 * harrastus.rekisteroi(); 303 * harrastus.getTunnusNro() === n+20+1; 304 * harrastus.toString() === "" + (n+20+1) + "|10||1949|22"; 305 * </pre> 306 */ 307 public void parse(String rivi) { 308 StringBuffer sb = new StringBuffer(rivi); 309 for (int k = 0; k < getKenttia(); k++) 310 aseta(k, Mjonot.erota(sb, '|')); 311 } 312 313 314 /** 315 * Testiohjelma Harrastukselle. 316 * @param args ei käytössä 317 */ 318 public static void main(String[] args) { 319 Harrastus har = new Harrastus(); 320 har.vastaaPitsinNyplays(2); 321 har.tulosta(System.out); 322 } 323 324 } 325