blob: a2486b8194aea720ac95577cd059c03631f359b3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2014 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Francois Chouinard - Initial API and implementation
* Francois Chouinard - Updated as per TMF Trace Model 1.0
* Patrick Tasse - Updated for location in checkpoint
******************************************************************************/
package org.eclipse.tracecompass.tmf.core.trace.indexer.checkpoint;
import java.nio.ByteBuffer;
import org.eclipse.tracecompass.tmf.core.timestamp.ITmfTimestamp;
import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
import org.eclipse.tracecompass.tmf.core.trace.location.ITmfLocation;
/**
* A basic implementation of ITmfCheckpoint. It simply maps an event timestamp
* to a generic location.
*
* @see ITmfLocation
* @see ITmfTimestamp
*
* @author Francois Chouinard
*/
public class TmfCheckpoint implements ITmfCheckpoint {
// ------------------------------------------------------------------------
// Attributes
// ------------------------------------------------------------------------
// The checkpoint location
private final ITmfLocation fLocation;
// The checkpoint timestamp
private final ITmfTimestamp fTimestamp;
private final long fCheckpointRank;
// ------------------------------------------------------------------------
// Constructors
// ------------------------------------------------------------------------
/**
* Full constructor
*
* @param timestamp
* the checkpoint timestamp
* @param location
* the corresponding trace location
* @param checkpointRank
* the rank of the checkpoint
*/
public TmfCheckpoint(final ITmfTimestamp timestamp, final ITmfLocation location, long checkpointRank) {
fTimestamp = timestamp;
fLocation = location;
fCheckpointRank = checkpointRank;
}
/**
* Constructs a checkpoint using also a byte buffer to read the rank from
* disk.
*
* @param timestamp
* the checkpoint timestamp
* @param location
* the corresponding trace location
* @param bufferIn
* the byte buffer to read from
*/
public TmfCheckpoint(final ITmfTimestamp timestamp, final ITmfLocation location, ByteBuffer bufferIn) {
fTimestamp = timestamp;
fLocation = location;
fCheckpointRank = bufferIn.getLong();
}
/**
* Copy constructor
*
* @param other the other checkpoint
*/
public TmfCheckpoint(final TmfCheckpoint other) {
if (other == null) {
throw new IllegalArgumentException();
}
fTimestamp = other.fTimestamp;
fLocation = other.fLocation;
fCheckpointRank = other.fCheckpointRank;
}
// ------------------------------------------------------------------------
// ITmfCheckpoint
// ------------------------------------------------------------------------
@Override
public ITmfTimestamp getTimestamp() {
return fTimestamp;
}
@Override
public ITmfLocation getLocation() {
return fLocation;
}
// ------------------------------------------------------------------------
// Comparable
// ------------------------------------------------------------------------
@Override
@SuppressWarnings({ "unchecked", "rawtypes" })
public int compareTo(final ITmfCheckpoint other) {
int comp = 0;
if ((fTimestamp != null) && (other.getTimestamp() != null)) {
comp = fTimestamp.compareTo(other.getTimestamp());
if (comp != 0) {
return comp;
}
// compare locations if timestamps are the same
}
if ((fLocation == null) && (other.getLocation() == null)) {
return 0;
}
// treat location of other as null location which is before any location
if ((fLocation != null) && (other.getLocation() == null)) {
return 1;
}
// treat this as null location which is before any other locations
if ((fLocation == null) && (other.getLocation() != null)) {
return -1;
}
// compare location
final Comparable location1 = getLocation().getLocationInfo();
final Comparable location2 = other.getLocation().getLocationInfo();
return location1.compareTo(location2);
}
// ------------------------------------------------------------------------
// Object
// ------------------------------------------------------------------------
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((fLocation == null) ? 0 : fLocation.hashCode());
result = prime * result + ((fTimestamp == null) ? 0 : fTimestamp.hashCode());
return result;
}
@Override
public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof TmfCheckpoint)) {
return false;
}
final TmfCheckpoint other = (TmfCheckpoint) obj;
if (fLocation == null) {
if (other.fLocation != null) {
return false;
}
} else if (!fLocation.equals(other.fLocation)) {
return false;
}
if (fTimestamp == null) {
if (other.fTimestamp != null) {
return false;
}
} else if (!fTimestamp.equals(other.fTimestamp)) {
return false;
}
return true;
}
@Override
@SuppressWarnings("nls")
public String toString() {
return getClass().getSimpleName() + " [fLocation=" + fLocation + ", fTimestamp=" + fTimestamp + ", fCheckpointRank=" + fCheckpointRank + "]";
}
@Override
public void serialize(ByteBuffer bufferOut) {
fLocation.serialize(bufferOut);
// Always serialize as base TmfTimestamp, this should be sufficient for indexing.
// If not, we can add API for the test to restore the time stamp, similarly to the location.
TmfTimestamp.serialize(bufferOut, fTimestamp);
bufferOut.putLong(fCheckpointRank);
}
@Override
public long getCheckpointRank() {
return fCheckpointRank;
}
}