[tor-commits] [metrics-lib/master] Add an in-memory descriptor parser as source.

karsten at torproject.org karsten at torproject.org
Wed May 9 10:17:08 UTC 2012


commit 91aeedc3ab30a389b0652bcf3a810ea9e02f7237
Author: Karsten Loesing <karsten.loesing at gmx.net>
Date:   Wed May 9 12:15:09 2012 +0200

    Add an in-memory descriptor parser as source.
---
 .../torproject/descriptor/DescriptorParser.java    |   26 ++++++++++++++++++++
 .../descriptor/DescriptorSourceFactory.java        |    6 ++++
 .../descriptor/impl/DescriptorParserImpl.java      |   26 ++++++++++++++++++++
 .../descriptor/impl/DescriptorReaderImpl.java      |   18 +++++++-------
 4 files changed, 67 insertions(+), 9 deletions(-)

diff --git a/src/org/torproject/descriptor/DescriptorParser.java b/src/org/torproject/descriptor/DescriptorParser.java
new file mode 100644
index 0000000..09ae593
--- /dev/null
+++ b/src/org/torproject/descriptor/DescriptorParser.java
@@ -0,0 +1,26 @@
+/* Copyright 2012 The Tor Project
+ * See LICENSE for licensing information */
+package org.torproject.descriptor;
+
+import java.util.List;
+
+import org.torproject.descriptor.impl.DescriptorParseException;
+
+/* Parse descriptors that are already in memory instead of using the
+ * descriptor reader or downloader. */
+public interface DescriptorParser {
+
+  /* Fail descriptor parsing when encountering an unrecognized line.  This
+   * is not set by default, because the Tor specifications allow for new
+   * lines to be added that shall be ignored by older Tor versions.  But
+   * some applications may want to handle unrecognized descriptor lines
+   * explicitly. */
+  public void setFailUnrecognizedDescriptorLines(
+      boolean failUnrecognizedDescriptorLines);
+
+  /* Parse descriptors in the given byte array, possibly parsing the
+   * publication time from the file name (depending on the descriptor
+   * type). */
+  public List<Descriptor> parseDescriptors(byte[] rawDescriptorBytes,
+      String fileName) throws DescriptorParseException;
+}
diff --git a/src/org/torproject/descriptor/DescriptorSourceFactory.java b/src/org/torproject/descriptor/DescriptorSourceFactory.java
index 102bfce..bcd7d60 100644
--- a/src/org/torproject/descriptor/DescriptorSourceFactory.java
+++ b/src/org/torproject/descriptor/DescriptorSourceFactory.java
@@ -3,11 +3,17 @@
 package org.torproject.descriptor;
 
 import org.torproject.descriptor.impl.DescriptorDownloaderImpl;
+import org.torproject.descriptor.impl.DescriptorParserImpl;
 import org.torproject.descriptor.impl.DescriptorReaderImpl;
 
 /* Create descriptor source instances. */
 public class DescriptorSourceFactory {
 
+  /* Create a descriptor parser. */
+  public static DescriptorParser createDescriptorParser() {
+    return new DescriptorParserImpl();
+  }
+
   /* Create a descriptor reader. */
   public static DescriptorReader createDescriptorReader() {
     return new DescriptorReaderImpl();
diff --git a/src/org/torproject/descriptor/impl/DescriptorParserImpl.java b/src/org/torproject/descriptor/impl/DescriptorParserImpl.java
new file mode 100644
index 0000000..2ee6f40
--- /dev/null
+++ b/src/org/torproject/descriptor/impl/DescriptorParserImpl.java
@@ -0,0 +1,26 @@
+/* Copyright 2012 The Tor Project
+ * See LICENSE for licensing information */
+package org.torproject.descriptor.impl;
+
+import java.util.List;
+
+import org.torproject.descriptor.Descriptor;
+import org.torproject.descriptor.DescriptorParser;
+
+public class DescriptorParserImpl implements DescriptorParser {
+
+  private boolean failUnrecognizedDescriptorLines;
+
+  public void setFailUnrecognizedDescriptorLines(
+      boolean failUnrecognizedDescriptorLines) {
+    this.failUnrecognizedDescriptorLines =
+        failUnrecognizedDescriptorLines;
+  }
+
+  public List<Descriptor> parseDescriptors(byte[] rawDescriptorBytes,
+      String fileName) throws DescriptorParseException {
+    return DescriptorImpl.parseRelayOrBridgeDescriptors(
+        rawDescriptorBytes, fileName,
+        this.failUnrecognizedDescriptorLines);
+  }
+}
diff --git a/src/org/torproject/descriptor/impl/DescriptorReaderImpl.java b/src/org/torproject/descriptor/impl/DescriptorReaderImpl.java
index e82d039..ddb6ea6 100644
--- a/src/org/torproject/descriptor/impl/DescriptorReaderImpl.java
+++ b/src/org/torproject/descriptor/impl/DescriptorReaderImpl.java
@@ -25,6 +25,7 @@ import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
 import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
 import org.torproject.descriptor.Descriptor;
 import org.torproject.descriptor.DescriptorFile;
+import org.torproject.descriptor.DescriptorParser;
 import org.torproject.descriptor.DescriptorReader;
 
 public class DescriptorReaderImpl implements DescriptorReader {
@@ -87,7 +88,7 @@ public class DescriptorReaderImpl implements DescriptorReader {
     private List<File> tarballs;
     private BlockingIteratorImpl<DescriptorFile> descriptorQueue;
     private File historyFile;
-    private boolean failUnrecognizedDescriptorLines;
+    private DescriptorParser descriptorParser;
     private DescriptorReaderRunnable(List<File> directories,
         List<File> tarballs,
         BlockingIteratorImpl<DescriptorFile> descriptorQueue,
@@ -96,8 +97,9 @@ public class DescriptorReaderImpl implements DescriptorReader {
       this.tarballs = tarballs;
       this.descriptorQueue = descriptorQueue;
       this.historyFile = historyFile;
-      this.failUnrecognizedDescriptorLines =
-          failUnrecognizedDescriptorLines;
+      this.descriptorParser = new DescriptorParserImpl();
+      this.descriptorParser.setFailUnrecognizedDescriptorLines(
+          failUnrecognizedDescriptorLines);
     }
     public void run() {
       this.readOldHistory();
@@ -245,9 +247,8 @@ public class DescriptorReaderImpl implements DescriptorReader {
                 String fileName = tae.getName().substring(
                     tae.getName().lastIndexOf("/") + 1);
                 List<Descriptor> parsedDescriptors =
-                    DescriptorImpl.parseRelayOrBridgeDescriptors(
-                    rawDescriptorBytes, fileName,
-                    this.failUnrecognizedDescriptorLines);
+                    this.descriptorParser.parseDescriptors(
+                    rawDescriptorBytes, fileName);
                 descriptorFile.setDescriptors(parsedDescriptors);
               } catch (DescriptorParseException e) {
                 descriptorFile.setException(e);
@@ -272,9 +273,8 @@ public class DescriptorReaderImpl implements DescriptorReader {
       }
       bis.close();
       byte[] rawDescriptorBytes = baos.toByteArray();
-      return DescriptorImpl.parseRelayOrBridgeDescriptors(
-          rawDescriptorBytes, file.getName(),
-          this.failUnrecognizedDescriptorLines);
+      return this.descriptorParser.parseDescriptors(rawDescriptorBytes,
+          file.getName());
     }
   }
 }



More information about the tor-commits mailing list