package org.infosec.ismp.eventd.sender;
import java.io.IOException;
import java.util.List;
import java.util.Queue;
import org.apache.log4j.Logger;
import org.infosec.ismp.ping.PingRequest;
import org.opennms.protocols.rt.Messenger;
public class EventMessager implements
Messenger<EventRequest, EventReply> {
private UdpEventSocket m_eventSocket;
public EventMessager() throws IOException {
m_eventSocket = new UdpEventSocket();
}
public UdpEventSocket getEventSocket() {
return m_eventSocket;
}
@Override
public void sendRequest(EventRequest command) throws Exception {
command.sendCommand(getEventSocket());
}
@Override
public void start(final Queue<EventReply> replyQueue) {
Thread socketReader = new Thread("Agent-Command-Reply-Reader") {
public void run() {
try {
processPackets(replyQueue);
} catch (Throwable t) {
errorf(t, "Unexpected exception on Thread %s!", this);
}
}
};
socketReader.start();
}
void processPackets(Queue<EventReply> pendingReplies) {
while (true) {
try {
List<EventReply> replys = getEventSocket().receive();
for(EventReply reply:replys){
debugf("Found an command reply addr = %s, port = %d, created reply %s",
reply.getAddr().getHostAddress(), reply.getPort(),
reply);
pendingReplies.offer(reply);
}
} catch (IOException e) {
errorf(e, "I/O Error occurred reading from ICMP Socket");
} catch (IllegalArgumentException e) {
// this is not an EchoReply so ignore it
} catch (Throwable t) {
errorf(t, "Unexpect Exception processing reply packet!");
}
}
}
private Logger log() {
return Logger.getLogger(getClass());
}
void debugf(String format, Object... args) {
if (log().isDebugEnabled()) {
log().debug(String.format(format, args));
}
}
private void errorf(String format, Object... args) {
log().error(String.format(format, args));
}
void errorf(Throwable t, String format, Object... args) {
log().error(String.format(format, args), t);
}
}