if(log.isInfoEnabled()) log.info("[" + local_addr + "] --> DATA(" + dst + ": #" + entry.sent_msgs_seqno + ", first=" + hdr.first + ")");
if(log.isTraceEnabled()) log.trace("[" + local_addr + "] --> DATA(" + dst + ": #" + entry.sent_msgs_seqno + ", first=" + hdr.first + ")");
    public void down(Event evt) {        Message msg;        Object dst, mbr;        Entry entry;        UnicastHeader hdr;        switch (evt.getType()) {            case Event.MSG: // Add UnicastHeader, add to AckSenderWindow and pass down                msg = (Message) evt.getArg();                dst = msg.getDest();                /* only handle unicast messages */                if (dst == null || ((Address) dst).isMulticastAddress())                    break;                entry = (Entry) connections.get(dst);                if (entry == null) {                    entry = new Entry();                    connections.put(dst, entry);                }                hdr = new UnicastHeader(UnicastHeader.DATA, entry.sent_msgs_seqno);                if (entry.sent_msgs == null) { // first msg to peer 'dst'                    hdr.first = true;                    entry.sent_msgs = new AckSenderWindow(this, timeout, this);                    if (window_size > 0)                        entry.sent_msgs.setWindowSize(window_size, min_threshold);                }                msg.putHeader(getName(), hdr);                    if(log.isInfoEnabled()) log.info("[" + local_addr + "] --> DATA(" + dst + ": #" +                            entry.sent_msgs_seqno + ", first=" + hdr.first + ")");                if (Global.copy)                    entry.sent_msgs.add(entry.sent_msgs_seqno, msg.copy());  // add *including* UnicastHeader                else                    entry.sent_msgs.add(entry.sent_msgs_seqno, msg);         // add *including* UnicastHeader                entry.sent_msgs_seqno++;                return; // AckSenderWindow will send message for us            case Event.BECOME_SERVER:                operational = true;                break;            case Event.VIEW_CHANGE:  // remove connections to peers that are not members anymore !                Vector new_members = ((View) evt.getArg()).getMembers();                Vector left_members;                synchronized (members) {                    left_members = Util.determineLeftMembers(members, new_members);                    members.removeAllElements();                    if (new_members != null)                        members.addAll(new_members);                }	                    // Remove all connections for members that left between the current view and the new view                // See DESIGN for details                if (use_gms && left_members.size() > 0) {                    synchronized (connections) {                        for (int i = 0; i < left_members.size(); i++) {                            mbr = left_members.elementAt(i);                            removeConnection(mbr);                        }                    }                }                break;        }        passDown(evt);          // Pass on to the layer below us    }