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.27
Committed: Wed Mar 14 23:25:29 2001 UTC (23 years, 2 months ago) by tdb
Branch: MAIN
CVS Tags: PROJECT_COMPLETION
Changes since 1.26: +8 -8 lines
Log Message:
The whole server package structure has been changed.
Old Package: uk.ac.ukc.iscream.*
New Package: uk.org.iscream.*

File Contents

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