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