package org.onlab.onos.store.device.impl;

import org.onlab.onos.store.Timestamp;

/**
 * Wrapper class for a entity that is versioned
 * and can either be up or down.
 *
 * @param <T> type of the value.
 */
public class VersionedValue<T> {
    private final T entity;
    private final Timestamp timestamp;
    private final boolean isUp;

    public VersionedValue(T entity, boolean isUp, Timestamp timestamp) {
        this.entity = entity;
        this.isUp = isUp;
        this.timestamp = timestamp;
    }

    /**
     * Returns the value.
     * @return value.
     */
    public T entity() {
        return entity;
    }

    /**
     * Tells whether the entity is up or down.
     * @return true if up, false otherwise.
     */
    public boolean isUp() {
        return isUp;
    }

    /**
     * Returns the timestamp (version) associated with this entity.
     * @return timestamp.
     */
    public Timestamp timestamp() {
        return timestamp;
    }


    // Default constructor for serializer
    protected VersionedValue() {
        this.entity = null;
        this.isUp = false;
        this.timestamp = null;
    }
}

package org.onlab.onos.store.device.impl;

import java.util.Objects;

import org.onlab.onos.store.Timestamp;

/**
 * Wrapper class for a entity that is versioned
 * and can either be up or down.
 *
 * @param <T> type of the value.
 */
public class VersionedValue<T> {
    private final T entity;
    private final Timestamp timestamp;
    private final boolean isUp;

    public VersionedValue(T entity, boolean isUp, Timestamp timestamp) {
        this.entity = entity;
        this.isUp = isUp;
        this.timestamp = timestamp;
    }

    /**
     * Returns the value.
     * @return value.
     */
    public T entity() {
        return entity;
    }

    /**
     * Tells whether the entity is up or down.
     * @return true if up, false otherwise.
     */
    public boolean isUp() {
        return isUp;
    }

    /**
     * Returns the timestamp (version) associated with this entity.
     * @return timestamp.
     */
    public Timestamp timestamp() {
        return timestamp;
    }


    @Override
    public int hashCode() {
        return Objects.hash(entity, timestamp, isUp);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        @SuppressWarnings("unchecked")
        VersionedValue<T> that = (VersionedValue<T>) obj;
        return Objects.equals(this.entity, that.entity) &&
                Objects.equals(this.timestamp, that.timestamp) &&
                Objects.equals(this.isUp, that.isUp);
    }

    // Default constructor for serializer
    protected VersionedValue() {
        this.entity = null;
        this.isUp = false;
        this.timestamp = null;
    }
}

add equals, hashCode to VersionedValue