package org.infosec.ismp.manager.direct;
import java.io.IOException;
import java.util.List;
import java.util.Queue;
import org.apache.log4j.Logger;
import org.opennms.protocols.rt.Messenger;
public class DirectMessenger implements Messenger<DirectRequest, DirectReply> {
private final JMSSocket m_jmsSocket;
public JMSSocket getJmsSocket() {
return m_jmsSocket;
}
public DirectMessenger(JMSSocket jmsSocket) {
this.m_jmsSocket = jmsSocket;
}
@Override
public void sendRequest(DirectRequest request) throws Exception {
System.out.println("before send command");
request.sendCommand(m_jmsSocket);
System.out.println("after send command");
}
@Override
public void start(final Queue<DirectReply> replyQueue) {
Thread socketReader = new Thread("Direct-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<DirectReply> pendingReplies) {
while (true) {
try {
List<DirectReply> replys = getJmsSocket().receive();
if(replys!=null){
for(DirectReply reply:replys){
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);
}
}