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.Flag; 27 import jgroup.relacs.types.GroupIndex; 28 import jgroup.relacs.types.MemberIdImpl; 29 import jgroup.relacs.types.MessageId; 30 import jgroup.util.InMessage; 31 32 /** 33 * The <code>DeliveryEvent</code> class represents a local message 34 * exchanged between members and the daemon; it is used by a daemon 35 * to notify members that a message is ready to be delivered. 36 * 37 * @author Alberto Montresor 38 * @since Jgroup 0.2 39 */ 40 public final class DeliveryEvent 41 extends Event 42 { 43 44 //////////////////////////////////////////////////////////////////////////////////////////// 45 // Fields 46 //////////////////////////////////////////////////////////////////////////////////////////// 47 48 private static final long serialVersionUID = -327290828044626238L; 49 50 /** Identifier of the sender of the message */ 51 private MemberId sender; 52 53 /** Index of the sender host in the current view */ 54 private int hpos; 55 56 /** True if the payload contains a single object */ 57 private boolean isObject; 58 59 /** Message identifier */ 60 private int mid; 61 62 /** True if an ack for this message is needed */ 63 private boolean ackRequired; 64 65 /** Message contents */ 66 private InMessage payload; 67 68 69 //////////////////////////////////////////////////////////////////////////////////////////// 70 // Constructors 71 //////////////////////////////////////////////////////////////////////////////////////////// 72 73 /** 74 * Default constructor for externalization. 75 */ 76 public DeliveryEvent() { } 77 78 79 /** 80 * Builds a new <CODE>DeliveryEvent</CODE> object. 81 * 82 * @param gid 83 * Group identifier 84 * @param isObject 85 * True if the payload contains a single object; false if it 86 * contains a stream 87 * @param mid 88 * Message identifier 89 * @param sender 90 * Sender identifier 91 * @param ackRequired 92 * True if acknowledgement is required; false otherwise 93 * @param payload 94 * A stream or object payload 95 */ 96 public DeliveryEvent(int gid, boolean isObject, int mid, int hpos, 97 MemberId sender, boolean ackRequired, InMessage payload) 98 { 99 super(DELIVERY_EVENT, gid); 100 this.isObject = isObject; 101 this.mid = mid; 102 this.hpos = hpos; 103 this.sender = sender; 104 this.ackRequired = ackRequired; 105 this.payload = payload; 106 } 107 108 109 //////////////////////////////////////////////////////////////////////////////////////////// 110 // Accessor methods 111 //////////////////////////////////////////////////////////////////////////////////////////// 112 113 /** 114 * Returns the sender of this multicast message. 115 */ 116 public MemberId getSender() 117 { 118 return sender; 119 } 120 121 /** 122 * 123 */ 124 public int getHostIndex() 125 { 126 return hpos; 127 } 128 129 /** 130 * Returns the message identifier for this multicast message. 131 */ 132 public int getMessageId() 133 { 134 return mid; 135 } 136 137 /** 138 * 139 */ 140 public boolean isObject() 141 { 142 return isObject; 143 } 144 145 /** 146 * 147 */ 148 public boolean isAckRequired() 149 { 150 return ackRequired; 151 } 152 153 /** 154 * 155 */ 156 public InMessage getPayload() 157 { 158 return payload; 159 } 160 161 162 //////////////////////////////////////////////////////////////////////////////////////////// 163 // Object methods 164 //////////////////////////////////////////////////////////////////////////////////////////// 165 166 public String toString() 167 { 168 StringBuilder buf = new StringBuilder(); 169 buf.append("["); 170 buf.append(super.toString()); 171 buf.append(", hpos="); 172 buf.append(hpos); 173 buf.append(", mid="); 174 buf.append(mid); 175 buf.append(", sender="); 176 buf.append(sender); 177 buf.append(", isObj="); 178 buf.append(isObject); 179 buf.append(", ackRequired="); 180 buf.append(ackRequired); 181 buf.append(", payload="); 182 buf.append(payload); 183 return buf.toString(); 184 } 185 186 187 //////////////////////////////////////////////////////////////////////////////////////////// 188 // Methods from Externalizable 189 //////////////////////////////////////////////////////////////////////////////////////////// 190 191 /** 192 * Restores the content of this object from the marshalled data contained 193 * in the specified input stream. 194 * 195 * @param in the stream to be read 196 */ 197 public void readExternal(ObjectInput in) 198 throws IOException, ClassNotFoundException 199 { 200 super.readExternal(in); 201 sender = new MemberIdImpl(); 202 sender.readExternal(in); 203 hpos = GroupIndex.unmarshal(in); 204 isObject = Flag.unmarshal(in); 205 ackRequired = Flag.unmarshal(in); 206 mid = MessageId.unmarshal(in); 207 payload = new InMessage(); 208 payload.readExternal(in); 209 } 210 211 212 /** 213 * Marshals the content of this object to the specified output stream. 214 * 215 * @param out the stream to be written 216 */ 217 public void writeExternal(ObjectOutput out) 218 throws IOException 219 { 220 super.writeExternal(out); 221 sender.writeExternal(out); 222 GroupIndex.marshal(out, hpos); 223 Flag.marshal(out, isObject); 224 Flag.marshal(out, ackRequired); 225 MessageId.marshal(out, mid); 226 payload.writeExternal(out); 227 } 228 229 } // END DeliveryEvent