View Javadoc

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  	 * User Quartz to set up a schedule
63  	 * 
64  	 * @param name
65  	 * @param time
66  	 * @param type
67  	 * @param channel
68  	 * @param volume
69  	 * @param shuffle
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  	 * So my AlarmClock.xml file is in a subdirectory of Plugins, we have to
96  	 * find it the read it and schedule the triggers..
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 	 * @param element
139 	 * @param name
140 	 * @return
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 				// log.debug("ElementName: " + name + " Value: " + res);
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 }