| /* |
| * 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.querier.wideskies; |
| |
| import org.apache.pirk.utils.SystemConfiguration; |
| import org.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| |
| import java.util.Arrays; |
| import java.util.List; |
| import java.util.Properties; |
| |
| /** |
| * Properties constants and validation for the Querier |
| */ |
| public class QuerierProps |
| { |
| private static final Logger logger = LoggerFactory.getLogger(QuerierProps.class); |
| |
| // General properties |
| static final String ACTION = "querier.action"; |
| static final String INPUTFILE = "querier.inputFile"; |
| public static final String OUTPUTFILE = "querier.outputFile"; |
| static final String QUERYTYPE = "querier.queryType"; |
| static final String NUMTHREADS = "querier.numThreads"; |
| |
| // Encryption properties |
| static final String HASHBITSIZE = "querier.hashBitSize"; |
| static final String HASHKEY = "querier.hashKey"; |
| static final String DATAPARTITIONSIZE = "querier.dataPartitionBitSize"; |
| static final String PAILLIERBITSIZE = "querier.paillierBitSize"; |
| static final String BITSET = "querier.bitSet"; |
| static final String CERTAINTY = "querier.certainty"; |
| static final String QUERYSCHEMAS = "querier.querySchemas"; |
| static final String DATASCHEMAS = "querier.dataSchemas"; |
| static final String EMBEDSELECTOR = "querier.embedSelector"; |
| static final String USEMEMLOOKUPTABLE = "querier.memLookupTable"; |
| static final String USEHDFSLOOKUPTABLE = "querier.useHDFSLookupTable"; |
| static final String SR_ALGORITHM = "pallier.secureRandom.algorithm"; |
| static final String SR_PROVIDER = "pallier.secureRandom.provider"; |
| static final String EMBEDQUERYSCHEMA = "pir.embedQuerySchema"; |
| |
| // Decryption properties |
| static final String QUERIERFILE = "querier.querierFile"; |
| |
| static final List<String> PROPSLIST = Arrays.asList(ACTION, INPUTFILE, OUTPUTFILE, QUERYTYPE, NUMTHREADS, EMBEDQUERYSCHEMA, HASHBITSIZE, HASHKEY, |
| DATAPARTITIONSIZE, PAILLIERBITSIZE, BITSET, CERTAINTY, QUERYSCHEMAS, DATASCHEMAS, EMBEDSELECTOR, USEMEMLOOKUPTABLE, USEHDFSLOOKUPTABLE, SR_ALGORITHM, |
| SR_PROVIDER); |
| |
| public static boolean validateQuerierProperties() |
| { |
| setGeneralDefaults(SystemConfiguration.getProperties()); |
| if (validateGeneralQuerierProperties(SystemConfiguration.getProperties())) |
| { |
| String action = SystemConfiguration.getProperty(ACTION).toLowerCase(); |
| // Action is either "encrypt" or "decrypt", or else we can't get here. |
| if (action.equals("encrypt")) |
| { |
| setEncryptionDefaults(SystemConfiguration.getProperties()); |
| return validateQuerierEncryptionProperties(SystemConfiguration.getProperties()); |
| } |
| else |
| { |
| return validateQuerierDecryptionProperties(SystemConfiguration.getProperties()); |
| } |
| } |
| else |
| { |
| return false; |
| } |
| } |
| |
| static void setGeneralDefaults(Properties properties) |
| { |
| if (!properties.containsKey(EMBEDQUERYSCHEMA)) |
| { |
| properties.setProperty(EMBEDQUERYSCHEMA, "true"); |
| } |
| if (!properties.containsKey(NUMTHREADS)) |
| { |
| properties.setProperty(NUMTHREADS, String.valueOf(Runtime.getRuntime().availableProcessors())); |
| } |
| } |
| |
| public static boolean validateGeneralQuerierProperties(Properties properties) |
| { |
| boolean valid = true; |
| |
| // Parse general required properties |
| |
| if (!properties.containsKey(ACTION)) |
| { |
| logger.info("Must have the option " + ACTION); |
| valid = false; |
| } |
| String action = properties.getProperty(ACTION).toLowerCase(); |
| if (!action.equals("encrypt") && !action.equals("decrypt")) |
| { |
| logger.info("Unsupported action: " + action); |
| valid = false; |
| } |
| |
| if (!properties.containsKey(INPUTFILE)) |
| { |
| logger.info("Must have the option " + INPUTFILE); |
| valid = false; |
| } |
| |
| if (!properties.containsKey(OUTPUTFILE)) |
| { |
| logger.info("Must have the option " + OUTPUTFILE); |
| valid = false; |
| } |
| |
| if (!properties.containsKey(NUMTHREADS)) |
| { |
| logger.info("Must have the option " + NUMTHREADS); |
| valid = false; |
| } |
| |
| return valid; |
| } |
| |
| static void setEncryptionDefaults(Properties properties) |
| { |
| if (!properties.containsKey(EMBEDSELECTOR)) |
| { |
| properties.setProperty(EMBEDSELECTOR, "true"); |
| } |
| |
| if (!properties.containsKey(USEMEMLOOKUPTABLE)) |
| { |
| properties.setProperty(USEMEMLOOKUPTABLE, "false"); |
| } |
| |
| if (!properties.containsKey(USEHDFSLOOKUPTABLE)) |
| { |
| properties.setProperty(USEHDFSLOOKUPTABLE, "false"); |
| } |
| |
| if (!properties.containsKey(BITSET)) |
| { |
| properties.setProperty(BITSET, "-1"); |
| } |
| } |
| |
| public static boolean validateQuerierEncryptionProperties(Properties properties) |
| { |
| boolean valid = true; |
| |
| // Parse encryption properties |
| if (!properties.containsKey(QUERYTYPE)) |
| { |
| logger.info("For action='encrypt': Must have the option " + QUERYTYPE); |
| valid = false; |
| } |
| |
| if (!properties.containsKey(HASHBITSIZE)) |
| { |
| logger.info("For action='encrypt': Must have the option " + HASHBITSIZE); |
| valid = false; |
| } |
| |
| if (!properties.containsKey(HASHKEY)) |
| { |
| logger.info("For action='encrypt': Must have the option " + HASHKEY); |
| valid = false; |
| } |
| |
| if (!properties.containsKey(DATAPARTITIONSIZE)) |
| { |
| logger.info("For action='encrypt': Must have the option " + DATAPARTITIONSIZE); |
| valid = false; |
| } |
| |
| if (!properties.containsKey(PAILLIERBITSIZE)) |
| { |
| logger.info("For action='encrypt': Must have the option " + PAILLIERBITSIZE); |
| valid = false; |
| } |
| |
| if (!properties.containsKey(CERTAINTY)) |
| { |
| logger.info("For action='encrypt': Must have the option " + CERTAINTY); |
| valid = false; |
| } |
| |
| if (properties.containsKey(QUERYSCHEMAS)) |
| { |
| appendProperty(properties, "query.schemas", properties.getProperty(QUERYSCHEMAS)); |
| } |
| |
| if (properties.containsKey(DATASCHEMAS)) |
| { |
| appendProperty(properties, "data.schemas", properties.getProperty(DATASCHEMAS)); |
| } |
| |
| return valid; |
| } |
| |
| public static boolean validateQuerierDecryptionProperties(Properties properties) |
| { |
| boolean valid = true; |
| |
| // Parse decryption args |
| if (!properties.containsKey(QUERIERFILE)) |
| { |
| logger.info("For action='decrypt': Must have the option " + QUERIERFILE); |
| valid = false; |
| } |
| |
| return valid; |
| } |
| |
| private static void appendProperty(Properties properties, String propertyName, String value) |
| { |
| String oldValue = properties.getProperty(propertyName); |
| |
| if (oldValue != null && !oldValue.equals("none")) |
| { |
| oldValue += "," + value; |
| } |
| else |
| { |
| oldValue = value; |
| } |
| properties.setProperty(propertyName, oldValue); |
| } |
| } |