//---------------------------------------------------------------------------

  // Constructor for empty KQML message

  //---------------------------------------------------------------------------

  public  KQMLmessage() {



  //---------------------------------------------------------------------------

  // Constructor that is passed a string to make a message 

  //---------------------------------------------------------------------------

  public KQMLmessage (String message) { 





  //---------------------------------------------------------------------------

  // 27-Oct-98-garof:

  // I revised this method to permit embedded or trailing colons to not be

  // confused with keywords.

  // Ex. (":time 14:23:01") should parse as 'field=time' and 'value=14:23:01'.

  // Ex. (":time time:") should parse as 'field=time' and 'value=time:'.

  //

  // Original author's comments:

  // This parses a KQML message.  It isn't very sophisticated, it just assumes

  // the following:  a KQML message is a list of field value pairs enclosed in

  // parentheses and separated by either blanks, tabs or new lines (between

  // field and values and between pairs)

  //

  // A field is either a performative in which case it is not preceded by a :

  // or a keyword in which case it is preceded by a :. 

  //

  // a value is - either a word delineated by separators OR 

  //            - enclosed between parentheses OR

  //            - null

  //---------------------------------------------------------------------------

  public synchronized void parseString(String message) {





  //  Sets the value of the field "field".

  // @param field String key for the field.

  // @param value String value for the field.

  public void addFieldValuePair(String field, String value) {





  /**

   * Removes the "field" field. 

   * @param field String key for the field.

   * @return String representing field value removed.

   */

  public String removeField(String field) {





  /**

   * Returns the value of the "field" field. If it does not exit, returns null.

   * @return String representing field value.

   */

  public String getValue(String field) {





  /** Return true if a field exists, even if it's value is null.

  */

  public boolean existsField(String fieldName) {





  /** Return true if a field exists and its value is not null.

  */

  public boolean existsNonNullField(String fieldName) {



  /** Return true if a field exists and its value is not

      empty, i.e. it is not just a whitespace string.

  */

  public boolean existsNonEmptyField(String fieldName) {



  /** Remove all fields from the msg.

  */

  public void clearMsg() {



  /** Return an Enumeration of all the field names in a msg. This

      also includes the field name PERFORMATIVE_KEY if it is present.

  */

  public Enumeration getFieldNames() {



  /** Returns the KQML message as a single machine readable string.

      This is the format which is sent to other agents.

      Fields that are null are excluded but fields whose values

      are whitespace strings are included.

  */

  public String toString() {