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.33
Committed: Fri Sep 6 15:10:48 2002 UTC (21 years, 8 months ago) by tdb
Branch: MAIN
Changes since 1.32: +3 -3 lines
Log Message:
Fix for upgrade to Jacorb 1.4.1. It's our fault actually, we've not been
correctly using the names when binding to the Naming Service. This needs to
be fixed properly at some point, but for now I've changed changed the code
so it "means" the same as it did before the upgrade.

File Contents

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