package se.unlogic.eagledns;

import org.apache.log4j.Logger;
import org.xbill.DNS.Message;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;


public class UDPConnection implements Runnable {

   private static final Logger log = Logger.getLogger(UDPConnection.class);

   private final EagleDNS eagleDNS;
   private final DatagramSocket socket;
   private final DatagramPacket inDataPacket;

   public UDPConnection(EagleDNS eagleDNS, DatagramSocket socket, DatagramPacket inDataPacket) {
      super();
      this.eagleDNS = eagleDNS;
      this.socket = socket;
      this.inDataPacket = inDataPacket;
   }

   public void run() {

      try{

         byte[] response = null;

         try {
            Message query = new Message(inDataPacket.getData());

            log.debug("UDP query " + EagleDNS.toString(query.getQuestion()) + " from " + inDataPacket.getSocketAddress());

            response = this.eagleDNS.generateReply(query, inDataPacket.getData(), inDataPacket.getLength(), null);

            if (response == null) {
               return;
            }
         } catch (IOException e) {
            response = this.eagleDNS.formerrMessage(inDataPacket.getData());
         }

         DatagramPacket outdp = new DatagramPacket(response, response.length, inDataPacket.getAddress(), inDataPacket.getPort());

         outdp.setData(response);
         outdp.setLength(response.length);
         outdp.setAddress(inDataPacket.getAddress());
         outdp.setPort(inDataPacket.getPort());

         try {
            socket.send(outdp);

         } catch (IOException e) {

            log.debug("Error sending UDP response to " + inDataPacket.getAddress() + ", " + e);
         }

      }catch(Throwable e){

         log.warn("Error processing UDP connection from " + inDataPacket.getSocketAddress() + ", " + e);
      }
   }
}
