1 /* 2 * Copyright (c) 1998-2002 The Jgroup Team. 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU Lesser General Public License version 2 as 6 * published by the Free Software Foundation. 7 * 8 * This program is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * GNU Lesser General Public License for more details. 12 * 13 * You should have received a copy of the GNU Lesser General Public License 14 * along with this program; if not, write to the Free Software 15 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 16 * 17 */ 18 19 package jgroup.relacs.daemon; 20 21 22 import java.io.IOException; 23 import java.io.ObjectInput; 24 25 import jgroup.core.EndPoint; 26 import jgroup.relacs.mss.MssConstants; 27 import jgroup.relacs.types.EndPointImpl; 28 import jgroup.relacs.types.GroupId; 29 import jgroup.relacs.types.GroupIndex; 30 import jgroup.relacs.types.VersionId; 31 import jgroup.util.MsgFactory; 32 import jgroup.util.OutMessage; 33 34 /** 35 * The <code> MsgSynch</code> class 36 * 37 * @author Alberto Montresor 38 * @since Jgroup 0.1 39 */ 40 final class MsgSynch 41 implements MssConstants, DaemonMsg 42 { 43 44 //////////////////////////////////////////////////////////////////////////////////////////// 45 // Position constants 46 //////////////////////////////////////////////////////////////////////////////////////////// 47 48 private static final int START = MSS_HEADER_SIZE; 49 50 51 //////////////////////////////////////////////////////////////////////////////////////////// 52 // Unique message instance 53 //////////////////////////////////////////////////////////////////////////////////////////// 54 55 /** 56 * As these messages are never stored by the daemon, a single message 57 * instance is sufficient. In this way, we save the costs of 58 * allocating and garbage collecting messages. 59 */ 60 private static MsgSynch msg = new MsgSynch(); 61 62 /** The marshalled message data (also static for same reason as above) */ 63 private static OutMessage outmsg; 64 65 66 //////////////////////////////////////////////////////////////////////////////////////////// 67 // Fields 68 //////////////////////////////////////////////////////////////////////////////////////////// 69 70 int vsend; // Sender version number 71 int vdest; // Destination version number 72 EndPoint[] rset; // Reachable set (32 bit adressess) 73 74 75 //////////////////////////////////////////////////////////////////////////////////////////// 76 // Decoding methods 77 //////////////////////////////////////////////////////////////////////////////////////////// 78 79 /** 80 * Decodes a <code>MsgSynch</code> message starting from a m-received 81 * message input stream. 82 */ 83 static MsgSynch unmarshal(ObjectInput stream) 84 throws IOException, ClassNotFoundException 85 { 86 // Read data 87 msg.vsend = VersionId.unmarshal(stream); 88 msg.vdest = VersionId.unmarshal(stream); 89 int len = GroupIndex.unmarshal(stream); // Length of the rset field 90 msg.rset = new EndPoint[len]; 91 for (int i=0; i < len; i++) { 92 msg.rset[i] = new EndPointImpl(); 93 msg.rset[i].readExternal(stream); 94 } 95 return msg; 96 } 97 98 99 //////////////////////////////////////////////////////////////////////////////////////////// 100 // Encoding methods 101 //////////////////////////////////////////////////////////////////////////////////////////// 102 103 /** 104 * Computes the encoding of a <code> MsgSynch</code> message. 105 * 106 * @param gid group identifier. 107 * @param vsend version number of the sender host 108 * @param vdest version number of the destination host 109 * @param rset reachable set 110 */ 111 static MsgSynch marshal(int gid, int vsend, int vdest, EndPoint[] rset) 112 throws IOException 113 { 114 /* Allocates data buffer */ 115 int size = START + GroupId.SIZE + 2*VersionId.SIZE + GroupIndex.SIZE 116 + rset.length * EndPointImpl.SIZE; 117 outmsg = MsgFactory.get(size, 1); 118 outmsg.seek(START); 119 120 /* Write group identifier and sender, destination version numbers */ 121 GroupId.marshal(outmsg, gid); 122 VersionId.marshal(outmsg, vsend); 123 VersionId.marshal(outmsg, vdest); 124 125 /* 126 * Writes the identifier of the endpoints contained in rset 127 */ 128 GroupIndex.marshal(outmsg, rset.length); 129 for (int i=0; i < rset.length; i++) 130 rset[i].writeExternal(outmsg); 131 return msg; 132 } 133 134 135 //////////////////////////////////////////////////////////////////////////////////////////// 136 // Methods from DaemonMsg 137 //////////////////////////////////////////////////////////////////////////////////////////// 138 139 public int size() 140 { 141 /* Note; it is ok to use the outmsg size since MsgSynch will never be 142 * forwarded or resent (it is not queued). */ 143 return outmsg.size(); 144 } 145 146 public OutMessage getOutMessage() 147 { 148 return outmsg; 149 } 150 151 152 //////////////////////////////////////////////////////////////////////////////////////////// 153 // Methods from Object 154 //////////////////////////////////////////////////////////////////////////////////////////// 155 156 /** 157 * Returns a string representation of this object 158 */ 159 public String toString() 160 { 161 StringBuilder buffer = new StringBuilder(); 162 buffer.append("[MsgSynch: vsend="); 163 buffer.append(vsend); 164 buffer.append(", vdest="); 165 buffer.append(vdest); 166 buffer.append(", rset={"); 167 for (int i=0; i < rset.length; i++) { 168 buffer.append(rset[i]); 169 if (i < rset.length-1) 170 buffer.append(", "); 171 } 172 buffer.append("}]"); 173 return buffer.toString(); 174 } 175 176 } // END MsgSynch