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
(Generate patch)

Comparing projects/cms/source/server/uk/org/iscream/cms/server/filter/FilterMain.java (file contents):
Revision 1.17 by ajm, Wed Dec 13 15:47:26 2000 UTC vs.
Revision 1.33 by tdb, Wed Mar 20 13:05:49 2002 UTC

# Line 1 | Line 1
1   //---PACKAGE DECLARATION---
2 < package uk.ac.ukc.iscream.filter;
2 > package uk.org.iscream.cms.server.filter;
3  
4   //---IMPORTS---
5 < import uk.ac.ukc.iscream.util.*;
6 < import uk.ac.ukc.iscream.core.*;
7 < import uk.ac.ukc.iscream.filter.*;
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
# Line 13 | Line 14 | import uk.ac.ukc.iscream.filter.*;
14   * @author  $Author$
15   * @version $Id$
16   */
17 < public class FilterMain implements uk.ac.ukc.iscream.util.Component {
17 > public class FilterMain implements Component {
18  
19   //---FINAL ATTRIBUTES---
20  
# Line 41 | Line 42 | public class FilterMain implements uk.ac.ukc.iscream.u
42       * Starts the Filter component
43       */
44      public void start() throws ComponentStartException {
45 <              
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("Filter." + 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("Filter." + 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("Filter." + 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("Filter." + FilterMain.NAME, "Queue.SizeLimit"));
95 +                String queueRemoveAlgorithm = cp.getProperty("Filter." + 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 <        // configuration variables we require
48 <        int UDPListenPort = 0;
49 <        int TCPListenPort = 0;
50 <        String parentFilterName = null;
51 <
52 <        Configuration config = _refman.getCM().getConfiguration(FilterMain.NAME);
53 <        if (config == null) {
54 <            System.err.println("CRITICAL:Unable to obtain configuration" +
55 <                               "\n         Advise you check the i-scream log for more information.");
56 <            _logger.write(toString(), Logger.FATAL, "ERROR - unable to obtain configuration");
57 <            System.exit(1);
58 <        } else {
118 >            // startup a monitor on this queue
119              try {
120 <                UDPListenPort = Integer.parseInt(config.getProperty("Filter.UDPListenPort"));
121 <                TCPListenPort = Integer.parseInt(config.getProperty("Filter.TCPListenPort"));
122 <                parentFilterName = config.getProperty("Filter.parentFilter");
123 <            } catch (org.omg.CORBA.MARSHAL e) {
124 <                System.err.println ("CRITICAL:Unable to obtain required configuration property" +
125 <                                    "\n         Advise you check the i-scream log for more information.");
66 <                _logger.write(toString(), Logger.FATAL, "ERROR - required configuration property not present");
67 <                System.exit(1);
120 >                // try to get the interval, if this fails, we won't start up the monitor
121 >                int queueMonitorInterval = Integer.parseInt(cp.getProperty("Filter." + 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 <        _logger.write(toString(), Logger.SYSINIT, "configured");
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 <        // get parent
139 <        Filter parentFilter = FilterHelper.narrow(_refman.getCORBARef("iscream.Filter." + parentFilterName));
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          
75        // FilterServant start (for inbound child filter data)
76        _logger.write(toString(), Logger.DEBUG, "starting Filter Child -> Parent link for upstream parent - " + parentFilterName);
77        FilterServant filterServant = new FilterServant(parentFilter, TCPListenPort, UDPListenPort);
78        _refman.bindToOrb(filterServant, "iscream.Filter." + FilterMain.NAME);
79
80        // UDL Reader start (for inbound host data)
81        _logger.write(toString(), Logger.SYSINIT, "starting Filter UDP listener");
82        UDPReader udpReader = new UDPReader(UDPListenPort, parentFilter);
83        udpReader.start();
84
143          // TCP Reader start (for heartbeats)
144 <        _logger.write(toString(), Logger.SYSINIT, "starting Filter TCP listener");
145 <        TCPReader tcpReader = new TCPReader(TCPListenPort, parentFilter);
146 <        tcpReader.start();
144 >        if(activateTCPReader) {
145 >            try {
146 >                // get the port number from the configuration
147 >                TCPListenPort = Integer.parseInt(cp.getProperty("Filter." + 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("Filter." + 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 <
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("Filter." + FilterMain.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.ac.ukc.iscream.util.NameFormat class
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
# Line 116 | Line 237 | public class FilterMain implements uk.ac.ukc.iscream.u
237       * This holds a reference to the
238       * system logger that is being used.
239       */
240 <    private Logger _logger = ReferenceManager.getInstance().getLogger();
240 >    private Logger _logger;
241  
242      /**
243       * A reference to the reference manager in use
# Line 132 | Line 253 | public class FilterMain implements uk.ac.ukc.iscream.u
253       */
254      public static String NAME;
255  
256 < }            
256 > }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines