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.32
Committed: Tue May 21 16:47:18 2002 UTC (22 years ago) by tdb
Branch: MAIN
Changes since 1.31: +3 -2 lines
Log Message:
Added URL to GPL headers.

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.31 2002/05/20 11:38:14 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.31 $";
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 }