1   package kalenteri;
2   
3   import java.io.BufferedReader;
4   import java.io.FileNotFoundException;
5   import java.io.FileOutputStream;
6   import java.io.FileReader;
7   import java.io.IOException;
8   import java.io.PrintStream;
9   import java.util.ArrayList;
10  import java.util.Collection;
11  
12  import fi.jyu.mit.ohj2.Mjonot;
13  
14  /**
15   * Sisallot-luokka, joka ylläpitää sisältöjä.
16   * @author Timo Koski
17   *
18   */
19  public class Sisallot {
20  
21      private Sisalto[] sisaltoTaulu;
22      private int lkm;
23  
24      /* MUODOSTAJAT */
25      /**
26       * Oletusmuodostaja
27       * Luo 5-paikkaisen taulukon.
28       * Tiedoston nimi, mistä lista päivitetään.
29       * @param tiedNimi 
30       */
31      public Sisallot(String tiedNimi) {
32          this(5, tiedNimi);
33      }
34      /**
35       * Muodostaja, joka luo parametrina tuodun int-kokoisen taulukon
36       * Tiedoston nimi, mistä lista päivitetään.
37       * @param koko
38       * @param tiedNimi 
39       */
40      public Sisallot(int koko, String tiedNimi) {
41          this.sisaltoTaulu = new Sisalto[koko];
42          haeTiedostosta(tiedNimi);
43      }
44  
45      /* GETTERIT */
46      /**
47       * @param sisNimi
48       * @return s.getId()
49       */
50      public int getId(String sisNimi) {
51          Sisalto s;
52          for (int i=0;i<lkm;i++) {
53              s = sisaltoTaulu[i];
54              if (s.toString().equals(sisNimi))
55                  return s.getId();
56          }
57          return -1;
58      }
59      /**
60       * @param indeksi
61       * @return sisaltoTaulu[indeksi].getSisallonNimi()
62       */
63      public String getSisNimi(int indeksi) {
64          try {
65              return sisaltoTaulu[indeksi].getSisallonNimi();
66          } catch (ArrayIndexOutOfBoundsException ex) {
67              System.err.println("Sisallot: Sisältöviitteet ulkona taulusta.");
68              ex.printStackTrace();
69          }
70          return null;
71      }
72      /**
73       * @param id
74       * @return sisaltoTaulu[i].getSisallonNimi();
75       */
76      public String getSisNimiId(int id) {
77          for (int i=0;i<lkm;i++) {
78              if (sisaltoTaulu[i].getId() == id)
79                  return sisaltoTaulu[i].getSisallonNimi();
80          }
81          return null;
82      }
83      /**
84       * Palauttaa sisällöt, jotka vastaavat parametrina tuodun
85       * int-taulukon iideitä. Jos Collection jää tyhjäksi, palautetaankin
86       * tyhjä arraylist.
87       * @param harjoituksenSisallotId
88       * @return harjoituksenSisallot tai new ArrayList<String>() {}
89       */
90      public Collection<String> getSisallot(int[] harjoituksenSisallotId) {
91          Collection<String> harjoituksenSisallot = new ArrayList<String>();
92          for(int a : harjoituksenSisallotId) {
93              for(int i=0;i<lkm;i++) {
94                  if(sisaltoTaulu[i].getId()==a)
95                      harjoituksenSisallot.add(sisaltoTaulu[i].getSisallonNimi());
96              }
97          }
98          if(!harjoituksenSisallot.isEmpty())
99              return harjoituksenSisallot;
100         
101         return new ArrayList<String>() {
102 
103             /**
104              * Jos harjoituksenSisällöt jäävät tyhjäksi
105              * palautetaan tyhjä ArrayList<String>
106              */
107             private static final long serialVersionUID = 1L;};
108     }
109     /**
110      * @param selectedIndex
111      * @return sisaltoTaulu[selectedIndex].getId()
112      */
113     public int getIdAtSelectedIndex(int selectedIndex) {
114         if (selectedIndex < 0 || selectedIndex > lkm)
115             return -1;
116         return sisaltoTaulu[selectedIndex].getId();
117     }
118 
119     /* LISÄÄMINEN, TAULUKON SUURENTAMINEN JA POISTAMINEN */
120     /**
121      * Lisää taulukkoon yhden Sisältö olion.
122      * Jos taulukkoon ei sovi, kutsuu suurenna-metodia.
123      * @param s
124      */
125     public void lisaa(Sisalto s) {
126         if (sisaltoTaulu.length <= lkm)
127             suurenna();
128         sisaltoTaulu[lkm++] = s;
129     }
130     /**
131      * @param uusiSis
132      */
133     public void lisaaUusiSisalto(String uusiSis) {
134         Sisalto s = new Sisalto(uusiSis);
135         lisaa(s);
136     }
137     /**
138      * Metodi suurentaa taulukkoa viidellä.
139      */
140     public void suurenna() {
141         Sisalto[] temp = sisaltoTaulu;
142         sisaltoTaulu = new Sisalto[lkm + 5];
143         this.lkm = 0;
144         for(Sisalto s: temp)
145             lisaa(s);
146     }
147     /**
148      * Poistetaan taulukosta parametrina tuotu sisältö-olio.
149      * @param poistettava 
150      */
151     public void poista(Sisalto poistettava) {
152         for (int i=0;i<lkm;i++) {
153             if (poistettava.equals(sisaltoTaulu[i]))
154                 poista(i--);            
155         }
156     }
157     /**
158      * Poistetaan taulukosti int-parametrin osoittava alkio.
159      * @param poistettava
160      */
161     public void poista(int poistettava) {
162         for(int j=poistettava;j<lkm-1;j++) {
163             sisaltoTaulu[j] = sisaltoTaulu[j+1];
164         }
165         sisaltoTaulu[lkm-1] = null;
166         lkm--;
167     }
168 
169     /* TIEDOSTON KÄSITTELY */
170     /**
171      * Haetaan tiedostosta sisältölista.
172      * @param tiedNimi
173      */
174     public void haeTiedostosta(String tiedNimi) {
175         if (tiedNimi.equals("")) // @version ht5
176             return;
177         BufferedReader fi;
178         Sisalto s;
179         String temp;
180         StringBuffer sb;
181         try {
182             fi = new BufferedReader(new FileReader(tiedNimi));
183             while (( temp = fi.readLine()) != null) {
184                 if (temp.charAt(0) == ';')
185                     continue;
186                 sb = new StringBuffer(temp);
187                 temp = Mjonot.erota(sb,'|');
188                 s = new Sisalto(sb.toString());
189                     lisaa(s);
190             }
191             fi.close();
192         } catch(FileNotFoundException ex) {
193             System.err.println("Ongelma tiedoston lukemisessa: " + ex.getMessage());
194             return;
195         } catch(IOException ex) {
196             System.err.println("Ongelma tiedoston lukemisessa: " + ex.getMessage());
197             return;
198         }
199     }
200     /**
201      * @param sisaltoTiedNimi
202      */
203     public void tallennaTiedostoon(String sisaltoTiedNimi) {
204         PrintStream fo;
205         try {
206             fo = new PrintStream(new FileOutputStream(sisaltoTiedNimi));
207             fo.println(";");
208             fo.println(";id | sisällön nimi");
209             Sisalto s;
210             for (int i=0;i<lkm;i++) {
211                 s = sisaltoTaulu[i];
212                 fo.println(s.getId() + "|" + s.getSisallonNimi());
213             }
214         } catch (FileNotFoundException ex) {
215             ex.printStackTrace();
216         }
217     }
218 
219     /* TULOSTAMINEN, SISALTOTAULUKON PALAUTUS JA TOSTRING */
220     /**
221      * Tulostetaan taulukon sisältö parametrin tuotuun PrintStreamiin.
222      * @param os
223      */
224     public void tulosta(PrintStream os) {
225         String erotin = "\n";
226         for(int i=0;i<lkm;i++) {
227             os.print(sisaltoTaulu[i]+erotin);
228         }
229     }
230     /**
231      * @return sisaltoTaulu
232      */
233     public Sisalto[] toStringTaulu() {
234         return sisaltoTaulu; 
235     }
236     /**
237      * toString, toimii kuten tulosta-metodi.
238      * Palauttaa tempin, johon kerää koko tulostuksen.
239      * @return temp
240      */
241     @Override
242     public String toString() {
243         String erotin = "\n";
244         String temp = "";
245         for(int i=0;i<lkm;i++) {
246             temp += (sisaltoTaulu[i]+erotin);
247         }
248         return temp;
249     }
250 
251     /* PÄÄOHJELMA */
252     /**
253      * Pääohjelma luokan testaamiseksi.
254      * @param args ei käytössä
255      * @example
256      * <pre name="test">
257      * Sisallot t = new Sisallot("");
258      * String tulos = "Martelo|Meia lua de frente|Benção|";
259      * String tulos2 = "Martelo|Benção|";
260      * Sisalto a = new Sisalto("Martelo");
261      * Sisalto b = new Sisalto("Meia lua de frente");
262      * Sisalto c = new Sisalto("Benção");
263      * t.lisaa(a);
264      * t.lisaa(b);
265      * t.lisaa(c);
266      * t.toString() === tulos;
267      * t.poista(b);
268      * t.toString() === tulos2;
269      * </pre>
270      */
271     public static void main(String[] args) {
272         Sisallot s = new Sisallot("SisaltoLista.txt");
273         Sisalto a = new Sisalto("Armada");
274         s.lisaa(a);
275         s.tulosta(System.out);
276     }
277 }
278