mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-11 18:29:05 +01:00
Add javadocs for BDF classes.
This commit is contained in:
@@ -10,6 +10,27 @@ import java.util.TreeMap;
|
|||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import javax.annotation.concurrent.NotThreadSafe;
|
import javax.annotation.concurrent.NotThreadSafe;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A BDF dictionary contains zero or more key-value pairs, where the keys
|
||||||
|
* are strings and the values are BDF objects, which may be primitive types
|
||||||
|
* (null, boolean, integer, float, string, raw) or nested containers (list,
|
||||||
|
* dictionary).
|
||||||
|
* <p>
|
||||||
|
* Note that a BDF integer has the same range as a Java long, while a BDF
|
||||||
|
* float has the same range as a Java double. Method names in this class
|
||||||
|
* correspond to the Java types.
|
||||||
|
* <p>
|
||||||
|
* The getX() methods throw {@link FormatException} if the specified key is
|
||||||
|
* absent, the value is null, or the value does not have the requested type.
|
||||||
|
* <p>
|
||||||
|
* The getOptionalX() methods return null if the specified key is absent or
|
||||||
|
* the value is null, or throw {@link FormatException} if the value does not
|
||||||
|
* have the requested type.
|
||||||
|
* <p>
|
||||||
|
* The getX() methods that take a default value return the default value if
|
||||||
|
* the specified key is absent or the value is null, or throw
|
||||||
|
* {@link FormatException} if the value does not have the requested type.
|
||||||
|
*/
|
||||||
@NotThreadSafe
|
@NotThreadSafe
|
||||||
public final class BdfDictionary extends TreeMap<String, Object> {
|
public final class BdfDictionary extends TreeMap<String, Object> {
|
||||||
|
|
||||||
@@ -80,12 +101,33 @@ public final class BdfDictionary extends TreeMap<String, Object> {
|
|||||||
return value == null ? defaultValue : value;
|
return value == null ? defaultValue : value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the integer with the specified key.
|
||||||
|
* <p>
|
||||||
|
* This method should be used in preference to
|
||||||
|
* <code>getLong(key).intValue()</code> as it checks for
|
||||||
|
* overflow/underflow.
|
||||||
|
*
|
||||||
|
* @throws FormatException if there is no value at the specified key,
|
||||||
|
* or if the value is null or cannot be represented as a Java int.
|
||||||
|
*/
|
||||||
public Integer getInt(String key) throws FormatException {
|
public Integer getInt(String key) throws FormatException {
|
||||||
Integer value = getOptionalInt(key);
|
Integer value = getOptionalInt(key);
|
||||||
if (value == null) throw new FormatException();
|
if (value == null) throw new FormatException();
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the integer with the specified key, or null if the key is
|
||||||
|
* absent or the value is null.
|
||||||
|
* <p>
|
||||||
|
* This method should be used in preference to
|
||||||
|
* <code>getOptionalLong(key).intValue()</code> as it checks for
|
||||||
|
* overflow/underflow.
|
||||||
|
*
|
||||||
|
* @throws FormatException if the value at the specified key is not null
|
||||||
|
* and cannot be represented as a Java int.
|
||||||
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
public Integer getOptionalInt(String key) throws FormatException {
|
public Integer getOptionalInt(String key) throws FormatException {
|
||||||
Long value = getOptionalLong(key);
|
Long value = getOptionalLong(key);
|
||||||
@@ -96,6 +138,17 @@ public final class BdfDictionary extends TreeMap<String, Object> {
|
|||||||
return value.intValue();
|
return value.intValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the integer with the specified key, or the given default
|
||||||
|
* value if the key is absent or the value is null.
|
||||||
|
* <p>
|
||||||
|
* This method should be used in preference to
|
||||||
|
* <code>getLong(key, defaultValue).intValue()</code> as it checks for
|
||||||
|
* overflow/underflow.
|
||||||
|
*
|
||||||
|
* @throws FormatException if the value at the specified key is not null
|
||||||
|
* and cannot be represented as a Java int.
|
||||||
|
*/
|
||||||
public Integer getInt(String key, Integer defaultValue)
|
public Integer getInt(String key, Integer defaultValue)
|
||||||
throws FormatException {
|
throws FormatException {
|
||||||
Integer value = getOptionalInt(key);
|
Integer value = getOptionalInt(key);
|
||||||
|
|||||||
@@ -6,6 +6,11 @@ import java.util.Map.Entry;
|
|||||||
|
|
||||||
import javax.annotation.concurrent.Immutable;
|
import javax.annotation.concurrent.Immutable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A convenience class for building {@link BdfDictionary BdfDictionaries}
|
||||||
|
* via the {@link BdfDictionary#of(Entry[]) factory method}. Entries in
|
||||||
|
* BdfDictionaries do not have to be BdfEntries.
|
||||||
|
*/
|
||||||
@Immutable
|
@Immutable
|
||||||
@NotNullByDefault
|
@NotNullByDefault
|
||||||
public class BdfEntry implements Entry<String, Object>, Comparable<BdfEntry> {
|
public class BdfEntry implements Entry<String, Object>, Comparable<BdfEntry> {
|
||||||
|
|||||||
@@ -12,6 +12,29 @@ import javax.annotation.concurrent.NotThreadSafe;
|
|||||||
|
|
||||||
import static org.briarproject.bramble.api.data.BdfDictionary.NULL_VALUE;
|
import static org.briarproject.bramble.api.data.BdfDictionary.NULL_VALUE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A BDF list contains zero or more BDF objects, which may be primitive types
|
||||||
|
* (null, boolean, integer, float, string, raw) or nested containers (list,
|
||||||
|
* dictionary).
|
||||||
|
* <p>
|
||||||
|
* Note that a BDF integer has the same range as a Java long, while a BDF
|
||||||
|
* float has the same range as a Java double. Method names in this class
|
||||||
|
* correspond to the Java types.
|
||||||
|
* <p>
|
||||||
|
* The getX() methods throw {@link FormatException} if the object at the
|
||||||
|
* specified index is null or does not have the requested type.
|
||||||
|
* <p>
|
||||||
|
* The getOptionalX() methods return null if the object at the specified
|
||||||
|
* index is null, or throw {@link FormatException} if the object does not
|
||||||
|
* have the requested type.
|
||||||
|
* <p>
|
||||||
|
* The getX() methods that take a default value return the default value if
|
||||||
|
* the object at the specified index is null, or throw
|
||||||
|
* {@link FormatException} if the object does not have the requested type.
|
||||||
|
* <p>
|
||||||
|
* All of the getters throw {@link FormatException} if the specified index is
|
||||||
|
* out of range.
|
||||||
|
*/
|
||||||
@NotThreadSafe
|
@NotThreadSafe
|
||||||
public final class BdfList extends ArrayList<Object> {
|
public final class BdfList extends ArrayList<Object> {
|
||||||
|
|
||||||
@@ -82,12 +105,34 @@ public final class BdfList extends ArrayList<Object> {
|
|||||||
return value == null ? defaultValue : value;
|
return value == null ? defaultValue : value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the integer at the specified index.
|
||||||
|
* <p>
|
||||||
|
* This method should be used in preference to
|
||||||
|
* <code>getLong(index).intValue()</code> as it checks for
|
||||||
|
* overflow/underflow.
|
||||||
|
*
|
||||||
|
* @throws FormatException if the index is out of range, or if the
|
||||||
|
* value at the specified index is null or cannot be represented as a
|
||||||
|
* Java int.
|
||||||
|
*/
|
||||||
public Integer getInt(int index) throws FormatException {
|
public Integer getInt(int index) throws FormatException {
|
||||||
Integer value = getOptionalInt(index);
|
Integer value = getOptionalInt(index);
|
||||||
if (value == null) throw new FormatException();
|
if (value == null) throw new FormatException();
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the integer at the specified index, or null if the object at
|
||||||
|
* the specified index is null.
|
||||||
|
* <p>
|
||||||
|
* This method should be used in preference to
|
||||||
|
* <code>getOptionalLong(index).intValue()</code> as it checks for
|
||||||
|
* overflow/underflow.
|
||||||
|
*
|
||||||
|
* @throws FormatException if the index is out of range, or if the value
|
||||||
|
* at the specified index cannot be represented as a Java int.
|
||||||
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
public Integer getOptionalInt(int index) throws FormatException {
|
public Integer getOptionalInt(int index) throws FormatException {
|
||||||
Long value = getOptionalLong(index);
|
Long value = getOptionalLong(index);
|
||||||
@@ -98,6 +143,17 @@ public final class BdfList extends ArrayList<Object> {
|
|||||||
return value.intValue();
|
return value.intValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the integer at the specified index, or the given default value
|
||||||
|
* if the object at the specified index is null.
|
||||||
|
* <p>
|
||||||
|
* This method should be used in preference to
|
||||||
|
* <code>getLong(index, defaultValue).intValue()</code> as it checks for
|
||||||
|
* overflow/underflow.
|
||||||
|
*
|
||||||
|
* @throws FormatException if the index is out of range, or if the value
|
||||||
|
* at the specified index cannot be represented as a Java int.
|
||||||
|
*/
|
||||||
public Integer getInt(int index, Integer defaultValue)
|
public Integer getInt(int index, Integer defaultValue)
|
||||||
throws FormatException {
|
throws FormatException {
|
||||||
Integer value = getOptionalInt(index);
|
Integer value = getOptionalInt(index);
|
||||||
|
|||||||
@@ -1,70 +1,178 @@
|
|||||||
package org.briarproject.bramble.api.data;
|
package org.briarproject.bramble.api.data;
|
||||||
|
|
||||||
|
import org.briarproject.bramble.api.FormatException;
|
||||||
import org.briarproject.nullsafety.NotNullByDefault;
|
import org.briarproject.nullsafety.NotNullByDefault;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An interface for reading BDF objects from an input stream.
|
||||||
|
* <p>
|
||||||
|
* The readX() methods throw {@link FormatException} if the data is not in
|
||||||
|
* canonical form, but the hasX() and skipX() methods do not check for
|
||||||
|
* canonical form.
|
||||||
|
*/
|
||||||
@NotNullByDefault
|
@NotNullByDefault
|
||||||
public interface BdfReader {
|
public interface BdfReader {
|
||||||
|
|
||||||
int DEFAULT_NESTED_LIMIT = 5;
|
int DEFAULT_NESTED_LIMIT = 5;
|
||||||
int DEFAULT_MAX_BUFFER_SIZE = 64 * 1024;
|
int DEFAULT_MAX_BUFFER_SIZE = 64 * 1024;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the reader has reached the end of its input stream.
|
||||||
|
*/
|
||||||
boolean eof() throws IOException;
|
boolean eof() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Closes the reader's input stream.
|
||||||
|
*/
|
||||||
void close() throws IOException;
|
void close() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the next object in the input is a BDF null.
|
||||||
|
*/
|
||||||
boolean hasNull() throws IOException;
|
boolean hasNull() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads a BDF null from the input.
|
||||||
|
*/
|
||||||
void readNull() throws IOException;
|
void readNull() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Skips over a BDF null.
|
||||||
|
*/
|
||||||
void skipNull() throws IOException;
|
void skipNull() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the next object in the input is a BDF boolean.
|
||||||
|
*/
|
||||||
boolean hasBoolean() throws IOException;
|
boolean hasBoolean() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads a BDF boolean from the input and returns it.
|
||||||
|
*/
|
||||||
boolean readBoolean() throws IOException;
|
boolean readBoolean() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Skips over a BDF boolean.
|
||||||
|
*/
|
||||||
void skipBoolean() throws IOException;
|
void skipBoolean() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the next object in the input is a BDF integer, which
|
||||||
|
* has the same range as a Java long.
|
||||||
|
*/
|
||||||
boolean hasLong() throws IOException;
|
boolean hasLong() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads a BDF integer from the input and returns it as a Java long.
|
||||||
|
*/
|
||||||
long readLong() throws IOException;
|
long readLong() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Skips over a BDF integer.
|
||||||
|
*/
|
||||||
void skipLong() throws IOException;
|
void skipLong() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the next object in the input is a BDF integer and the
|
||||||
|
* value would fit within the range of a Java int.
|
||||||
|
*/
|
||||||
boolean hasInt() throws IOException;
|
boolean hasInt() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads a BDF integer from the input and returns it as a Java int.
|
||||||
|
*
|
||||||
|
* @throws FormatException if the value exceeds the range of a Java int.
|
||||||
|
*/
|
||||||
int readInt() throws IOException;
|
int readInt() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Skips over a BDF integer.
|
||||||
|
*
|
||||||
|
* @throws FormatException if the value exceeds the range of a Java int.
|
||||||
|
*/
|
||||||
void skipInt() throws IOException;
|
void skipInt() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the next object in the input is a BDF float, which has
|
||||||
|
* the same range as a Java double.
|
||||||
|
*/
|
||||||
boolean hasDouble() throws IOException;
|
boolean hasDouble() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads a BDF float from the input and returns it as a Java double.
|
||||||
|
*/
|
||||||
double readDouble() throws IOException;
|
double readDouble() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Skips over a BDF float.
|
||||||
|
*/
|
||||||
void skipDouble() throws IOException;
|
void skipDouble() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the next object in the input is a BDF string.
|
||||||
|
*/
|
||||||
boolean hasString() throws IOException;
|
boolean hasString() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads a BDF string from the input.
|
||||||
|
*
|
||||||
|
* @throws IOException If the string is not valid UTF-8.
|
||||||
|
*/
|
||||||
String readString() throws IOException;
|
String readString() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Skips over a BDF string without checking whether it is valid UTF-8.
|
||||||
|
*/
|
||||||
void skipString() throws IOException;
|
void skipString() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the next object in the input is a BDF raw.
|
||||||
|
*/
|
||||||
boolean hasRaw() throws IOException;
|
boolean hasRaw() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads a BDF raw from the input and returns it as a byte array.
|
||||||
|
*/
|
||||||
byte[] readRaw() throws IOException;
|
byte[] readRaw() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Skips over a BDF raw.
|
||||||
|
*/
|
||||||
void skipRaw() throws IOException;
|
void skipRaw() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the next object in the input is a BDF list.
|
||||||
|
*/
|
||||||
boolean hasList() throws IOException;
|
boolean hasList() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads a BDF list from the input and returns it. The list's contents
|
||||||
|
* are parsed and validated.
|
||||||
|
*/
|
||||||
BdfList readList() throws IOException;
|
BdfList readList() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Skips over a BDF list. The list's contents are parsed (to determine
|
||||||
|
* their length) but not validated.
|
||||||
|
*/
|
||||||
void skipList() throws IOException;
|
void skipList() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the next object in the input is a BDF dictionary.
|
||||||
|
*/
|
||||||
boolean hasDictionary() throws IOException;
|
boolean hasDictionary() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads a BDF dictionary from the input and returns it. The dictionary's
|
||||||
|
* contents are parsed and validated.
|
||||||
|
*/
|
||||||
BdfDictionary readDictionary() throws IOException;
|
BdfDictionary readDictionary() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Skips over a BDF dictionary. The dictionary's contents are parsed
|
||||||
|
* (to determine their length) but not validated.
|
||||||
|
*/
|
||||||
void skipDictionary() throws IOException;
|
void skipDictionary() throws IOException;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,28 +1,74 @@
|
|||||||
package org.briarproject.bramble.api.data;
|
package org.briarproject.bramble.api.data;
|
||||||
|
|
||||||
|
import org.briarproject.bramble.api.FormatException;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An interface for writing BDF objects to an output stream. The BDF output
|
||||||
|
* is in canonical form, ie integers and length fields are represented using
|
||||||
|
* the minimum number of bytes and dictionary keys are unique and sorted in
|
||||||
|
* lexicographic order.
|
||||||
|
*/
|
||||||
public interface BdfWriter {
|
public interface BdfWriter {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flushes the writer's output stream.
|
||||||
|
*/
|
||||||
void flush() throws IOException;
|
void flush() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Closes the writer's output stream.
|
||||||
|
*/
|
||||||
void close() throws IOException;
|
void close() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes a BDF null to the output stream.
|
||||||
|
*/
|
||||||
void writeNull() throws IOException;
|
void writeNull() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes a BDF boolean to the output stream.
|
||||||
|
*/
|
||||||
void writeBoolean(boolean b) throws IOException;
|
void writeBoolean(boolean b) throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes a BDF integer (which has the same range as a Java long) to the
|
||||||
|
* output stream.
|
||||||
|
*/
|
||||||
void writeLong(long l) throws IOException;
|
void writeLong(long l) throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes a BDF float (which has the same range as a Java double) to the
|
||||||
|
* output stream.
|
||||||
|
*/
|
||||||
void writeDouble(double d) throws IOException;
|
void writeDouble(double d) throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes a BDF string (which uses UTF-8 encoding) to the output stream.
|
||||||
|
*/
|
||||||
void writeString(String s) throws IOException;
|
void writeString(String s) throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes a BDF raw to the output stream.
|
||||||
|
*/
|
||||||
void writeRaw(byte[] b) throws IOException;
|
void writeRaw(byte[] b) throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes a BDF list to the output stream.
|
||||||
|
*
|
||||||
|
* @throws FormatException if the contents of the given collection cannot
|
||||||
|
* be represented as (nested) BDF objects.
|
||||||
|
*/
|
||||||
void writeList(Collection<?> c) throws IOException;
|
void writeList(Collection<?> c) throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes a BDF dictionary to the output stream.
|
||||||
|
*
|
||||||
|
* @throws FormatException if the contents of the given map cannot be
|
||||||
|
* represented as (nested) BDF objects.
|
||||||
|
*/
|
||||||
void writeDictionary(Map<?, ?> m) throws IOException;
|
void writeDictionary(Map<?, ?> m) throws IOException;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user