ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/cms/source/server/uk/org/iscream/cms/server/clientinterface/CorbaControlHandlerServant.java
Revision: 1.2
Committed: Sat Feb 3 04:44:09 2001 UTC (23 years, 3 months ago) by tdb
Branch: MAIN
Changes since 1.1: +3 -2 lines
Log Message:
A few subtle changes... I keep forgetting to start Threads :)

File Contents

# User Rev Content
1 tdb 1.1 //---PACKAGE DECLARATION---
2     package uk.ac.ukc.iscream.clientinterface;
3    
4     //---IMPORTS---
5     import uk.ac.ukc.iscream.util.*;
6     import uk.ac.ukc.iscream.componentmanager.*;
7     import uk.ac.ukc.iscream.core.*;
8     import uk.ac.ukc.iscream.client.*;
9    
10    
11     /**
12     * Acts as a Handler to a CORBA based client.
13     *
14     * !!! FUNDAMENTAL DESIGN PROBLEM !!!
15     * !!! Need a way to "shutdown" this class !!!
16     *
17 tdb 1.2 * @author $Author: tdb1 $
18     * @version $Id: CorbaHandlerServant.java,v 1.1 2001/02/03 00:42:54 tdb1 Exp $
19 tdb 1.1 */
20     class CorbaHandlerServant extends Thread implements CorbaHandlerOperations {
21    
22     //---FINAL ATTRIBUTES---
23    
24     /**
25     * The current CVS revision of this class
26     */
27     public final String REVISION = "$Revision: 1.1 $";
28    
29     //---STATIC METHODS---
30    
31     //---CONSTRUCTORS---
32    
33     /**
34     * Construct a new CorbaHandlerServant.
35     *
36     * @param packetSorter A reference to the PacketSorter in the component
37     * @param name The name of the client
38     * @param client A reference to the "servant" part of the connecting client.
39     */
40     public CorbaHandlerServant(PacketSorter packetSorter, String name, Client client) {
41     _packetSorter = packetSorter;
42     _clientName = name;
43     _hostList = "";
44     _queue = new Queue();
45     _client = client;
46     _logger.write(toString(), Logger.SYSINIT, "created");
47     }
48    
49     //---PUBLIC METHODS---
50    
51     /**
52     * This method loops round until we "shutdown" (not implemented yet). Inside
53     * the main loop we will first wait until the startData() method is called,
54     * then we'll send data constantly until stopData() is called.
55     */
56     public void run() {
57 tdb 1.2 // !!! OUGHT TO CHECK QUEUE START OF USE !!!
58 tdb 1.1 // get a queue
59     _queueID = _queue.getQueue();
60     // we'll keep going until someone implements a "shutdown" :)
61     run = true;
62     while(run) {
63     // initially lock until someone tells us to start
64     synchronized(this) {
65     try { wait(); } catch(Exception e) {}
66     }
67     // loop sending data
68     while(_sendingData) {
69     try {
70     String xml = (String) _queue.get(_queueID);
71     // if it's not null (which could happen if we're "released")
72     // send it on to the client that we're connected to.
73     if(xml != null) {
74     _client.receiveXML(xml);
75     }
76     }
77     catch(InvalidQueueException e) {
78     // lets stop sending - maybe stop altogether ?
79     stopData();
80     _logger.write(toString(), Logger.ERROR, "Queue failure: "+e);
81     }
82     }
83     // now, we've obviously been stopped, so we'll head back round this
84     // while loop until someone starts us again.
85     }
86     // if we get here we've been told to stop
87     _logger.write(toString(), Logger.SYSMSG, "Shutting Down");
88     // remove ourselves from the queue
89     _queue.removeQueue(_queueID);
90     }
91    
92     /**
93     * Start sending data to the client.
94     *
95     * @return a boolean stating whether the attempt to start succeeded
96     */
97     public boolean startData() {
98     if(!_sendingData) {
99     // register the Queue
100     _packetSorter.register(_queue, _hostList);
101     // mark the running flag
102     _sendingData = true;
103     // bump the loop
104     synchronized(this) {
105     try { notifyAll(); } catch(Exception e) {}
106     }
107     return true;
108     }
109     else {
110     return false;
111     }
112     }
113    
114     /**
115     * Stop sending data to the client.
116     *
117     * @return a boolean stating whether the attempt to stop succeeded
118     */
119     public boolean stopData() {
120     if(_sendingData) {
121     // deregister the Queue
122     _packetSorter.deregister(_queue, _hostList);
123     // stop ourselves running
124     _sendingData = false;
125     // if the main loop is waiting for data it won't notice the
126     // above flag to stop. This bumps it out of the blocked get().
127     _queue.releaseQueue(_queueID);
128     return true;
129     }
130     else {
131     return false;
132     }
133     }
134    
135     /**
136     * Sets the host list for the Client to the requested semi-colon separated
137     * list of hostnames. This will only succeed if we are not sending data.
138     *
139     * @param hostList A semi-colon separated list of hostnames to use.
140     * @return Whether the request succeeded.
141     */
142     public boolean setHostList(String hostList) {
143     if(!_sendingData) {
144     _hostList = hostList;
145     return true;
146     }
147     else {
148     return false;
149     }
150     }
151    
152     /**
153     * Overrides the {@link java.lang.Object#toString() Object.toString()}
154     * method to provide clean logging (every class should have this).
155     *
156     * This uses the uk.ac.ukc.iscream.util.NameFormat class
157     * to format the toString()
158     *
159     * @return the name of this class and its CVS revision
160     */
161     public String toString() {
162     return FormatName.getName(
163     _name,
164     getClass().getName(),
165     REVISION);
166     }
167    
168     //---PRIVATE METHODS---
169    
170     //---ACCESSOR/MUTATOR METHODS---
171    
172     //---ATTRIBUTES---
173    
174     /**
175     * This is the friendly identifier of the
176     * component this class is running in.
177     * eg, a Filter may be called "filter1",
178     * If this class does not have an owning
179     * component, a name from the configuration
180     * can be placed here. This name could also
181     * be changed to null for utility classes.
182     */
183     private String _name = ClientInterfaceMain.NAME;
184    
185     /**
186     * This holds a reference to the
187     * system logger that is being used.
188     */
189     private Logger _logger = ReferenceManager.getInstance().getLogger();
190    
191     /**
192     * A reference to the Configuration Manager the system is using
193     */
194     private ConfigurationManager _configManager = ReferenceManager.getInstance().getCM();
195    
196     /**
197     * A reference to the PacketSorter.
198     */
199     private PacketSorter _packetSorter;
200    
201     /**
202     * The host list the Client has requested
203     */
204     private String _hostList;
205    
206     /**
207     * The name of the connected client.
208     */
209     private String _clientName;
210    
211     /**
212     * Whether we are active and sending data.
213     */
214     private boolean _sendingData;
215    
216     /**
217     * The Queue we'll use for buffering data to the client.
218     */
219     private Queue _queue;
220    
221     /**
222     * The "servant" part of the client we're connected to.
223     */
224     private Client _client;
225    
226     /**
227     * Our queue number within our Queue
228     */
229     private int _queueID;
230    
231     /**
232     * The flag that dictates whether the main loop should *completely* exit
233     */
234     private boolean run;
235    
236     //---STATIC ATTRIBUTES---
237    
238     }