KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > applications > crontab > builders > CronJobs


1 /*
2  This software is OSI Certified Open Source Software.
3 OSI Certified is a certification mark of the Open Source Initiative.
4
5 The license (Mozilla version 1.0) can be read at the MMBase site.
6 See http://www.MMBase.org/license
7  */

8 package org.mmbase.applications.crontab.builders;
9
10 import org.mmbase.applications.crontab.*;
11 import org.mmbase.bridge.*;
12 import org.mmbase.module.core.*;
13 import org.mmbase.util.logging.*;
14
15 /**
16  * Builder that holds cronjobs and listens to changes.
17  * The builder also starts the CronDeamon. on startup the list of cronjobs is loaded into memory.
18  * <b>The builder uses the bridge to get a cloud using class security.</b>
19  * @author Kees Jongenburger
20  */

21 public class CronJobs extends MMObjectBuilder implements Runnable JavaDoc {
22
23     private static Logger log = Logging.getLoggerInstance(CronJobs.class);
24
25     CronDaemon cronDaemon = null;
26
27     public CronJobs() {
28         Thread JavaDoc t = new Thread JavaDoc(this);
29         t.setDaemon(true);
30         t.start();
31     }
32
33     /**
34      * This thread wait's for MMBase to be started and then adds all the crontEntries to the CronDaemon
35      */

36     public void run() {
37         while (!MMBase.getMMBase().getState()) {
38             try {
39                 Thread.sleep(2000);
40             } catch (InterruptedException JavaDoc e) {
41                 log.warn("thread interrupted, cronjobs will not be loaded");
42                 return;
43             }
44         }
45         cronDaemon = CronDaemon.getInstance();
46
47         NodeIterator nodeIterator = getCloud().getNodeManager(getTableName()).getList(null, null, null).nodeIterator();
48         while (nodeIterator.hasNext()) {
49             Node node = nodeIterator.nextNode();
50             CronEntry entry = null;
51             try {
52                 entry = createCronEntry(node);
53                 NodeList servers = node.getRelatedNodes("mmservers");
54                 if (servers.size() > 0) {
55                     String JavaDoc machineName = MMBase.getMMBase().getMachineName();
56                     boolean found = false;
57                     for (int i=0; i<servers.size(); i++) {
58                         Node server = servers.getNode(i);
59                         String JavaDoc name = server.getStringValue("name");
60                         if (name != null && name.equalsIgnoreCase(machineName)) {
61                             log.service("Adding cron entry [" + entry + "] for server [" + name + "]");
62                             cronDaemon.add(entry);
63                             found = true;
64                             break;
65                         } else {
66                             log.service("Ignoring related server [" + name + "], does not equal servername [" + machineName + "]");
67                         }
68                     }
69                     if (!found) {
70                         log.service("NOT Adding cron entry [" + entry + "], not related to server [" + machineName + "]");
71                     }
72                 } else {
73                     log.service("Adding cron entry [" + entry + "]");
74                     cronDaemon.add(entry);
75                 }
76             } catch (Exception JavaDoc e) {
77                 log.warn("did not add cronjob with id " + node.getNumber() + " because of error " + e.getMessage());
78             }
79         }
80     }
81
82     /**
83      * Inserts a cronjob into the database, and create and adds a cronEntry to the CronDeamon
84      */

85     public int insert(String JavaDoc owner, MMObjectNode objectNodenode) {
86         int number = super.insert(owner, objectNodenode);
87         try {
88             if (cronDaemon != null) {
89                 Node node = getCloud().getNode(number);
90                 cronDaemon.add(createCronEntry(node));
91             }
92         } catch (Exception JavaDoc e) {
93             throw new RuntimeException JavaDoc("error while creating cron entry with id " + number + " error " + e.getMessage(), e);
94         }
95         return number;
96     }
97
98     /**
99      * Commits a cronjob to the database.
100      * On commit of a cronjob, the job is first removed from the cronDeamon and a new cronEntry is created and added to the CronDaemon.
101      */

102     public boolean commit(MMObjectNode objectNodenode) {
103         boolean retval = super.commit(objectNodenode);
104         Node node = getCloud().getNode(objectNodenode.getNumber());
105         CronEntry entry = cronDaemon.getCronEntry("" + node.getNumber());
106         if (entry == null) {
107             log.warn("cron entry with ID " + node.getNumber() + " was not found. this usualy means it was invalid");
108         } else {
109             cronDaemon.remove(entry);
110         }
111         try {
112             cronDaemon.add(createCronEntry(node));
113         } catch (Exception JavaDoc e) {
114             throw new RuntimeException JavaDoc("error while creating cron entry with id " + node.getNumber() + " error " + e.getMessage());
115         }
116         return retval;
117     }
118
119     /**
120      * removes the node from the database and also removes it from the CronDaemon
121      */

122     public void removeNode(MMObjectNode objectNodenode) {
123         String JavaDoc number = "" + objectNodenode.getNumber();
124         super.removeNode(objectNodenode);
125         CronEntry entry = cronDaemon.getCronEntry(number);
126         if (entry != null) {
127             cronDaemon.remove(entry);
128         }
129     }
130
131     private CronEntry createCronEntry(Node node) throws Exception JavaDoc {
132         return new CronEntry("" + node.getNumber(), node.getStringValue("crontime"), node.getStringValue("name"), node.getStringValue("classfile"), node.getStringValue("config"),node.getIntValue("type"));
133     }
134
135     private Cloud getCloud() {
136         return LocalContext.getCloudContext().getCloud("mmbase");
137     }
138
139     /**
140      * sets the default type and crontime (does not work)
141      */

142     public void setDefaults(MMObjectNode node) {
143         super.setDefaults(node);
144         node.setValue("type", CronEntry.DEFAULT_JOB_TYPE);
145         node.setValue("crontime", "*/5 * * * *");
146     }
147
148 }
149
Popular Tags