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 java.io.IOException; import java.io.Writer; import java.util.Collections; import java.util.Set; import net.i2p.data.DatabaseEntry; import net.i2p.data.Destination; import net.i2p.data.Hash; import net.i2p.data.LeaseSet; import net.i2p.data.router.RouterInfo; import net.i2p.router.networkdb.reseed.ReseedChecker; /** * Defines the mechanism for interacting with I2P's network database * */ public abstract class NetworkDatabaseFacade implements Service { /** * Return the RouterInfo structures for the routers closest to the given key. * At most maxNumRouters will be returned * * @param key The key * @param maxNumRouters The maximum number of routers to return * @param peersToIgnore Hash of routers not to include */ public abstract Set<Hash> findNearestRouters(Hash key, int maxNumRouters, Set<Hash> peersToIgnore); /** * @return RouterInfo, LeaseSet, or null * @since 0.8.3 */ public abstract DatabaseEntry lookupLocally(Hash key); public abstract void lookupLeaseSet(Hash key, Job onFindJob, Job onFailedLookupJob, long timeoutMs); /** * Lookup using the client's tunnels * @param fromLocalDest use these tunnels for the lookup, or null for exploratory * @since 0.9.10 */ public abstract void lookupLeaseSet(Hash key, Job onFindJob, Job onFailedLookupJob, long timeoutMs, Hash fromLocalDest); public abstract LeaseSet lookupLeaseSetLocally(Hash key); public abstract void lookupRouterInfo(Hash key, Job onFindJob, Job onFailedLookupJob, long timeoutMs); public abstract RouterInfo lookupRouterInfoLocally(Hash key); /** * Unconditionally lookup using the client's tunnels. * No success or failed jobs, no local lookup, no checks. * Use this to refresh a leaseset before expiration. * * @param fromLocalDest use these tunnels for the lookup, or null for exploratory * @since 0.9.25 */ public abstract void lookupLeaseSetRemotely(Hash key, Hash fromLocalDest); /** * Lookup using the client's tunnels * Succeeds even if LS validation fails due to unsupported sig type * * @param fromLocalDest use these tunnels for the lookup, or null for exploratory * @since 0.9.16 */ public abstract void lookupDestination(Hash key, Job onFinishedJob, long timeoutMs, Hash fromLocalDest); /** * Lookup locally in netDB and in badDest cache * Succeeds even if LS validation failed due to unsupported sig type * * @since 0.9.16 */ public abstract Destination lookupDestinationLocally(Hash key); /** * @return the leaseSet if another leaseSet already existed at that key * * @throws IllegalArgumentException if the data is not valid */ public abstract LeaseSet store(Hash key, LeaseSet leaseSet) throws IllegalArgumentException; /** * @return the routerInfo if another router already existed at that key * * @throws IllegalArgumentException if the data is not valid */ public abstract RouterInfo store(Hash key, RouterInfo routerInfo) throws IllegalArgumentException; /** * @return the old entry if it already existed at that key * @throws IllegalArgumentException if the data is not valid * @since 0.9.16 */ public DatabaseEntry store(Hash key, DatabaseEntry entry) throws IllegalArgumentException { if (entry.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) return store(key, (RouterInfo) entry); if (entry.getType() == DatabaseEntry.KEY_TYPE_LEASESET) return store(key, (LeaseSet) entry); throw new IllegalArgumentException("unknown type"); } /** * @throws IllegalArgumentException if the local router is not valid */ public abstract void publish(RouterInfo localRouterInfo) throws IllegalArgumentException; public abstract void publish(LeaseSet localLeaseSet); public abstract void unpublish(LeaseSet localLeaseSet); public abstract void fail(Hash dbEntry); /** * The last time we successfully published our RI. * @since 0.9.9 */ public long getLastRouterInfoPublishTime() { return 0; } public abstract Set<Hash> getAllRouters(); public int getKnownRouters() { return 0; } public int getKnownLeaseSets() { return 0; } public boolean isInitialized() { return true; } public void rescan() {} /** Debug only - all user info moved to NetDbRenderer in router console */ public void renderStatusHTML(Writer out) throws IOException {} /** public for NetDbRenderer in routerconsole */ public Set<LeaseSet> getLeases() { return Collections.emptySet(); } /** public for NetDbRenderer in routerconsole */ public Set<RouterInfo> getRouters() { return Collections.emptySet(); } /** @since 0.9 */ public ReseedChecker reseedChecker() { return null; }; /** * For convenience, so users don't have to cast to FNDF, and unit tests using * Dummy NDF will work. * * @return false; FNDF overrides to return actual setting * @since IPv6 */ public boolean floodfillEnabled() { return false; }; /** * Is it permanently negative cached? * * @param key only for Destinations; for RouterIdentities, see Banlist * @since 0.9.16 */ public boolean isNegativeCachedForever(Hash key) { return false; } }