commit c51516bd5044b4b59c24c3cfe6bddc8d9882e018 Author: Karsten Loesing karsten.loesing@gmx.net Date: Tue Jul 19 10:11:02 2016 +0200
Resolve all remaining Javadoc-related checkstyle issues.
Resolve very few of these warnings by suppressing them, in particular getters and setters that happen to contain more than 2 lines of code, because we should either document all or none of them.
Implements more of #19613. --- build.xml | 13 ++++++++++++ .../java/org/torproject/onionoo/cron/Main.java | 3 +++ .../torproject/onionoo/docs/BandwidthStatus.java | 2 ++ .../torproject/onionoo/docs/ClientsHistory.java | 12 +++++++++++ .../org/torproject/onionoo/docs/ClientsStatus.java | 6 ++++++ .../torproject/onionoo/docs/DateTimeHelper.java | 6 ++++++ .../torproject/onionoo/docs/DetailsDocument.java | 8 ++++++++ .../org/torproject/onionoo/docs/DetailsStatus.java | 3 +++ .../org/torproject/onionoo/docs/DocumentStore.java | 13 ++++++++++++ .../onionoo/docs/DocumentStoreFactory.java | 5 +++++ .../org/torproject/onionoo/docs/NodeStatus.java | 23 ++++++++++++++++++++++ .../torproject/onionoo/docs/SummaryDocument.java | 13 ++++++++++++ .../org/torproject/onionoo/docs/UpdateStatus.java | 2 ++ .../org/torproject/onionoo/docs/UptimeHistory.java | 12 +++++++++++ .../org/torproject/onionoo/docs/UptimeStatus.java | 6 ++++++ .../org/torproject/onionoo/docs/WeightsStatus.java | 6 ++++++ .../org/torproject/onionoo/server/NodeIndexer.java | 12 +++++++++++ .../onionoo/server/NodeIndexerFactory.java | 5 +++++ .../onionoo/server/PerformanceMetrics.java | 6 ++++++ .../torproject/onionoo/server/RequestHandler.java | 4 ++++ .../torproject/onionoo/server/ResourceServlet.java | 6 ++++++ .../org/torproject/onionoo/server/ServerMain.java | 1 + .../onionoo/updater/BandwidthStatusUpdater.java | 6 ++++++ .../onionoo/updater/ClientsStatusUpdater.java | 6 ++++++ .../onionoo/updater/DescriptorSource.java | 10 ++++++++++ .../onionoo/updater/DescriptorSourceFactory.java | 5 +++++ .../torproject/onionoo/updater/LookupService.java | 5 +++++ .../onionoo/updater/NodeDetailsStatusUpdater.java | 6 ++++++ .../onionoo/updater/RdnsLookupRequest.java | 1 + .../onionoo/updater/RdnsLookupWorker.java | 1 + .../onionoo/updater/ReverseDomainNameResolver.java | 9 +++++++++ .../onionoo/updater/StatusUpdateRunner.java | 4 ++++ .../onionoo/updater/UptimeStatusUpdater.java | 6 ++++++ .../onionoo/updater/WeightsStatusUpdater.java | 6 ++++++ .../torproject/onionoo/util/FormattingUtils.java | 5 +++++ .../org/torproject/onionoo/util/TimeFactory.java | 5 +++++ .../onionoo/writer/BandwidthDocumentWriter.java | 2 ++ .../onionoo/writer/ClientsDocumentWriter.java | 2 ++ .../onionoo/writer/DetailsDocumentWriter.java | 2 ++ .../onionoo/writer/DocumentWriterRunner.java | 4 ++++ .../onionoo/writer/SummaryDocumentWriter.java | 2 ++ .../onionoo/writer/UptimeDocumentWriter.java | 2 ++ .../onionoo/writer/WeightsDocumentWriter.java | 2 ++ src/test/resources/metrics_checks.xml | 2 ++ 44 files changed, 260 insertions(+)
diff --git a/build.xml b/build.xml index 1688207..f7f6bc0 100644 --- a/build.xml +++ b/build.xml @@ -10,6 +10,7 @@ <property name="classes" value="classes"/> <property name="testresources" value="src/test/resources/"/> <property name="dist" value="dist"/> + <property name="docs" value="${generated}/javadoc/"/> <property name="libs" value="lib"/> <property name="config" value="etc"/> <property name="webxmlfile" value="${config}/web.xml"/> @@ -85,6 +86,7 @@ <copy file="${contextxmltemplate}" tofile="${contextxml}"/> <copy file="${webxmltemplate}" tofile="${webxml}"/> <mkdir dir="${classes}"/> + <mkdir dir="${docs}"/> <mkdir dir="${dist}"/> <mkdir dir="${generated}"/> </target> @@ -111,6 +113,17 @@ </javac> </target>
+ <target name="docs" depends="init"> + <javadoc destdir="${docs}" + footer="&copy; 2016 The Tor Project" + doctitle="Onionoo Documentation" + use="true" + windowtitle="Onionoo Documentation"> + <classpath refid="classpath"/> + <fileset dir="${javasources}/" includes="**/*.java" /> + </javadoc> + </target> + <target name="test" depends="compile"> <javac destdir="${classes}" srcdir="${tests}" diff --git a/src/main/java/org/torproject/onionoo/cron/Main.java b/src/main/java/org/torproject/onionoo/cron/Main.java index 4a57f66..04b6955 100644 --- a/src/main/java/org/torproject/onionoo/cron/Main.java +++ b/src/main/java/org/torproject/onionoo/cron/Main.java @@ -28,6 +28,8 @@ public class Main implements Runnable {
private Logger log = LoggerFactory.getLogger(Main.class);
+ /** Executes a single update run or partial update run, or initiates + * hourly executions, depending on the given command-line arguments. */ public static void main(String[] args) { Main main = new Main(); main.parseArgsOrExit(args); @@ -121,6 +123,7 @@ public class Main implements Runnable { TimeUnit.MINUTES); }
+ @Override public void run() { this.acquireLockOrExit(); this.initialize(); diff --git a/src/main/java/org/torproject/onionoo/docs/BandwidthStatus.java b/src/main/java/org/torproject/onionoo/docs/BandwidthStatus.java index 65d4cf5..ac7085f 100644 --- a/src/main/java/org/torproject/onionoo/docs/BandwidthStatus.java +++ b/src/main/java/org/torproject/onionoo/docs/BandwidthStatus.java @@ -51,6 +51,7 @@ public class BandwidthStatus extends Document { return this.readHistory; }
+ @Override public void setFromDocumentString(String documentString) { try (Scanner s = new Scanner(documentString)) { while (s.hasNextLine()) { @@ -170,6 +171,7 @@ public class BandwidthStatus extends Document { } }
+ @Override public String toDocumentString() { StringBuilder sb = new StringBuilder(); for (long[] v : writeHistory.values()) { diff --git a/src/main/java/org/torproject/onionoo/docs/ClientsHistory.java b/src/main/java/org/torproject/onionoo/docs/ClientsHistory.java index 0f4c148..e99c3ef 100644 --- a/src/main/java/org/torproject/onionoo/docs/ClientsHistory.java +++ b/src/main/java/org/torproject/onionoo/docs/ClientsHistory.java @@ -51,6 +51,9 @@ public class ClientsHistory implements Comparable<ClientsHistory> { return this.responsesByVersion; }
+ /** Instantiates a new clients history object with given interval start + * and end, total responses, and responses by country, transport, and + * version. */ public ClientsHistory(long startMillis, long endMillis, double totalResponses, SortedMap<String, Double> responsesByCountry, @@ -64,6 +67,8 @@ public class ClientsHistory implements Comparable<ClientsHistory> { this.responsesByVersion = responsesByVersion; }
+ /** Instantiates a new clients history object from the given string that + * may have been produced by {@link #toString()}. */ public static ClientsHistory fromString( String responseHistoryString) { String[] parts = responseHistoryString.split(" ", 8); @@ -133,6 +138,7 @@ public class ClientsHistory implements Comparable<ClientsHistory> { return responses; }
+ @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(DateTimeHelper.format(startMillis)); @@ -154,6 +160,9 @@ public class ClientsHistory implements Comparable<ClientsHistory> { } }
+ /** Adds responses from another clients history object to this one by + * summing up response numbers and extending interval start and/or + * end. */ public void addResponses(ClientsHistory other) { this.totalResponses += other.totalResponses; this.addResponsesByCategory(this.responsesByCountry, @@ -183,16 +192,19 @@ public class ClientsHistory implements Comparable<ClientsHistory> { } }
+ @Override public int compareTo(ClientsHistory other) { return this.startMillis < other.startMillis ? -1 : this.startMillis > other.startMillis ? 1 : 0; }
+ @Override public boolean equals(Object other) { return other instanceof ClientsHistory && this.startMillis == ((ClientsHistory) other).startMillis; }
+ @Override public int hashCode() { return (int) this.startMillis; } diff --git a/src/main/java/org/torproject/onionoo/docs/ClientsStatus.java b/src/main/java/org/torproject/onionoo/docs/ClientsStatus.java index 4ef998e..45466ae 100644 --- a/src/main/java/org/torproject/onionoo/docs/ClientsStatus.java +++ b/src/main/java/org/torproject/onionoo/docs/ClientsStatus.java @@ -38,6 +38,7 @@ public class ClientsStatus extends Document { return this.history; }
+ @Override public void setFromDocumentString(String documentString) { try (Scanner s = new Scanner(documentString)) { while (s.hasNextLine()) { @@ -53,6 +54,8 @@ public class ClientsStatus extends Document { } }
+ /** Adds all given clients history objects that don't overlap with + * existing clients history objects. */ public void addToHistory(SortedSet<ClientsHistory> newIntervals) { for (ClientsHistory interval : newIntervals) { if ((this.history.headSet(interval).isEmpty() @@ -67,6 +70,8 @@ public class ClientsStatus extends Document { } }
+ /** Compresses the history of clients objects by merging adjacent + * intervals, depending on how far back in the past they lie. */ public void compressHistory() { SortedSet<ClientsHistory> uncompressedHistory = new TreeSet<ClientsHistory>(this.history); @@ -107,6 +112,7 @@ public class ClientsStatus extends Document { } }
+ @Override public String toDocumentString() { StringBuilder sb = new StringBuilder(); for (ClientsHistory interval : this.history) { diff --git a/src/main/java/org/torproject/onionoo/docs/DateTimeHelper.java b/src/main/java/org/torproject/onionoo/docs/DateTimeHelper.java index 4e422e9..1dc40c3 100644 --- a/src/main/java/org/torproject/onionoo/docs/DateTimeHelper.java +++ b/src/main/java/org/torproject/onionoo/docs/DateTimeHelper.java @@ -109,6 +109,9 @@ public class DateTimeHelper { return format(millis, ISO_DATETIME_FORMAT); }
+ /** Parses the given string using the given format and return the time + * in milliseconds since the epoch or {@link #NO_TIME_AVAILABLE} if the + * string cannot be parsed. */ public static long parse(String string, String format) { if (null == string) { log.warn("Date String was null."); @@ -122,6 +125,9 @@ public class DateTimeHelper { } }
+ /** Parses the given string using {@link #ISO_DATETIME_FORMAT} as format + * and return the time in milliseconds since the epoch or + * {@link #NO_TIME_AVAILABLE} if the string cannot be parsed. */ public static long parse(String string) { return parse(string, ISO_DATETIME_FORMAT); } diff --git a/src/main/java/org/torproject/onionoo/docs/DetailsDocument.java b/src/main/java/org/torproject/onionoo/docs/DetailsDocument.java index 8ffb358..85c0154 100644 --- a/src/main/java/org/torproject/onionoo/docs/DetailsDocument.java +++ b/src/main/java/org/torproject/onionoo/docs/DetailsDocument.java @@ -377,6 +377,8 @@ public class DetailsDocument extends Document {
private Float consensus_weight_fraction;
+ /** Sets the consensus weight fraction to the given value, but only if + * that value is neither null nor negative. */ public void setConsensusWeightFraction(Float consensusWeightFraction) { if (consensusWeightFraction == null || consensusWeightFraction >= 0.0) { @@ -390,6 +392,8 @@ public class DetailsDocument extends Document {
private Float guard_probability;
+ /** Sets the guard probability to the given value, but only if that + * value is neither null nor negative. */ public void setGuardProbability(Float guardProbability) { if (guardProbability == null || guardProbability >= 0.0) { this.guard_probability = guardProbability; @@ -402,6 +406,8 @@ public class DetailsDocument extends Document {
private Float middle_probability;
+ /** Sets the middle probability to the given value, but only if that + * value is neither null nor negative. */ public void setMiddleProbability(Float middleProbability) { if (middleProbability == null || middleProbability >= 0.0) { this.middle_probability = middleProbability; @@ -414,6 +420,8 @@ public class DetailsDocument extends Document {
private Float exit_probability;
+ /** Sets the exit probability to the given value, but only if that + * value is neither null nor negative. */ public void setExitProbability(Float exitProbability) { if (exitProbability == null || exitProbability >= 0.0) { this.exit_probability = exitProbability; diff --git a/src/main/java/org/torproject/onionoo/docs/DetailsStatus.java b/src/main/java/org/torproject/onionoo/docs/DetailsStatus.java index dcc6fcb..1a3c05d 100644 --- a/src/main/java/org/torproject/onionoo/docs/DetailsStatus.java +++ b/src/main/java/org/torproject/onionoo/docs/DetailsStatus.java @@ -250,6 +250,9 @@ public class DetailsStatus extends Document { this.or_addresses_and_ports; }
+ /** Returns all addresses used for the onion-routing protocol which + * includes the primary address and all additionally configured + * onion-routing addresses. */ public SortedSet<String> getOrAddresses() { SortedSet<String> orAddresses = new TreeSet<String>(); if (this.address != null) { diff --git a/src/main/java/org/torproject/onionoo/docs/DocumentStore.java b/src/main/java/org/torproject/onionoo/docs/DocumentStore.java index 600115c..42c75aa 100644 --- a/src/main/java/org/torproject/onionoo/docs/DocumentStore.java +++ b/src/main/java/org/torproject/onionoo/docs/DocumentStore.java @@ -97,6 +97,8 @@ public class DocumentStore { return this.list(documentType, 0L); }
+ /** Returns all fingerprints of documents of the given type that have + * been updated after the given time in milliseconds since the epoch. */ public <T extends Document> SortedSet<String> list( Class<T> documentType, long updatedAfter) { if (documentType.equals(NodeStatus.class)) { @@ -258,6 +260,8 @@ public class DocumentStore { return this.store(document, null); }
+ /** Stores the given document using the given fingerprint as + * identifier. */ public <T extends Document> boolean store(T document, String fingerprint) { if (document instanceof NodeStatus) { @@ -372,6 +376,8 @@ public class DocumentStore { return this.retrieve(documentType, parse, null); }
+ /** Retrieves the document with given type and identified by the given + * fingerprint, and either parses it or returns it unparsed. */ public <T extends Document> T retrieve(Class<T> documentType, boolean parse, String fingerprint) { if (documentType.equals(NodeStatus.class)) { @@ -576,6 +582,8 @@ public class DocumentStore { return this.remove(documentType, null); }
+ /** Removes the document with given type and identified by the given + * fingerprint. */ public <T extends Document> boolean remove(Class<T> documentType, String fingerprint) { if (documentType.equals(NodeStatus.class)) { @@ -681,6 +689,8 @@ public class DocumentStore { return documentFile; }
+ /** Writes cached node statuses, cached summary documents, and then the + * update file to disk. */ public void flushDocumentCache() { /* Write cached node statuses to disk, and write update file * containing current time. It's important to write the update file @@ -698,6 +708,8 @@ public class DocumentStore { } }
+ /** Invalidates the document cache, so that it will be freshly populated + * during the next execution. */ public void invalidateDocumentCache() { this.cachedNodeStatuses = null; this.cachedSummaryDocuments = null; @@ -810,6 +822,7 @@ public class DocumentStore { this.store(updateStatus); }
+ /** Returns a string with statistics on document storage operations. */ public String getStatsString() { StringBuilder sb = new StringBuilder(); sb.append(" " + FormattingUtils.formatDecimalNumber(listOperations) diff --git a/src/main/java/org/torproject/onionoo/docs/DocumentStoreFactory.java b/src/main/java/org/torproject/onionoo/docs/DocumentStoreFactory.java index 3fa28fc..455a27f 100644 --- a/src/main/java/org/torproject/onionoo/docs/DocumentStoreFactory.java +++ b/src/main/java/org/torproject/onionoo/docs/DocumentStoreFactory.java @@ -7,10 +7,15 @@ public class DocumentStoreFactory {
private static DocumentStore documentStoreInstance;
+ /** Sets a custom singleton document store instance that will be + * returned by {@link #getDocumentStore()} rather than creating an + * instance upon first invocation. */ public static void setDocumentStore(DocumentStore documentStore) { documentStoreInstance = documentStore; }
+ /** Returns the singleton document store instance that gets created upon + * first invocation of this method. */ public static DocumentStore getDocumentStore() { if (documentStoreInstance == null) { documentStoreInstance = new DocumentStore(); diff --git a/src/main/java/org/torproject/onionoo/docs/NodeStatus.java b/src/main/java/org/torproject/onionoo/docs/NodeStatus.java index 630171b..afdd6c6 100644 --- a/src/main/java/org/torproject/onionoo/docs/NodeStatus.java +++ b/src/main/java/org/torproject/onionoo/docs/NodeStatus.java @@ -29,6 +29,9 @@ public class NodeStatus extends Document {
private String contact;
+ /** Sets the contact to a lower-cased variant of the given string with + * all non-printable characters outside of ASCII code 32 (space) to 126 + * (dash) replaced with spaces. */ public void setContact(String contact) { if (contact == null) { this.contact = null; @@ -130,6 +133,9 @@ public class NodeStatus extends Document { : this.orAddressesAndPorts; }
+ /** Returns all addresses used for the onion-routing protocol which + * includes the primary address and all additionally configured + * onion-routing addresses. */ public SortedSet<String> getOrAddresses() { SortedSet<String> orAddresses = new TreeSet<String>(); if (this.address != null) { @@ -195,6 +201,7 @@ public class NodeStatus extends Document {
private BitSet relayFlags;
+ @SuppressWarnings("checkstyle:javadocmethod") public void setRelayFlags(SortedSet<String> relayFlags) { BitSet newRelayFlags = new BitSet(relayFlagIndexes.size()); for (String relayFlag : relayFlags) { @@ -207,6 +214,7 @@ public class NodeStatus extends Document { this.relayFlags = newRelayFlags; }
+ @SuppressWarnings("checkstyle:javadocmethod") public SortedSet<String> getRelayFlags() { SortedSet<String> result = new TreeSet<String>(); if (this.relayFlags != null) { @@ -255,6 +263,9 @@ public class NodeStatus extends Document { return new TreeMap<Long, Set<String>>(this.lastAddresses); }
+ /** Adds addresses and ports together with the time in milliseconds + * since the epoch when they were last seen to the history of last seen + * addresses and ports. */ public void addLastAddresses(long lastSeenMillis, String address, int orPort, int dirPort, SortedSet<String> orAddressesAndPorts) { Set<String> addressesAndPorts = new HashSet<String>(); @@ -270,6 +281,8 @@ public class NodeStatus extends Document { } }
+ /** Returns the time in milliseconds since the epoch when addresses or + * ports were last changed. */ public long getLastChangedOrAddressOrPort() { long lastChangedAddressesMillis = -1L; if (this.lastAddresses != null) { @@ -369,6 +382,9 @@ public class NodeStatus extends Document { return stringArrayToSortedSet(this.extendedFamily); }
+ /** Returns the alleged family consisting of all relays in this relay's + * declared family that are not in a mutual family relationship with + * this relay. */ public SortedSet<String> getAllegedFamily() { SortedSet<String> allegedFamily = new TreeSet<String>( stringArrayToSortedSet(this.declaredFamily)); @@ -376,6 +392,9 @@ public class NodeStatus extends Document { return allegedFamily; }
+ /** Returns the indirect family consisting of all relays that can be + * reached via mutual family relationships except for those that can be + * reached directly via such a relationship. */ public SortedSet<String> getIndirectFamily() { SortedSet<String> indirectFamily = new TreeSet<String>( stringArrayToSortedSet(this.extendedFamily)); @@ -385,10 +404,13 @@ public class NodeStatus extends Document {
/* Constructor and (de-)serialization methods: */
+ /** Instantiates a new node status object from the given fingerprint. */ public NodeStatus(String fingerprint) { this.fingerprint = fingerprint; }
+ /** Instantiates a new node status object from the given string that may + * have been produced by {@link #toString()}. */ public static NodeStatus fromString(String documentString) { try { String[] parts = documentString.trim().split("\t"); @@ -529,6 +551,7 @@ public class NodeStatus extends Document { } }
+ @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(this.isRelay ? "r" : "b"); diff --git a/src/main/java/org/torproject/onionoo/docs/SummaryDocument.java b/src/main/java/org/torproject/onionoo/docs/SummaryDocument.java index cebcf5e..6a520c8 100644 --- a/src/main/java/org/torproject/onionoo/docs/SummaryDocument.java +++ b/src/main/java/org/torproject/onionoo/docs/SummaryDocument.java @@ -30,6 +30,9 @@ public class SummaryDocument extends Document {
private String f;
+ /** Sets the fingerprint to the given 40 hex characters and clears + * SHA1-hashed and base64 fingerprints, so that they are re-computed at + * next request. */ public void setFingerprint(String fingerprint) { if (fingerprint != null) { Pattern fingerprintPattern = Pattern.compile("^[0-9a-fA-F]{40}$"); @@ -49,6 +52,8 @@ public class SummaryDocument extends Document {
private transient String hashedFingerprint = null;
+ /** Returns the SHA1-hashed fingerprint, or <code>null</code> if no + * fingerprint is set. */ public String getHashedFingerprint() { if (this.hashedFingerprint == null && this.f != null) { try { @@ -63,6 +68,8 @@ public class SummaryDocument extends Document {
private transient String base64Fingerprint = null;
+ /** Returns the base64-encoded fingerprint, or <code>null</code> if no + * fingerprint is set. */ public String getBase64Fingerprint() { if (this.base64Fingerprint == null && this.f != null) { try { @@ -77,6 +84,9 @@ public class SummaryDocument extends Document {
private transient String[] fingerprintSortedHexBlocks = null;
+ /** Returns a sorted array containing blocks of 4 upper-case hex + * characters from the fingerprint, or <code>null</code> if no + * fingerprint is set. */ public String[] getFingerprintSortedHexBlocks() { if (this.fingerprintSortedHexBlocks == null && this.f != null) { String fingerprint = this.f.toUpperCase(); @@ -94,6 +104,7 @@ public class SummaryDocument extends Document {
private String n;
+ @SuppressWarnings("checkstyle:javadocmethod") public void setNickname(String nickname) { if (nickname == null || nickname.equals("Unnamed")) { this.n = null; @@ -219,6 +230,7 @@ public class SummaryDocument extends Document {
private String c;
+ @SuppressWarnings("checkstyle:javadocmethod") public void setContact(String contact) { if (contact != null && contact.length() == 0) { this.c = null; @@ -257,6 +269,7 @@ public class SummaryDocument extends Document {
/* The familyFingerprints parameter can go away after September 8, 2015. * See above. */ + /** Instantiates a summary document with all given properties. */ public SummaryDocument(boolean isRelay, String nickname, String fingerprint, List<String> addresses, long lastSeenMillis, boolean running, SortedSet<String> relayFlags, long consensusWeight, diff --git a/src/main/java/org/torproject/onionoo/docs/UpdateStatus.java b/src/main/java/org/torproject/onionoo/docs/UpdateStatus.java index 07d5d20..4223337 100644 --- a/src/main/java/org/torproject/onionoo/docs/UpdateStatus.java +++ b/src/main/java/org/torproject/onionoo/docs/UpdateStatus.java @@ -20,6 +20,7 @@ public class UpdateStatus extends Document { return this.updatedMillis; }
+ @Override public void setFromDocumentString(String documentString) { try { this.updatedMillis = Long.parseLong(documentString.trim()); @@ -30,6 +31,7 @@ public class UpdateStatus extends Document { } }
+ @Override public String toDocumentString() { return String.valueOf(this.updatedMillis); } diff --git a/src/main/java/org/torproject/onionoo/docs/UptimeHistory.java b/src/main/java/org/torproject/onionoo/docs/UptimeHistory.java index 6f1cb2e..3cd0a0e 100644 --- a/src/main/java/org/torproject/onionoo/docs/UptimeHistory.java +++ b/src/main/java/org/torproject/onionoo/docs/UptimeHistory.java @@ -38,6 +38,8 @@ public class UptimeHistory implements Comparable<UptimeHistory> { return this.flags; }
+ /** Instantiates a new uptime history object for a relay or bridge with + * the given interval start, uptime hours, and relay flags. */ UptimeHistory(boolean relay, long startMillis, int uptimeHours, SortedSet<String> flags) { this.relay = relay; @@ -46,6 +48,8 @@ public class UptimeHistory implements Comparable<UptimeHistory> { this.flags = flags; }
+ /** Instantiates a new uptime history object from the given string that + * may have been produced by {@link #toString()}. */ public static UptimeHistory fromString(String uptimeHistoryString) { String[] parts = uptimeHistoryString.split(" ", -1); if (parts.length < 3) { @@ -87,6 +91,7 @@ public class UptimeHistory implements Comparable<UptimeHistory> { return new UptimeHistory(relay, startMillis, uptimeHours, flags); }
+ @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(this.relay ? (this.flags == null ? "r" : "R") : "b"); @@ -101,6 +106,10 @@ public class UptimeHistory implements Comparable<UptimeHistory> { return sb.toString(); }
+ /** Adds uptime hours from another uptime history object, which is + * assumed to either start right after this one or which ends right + * before it, and sets the interval start to the earlier interval + * start. */ public void addUptime(UptimeHistory other) { this.uptimeHours += other.uptimeHours; if (this.startMillis > other.startMillis) { @@ -108,6 +117,7 @@ public class UptimeHistory implements Comparable<UptimeHistory> { } }
+ @Override public int compareTo(UptimeHistory other) { if (this.relay && !other.relay) { return -1; @@ -118,12 +128,14 @@ public class UptimeHistory implements Comparable<UptimeHistory> { : this.startMillis > other.startMillis ? 1 : 0; }
+ @Override public boolean equals(Object other) { return other instanceof UptimeHistory && this.relay == ((UptimeHistory) other).relay && this.startMillis == ((UptimeHistory) other).startMillis; }
+ @Override public int hashCode() { return (int) this.startMillis + (this.relay ? 1 : 0); } diff --git a/src/main/java/org/torproject/onionoo/docs/UptimeStatus.java b/src/main/java/org/torproject/onionoo/docs/UptimeStatus.java index ce3a4d1..b725acc 100644 --- a/src/main/java/org/torproject/onionoo/docs/UptimeStatus.java +++ b/src/main/java/org/torproject/onionoo/docs/UptimeStatus.java @@ -40,6 +40,7 @@ public class UptimeStatus extends Document { return this.bridgeHistory; }
+ @Override public void setFromDocumentString(String documentString) { try (Scanner s = new Scanner(documentString)) { while (s.hasNextLine()) { @@ -59,6 +60,8 @@ public class UptimeStatus extends Document { } }
+ /** Adds all given uptime history objects that don't overlap with + * existing uptime history objects. */ public void addToHistory(boolean relay, long startMillis, SortedSet<String> flags) { SortedSet<UptimeHistory> history = relay ? this.relayHistory @@ -105,6 +108,8 @@ public class UptimeStatus extends Document { this.isDirty = true; }
+ /** Compresses the history of uptime objects by merging adjacent + * intervals. */ public void compressHistory() { this.compressHistory(this.relayHistory); this.compressHistory(this.bridgeHistory); @@ -137,6 +142,7 @@ public class UptimeStatus extends Document { } }
+ @Override public String toDocumentString() { StringBuilder sb = new StringBuilder(); for (UptimeHistory interval : this.relayHistory) { diff --git a/src/main/java/org/torproject/onionoo/docs/WeightsStatus.java b/src/main/java/org/torproject/onionoo/docs/WeightsStatus.java index 47eaed9..efb7c25 100644 --- a/src/main/java/org/torproject/onionoo/docs/WeightsStatus.java +++ b/src/main/java/org/torproject/onionoo/docs/WeightsStatus.java @@ -46,6 +46,7 @@ public class WeightsStatus extends Document { return this.history; }
+ @Override public void setFromDocumentString(String documentString) { try (Scanner s = new Scanner(documentString)) { while (s.hasNextLine()) { @@ -90,6 +91,8 @@ public class WeightsStatus extends Document { } }
+ /** Adds all given weights history objects that don't overlap with + * existing weights history objects. */ public void addToHistory(long validAfterMillis, long freshUntilMillis, double[] weights) { long[] interval = new long[] { validAfterMillis, freshUntilMillis }; @@ -104,6 +107,8 @@ public class WeightsStatus extends Document { } }
+ /** Compresses the history of weights objects by merging adjacent + * intervals, depending on how far back in the past they lie. */ public void compressHistory() { SortedMap<long[], double[]> uncompressedHistory = new TreeMap<long[], double[]>(this.history); @@ -176,6 +181,7 @@ public class WeightsStatus extends Document { } }
+ @Override public String toDocumentString() { StringBuilder sb = new StringBuilder(); for (Map.Entry<long[], double[]> e : history.entrySet()) { diff --git a/src/main/java/org/torproject/onionoo/server/NodeIndexer.java b/src/main/java/org/torproject/onionoo/server/NodeIndexer.java index 30a6f0e..93b5af7 100644 --- a/src/main/java/org/torproject/onionoo/server/NodeIndexer.java +++ b/src/main/java/org/torproject/onionoo/server/NodeIndexer.java @@ -34,6 +34,7 @@ public class NodeIndexer implements ServletContextListener, Runnable { private static final Logger log = LoggerFactory.getLogger( NodeIndexer.class);
+ @Override public void contextInitialized(ServletContextEvent contextEvent) { ServletContext servletContext = contextEvent.getServletContext(); File outDir = new File(servletContext.getInitParameter("outDir")); @@ -50,6 +51,7 @@ public class NodeIndexer implements ServletContextListener, Runnable { this.startIndexing(); }
+ @Override public void contextDestroyed(ServletContextEvent contextEvent) { this.stopIndexing(); } @@ -60,6 +62,9 @@ public class NodeIndexer implements ServletContextListener, Runnable {
private Thread nodeIndexerThread = null;
+ /** Returns the creation time of the last known node index in + * milliseconds since the epoch, or <code>-1</code> if no node index + * could be retrieved within <code>timeoutMillis</code> milliseconds. */ public synchronized long getLastIndexed(long timeoutMillis) { if (this.lastIndexed == -1L && this.nodeIndexerThread != null && timeoutMillis > 0L) { @@ -71,6 +76,8 @@ public class NodeIndexer implements ServletContextListener, Runnable { return this.lastIndexed; }
+ /** Returns the last known node index, or null if no node index could be + * retrieved within <code>timeoutMillis</code> milliseconds. */ public synchronized NodeIndex getLatestNodeIndex(long timeoutMillis) { if (this.latestNodeIndex == null && this.nodeIndexerThread != null && timeoutMillis > 0L) { @@ -82,6 +89,8 @@ public class NodeIndexer implements ServletContextListener, Runnable { return this.latestNodeIndex; }
+ /** Start reading the node index into memory periodically in a + * background thread. */ public synchronized void startIndexing() { if (this.nodeIndexerThread == null) { this.nodeIndexerThread = new Thread(this); @@ -94,6 +103,7 @@ public class NodeIndexer implements ServletContextListener, Runnable {
private static final long ONE_DAY = 24L * 60L * ONE_MINUTE;
+ @Override public void run() { while (this.nodeIndexerThread != null) { this.indexNodeStatuses(); @@ -104,6 +114,8 @@ public class NodeIndexer implements ServletContextListener, Runnable { } }
+ /** Stop the background process that is periodically reading the node + * index. */ public synchronized void stopIndexing() { Thread indexerThread = this.nodeIndexerThread; this.nodeIndexerThread = null; diff --git a/src/main/java/org/torproject/onionoo/server/NodeIndexerFactory.java b/src/main/java/org/torproject/onionoo/server/NodeIndexerFactory.java index 1dfa859..b938c9e 100644 --- a/src/main/java/org/torproject/onionoo/server/NodeIndexerFactory.java +++ b/src/main/java/org/torproject/onionoo/server/NodeIndexerFactory.java @@ -7,10 +7,15 @@ public class NodeIndexerFactory {
private static NodeIndexer nodeIndexerInstance;
+ /** Sets a custom singleton node indexer instance that will be returned + * by {@link #getNodeIndexer()} rather than creating an instance upon + * first invocation. */ public static void setNodeIndexer(NodeIndexer nodeIndexer) { nodeIndexerInstance = nodeIndexer; }
+ /** Returns the singleton node indexer instance that gets created upon + * first invocation of this method. */ public static NodeIndexer getNodeIndexer() { if (nodeIndexerInstance == null) { nodeIndexerInstance = new NodeIndexer(); diff --git a/src/main/java/org/torproject/onionoo/server/PerformanceMetrics.java b/src/main/java/org/torproject/onionoo/server/PerformanceMetrics.java index a12e5c7..7adad76 100644 --- a/src/main/java/org/torproject/onionoo/server/PerformanceMetrics.java +++ b/src/main/java/org/torproject/onionoo/server/PerformanceMetrics.java @@ -30,6 +30,7 @@ class Counter { this.value++; }
+ @Override public String toString() { return String.valueOf(this.value); } @@ -52,6 +53,7 @@ class MostFrequentString { } }
+ @Override public String toString() { SortedMap<Integer, SortedSet<String>> sortedFrequencies = new TreeMap<Integer, SortedSet<String>>( @@ -98,6 +100,7 @@ class IntegerDistribution { logValues[64 - Long.numberOfLeadingZeros(value)]++; }
+ @Override public String toString() { StringBuilder sb = new StringBuilder(); int totalValues = 0; @@ -172,6 +175,9 @@ public class PerformanceMetrics { private static IntegerDistribution buildResponseMillis = new IntegerDistribution();
+ /** Collects aggregate statistics on a given request for periodic + * request statistics, and logs requests taking longer than expected to + * process. */ public static void logStatistics(long receivedRequestMillis, String resourceType, Collection<String> parameterKeys, long parsedRequestMillis, int relayDocumentsWritten, diff --git a/src/main/java/org/torproject/onionoo/server/RequestHandler.java b/src/main/java/org/torproject/onionoo/server/RequestHandler.java index 85a6ff1..eaa4fe2 100644 --- a/src/main/java/org/torproject/onionoo/server/RequestHandler.java +++ b/src/main/java/org/torproject/onionoo/server/RequestHandler.java @@ -111,6 +111,7 @@ public class RequestHandler {
private int[] firstSeenDays;
+ @SuppressWarnings("checkstyle:javadocmethod") public void setFirstSeenDays(int[] firstSeenDays) { this.firstSeenDays = new int[firstSeenDays.length]; System.arraycopy(firstSeenDays, 0, this.firstSeenDays, 0, @@ -119,6 +120,7 @@ public class RequestHandler {
private int[] lastSeenDays;
+ @SuppressWarnings("checkstyle:javadocmethod") public void setLastSeenDays(int[] lastSeenDays) { this.lastSeenDays = new int[lastSeenDays.length]; System.arraycopy(lastSeenDays, 0, this.lastSeenDays, 0, @@ -137,6 +139,8 @@ public class RequestHandler { private Map<String, SummaryDocument> filteredBridges = new HashMap<String, SummaryDocument>();
+ /** Handles this request by filtering by all given parameters and then + * possibly ordering, offsetting, and limiting results. */ public void handleRequest() { this.filteredRelays.putAll( this.nodeIndex.getRelayFingerprintSummaryLines()); diff --git a/src/main/java/org/torproject/onionoo/server/ResourceServlet.java b/src/main/java/org/torproject/onionoo/server/ResourceServlet.java index 4fd38b7..5b3ab69 100644 --- a/src/main/java/org/torproject/onionoo/server/ResourceServlet.java +++ b/src/main/java/org/torproject/onionoo/server/ResourceServlet.java @@ -31,6 +31,7 @@ public class ResourceServlet extends HttpServlet { private boolean maintenanceMode = false;
/* Called by servlet container, not by test class. */ + @Override public void init(ServletConfig config) throws ServletException { super.init(config); this.maintenanceMode = config.getInitParameter("maintenance") != null @@ -39,6 +40,7 @@ public class ResourceServlet extends HttpServlet {
private static final long INDEX_WAITING_TIME = 10L * 1000L;
+ @Override public long getLastModified(HttpServletRequest request) { if (this.maintenanceMode) { return super.getLastModified(request); @@ -48,6 +50,7 @@ public class ResourceServlet extends HttpServlet { } }
+ @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { HttpServletRequestWrapper requestWrapper = @@ -72,6 +75,9 @@ public class ResourceServlet extends HttpServlet { new HashSet<String>(Arrays.asList(("search,fingerprint,order,limit," + "offset,fields").split(",")));
+ /** Handles the HTTP GET request in the wrapped <code>request</code> by + * writing an HTTP GET response to the likewise <code>response</code>, + * both of which are wrapped to facilitate testing. */ public void doGet(HttpServletRequestWrapper request, HttpServletResponseWrapper response) throws IOException {
diff --git a/src/main/java/org/torproject/onionoo/server/ServerMain.java b/src/main/java/org/torproject/onionoo/server/ServerMain.java index 22e315b..fd4dc90 100644 --- a/src/main/java/org/torproject/onionoo/server/ServerMain.java +++ b/src/main/java/org/torproject/onionoo/server/ServerMain.java @@ -14,6 +14,7 @@ public class ServerMain { private static final Logger log = LoggerFactory.getLogger( ServerMain.class);
+ /** Starts the web server listening for incoming client connections. */ public static void main(String[] args) { try { Resource onionooXml = Resource.newSystemResource("jetty.xml"); diff --git a/src/main/java/org/torproject/onionoo/updater/BandwidthStatusUpdater.java b/src/main/java/org/torproject/onionoo/updater/BandwidthStatusUpdater.java index 1c0c181..3aa3dd1 100644 --- a/src/main/java/org/torproject/onionoo/updater/BandwidthStatusUpdater.java +++ b/src/main/java/org/torproject/onionoo/updater/BandwidthStatusUpdater.java @@ -16,6 +16,9 @@ public class BandwidthStatusUpdater implements DescriptorListener,
private DocumentStore documentStore;
+ /** Initializes a new status updater, obtains references to all relevant + * singleton instances, and registers as listener at the (singleton) + * descriptor source. */ public BandwidthStatusUpdater() { this.descriptorSource = DescriptorSourceFactory.getDescriptorSource(); this.documentStore = DocumentStoreFactory.getDocumentStore(); @@ -29,12 +32,14 @@ public class BandwidthStatusUpdater implements DescriptorListener, DescriptorType.BRIDGE_EXTRA_INFOS); }
+ @Override public void processDescriptor(Descriptor descriptor, boolean relay) { if (descriptor instanceof ExtraInfoDescriptor) { this.parseDescriptor((ExtraInfoDescriptor) descriptor); } }
+ @Override public void updateStatuses() { /* Status files are already updated while processing descriptors. */ } @@ -59,6 +64,7 @@ public class BandwidthStatusUpdater implements DescriptorListener, } }
+ @Override public String getStatsString() { /* TODO Add statistics string. */ return null; diff --git a/src/main/java/org/torproject/onionoo/updater/ClientsStatusUpdater.java b/src/main/java/org/torproject/onionoo/updater/ClientsStatusUpdater.java index 492b67b..28b8ea7 100644 --- a/src/main/java/org/torproject/onionoo/updater/ClientsStatusUpdater.java +++ b/src/main/java/org/torproject/onionoo/updater/ClientsStatusUpdater.java @@ -43,6 +43,9 @@ public class ClientsStatusUpdater implements DescriptorListener,
private DocumentStore documentStore;
+ /** Initializes a new status updater, obtains references to all relevant + * singleton instances, and registers as listener at the (singleton) + * descriptor source. */ public ClientsStatusUpdater() { this.descriptorSource = DescriptorSourceFactory.getDescriptorSource(); this.documentStore = DocumentStoreFactory.getDocumentStore(); @@ -54,6 +57,7 @@ public class ClientsStatusUpdater implements DescriptorListener, DescriptorType.BRIDGE_EXTRA_INFOS); }
+ @Override public void processDescriptor(Descriptor descriptor, boolean relay) { if (descriptor instanceof ExtraInfoDescriptor && !relay) { this.processBridgeExtraInfoDescriptor( @@ -143,6 +147,7 @@ public class ClientsStatusUpdater implements DescriptorListener, return weightedResponses; }
+ @Override public void updateStatuses() { for (Map.Entry<String, SortedSet<ClientsHistory>> e : this.newResponses.entrySet()) { @@ -161,6 +166,7 @@ public class ClientsStatusUpdater implements DescriptorListener, } }
+ @Override public String getStatsString() { int newIntervals = 0; for (SortedSet<ClientsHistory> hist : this.newResponses.values()) { diff --git a/src/main/java/org/torproject/onionoo/updater/DescriptorSource.java b/src/main/java/org/torproject/onionoo/updater/DescriptorSource.java index b9d07b4..176a17c 100644 --- a/src/main/java/org/torproject/onionoo/updater/DescriptorSource.java +++ b/src/main/java/org/torproject/onionoo/updater/DescriptorSource.java @@ -32,6 +32,7 @@ public class DescriptorSource {
private DescriptorQueue archiveDescriptorQueue;
+ /** Instantiates a new descriptor source. */ public DescriptorSource() { this.descriptorQueues = new ArrayList<DescriptorQueue>(); this.descriptorListeners = @@ -53,6 +54,7 @@ public class DescriptorSource { private Map<DescriptorType, Set<DescriptorListener>> descriptorListeners;
+ /** Registers a descriptor listener for a given descriptor type. */ public void registerDescriptorListener(DescriptorListener listener, DescriptorType descriptorType) { if (!this.descriptorListeners.containsKey(descriptorType)) { @@ -62,6 +64,7 @@ public class DescriptorSource { this.descriptorListeners.get(descriptorType).add(listener); }
+ /** Downloads descriptors from CollecTor. */ public void downloadDescriptors() { for (DescriptorType descriptorType : DescriptorType.values()) { log.info("Loading: " + descriptorType); @@ -87,6 +90,8 @@ public class DescriptorSource { this.deletedLocalFiles += descriptorDownloader.deleteOldLocalFiles(); }
+ /** Reads archived and recent descriptors from disk and feeds them into + * any registered listeners. */ public void readDescriptors() { this.readArchivedDescriptors(); log.debug("Reading recent " + DescriptorType.RELAY_SERVER_DESCRIPTORS @@ -154,6 +159,8 @@ public class DescriptorSource { } }
+ /** Reads archived descriptors from disk and feeds them into any + * registered listeners. */ public void readArchivedDescriptors() { if (!this.inArchiveDir.exists()) { return; @@ -208,6 +215,7 @@ public class DescriptorSource { log.info("Read archived descriptors"); }
+ /** Writes parse histories for recent descriptors to disk. */ public void writeHistoryFiles() { log.debug("Writing parse histories for recent descriptors..."); for (DescriptorQueue descriptorQueue : this.descriptorQueues) { @@ -215,6 +223,8 @@ public class DescriptorSource { } }
+ /** Returns a string with statistics on the number of processed + * descriptors during the current execution. */ public String getStatsString() { StringBuilder sb = new StringBuilder(); sb.append(" " + this.localFilesBefore + " recent descriptor files " diff --git a/src/main/java/org/torproject/onionoo/updater/DescriptorSourceFactory.java b/src/main/java/org/torproject/onionoo/updater/DescriptorSourceFactory.java index 65c5622..4974488 100644 --- a/src/main/java/org/torproject/onionoo/updater/DescriptorSourceFactory.java +++ b/src/main/java/org/torproject/onionoo/updater/DescriptorSourceFactory.java @@ -7,11 +7,16 @@ public class DescriptorSourceFactory {
private static DescriptorSource descriptorSourceInstance;
+ /** Sets a custom singleton descriptor source instance that will be + * returned by {@link #getDescriptorSource()} rather than creating an + * instance upon first invocation. */ public static void setDescriptorSource( DescriptorSource descriptorSource) { descriptorSourceInstance = descriptorSource; }
+ /** Returns the singleton descriptor source instance that gets created + * upon first invocation of this method. */ public static DescriptorSource getDescriptorSource() { if (descriptorSourceInstance == null) { descriptorSourceInstance = new DescriptorSource(); diff --git a/src/main/java/org/torproject/onionoo/updater/LookupService.java b/src/main/java/org/torproject/onionoo/updater/LookupService.java index 85d56e8..2b0993f 100644 --- a/src/main/java/org/torproject/onionoo/updater/LookupService.java +++ b/src/main/java/org/torproject/onionoo/updater/LookupService.java @@ -97,6 +97,9 @@ public class LookupService { return addressNumber; }
+ /** Looks up address strings in the configured + * <code>GeoLite2-City-*.csv</code> and <code>GeoIPASNum2.csv</code> + * files and returns all lookup results. */ public SortedMap<String, LookupResult> lookup( SortedSet<String> addressStrings) {
@@ -363,6 +366,8 @@ public class LookupService {
private int addressesResolved = 0;
+ /** Returns a string with the number of addresses looked up and + * resolved. */ public String getStatsString() { StringBuilder sb = new StringBuilder(); sb.append(" " + FormattingUtils.formatDecimalNumber( diff --git a/src/main/java/org/torproject/onionoo/updater/NodeDetailsStatusUpdater.java b/src/main/java/org/torproject/onionoo/updater/NodeDetailsStatusUpdater.java index 9bceaa1..d873072 100644 --- a/src/main/java/org/torproject/onionoo/updater/NodeDetailsStatusUpdater.java +++ b/src/main/java/org/torproject/onionoo/updater/NodeDetailsStatusUpdater.java @@ -95,6 +95,9 @@ public class NodeDetailsStatusUpdater implements DescriptorListener,
private int bridgeStatusesProcessed = 0;
+ /** Initializes a new status updater, obtains references to all relevant + * singleton instances, and registers as listener at the (singleton) + * descriptor source. */ public NodeDetailsStatusUpdater( ReverseDomainNameResolver reverseDomainNameResolver, LookupService lookupService) { @@ -125,6 +128,7 @@ public class NodeDetailsStatusUpdater implements DescriptorListener,
private SortedSet<String> updatedNodes = new TreeSet<String>();
+ @Override public void processDescriptor(Descriptor descriptor, boolean relay) { if (descriptor instanceof ServerDescriptor && relay) { this.processRelayServerDescriptor((ServerDescriptor) descriptor); @@ -385,6 +389,7 @@ public class NodeDetailsStatusUpdater implements DescriptorListener, this.bridgeStatusesProcessed++; }
+ @Override public void updateStatuses() { this.readNodeStatuses(); log.info("Read node statuses"); @@ -927,6 +932,7 @@ public class NodeDetailsStatusUpdater implements DescriptorListener, } }
+ @Override public String getStatsString() { StringBuilder sb = new StringBuilder(); sb.append(" " + FormattingUtils.formatDecimalNumber( diff --git a/src/main/java/org/torproject/onionoo/updater/RdnsLookupRequest.java b/src/main/java/org/torproject/onionoo/updater/RdnsLookupRequest.java index e2ee5e1..75ad315 100644 --- a/src/main/java/org/torproject/onionoo/updater/RdnsLookupRequest.java +++ b/src/main/java/org/torproject/onionoo/updater/RdnsLookupRequest.java @@ -28,6 +28,7 @@ class RdnsLookupRequest extends Thread { this.address = address; }
+ @Override public void run() { this.lookupStartedMillis = this.reverseDomainNameResolver.time.currentTimeMillis(); diff --git a/src/main/java/org/torproject/onionoo/updater/RdnsLookupWorker.java b/src/main/java/org/torproject/onionoo/updater/RdnsLookupWorker.java index 0c48be5..165507b 100644 --- a/src/main/java/org/torproject/onionoo/updater/RdnsLookupWorker.java +++ b/src/main/java/org/torproject/onionoo/updater/RdnsLookupWorker.java @@ -11,6 +11,7 @@ class RdnsLookupWorker extends Thread { this.reverseDomainNameResolver = reverseDomainNameResolver; }
+ @Override public void run() { while (this.reverseDomainNameResolver.time.currentTimeMillis() - ReverseDomainNameResolver.RDNS_LOOKUP_MAX_DURATION_MILLIS diff --git a/src/main/java/org/torproject/onionoo/updater/ReverseDomainNameResolver.java b/src/main/java/org/torproject/onionoo/updater/ReverseDomainNameResolver.java index 0f3caad..3214c74 100644 --- a/src/main/java/org/torproject/onionoo/updater/ReverseDomainNameResolver.java +++ b/src/main/java/org/torproject/onionoo/updater/ReverseDomainNameResolver.java @@ -48,6 +48,8 @@ public class ReverseDomainNameResolver { this.addressLastLookupTimes = addressLastLookupTimes; }
+ /** Starts reverse domain name lookups in one or more background + * threads and returns immediately. */ public void startReverseDomainNameLookups() { this.startedRdnsLookups = this.time.currentTimeMillis(); this.rdnsLookupJobs = new HashSet<String>(); @@ -69,6 +71,8 @@ public class ReverseDomainNameResolver { } }
+ /** Joins all background threads performing reverse domain name lookups + * and returns as soon as they have all finished. */ public void finishReverseDomainNameLookups() { for (RdnsLookupWorker rdnsLookupWorker : this.rdnsLookupWorkers) { try { @@ -80,16 +84,21 @@ public class ReverseDomainNameResolver { } }
+ /** Returns reverse domain name lookup results. */ public Map<String, String> getLookupResults() { synchronized (this.rdnsLookupResults) { return new HashMap<String, String>(this.rdnsLookupResults); } }
+ /** Returns the time in milliseconds since the epoch when reverse domain + * lookups have been started. */ public long getLookupStartMillis() { return this.startedRdnsLookups; }
+ /** Returns a string with the number of performed reverse domain name + * lookups and some simple statistics on lookup time. */ public String getStatsString() { StringBuilder sb = new StringBuilder(); sb.append(" " + FormattingUtils.formatDecimalNumber( diff --git a/src/main/java/org/torproject/onionoo/updater/StatusUpdateRunner.java b/src/main/java/org/torproject/onionoo/updater/StatusUpdateRunner.java index 2ba8401..7aa1a5e 100644 --- a/src/main/java/org/torproject/onionoo/updater/StatusUpdateRunner.java +++ b/src/main/java/org/torproject/onionoo/updater/StatusUpdateRunner.java @@ -19,6 +19,8 @@ public class StatusUpdateRunner {
private StatusUpdater[] statusUpdaters;
+ /** Instantiates a new status update runner with newly created instances + * of all known status updater implementations. */ public StatusUpdateRunner() { this.ls = new LookupService(new File("geoip")); this.rdnr = new ReverseDomainNameResolver(); @@ -32,6 +34,7 @@ public class StatusUpdateRunner { usu }; }
+ /** Lets each configured status updater update its status files. */ public void updateStatuses() { for (StatusUpdater su : this.statusUpdaters) { log.debug("Begin update of " + su.getClass().getSimpleName()); @@ -41,6 +44,7 @@ public class StatusUpdateRunner { } }
+ /** Logs statistics of all configured status updaters. */ public void logStatistics() { for (StatusUpdater su : this.statusUpdaters) { String statsString = su.getStatsString(); diff --git a/src/main/java/org/torproject/onionoo/updater/UptimeStatusUpdater.java b/src/main/java/org/torproject/onionoo/updater/UptimeStatusUpdater.java index f2d7dc1..d4951b7 100644 --- a/src/main/java/org/torproject/onionoo/updater/UptimeStatusUpdater.java +++ b/src/main/java/org/torproject/onionoo/updater/UptimeStatusUpdater.java @@ -28,6 +28,9 @@ public class UptimeStatusUpdater implements DescriptorListener,
private DocumentStore documentStore;
+ /** Initializes a new status updater, obtains references to all relevant + * singleton instances, and registers as listener at the (singleton) + * descriptor source. */ public UptimeStatusUpdater() { this.descriptorSource = DescriptorSourceFactory.getDescriptorSource(); this.documentStore = DocumentStoreFactory.getDocumentStore(); @@ -41,6 +44,7 @@ public class UptimeStatusUpdater implements DescriptorListener, DescriptorType.BRIDGE_STATUSES); }
+ @Override public void processDescriptor(Descriptor descriptor, boolean relay) { if (descriptor instanceof RelayNetworkStatusConsensus) { this.processRelayNetworkStatusConsensus( @@ -132,6 +136,7 @@ public class UptimeStatusUpdater implements DescriptorListener, } }
+ @Override public void updateStatuses() { for (Map.Entry<String, SortedMap<Long, Flags>> e : this.newRunningRelays.entrySet()) { @@ -179,6 +184,7 @@ public class UptimeStatusUpdater implements DescriptorListener, } }
+ @Override public String getStatsString() { StringBuilder sb = new StringBuilder(); sb.append(" " + FormattingUtils.formatDecimalNumber( diff --git a/src/main/java/org/torproject/onionoo/updater/WeightsStatusUpdater.java b/src/main/java/org/torproject/onionoo/updater/WeightsStatusUpdater.java index 14e425b..2442a00 100644 --- a/src/main/java/org/torproject/onionoo/updater/WeightsStatusUpdater.java +++ b/src/main/java/org/torproject/onionoo/updater/WeightsStatusUpdater.java @@ -24,6 +24,9 @@ public class WeightsStatusUpdater implements DescriptorListener,
private DocumentStore documentStore;
+ /** Initializes a new status updater, obtains references to all relevant + * singleton instances, and registers as listener at the (singleton) + * descriptor source. */ public WeightsStatusUpdater() { this.descriptorSource = DescriptorSourceFactory.getDescriptorSource(); this.documentStore = DocumentStoreFactory.getDocumentStore(); @@ -35,6 +38,7 @@ public class WeightsStatusUpdater implements DescriptorListener, DescriptorType.RELAY_CONSENSUSES); }
+ @Override public void processDescriptor(Descriptor descriptor, boolean relay) { if (descriptor instanceof RelayNetworkStatusConsensus) { this.processRelayNetworkConsensus( @@ -42,6 +46,7 @@ public class WeightsStatusUpdater implements DescriptorListener, } }
+ @Override public void updateStatuses() { /* Nothing to do. */ } @@ -193,6 +198,7 @@ public class WeightsStatusUpdater implements DescriptorListener, return pathSelectionProbabilities; }
+ @Override public String getStatsString() { /* TODO Add statistics string. */ return null; diff --git a/src/main/java/org/torproject/onionoo/util/FormattingUtils.java b/src/main/java/org/torproject/onionoo/util/FormattingUtils.java index 36fb838..fd83cf8 100644 --- a/src/main/java/org/torproject/onionoo/util/FormattingUtils.java +++ b/src/main/java/org/torproject/onionoo/util/FormattingUtils.java @@ -12,11 +12,14 @@ public class FormattingUtils {
private static final long ONE_MINUTE = 60L * ONE_SECOND;
+ /** Formats the given number of milliseconds using the format + * <code>"${minutes}:${seconds}.{milliseconds} minutes"</code>. */ public static String formatMillis(long millis) { return String.format("%02d:%02d.%03d minutes", millis / ONE_MINUTE, (millis % ONE_MINUTE) / ONE_SECOND, millis % ONE_SECOND); }
+ /** Formats the given number of bytes as B, KiB, MiB, GiB, etc. */ public static String formatBytes(long bytes) { if (bytes < 1024) { return bytes + " B"; @@ -27,6 +30,8 @@ public class FormattingUtils { } }
+ /** Formats the given decimal number with a comma as thousands + * separator. */ public static String formatDecimalNumber(long decimalNumber) { return String.format("%,d", decimalNumber); } diff --git a/src/main/java/org/torproject/onionoo/util/TimeFactory.java b/src/main/java/org/torproject/onionoo/util/TimeFactory.java index e3067a4..608b595 100644 --- a/src/main/java/org/torproject/onionoo/util/TimeFactory.java +++ b/src/main/java/org/torproject/onionoo/util/TimeFactory.java @@ -7,10 +7,15 @@ public class TimeFactory {
private static Time timeInstance;
+ /** Sets a custom singleton time instance that will be returned by + * {@link #getTime} rather than creating an instance upon first + * invocation. */ public static void setTime(Time time) { timeInstance = time; }
+ /** Returns the singleton node indexer instance that gets created upon + * first invocation of this method. */ public static Time getTime() { if (timeInstance == null) { timeInstance = new Time(); diff --git a/src/main/java/org/torproject/onionoo/writer/BandwidthDocumentWriter.java b/src/main/java/org/torproject/onionoo/writer/BandwidthDocumentWriter.java index a844f7a..7238c1b 100644 --- a/src/main/java/org/torproject/onionoo/writer/BandwidthDocumentWriter.java +++ b/src/main/java/org/torproject/onionoo/writer/BandwidthDocumentWriter.java @@ -36,6 +36,7 @@ public class BandwidthDocumentWriter implements DocumentWriter { this.now = TimeFactory.getTime().currentTimeMillis(); }
+ @Override public void writeDocuments() { UpdateStatus updateStatus = this.documentStore.retrieve( UpdateStatus.class, true); @@ -196,6 +197,7 @@ public class BandwidthDocumentWriter implements DocumentWriter { return graphs; }
+ @Override public String getStatsString() { /* TODO Add statistics string. */ return null; diff --git a/src/main/java/org/torproject/onionoo/writer/ClientsDocumentWriter.java b/src/main/java/org/torproject/onionoo/writer/ClientsDocumentWriter.java index 6cbd2e0..00389d0 100644 --- a/src/main/java/org/torproject/onionoo/writer/ClientsDocumentWriter.java +++ b/src/main/java/org/torproject/onionoo/writer/ClientsDocumentWriter.java @@ -64,6 +64,7 @@ public class ClientsDocumentWriter implements DocumentWriter {
private int writtenDocuments = 0;
+ @Override public void writeDocuments() { UpdateStatus updateStatus = this.documentStore.retrieve( UpdateStatus.class, true); @@ -286,6 +287,7 @@ public class ClientsDocumentWriter implements DocumentWriter { } }
+ @Override public String getStatsString() { StringBuilder sb = new StringBuilder(); sb.append(" " + FormattingUtils.formatDecimalNumber( diff --git a/src/main/java/org/torproject/onionoo/writer/DetailsDocumentWriter.java b/src/main/java/org/torproject/onionoo/writer/DetailsDocumentWriter.java index 44c675f..c167152 100644 --- a/src/main/java/org/torproject/onionoo/writer/DetailsDocumentWriter.java +++ b/src/main/java/org/torproject/onionoo/writer/DetailsDocumentWriter.java @@ -31,6 +31,7 @@ public class DetailsDocumentWriter implements DocumentWriter { this.documentStore = DocumentStoreFactory.getDocumentStore(); }
+ @Override public void writeDocuments() { UpdateStatus updateStatus = this.documentStore.retrieve( UpdateStatus.class, true); @@ -186,6 +187,7 @@ public class DetailsDocumentWriter implements DocumentWriter { this.documentStore.store(detailsDocument, fingerprint); }
+ @Override public String getStatsString() { /* TODO Add statistics string. */ return null; diff --git a/src/main/java/org/torproject/onionoo/writer/DocumentWriterRunner.java b/src/main/java/org/torproject/onionoo/writer/DocumentWriterRunner.java index 4809ed9..d9d1c47 100644 --- a/src/main/java/org/torproject/onionoo/writer/DocumentWriterRunner.java +++ b/src/main/java/org/torproject/onionoo/writer/DocumentWriterRunner.java @@ -13,6 +13,8 @@ public class DocumentWriterRunner {
private DocumentWriter[] documentWriters;
+ /** Instantiates a new document writer runner with newly created + * instances of all known document writer implementations. */ public DocumentWriterRunner() { SummaryDocumentWriter sdw = new SummaryDocumentWriter(); DetailsDocumentWriter ddw = new DetailsDocumentWriter(); @@ -24,6 +26,7 @@ public class DocumentWriterRunner { udw }; }
+ /** Lets each configured document writer write its documents. */ public void writeDocuments() { for (DocumentWriter dw : this.documentWriters) { log.debug("Writing " + dw.getClass().getSimpleName()); @@ -31,6 +34,7 @@ public class DocumentWriterRunner { } }
+ /** Logs statistics of all configured document writers. */ public void logStatistics() { for (DocumentWriter dw : this.documentWriters) { String statsString = dw.getStatsString(); diff --git a/src/main/java/org/torproject/onionoo/writer/SummaryDocumentWriter.java b/src/main/java/org/torproject/onionoo/writer/SummaryDocumentWriter.java index f0d7fe0..f941ee3 100644 --- a/src/main/java/org/torproject/onionoo/writer/SummaryDocumentWriter.java +++ b/src/main/java/org/torproject/onionoo/writer/SummaryDocumentWriter.java @@ -32,6 +32,7 @@ public class SummaryDocumentWriter implements DocumentWriter {
private int deletedDocuments = 0;
+ @Override public void writeDocuments() { long relaysLastValidAfterMillis = -1L; long bridgesLastPublishedMillis = -1L; @@ -101,6 +102,7 @@ public class SummaryDocumentWriter implements DocumentWriter { log.info("Wrote summary document files"); }
+ @Override public String getStatsString() { StringBuilder sb = new StringBuilder(); sb.append(" " + FormattingUtils.formatDecimalNumber( diff --git a/src/main/java/org/torproject/onionoo/writer/UptimeDocumentWriter.java b/src/main/java/org/torproject/onionoo/writer/UptimeDocumentWriter.java index e93627b..502c351 100644 --- a/src/main/java/org/torproject/onionoo/writer/UptimeDocumentWriter.java +++ b/src/main/java/org/torproject/onionoo/writer/UptimeDocumentWriter.java @@ -40,6 +40,7 @@ public class UptimeDocumentWriter implements DocumentWriter { this.now = TimeFactory.getTime().currentTimeMillis(); }
+ @Override public void writeDocuments() { UptimeStatus uptimeStatus = this.documentStore.retrieve( UptimeStatus.class, true); @@ -318,6 +319,7 @@ public class UptimeDocumentWriter implements DocumentWriter { } }
+ @Override public String getStatsString() { StringBuilder sb = new StringBuilder(); sb.append(" " + FormattingUtils.formatDecimalNumber( diff --git a/src/main/java/org/torproject/onionoo/writer/WeightsDocumentWriter.java b/src/main/java/org/torproject/onionoo/writer/WeightsDocumentWriter.java index cabe964..326fbda 100644 --- a/src/main/java/org/torproject/onionoo/writer/WeightsDocumentWriter.java +++ b/src/main/java/org/torproject/onionoo/writer/WeightsDocumentWriter.java @@ -36,6 +36,7 @@ public class WeightsDocumentWriter implements DocumentWriter { this.now = TimeFactory.getTime().currentTimeMillis(); }
+ @Override public void writeDocuments() { UpdateStatus updateStatus = this.documentStore.retrieve( UpdateStatus.class, true); @@ -210,6 +211,7 @@ public class WeightsDocumentWriter implements DocumentWriter { } }
+ @Override public String getStatsString() { /* TODO Add statistics string. */ return null; diff --git a/src/test/resources/metrics_checks.xml b/src/test/resources/metrics_checks.xml index 0777894..a4af08a 100644 --- a/src/test/resources/metrics_checks.xml +++ b/src/test/resources/metrics_checks.xml @@ -34,6 +34,7 @@ <property name="eachLine" value="true"/> </module>
+ <module name="SuppressWarningsFilter" /> <module name="TreeWalker"> <module name="OuterTypeFilename"/> <module name="IllegalTokenText"> @@ -213,5 +214,6 @@ <property name="exceptionVariableName" value="expected"/> </module> <module name="CommentsIndentation"/> + <module name="SuppressWarningsHolder" /> </module> </module>