package org.infosec.ismp.manager.direct;
import java.net.InetAddress;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import org.infosec.ismp.model.event.Event;
import org.opennms.protocols.rt.Request;
public class DirectRequest implements Request<DirectRequestId, DirectRequest, DirectReply>{
private DirectRequestId m_id;
private InetAddress m_address;
private int m_port;
private Event m_event;
private DirectResponseCallback m_callback;
/**
* how long to wait for a response
*/
private final long m_timeout;
/**
* The expiration time of this request
*/
private long m_expiration = -1L;
private final AtomicBoolean m_processed = new AtomicBoolean(false);
public DirectRequest(InetAddress address, int port, Event event,
long timeout,DirectResponseCallback call) {
m_id = new DirectRequestId(event.getUuid());
m_address = address;
m_port = port;
m_event = event;
m_timeout = timeout;
m_callback=call;
}
public long getExpiration() {
return m_expiration;
}
@Override
public int compareTo(Delayed request) {
long myDelay = getDelay(TimeUnit.MILLISECONDS);
long otherDelay = request.getDelay(TimeUnit.MILLISECONDS);
if (myDelay < otherDelay)
return -1;
if (myDelay == otherDelay)
return 0;
return 1;
}
@Override
public long getDelay(TimeUnit unit) {
return unit.convert(getExpiration() - System.currentTimeMillis(),
TimeUnit.MILLISECONDS);
}
@Override
public DirectRequestId getId() {
return m_id;
}
@Override
public boolean isProcessed() {
return m_processed.get();
}
private void setProcessed(boolean processed) {
m_processed.set(processed);
}
@Override
public void processError(Throwable t) {
try {
m_callback.handleError(m_address,m_port,getEvent(), t);
} finally {
setProcessed(true);
}
}
@Override
public boolean processResponse(DirectReply reply) {
try {
m_callback.handleResponse(m_address,m_port,reply.getReply(),
reply.getUuid());
} finally {
setProcessed(true);
}
return true;
}
@Override
public DirectRequest processTimeout() {
try {
DirectRequest returnval = null;
if (this.isExpired()) {
m_callback.handleTimeout(m_address,m_port,getEvent());
}
return returnval;
} finally {
setProcessed(true);
}
}
public boolean isExpired() {
return (System.currentTimeMillis() >= getExpiration());
}
public void sendCommand(JMSSocket socket) {
try {
m_expiration = System.currentTimeMillis() + m_timeout;
socket.sendEvent(m_event, m_address, m_port);
} catch (Throwable t) {
m_callback.handleError(m_address,m_port,m_event, t);
}
}
public InetAddress getAddress() {
return m_address;
}
public void setAddress(InetAddress address) {
m_address = address;
}
public int getPort() {
return m_port;
}
public void setPort(int port) {
m_port = port;
}
public Event getEvent() {
return m_event;
}
public void setEvent(Event event) {
m_event = event;
}
}