/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package TCM_MPI.CheckClasses;
import TCM_MPI.Buffer.BufferInfo;
import TCM_MPI.Buffer.Events.BufferEvent;
import TCM_MPI.Buffer.Events.FragmentBufferListener;
import TCM_MPI.Buffer.FragmentBuffer;
import TCM_MPI.Buffer.FragmentFileBuffer;
import TCM_MPI.CLS.CONST;
import TCM_MPI.Interfaces.InterfaceItemReceived;
import TCM_MPI.Sockets.Interfaces.ISocketTcm;
import TCM_MPI.Sockets.SocketJvm;
import java.io.PrintStream;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.atomic.AtomicBoolean;
/**
*
* @author beecluster
*/
public class CheckData_JvmTcp implements Runnable,FragmentBufferListener,ILogger,IStopable{
private ISocketTcm _SOCKET;
private PrintStream _SAIDA_TEXTO;
private BufferInfo BUFFER;
private FragmentBuffer FRAG_DATA;
private FragmentFileBuffer FRAG_FILE;
private ExecutorService THREAD_POOL;
private AtomicBoolean BOOL = new AtomicBoolean(true);
@SuppressWarnings("LeakingThisInConstructor")
public CheckData_JvmTcp(Socket JVM_SKT,BufferInfo N_BUFFER,ExecutorService POOL) throws Exception{
this._SOCKET = new SocketJvm(JVM_SKT);
this.THREAD_POOL = POOL;
this.BUFFER = N_BUFFER;
this.FRAG_FILE = new FragmentFileBuffer();
this.FRAG_DATA = new FragmentBuffer(this.BUFFER);
this.FRAG_DATA.addFragmentBufferListener(this);
}
@SuppressWarnings("LeakingThisInConstructor")
public CheckData_JvmTcp(ISocketTcm JVM_SKT,BufferInfo N_BUFFER,ExecutorService POOL) throws Exception{
this._SOCKET = JVM_SKT;
this.THREAD_POOL = POOL;
this.BUFFER = N_BUFFER;
this.FRAG_DATA = new FragmentBuffer(this.BUFFER);
this.FRAG_DATA.addFragmentBufferListener(this);
this._SAIDA_TEXTO = System.out;
}
void CHECK_DATA() throws Exception{
if(this._SOCKET.PollDataAvaliable()){
byte[] BYTE_RECV = this._SOCKET.ReceiveBytesN(CONST.BYTES_PER_PACKAGE + CONST.HEADER_SIZE);
if(BYTE_RECV.length == 0){
return;
}
InterfaceItemReceived ITEM = new ItemReceived();
ITEM.setFragBuffer(this.FRAG_DATA);
ITEM.setData(BYTE_RECV);
ProcessReceiveData proc_d = new ProcessReceiveData(ITEM);
this.THREAD_POOL.submit(proc_d);
}
}
@Override
@SuppressWarnings("SleepWhileInLoop")
public void run() {
while( this.BOOL.get() ){
try {
this.CHECK_DATA();
Thread.sleep(CONST.SLEEP_CHECK_TIME);
} catch (Exception ex) {
System.err.println(ex.getMessage());
}
}
}
@Override
public void FragmentCreated(BufferEvent e, String key) {
if(this._SAIDA_TEXTO != null){
this._SAIDA_TEXTO.println("FragmentBufferData >> fragmento criado { " + key + " }");
}
}
@Override
public void FragmentUpdate(BufferEvent e, String key) {
if(this._SAIDA_TEXTO != null){
this._SAIDA_TEXTO.println("FragmentBufferData >> fragmento modificado { " + key + " }");
}
}
@Override
public void FragmentComplete(BufferEvent e, String key) {
if(this._SAIDA_TEXTO != null){
this._SAIDA_TEXTO.println("FragmentBufferData >> fragmento completo { " + key + " }");
}
}
@Override
public void EnableLogExit() {
this._SAIDA_TEXTO = System.out;
}
@Override
public void DisableLogExit() {
this._SAIDA_TEXTO = null;
}
@Override
public void SendStopCommand() {
this.BOOL.set(false);
}
@Override
public boolean IsStoped() {
return (this.BOOL.get() == false);
}
}