package tr.gov.ulakbim.jDenetX.streams.net; import weka.core.AbstractInstance; import weka.core.Instances; import weka.core.converters.ArffLoader.ArffReader; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.net.InetAddress; import java.net.SocketException; import java.util.logging.Level; import java.util.logging.Logger; /** * * @author caglar */ public class UDPStreamReader implements Runnable { private int PortNo; private int PacketSize; private UDPInstanceQueue m_UDPInstQueue; private UDPStreamReceiver m_UDPStreamReceiver; private String m_arffHeader; private Instances Structure; private int m_Timeout; private boolean m_LoopStarted; private Thread t; private boolean m_isClassMissing; private boolean m_Suspendend; public UDPStreamReader (int portNo, int packetSize, int timeout, String arffHeader, boolean isClassMissing) { PortNo = portNo; PacketSize = packetSize; m_UDPStreamReceiver = new UDPStreamReceiver(portNo, packetSize); m_arffHeader = arffHeader; m_UDPInstQueue = new UDPInstanceQueue(); m_Timeout = timeout; m_LoopStarted = false; m_isClassMissing = isClassMissing; m_Suspendend = false; parseStructure(); m_UDPInstQueue.setStructure(Structure); m_UDPInstQueue.setIsClassMissing(isClassMissing); t = new Thread(this); t.start(); } public UDPStreamReader (int portNo, int packetSize, int timeout, String arffHeader) { PortNo = portNo; PacketSize = packetSize; m_UDPStreamReceiver = new UDPStreamReceiver(portNo, packetSize); m_arffHeader = arffHeader; m_UDPInstQueue = new UDPInstanceQueue(); m_Timeout = timeout; m_LoopStarted = false; m_isClassMissing = true; parseStructure(); m_UDPInstQueue.setStructure(Structure); m_UDPInstQueue.setIsClassMissing(m_isClassMissing); t = new Thread(this); t.start(); } public UDPStreamReader (int portNo, int timeout, String arffHeader) { PortNo = portNo; PacketSize = 1024; m_UDPStreamReceiver = new UDPStreamReceiver(portNo, PacketSize); m_arffHeader = arffHeader; m_UDPInstQueue = new UDPInstanceQueue(); m_Timeout = timeout; m_LoopStarted = false; m_isClassMissing = true; parseStructure(); m_UDPInstQueue.setStructure(Structure); m_UDPInstQueue.setIsClassMissing(m_isClassMissing); t = new Thread(this); t.start(); } public UDPStreamReader (int timeout, String arffHeader) { PortNo = 9999; PacketSize = 1024; m_UDPStreamReceiver = new UDPStreamReceiver(PortNo, PacketSize); m_arffHeader = arffHeader; m_UDPInstQueue = new UDPInstanceQueue(); m_Timeout = timeout; m_LoopStarted = false; m_isClassMissing = true; parseStructure(); m_UDPInstQueue.setStructure(Structure); m_UDPInstQueue.setIsClassMissing(m_isClassMissing); t = new Thread(this); t.start(); } private void parseStructure() { try { BufferedReader bReader = new BufferedReader(new FileReader(m_arffHeader)); ArffReader arffReader = new ArffReader(bReader); Structure = arffReader.getStructure(); if (!m_isClassMissing) Structure.setClassIndex(Structure.numAttributes() - 1); } catch (IOException IOEx) { Logger.getLogger(UDPStreamReader.class.getName()).log(Level.SEVERE, null, IOEx); } } public int getPacketSize() { return PacketSize; } public void setPacketSize (int PacketSize) { this.PacketSize = PacketSize; } public int getPortNo() { return PortNo; } public void setPortNo (int PortNo) { this.PortNo = PortNo; } protected UDPInstanceQueue getUDPInstQueue() { return m_UDPInstQueue; } protected void setUDPInstQueue (UDPInstanceQueue UDPInstQueue) { this.m_UDPInstQueue = UDPInstQueue; } public void setArffHeader (String m_arffHeader) { this.m_arffHeader = m_arffHeader; } public void putHostConstraint (InetAddress remoteAddr) { m_UDPStreamReceiver.putHostConstraint(remoteAddr); } public AbstractInstance getInstanceFromQueue() { return (AbstractInstance) m_UDPInstQueue.peek(); } public void setIsClassMissing (boolean isClassMissing) { this.m_isClassMissing = isClassMissing; m_UDPInstQueue.setIsClassMissing(isClassMissing); parseStructure(); } public void startUDPLoop () throws Exception { m_LoopStarted = true; try { m_UDPStreamReceiver.openSocket(m_Timeout); } catch (SocketException ex) { Logger.getLogger(UDPStreamReader.class.getName()).log(Level.SEVERE, null, ex); } for(;;){ //if (m_UDPStreamReceiver.isSockBound()) { String message = null; try { message = m_UDPStreamReceiver.getPacketData(); // System.out.println(message); } catch (SocketException ex) { Logger.getLogger(UDPStreamReader.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(UDPStreamReader.class.getName()).log(Level.SEVERE, null, ex); } finally { if (message == null) { System.out.println("Queue size" + m_UDPInstQueue.size()); } if (message.equals("END")) { // To end the socket connection m_UDPStreamReceiver.closeSocket(); } } if (message != null && message.length() > 0) { if(!m_UDPInstQueue.addLine(message)) { throw new Exception("Couldn't add the row to the queue\n"); } } } } } @Override public void run() { try { if (!m_LoopStarted) { startUDPLoop(); } else { System.err.println("Loop has already started,"); } } catch (Exception ex) { Logger.getLogger(UDPStreamReader.class.getName()).log(Level.SEVERE, null, ex); } } }