01: // $Id: LOOPBACK.java,v 1.16.10.1 2007/04/27 08:03:51 belaban Exp $
02:
03: package org.jgroups.protocols;
04:
05: import org.jgroups.Address;
06: import org.jgroups.Event;
07: import org.jgroups.Message;
08: import org.jgroups.stack.IpAddress;
09: import org.jgroups.stack.Protocol;
10: import org.jgroups.util.Util;
11:
12: /**
13: Makes copies of outgoing messages, swaps sender and receiver and sends the message back up the stack.
14: */
15: public class LOOPBACK extends Protocol {
16: private Address local_addr = null;
17: private String group_addr = null;
18:
19: public LOOPBACK() {
20: }
21:
22: public String toString() {
23: return "Protocol LOOPBACK(local address: " + local_addr + ')';
24: }
25:
26: /*------------------------------ Protocol interface ------------------------------ */
27:
28: public String getName() {
29: return "LOOPBACK";
30: }
31:
32: public void init() throws Exception {
33: // local_addr=new IpAddress("localhost", 10000) { // fake address
34: // public String toString() {
35: // return "<fake>";
36: // }
37: // };
38:
39: //local_addr=new org.jgroups.stack.IpAddress("localhost", 10000); // fake address
40: local_addr = new IpAddress(12345);
41: }
42:
43: public void start() throws Exception {
44: passUp(new Event(Event.SET_LOCAL_ADDRESS, local_addr));
45: }
46:
47: /**
48: * Caller by the layer above this layer. Usually we just put this Message
49: * into the send queue and let one or more worker threads handle it. A worker thread
50: * then removes the Message from the send queue, performs a conversion and adds the
51: * modified Message to the send queue of the layer below it, by calling Down).
52: */
53: public void down(Event evt) {
54: if (log.isTraceEnabled())
55: log.trace("event is " + evt + ", group_addr=" + group_addr
56: + ", time is " + System.currentTimeMillis()
57: + ", hdrs: " + Util.printEvent(evt));
58:
59: switch (evt.getType()) {
60:
61: case Event.MSG:
62: Message msg = (Message) evt.getArg();
63: Message rsp = msg.copy();
64: if (rsp.getSrc() == null)
65: rsp.setSrc(local_addr);
66:
67: //dest_addr=msg.getDest();
68: //rsp.setDest(local_addr);
69: //rsp.setSrc(dest_addr != null ? dest_addr : local_addr);
70: up(new Event(Event.MSG, rsp));
71: break;
72:
73: case Event.GET_LOCAL_ADDRESS: // return local address -> Event(SET_LOCAL_ADDRESS, local)
74: passUp(new Event(Event.SET_LOCAL_ADDRESS, local_addr));
75: break;
76:
77: case Event.CONNECT:
78: group_addr = (String) evt.getArg();
79: passUp(new Event(Event.CONNECT_OK));
80: break;
81:
82: case Event.DISCONNECT:
83: passUp(new Event(Event.DISCONNECT_OK));
84: break;
85:
86: case Event.PERF:
87: passUp(evt);
88: break;
89: }
90: }
91:
92: /*--------------------------- End of Protocol interface -------------------------- */
93:
94: }
|