1   package kanta;
2   
3   import java.io.OutputStream;
4   import java.io.PrintStream;
5   import java.io.PrintWriter;
6   
7   
8   /**
9    * Rajapinta tietueelle johon voidaan taulukon avulla rakentaa 
10   * "attribuutit".
11   * @author vesal
12   * @version Mar 23, 2012
13   * @example
14   * <pre name="testJAVA">
15   * public static class Harrastus extends PerusTietue {
16   *     private Kentta kentat[] = { 
17   *        new IntKentta("id"),
18   *        new IntKentta("jäsenId"),
19   *        new JonoKentta("ala"),
20   *        new IntKentta("aloitusvuosi"),
21   *        new IntKentta("h/vko")
22   *     };
23   *     private static int seuraavaNro = 1;
24   *     @Override public int ekaKentta() { return 2; }
25   *     @Override public Kentta[] getKentat() { return kentat; }
26   *     @Override public int getSeuraavaNro() { return seuraavaNro; }
27   *     @Override protected void setSeuraavaNro(int i) { seuraavaNro = i; }
28   *     @Override protected void setKentat(Kentta[] kentat) { this.kentat = kentat; }
29   *     @Override public Harrastus clone() throws CloneNotSupportedException {return (Harrastus)super.clone(); }
30   *     public int getJasenNro() { return ((IntKentta)getKentta(1)).getValue(); }
31   * }    
32   * </pre>
33   */
34  public interface Tietue {
35  
36      /**
37       * @return tietueen kenttien lukumäärä
38       * @example
39       * <pre name="test">
40       *   Harrastus har = new Harrastus();
41       *   har.getKenttia() === 5;
42       * </pre>
43       */
44      public abstract int getKenttia();
45  
46  
47      /**
48       * @return ensimmäinen käyttäjän syötettävän kentän indeksi
49       * @example
50       * <pre name="test">
51       *   Harrastus har = new Harrastus();
52       *   har.ekaKentta() === 2;
53       * </pre>
54       */
55      public abstract int ekaKentta();
56  
57  
58      /**
59       * @param k Mikä kenttä halutaan
60       * @return k.s kenttä
61       * @example
62       * <pre name="test">
63       *   Harrastus har = new Harrastus();
64       *   har.parse("   2   |  10  |   Kalastus  | 1949 | 22 t ");
65       *   IntKentta kentta = (IntKentta)har.getKentta(3);   
66       *   kentta.getValue() === 1949;   
67       * </pre>
68       */
69      public abstract Kentta getKentta(int k);
70  
71      
72      /**
73       * @return palautetaan viite koko kenttätaulukkoon.
74       * @example
75       * <pre name="test">
76       *   Harrastus har = new Harrastus();
77       *   har.parse("   2   |  10  |   Kalastus  | 1949 | 22 t ");
78       *   Kentta[] kentat  = har.getKentat();   
79       *   ((IntKentta)(kentat[4])).getValue() === 22;   
80       * </pre>
81       */
82      public abstract Kentta[] getKentat();
83      
84  
85      /**
86       * @param k minkä kentän kysymys halutaan
87       * @return valitun kentän kysymysteksti
88       * @example
89       * <pre name="test">
90       *   Harrastus har = new Harrastus();
91       *   har.getKysymys(2) === "ala";
92       * </pre>
93       */
94      public abstract String getKysymys(int k);
95  
96  
97      /**
98       * @return kaikkien näytettävien kysymysten otsikot merkkijonotaulukkona
99       * @example
100      * <pre name="test">
101      * #import java.util.Arrays;
102      *   Harrastus har = new Harrastus();
103      *   Arrays.toString(har.getOtsikot()) =R= "\\[ala, aloitusvuosi, h/vko.*";
104      * </pre>
105      */
106     public abstract String[] getOtsikot();
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      * </pre>
122      */
123     public abstract String anna(int k);
124 
125     
126     /**
127      * Kentän sisältö kokonaislukuna.  Jos ei ole IntKentta,
128      * niin -1.
129      * @param k Minkä kentän sisältö halutaan
130      * @return valitun kentän sisältö kokonaislukuna.  
131      * @example
132      * <pre name="test">
133      *   Harrastus har = new Harrastus();
134      *   har.parse("   2   |  10  |   Kalastus  | 1949 | 22 t ");
135      *   har.annaInt(0) === 2;   
136      *   har.annaInt(1) === 10;   
137      *   har.annaInt(2) === -1;   
138      *   har.annaInt(3) === 1949;   
139      *   har.annaInt(4) === 22;   
140      * </pre>
141      */
142     public abstract int annaInt(int k);
143 
144     
145     /**
146      * Asetetaan valitun kentän sisältö.  Mikäli asettaminen onnistuu,
147      * palautetaan null, muutoin virheteksti.
148      * @param k minkä kentän sisältö asetetaan
149      * @param s asetettava sisältö merkkijonona
150      * @return null jos ok, muuten virheteksti
151      * @example
152      * <pre name="test">
153      *   Harrastus har = new Harrastus();
154      *   har.aseta(3,"kissa") === "aloitusvuosi: Ei kokonaisluku (kissa)";
155      *   har.aseta(3,"1940")  === null;
156      *   har.aseta(4,"kissa") === "h/vko: Ei kokonaisluku (kissa)";
157      *   har.aseta(4,"20")    === null;
158      * </pre>
159      */
160     public abstract String aseta(int k, String s);
161 
162 
163     /**
164      * Tehdään identtinen klooni tietueesta
165      * @return kloonattu tietue
166      * @throws CloneNotSupportedException jos kloonausta ei tueta
167      * @example
168      * <pre name="test">
169      * #THROWS CloneNotSupportedException 
170      *   Harrastus har = new Harrastus();
171      *   har.parse("   2   |  10  |   Kalastus  | 1949 | 22 t ");
172      *   Harrastus kopio = har.clone();
173      *   kopio.toString() === har.toString();
174      *   har.parse("   1   |  11  |   Uinti  | 1949 | 22 t ");
175      *   kopio.toString().equals(har.toString()) === false;
176      *   kopio instanceof Harrastus === true;
177      * </pre>
178      */
179     public abstract Tietue clone() throws CloneNotSupportedException;
180 
181 
182     /**
183      * Tulostetaan tietueen tiedot
184      * @param out tietovirta johon tulostetaan
185      */
186     public abstract void tulosta(PrintWriter out);
187 
188 
189     /**
190      * Tulostetaan tietueen tiedot
191      * @param os tietovirta johon tulostetaan
192      */
193     public abstract void tulosta(OutputStream os);
194 
195 
196     /**
197      * Tulostetaan tietueen tiedot
198      * @param out tietovirta johon tulostetaan
199      */
200     public abstract void tulosta(PrintStream out);
201 
202 
203     /**
204      * Antaa tietueelle seuraavan rekisterinumeron.
205      * @return tietueen uusi tunnus_nro
206      * @example
207      * <pre name="test">
208      *   Harrastus pitsi1 = new Harrastus();
209      *   pitsi1.getTunnusNro() === 0;
210      *   pitsi1.rekisteroi();
211      *   int n1 = pitsi1.getTunnusNro();
212      *   Harrastus pitsi2 = new Harrastus();
213      *   pitsi2.rekisteroi() === n1 + 1;
214      *   int n2 = pitsi2.getTunnusNro();
215      *   n1 === n2-1;
216      * </pre>
217      */
218     public abstract int rekisteroi();
219 
220 
221     /**
222      * Palautetaan tietueen oma id
223      * @return tietueen id
224      * @example
225      * <pre name="test">
226      *   Harrastus harrastus = new Harrastus();
227      *   harrastus.parse("   2   |  10  |   Kalastus  | 1949 | 22 t ");
228      *   harrastus.getTunnusNro() === 2;
229      * </pre>
230      */
231     public abstract int getTunnusNro();
232 
233 
234     /**
235      * Palauttaa tietueen tiedot merkkijonona jonka voi tallentaa tiedostoon.
236      * @return tietue tolppaeroteltuna merkkijonona 
237      * @example
238      * <pre name="test">
239      *   Harrastus harrastus = new Harrastus();
240      *   harrastus.parse("   2   |  10  |   Kalastus  | 1949 | 22 t ");
241      *   harrastus.toString()    =R= "2\\|10\\|Kalastus\\|1949\\|22.*";
242      * </pre>
243      */
244     @Override
245     public abstract String toString();
246 
247 
248     /**
249      * Selvitää tietueen tiedot | erotellusta merkkijonosta.
250      * Pitää huolen että seuraavaNro on suurempi kuin tuleva tunnusnro.
251      * @param rivi josta tietueen tiedot otetaan
252      * @example
253      * <pre name="test">
254      *   Harrastus harrastus = new Harrastus();
255      *   harrastus.parse("   2   |  10  |   Kalastus  | 1949 | 22 t ");
256      *   harrastus.getJasenNro() === 10;
257      *   harrastus.toString()     =R= "2\\|10\\|Kalastus\\|1949\\|22.*";
258      *   
259      *   harrastus.rekisteroi();
260      *   int n = harrastus.getTunnusNro();
261      *   harrastus.parse(""+(n+20));
262      *   harrastus.rekisteroi();
263      *   harrastus.getTunnusNro() === n+20+1;
264      *   harrastus.toString()     =R= "" + (n+20+1) + "\\|10\\|\\|1949\\|22.*";
265      * </pre>
266      */
267     public abstract void parse(String rivi);
268 
269     
270     /**
271      * @return seuraava vapaa id-numero
272      * @example
273      * <pre name="test">
274      *   Harrastus harrastus = new Harrastus();
275      *   harrastus.parse("   2   |  10  |   Kalastus  | 1949 | 22 t ");
276      *   harrastus.rekisteroi();
277      *   harrastus.getSeuraavaNro() === harrastus.getTunnusNro()+1;
278      * </pre>
279      */
280     public int getSeuraavaNro();
281 
282     
283     /**
284      * Antaa k:n kentän sisällön avain-merkkijonona
285      * jonka perusteella voi lajitella
286      * @param k monenenko kentän sisältö palautetaan
287      * @return kentän sisältö merkkijonona
288      * @example
289      * <pre name="test">
290      *   Harrastus har = new Harrastus();
291      *   har.parse("   2   |  10  |   Kalastus  | 1949 | 22 t ");
292      *   har.getAvain(0) === "         2";
293      *   har.getAvain(1) === "        10";
294      *   har.getAvain(2) === "KALASTUS";
295      *   har.getAvain(20) === "";
296      * </pre>
297      */
298     public abstract String getAvain(int k);
299 
300     
301     /**
302      * Tutkii onko tietueen tiedot samat kuin parametrina tuodun tietueen tiedot
303      * @param tietue tietue johon verrataan
304      * @return true jos kaikki tiedot samat, false muuten
305      * @example
306      * <pre name="test">
307      *   Harrastus har1 = new Harrastus();
308      *   har1.parse("   2   |  10  |   Kalastus  | 1949 | 22 t ");
309      *   Harrastus har2 = new Harrastus();
310      *   har2.parse("   2   |  10  |   Kalastus  | 1949 | 22 t ");
311      *   Harrastus har3 = new Harrastus();
312      *   har3.parse("   3   |  12  |   Kalastus  | 1949 | 22 t ");
313      *   
314      *   
315      *   har1.equals(har2) === true;
316      *   har2.equals(har1) === true;
317      *   har1.equals(har3) === false;
318      *   har3.equals(har2) === false;
319      * </pre>
320      */ 
321     public abstract boolean equals(Tietue tietue); 
322     
323 }