Repository: incubator-pirk
Updated Branches:
  refs/heads/master 3957be411 -> 53f548a87


Enhancements to Wideskies encrypt/decrypt -- closes apache/incubator-pirk#81


Project: http://git-wip-us.apache.org/repos/asf/incubator-pirk/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-pirk/commit/53f548a8
Tree: http://git-wip-us.apache.org/repos/asf/incubator-pirk/tree/53f548a8
Diff: http://git-wip-us.apache.org/repos/asf/incubator-pirk/diff/53f548a8

Branch: refs/heads/master
Commit: 53f548a87b48015c820ab63c92d64840abf6f33b
Parents: 3957be4
Author: tellison <telli...@apache.org>
Authored: Sat Aug 27 11:25:19 2016 -0400
Committer: eawilliams <eawilli...@apache.org>
Committed: Sat Aug 27 11:25:19 2016 -0400

----------------------------------------------------------------------
 .../apache/pirk/querier/wideskies/Querier.java  |   8 +-
 .../pirk/querier/wideskies/QuerierDriver.java   |  10 +-
 .../wideskies/decrypt/DecryptResponse.java      |  60 ++------
 .../wideskies/decrypt/DecryptResponseTask.java  |   2 +-
 .../querier/wideskies/encrypt/EncryptQuery.java | 145 +++++++++----------
 .../partitioner/PrimitiveTypePartitioner.java   |   2 +-
 .../distributed/testsuite/DistTestSuite.java    |  14 +-
 .../apache/pirk/test/utils/StandaloneQuery.java |  17 +--
 .../org/apache/pirk/test/utils/TestUtils.java   |   8 +-
 .../java/org/apache/pirk/utils/FileIOUtils.java |  24 +--
 .../apache/pirk/utils/QueryResultsWriter.java   |  73 ++++++++++
 11 files changed, 188 insertions(+), 175 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-pirk/blob/53f548a8/src/main/java/org/apache/pirk/querier/wideskies/Querier.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/pirk/querier/wideskies/Querier.java 
b/src/main/java/org/apache/pirk/querier/wideskies/Querier.java
index 172e1e5..b63e06e 100644
--- a/src/main/java/org/apache/pirk/querier/wideskies/Querier.java
+++ b/src/main/java/org/apache/pirk/querier/wideskies/Querier.java
@@ -19,8 +19,8 @@
 package org.apache.pirk.querier.wideskies;
 
 import java.io.Serializable;
-import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.pirk.encryption.Paillier;
 import org.apache.pirk.query.wideskies.Query;
@@ -42,9 +42,9 @@ public class Querier implements Serializable, Storable
   // map to check the embedded selectors in the results for false positives;
   // if the selector is a fixed size < 32 bits, it is included as is
   // if the selector is of variable lengths
-  private HashMap<Integer,String> embedSelectorMap = null;
+  private Map<Integer,String> embedSelectorMap = null;
 
-  public Querier(List<String> selectorsInput, Paillier paillierInput, Query 
queryInput, HashMap<Integer,String> embedSelectorMapInput)
+  public Querier(List<String> selectorsInput, Paillier paillierInput, Query 
queryInput, Map<Integer,String> embedSelectorMapInput)
   {
     selectors = selectorsInput;
 
@@ -70,7 +70,7 @@ public class Querier implements Serializable, Storable
     return selectors;
   }
 
-  public HashMap<Integer,String> getEmbedSelectorMap()
+  public Map<Integer,String> getEmbedSelectorMap()
   {
     return embedSelectorMap;
   }

http://git-wip-us.apache.org/repos/asf/incubator-pirk/blob/53f548a8/src/main/java/org/apache/pirk/querier/wideskies/QuerierDriver.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/pirk/querier/wideskies/QuerierDriver.java 
b/src/main/java/org/apache/pirk/querier/wideskies/QuerierDriver.java
index 4f26a71..c1a4e4a 100644
--- a/src/main/java/org/apache/pirk/querier/wideskies/QuerierDriver.java
+++ b/src/main/java/org/apache/pirk/querier/wideskies/QuerierDriver.java
@@ -33,6 +33,7 @@ import org.apache.pirk.schema.query.QuerySchemaRegistry;
 import org.apache.pirk.serialization.LocalFileSystemStore;
 import org.apache.pirk.utils.FileIOUtils;
 import org.apache.pirk.utils.PIRException;
+import org.apache.pirk.utils.QueryResultsWriter;
 import org.apache.pirk.utils.SystemConfiguration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -188,13 +189,13 @@ public class QuerierDriver implements Serializable
 
       // Perform the encryption
       EncryptQuery encryptQuery = new EncryptQuery(queryInfo, selectors, 
paillier);
-      encryptQuery.encrypt(numThreads);
+      Querier querier = encryptQuery.encrypt(numThreads);
 
       // Write necessary output files - two files written -
       // (1) Querier object to <outputFile>-QuerierConst.QUERIER_FILETAG
       // (2) Query object to <outputFile>-QuerierConst.QUERY_FILETAG
-      storage.store(outputFile + "-" + QuerierConst.QUERIER_FILETAG, 
encryptQuery.getQuerier());
-      storage.store(outputFile + "-" + QuerierConst.QUERY_FILETAG, 
encryptQuery.getQuery());
+      storage.store(outputFile + "-" + QuerierConst.QUERIER_FILETAG, querier);
+      storage.store(outputFile + "-" + QuerierConst.QUERY_FILETAG, 
querier.getQuery());
     }
     else
     // Decryption
@@ -214,8 +215,7 @@ public class QuerierDriver implements Serializable
 
       // Perform decryption and output the result file
       DecryptResponse decryptResponse = new DecryptResponse(response, querier);
-      decryptResponse.decrypt(numThreads);
-      decryptResponse.writeResultFile(outputFile);
+      QueryResultsWriter.writeResultFile(outputFile, 
decryptResponse.decrypt(numThreads));
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-pirk/blob/53f548a8/src/main/java/org/apache/pirk/querier/wideskies/decrypt/DecryptResponse.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/pirk/querier/wideskies/decrypt/DecryptResponse.java 
b/src/main/java/org/apache/pirk/querier/wideskies/decrypt/DecryptResponse.java
index dbf2381..eae288f 100644
--- 
a/src/main/java/org/apache/pirk/querier/wideskies/decrypt/DecryptResponse.java
+++ 
b/src/main/java/org/apache/pirk/querier/wideskies/decrypt/DecryptResponse.java
@@ -18,16 +18,11 @@
  */
 package org.apache.pirk.querier.wideskies.decrypt;
 
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
 import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.TreeMap;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
@@ -42,6 +37,7 @@ import org.apache.pirk.query.wideskies.QueryInfo;
 import org.apache.pirk.response.wideskies.Response;
 import org.apache.pirk.schema.response.QueryResponseJSON;
 import org.apache.pirk.utils.PIRException;
+import org.apache.pirk.utils.SystemConfiguration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -58,14 +54,18 @@ public class DecryptResponse
 
   private final Querier querier;
 
-  private final Map<String,List<QueryResponseJSON>> resultMap = new 
HashMap<>(); // selector -> ArrayList of hits
-
   public DecryptResponse(Response responseInput, Querier querierInput)
   {
     response = responseInput;
     querier = querierInput;
   }
 
+  public Map<String,List<QueryResponseJSON>> decrypt() throws 
InterruptedException, PIRException
+  {
+    int numThreads = SystemConfiguration.getIntProperty("numThreads", 1);
+    return decrypt(numThreads);
+  }
+
   /**
    * Method to decrypt the response elements and reconstructs the data elements
    * <p>
@@ -86,8 +86,10 @@ public class DecryptResponse
    * where D^k_r,l = Y_{r*numPartitionsPerDataElement + l} & 
(2^{r*numPartitionsPerDataElement} * (2^numBitsPerDataElement - 1))
    *
    */
-  public void decrypt(int numThreads) throws InterruptedException, PIRException
+  public Map<String,List<QueryResponseJSON>> decrypt(int numThreads) throws 
InterruptedException, PIRException
   {
+    Map<String,List<QueryResponseJSON>> resultMap = new HashMap<>(); // 
selector -> ArrayList of hits
+    
     QueryInfo queryInfo = response.getQueryInfo();
 
     Paillier paillier = querier.getPaillier();
@@ -159,8 +161,10 @@ public class DecryptResponse
     }
 
     es.shutdown();
+    
+    return resultMap;
   }
-
+  
   // Method to perform basic decryption of each raw response element - does not
   // extract and reconstruct the data elements
   private List<BigInteger> decryptElements(TreeMap<Integer,BigInteger> 
elements, Paillier paillier)
@@ -174,42 +178,4 @@ public class DecryptResponse
 
     return decryptedElements;
   }
-
-  /**
-   * Writes elements of the resultMap to output file, one line for each 
element, where each line is a string representation of the corresponding
-   * QueryResponseJSON object
-   */
-  public void writeResultFile(String filename) throws IOException
-  {
-    try (BufferedWriter bw = new BufferedWriter(new FileWriter(new 
File(filename))))
-    {
-      for (Entry<String,List<QueryResponseJSON>> entry : resultMap.entrySet())
-      {
-        for (QueryResponseJSON hitJSON : entry.getValue())
-        {
-          bw.write(hitJSON.getJSONString());
-          bw.newLine();
-        }
-      }
-    }
-  }
-
-  /**
-   * Writes elements of the resultMap to output file, one line for each 
element, where each line is a string representation of the corresponding
-   * QueryResponseJSON object
-   */
-  public void writeResultFile(File file) throws IOException
-  {
-    try (BufferedWriter bw = new BufferedWriter(new FileWriter(file)))
-    {
-      for (Entry<String,List<QueryResponseJSON>> entry : resultMap.entrySet())
-      {
-        for (QueryResponseJSON hitJSON : entry.getValue())
-        {
-          bw.write(hitJSON.getJSONString());
-          bw.newLine();
-        }
-      }
-    }
-  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-pirk/blob/53f548a8/src/main/java/org/apache/pirk/querier/wideskies/decrypt/DecryptResponseTask.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/pirk/querier/wideskies/decrypt/DecryptResponseTask.java
 
b/src/main/java/org/apache/pirk/querier/wideskies/decrypt/DecryptResponseTask.java
index 3f5a982..ab02094 100644
--- 
a/src/main/java/org/apache/pirk/querier/wideskies/decrypt/DecryptResponseTask.java
+++ 
b/src/main/java/org/apache/pirk/querier/wideskies/decrypt/DecryptResponseTask.java
@@ -73,7 +73,7 @@ class DecryptResponseTask<V> implements 
Callable<Map<String,List<QueryResponseJS
     String selectorName = qSchema.getSelectorName();
 
     // Result is a map of (selector -> List of hits).
-    Map<String,List<QueryResponseJSON>> resultMap = new HashMap<>();
+    Map<String,List<QueryResponseJSON>> resultMap = new 
HashMap<>(selectors.size());
     for (String selector : selectors.values())
     {
       resultMap.put(selector, new ArrayList<QueryResponseJSON>());

http://git-wip-us.apache.org/repos/asf/incubator-pirk/blob/53f548a8/src/main/java/org/apache/pirk/querier/wideskies/encrypt/EncryptQuery.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/pirk/querier/wideskies/encrypt/EncryptQuery.java 
b/src/main/java/org/apache/pirk/querier/wideskies/encrypt/EncryptQuery.java
index 4dd90f7..60ba859 100644
--- a/src/main/java/org/apache/pirk/querier/wideskies/encrypt/EncryptQuery.java
+++ b/src/main/java/org/apache/pirk/querier/wideskies/encrypt/EncryptQuery.java
@@ -56,103 +56,90 @@ public class EncryptQuery
 {
   private static final Logger logger = 
LoggerFactory.getLogger(EncryptQuery.class);
 
-  private final QueryInfo queryInfo; // contains basic query information and 
functionality
+  // Contains basic query information.
+  private final QueryInfo queryInfo;
 
-  private Query query = null; // contains the query vectors
+  // Selectors for this query.
+  private final List<String> selectors;
 
-  private Querier querier = null; // contains the query vectors and encryption 
object
+  // Paillier encryption functionality.
+  private final Paillier paillier;
 
-  private final Paillier paillier; // Paillier encryption functionality
-
-  private List<String> selectors = null; // selectors for the query
-
-  // Map to check the embedded selectors in the results for false positives;
-  // if the selector is a fixed size < 32 bits, it is included as is
-  // if the selector is of variable lengths
-  private HashMap<Integer,String> embedSelectorMap = null;
-
-  public EncryptQuery(QueryInfo queryInfoInput, List<String> selectorsInput, 
Paillier paillierInput)
-  {
-    queryInfo = queryInfoInput;
-
-    selectors = selectorsInput;
-
-    paillier = paillierInput;
-
-    embedSelectorMap = new HashMap<>();
-  }
-
-  public Paillier getPaillier()
-  {
-    return paillier;
-  }
-
-  public QueryInfo getQueryInfo()
-  {
-    return queryInfo;
-  }
-
-  public Query getQuery()
-  {
-    return query;
-  }
-
-  public Querier getQuerier()
-  {
-    return querier;
-  }
-
-  public List<String> getSelectors()
-  {
-    return selectors;
-  }
-
-  public HashMap<Integer,String> getEmbedSelectorMap()
+  /**
+   * Constructs a query encryptor using the given query information, 
selectors, and Paillier cryptosystem.
+   * 
+   * @param queryInfo
+   *          Fundamental information about the query.
+   * @param selectors
+   *          the list of selectors for this query.
+   * @param paillier
+   *          the Paillier cryptosystem to use.
+   */
+  public EncryptQuery(QueryInfo queryInfo, List<String> selectors, Paillier 
paillier)
   {
-    return embedSelectorMap;
+    this.queryInfo = queryInfo;
+    this.selectors = selectors;
+    this.paillier = paillier;
   }
 
   /**
-   * Encrypt, building the Query object, calculating and setting the query 
vectors.
+   * Encrypts the query described by the query information using Paillier 
encryption.
+   * <p>
+   * The encryption builds a <code>Querier</code> object, calculating and 
setting the query vectors.
    * <p>
    * Uses the system configured number of threads to conduct the encryption, 
or a single thread if the configuration has not been set.
    * 
    * @throws InterruptedException
-   *           if the task was interrupted during encryption.
+   *           If the task was interrupted during encryption.
    * @throws PIRException
+   *           If a problem occurs performing the encryption.
+   * @return The querier containing the query, and all information required to 
perform decryption.
    */
-  public void encrypt() throws InterruptedException, PIRException
+  public Querier encrypt() throws InterruptedException, PIRException
   {
     int numThreads = SystemConfiguration.getIntProperty("numThreads", 1);
-    encrypt(numThreads);
+    return encrypt(numThreads);
   }
 
   /**
-   * Encrypt, building the Query object, calculating and setting the query 
vectors
+   * Encrypts the query described by the query information using Paillier 
encryption using the given number of threads.
+   * <p>
+   * The encryption builds a <code>Querier</code> object, calculating and 
setting the query vectors.
    * <p>
    * If we have hash collisions over our selector set, we will append integers 
to the key starting with 0 until we no longer have collisions.
    * <p>
    * For encrypted query vector E = <E_0, ..., E_{(2^hashBitSize)-1}>:
    * <p>
    * E_i = 2^{j*dataPartitionBitSize} if i = H_k(selector_j) 0 otherwise
+   * 
+   * @param numThreads
+   *          the number of threads to use when performing the encryption.
+   * @throws InterruptedException
+   *           If the task was interrupted during encryption.
+   * @throws PIRException
+   *           If a problem occurs performing the encryption.
+   * @return The querier containing the query, and all information required to 
perform decryption.
    */
-  public void encrypt(int numThreads) throws InterruptedException, PIRException
+  public Querier encrypt(int numThreads) throws InterruptedException, 
PIRException
   {
-    query = new Query(queryInfo, paillier.getN());
+    Query query = new Query(queryInfo, paillier.getN());
 
     // Determine the query vector mappings for the selectors; vecPosition -> 
selectorNum
     Map<Integer,Integer> selectorQueryVecMapping = 
computeSelectorQueryVecMap();
 
     // Form the embedSelectorMap
-    populateEmbeddedSelectorMap();
+    // Map to check the embedded selectors in the results for false positives;
+    // if the selector is a fixed size < 32 bits, it is included as is
+    // if the selector is of variable lengths
+    Map<Integer,String> embedSelectorMap = computeEmbeddedSelectorMap();
 
     if (numThreads == 1)
     {
-      serialEncrypt(selectorQueryVecMapping);
+      serialEncrypt(query, selectorQueryVecMapping);
     }
     else
     {
-      parallelEncrypt(Math.max(2, numThreads), selectorQueryVecMapping);
+      parallelEncrypt(Math.max(2, numThreads), query, selectorQueryVecMapping);
     }
 
     // Generate the expTable in Query, if we are using it and if
@@ -163,8 +150,8 @@ public class EncryptQuery
       query.generateExpTable();
     }
 
-    // Set the Querier object
-    querier = new Querier(selectors, paillier, query, embedSelectorMap);
+    // Return the Querier object.
+    return new Querier(selectors, paillier, query, embedSelectorMap);
   }
 
   private Map<Integer,Integer> computeSelectorQueryVecMap()
@@ -200,31 +187,30 @@ public class EncryptQuery
     return selectorQueryVecMapping;
   }
 
-  private void populateEmbeddedSelectorMap()
+  private Map<Integer,String> computeEmbeddedSelectorMap() throws PIRException
   {
     QuerySchema qSchema = QuerySchemaRegistry.get(queryInfo.getQueryType());
+    String selectorName = qSchema.getSelectorName();
     DataSchema dSchema = DataSchemaRegistry.get(qSchema.getDataSchemaName());
-    String type = dSchema.getElementType(qSchema.getSelectorName());
+    String type = dSchema.getElementType(selectorName);
+
+    Map<Integer,String> embedSelectorMap = new HashMap<>(selectors.size());
+
     int sNum = 0;
     for (String selector : selectors)
     {
-      String embeddedSelector = null;
-      try
-      {
-        embeddedSelector = QueryUtils.getEmbeddedSelector(selector, type, 
dSchema.getPartitionerForElement(qSchema.getSelectorName()));
-      } catch (Exception e)
-      {
-        logger.info("Caught exception for selector = " + selector);
-        e.printStackTrace();
-        // TODO: Check: should continue?
-      }
-
+      String embeddedSelector = QueryUtils.getEmbeddedSelector(selector, type, 
dSchema.getPartitionerForElement(selectorName));
       embedSelectorMap.put(sNum, embeddedSelector);
-      ++sNum;
+      sNum += 1;
     }
+
+    return embedSelectorMap;
   }
 
-  private void serialEncrypt(Map<Integer,Integer> selectorQueryVecMapping) 
throws PIRException
+  /*
+   * Perform the encryption using a single thread, and avoiding the overhead 
of thread management.
+   */
+  private void serialEncrypt(Query query, Map<Integer,Integer> 
selectorQueryVecMapping) throws PIRException
   {
     int numElements = 1 << queryInfo.getHashBitSize(); // 2^hashBitSize
 
@@ -234,7 +220,10 @@ public class EncryptQuery
     logger.info("Completed serial creation of encrypted query vectors");
   }
 
-  private void parallelEncrypt(int numThreads, Map<Integer,Integer> 
selectorQueryVecMapping) throws InterruptedException, PIRException
+  /*
+   * Performs the encryption with numThreads.
+   */
+  private void parallelEncrypt(int numThreads, Query query, 
Map<Integer,Integer> selectorQueryVecMapping) throws InterruptedException, 
PIRException
   {
     // Encrypt and form the query vector
     ExecutorService es = Executors.newCachedThreadPool();

http://git-wip-us.apache.org/repos/asf/incubator-pirk/blob/53f548a8/src/main/java/org/apache/pirk/schema/data/partitioner/PrimitiveTypePartitioner.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/pirk/schema/data/partitioner/PrimitiveTypePartitioner.java
 
b/src/main/java/org/apache/pirk/schema/data/partitioner/PrimitiveTypePartitioner.java
index 7559441..d222ec0 100644
--- 
a/src/main/java/org/apache/pirk/schema/data/partitioner/PrimitiveTypePartitioner.java
+++ 
b/src/main/java/org/apache/pirk/schema/data/partitioner/PrimitiveTypePartitioner.java
@@ -32,7 +32,7 @@ import org.slf4j.LoggerFactory;
  * Class for partitioning objects with primitive Java types
  * 
  */
-public class PrimitiveTypePartitioner implements DataPartitioner
+public final class PrimitiveTypePartitioner implements DataPartitioner
 {
   private static final long serialVersionUID = 1L;
 

http://git-wip-us.apache.org/repos/asf/incubator-pirk/blob/53f548a8/src/main/java/org/apache/pirk/test/distributed/testsuite/DistTestSuite.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/pirk/test/distributed/testsuite/DistTestSuite.java 
b/src/main/java/org/apache/pirk/test/distributed/testsuite/DistTestSuite.java
index f44815a..d02bb87 100644
--- 
a/src/main/java/org/apache/pirk/test/distributed/testsuite/DistTestSuite.java
+++ 
b/src/main/java/org/apache/pirk/test/distributed/testsuite/DistTestSuite.java
@@ -42,6 +42,7 @@ import org.apache.pirk.test.distributed.DistributedTestDriver;
 import org.apache.pirk.test.utils.BaseTests;
 import org.apache.pirk.test.utils.Inputs;
 import org.apache.pirk.test.utils.TestUtils;
+import org.apache.pirk.utils.QueryResultsWriter;
 import org.apache.pirk.utils.SystemConfiguration;
 import org.apache.spark.launcher.SparkLauncher;
 import org.json.simple.JSONObject;
@@ -434,16 +435,12 @@ public class DistTestSuite
     // Perform the encryption
     logger.info("Performing encryption of the selectors - forming encrypted 
query vectors:");
     EncryptQuery encryptQuery = new EncryptQuery(queryInfo, selectors, 
paillier);
-    encryptQuery.encrypt(numThreads);
+    Querier querier = encryptQuery.encrypt(numThreads);
     logger.info("Completed encryption of the selectors - completed formation 
of the encrypted query vectors:");
 
-    // Grab the necessary objects
-    Querier querier = encryptQuery.getQuerier();
-    Query query = encryptQuery.getQuery();
-
-    // Write the Querier object to a file
+    // Write the Query object to a file
     Path queryInputDirPath = new Path(queryInputDir);
-    new HadoopFileSystemStore(fs).store(queryInputDirPath, query);
+    new HadoopFileSystemStore(fs).store(queryInputDirPath, querier.getQuery());
     fs.deleteOnExit(queryInputDirPath);
 
     // Grab the original data and query schema properties to reset upon 
completion
@@ -542,8 +539,7 @@ public class DistTestSuite
 
     // Perform decryption and output the result file
     DecryptResponse decryptResponse = new DecryptResponse(response, querier);
-    decryptResponse.decrypt(numThreads);
-    decryptResponse.writeResultFile(fileFinalResults);
+    QueryResultsWriter.writeResultFile(fileFinalResults, 
decryptResponse.decrypt(numThreads));
     logger.info("Completed performing decryption and writing final results 
file");
 
     // Read in results

http://git-wip-us.apache.org/repos/asf/incubator-pirk/blob/53f548a8/src/main/java/org/apache/pirk/test/utils/StandaloneQuery.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/pirk/test/utils/StandaloneQuery.java 
b/src/main/java/org/apache/pirk/test/utils/StandaloneQuery.java
index afac2b0..b86d78c 100644
--- a/src/main/java/org/apache/pirk/test/utils/StandaloneQuery.java
+++ b/src/main/java/org/apache/pirk/test/utils/StandaloneQuery.java
@@ -22,8 +22,8 @@ import static org.junit.Assert.fail;
 
 import java.io.File;
 import java.io.IOException;
-import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.pirk.encryption.Paillier;
 import org.apache.pirk.querier.wideskies.Querier;
@@ -40,6 +40,7 @@ import org.apache.pirk.schema.query.QuerySchemaRegistry;
 import org.apache.pirk.schema.response.QueryResponseJSON;
 import org.apache.pirk.serialization.LocalFileSystemStore;
 import org.apache.pirk.utils.PIRException;
+import org.apache.pirk.utils.QueryResultsWriter;
 import org.apache.pirk.utils.SystemConfiguration;
 import org.json.simple.JSONObject;
 import org.slf4j.Logger;
@@ -94,22 +95,21 @@ public class StandaloneQuery
     // Perform the encryption
     logger.info("Performing encryption of the selectors - forming encrypted 
query vectors:");
     EncryptQuery encryptQuery = new EncryptQuery(queryInfo, selectors, 
paillier);
-    encryptQuery.encrypt(numThreads);
+    Querier querier = encryptQuery.encrypt(numThreads);
     logger.info("Completed encryption of the selectors - completed formation 
of the encrypted query vectors:");
 
     // Dork with the embedSelectorMap to generate a false positive for the 
last valid selector in selectors
     if (testFalsePositive)
     {
-      Querier querier = encryptQuery.getQuerier();
-      HashMap<Integer,String> embedSelectorMap = querier.getEmbedSelectorMap();
+      Map<Integer,String> embedSelectorMap = querier.getEmbedSelectorMap();
       logger.info("embedSelectorMap((embedSelectorMap.size()-2)) = " + 
embedSelectorMap.get((embedSelectorMap.size() - 2)) + " selector = "
           + selectors.get((embedSelectorMap.size() - 2)));
       embedSelectorMap.put((embedSelectorMap.size() - 2), 
"fakeEmbeddedSelector");
     }
 
     // Write necessary output files
-    storage.store(fileQuerier, encryptQuery.getQuerier());
-    storage.store(fileQuery, encryptQuery.getQuery());
+    storage.store(fileQuerier, querier);
+    storage.store(fileQuery, querier.getQuery());
 
     // Perform the PIR query and build the response elements
     logger.info("Performing the PIR Query and constructing the response 
elements:");
@@ -141,12 +141,11 @@ public class StandaloneQuery
     // Reconstruct the necessary objects from the files
     logger.info("Performing decryption; writing final results file");
     Response responseIn = storage.recall(fileResponse, Response.class);
-    Querier querier = storage.recall(fileQuerier, Querier.class);
+    querier = storage.recall(fileQuerier, Querier.class);
 
     // Perform decryption and output the result file
     DecryptResponse decryptResponse = new DecryptResponse(responseIn, querier);
-    decryptResponse.decrypt(numThreads);
-    decryptResponse.writeResultFile(fileFinalResults);
+    QueryResultsWriter.writeResultFile(fileFinalResults, 
decryptResponse.decrypt(numThreads));
     logger.info("Completed performing decryption and writing final results 
file");
 
     // Read in results

http://git-wip-us.apache.org/repos/asf/incubator-pirk/blob/53f548a8/src/main/java/org/apache/pirk/test/utils/TestUtils.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/pirk/test/utils/TestUtils.java 
b/src/main/java/org/apache/pirk/test/utils/TestUtils.java
index 1ea01fb..6573a12 100644
--- a/src/main/java/org/apache/pirk/test/utils/TestUtils.java
+++ b/src/main/java/org/apache/pirk/test/utils/TestUtils.java
@@ -21,6 +21,7 @@ package org.apache.pirk.test.utils;
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
 import java.io.File;
+import java.io.FileNotFoundException;
 import java.io.FileReader;
 import java.io.FileWriter;
 import java.io.IOException;
@@ -267,8 +268,10 @@ public class TestUtils
 
   /**
    * Converts the result file into an ArrayList of QueryResponseJSON objects
+   * @throws IOException 
+   * @throws FileNotFoundException 
    */
-  public static List<QueryResponseJSON> readResultsFile(File file)
+  public static List<QueryResponseJSON> readResultsFile(File file) throws 
FileNotFoundException, IOException
   {
     List<QueryResponseJSON> results = new ArrayList<>();
     try (BufferedReader br = new BufferedReader(new FileReader(file)))
@@ -279,9 +282,6 @@ public class TestUtils
         QueryResponseJSON jsonResult = new QueryResponseJSON(line);
         results.add(jsonResult);
       }
-    } catch (Exception e)
-    {
-      logger.error(e.toString());
     }
 
     return results;

http://git-wip-us.apache.org/repos/asf/incubator-pirk/blob/53f548a8/src/main/java/org/apache/pirk/utils/FileIOUtils.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/pirk/utils/FileIOUtils.java 
b/src/main/java/org/apache/pirk/utils/FileIOUtils.java
index 8924a86..9fd0dec 100644
--- a/src/main/java/org/apache/pirk/utils/FileIOUtils.java
+++ b/src/main/java/org/apache/pirk/utils/FileIOUtils.java
@@ -119,28 +119,18 @@ public class FileIOUtils
 
   public static void writeArrayList(ArrayList<String> aList, File file) throws 
IOException
   {
-    FileOutputStream fos = new FileOutputStream(file);
-    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));
-
-    for (String s : aList)
+    try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new 
FileOutputStream(file))))
     {
-      bw.write(s);
-      bw.newLine();
+      for (String s : aList)
+      {
+        bw.write(s);
+        bw.newLine();
+      }
     }
-    bw.close();
   }
 
   public static void writeArrayList(ArrayList<String> aList, String filename) 
throws IOException
   {
-    File file = new File(filename);
-    FileOutputStream fos = new FileOutputStream(file);
-    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));
-
-    for (String s : aList)
-    {
-      bw.write(s);
-      bw.newLine();
-    }
-    bw.close();
+    writeArrayList(aList, new File(filename));
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-pirk/blob/53f548a8/src/main/java/org/apache/pirk/utils/QueryResultsWriter.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/pirk/utils/QueryResultsWriter.java 
b/src/main/java/org/apache/pirk/utils/QueryResultsWriter.java
new file mode 100644
index 0000000..65470e4
--- /dev/null
+++ b/src/main/java/org/apache/pirk/utils/QueryResultsWriter.java
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.pirk.utils;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.pirk.schema.response.QueryResponseJSON;
+
+public class QueryResultsWriter
+{
+
+
+  /**
+   * Writes elements of the resultMap to output file, one line for each 
element, where each line is a string representation of the corresponding
+   * QueryResponseJSON object
+   */
+  public static void writeResultFile(String filename, 
Map<String,List<QueryResponseJSON>> resultMap) throws IOException
+  {
+    try (BufferedWriter bw = new BufferedWriter(new FileWriter(new 
File(filename))))
+    {
+      for (Entry<String,List<QueryResponseJSON>> entry : resultMap.entrySet())
+      {
+        for (QueryResponseJSON hitJSON : entry.getValue())
+        {
+          bw.write(hitJSON.getJSONString());
+          bw.newLine();
+        }
+      }
+    }
+  }
+
+  /**
+   * Writes elements of the resultMap to output file, one line for each 
element, where each line is a string representation of the corresponding
+   * QueryResponseJSON object
+   */
+  public static void writeResultFile(File file, 
Map<String,List<QueryResponseJSON>> resultMap) throws IOException
+  {
+    try (BufferedWriter bw = new BufferedWriter(new FileWriter(file)))
+    {
+      for (Entry<String,List<QueryResponseJSON>> entry : resultMap.entrySet())
+      {
+        for (QueryResponseJSON hitJSON : entry.getValue())
+        {
+          bw.write(hitJSON.getJSONString());
+          bw.newLine();
+        }
+      }
+    }
+  }
+
+}

Reply via email to