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/PacketSorter.java
Revision: 1.1
Committed: Tue Jan 23 16:55:23 2001 UTC (23 years, 4 months ago) by tdb
Branch: MAIN
Log Message:
Initial Checkin. This class sends XML packets to those clients that have shown
interest in receiving it. This should make using the client more scalable.

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 java.util.*;
9    
10     /**
11     * Receives data from the incoming CORBA servant, places
12     * it in a Queue, and then arranges distribution to the
13     * ClientHandlers.
14     *
15     * @author $Author$
16     * @version $Id$
17     */
18     class PacketSorter extends Thread {
19    
20     //---FINAL ATTRIBUTES---
21    
22     /**
23     * The current CVS revision of this class
24     */
25     public final String REVISION = "$Revision: 1.1 $";
26    
27     //---STATIC METHODS---
28    
29     //---CONSTRUCTORS---
30    
31     /**
32     * Creates a new PacketSorter.
33     */
34     public PacketSorter() {
35     _queue = new Queue();
36     _hostMap = new HashMap();
37     _logger.write(toString(), Logger.SYSINIT, "created");
38     }
39    
40     //---PUBLIC METHODS---
41    
42     public void run() {
43     int qID = _queue.getQueue();
44     while(true) {
45     String xml = "";
46     try {
47     xml = (String) _queue.get(qID);
48     }
49     catch(InvalidQueueException e) {
50     _logger.write(toString(), Logger.ERROR, "Queue failure: "+e);
51     }
52    
53     // should be a neater way to do this
54     XMLPacket packet = new XMLPacketMaker(xml).createXMLPacket();
55     String host = packet.getParam("packet.attributes.machine_name");
56     LinkedList list = (LinkedList) _hostMap.get(host);
57    
58     Iterator i = list.iterator();
59     while(i.hasNext()) {
60     ((Queue) i.next()).add(xml);
61     }
62     }
63     }
64    
65     // MUST DEAL WITH hostList="" implying "all hosts"
66    
67     public void register(Queue dhQueue, String hostList) {
68     StringTokenizer st = new StringTokenizer(hostList, ";");
69     while(st.hasMoreTokens()) {
70     String host = st.nextToken();
71     if(_hostMap.containsKey(host)) {
72     LinkedList list = (LinkedList) _hostMap.get(host);
73     list.add(dhQueue);
74     }
75     else {
76     LinkedList list = new LinkedList();
77     list.add(dhQueue);
78     _hostMap.put(host, list);
79     }
80     }
81     _logger.write(toString(), Logger.SYSMSG, "registered DataHandler - " + dhQueue.toString());
82     }
83    
84     public void deregister(Queue dhQueue, String hostList) {
85     StringTokenizer st = new StringTokenizer(hostList, ";");
86     while(st.hasMoreTokens()) {
87     String host = st.nextToken();
88     if(_hostMap.containsKey(host)) {
89     LinkedList list = (LinkedList) _hostMap.get(host);
90     list.remove(dhQueue);
91     if(list.size()==0) {
92     _hostMap.remove(host);
93     }
94     }
95     }
96     _logger.write(toString(), Logger.SYSMSG, "deregistered DataHandler - " + dhQueue.toString());
97     }
98    
99     /**
100     * Overrides the {@link java.lang.Object#toString() Object.toString()}
101     * method to provide clean logging (every class should have this).
102     *
103     * This uses the uk.ac.ukc.iscream.util.NameFormat class
104     * to format the toString()
105     *
106     * @return the name of this class and its CVS revision
107     */
108     public String toString() {
109     return FormatName.getName(
110     _name,
111     getClass().getName(),
112     REVISION);
113     }
114    
115     //---PRIVATE METHODS---
116    
117     //---ACCESSOR/MUTATOR METHODS---
118    
119     public Queue getQueue() {
120     return _queue;
121     }
122    
123     //---ATTRIBUTES---
124    
125     /**
126     * This is the friendly identifier of the
127     * component this class is running in.
128     * eg, a Filter may be called "filter1",
129     * If this class does not have an owning
130     * component, a name from the configuration
131     * can be placed here. This name could also
132     * be changed to null for utility classes.
133     */
134     private String _name = ClientInterfaceMain.NAME;
135    
136     /**
137     * This holds a reference to the
138     * system logger that is being used.
139     */
140     private Logger _logger = ReferenceManager.getInstance().getLogger();
141    
142     private Queue _queue;
143    
144     private HashMap _hostMap;
145    
146     //---STATIC ATTRIBUTES---
147    
148     }