ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/cms/source/server/uk/org/iscream/cms/server/filter/FilterMain.java
Revision: 1.32
Committed: Tue Mar 19 16:37:28 2002 UTC (22 years, 2 months ago) by tdb
Branch: MAIN
Changes since 1.31: +118 -53 lines
Log Message:
New options added to the configuration to permit activiation of individual
input feeds in the Filter. You could, for example, disable the CORBA feed
on all filters that have no children.

File Contents

# Content
1 //---PACKAGE DECLARATION---
2 package uk.org.iscream.cms.server.filter;
3
4 //---IMPORTS---
5 import uk.org.iscream.cms.server.util.*;
6 import uk.org.iscream.cms.server.core.*;
7 import uk.org.iscream.cms.server.componentmanager.*;
8 import uk.org.iscream.cms.server.filter.*;
9
10 /**
11 * A Filter Startup Class
12 * A filter is an iscream component.
13 *
14 * @author $Author: tdb $
15 * @version $Id: FilterMain.java,v 1.31 2001/05/29 17:02:35 tdb Exp $
16 */
17 public class FilterMain implements Component {
18
19 //---FINAL ATTRIBUTES---
20
21 /**
22 * The current CVS revision of this class
23 */
24 public static final String REVISION = "$Revision: 1.31 $";
25
26 //---STATIC METHODS---
27
28 //---CONSTRUCTORS---
29
30 /**
31 * Constructs a Filter with the name given
32 *
33 * @param givenName the name
34 */
35 public FilterMain(String givenName) {
36 NAME = givenName;
37 }
38
39 //---PUBLIC METHODS---
40
41 /**
42 * Starts the Filter component
43 */
44 public void start() throws ComponentStartException {
45 // get references to key objects
46 _logger = _refman.getLogger();
47
48 _logger.write(toString(), Logger.SYSINIT, "coming up");
49
50 ConfigurationProxy cp = ConfigurationProxy.getInstance();
51
52 // which input methods do we need to activate?
53 // default to activating them
54 boolean activateTCPReader = true;
55 boolean activateUDPReader = true;
56 boolean activateCORBAReader = true;
57
58 // check for TCP Reader
59 try {
60 int tcp = Integer.parseInt(cp.getProperty(FilterMain.NAME, "Filter.ActivateTCPReader"));
61 activateTCPReader = (tcp == 1);
62 } catch (PropertyNotFoundException e) {
63 activateTCPReader = false;
64 } catch (NumberFormatException e) {
65 activateTCPReader = false;
66 }
67 // check for UDP Reader
68 try {
69 int udp = Integer.parseInt(cp.getProperty(FilterMain.NAME, "Filter.ActivateUDPReader"));
70 activateUDPReader = (udp == 1);
71 } catch (PropertyNotFoundException e) {
72 activateUDPReader = false;
73 } catch (NumberFormatException e) {
74 activateUDPReader = false;
75 }
76 // check for CORBA Reader
77 try {
78 int corba = Integer.parseInt(cp.getProperty(FilterMain.NAME, "Filter.ActivateCORBAReader"));
79 activateCORBAReader = (corba == 1);
80 } catch (PropertyNotFoundException e) {
81 activateCORBAReader = false;
82 } catch (NumberFormatException e) {
83 activateCORBAReader = false;
84 }
85
86 // need to use the Queue later on
87 Queue queue;
88
89 // there's little point starting a Queue and a FilterThread
90 // if nothing is going to be giving us any data
91 if(activateTCPReader || activateUDPReader || activateCORBAReader) {
92 // see if this Queue needs a size limit
93 try {
94 int queueSizeLimit = Integer.parseInt(cp.getProperty(FilterMain.NAME, "Queue.SizeLimit"));
95 String queueRemoveAlgorithm = cp.getProperty(FilterMain.NAME, "Queue.RemoveAlgorithm");
96 int algorithm = StringUtils.getStringPos(queueRemoveAlgorithm, Queue.algorithms);
97 if(algorithm != -1) {
98 _logger.write(toString(), Logger.DEBUG, "Starting Queue with size limit of "+queueSizeLimit+", using remove algorithm "+queueRemoveAlgorithm);
99 // we have valid values, so lets start it.
100 queue = new Queue(queueSizeLimit, algorithm);
101 }
102 else {
103 _logger.write(toString(), Logger.WARNING, "Bad Queue Algorithm configuration, not known: "+queueRemoveAlgorithm);
104 // just don't activate a limit
105 queue = new Queue();
106 }
107
108 } catch (PropertyNotFoundException e) {
109 _logger.write(toString(), Logger.DEBUG, "Optional config not set: "+e);
110 // just don't activate a limit
111 queue = new Queue();
112 } catch (NumberFormatException e) {
113 _logger.write(toString(), Logger.WARNING, "Bad Queue SizeLimit configuration: "+e);
114 // just don't activate a limit
115 queue = new Queue();
116 }
117
118 // startup a monitor on this queue
119 try {
120 // try to get the interval, if this fails, we won't start up the monitor
121 int queueMonitorInterval = Integer.parseInt(cp.getProperty(FilterMain.NAME, "Queue.MonitorInterval"));
122 String queueName = NAME + " Filter";
123 queue.startMonitor(queueMonitorInterval*1000, queueName);
124 } catch (PropertyNotFoundException e) {
125 _logger.write(toString(), Logger.WARNING, "failed to find queue monitor config, disabling. " + e);
126 }
127
128 // Start a filter thread
129 _logger.write(toString(), Logger.SYSINIT, "starting Filter Thread / Queue consumer");
130 FilterThread filterThread = new FilterThread(queue);
131 filterThread.start();
132 }
133 else {
134 // it's pointless carrying on really...
135 throw new ComponentStartException("Can't start Filter without any inbound data feeds");
136 }
137
138 // the corba listener needs these to be set, so lets
139 // make them something obviously invalid initially
140 int TCPListenPort = -1;
141 int UDPListenPort = -1;
142
143 // TCP Reader start (for heartbeats)
144 if(activateTCPReader) {
145 try {
146 // get the port number from the configuration
147 TCPListenPort = Integer.parseInt(cp.getProperty(FilterMain.NAME, "Filter.TCPListenPort"));
148 // start the TCPReader
149 _logger.write(toString(), Logger.SYSINIT, "starting Filter TCP listener");
150 TCPReader tcpReader = new TCPReader(TCPListenPort, queue);
151 tcpReader.start();
152 } catch (PropertyNotFoundException e) {
153 _logger.write(toString(), Logger.WARNING, "Unable to start TCPReader due to missing configuration: " + e);
154 } catch (NumberFormatException e) {
155 _logger.write(toString(), Logger.WARNING, "Unable to start TCPReader due to invalid configuration: " + e);
156 }
157 }
158
159 // UDP Reader start (for inbound host data)
160 if(activateUDPReader) {
161 try {
162 // get the port number from the configuration
163 UDPListenPort = Integer.parseInt(cp.getProperty(FilterMain.NAME, "Filter.UDPListenPort"));
164 // start the UDPReader
165 _logger.write(toString(), Logger.SYSINIT, "starting Filter UDP listener");
166 UDPReader udpReader = new UDPReader(UDPListenPort, queue);
167 udpReader.start();
168 } catch (PropertyNotFoundException e) {
169 _logger.write(toString(), Logger.WARNING, "Unable to start UDPReader due to missing configuration: " + e);
170 } catch (NumberFormatException e) {
171 _logger.write(toString(), Logger.WARNING, "Unable to start UDPReader due to invalid configuration: " + e);
172 }
173 }
174
175 // FilterServant start (for inbound child filter data)
176 if(activateCORBAReader) {
177 // start the FilterServant
178 _logger.write(toString(), Logger.SYSINIT, "starting Servant to listen for downstream filters");
179 FilterServant filterServant = new FilterServant(TCPListenPort, UDPListenPort, queue);
180 _refman.bindToOrb(filterServant, "iscream.Filter." + FilterMain.NAME);
181 }
182
183 _logger.write(toString(), Logger.SYSINIT, "started");
184 }
185
186 /**
187 * Does a dependency check. Used mainly at startup to
188 * see if the required dependencies (components) are up
189 * and running.
190 *
191 * @return a boolean value, true if the depdencies are satisfied
192 */
193 public boolean depCheck() {
194 try {
195 org.omg.CORBA.Object obj;
196 // first check the ConfigurationManager is alive
197 obj = _refman.getCORBARef("iscream.ConfigurationManager");
198 // then suss out our parent filter
199 ConfigurationProxy cp = ConfigurationProxy.getInstance();
200 String parentFilterName = cp.getProperty(NAME, "Filter.parentFilter");
201 // finally check the parent filter is alive
202 obj = _refman.getCORBARef("iscream.Filter." + parentFilterName);
203 } catch(ComponentCORBAException e) {
204 System.err.println(toString() + ": Dependency Failure: "+e);
205 return false;
206 } catch(PropertyNotFoundException e) {
207 System.err.println(toString() + ": Unable to obtain configuration: "+e);
208 return false;
209 }
210 // dependency check suceeded
211 return true;
212 }
213
214 /**
215 * Overrides the {@link java.lang.Object#toString() Object.toString()}
216 * method to provide clean logging (every class should have this).
217 *
218 * This uses the uk.org.iscream.cms.server.util.NameFormat class
219 * to format the toString()
220 *
221 * @return the name of this class and its CVS revision
222 */
223 public String toString() {
224 return FormatName.getName(
225 NAME,
226 getClass().getName(),
227 REVISION);
228 }
229
230 //---PRIVATE METHODS---
231
232 //---ACCESSOR/MUTATOR METHODS---
233
234 //---ATTRIBUTES---
235
236 /**
237 * This holds a reference to the
238 * system logger that is being used.
239 */
240 private Logger _logger;
241
242 /**
243 * A reference to the reference manager in use
244 */
245 private ReferenceManager _refman = ReferenceManager.getInstance();
246
247 //---STATIC ATTRIBUTES---
248
249 /**
250 * The friendly name for this component, used by
251 * all related classes.
252 * This is set from the configuration.
253 */
254 public static String NAME;
255
256 }