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/TCPReaderInit.java
Revision: 1.21
Committed: Tue Mar 13 02:19:46 2001 UTC (23 years, 2 months ago) by tdb
Branch: MAIN
Changes since 1.20: +5 -2 lines
Log Message:
Given all the classes that extend Thread a name using Thread.setName(). It is
only representative as far as it will tell us which class the Thread is, but
this will go some way to aiding debugging. If time permitted, more effort could
be taken to name each thread according to what it was dealing with.

File Contents

# User Rev Content
1 tdb 1.1 //---PACKAGE DECLARATION---
2 tdb 1.5 package uk.ac.ukc.iscream.filter;
3 tdb 1.1
4     //---IMPORTS---
5     import uk.ac.ukc.iscream.core.*;
6     import uk.ac.ukc.iscream.filter.*;
7 tdb 1.12 import uk.ac.ukc.iscream.componentmanager.*;
8 tdb 1.1 import java.net.Socket;
9     import java.io.InputStream;
10     import java.io.OutputStream;
11     import java.io.IOException;
12     import java.io.*;
13 ajm 1.9 import uk.ac.ukc.iscream.util.*;
14 tdb 1.1
15     /**
16 ajm 1.10 * This provides Host heartbeat functionality
17 tdb 1.1 *
18 tdb 1.19 * @author $Author: tdb1 $
19 tdb 1.21 * @version $Id: TCPReaderInit.java,v 1.20 2001/03/04 05:24:08 tdb1 Exp $
20 tdb 1.1 */
21     class TCPReaderInit extends Thread {
22    
23     //---FINAL ATTRIBUTES---
24    
25     /**
26     * The current CVS revision of this class
27     */
28 tdb 1.21 public final String REVISION = "$Revision: 1.20 $";
29 tdb 1.1
30     //---STATIC METHODS---
31    
32     //---CONSTRUCTORS---
33 tdb 1.13
34     /**
35     * Construct a new TCPReaderInit.
36     *
37     * @param socket the Socket to which the host is connected
38     * @param queue the Queue to which we'll add data
39     * @throws IOException if something goes badly wrong
40     */
41 tdb 1.11 public TCPReaderInit(Socket socket, Queue queue) throws IOException {
42 tdb 1.21 // set the Thread name
43     setName("filter.TCPReaderInit");
44    
45 tdb 1.1 _socket = socket;
46 tdb 1.11 _queue = queue;
47 tdb 1.13 // setup the reader & writer
48 tdb 1.1 _socketIn = new BufferedReader(new InputStreamReader(_socket.getInputStream()));
49 tdb 1.15 _socketOut = new PrintWriter(_socket.getOutputStream(), true);
50 tdb 1.8 _logger.write(toString(), Logger.SYSINIT, "created");
51 tdb 1.1 }
52    
53     //---PUBLIC METHODS---
54 tdb 1.13
55     /**
56     * Main run method. Will communicate with the host, inform it
57     * if any updates to it's configuration are needed, and send
58     * a heartbeat packet into the system.
59     */
60 tdb 1.1 public void run() {
61     try {
62 tdb 1.3 //variables
63     String filelist = "";
64     String lastModified = "";
65     String inBound = "";
66 tdb 1.2
67 tdb 1.3 inBound = _socketIn.readLine();
68     if(!inBound.equals("HEARTBEAT")) {
69     _socketOut.println("ERROR");
70     throw new IOException("protocol error - expecting:HEARTBEAT got:" + inBound);
71     } else {
72     _socketOut.println("OK");
73     }
74    
75     inBound = _socketIn.readLine();
76     if(!inBound.equals("CONFIG")) {
77     _socketOut.println("ERROR");
78     throw new IOException("protocol error - expecting:CONFIG got:" + inBound);
79     } else {
80     _socketOut.println("OK");
81     }
82    
83     inBound = _socketIn.readLine();
84     filelist = inBound;
85     _socketOut.println("OK");
86    
87     inBound = _socketIn.readLine();
88     lastModified = inBound;
89    
90     boolean newConfig = _configManager.isModified(filelist, Long.parseLong(lastModified));
91    
92     if(newConfig) {
93     _socketOut.println("ERROR");
94     }
95     else {
96     _socketOut.println("OK");
97     }
98    
99     inBound = _socketIn.readLine();
100     if(!inBound.equals("ENDHEARTBEAT")) {
101     _socketOut.println("ERROR");
102     throw new IOException("protocol error - expecting:ENDHEARTBEAT got:" + inBound);
103     } else {
104     _socketOut.println("OK");
105     }
106 tdb 1.4
107 tdb 1.18 String date = new Long(System.currentTimeMillis()/((long) 1000)).toString();
108 tdb 1.19 String hostname = _socket.getInetAddress().getHostName().toLowerCase();
109 tdb 1.6 String ipadd = _socket.getInetAddress().getHostAddress();
110    
111 ajm 1.16 // run the service checks for this host
112 ajm 1.17 _logger.write(toString(), Logger.DEBUG, "Running service checks");
113 ajm 1.16 String checks = PluginServiceCheckManager.getInstance().runServiceChecks(hostname);
114    
115     // build the heartbeat packet
116     String xml = "<packet type=\"heartbeat\" machine_name=\""+hostname+"\" date=\""+date+"\" ip=\""+ipadd+"\">" + checks + "</packet>";
117    
118     // get it to be sent on
119 tdb 1.11 _queue.add(xml);
120 tdb 1.1
121     } catch (Exception e) {
122 tdb 1.20 _logger.write(toString(), Logger.ERROR, "ERROR: " + e);
123 tdb 1.1 }
124    
125     // Disconnect streams & socket
126     try {
127     _socketIn.close();
128     _socketOut.close();
129     _socket.close();
130     } catch (IOException e) {
131 tdb 1.8 _logger.write(toString(), Logger.ERROR, "exception on socket close");
132 tdb 1.1 }
133 tdb 1.14 _logger.write(toString(), Logger.DEBUG, "finished");
134 tdb 1.1 }
135    
136     /**
137     * Overrides the {@link java.lang.Object#toString() Object.toString()}
138     * method to provide clean logging (every class should have this).
139     *
140 ajm 1.10 * This uses the uk.ac.ukc.iscream.util.NameFormat class
141     * to format the toString()
142     *
143 tdb 1.1 * @return the name of this class and its CVS revision
144     */
145     public String toString() {
146 ajm 1.10 return FormatName.getName(
147     _name,
148     getClass().getName(),
149     REVISION);
150 tdb 1.1 }
151    
152     //---PRIVATE METHODS---
153    
154     //---ACCESSOR/MUTATOR METHODS---
155    
156     //---ATTRIBUTES---
157    
158 ajm 1.10 /**
159     * A reference to the configuration manager
160     */
161 tdb 1.8 ConfigurationManager _configManager = ReferenceManager.getInstance().getCM();
162 ajm 1.10
163     /**
164     * This is the friendly identifier of the
165     * component this class is running in.
166     * eg, a Filter may be called "filter1",
167     * If this class does not have an owning
168     * component, a name from the configuration
169     * can be placed here. This name could also
170     * be changed to null for utility classes.
171     */
172     private String _name = FilterMain.NAME;
173    
174     /**
175     * This holds a reference to the
176     * system logger that is being used.
177     */
178     private Logger _logger = ReferenceManager.getInstance().getLogger();
179    
180     /**
181     * The socket we are talking on
182     */
183 tdb 1.1 Socket _socket;
184 ajm 1.10
185     /**
186     * The input from the socket
187     */
188 tdb 1.1 BufferedReader _socketIn;
189 ajm 1.10
190     /**
191     * The output from the socket
192     */
193 tdb 1.1 PrintWriter _socketOut;
194 ajm 1.10
195     /**
196 tdb 1.11 * A reference to our Queue
197 ajm 1.10 */
198 tdb 1.11 Queue _queue;
199 tdb 1.1 //---STATIC ATTRIBUTES---
200    
201     }