package org.infosec.ismp.eventd.sender; 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 EventRequest implements Request<EventRequestId, EventRequest, EventReply> { private EventRequestId m_id; private InetAddress m_address; private int m_port; private Event m_event; private EventResponseCallback 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 EventRequest(InetAddress address, int port, Event event, long timeout,EventResponseCallback call) { m_id = new EventRequestId(address, 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 EventRequestId 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(getAddress(), getPort(),getEvent(), t); } finally { setProcessed(true); } } @Override public boolean processResponse(EventReply reply) { try { m_callback.handleResponse(reply.getAddr(), reply.getPort(), reply.getUuid()); } finally { setProcessed(true); } return true; } @Override public EventRequest processTimeout() { try { EventRequest returnval = null; if (this.isExpired()) { m_callback.handleTimeout(getAddress(), getPort(), getEvent()); } return returnval; } finally { setProcessed(true); } } public boolean isExpired() { return (System.currentTimeMillis() >= getExpiration()); } public void sendCommand(UdpEventSocket 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; } }