1 package org.rpi.plugin.alarmclock;
2
3 import java.io.File;
4 import java.io.FileInputStream;
5 import java.util.Date;
6 import java.util.Map;
7 import java.util.Properties;
8 import java.util.TimerTask;
9
10 import javax.xml.parsers.DocumentBuilder;
11 import javax.xml.parsers.DocumentBuilderFactory;
12
13 import net.xeoh.plugins.base.annotations.PluginImplementation;
14 import net.xeoh.plugins.base.annotations.events.Shutdown;
15
16 import org.apache.log4j.Level;
17 import org.apache.log4j.LogManager;
18 import org.apache.log4j.Logger;
19 import org.quartz.CronScheduleBuilder;
20 import org.quartz.JobBuilder;
21 import org.quartz.JobDetail;
22 import org.quartz.Scheduler;
23 import org.quartz.Trigger;
24 import org.quartz.TriggerBuilder;
25 import org.quartz.TriggerKey;
26 import org.quartz.impl.StdSchedulerFactory;
27 import org.rpi.os.OSManager;
28 import org.rpi.player.PlayManager;
29 import org.w3c.dom.Document;
30 import org.w3c.dom.Element;
31 import org.w3c.dom.Node;
32 import org.w3c.dom.NodeList;
33
34 @PluginImplementation
35 public class AlarmClockImpl implements AlarmClockInterface {
36
37 private static Logger log = Logger.getLogger(AlarmClockImpl.class);
38
39 private PlayManager iPlayer = null;
40 private Scheduler scheduler;
41
42 public AlarmClockImpl() {
43 log.debug("Creating Alarm Clock Plugin");
44 try {
45 LogManager.getLogger(Class.forName("org.quartz.core.QuartzSchedulerThread")).setLevel(Level.INFO);
46 LogManager.getLogger(Class.forName("org.quartz.utils.UpdateChecker")).setLevel(Level.ERROR);
47 } catch (ClassNotFoundException e1) {
48 log.error(e1);
49 }
50 log.debug("AlarmClock");
51 this.iPlayer = PlayManager.getInstance();
52 try {
53 scheduler = StdSchedulerFactory.getDefaultScheduler();
54 scheduler.start();
55 } catch (Exception e) {
56 log.error("Error Starting Scheduler");
57 }
58 getConfig();
59 }
60
61
62
63
64
65
66
67
68
69
70
71 private void createSchedule(String name, String time, String type, String channel, String volume, String shuffle) {
72 try {
73 TriggerKey tr_key = new TriggerKey(name, "radioPlugin");
74 JobDetail job = JobBuilder.newJob(AlarmClockJob.class).withIdentity(name, "group1").build();
75 Map dataMap = job.getJobDataMap();
76 dataMap.put("id", name);
77 dataMap.put("Volume", volume);
78 dataMap.put("Shuffle", shuffle);
79 dataMap.put("type", type);
80 dataMap.put("channel", channel);
81 Trigger trigger = TriggerBuilder.newTrigger().withIdentity(tr_key).withSchedule(CronScheduleBuilder.cronSchedule(time)).forJob(job).build();
82 if (scheduler.checkExists(tr_key)) {
83 Date next_time = scheduler.rescheduleJob(tr_key, trigger);
84 log.info("Schedule has been changed, next execution time : " + next_time.toString() + " -- Job: " + name);
85 } else {
86 Date next_time = scheduler.scheduleJob(job, trigger);
87 log.info("Job has been scheduled, next execution time : " + next_time.toString() + " -- Job: " + name);
88 }
89 } catch (Exception e) {
90 log.error("Error Creating Job: ", e);
91 }
92 }
93
94
95
96
97
98 private void getConfig() {
99 try {
100 String class_name = this.getClass().getName();
101 log.debug("Find Class, ClassName: " + class_name);
102 String path = OSManager.getInstance().getFilePath(this.getClass(),false);
103 log.debug("Getting AlarmClock.xml from Directory: " + path);
104 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
105 DocumentBuilder builder = factory.newDocumentBuilder();
106 Document doc = builder.parse(new File(path + "AlarmClock.xml"));
107 NodeList listOfChannels = doc.getElementsByTagName("Alarm");
108 int i = 1;
109 for (int s = 0; s < listOfChannels.getLength(); s++) {
110 String name = null;
111 String time = null;
112 String type = null;
113 String channel = "";
114 String volume = "";
115 String shuffle = "";
116
117 Node alarm = listOfChannels.item(s);
118 if (alarm.getNodeType() == Node.ELEMENT_NODE) {
119 Element element = (Element) alarm;
120 name = getElementTest(element, "name");
121 time = getElementTest(element, "time");
122 type = getElementTest(element, "type");
123 volume = getElementTest(element, "volume");
124 shuffle = getElementTest(element, "shuffle");
125 channel = getElementTest(element, "channel");
126 }
127
128 createSchedule(name, time, type, channel, volume, shuffle);
129 }
130 } catch (Exception e) {
131 log.error("Error Reading AlarmClock.xml");
132 }
133 }
134
135
136
137
138
139
140
141
142 private String getElementTest(Element element, String name) {
143 String res = "";
144 NodeList nid = element.getElementsByTagName(name);
145 if (nid != null) {
146 Element fid = (Element) nid.item(0);
147 if (fid != null) {
148 res = fid.getTextContent();
149
150 return res;
151
152 }
153 }
154 return res;
155 }
156
157 private String getAlarmTime() {
158 Properties pr = new Properties();
159 try {
160 pr.load(new FileInputStream("app.properties"));
161 return pr.getProperty("alarmtime");
162 } catch (Exception e) {
163 log.error(e);
164 }
165 return "";
166 }
167
168 @Shutdown
169 public void bye() {
170 log.debug("ShutDown Called");
171 }
172
173 class RemindTask extends TimerTask {
174 public void run() {
175 log.debug("Time For Next Track");
176 iPlayer.nextTrack();
177 }
178 }
179
180
181
182 }