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   * @author Timo Koski
16   *
17   */
18  public class Relaatiot {
19  
20      private Collection<Relaatio> alkiot = new ArrayList<Relaatio>();
21  
22      /* GETTERIT */
23      /**
24       * @return alkiot
25       */
26      public Collection<Relaatio> getAlkiot() {
27          return alkiot;
28      }
29      /**
30       * @param id 
31       * @return r.getHarjSisallot()
32       */
33      public int[] getHarjoituksenSisallot(int id) {
34          for(Relaatio r : alkiot) {
35              if (r.getHarjId() == id)
36                  return r.getHarjSisallot();
37          }
38          return new int[] {};
39      }
40  
41      /* RELAATION KÄSITTELY: LISÄYS JA POISTO */
42      /**
43       * @param r 
44       */
45      public void lisaa(Relaatio r) {
46          alkiot.add(r);
47      }
48      /**
49       * @param id
50       */
51      public void lisaa(int id) {
52          Relaatio r = new Relaatio(id);
53          alkiot.add(r);
54      }
55      /**
56       * @param id
57       * @param sisLista
58       */
59      public void tallennaSisRelaatioon(int id, int[] sisLista) {
60          for (Relaatio r : alkiot) {     // käydään kaikki relaatiot läpi
61              if (r.getHarjId() == id) {  // verrataan niihin id:tä
62                  for (int a : sisLista) {    // käydään tuotu sisältölista läpi
63                      boolean loytyikoDuplikaattia = false;   // apumuuttuja
64                      for(int t : r.getHarjSisallot()) {  // käydään id-täsmäävän relaation sisällöt läpi
65                          if (a == t) {   // verrataan int-sisältöjä tuotavaan uuteen sisältöön
66                              loytyikoDuplikaattia = true; // jos löytyi duplikaatti, muutetaan apumuuttujan arvo
67                              break;
68                          }
69                      }
70                      if (loytyikoDuplikaattia) // jos löytyi duplikaatti
71                          continue;   // jatketaan seuraavasta sisällöstä
72                      r.lisaa(a);     // muutoin lisätään uusi sisältö
73                  }
74              }
75          }
76      }
77      /**
78       * Tallennetaan uusi sisalto relaatioon.
79       * @param harjoituksenId
80       * @param idAtSelectedIndex
81       */
82      public void tallennaUusiSisaltoRelaatioon(int harjoituksenId, int idAtSelectedIndex) {
83          if (idAtSelectedIndex == -1)
84              return;
85          for (Relaatio r : alkiot) {
86              if (r.getHarjId() == harjoituksenId) {
87                  boolean onkoDuplikaattia = false;
88                  for (int a : r.getHarjSisallot()) {
89                      if (a==idAtSelectedIndex)
90                          onkoDuplikaattia = true;
91                  }
92                  if (!onkoDuplikaattia)
93                      r.lisaa(idAtSelectedIndex);
94              }
95          }
96      }
97      /**
98       * Poistetaan valittu sisältö relaatiosta
99       * @param harjoituksenId
100      * @param sisallonId
101      */
102     public void poistaValittuSisaltoRelaatiosta(int harjoituksenId, int sisallonId) {
103         for (Relaatio r : alkiot) {
104             if (r.getHarjId() == harjoituksenId) {
105                 r.poistaSisalto(sisallonId);
106     
107             }
108         }
109     }
110     /**
111      * @param harjoitusId
112      * @param index
113      */
114     public void poistaRelaatiosta(int harjoitusId, int index) {
115         // TODO Auto-generated method stub
116         for (Relaatio r : alkiot) {
117             if (r.getHarjId() == harjoitusId)
118                 r.poista(index);
119         }
120     }
121 
122     /* TIEDOSTONKÄSITTELY JA TULKINTA */
123     /**
124      * @param fileName
125      */
126     public void lueTiedostosta(String fileName) {
127         String tiedNimi;
128         tiedNimi = fileName.substring(0,fileName.length()-3);
129         tiedNimi += "rel";
130         BufferedReader fo;
131         String tempRivi;
132         try {
133             fo = new BufferedReader(new FileReader(tiedNimi));
134             while((tempRivi = fo.readLine()) != null) {
135                 tulkitse(tempRivi);
136             }
137         } catch (FileNotFoundException e) {
138             // System.err.println("Rel: Tiedostoa ei löydy. Luodaan tallennettaessa.");
139         } catch (IOException e) {
140             // TODO Auto-generated catch block
141             e.printStackTrace();
142         }
143     }
144     /**
145      * @param s
146      */
147     public void tulkitse(String s) {
148         StringBuffer sb = new StringBuffer(s);
149         int id = -1;
150         try {
151             id = Integer.parseInt(Mjonot.erota(sb, '|'));
152         } catch (NumberFormatException e) {
153             // System.err.println("Relaatiot: Ei parseta integeriä.");
154             return;
155         }
156         if (id == -1)
157             return;
158         Relaatio r = new Relaatio(id);
159         while (!sb.toString().equals("")) {
160             r.lisaa(Integer.parseInt(Mjonot.erota(sb,',')));
161         }
162         lisaa(r);
163     }
164     /**
165      * Metodi kirjoittaa tiedostoon (nimi parametrina) harjoitukseen
166      * sidotut sisällöt. Ne luetaan id:n mukaan relaatioista.
167      * @param harjoitukset 
168      * @param fileName 
169      * 
170      */
171     public void kirjoitaTiedostoon(Harjoitukset harjoitukset, String fileName) {
172         String tiedNimi;
173         PrintStream os;
174         tiedNimi = fileName.substring(0,fileName.length()-3);
175         tiedNimi += "rel";
176         try {
177             os = new PrintStream(new FileOutputStream(tiedNimi),false); // TODO:tarkista true-false
178             os.println(";id|sisällöt");
179             for(Harjoitus h: harjoitukset.getAlkiot()) {
180                 int a = h.getId();
181                 for(Relaatio r : alkiot) {
182                     if (r.getHarjId() == a) {
183                         os.println(a+"|"+r.toString());
184                         break;
185                     }
186                 }
187             }
188         } catch (FileNotFoundException e) {
189             // TODO Auto-generated catch block
190             e.printStackTrace();
191         }
192     }
193 
194     /* TULOSTA JA TOSTRING */
195     /**
196      * Tulosta-metodi, joka hakee tulostettavan datan toStringistä
197      * Parametrina PrintStream.
198      * @param os
199      */
200     public void tulosta(PrintStream os) {
201         os.println(toString());
202     }
203 
204     /**
205      * toString, joka palauttaa kaikkien Relaatio-olioiden toStringien tuloksen.
206      */
207     @Override
208     public String toString() {
209         String temp = "";
210         for (Relaatio r: alkiot) {
211             temp += r.toString() + "\n";
212         }
213         return temp;
214     }
215     
216     /* PÄÄOHJELMA */
217 
218     /**
219      * Pääohjelma luokan testausta varten.
220      * @param args ei käytössä
221      * @example
222      * <pre name="test">
223      * Relaatiot rel = new Relaatiot();
224      * Relaatio p = new Relaatio(4);
225      * Relaatio q = new Relaatio(7);
226      * Relaatio r = new Relaatio(5);
227      * Relaatio s = new Relaatio(1);
228      * Relaatio t = new Relaatio(11);
229      * Relaatio u = new Relaatio(4);
230      * rel.lisaa(p);
231      * rel.lisaa(q);
232      * rel.lisaa(r);
233      * rel.lisaa(s);
234      * rel.lisaa(t);
235      * rel.lisaa(u);
236      * 
237      * p.lisaa(1);
238      * p.lisaa(22);
239      * p.lisaa(61);
240      * q.lisaa(4);
241      * r.lisaa(56);
242      * r.lisaa(67);
243      * r.lisaa(8);
244      * r.lisaa(1);
245      * s.lisaa(1);
246      * t.lisaa(2);
247      * u.lisaa(91);
248      * u.lisaa(5);
249      * 
250      * String tulos =
251      * "1, 22, 61\n"+
252      * "4\n"+
253      * "56, 67, 8, 1\n"+
254      * "1\n"+
255      * "2\n"+
256      * "91, 5\n";
257      * 
258      * rel.toString() === tulos;
259      * </pre>
260      */
261     public static void main(String[] args) {
262 
263         Relaatiot r = new Relaatiot();
264 
265         Relaatio a = new Relaatio(1);
266         Relaatio b = new Relaatio(2);
267 
268         a.lisaa(1);
269         a.lisaa(5);
270         b.lisaa(65);
271         b.lisaa(34);
272         b.lisaa(4);
273 
274         r.lisaa(a);
275         r.lisaa(b);
276 
277         System.out.println(r.toString());
278     }
279 }
280