/*
* ALMA - Atacama Large Millimiter Array (c) European Southern Observatory, 2006
*
* 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.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package alma.acs.util.stringqueue;
/**
* An entry of the cache.
* It contains the name of the file where the entry is stored together with the
* position of the entry.
*
* Having the name of the file allows to open and close the file when needed.
* In a previous version there was a <code>RandomAccessFile</code> instead of the name
* but it ended up with an error because the number of open file was exceeding
* the maximum allowed.
*
*
* @author acaproni
*
*/
public class QueueEntry {
/**
* The length of the bytes representing each entry.
* <P>
* This number is useful while caching the entries on a file.
* <P>
* 40 is 8 for the integer and 2 time 16 for the longs.
*
* @see toBytes()
*/
public static final int ENTRY_LENGTH = 40;
/**
* The key of the file where the entry is stored
*/
public final int key;
/**
* The starting position of the entry in the file
*/
public final long start;
/**
* The ending position of the entry in the file
*/
public final long end;
/**
* Constructor
*
* @param key The key of the file where the entry is stored
* @param startPos The starting position of the entry in the file
* @param endPos The ending position of the entry in the file
*/
public QueueEntry(Integer key, long startPos, long endPos) {
if (key==null || key<0) {
throw new IllegalArgumentException("The key must be not null and greater or equal to 0");
}
if (startPos<0 || endPos<=0 || startPos>=endPos) {
throw new IllegalArgumentException("Invalid start/end positions: "+startPos+", "+endPos);
}
this.key=key.intValue();
start=startPos;
end=endPos;
}
/**
* Constructor.
* <P>
* Build the entry by its hexadecimal representation
*
* @param hexadecimal
*
* @see toHexadecimal()
*/
public QueueEntry(String hexadecimal) {
key=Integer.decode("0X"+hexadecimal.substring(0, 8));
start=Long.decode("0X"+hexadecimal.substring(8, 24));
end=Long.decode("0X"+hexadecimal.substring(24, 40));
}
/**
* Translate the content of the entry in an hexadecimal string composed
* of the key, the start and end.
* <P>
* The array returned by this method can be written on a file.
* Its length is constant for each possible entry so the fields are not
* separated.
*
* @return An hexadecimal string representing the content of this entry
*/
public String toHexadecimal() {
StringBuilder str = new StringBuilder();
String hexKey=String.format("%08X",key);
String hexStart=String.format("%016X",start);
String hexEnd = String.format("%016X",end);
str.append(hexKey);
str.append(hexStart);
str.append(hexEnd);
return str.toString();
}
}