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.events; 20 21 import java.io.IOException; 22 import java.io.ObjectInput; 23 import java.io.ObjectOutput; 24 25 import jgroup.core.MemberId; 26 import jgroup.relacs.types.GroupIndex; 27 import jgroup.relacs.types.MemberIdImpl; 28 import jgroup.relacs.types.MessageId; 29 30 /** 31 * The <code>DeliveryAck</code> class represents a local message 32 * exchanged between members and the daemon; it is used by the member 33 * to notify the daemon that a message has been successfully delivered. 34 * 35 * @author Alberto Montresor 36 * @since Jgroup 1.2 37 */ 38 public final class DeliveryAck 39 extends Event 40 { 41 42 //////////////////////////////////////////////////////////////////////////////////////////// 43 // Fields 44 //////////////////////////////////////////////////////////////////////////////////////////// 45 46 private static final long serialVersionUID = -6414737364782334061L; 47 48 /** Host position of the member in the current view */ 49 private int hostIndex; 50 51 /** Local member position of the member in the current view */ 52 private int memberIndex; 53 54 /** */ 55 private int viewIndex; 56 57 /** Message identifier */ 58 private int mid; 59 60 /** Identifier of the sender of the original message */ 61 private MemberId sender; 62 63 /** Result value associated to the message acknowledgement */ 64 private Object result; 65 66 /** Sender of this ack message */ 67 private MemberId ackSender; 68 69 70 //////////////////////////////////////////////////////////////////////////////////////////// 71 // Constructors 72 //////////////////////////////////////////////////////////////////////////////////////////// 73 74 /** 75 * Default constructor for externalization. 76 */ 77 public DeliveryAck() 78 { 79 } 80 81 82 /** 83 * Creates a <code>DeliveryAck</code> with the specified data. 84 * 85 * @param gid group identifier 86 * @param hostIndex host position in the current view 87 * @param memberIndex member position in the current view 88 * @param viewIndex 89 * @param mid message identifier 90 * @param sender sender identifier 91 * @param result result associated to the message acknowledgement 92 */ 93 public DeliveryAck(int gid, int hostIndex, int memberIndex, int viewIndex, 94 int mid, MemberId sender, Object result, MemberId ackSender) 95 { 96 super(DELIVERY_ACK, gid); 97 this.hostIndex = hostIndex; 98 this.memberIndex = memberIndex; 99 this.viewIndex = viewIndex; 100 this.mid = mid; 101 this.sender = sender; 102 this.result = result; 103 this.ackSender = ackSender; 104 } 105 106 //////////////////////////////////////////////////////////////////////////////////////////// 107 // Getter / setter methods 108 //////////////////////////////////////////////////////////////////////////////////////////// 109 110 /** 111 * Returns the position index of the local host in the array of the 112 * hosts contained in the current view. 113 */ 114 public int getHostIndex() 115 { 116 return hostIndex; 117 } 118 119 /** 120 * Returns the position index of this member in the array of 121 * the local members contained in the current view. 122 */ 123 public int getMemberIndex() 124 { 125 return memberIndex; 126 } 127 128 /** 129 * Returns the position index of this member in the array of 130 * the members contained in the current view. 131 */ 132 public int getViewIndex() 133 { 134 return viewIndex; 135 } 136 137 /** 138 * Returns the message identifier. 139 */ 140 public int getMessageId() 141 { 142 return mid; 143 } 144 145 /** 146 * Returns the sender identifier of the original message sender. 147 */ 148 public MemberId getSender() 149 { 150 return sender; 151 } 152 153 /** 154 * Returns the result object associated to the message acknowledgement. 155 */ 156 public Object getResult() 157 { 158 return result; 159 } 160 161 /** 162 * Returns the sender of this ack message. 163 */ 164 public MemberId getAckSender() 165 { 166 return ackSender; 167 } 168 169 170 //////////////////////////////////////////////////////////////////////////////////////////// 171 // Methods from Externalizable 172 //////////////////////////////////////////////////////////////////////////////////////////// 173 174 /** 175 * Restores the content of this object from the marshalled data contained 176 * in the specified input stream. 177 * 178 * @param in the stream to be read 179 */ 180 public void readExternal(ObjectInput in) 181 throws IOException, ClassNotFoundException 182 { 183 super.readExternal(in); 184 hostIndex = GroupIndex.unmarshal(in); 185 memberIndex = GroupIndex.unmarshal(in); 186 viewIndex = GroupIndex.unmarshal(in); 187 mid = MessageId.unmarshal(in); 188 sender = new MemberIdImpl(); 189 sender.readExternal(in); 190 result = in.readObject(); 191 ackSender = new MemberIdImpl(); 192 ackSender.readExternal(in); 193 } 194 195 /** 196 * Marshals the content of this object to the specified output stream. 197 * 198 * @param out the stream to be written 199 */ 200 public void writeExternal(ObjectOutput out) 201 throws IOException 202 { 203 super.writeExternal(out); 204 GroupIndex.marshal(out, hostIndex); 205 GroupIndex.marshal(out, memberIndex); 206 GroupIndex.marshal(out, viewIndex); 207 MessageId.marshal(out, mid); 208 sender.writeExternal(out); 209 out.writeObject(result); 210 ackSender.writeExternal(out); 211 } 212 213 214 //////////////////////////////////////////////////////////////////////////////////////////// 215 // Methods from Object 216 //////////////////////////////////////////////////////////////////////////////////////////// 217 218 /** 219 * Returns a string representation of the object. 220 */ 221 public String toString() 222 { 223 StringBuilder buf = new StringBuilder(); 224 buf.append(super.toString()); 225 buf.append("[DeliveryAck: hostIndex="); 226 buf.append(hostIndex); 227 buf.append(", memberIndex="); 228 buf.append(memberIndex); 229 buf.append(", viewIndex="); 230 buf.append(viewIndex); 231 buf.append(", mid="); 232 buf.append(mid); 233 buf.append(", sender="); 234 buf.append(sender); 235 buf.append(", ackSender="); 236 buf.append(ackSender); 237 buf.append("]"); 238 return buf.toString(); 239 } 240 241 } // END DeliveryAck