/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package TCM_MPI.Buffer;
import TCM_MPI.Buffer.Data.FragmentFileData;
import java.io.File;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.util.concurrent.ConcurrentHashMap;
/**
*
* @author dev
*/
public class FragmentFileBuffer {
private ConcurrentHashMap<String,FragmentFileData> _HASH_MAP;
public FragmentFileBuffer(){
this._HASH_MAP = new ConcurrentHashMap<String, FragmentFileData>();
}
public synchronized void UpdateFragmentedData(ByteBuffer IDS,ByteBuffer NUMS){
int FROM_ID,TO_ID,TYPE_ID,TOTAL_NUMBERS,TOTAL_PACOTES,PACOTE_ATUAL;
long SEQUENCE_NUMBER;
FragmentFileData FRAG_FILE = null;
// REMETENTE
FROM_ID = IDS.getInt(0);
// DESTINATARIO
TO_ID = IDS.getInt(4);
// TIPODE DADOS
TYPE_ID = IDS.getInt(8);
// TOTAL DE INFORMAÇÕES A RECEBER
TOTAL_NUMBERS = IDS.getInt(12);
// NUMERAÇÃO DE SEQUENCIA DO PACOTE
SEQUENCE_NUMBER = IDS.getLong(16);
// TOTAL DE PACOTES FRAGMENTADOS
TOTAL_PACOTES = IDS.getInt(24);
// NUMERO DO FRAGMENTO ATUAL
PACOTE_ATUAL = IDS.getInt(28);
String KEY = FROM_ID + ":" + TO_ID + ":" + SEQUENCE_NUMBER;
if(PACOTE_ATUAL == 0 && TOTAL_NUMBERS == 0){
FRAG_FILE = CreateFragmentFile(IDS, NUMS);
this._HASH_MAP.put(KEY, FRAG_FILE);
}else{
FRAG_FILE = this._HASH_MAP.get(KEY);
UpdateRandomFile(FRAG_FILE, NUMS);
}
}
private FragmentFileData CreateFragmentFile(ByteBuffer IDS,ByteBuffer NUMS){
FragmentFileData frag = new FragmentFileData();
try{
long FILE_LEN = NUMS.getLong(0);
String FILE_NAME = getFileName(8, NUMS);
frag.FILE = new File(FILE_NAME);
frag.FILE.createNewFile();
frag.RANDOM_FILE = CreateBlankFile(frag.FILE, FILE_LEN);
}catch(Exception ex){
}
return frag;
}
private String getFileName(int start,ByteBuffer NUMS){
StringBuilder name = new StringBuilder();
for(int x=start ; x < NUMS.capacity() ; x+=2){
name.append(NUMS.getChar(x));
}
return name.toString();
}
private RandomAccessFile CreateBlankFile(File file,long file_len){
RandomAccessFile RANDOM_FILE = null;
try{
RANDOM_FILE = new RandomAccessFile(file, "rwd");
for(long lng=0 ; lng < file_len ; lng++){
RANDOM_FILE.writeByte(0);
}
}catch(Exception ex){
}
return RANDOM_FILE;
}
private void UpdateRandomFile(FragmentFileData FRAG_FILE,ByteBuffer NUMS){
long FILE_POSITION = NUMS.getLong(0);
byte BYTES[] = NUMS.array();
NUMS = null;
try{
// POSICIONA O PONTEIRO DO ARQUIVO
FRAG_FILE.RANDOM_FILE.seek(FILE_POSITION);
// ESCREVER OS BYTES RECEBIDOS NO ARQUIVO
FRAG_FILE.RANDOM_FILE.write(BYTES, 8, BYTES.length - 8);
// INCREMENTA O TOTAL DE PACOTES RECEBIDOS
FRAG_FILE.TOTAL_PACKAGES++;
// INCREMENTA O TOTAL DE BYTES RECEBIDOS
FRAG_FILE.BYTES_RECEIVED += (BYTES.length - 8);
}catch(Exception ex){
}
}
}