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