if(log.isDebugEnabled()) log.debug("[" + local_addr + "] received msg, hdr is " + hdr);
if(log.isTraceEnabled()) log.trace("[" + local_addr + "] received msg, hdr is " + hdr);
    private void unfragment(Message msg) {        FragmentationTable frag_table=null;        Address sender=msg.getSrc();        Message assembled_msg;        FragHeader hdr=(FragHeader)msg.removeHeader(getName());        byte[] m;        ByteArrayInputStream bis;        ObjectInputStream ois;         if(log.isDebugEnabled()) log.debug("[" + local_addr + "] received msg, hdr is " + hdr);        frag_table=fragment_list.get(sender);        if(frag_table == null) {            frag_table=new FragmentationTable(sender);            try {                fragment_list.add(sender, frag_table);            }            catch(IllegalArgumentException x) { // the entry has already been added, probably in parallel from another thread                frag_table=fragment_list.get(sender);            }        }        m=frag_table.add(hdr.id, hdr.frag_id, hdr.num_frags, msg.getBuffer());        if(m != null) {            try {                bis=new ByteArrayInputStream(m);                ois=new ObjectInputStream(bis);                assembled_msg=new Message();                assembled_msg.readExternal(ois);                 if(log.isInfoEnabled()) log.info("assembled_msg is " + assembled_msg);                assembled_msg.setSrc(sender); // needed ? YES, because fragments have a null src !!                passUp(new Event(Event.MSG, assembled_msg));            }            catch(Exception e) {                if(log.isErrorEnabled()) log.error("exception is " + e);            }        }    }