I2P Address: [http://git.idk.i2p]

Skip to content
Snippets Groups Projects
Commit e9cf4c21 authored by zzz's avatar zzz
Browse files

NamingService: Add new API methods for multiple Destinations per hostname

Improve javadocs
parent 25bce103
No related branches found
No related tags found
No related merge requests found
...@@ -64,6 +64,8 @@ public abstract class NamingService { ...@@ -64,6 +64,8 @@ public abstract class NamingService {
/** /**
* Reverse lookup a destination * Reverse lookup a destination
* This implementation returns reverseLookup(dest, null).
*
* @param dest non-null * @param dest non-null
* @return a host name for this Destination, or <code>null</code> * @return a host name for this Destination, or <code>null</code>
* if none is known. It is safe for subclasses to always return * if none is known. It is safe for subclasses to always return
...@@ -74,7 +76,10 @@ public abstract class NamingService { ...@@ -74,7 +76,10 @@ public abstract class NamingService {
} }
/** /**
* Reverse lookup a hash * Reverse lookup a hash.
* This implementation returns null.
* Subclasses implementing reverse lookups should override.
*
* @param h non-null * @param h non-null
* @return a host name for this hash, or <code>null</code> * @return a host name for this hash, or <code>null</code>
* if none is known. It is safe for subclasses to always return * if none is known. It is safe for subclasses to always return
...@@ -83,8 +88,8 @@ public abstract class NamingService { ...@@ -83,8 +88,8 @@ public abstract class NamingService {
public String reverseLookup(Hash h) { return null; } public String reverseLookup(Hash h) { return null; }
/** /**
* Check if host name is valid Base64 encoded dest and return this * If the host name is a valid Base64 encoded destination, return the
* dest in that case. Useful as a "fallback" in custom naming * decoded Destination. Useful as a "fallback" in custom naming
* implementations. * implementations.
* This is misnamed as it isn't a "lookup" at all, but * This is misnamed as it isn't a "lookup" at all, but
* a simple conversion from a Base64 string to a Destination. * a simple conversion from a Base64 string to a Destination.
...@@ -120,6 +125,7 @@ public abstract class NamingService { ...@@ -120,6 +125,7 @@ public abstract class NamingService {
/** /**
* Warning - unimplemented in any subclass. * Warning - unimplemented in any subclass.
* Returns null always.
* *
* @return NamingService-specific options or null * @return NamingService-specific options or null
* @since 0.8.7 * @since 0.8.7
...@@ -130,6 +136,7 @@ public abstract class NamingService { ...@@ -130,6 +136,7 @@ public abstract class NamingService {
/** /**
* Warning - unimplemented in any subclass. * Warning - unimplemented in any subclass.
* Returns true always.
* *
* @return success * @return success
* @since 0.8.7 * @since 0.8.7
...@@ -141,6 +148,9 @@ public abstract class NamingService { ...@@ -141,6 +148,9 @@ public abstract class NamingService {
// These are for daisy chaining (MetaNamingService) // These are for daisy chaining (MetaNamingService)
/** /**
* This implementation returns null.
* Subclasses implementing chaining should override.
*
* @return chained naming services or null * @return chained naming services or null
* @since 0.8.7 * @since 0.8.7
*/ */
...@@ -149,6 +159,9 @@ public abstract class NamingService { ...@@ -149,6 +159,9 @@ public abstract class NamingService {
} }
/** /**
* This implementation returns null.
* Subclasses implementing chaining should override.
*
* @return parent naming service or null if this is the root * @return parent naming service or null if this is the root
* @since 0.8.7 * @since 0.8.7
*/ */
...@@ -167,7 +180,10 @@ public abstract class NamingService { ...@@ -167,7 +180,10 @@ public abstract class NamingService {
/** /**
* Only for chaining-capable NamingServices * Only for chaining-capable NamingServices.
* This implementation returns false.
* Subclasses implementing chaining should override.
*
* @param head or tail * @param head or tail
* @return success * @return success
* @since 0.8.7 * @since 0.8.7
...@@ -177,7 +193,10 @@ public abstract class NamingService { ...@@ -177,7 +193,10 @@ public abstract class NamingService {
} }
/** /**
* Only for chaining-capable NamingServices * Only for chaining-capable NamingServices.
* This implementation returns false.
* Subclasses implementing chaining should override.
*
* @return success * @return success
* @since 0.8.7 * @since 0.8.7
*/ */
...@@ -198,6 +217,9 @@ public abstract class NamingService { ...@@ -198,6 +217,9 @@ public abstract class NamingService {
} }
/** /**
* This implementation returns -1.
* Most subclasses should override.
*
* @param options NamingService-specific, can be null * @param options NamingService-specific, can be null
* @return number of entries (matching the options if non-null) or -1 if unknown * @return number of entries (matching the options if non-null) or -1 if unknown
* @since 0.8.7 * @since 0.8.7
...@@ -340,6 +362,10 @@ public abstract class NamingService { ...@@ -340,6 +362,10 @@ public abstract class NamingService {
} }
/** /**
* Add a hostname and Destination to the addressbook.
* Overwrites old entry if it exists.
* See also putIfAbsent() and update().
*
* @return success * @return success
* @since 0.8.7 * @since 0.8.7
*/ */
...@@ -348,6 +374,10 @@ public abstract class NamingService { ...@@ -348,6 +374,10 @@ public abstract class NamingService {
} }
/** /**
* Add a hostname and Destination to the addressbook.
* Overwrites old entry if it exists.
* See also putIfAbsent() and update().
*
* @param options NamingService-specific, can be null * @param options NamingService-specific, can be null
* @return success * @return success
* @since 0.8.7 * @since 0.8.7
...@@ -357,7 +387,10 @@ public abstract class NamingService { ...@@ -357,7 +387,10 @@ public abstract class NamingService {
} }
/** /**
* Fails if entry previously exists * Add a hostname and Destination to the addressbook.
* Fails if entry previously exists.
* See also put() and update().
*
* @return success * @return success
* @since 0.8.7 * @since 0.8.7
*/ */
...@@ -366,7 +399,10 @@ public abstract class NamingService { ...@@ -366,7 +399,10 @@ public abstract class NamingService {
} }
/** /**
* Fails if entry previously exists * Add a hostname and Destination to the addressbook.
* Fails if entry previously exists.
* See also put() and update().
*
* @param options NamingService-specific, can be null * @param options NamingService-specific, can be null
* @return success * @return success
* @since 0.8.7 * @since 0.8.7
...@@ -376,8 +412,12 @@ public abstract class NamingService { ...@@ -376,8 +412,12 @@ public abstract class NamingService {
} }
/** /**
* Put all the entries, each with the given options.
* This implementation calls put() for each entry.
* Subclasses may override if a more efficient implementation is available.
*
* @param options NamingService-specific, can be null * @param options NamingService-specific, can be null
* @return success * @return total success, or false if any put failed
* @since 0.8.7 * @since 0.8.7
*/ */
public boolean putAll(Map<String, Destination> entries, Properties options) { public boolean putAll(Map<String, Destination> entries, Properties options) {
...@@ -392,6 +432,7 @@ public abstract class NamingService { ...@@ -392,6 +432,7 @@ public abstract class NamingService {
/** /**
* Fails if entry did not previously exist. * Fails if entry did not previously exist.
* Warning - unimplemented in any subclass. * Warning - unimplemented in any subclass.
* This implementation returns false.
* *
* @param d may be null if only options are changing * @param d may be null if only options are changing
* @param options NamingService-specific, can be null * @param options NamingService-specific, can be null
...@@ -403,16 +444,18 @@ public abstract class NamingService { ...@@ -403,16 +444,18 @@ public abstract class NamingService {
} }
/** /**
* @return success * Delete the entry.
* @return true if removed successfully, false on error or if it did not exist
* @since 0.8.7 * @since 0.8.7
*/ */
public boolean remove(String hostname) { public boolean remove(String hostname) {
return remove(hostname, null); return remove(hostname, (Properties) null);
} }
/** /**
* Delete the entry.
* @param options NamingService-specific, can be null * @param options NamingService-specific, can be null
* @return success * @return true if removed successfully, false on error or if it did not exist
* @since 0.8.7 * @since 0.8.7
*/ */
public boolean remove(String hostname, Properties options) { public boolean remove(String hostname, Properties options) {
...@@ -460,8 +503,9 @@ public abstract class NamingService { ...@@ -460,8 +503,9 @@ public abstract class NamingService {
/** /**
* Same as lookup(hostname) but with in and out options * Same as lookup(hostname) but with in and out options
* Note that whether this (and lookup(hostname)) resolve B32 addresses is * Note that whether this (and lookup(hostname)) resolve Base 32 addresses
* NamingService-specific. * in the form {52 chars}.b32.i2p is NamingService-specific.
*
* @param lookupOptions input parameter, NamingService-specific, can be null * @param lookupOptions input parameter, NamingService-specific, can be null
* @param storedOptions output parameter, NamingService-specific, any stored properties will be added if non-null * @param storedOptions output parameter, NamingService-specific, any stored properties will be added if non-null
* @return dest or null * @return dest or null
...@@ -471,6 +515,9 @@ public abstract class NamingService { ...@@ -471,6 +515,9 @@ public abstract class NamingService {
/** /**
* Same as reverseLookup(dest) but with options * Same as reverseLookup(dest) but with options
* This implementation returns null.
* Subclasses implementing reverse lookups should override.
*
* @param d non-null * @param d non-null
* @param options NamingService-specific, can be null * @param options NamingService-specific, can be null
* @return host name or null * @return host name or null
...@@ -483,6 +530,9 @@ public abstract class NamingService { ...@@ -483,6 +530,9 @@ public abstract class NamingService {
/** /**
* Lookup a Base 32 address. This may require the router to fetch the LeaseSet, * Lookup a Base 32 address. This may require the router to fetch the LeaseSet,
* which may take quite a while. * which may take quite a while.
* This implementation returns null.
* See also lookup(Hash, int).
*
* @param hostname must be {52 chars}.b32.i2p * @param hostname must be {52 chars}.b32.i2p
* @param timeout in seconds; <= 0 means use router default * @param timeout in seconds; <= 0 means use router default
* @return dest or null * @return dest or null
...@@ -493,7 +543,9 @@ public abstract class NamingService { ...@@ -493,7 +543,9 @@ public abstract class NamingService {
} }
/** /**
* Same as lookupB32 but with the SHA256 Hash precalculated * Same as lookupBase32() but with the SHA256 Hash precalculated
* This implementation returns null.
*
* @param timeout in seconds; <= 0 means use router default * @param timeout in seconds; <= 0 means use router default
* @return dest or null * @return dest or null
* @since 0.8.7 * @since 0.8.7
...@@ -520,6 +572,127 @@ public abstract class NamingService { ...@@ -520,6 +572,127 @@ public abstract class NamingService {
//// End New API //// End New API
//// Begin new API for multiple Destinations
/**
* For NamingServices that support multiple Destinations for a single host name,
* return all of them.
*
* It is recommended that the returned list is in order of priority, highest-first,
* but this is NamingService-specific.
*
* Not recommended for resolving Base 32 addresses;
* whether this does resolve Base 32 addresses
* in the form {52 chars}.b32.i2p is NamingService-specific.
*
* @return non-empty List of Destinations, or null if nothing found
* @since 0.9.26
*/
public List<Destination> lookupAll(String hostname) {
return lookupAll(hostname, null, null);
}
/**
* For NamingServices that support multiple Destinations and Properties for a single host name,
* return all of them.
*
* It is recommended that the returned list is in order of priority, highest-first,
* but this is NamingService-specific.
*
* If storedOptions is non-null, it must be a List that supports null entries.
* If the returned value (the List of Destinations) is non-null,
* the same number of Properties objects will be added to storedOptions.
* If no properties were found for a given Destination, the corresponding
* entry in the storedOptions list will be null.
*
* Not recommended for resolving Base 32 addresses;
* whether this does resolve Base 32 addresses
* in the form {52 chars}.b32.i2p is NamingService-specific.
*
* This implementation simply calls lookup().
* Subclasses implementing multiple destinations per hostname should override.
*
* @param lookupOptions input parameter, NamingService-specific, may be null
* @param storedOptions output parameter, NamingService-specific, any stored properties will be added if non-null
* @return non-empty List of Destinations, or null if nothing found
* @since 0.9.26
*/
public List<Destination> lookupAll(String hostname, Properties lookupOptions, List<Properties> storedOptions) {
Properties props = storedOptions != null ? new Properties() : null;
Destination d = lookup(hostname, lookupOptions, props);
List<Destination> rv;
if (d != null) {
rv = Collections.singletonList(d);
if (storedOptions != null)
storedOptions.add(props.isEmpty() ? null : props);
} else {
rv = null;
}
return rv;
}
/**
* Add a Destination to an existing hostname's entry in the addressbook.
*
* @return success
* @since 0.9.26
*/
public boolean addDestination(String hostname, Destination d) {
return addDestination(hostname, d, null);
}
/**
* Add a Destination to an existing hostname's entry in the addressbook.
* This implementation simply calls putIfAbsent().
* Subclasses implementing multiple destinations per hostname should override.
*
* @param options NamingService-specific, may be null
* @return success
* @since 0.9.26
*/
public boolean addDestination(String hostname, Destination d, Properties options) {
return putIfAbsent(hostname, d, options);
}
/**
* Remove a hostname's entry only if it contains the Destination d.
* If the NamingService supports multiple Destinations per hostname,
* and this is the only Destination, removes the entire entry.
* If aditional Destinations remain, it only removes the
* specified Destination from the entry.
*
* @return true if entry containing d was successfully removed.
* @since 0.9.26
*/
public boolean remove(String hostname, Destination d) {
return remove(hostname, d, null);
}
/**
* Remove a hostname's entry only if it contains the Destination d.
* If the NamingService supports multiple Destinations per hostname,
* and this is the only Destination, removes the entire entry.
* If aditional Destinations remain, it only removes the
* specified Destination from the entry.
*
* This implementation simply calls lookup() and remove().
* Subclasses implementing multiple destinations per hostname,
* or with more efficient implementations, should override.
* Fails if entry previously exists.
*
* @param options NamingService-specific, may be null
* @return true if entry containing d was successfully removed.
* @since 0.9.26
*/
public boolean remove(String hostname, Destination d, Properties options) {
Destination old = lookup(hostname, options, null);
if (!d.equals(old))
return false;
return remove(hostname, options);
}
//// End new API for multiple Destinations
/** /**
* WARNING - for use by I2PAppContext only - others must use * WARNING - for use by I2PAppContext only - others must use
* I2PAppContext.namingService() * I2PAppContext.namingService()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment