projectresurrection.Schedule.java Source code

Java tutorial

Introduction

Here is the source code for projectresurrection.Schedule.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package projectresurrection;

import java.io.*;
import java.util.*;
import java.nio.file.*;
import java.nio.file.NoSuchFileException;
import org.joda.time.*;
import com.thoughtworks.xstream.*;

/**
 *
 * @author Onryo
 */
public class Schedule implements Runnable {

    private final String THREAD_NAME = "scheduleThread";
    private final String FILE_NAME = "schedule.xml";
    private Thread t;
    private XStream xstream = new XStream();
    private ArrayList<ArrayList<ArrayList>> container = new ArrayList<ArrayList<ArrayList>>();

    public Schedule() {
        try {
            if (!new File(FILE_NAME).exists()) {
                throw new NoSuchFileException("");
            }
            String xml = "";
            String line = null;
            XStream xstream = new XStream();
            FileReader fr = new FileReader(FILE_NAME);
            BufferedReader br = new BufferedReader(fr);
            while ((line = br.readLine()) != null) {
                xml += line;
            }
            br.close();
            container = (ArrayList) xstream.fromXML(xml);
        } catch (Exception e) {
            container = new ArrayList<ArrayList<ArrayList>>();
            container.add(new ArrayList<ArrayList>());
            container.add(new ArrayList<ArrayList>());
            container.add(new ArrayList<ArrayList>());
        }
        save();
        t = new Thread(this, THREAD_NAME);
        t.start();
    }

    public void save() {
        try {
            if (new File(FILE_NAME).exists()) {
                Files.delete(Paths.get(FILE_NAME));
            }
            String xml = xstream.toXML(container);
            FileWriter file = new FileWriter(FILE_NAME);
            file.write(xml);
            file.flush();
            file.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void announce(String desc) {
        Eve.voice.say(desc);
    }

    public void addSchedule(String desc, DateTime setDate, String command) {
        ArrayList list = new ArrayList(Arrays.asList(desc, setDate.toString(), command));
        container.get(0).add(list);
        save();
    }

    public void addReminder(String desc, DateTime setDate) {
        ArrayList list = new ArrayList(Arrays.asList(desc, setDate.toString()));
        container.get(1).add(list);
        save();
    }

    public void addPersistant(String desc, DateTime setDate, String frequency) {
        ArrayList list = new ArrayList(Arrays.asList(desc, setDate.toString(), frequency));
        container.get(2).add(list);
        save();
    }

    public ArrayList getSchedules() {
        return container.get(0);
    }

    public List getReminders() {
        return container.get(1);
    }

    public List getPersistants() {
        return container.get(2);
    }

    public void removeSchedule(String desc) {
        for (int i = 0; i < container.get(0).size(); i++) {
            if (desc.equals(container.get(0).get(i).get(0).toString())) {
                container.get(0).remove(i);
            }
        }
        save();
    }

    public void removeReminder(String desc) {
        for (int i = 0; i < container.get(1).size(); i++) {
            if (desc.equals(container.get(1).get(i).get(0).toString())) {
                container.get(1).remove(i);
            }
        }
        save();
    }

    public void removePersistant(String desc) {
        for (int i = 0; i < container.get(2).size(); i++) {
            if (desc.equals(container.get(2).get(i).get(0).toString())) {
                container.get(2).remove(i);
            }
        }
        save();
    }

    public void run() {
        while (true) {
            DateTime date = Eve.clock.getCurrent();
            try {
                for (int i = 0; i < container.get(0).size(); i++) {
                    DateTime setDate = new DateTime(container.get(0).get(i).get(1));
                    if (date.getMillis() > setDate.getMillis()) {
                        Eve.addCommand(container.get(0).get(i).get(2).toString());
                        container.get(0).remove(i);
                        save();
                    }
                }
                for (int i = 0; i < container.get(1).size(); i++) {
                    DateTime setDate = new DateTime(container.get(1).get(i).get(1));
                    if (date.getMillis() > setDate.getMillis()) {
                        announce(container.get(1).get(i).get(0).toString());
                        container.get(1).remove(i);
                        save();
                    }
                }
                for (int i = 0; i < container.get(2).size(); i++) {
                    DateTime setDate = new DateTime(container.get(2).get(i).get(1));
                    if (date.getMillis() > setDate.getMillis()) {
                        announce(container.get(2).get(i).get(0).toString());
                        DateTime temp = new DateTime(container.get(2).get(i).get(1));
                        container.get(2).get(i).remove(1);
                        switch (container.get(2).get(i).get(1).toString()) {
                        case "Annual":
                            container.get(2).get(i).add(1, new DateTime(temp.plusYears(1)));
                            break;
                        case "Bi-annaul":
                            container.get(2).get(i).add(1, new DateTime(temp.plusMonths(6)));
                            break;
                        case "Monthly":
                            container.get(2).get(i).add(1, new DateTime(temp.plusMonths(1)));
                            break;
                        case "Weekly":
                            container.get(2).get(i).add(1, new DateTime(temp.plusWeeks(1)));
                            break;
                        case "Daily":
                            container.get(2).get(i).add(1, new DateTime(temp.plusDays(1)));
                            break;
                        }
                        save();
                    }
                }
                Thread.sleep(1000);
            } catch (Exception e) {
                Thread.currentThread().interrupt();
            }
        }
    }
}