if(observer != null) observer.up(evt);
    private void handleIncomingMessage(Message msg) {        Event      evt;        TpHeader   hdr;        if(stats) {            num_msgs_received++;            num_bytes_received+=msg.getLength();        }        evt=new Event(Event.MSG, msg);        if(trace) {            StringBuffer sb=new StringBuffer("message is ").append(msg).append(", headers are ").append(msg.getHeaders());            log.trace(sb);        }        /* Because Protocol.up() is never called by this bottommost layer, we call up() directly in the observer.        * This allows e.g. PerfObserver to get the time of reception of a message */        if(observer != null)            observer.up(evt);        hdr=(TpHeader)msg.getHeader(name); // replaced removeHeader() with getHeader()        if(hdr != null) {            /* Discard all messages destined for a channel with a different name */            String ch_name=hdr.channel_name;            // Discard if message's group name is not the same as our group name unless the            // message is a diagnosis message (special group name DIAG_GROUP)            if(channel_name != null && !channel_name.equals(ch_name)) {                if(warn)                    log.warn(new StringBuffer("discarded message from different group \"").append(ch_name).                            append("\" (our group is \"").append(channel_name).append("\"). Sender was ").append(msg.getSrc()));                return;            }        }        else {            if(trace)                log.trace(new StringBuffer("message does not have a transport header, msg is ").append(msg).                          append(", headers are ").append(msg.getHeaders()).append(", will be discarded"));            return;        }        passUp(evt);    }