All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jgroups.protocols.tom.ToaHeader Maven / Gradle / Ivy

There is a newer version: 9.1.7.Final
Show newest version
package org.jgroups.protocols.tom;

import org.jgroups.Address;
import org.jgroups.Global;
import org.jgroups.Header;
import org.jgroups.util.Bits;
import org.jgroups.util.Util;

import java.io.DataInput;
import java.io.DataOutput;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;

/**
 * The header for the Total Order Anycast (TOA) protocol
 *
 * @author Pedro Ruivo
 * @since 3.1
 */
public class ToaHeader extends Header {

    //type
    public static final byte DATA_MESSAGE = 1 << 0;
    public static final byte PROPOSE_MESSAGE = 1 << 1;
    public static final byte FINAL_MESSAGE = 1 << 2;
    public static final byte SINGLE_DESTINATION_MESSAGE = 1 << 3;

    private byte type = 0;
    private MessageID messageID; //address and sequence number
    private long sequencerNumber;
    private Collection
destinations; public ToaHeader() { } private ToaHeader(MessageID messageID, byte type) { this.messageID = messageID; this.type = type; } public MessageID getMessageID() { return messageID; } private ToaHeader setDestinations(Collection
addresses) { this.destinations = addresses; return this; } public Collection
getDestinations() { return Collections.unmodifiableCollection(destinations); } public long getSequencerNumber() { return sequencerNumber; } public ToaHeader setSequencerNumber(long sequencerNumber) { this.sequencerNumber = sequencerNumber; return this; } public byte getType() { return type; } @Override public int size() { return (int) (Global.BYTE_SIZE + messageID.serializedSize() + Bits.size(sequencerNumber) + Util.size(destinations)); } @Override public void writeTo(DataOutput out) throws Exception { out.writeByte(type); messageID.writeTo(out); Bits.writeLong(sequencerNumber, out); if (type == DATA_MESSAGE) { Util.writeAddresses(destinations, out); } } @Override public void readFrom(DataInput in) throws Exception { type = in.readByte(); messageID = new MessageID(); messageID.readFrom(in); sequencerNumber = Bits.readLong(in); if (type == DATA_MESSAGE) { destinations = (Collection
) Util.readAddresses(in, ArrayList.class); } } @Override public String toString() { return "ToaHeader{" + "type=" + type2String(type) + ", message_id=" + messageID + ", sequence_number=" + sequencerNumber + ", destinations=" + destinations + '}'; } public static String type2String(byte type) { switch (type) { case DATA_MESSAGE: return "DATA_MESSAGE"; case PROPOSE_MESSAGE: return "PROPOSE_MESSAGE"; case FINAL_MESSAGE: return "FINAL_MESSAGE"; case SINGLE_DESTINATION_MESSAGE: return "SINGLE_DESTINATION_MESSAGE"; default: return "UNKNOWN"; } } public static ToaHeader newDataMessageHeader(MessageID messageID, Collection
destinations) { assertMessageIDNotNull(messageID); return new ToaHeader(messageID, DATA_MESSAGE).setDestinations(new ArrayList<>(destinations)); } public static ToaHeader newProposeMessageHeader(MessageID messageID, long sequencerNumber) { assertMessageIDNotNull(messageID); return new ToaHeader(messageID, PROPOSE_MESSAGE).setSequencerNumber(sequencerNumber); } public static ToaHeader newFinalMessageHeader(MessageID messageID, long sequenceNumber) { assertMessageIDNotNull(messageID); return new ToaHeader(messageID, FINAL_MESSAGE).setSequencerNumber(sequenceNumber); } public static ToaHeader createSingleDestinationHeader(MessageID messageID) { return new ToaHeader(messageID, SINGLE_DESTINATION_MESSAGE); } private static void assertMessageIDNotNull(MessageID messageID) { if (messageID == null) { throw new NullPointerException("The message ID can't be null."); } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy