Listing 1: The Java Message class

package mgr;
import java.util.*;
import java.io.*;

class Message extends Object implements Codes
{
protected Header  header;
protected Vector items; 
protected int itemsRead;

public Message()        //create an empty Messasge to be filled later
{
  items = new Vector();
  header = new Header();
}// Message()
public Message(int msgCode, int error, int flags)  //used by server
{
  items = new Vector();
  header = new Header();
  header.msgCode(msgCode);
  header.errCode(error);
  header.headerFlags(flags);
}// Message(int msgCode, int error, int flags)
//reconstituting constructor
public Message( DataInputStream buf) throws IOException     
{
  items =  new Vector();
  header = new Header(buf); //reconstitute header
  try
  {
    for (;;) //until EOF exception is thrown
    {
      Item temp = new Item(buf); //reconstitute next Item
      items.addElement(temp);
    }// for
  }//try
  catch (IOException exception)
  {
    if (exception instanceof EOFException) //OK; stream end reached
      return;
    throw exception; //an unexpected exception 
  }//catch
}// Message( DataInputStream buf) throws IOException

public void addItem(int itemCode) //pseudo default argument
{ 
  addItem(itemCode, TYPE_NONE, null);
}//addItem(int itemCode)

public void addItem( int itemCode, int itemType, Object data)
{
  addItem(new Item(itemCode, itemType, data);
}addItem( int itemCode, int itemType, Object data)
//...more overloaded addItem() versions
public void addItem(Item dataItem)  //actual insertion done here
{
  items.addElement(dataItem);
  int currDataSize = header.dataSize();
  header.dataSize(currDataSize + dataItem.itemSize() );
}//addItem(Item dataItem)

public Item readNextItem()
{
  if (items.size() < itemsRead)
  {
    itemRead = 0;  //rewind
    return null;  
  }//if
  return (Item) items.elementAt(itemsRead++);  
}//readNextItem

public void compose (int msgCode, byte [] senderContext, 
              int timeout, int flags, int errCode, int format)
{...}

public byte [] serialize ()
{
  //create required output streams
  ByteArrayOutputStream outbuf = new ByteArrayOutputStream();
  DataOutputStream  out = new DataOutputStream(outbuf);
//Header 
  header.setCrc();
  header.serialize(out);
//Items
  Enumeration i  = items.elements();
  while (i.hasMoreElements())
  {
   Item dataItem = (Item) i.nextElement();
    dataItem.serilalize(out);
  }//while
  return  outbuf.toByteArray();
}//serialize

boolean isHeaderValid()
{...}
}//Message
//End of file