package kalender; import java.util.*; import java.text.*; import java.beans.*; import java.io.*; public class Kalender { private boolean ændret; private List liste; /** * @param kal Datoen vi ønsker at kende indekset i listen på * @returns indekset der skal bruges i kald til sæt() og hent(). */ public int beregnIndex(Calendar kal) { int år = kal.get(Calendar.YEAR); int dag = kal.get(Calendar.DAY_OF_YEAR); // det vigtigste er at to dage aldrig får samme indeks return (år-2003)*366+dag; } /** * Sæt teksten for en bestemt dag. * @see #beregnIndeks(Calendar) * @param indeks Indekset i listen. Skal først findes med beregnIndeks() * @param tekst Teksten for dagen */ public void sætDagstekst(int indeks, String tekst) { // Fyld op med tomme strenge hvis der gås ud over listen while (indeks>=liste.size()) liste.add(""); liste.set(indeks,tekst); ændret = true; } /** * Hent teksten for en bestemt dag. * @see #beregnIndeks(GregorianCalendar) * @param index Indekset i listen. Skal først findes med beregnIndeks() * @return tekst Teksten for dagen */ public String hentDagstekst(int indeks) { if (indeks<0 || liste.size()<=indeks) return ""; else return (String) liste.get(indeks); } public static final Kalender instans = new Kalender(); // singleton med private Kalender() { // privat konstruktør try { // indlæs kalenderen fra XML-fil på disken (hvis den findes) XMLDecoder kal = new XMLDecoder(new FileInputStream("kalender.xml")); // alternativ: hent serialiseret objekt i stedet for XML-data //ObjectInputStream kal = new ObjectInputStream( // new FileInputStream("kalender.ser")); liste = (ArrayList) kal.readObject(); kal.close(); System.out.println("Kalender indlæst: "+liste); } catch (Exception e) { System.out.println("Kalender ikke indlæst, opretter ny: "+e); liste = new ArrayList(); } GemRegelmæssigt g = new GemRegelmæssigt(); // gemmer kalenderen på disken } /** Sørger for at gemme kalenderen regelmæssigt (i en separat tråd) */ class GemRegelmæssigt extends Thread { public GemRegelmæssigt() { setDaemon(true); // systemet må godt stoppe selvom tråden stadig kører setPriority(MIN_PRIORITY); start(); } public void run() { while (true) try { Thread.sleep(1*60*1000); // hvert minut, if (ændret) { // hvis kalenderen er ændret ændret = false; // gem kalenderen på disken // gem som XML XMLEncoder kal = new XMLEncoder(new FileOutputStream("kalender.xml")); // alternativ: gem som serialiseret objekt i stedet for XML //ObjectOutputStream kal = new ObjectOutputStream( // new FileOutputStream("kalender.ser")); kal.writeObject(liste); kal.close(); System.out.println("Kalender gemt: "+liste); } } catch (Exception e) { e.printStackTrace(); } } } }