KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > ubermq > jms > server > journal > impl > AbstractMultipleArbiter


1 package com.ubermq.jms.server.journal.impl;
2
3 import com.ubermq.jms.server.journal.*;
4 import com.ubermq.jms.common.routing.impl.*;
5 import com.ubermq.kernel.*;
6 import java.io.*;
7 import java.util.*;
8
9 /**
10  * This implementation makes it easier to implement arbiters using different
11  * selection algorithms. It keeps track of a list of connections and delegates
12  * to a subclass only to choose between them.
13  */

14 public abstract class AbstractMultipleArbiter
15     implements DurableConnectionArbiter
16 {
17     private ArrayList nodes;
18     private int n;
19
20     public AbstractMultipleArbiter()
21     {
22         nodes = new ArrayList();
23     }
24
25     /**
26      * Chooses a number between 0 and nNodes. This serves as the choice function.
27      */

28     protected abstract int chooseNode(int nNodes);
29
30     private DatagramSink doChoice() {
31         return ((DatagramSink)nodes.get(chooseNode(nodes.size())));
32     }
33
34     public void output(IDatagram d, IOverflowHandler h)
35         throws IOException
36     {
37         DatagramSink sink = doChoice();
38         try
39         {
40             sink.output(d, h);
41         }
42         catch (IOException e) {
43             // remove that choice, and
44
// propagate the exception
45
disconnect(sink);
46             throw e;
47         }
48     }
49
50     public boolean isOpen()
51     {
52         return (nodes.size() > 0);
53     }
54
55     public void connect(com.ubermq.kernel.DatagramSink cdn)
56     {
57         nodes.add(cdn);
58     }
59
60     public void disconnect(com.ubermq.kernel.DatagramSink cdn)
61     {
62         nodes.remove(cdn);
63     }
64
65     public void disconnectAll()
66     {
67         nodes.clear();
68     }
69
70     static String JavaDoc getDisplayName(DatagramSink ds)
71     {
72         if (ds instanceof ConnectionDestNode)
73         {
74             return ((ConnectionDestNode)ds).getDisplayName();
75         }
76         else
77         {
78             return ds.toString();
79         }
80     }
81
82     public String JavaDoc toHtml()
83     {
84         StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
85         if (isOpen())
86         {
87             Iterator iter = nodes.iterator();
88             while (iter.hasNext())
89             {
90                 sb.append(getDisplayName((DatagramSink)iter.next()));
91                 sb.append("<br>");
92             }
93         }
94         else
95         {
96             sb.append("<i>Disconnected</i>");
97         }
98
99         return sb.toString();
100     }
101 }
102
Popular Tags