package com.joe.utilities.core.configuration.database;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
/**
* @author rrichard
*
*/
public final class Sequence {
private static long currTime = System.currentTimeMillis();
private static long currSeq = 1;
private String prefix;
private long value;
/**
*
*/
public Sequence() {
prefix = null;
value = nextNumber();
}
/**
*
*/
public Sequence(String prefix) {
this.prefix = prefix;
value = nextNumber();
}
/**
* @return
*/
public String toStringWprefix() {
StringBuffer returnValue = new StringBuffer();
if (this.prefix != null) {
returnValue.append(prefix);
returnValue.append("-");
}
returnValue.append(value);
return returnValue.toString();
}
/**
* @return
*/
public String toHexStringWprefix() {
StringBuffer returnValue = new StringBuffer();
if (this.prefix != null) {
returnValue.append(prefix);
returnValue.append("-");
}
returnValue.append(toHexString());
return returnValue.toString();
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return Long.toString(value);
}
/**
* @return
*/
public String toHexString() {
return Long.toHexString(value);
}
public long longValue() {
return value;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
return new HashCodeBuilder()
.append(value)
.toHashCode();
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
// Not strictly necessary, but often a good optimization
if (this == obj)
return true;
if (!(obj instanceof Sequence))
return false;
Sequence other = (Sequence) obj;
return new EqualsBuilder()
.append(value, other.value)
.isEquals();
}
public Sequence nextValue() {
this.value = nextNumber();
return this;
}
/**
* @return
*/
private static synchronized long nextNumber() {
long newTimMillis = System.currentTimeMillis();
if (currTime != newTimMillis) {
currTime = newTimMillis;
currSeq = 1;
}
long returnValue = Long.parseLong(String.format("%1$d%2$d", currTime, currSeq++));
return returnValue;
}
}