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.1
Committed: Sat Feb 3 00:42:54 2001 UTC (23 years, 3 months ago) by tdb
Branch: MAIN
Log Message:
Initial checkins of the two files that handle connections from CORBA based
clients (most likely local clients). The Listener is essentially a "factory" for
the Handler class. There is a single Handler associated with each connected
client.

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     * @author $Author$
18     * @version $Id$
19     */
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     // get a queue
58     _queueID = _queue.getQueue();
59     // we'll keep going until someone implements a "shutdown" :)
60     run = true;
61     while(run) {
62     // initially lock until someone tells us to start
63     synchronized(this) {
64     try { wait(); } catch(Exception e) {}
65     }
66     // loop sending data
67     while(_sendingData) {
68     try {
69     String xml = (String) _queue.get(_queueID);
70     // if it's not null (which could happen if we're "released")
71     // send it on to the client that we're connected to.
72     if(xml != null) {
73     _client.receiveXML(xml);
74     }
75     }
76     catch(InvalidQueueException e) {
77     // lets stop sending - maybe stop altogether ?
78     stopData();
79     _logger.write(toString(), Logger.ERROR, "Queue failure: "+e);
80     }
81     }
82     // now, we've obviously been stopped, so we'll head back round this
83     // while loop until someone starts us again.
84     }
85     // if we get here we've been told to stop
86     _logger.write(toString(), Logger.SYSMSG, "Shutting Down");
87     // remove ourselves from the queue
88     _queue.removeQueue(_queueID);
89     }
90    
91     /**
92     * Start sending data to the client.
93     *
94     * @return a boolean stating whether the attempt to start succeeded
95     */
96     public boolean startData() {
97     if(!_sendingData) {
98     // register the Queue
99     _packetSorter.register(_queue, _hostList);
100     // mark the running flag
101     _sendingData = true;
102     // bump the loop
103     synchronized(this) {
104     try { notifyAll(); } catch(Exception e) {}
105     }
106     return true;
107     }
108     else {
109     return false;
110     }
111     }
112    
113     /**
114     * Stop sending data to the client.
115     *
116     * @return a boolean stating whether the attempt to stop succeeded
117     */
118     public boolean stopData() {
119     if(_sendingData) {
120     // deregister the Queue
121     _packetSorter.deregister(_queue, _hostList);
122     // stop ourselves running
123     _sendingData = false;
124     // if the main loop is waiting for data it won't notice the
125     // above flag to stop. This bumps it out of the blocked get().
126     _queue.releaseQueue(_queueID);
127     return true;
128     }
129     else {
130     return false;
131     }
132     }
133    
134     /**
135     * Sets the host list for the Client to the requested semi-colon separated
136     * list of hostnames. This will only succeed if we are not sending data.
137     *
138     * @param hostList A semi-colon separated list of hostnames to use.
139     * @return Whether the request succeeded.
140     */
141     public boolean setHostList(String hostList) {
142     if(!_sendingData) {
143     _hostList = hostList;
144     return true;
145     }
146     else {
147     return false;
148     }
149     }
150    
151     /**
152     * Overrides the {@link java.lang.Object#toString() Object.toString()}
153     * method to provide clean logging (every class should have this).
154     *
155     * This uses the uk.ac.ukc.iscream.util.NameFormat class
156     * to format the toString()
157     *
158     * @return the name of this class and its CVS revision
159     */
160     public String toString() {
161     return FormatName.getName(
162     _name,
163     getClass().getName(),
164     REVISION);
165     }
166    
167     //---PRIVATE METHODS---
168    
169     //---ACCESSOR/MUTATOR METHODS---
170    
171     //---ATTRIBUTES---
172    
173     /**
174     * This is the friendly identifier of the
175     * component this class is running in.
176     * eg, a Filter may be called "filter1",
177     * If this class does not have an owning
178     * component, a name from the configuration
179     * can be placed here. This name could also
180     * be changed to null for utility classes.
181     */
182     private String _name = ClientInterfaceMain.NAME;
183    
184     /**
185     * This holds a reference to the
186     * system logger that is being used.
187     */
188     private Logger _logger = ReferenceManager.getInstance().getLogger();
189    
190     /**
191     * A reference to the Configuration Manager the system is using
192     */
193     private ConfigurationManager _configManager = ReferenceManager.getInstance().getCM();
194    
195     /**
196     * A reference to the PacketSorter.
197     */
198     private PacketSorter _packetSorter;
199    
200     /**
201     * The host list the Client has requested
202     */
203     private String _hostList;
204    
205     /**
206     * The name of the connected client.
207     */
208     private String _clientName;
209    
210     /**
211     * Whether we are active and sending data.
212     */
213     private boolean _sendingData;
214    
215     /**
216     * The Queue we'll use for buffering data to the client.
217     */
218     private Queue _queue;
219    
220     /**
221     * The "servant" part of the client we're connected to.
222     */
223     private Client _client;
224    
225     /**
226     * Our queue number within our Queue
227     */
228     private int _queueID;
229    
230     /**
231     * The flag that dictates whether the main loop should *completely* exit
232     */
233     private boolean run;
234    
235     //---STATIC ATTRIBUTES---
236    
237     }