package net.i2p.router;
/*
* free (adj.): unencumbered; not under the control of others
* Written by jrandom in 2003 and released into the public domain
* with no warranty of any kind, either expressed or implied.
* It probably won't make your computer catch on fire, or eat
* your children, but it might. Use at your own risk.
*
*/
import net.i2p.util.Log;
/**
* Maintain a pool of OutNetMessages destined for other routers, organized by
* priority, expiring messages as necessary. This pool is populated by anything
* that wants to send a message, and the communication subsystem periodically
* retrieves messages for delivery.
*
* Actually, this doesn't 'pool' anything, it calls the comm system directly.
* Nor does it organize by priority. But perhaps it could someday.
*/
public class OutNetMessagePool {
private final Log _log;
private final RouterContext _context;
public OutNetMessagePool(RouterContext context) {
_context = context;
_log = _context.logManager().getLog(OutNetMessagePool.class);
}
/**
* Add a new message to the pool
*
*/
public void add(OutNetMessage msg) {
boolean valid = validate(msg);
if (!valid) {
_context.messageRegistry().unregisterPending(msg);
return;
}
if (_log.shouldLog(Log.DEBUG))
_log.debug("Adding " + msg);
MessageSelector selector = msg.getReplySelector();
if (selector != null) {
_context.messageRegistry().registerPending(msg);
}
_context.commSystem().processMessage(msg);
return;
}
private boolean validate(OutNetMessage msg) {
if (msg == null) return false;
if (msg.getMessage() == null) {
if (_log.shouldLog(Log.WARN))
_log.warn("Null message in the OutNetMessage - expired too soon");
return false;
}
if (msg.getTarget() == null) {
_log.error("No target in the OutNetMessage: " + msg, new Exception());
return false;
}
if (msg.getPriority() < 0) {
_log.error("Priority less than 0? sounds like nonsense to me... " + msg, new Exception());
return false;
}
if (msg.getExpiration() <= _context.clock().now()) {
if (_log.shouldLog(Log.WARN))
_log.warn("Dropping expired outbound msg: " + msg, new Exception());
return false;
}
return true;
}
}