else if (!MessageUtils.hasMessageType(msg) || MessageUtils.isRegularMessage (msg))
else */    MessageUtils.setLocalMessage(msg, (isLocalMessage(msg)));  if (!MessageUtils.hasMessageType(msg) || MessageUtils.isRegularMessage (msg))
    public MessageAttributes forwardMessage (AttributedMessage msg)       throws UnregisteredNameException, NameLookupException,   	         CommFailureException, MisdeliveredMessageException    {      //  Skip numbering if the message already has a number      if (MessageUtils.hasMessageNumber (msg)) return link.forwardMessage (msg);      //  Set from and to agents as needed      AgentID fromAgent = MessageUtils.getFromAgent (msg);      if (fromAgent == null)       {        MessageAddress agentAddr = MessageUtils.getOriginatorAgent (msg);        fromAgent = AgentID.getAgentID (this, getServiceBroker(), agentAddr);        if (fromAgent == null)        {          String s = "Null fromAgent for " +agentAddr;          if (log.isWarnEnabled()) log.warn (s);          throw new NameLookupException (new Exception (s));        }        else MessageUtils.setFromAgent (msg, fromAgent);      }            AgentID toAgent = MessageUtils.getToAgent (msg);      if (toAgent == null)      {        MessageAddress agentAddr = MessageUtils.getTargetAgent (msg);        toAgent = AgentID.getAgentID (this, getServiceBroker(), agentAddr);        if (toAgent == null)        {          String s = "Null toAgent for " +agentAddr;          if (log.isWarnEnabled()) log.warn (s);          throw new NameLookupException (new Exception (s));        }        else MessageUtils.setToAgent (msg, toAgent);      }      //  Set the message number based on the type of message      int n;      if (isLocalMessage (msg))  // every msg needs a number, even local ones      {        //  Local messages are numbered with positive numbers in order to avoid        //  a race condition where messages from the agent state of a newly         //  arrived agent have now become local (because the agent they are to        //  is on this node) are in competition with any new messages from        //  the agent itself (2 sources of msgs from the same agent).  So now        //  with agent mobility we must sequence even local messages.        n = getNextMessageNumber (POSITIVE, msg);          MessageUtils.setMessageTypeToLocal (msg);      }      else if (!MessageUtils.hasMessageType(msg) || MessageUtils.isRegularMessage (msg))      {        n = getNextMessageNumber (POSITIVE, msg);        MessageUtils.setMessageTypeToRegular (msg);      }      else if (MessageUtils.isSomePureAckMessage (msg))      {        n = getNextMessageNumber (NEGATIVE, msg);      }      else if (MessageUtils.isHeartbeatMessage (msg))      {        n = 0;      }      else if (MessageUtils.isPingMessage (msg))      {        n = getNextMessageNumber (NEGATIVE, msg);      }      else if (MessageUtils.isTrafficMaskingMessage (msg))      {        n = 0;        MessageUtils.setMessageTypeToTrafficMasking (msg);      }      else      {        //  Has an unknown message type - should not occur, except during system development        log.fatal ("Unknown msg type! : " +MessageUtils.getMessageType(msg));        n = -1;  // will nearly always result in a duplicate msg on the remote side      }      setMessageNumber (msg, n);      return link.forwardMessage (msg);    }