ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/cms/source/server/uk/org/iscream/cms/server/filtermanager/HostInit.java
Revision: 1.31
Committed: Mon May 20 11:38:14 2002 UTC (22 years ago) by tdb
Branch: MAIN
Changes since 1.30: +14 -7 lines
Log Message:
A fix for a COMM_FAILURE that keeps getting out. I think this is happening
when the FilterManager tries to query the filter. It shouldn't really
happen, but it seems it does. It begs the question as to whether every
CORBA communication should be wrapped in one of these... which would
unfortunately include every logging line :/

File Contents

# Content
1 /*
2 * i-scream central monitoring system
3 * Copyright (C) 2000-2002 i-scream
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 */
19
20 //---PACKAGE DECLARATION---
21 package uk.org.iscream.cms.server.filtermanager;
22
23 //---IMPORTS---
24 import uk.org.iscream.cms.server.core.*;
25 import uk.org.iscream.cms.server.filter.*;
26 import uk.org.iscream.cms.server.util.*;
27 import uk.org.iscream.cms.server.componentmanager.*;
28 import java.net.*;
29 import java.io.*;
30 import java.util.*;
31
32 /**
33 * Handles setting up a host.
34 * This class provides a host with appropriate configuration
35 * and a reference to a Filter to which it should pass data.
36 *
37 * @author $Author: tdb $
38 * @version $Id: HostInit.java,v 1.30 2002/05/18 18:16:02 tdb Exp $
39 */
40 class HostInit extends Thread {
41
42 //---FINAL ATTRIBUTES---
43
44 /**
45 * The current CVS revision of this class
46 */
47 public final String REVISION = "$Revision: 1.30 $";
48
49 //---STATIC METHODS---
50
51 //---CONSTRUCTORS---
52
53 /**
54 * Construct a new HostInit.
55 *
56 * @param socket The socket to which the host is connected
57 */
58 public HostInit(Socket socket) throws IOException {
59 // set the Thread name
60 setName("filtermanager.HostInit");
61
62 _socket = socket;
63 // setup reader & writer
64 _socketIn = new BufferedReader(new InputStreamReader(_socket.getInputStream()));
65 _socketOut = new PrintWriter(_socket.getOutputStream(), true);
66 _logger.write(toString(), Logger.SYSINIT, "created");
67 }
68
69 //---PUBLIC METHODS---
70
71 /**
72 * Main method in this class, which handles communicating with
73 * the host to determine it's setup.
74 */
75 public void run() {
76 // get a hook on the config proxy
77 ConfigurationProxy cp = ConfigurationProxy.getInstance();
78 // this is our config name
79 String configName = "Host." + _socket.getInetAddress().getHostName().toLowerCase();
80 try {
81 // try for STARTCONFIG
82 getInBound("STARTCONFIG");
83 _socketOut.println("OK");
84
85 // try for LASTMODIFIED
86 getInBound("LASTMODIFIED");
87 _socketOut.println(cp.getLastModified(configName));
88
89 // try for FILELIST
90 getInBound("FILELIST");
91 _socketOut.println(cp.getFileList(configName));
92
93 // try for FQDN
94 getInBound("FQDN");
95 _socketOut.println(_socket.getInetAddress().getHostName().toLowerCase());
96
97 // get properties
98 String reqProperty = getInBound();
99 while(!reqProperty.equals("ENDCONFIG")) {
100 // get the property
101 try {
102 String returnedProperty = cp.getProperty(configName, "Host."+reqProperty);
103 _socketOut.println(returnedProperty);
104 } catch (PropertyNotFoundException e) {
105 _socketOut.println("ERROR");
106 }
107 // get the next request
108 reqProperty = _socketIn.readLine();
109 }
110 _logger.write(toString(), Logger.SYSMSG, "configured host");
111 _socketOut.println("OK");
112
113 // get filter reference
114 getInBound("FILTER");
115 // send info
116 String filterList = cp.getProperty(configName, "Host.filter");
117 FilterInfo filterInfoRef = null;
118 String filter = null;
119 StringTokenizer st = new StringTokenizer(filterList, ";");
120 while (filterInfoRef==null && st.hasMoreTokens()) {
121 filter = st.nextToken();
122 _logger.write(toString(), Logger.DEBUG, " looking for filter- " + filter);
123 try {
124 filterInfoRef = FilterInfoHelper.narrow(ReferenceManager.getInstance().getCORBARef("iscream.FilterInfo." + filter));
125 } catch (ComponentCORBAException e) {
126 _logger.write(toString(), Logger.DEBUG, " unable to find filter- " + filter);
127 }
128 }
129
130 // hopefully we found a filter
131 if(filterInfoRef != null) {
132 _logger.write(toString(), Logger.DEBUG, " found filter- " + filter);
133 try {
134 // tell the host about it...
135 _socketOut.println(filterInfoRef.getHostName() + ";"
136 + filterInfoRef.getUDPPort() + ";"
137 + filterInfoRef.getTCPPort());
138 }
139 catch(org.omg.CORBA.COMM_FAILURE e) {
140 // failed to talk to filter, lets signal an error
141 _socketOut.println("ERROR");
142 throw new IOException("error communicating with filter - " + e);
143 }
144 }
145 else {
146 // ...or throw a wobbly (and tell the host!)
147 _socketOut.println("ERROR");
148 throw new IOException("unable to find filter for host");
149 }
150
151 // confirm ok with END
152 getInBound("END");
153 _socketOut.println("OK");
154
155 } catch (Exception e) {
156 _logger.write(toString(), Logger.ERROR, "ERROR - " + e);
157 }
158
159 // Disconnect streams & socket
160 try {
161 _socketIn.close();
162 _socketOut.close();
163 _socket.close();
164 } catch (IOException e) {
165 _logger.write(toString(), Logger.ERROR, "exception on socket close");
166 }
167 _logger.write(toString(), Logger.SYSMSG, "finished");
168 }
169
170 /**
171 * Overrides the {@link java.lang.Object#toString() Object.toString()}
172 * method to provide clean logging (every class should have this).
173 *
174 * This uses the uk.org.iscream.cms.server.util.NameFormat class
175 * to format the toString()
176 *
177 * @return the name of this class and its CVS revision
178 */
179 public String toString() {
180 return FormatName.getName(
181 _name,
182 getClass().getName(),
183 REVISION);
184 }
185
186 //---PRIVATE METHODS---
187
188 private String getInBound(String expected) throws IOException {
189 // grab the input
190 String inBound = getInBound();
191 // check if it's what we're expecting
192 if(!inBound.equals(expected)) {
193 throw new IOException("protocol error - expected:"+expected+" got:" + inBound);
194 }
195 // it should be ok then
196 return inBound;
197 }
198
199 private String getInBound() throws IOException {
200 // grab the input
201 String inBound = _socketIn.readLine();
202 // check for null's, likely disconnection
203 if(inBound == null) {
204 throw new IOException("got null from host, maybe it died");
205 }
206 // it's a valid message it seems
207 return inBound;
208 }
209
210 //---ACCESSOR/MUTATOR METHODS---
211
212 //---ATTRIBUTES---
213
214 /**
215 * This holds a reference to the
216 * system logger that is being used.
217 */
218 private Logger _logger = ReferenceManager.getInstance().getLogger();
219
220 /**
221 * A reference to the Configuration Manager the system is using
222 */
223 private ConfigurationManager _configManager = ReferenceManager.getInstance().getCM();
224
225 /**
226 * This is the friendly identifier of the
227 * component this class is running in.
228 * eg, a Filter may be called "filter1",
229 * If this class does not have an owning
230 * component, a name from the configuration
231 * can be placed here. This name could also
232 * be changed to null for utility classes.
233 */
234 private String _name = FilterManager.NAME;
235
236 /**
237 * The socket this class uses
238 */
239 private Socket _socket;
240
241 /**
242 * Used for the input stream of this socket
243 */
244 private BufferedReader _socketIn;
245
246 /**
247 * Used for the output stream of this socket
248 */
249 private PrintWriter _socketOut;
250
251 //---STATIC ATTRIBUTES---
252
253 }