/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package TCM_MPI.Buffer;
import TCM_MPI.Buffer.Events.BufferEvent;
import TCM_MPI.Buffer.Events.BufferListener;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Collection;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.LinkedBlockingQueue;
/**
*
* @author cpd
*/
public class BufferInfo{
private ConcurrentHashMap<String,LinkedBlockingQueue<ByteBuffer>> HASH_MAP;
private Collection<BufferListener> bufferListener = new ArrayList<BufferListener>();
/**
* Construtor da Classe BufferData
*/
public BufferInfo() {
this.HASH_MAP = new ConcurrentHashMap<String,LinkedBlockingQueue<ByteBuffer>>();
}
/**
* Primeiramente é verificado se existe algum registro do remetente indicado por FROM<br>
* se não houver é retornado False, caso exista é verificado se a fila de FROM não esta vazia<br>
*
* @param FROM int - ID do remetente que deseja-se saber se existe dadoos disponiveis
* @param TYPE_DATA int - tipo de dado a ser verificado
*
* @return Boolean - Status se existe data disponivel de um remetente
*/
@SuppressWarnings({"SleepWhileHoldingLock", "CallToThreadDumpStack"})
public boolean IsExistData(int FROM,int TYPE_DATA){
String KEY;
KEY = FROM + ":" + TYPE_DATA;
boolean BOOL = false;
if(this.HASH_MAP.containsKey(KEY)){
if(this.HASH_MAP.get(KEY).isEmpty() != true){
BOOL = true;
}
}
return BOOL;
}
/**
* Primeiramente é verificado se já existe FROM na listagem<br>
* se já existir é atualizado a fila de dados de FROM<br>
* caso não haja é criado um regsitro de FROM com o dados
*
* @param FROM int - ID do rementente que deseja-se incluir os dados
* @param TYPE_DATA int - tipo de dados a ser inserido
* @param DATA ByteBuffer - Buffer aonde estara os dados a serem inseridos para FROM
*
*/
@SuppressWarnings({"SleepWhileHoldingLock", "CallToThreadDumpStack"})
public void InsertData(int FROM,int TYPE_DATA,ByteBuffer DATA){
String KEY;
LinkedBlockingQueue<ByteBuffer> TEMP;
KEY = FROM + ":" + TYPE_DATA;
if(this.HASH_MAP.containsKey(KEY)){
TEMP = this.HASH_MAP.get(KEY);
TEMP.add(DATA);
this.HASH_MAP.put(KEY, TEMP);
}else{
TEMP = new LinkedBlockingQueue<ByteBuffer>();
TEMP.add(DATA);
this.HASH_MAP.put(KEY, TEMP);
}
}
/**
* Recupera a primeira informação disponivel em fila<br>
* vindo de FROM sendo do tipo indicado por TYPE_DATA
*
* @param FROM int - ID do remetente para obter os dados
* @param TYPE_DATA int - tipo de dado a ser recuperado
*
* @return ByteBuffer - informação a ser recuperada
*/
@SuppressWarnings({"CallToThreadDumpStack", "SleepWhileHoldingLock"})
public ByteBuffer GetData(int FROM,int TYPE_DATA){
String KEY;
ByteBuffer TMP = null;
LinkedBlockingQueue<ByteBuffer> TEMP;
KEY = FROM + ":" + TYPE_DATA;
if(this.HASH_MAP.containsKey(KEY)){
// PEGA A FILA
TEMP = this.HASH_MAP.get(KEY);
// PEGA O PRIMEIRO DO FILA
TMP = TEMP.poll();
if(TEMP.isEmpty()){
this.HASH_MAP.remove(KEY);
}else{
this.HASH_MAP.put(KEY, TEMP);
}
}
if(TMP != null){
DisparaInfoDeleted(KEY);
}
return TMP;
}
/**
* Inseri um ouvinte do Buffer
*
* @param b BufferListener - ouvinte do Buffer
*/
public synchronized void addBufferListener(BufferListener b){
if(!this.bufferListener.contains(b)){
this.bufferListener.add(b);
}
}
/**
* Remove um ouvinte do Buffer
*
* @param b BufferListener - ouvinte do Buffer
*/
public synchronized void removeBufferListener(BufferListener b){
this.bufferListener.remove(b);
}
/**
* Alerta os ouvintes do Buffer que uma chave indicada<br>
* por key foi inserida no Buffer
*
* @param key String - chave que foi inserida
*/
public void DisparaInfoInserted(String key){
Collection<BufferListener> t1;
synchronized(this){
ArrayList<BufferListener> list_temp = (ArrayList<BufferListener>) this.bufferListener;
t1 = (Collection<BufferListener>) list_temp.clone();
}
BufferEvent evento = new BufferEvent(this);
for(BufferListener bl : t1){
bl.BufferInfoReceived(evento, key);
}
}
/**
* Alerta os ouvintes do Buffer que uma chave indicada<br>
* por key foi deletada do Buffer
*
* @param key String - chave que foi deletada
*/
public void DisparaInfoDeleted(String key){
Collection<BufferListener> t1;
synchronized(this){
ArrayList<BufferListener> list_temp = (ArrayList<BufferListener>) this.bufferListener;
t1 = (Collection<BufferListener>) list_temp.clone();
}
BufferEvent evento = new BufferEvent(this);
for(BufferListener bl : t1){
bl.BufferInfoDeleted(evento, key);
}
}
}