package net.i2p.router.tunnel.pool; import java.util.List; import net.i2p.data.Hash; import net.i2p.data.Lease; import net.i2p.data.LeaseSet; import net.i2p.data.TunnelId; import net.i2p.router.RouterContext; import net.i2p.router.TunnelInfo; import net.i2p.router.TunnelPoolSettings; import net.i2p.util.Log; /** * A tunnel pool with its own settings and Destination, * but uses another pool for its tunnels. * * @since 0.9.21 */ public class AliasedTunnelPool extends TunnelPool { private final TunnelPool _aliasOf; AliasedTunnelPool(RouterContext ctx, TunnelPoolManager mgr, TunnelPoolSettings settings, TunnelPool aliasOf) { super(ctx, mgr, settings, null); if (settings.isExploratory()) throw new IllegalArgumentException(); if (settings.getAliasOf() == null) throw new IllegalArgumentException(); _aliasOf = aliasOf; } @Override synchronized void startup() { if (_log.shouldLog(Log.INFO)) _log.info(toString() + ": Startup() called, was already alive? " + _alive, new Exception()); _alive = true; super.refreshLeaseSet(); } @Override synchronized void shutdown() { if (_log.shouldLog(Log.WARN)) _log.warn(toString() + ": Shutdown called"); _alive = false; } @Override TunnelInfo selectTunnel() { return _aliasOf.selectTunnel(); } @Override TunnelInfo selectTunnel(Hash closestTo) { return _aliasOf.selectTunnel(closestTo); } @Override public TunnelInfo getTunnel(TunnelId gatewayId) { return _aliasOf.getTunnel(gatewayId); } @Override public List<TunnelInfo> listTunnels() { return _aliasOf.listTunnels(); } @Override boolean needFallback() { return false; } @Override public List<PooledTunnelCreatorConfig> listPending() { return _aliasOf.listPending(); } @Override public boolean isAlive() { return _alive && _aliasOf.isAlive(); } @Override public int size() { return _aliasOf.size(); } @Override void addTunnel(TunnelInfo info) { _aliasOf.addTunnel(info); } @Override void removeTunnel(TunnelInfo info) { _aliasOf.removeTunnel(info); } @Override void tunnelFailed(TunnelInfo cfg) { _aliasOf.tunnelFailed(cfg); } @Override void tunnelFailed(TunnelInfo cfg, Hash blamePeer) { _aliasOf.tunnelFailed(cfg, blamePeer); } @Override void refreshLeaseSet() {} @Override boolean buildFallback() { return _aliasOf.buildFallback(); } @Override protected LeaseSet locked_buildNewLeaseSet() { LeaseSet ls = _context.netDb().lookupLeaseSetLocally(_aliasOf.getSettings().getDestination()); if (ls == null) return null; // copy everything so it isn't corrupted LeaseSet rv = new LeaseSet(); for (int i = 0; i < ls.getLeaseCount(); i++) { Lease old = ls.getLease(i); Lease lease = new Lease(); lease.setEndDate(old.getEndDate()); lease.setTunnelId(old.getTunnelId()); lease.setGateway(old.getGateway()); rv.addLease(lease); } return rv; } @Override public long getLifetimeProcessed() { return _aliasOf.getLifetimeProcessed(); } @Override int countHowManyToBuild() { return 0; } @Override PooledTunnelCreatorConfig configureNewTunnel() { return null; } @Override void buildComplete(PooledTunnelCreatorConfig cfg) {} @Override public String toString() { return "Aliased " + super.toString(); } }