1 /************************************************************************
2 * Copyright (c) 2003-2006 The Apache Software Foundation. *
3 * All rights reserved. *
4 * ------------------------------------------------------------------- *
5 * Licensed under the Apache License, Version 2.0 (the "License"); you *
6 * may not use this file except in compliance with the License. You *
7 * may obtain a copy of the License at: *
8 * *
9 * http://www.apache.org/licenses/LICENSE-2.0 *
10 * *
11 * Unless required by applicable law or agreed to in writing, software *
12 * distributed under the License is distributed on an "AS IS" BASIS, *
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or *
14 * implied. See the License for the specific language governing *
15 * permissions and limitations under the License. *
16 ***********************************************************************/
17
18 package org.apache.james.fetchmail;
19
20 import java.util.ArrayList;
21 import java.util.Iterator;
22
23 import org.apache.avalon.cornerstone.services.scheduler.PeriodicTimeTrigger;
24 import org.apache.avalon.cornerstone.services.scheduler.TimeScheduler;
25 import org.apache.avalon.framework.activity.Disposable;
26 import org.apache.avalon.framework.activity.Initializable;
27 import org.apache.avalon.framework.configuration.Configurable;
28 import org.apache.avalon.framework.configuration.Configuration;
29 import org.apache.avalon.framework.configuration.ConfigurationException;
30 import org.apache.avalon.framework.container.ContainerUtil;
31 import org.apache.avalon.framework.logger.AbstractLogEnabled;
32 import org.apache.avalon.framework.service.ServiceException;
33 import org.apache.avalon.framework.service.ServiceManager;
34 import org.apache.avalon.framework.service.Serviceable;
35
36 /***
37 * A class to instantiate and schedule a set of mail fetching tasks
38 *
39 * $Id: FetchScheduler.java 365582 2006-01-03 08:51:21 +0000 (mar, 03 gen 2006) bago $
40 *
41 * @see org.apache.james.fetchmail.FetchMailOriginal#configure(Configuration) FetchMailOriginal
42 *
43 */
44 public class FetchScheduler
45 extends AbstractLogEnabled
46 implements Serviceable, Configurable, Initializable, Disposable, FetchSchedulerMBean {
47
48 /***
49 * Configuration object for this service
50 */
51 private Configuration conf;
52
53 /***
54 * The service manager that allows access to the system services
55 */
56 private ServiceManager m_manager;
57
58 /***
59 * The scheduler service that is used to trigger fetch tasks.
60 */
61 private TimeScheduler scheduler;
62
63 /***
64 * Whether this service is enabled.
65 */
66 private volatile boolean enabled = false;
67
68 private ArrayList theFetchTaskNames = new ArrayList();
69
70 /***
71 * @see org.apache.avalon.framework.service.Serviceable#service( ServiceManager )
72 */
73 public void service(ServiceManager comp) throws ServiceException
74 {
75 m_manager = comp;
76 }
77
78 /***
79 * @see org.apache.avalon.framework.configuration.Configurable#configure(Configuration)
80 */
81 public void configure(Configuration conf) throws ConfigurationException
82 {
83 this.conf = conf;
84 }
85
86 /***
87 * @see org.apache.avalon.framework.activity.Initializable#initialize()
88 */
89 public void initialize() throws Exception
90 {
91 enabled = conf.getAttributeAsBoolean("enabled", false);
92 if (enabled)
93 {
94 scheduler = (TimeScheduler) m_manager.lookup(TimeScheduler.ROLE);
95 Configuration[] fetchConfs = conf.getChildren("fetch");
96 for (int i = 0; i < fetchConfs.length; i++)
97 {
98 FetchMail fetcher = new FetchMail();
99 Configuration fetchConf = fetchConfs[i];
100 String fetchTaskName = fetchConf.getAttribute("name");
101 ContainerUtil.enableLogging(fetcher,getLogger().getChildLogger(fetchTaskName));
102 ContainerUtil.service(fetcher,m_manager);
103 ContainerUtil.configure(fetcher,fetchConf);
104 Integer interval =
105 new Integer(fetchConf.getChild("interval").getValue());
106 PeriodicTimeTrigger fetchTrigger =
107 new PeriodicTimeTrigger(0, interval.intValue());
108
109 scheduler.addTrigger(fetchTaskName, fetchTrigger, fetcher);
110 theFetchTaskNames.add(fetchTaskName);
111 }
112
113 if (getLogger().isInfoEnabled())
114 getLogger().info("FetchMail Started");
115 System.out.println("FetchMail Started");
116 }
117 else
118 {
119 if (getLogger().isInfoEnabled())
120 getLogger().info("FetchMail Disabled");
121 System.out.println("FetchMail Disabled");
122 }
123 }
124
125 /***
126 * @see org.apache.avalon.framework.activity.Disposable#dispose()
127 */
128 public void dispose()
129 {
130 if (enabled)
131 {
132 getLogger().info("FetchMail dispose...");
133 Iterator nameIterator = theFetchTaskNames.iterator();
134 while (nameIterator.hasNext())
135 {
136 scheduler.removeTrigger((String) nameIterator.next());
137 }
138 getLogger().info("FetchMail ...dispose end");
139 }
140 }
141
142 /***
143 * Describes whether this service is enabled by configuration.
144 *
145 * @return is the service enabled.
146 */
147 public final boolean isEnabled() {
148 return enabled;
149 }
150
151 }