package org.smartly.commons.io.filetokenizer;
public class FileChunkInfo {
public static final int MAX_CHUNKS = 500;
public static final long DEFAULT_CHUNK_SIZE = 1024 * 5 * 1000; //5Mb
public static final int DEFAULT_CHUNK_COUNT = 0;
private long _fileSize;
private long _chunkSize;
private int _chunkCount;
private int _maxChunks;
private long[] _chunkOffsets;
//-----------------------------------------------
// c o n s t r u c t o r
//-----------------------------------------------
public FileChunkInfo(long fileSize) throws Exception {
this(fileSize, DEFAULT_CHUNK_SIZE, DEFAULT_CHUNK_COUNT, MAX_CHUNKS);
}
public FileChunkInfo(long fileSize, long chunkSize) throws Exception {
this(fileSize, chunkSize, DEFAULT_CHUNK_COUNT, MAX_CHUNKS);
}
public FileChunkInfo(long fileSize, long chunkSize, int maxChunks) throws Exception {
this(fileSize, chunkSize, DEFAULT_CHUNK_COUNT, maxChunks);
}
public FileChunkInfo(long fileSize, int chunkCount) throws Exception {
this(fileSize, DEFAULT_CHUNK_SIZE, chunkCount, chunkCount);
}
public FileChunkInfo(long fileSize, long chunkSize, int chunkCount, int maxChunks) throws Exception {
_fileSize = fileSize;
_chunkSize = chunkSize;
_maxChunks = maxChunks;
_chunkCount = chunkCount;
this.recalculate();
}
//-----------------------------------------------
// p r o p e r t i e s
//-----------------------------------------------
/**
* Size of every chunk
* @return Size of chunk
*/
public long getChunkSize() {
return _chunkSize;
}
/**
* NUmber of Chunks
* @return Number of Chunks
*/
public int getChunkCount() {
return _chunkCount;
}
/**
* Offsets array.
* @return Array with offsets
*/
public long[] getChunkOffsets() {
return null != _chunkOffsets ? _chunkOffsets : new long[0];
}
//-----------------------------------------------
// p r i v a t e
//-----------------------------------------------
private void recalculate() throws Exception {
if (_chunkSize > 0) {
// calculate by chunk size
_chunkCount = (int) Math.ceil((double) ((double) _fileSize / (double) _chunkSize));
if (_chunkCount > _maxChunks) {
_chunkCount = _maxChunks;
_chunkSize = (long) Math.ceil((double) ((double) _fileSize / (double) _maxChunks));
}
} else if (_chunkCount > 0) {
// calculate by chunk count
_chunkSize = (long) Math.floor((double) (_fileSize / _chunkCount));
}
// verify
long check = (_chunkCount * _chunkSize);
if (_fileSize > check) {
throw new Exception("Invalid or incoherent parameters!");
}
// generate chunks
_chunkOffsets = new long[_chunkCount];
for (int i = 0; i < _chunkCount; i++) {
long offset = i * _chunkSize;
_chunkOffsets[i] = offset;
}
}
}