blob: 84003765fb8bfac1616b4947c7154594b0035ef2 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License. You may obtain a
* copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package org.apache.geode.cache.wan;
import java.util.Arrays;
import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
import org.apache.geode.internal.ByteArrayDataInput;
/**
* This class wraps 1) DistributedMembershipID 2) ThreadID 3) SequenceID attributes which are used
* to uniquely identify any Region Operation like create, update, destroy etc. This helps in
* sequencing the events belonging to a unique producer. As an example, the EventSequenceID can be
* used to track the events received by <code>AsyncEventListener</code>. If the event has already
* been seen, <code>AsyncEventListener</code> can choose to ignore it.
*/
public class EventSequenceID {
/**
* Uniquely identifies the distributed member VM in which the Event is produced
*/
private String membershipID;
/**
* Unqiuely identifies the thread producing the event
*/
private long threadID;
/**
* Uniquely identifies individual event produced by a given thread
*/
private long sequenceID;
public EventSequenceID(byte[] membershipID, long threadID, long sequenceID) {
// convert the byte array of membershipID to a readable string
Object mbr;
try {
mbr = InternalDistributedMember
.readEssentialData(new ByteArrayDataInput(membershipID));
} catch (Exception e) {
mbr = Arrays.toString(membershipID); // punt and use the bytes
}
this.membershipID = mbr.toString();
this.threadID = threadID;
this.sequenceID = sequenceID;
}
public String getMembershipID() {
return this.membershipID;
}
public long getThreadID() {
return this.threadID;
}
public long getSequenceID() {
return this.sequenceID;
}
public boolean equals(Object obj) {
if (!(obj instanceof EventSequenceID))
return false;
EventSequenceID obj2 = (EventSequenceID) obj;
return (this.membershipID.equals(obj2.getMembershipID()) && this.threadID == obj2.getThreadID()
&& this.sequenceID == obj2.getSequenceID());
}
public int hashCode() {
StringBuilder builder = new StringBuilder();
builder.append(this.membershipID);
builder.append(this.threadID);
builder.append(this.sequenceID);
return builder.toString().hashCode();
}
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("membershipID: " + membershipID);
builder.append("; threadID: " + threadID);
builder.append("; sequenceID: " + sequenceID);
return builder.toString();
}
}