/*
* TimeStampedValue, wrapper class for values marked with a timestamp.
* Copyright (C) 2004 - 2011 Achim Westermann.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* If you modify or optimize the code in a useful way please let me know.
* Achim.Westermann@gmx.de
*
*/
package info.monitorenter.util;
import java.util.Map;
/**
* Simple wrapper around a time in ms and a value Object.
* <p>
*
* The key is the time in ms and may be used in a Map.
* <code>{@link #compareTo(TimeStampedValue)}</code> compares the key.
*
* @author <a href='mailto:Achim.Westermann@gmx.de'>Achim Westermann</a>
*
* @version $Revision: 1.11 $
*/
public final class TimeStampedValue implements Map.Entry<Long, Object>,
Comparable<TimeStampedValue> {
/**
* The time stamp (difference, measured in milliseconds, between the current
* time and midnight, January 1, 1970 UTC).
*/
private final long m_key;
/** The time stamp value. */
private Object m_value;
/**
* Creates an instance with the given timestamp key and the value to time
* stamp.
* <p>
*
* @param key
* the time stamp (difference, measured in milliseconds, between the
* current time and midnight, January 1, 1970 UTC).
*
* @param value
* the value to time stamp.
*/
public TimeStampedValue(final long key, final Object value) {
this.m_key = key;
this.m_value = value;
}
/**
* Creates an instance for the given value that is time stamped with the
* current time.
* <p>
*
* @param value
* the value to time stamp.
*
* @see System#currentTimeMillis()
*/
public TimeStampedValue(final Object value) {
this(System.currentTimeMillis(), value);
}
/**
* Compares the given {@link TimeStampedValue} to this by the internal
* {@link #getTime()}.
* <p>
*
* @param obj
* the object to compare this to.
*
* @return see interface.
*
* @see java.lang.Comparable#compareTo(java.lang.Object)
*/
public int compareTo(final TimeStampedValue obj) {
int result;
if (this.m_key < obj.m_key) {
result = -1;
} else if (this.m_key == obj.m_key) {
result = 0;
} else {
result = 1;
}
return result;
}
/**
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (this.getClass() != obj.getClass()) {
return false;
}
final TimeStampedValue other = (TimeStampedValue) obj;
if (this.m_key != other.m_key) {
return false;
}
if (this.m_value == null) {
if (other.m_value != null) {
return false;
}
} else if (!this.m_value.equals(other.m_value)) {
return false;
}
return true;
}
/**
* Returns the {@link Long} that marks the time stamp (difference, measured in
* milliseconds, between the current time and midnight, January 1, 1970 UTC).
*
* @return the {@link Long} that marks the time stamp (difference, measured in
* milliseconds, between the current time and midnight, January 1,
* 1970 UTC).
*
* @see java.util.Map.Entry#getKey()
*/
public Long getKey() {
return new Long(this.m_key);
}
/**
* Returns the time stamp (difference, measured in milliseconds, between the
* current time and midnight, January 1, 1970 UTC).
* <p>
*
* @return the time stamp (difference, measured in milliseconds, between the
* current time and midnight, January 1, 1970 UTC).
*
*/
public long getTime() {
return this.m_key;
}
/**
* Returns the time stamp.
* <p>
*
* @return the time stamp.
*
* @see java.util.Map.Entry#getValue()
*/
public Object getValue() {
return this.m_value;
}
/**
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (int) (this.m_key ^ (this.m_key >>> 32));
result = prime * result + ((this.m_value == null) ? 0 : this.m_value.hashCode());
return result;
}
/**
* Returns whether the internal time stamp marks a time in the past or not.
* <p>
*
* For normal a time stamp represents a value regarded at a time. But it is
* also thinkable to mark a value for expiration in the future. This method
* returns true if the internal time- representing key is smaller than the
* actual time.
* <p>
*
* @return true if the internal time stamp marks a moment in the past, false
* else.
*/
public boolean isPast() {
return this.m_key < System.currentTimeMillis();
}
/**
* Assigns a different value to the timestamp.
* <p>
*
* @param value
* the new value to be marked with this timestamp.
*
* @return the previous value that was contained.
*
* @see java.util.Map.Entry#setValue(java.lang.Object)
*/
public Object setValue(final Object value) {
final Object ret = this.m_value;
this.m_value = value;
return ret;
}
}