void timerExpired() {
   // should not happen, but if it does,
   // fabricate a permanent error and forward up
   DatagramRejectedMessage msg =
       new DatagramRejectedMessage(message.getDestNodeID(), message.getSourceNodeID(), 0x0100);
   System.out.println(
       "Never received reply for datagram "
           + (message != null ? message.toString() : " == null"));
   handleDatagramRejected(msg, null);
 }
    /** Handle "Datagram Acknowledged" message */
    @Override
    public void handleDatagramAcknowledged(DatagramAcknowledgedMessage msg, Connection sender) {
      // check if this is from right source & to us
      if (!(msg.getDestNodeID() != null
          && msg.getSourceNodeID() != null
          && msg.getDestNodeID().equals(message.getSourceNodeID())
          && message.getDestNodeID().equals(msg.getSourceNodeID()))) {
        // not for us, just forward
        toUpstream.put(msg, toUpstream);
        return;
      }
      endTimeout();
      // forward message upstream
      toUpstream.put(msg, toUpstream);

      // and allow sending another
      new Thread(new Consumer(queue)).start();
    }
 /** Handle "Datagram Rejected" message */
 @Override
 public void handleDatagramRejected(DatagramRejectedMessage msg, Connection sender) {
   // check if this is from right source & to us
   if (!(msg.getDestNodeID() != null
       && msg.getSourceNodeID() != null
       && msg.getDestNodeID().equals(message.getSourceNodeID())
       && message.getDestNodeID().equals(msg.getSourceNodeID()))) {
     // not for us, just forward
     toUpstream.put(msg, toUpstream);
     return;
   }
   endTimeout();
   // check if resend permitted
   if (msg.canResend()) {
     forwardDownstream();
   } else {
     // forward upstream to originator and let them sort it out
     toUpstream.put(msg, toUpstream);
     // and allow sending another
     new Thread(new Consumer(queue)).start();
   }
 }
 void endTimeout() {
   if (timer != null) timer.cancel();
   else
     System.out.println(
         "Found timer null for datagram " + (message != null ? message.toString() : " == null"));
 }