From 15af66b115f3e8046b2d0f2634fb77b3d835f730 Mon Sep 17 00:00:00 2001 From: "mark.j.leonard" Date: Fri, 21 Sep 2018 16:16:04 +0100 Subject: [PATCH] Format Java code to ONAP standard Use the Eclipse formatter to automatically format the code to adhere to the defined standards. Change-Id: I42a8c90c5b272facc4cc2a0c85233061ed64ba3f Issue-ID: AAI-1650 Signed-off-by: mark.j.leonard --- src/main/java/org/onap/aai/sa/Application.java | 4 +- .../org/onap/aai/sa/auth/SearchDbServiceAuth.java | 37 +- .../onap/aai/sa/auth/SearchDbServiceAuthCore.java | 319 +++--- .../onap/aai/sa/rest/AnalysisConfiguration.java | 379 ++++--- .../java/org/onap/aai/sa/rest/AnalyzerApi.java | 195 ++-- src/main/java/org/onap/aai/sa/rest/ApiUtils.java | 245 ++--- src/main/java/org/onap/aai/sa/rest/BulkApi.java | 366 ++++--- .../java/org/onap/aai/sa/rest/BulkMetaData.java | 36 +- .../java/org/onap/aai/sa/rest/BulkOperation.java | 52 +- .../java/org/onap/aai/sa/rest/BulkRequest.java | 159 ++- src/main/java/org/onap/aai/sa/rest/Document.java | 44 +- .../java/org/onap/aai/sa/rest/DocumentApi.java | 1098 ++++++++++---------- src/main/java/org/onap/aai/sa/rest/IndexApi.java | 661 ++++++------ .../org/onap/aai/sa/rest/SearchServiceApi.java | 383 +++---- .../sa/searchdbabstraction/RestEchoService.java | 20 +- .../elasticsearch/config/ElasticSearchConfig.java | 88 +- .../elasticsearch/dao/DocumentStoreDataEntity.java | 6 +- .../dao/DocumentStoreDataEntityImpl.java | 68 +- .../elasticsearch/dao/DocumentStoreInterface.java | 55 +- .../dao/ElasticSearchBulkOperationResult.java | 56 +- .../elasticsearch/dao/ElasticSearchCause.java | 28 +- .../elasticsearch/dao/ElasticSearchError.java | 60 +- .../dao/ElasticSearchOperationStatus.java | 164 +-- .../elasticsearch/dao/ElasticSearchResultItem.java | 199 ++-- .../dao/ElasticSearchShardStatus.java | 65 +- .../entity/AggregationBucket.java | 70 +- .../entity/AggregationResult.java | 69 +- .../entity/AggregationResults.java | 22 +- .../sa/searchdbabstraction/entity/Document.java | 50 +- .../entity/DocumentOperationResult.java | 22 +- .../sa/searchdbabstraction/entity/ErrorResult.java | 46 +- .../entity/OperationResult.java | 80 +- .../sa/searchdbabstraction/entity/SearchHit.java | 36 +- .../sa/searchdbabstraction/entity/SearchHits.java | 36 +- .../entity/SearchOperationResult.java | 64 +- .../sa/searchdbabstraction/entity/SuggestHit.java | 4 +- .../searchdbabstraction/logging/SearchDbMsgs.java | 346 +++--- .../searchapi/AbstractAggregation.java | 73 +- .../searchdbabstraction/searchapi/Aggregation.java | 54 +- .../searchapi/AggregationStatement.java | 232 ++--- .../searchapi/DateHistogramAggregation.java | 122 +-- .../searchdbabstraction/searchapi/DateRange.java | 85 +- .../searchapi/DateRangeAggregation.java | 124 +-- .../sa/searchdbabstraction/searchapi/Filter.java | 260 ++--- .../searchapi/GroupByAggregation.java | 45 +- .../searchdbabstraction/searchapi/ParsedQuery.java | 118 ++- .../sa/searchdbabstraction/searchapi/Query.java | 100 +- .../searchapi/QueryStatement.java | 176 ++-- .../searchdbabstraction/searchapi/RangeQuery.java | 492 +++++---- .../searchapi/SearchStatement.java | 414 ++++---- .../aai/sa/searchdbabstraction/searchapi/Sort.java | 74 +- .../searchapi/SuggestionStatement.java | 4 +- .../searchdbabstraction/searchapi/TermQuery.java | 474 +++++---- .../searchdbabstraction/service/SearchService.java | 32 +- .../util/AggregationParsingUtil.java | 112 +- .../util/DocumentSchemaUtil.java | 154 +-- .../util/ElasticSearchPayloadTranslator.java | 94 +- .../util/SearchDbConstants.java | 55 +- .../onap/aai/sa/auth/SearchDbServiceAuthTest.java | 46 +- .../java/org/onap/aai/sa/rest/ApiUtilsTest.java | 20 +- .../java/org/onap/aai/sa/rest/BulkApiTest.java | 26 +- .../java/org/onap/aai/sa/rest/BulkRequestTest.java | 25 +- .../java/org/onap/aai/sa/rest/DocumentApiTest.java | 350 +++---- .../org/onap/aai/sa/rest/DocumentSchemaTest.java | 131 +-- .../java/org/onap/aai/sa/rest/DocumentTest.java | 128 +-- .../java/org/onap/aai/sa/rest/IndexApiTest.java | 449 ++++---- .../onap/aai/sa/rest/SearchServiceApiHarness.java | 286 +++-- .../org/onap/aai/sa/rest/StubEsController.java | 373 ++++--- src/test/java/org/onap/aai/sa/rest/TestUtils.java | 55 +- .../config/ElasticSearchConfigTest.java | 7 +- .../dao/AggregationResponseParsingTest.java | 108 +- .../dao/ElasticSearchResultItemTest.java | 12 +- .../searchapi/AggregationStatementTest.java | 175 ++-- .../searchapi/AggregationTest.java | 35 +- .../searchapi/DateHistogramAggregationTest.java | 75 +- .../searchapi/DateRangeAggregationTest.java | 52 +- .../searchapi/DateRangeTest.java | 69 +- .../searchdbabstraction/searchapi/FilterTest.java | 23 +- .../searchapi/GroupByAggregationTest.java | 46 +- .../searchdbabstraction/searchapi/QueryTest.java | 624 +++++------ .../searchapi/RangeQueryTest.java | 22 +- .../searchapi/SearchStatementTest.java | 392 +++---- .../sa/searchdbabstraction/searchapi/SortTest.java | 24 +- .../util/ElasticSearchPayloadTranslatorTest.java | 42 +- 84 files changed, 6119 insertions(+), 6402 deletions(-) diff --git a/src/main/java/org/onap/aai/sa/Application.java b/src/main/java/org/onap/aai/sa/Application.java index cd253c6..4fe2202 100644 --- a/src/main/java/org/onap/aai/sa/Application.java +++ b/src/main/java/org/onap/aai/sa/Application.java @@ -33,11 +33,11 @@ public class Application extends SpringBootServletInitializer { public static void main(String[] args) { String keyStorePassword = System.getProperty("KEY_STORE_PASSWORD"); - if(keyStorePassword==null || keyStorePassword.isEmpty()){ + if (keyStorePassword == null || keyStorePassword.isEmpty()) { throw new RuntimeException("Env property KEY_STORE_PASSWORD not set"); } HashMap props = new HashMap<>(); props.put("server.ssl.key-store-password", Password.deobfuscate(keyStorePassword)); - new Application().configure(new SpringApplicationBuilder (Application.class).properties(props)).run(args); + new Application().configure(new SpringApplicationBuilder(Application.class).properties(props)).run(args); } } diff --git a/src/main/java/org/onap/aai/sa/auth/SearchDbServiceAuth.java b/src/main/java/org/onap/aai/sa/auth/SearchDbServiceAuth.java index 1ef3dde..b64cb74 100644 --- a/src/main/java/org/onap/aai/sa/auth/SearchDbServiceAuth.java +++ b/src/main/java/org/onap/aai/sa/auth/SearchDbServiceAuth.java @@ -20,38 +20,37 @@ */ package org.onap.aai.sa.auth; - import javax.servlet.http.Cookie; +import javax.servlet.http.Cookie; import org.springframework.http.HttpHeaders; public class SearchDbServiceAuth { - public SearchDbServiceAuth() { - } + public SearchDbServiceAuth() {} - public boolean authBasic(String username, String authFunction) { - return SearchDbServiceAuthCore.authorize(username, authFunction); - } + public boolean authBasic(String username, String authFunction) { + return SearchDbServiceAuthCore.authorize(username, authFunction); + } - public String authUser(HttpHeaders headers, String authUser, String authFunction) { + public String authUser(HttpHeaders headers, String authUser, String authFunction) { - SearchDbServiceAuth aaiAuth = new SearchDbServiceAuth(); + SearchDbServiceAuth aaiAuth = new SearchDbServiceAuth(); - StringBuilder username = new StringBuilder(); + StringBuilder username = new StringBuilder(); - username.append(authUser); - if (aaiAuth.authBasic(username.toString(), authFunction) == false) { - return "AAI_9101"; + username.append(authUser); + if (aaiAuth.authBasic(username.toString(), authFunction) == false) { + return "AAI_9101"; + } + return "OK"; } - return "OK"; - } - public boolean authCookie(Cookie cookie, String authFunction, StringBuilder username) { + public boolean authCookie(Cookie cookie, String authFunction, StringBuilder username) { - if (cookie == null) { - return false; + if (cookie == null) { + return false; + } + return SearchDbServiceAuthCore.authorize(username.toString(), authFunction); } - return SearchDbServiceAuthCore.authorize(username.toString(), authFunction); - } } diff --git a/src/main/java/org/onap/aai/sa/auth/SearchDbServiceAuthCore.java b/src/main/java/org/onap/aai/sa/auth/SearchDbServiceAuthCore.java index 1bd922f..48743b6 100644 --- a/src/main/java/org/onap/aai/sa/auth/SearchDbServiceAuthCore.java +++ b/src/main/java/org/onap/aai/sa/auth/SearchDbServiceAuthCore.java @@ -40,207 +40,206 @@ import org.onap.aai.sa.searchdbabstraction.util.SearchDbConstants; public class SearchDbServiceAuthCore { - private static Logger logger = LoggerFactory.getInstance() - .getLogger(SearchDbServiceAuthCore.class.getName()); + private static Logger logger = LoggerFactory.getInstance().getLogger(SearchDbServiceAuthCore.class.getName()); - private static String GlobalAuthFileName = SearchDbConstants.SDB_AUTH_CONFIG_FILENAME; + private static String GlobalAuthFileName = SearchDbConstants.SDB_AUTH_CONFIG_FILENAME; - private static enum HTTP_METHODS { - POST, GET, PUT, DELETE - } - - ; - - // Don't instantiate - private SearchDbServiceAuthCore() { - } + private enum HTTP_METHODS { + POST, + GET, + PUT, + DELETE + } - private static boolean usersInitialized = false; - private static HashMap users; - private static boolean timerSet = false; - private static Timer timer = null; + // Don't instantiate + private SearchDbServiceAuthCore() {} - public synchronized static void init() { + private static boolean usersInitialized = false; + private static HashMap users; + private static boolean timerSet = false; + private static Timer timer = null; + public synchronized static void init() { - SearchDbServiceAuthCore.getConfigFile(); - SearchDbServiceAuthCore.reloadUsers(); - } + SearchDbServiceAuthCore.getConfigFile(); + SearchDbServiceAuthCore.reloadUsers(); - public static void cleanup() { - timer.cancel(); - } + } - public static String getConfigFile() { - if (GlobalAuthFileName == null) { - String nc = GlobalAuthFileName; - if (nc == null) { - nc = "/home/aaiadmin/etc/aaipolicy.json"; - } - GlobalAuthFileName = nc; + public static void cleanup() { + timer.cancel(); } - return GlobalAuthFileName; - } - - public synchronized static void reloadUsers() { - users = new HashMap(); - ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally - JSONParser parser = new JSONParser(); - try { - Object obj = parser.parse(new FileReader(GlobalAuthFileName)); - JsonNode rootNode = mapper.readTree(new File(GlobalAuthFileName)); - JsonNode rolesNode = rootNode.path("roles"); - - for (JsonNode roleNode : rolesNode) { - String roleName = roleNode.path("name").asText(); - - TabularAuthRole authRole = new TabularAuthRole(); - JsonNode usersNode = roleNode.path("users"); - JsonNode functionsNode = roleNode.path("functions"); - for (JsonNode functionNode : functionsNode) { - String function = functionNode.path("name").asText(); - JsonNode methodsNode = functionNode.path("methods"); - boolean hasMethods = false; - for (JsonNode methodNode : methodsNode) { - String methodName = methodNode.path("name").asText(); - hasMethods = true; - String thisFunction = methodName + ":" + function; - - authRole.addAllowedFunction(thisFunction); - } - - if (hasMethods == false) { - // iterate the list from HTTP_METHODS - for (HTTP_METHODS meth : HTTP_METHODS.values()) { - String thisFunction = meth.toString() + ":" + function; - - authRole.addAllowedFunction(thisFunction); - } - } + public static String getConfigFile() { + if (GlobalAuthFileName == null) { + String nc = GlobalAuthFileName; + if (nc == null) { + nc = "/home/aaiadmin/etc/aaipolicy.json"; + } + GlobalAuthFileName = nc; } - for (JsonNode userNode : usersNode) { - // make the user lower case - String username = userNode.path("username").asText().toLowerCase(); - SearchDbAuthUser authUser = null; - if (users.containsKey(username)) { - authUser = users.get(username); - } else { - authUser = new SearchDbAuthUser(); - } - - - authUser.setUser(username); - authUser.addRole(roleName, authRole); - users.put(username, authUser); - } - } - } catch (FileNotFoundException fnfe) { - logger.debug("Failed to load the policy file "); + return GlobalAuthFileName; + } - } catch (ParseException e) { - logger.debug("Failed to Parse the policy file "); + public synchronized static void reloadUsers() { + users = new HashMap<>(); + ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally + JSONParser parser = new JSONParser(); + try { + parser.parse(new FileReader(GlobalAuthFileName)); + JsonNode rootNode = mapper.readTree(new File(GlobalAuthFileName)); + JsonNode rolesNode = rootNode.path("roles"); + + for (JsonNode roleNode : rolesNode) { + String roleName = roleNode.path("name").asText(); + + TabularAuthRole authRole = new TabularAuthRole(); + JsonNode usersNode = roleNode.path("users"); + JsonNode functionsNode = roleNode.path("functions"); + for (JsonNode functionNode : functionsNode) { + String function = functionNode.path("name").asText(); + JsonNode methodsNode = functionNode.path("methods"); + boolean hasMethods = false; + for (JsonNode methodNode : methodsNode) { + String methodName = methodNode.path("name").asText(); + hasMethods = true; + String thisFunction = methodName + ":" + function; + + authRole.addAllowedFunction(thisFunction); + } + + if (hasMethods == false) { + // iterate the list from HTTP_METHODS + for (HTTP_METHODS meth : HTTP_METHODS.values()) { + String thisFunction = meth.toString() + ":" + function; + + authRole.addAllowedFunction(thisFunction); + } + } + + } + for (JsonNode userNode : usersNode) { + // make the user lower case + String username = userNode.path("username").asText().toLowerCase(); + SearchDbAuthUser authUser = null; + if (users.containsKey(username)) { + authUser = users.get(username); + } else { + authUser = new SearchDbAuthUser(); + } + + + authUser.setUser(username); + authUser.addRole(roleName, authRole); + users.put(username, authUser); + } + } + } catch (FileNotFoundException fnfe) { + logger.debug("Failed to load the policy file "); - } catch (JsonProcessingException e) { - logger.debug("JSON processing error while parsing policy file: " + e.getMessage()); + } catch (ParseException e) { + logger.debug("Failed to Parse the policy file "); - } catch (IOException e) { - logger.debug("IO Exception while parsing policy file: " + e.getMessage()); - } + } catch (JsonProcessingException e) { + logger.debug("JSON processing error while parsing policy file: " + e.getMessage()); - usersInitialized = true; + } catch (IOException e) { + logger.debug("IO Exception while parsing policy file: " + e.getMessage()); + } - } + usersInitialized = true; - public static class SearchDbAuthUser { - public SearchDbAuthUser() { - this.roles = new HashMap(); } - private String username; - private HashMap roles; + public static class SearchDbAuthUser { + public SearchDbAuthUser() { + this.roles = new HashMap<>(); + } - public String getUser() { - return this.username; - } + private String username; + private HashMap roles; - public HashMap getRoles() { - return this.roles; - } + public String getUser() { + return this.username; + } - public void addRole(String roleName, TabularAuthRole authRole) { - this.roles.put(roleName, authRole); - } + public HashMap getRoles() { + return this.roles; + } - public boolean checkAllowed(String checkFunc) { - for (Map.Entry roleEntry : this.roles.entrySet()) { - TabularAuthRole role = roleEntry.getValue(); - if (role.hasAllowedFunction(checkFunc)) { - // break out as soon as we find it - return true; + public void addRole(String roleName, TabularAuthRole authRole) { + this.roles.put(roleName, authRole); } - } - // we would have got positive confirmation had it been there - return false; - } - public void setUser(String myuser) { - this.username = myuser; - } + public boolean checkAllowed(String checkFunc) { + for (Map.Entry roleEntry : this.roles.entrySet()) { + TabularAuthRole role = roleEntry.getValue(); + if (role.hasAllowedFunction(checkFunc)) { + // break out as soon as we find it + return true; + } + } + // we would have got positive confirmation had it been there + return false; + } - } + public void setUser(String myuser) { + this.username = myuser; + } - public static class TabularAuthRole { - public TabularAuthRole() { - this.allowedFunctions = new ArrayList(); } - private List allowedFunctions; + public static class TabularAuthRole { + public TabularAuthRole() { + this.allowedFunctions = new ArrayList<>(); + } - public void addAllowedFunction(String func) { - this.allowedFunctions.add(func); - } + private List allowedFunctions; - public void delAllowedFunction(String delFunc) { - if (this.allowedFunctions.contains(delFunc)) { - this.allowedFunctions.remove(delFunc); - } - } + public void addAllowedFunction(String func) { + this.allowedFunctions.add(func); + } + + public void delAllowedFunction(String delFunc) { + if (this.allowedFunctions.contains(delFunc)) { + this.allowedFunctions.remove(delFunc); + } + } - public boolean hasAllowedFunction(String afunc) { - if (this.allowedFunctions.contains(afunc)) { - return true; - } else { - return false; - } + public boolean hasAllowedFunction(String afunc) { + if (this.allowedFunctions.contains(afunc)) { + return true; + } else { + return false; + } + } } - } - public static HashMap getUsers(String key) { - if (!usersInitialized || (users == null)) { - reloadUsers(); + public static HashMap getUsers(String key) { + if (!usersInitialized || (users == null)) { + reloadUsers(); + } + return users; } - return users; - } - public static boolean authorize(String username, String authFunction) { + public static boolean authorize(String username, String authFunction) { - if (!usersInitialized || (users == null)) { - init(); - } - if (users.containsKey(username)) { - if (users.get(username).checkAllowed(authFunction) == true) { + if (!usersInitialized || (users == null)) { + init(); + } + if (users.containsKey(username)) { + if (users.get(username).checkAllowed(authFunction) == true) { - return true; - } else { + return true; + } else { - return false; - } - } else { + return false; + } + } else { - return false; + return false; + } } - } } diff --git a/src/main/java/org/onap/aai/sa/rest/AnalysisConfiguration.java b/src/main/java/org/onap/aai/sa/rest/AnalysisConfiguration.java index f30075a..0b8947e 100644 --- a/src/main/java/org/onap/aai/sa/rest/AnalysisConfiguration.java +++ b/src/main/java/org/onap/aai/sa/rest/AnalysisConfiguration.java @@ -30,207 +30,200 @@ import org.onap.aai.sa.searchdbabstraction.logging.SearchDbMsgs; import org.onap.aai.sa.searchdbabstraction.util.SearchDbConstants; /** - * This class encapsulates the configuration of the predefined - * Analyzer and Filter behaviours that help to tell the document - * store how to index the documents that are provided to it. + * This class encapsulates the configuration of the predefined Analyzer and Filter behaviours that help to tell the + * document store how to index the documents that are provided to it. */ public class AnalysisConfiguration { - /** - * Contains all of the predefined indexing filters. - */ - private FilterSchema[] customFilters; - - /** - * Contains all of the predefined indexing analyzers. - */ - private AnalyzerSchema[] customAnalysers; - - /** - * Indicates whether or not we have imported the filter and - * analyzer configurations. - */ - private AtomicBoolean configured = new AtomicBoolean(false); - - /** - * A json format string which is readable by Elastic Search and defines - * all of the custom filters and analyzers that we need Elastic Search - * to know about. - */ - private String esSettings = null; - - private static Logger logger = LoggerFactory.getInstance() - .getLogger(AnalysisConfiguration.class.getName()); - - - /** - * Imports the filter and analyzer configuration files and - * builds an Elastic Search readable settings file from the - * contents. - * - * @param filterConfigFile - Location of filter configuration json file - * @param analyzerConfigFile - Location of analyzer configuration json file - */ - public void init(String filterConfigFile, String analyzerConfigFile) { - - if (configured.compareAndSet(false, true)) { - ObjectMapper mapper = new ObjectMapper(); - - File filtersConfig = new File(filterConfigFile); - try { - customFilters = mapper.readValue(filtersConfig, FilterSchema[].class); - } catch (IOException e) { - - // generate log - logger.warn(SearchDbMsgs.FILTERS_CONFIG_FAILURE, filterConfigFile, e.getMessage()); - } - - File analysersConfig = new File(analyzerConfigFile); - try { - customAnalysers = mapper.readValue(analysersConfig, AnalyzerSchema[].class); - } catch (IOException e) { - - // generate log - logger.warn(SearchDbMsgs.ANALYSYS_CONFIG_FAILURE, analyzerConfigFile, e.getMessage()); - } - - esSettings = buildEsIndexSettings(); + /** + * Contains all of the predefined indexing filters. + */ + private FilterSchema[] customFilters; + + /** + * Contains all of the predefined indexing analyzers. + */ + private AnalyzerSchema[] customAnalysers; + + /** + * Indicates whether or not we have imported the filter and analyzer configurations. + */ + private AtomicBoolean configured = new AtomicBoolean(false); + + /** + * A json format string which is readable by Elastic Search and defines all of the custom filters and analyzers that + * we need Elastic Search to know about. + */ + private String esSettings = null; + + private static Logger logger = LoggerFactory.getInstance().getLogger(AnalysisConfiguration.class.getName()); + + + /** + * Imports the filter and analyzer configuration files and builds an Elastic Search readable settings file from the + * contents. + * + * @param filterConfigFile - Location of filter configuration json file + * @param analyzerConfigFile - Location of analyzer configuration json file + */ + public void init(String filterConfigFile, String analyzerConfigFile) { + + if (configured.compareAndSet(false, true)) { + ObjectMapper mapper = new ObjectMapper(); + + File filtersConfig = new File(filterConfigFile); + try { + customFilters = mapper.readValue(filtersConfig, FilterSchema[].class); + } catch (IOException e) { + + // generate log + logger.warn(SearchDbMsgs.FILTERS_CONFIG_FAILURE, filterConfigFile, e.getMessage()); + } + + File analysersConfig = new File(analyzerConfigFile); + try { + customAnalysers = mapper.readValue(analysersConfig, AnalyzerSchema[].class); + } catch (IOException e) { + + // generate log + logger.warn(SearchDbMsgs.ANALYSYS_CONFIG_FAILURE, analyzerConfigFile, e.getMessage()); + } + + esSettings = buildEsIndexSettings(); + } } - } - - - /** - * Returns the set of pre-configured filters. - * - * @return - An array of filters. - */ - public FilterSchema[] getFilters() { - return customFilters; - } - - - /** - * Returns the set of pre-configured analyzers. - * - * @return - An array of analyzers. - */ - public AnalyzerSchema[] getAnalyzers() { - init(SearchDbConstants.SDB_FILTER_CONFIG_FILE, SearchDbConstants.SDB_ANALYSIS_CONFIG_FILE); - return customAnalysers; - } - - - /** - * Imports the filter and analyzer configurations and translates those - * into a settings string that will be parseable by Elastic Search. - * - * @return - Elastic Search formatted settings string. - */ - public String getEsIndexSettings() { - - // Generate the es-settings string from our filter and analyzer - // configurations if we have not already done so. - init(SearchDbConstants.SDB_FILTER_CONFIG_FILE, SearchDbConstants.SDB_ANALYSIS_CONFIG_FILE); - - // Now, return the es-settings string. - return esSettings; - } - - - /** - * Constructs a settings string that is readable by Elastic Search based - * on the contents of the filter and analyzer configuration files. - * - * @return Elastic Search formatted settings string. - */ - public String buildEsIndexSettings() { - - StringBuilder sb = new StringBuilder(); - - sb.append("{"); - sb.append("\"analysis\": {"); - - // Define the custom filters. - boolean atLeastOneFilter = false; - sb.append("\"filter\": {"); - AtomicBoolean firstFilter = new AtomicBoolean(true); - for (FilterSchema filter : customFilters) { - - // Append a comma before the next entry, unless it is the - // first one. - if (!firstFilter.compareAndSet(true, false)) { - sb.append(", "); - } - - // Now, build the filter entry. - buildFilterEntry(filter, sb); - atLeastOneFilter = true; + + + /** + * Returns the set of pre-configured filters. + * + * @return - An array of filters. + */ + public FilterSchema[] getFilters() { + return customFilters; + } + + + /** + * Returns the set of pre-configured analyzers. + * + * @return - An array of analyzers. + */ + public AnalyzerSchema[] getAnalyzers() { + init(SearchDbConstants.SDB_FILTER_CONFIG_FILE, SearchDbConstants.SDB_ANALYSIS_CONFIG_FILE); + return customAnalysers; } - sb.append((atLeastOneFilter) ? "}," : "}"); - // Define the custom analyzers. - sb.append("\"analyzer\": {"); - AtomicBoolean firstAnalyzer = new AtomicBoolean(true); - for (AnalyzerSchema analyzer : customAnalysers) { - // Prepend a comma before the entry, unless it is the - // first one. - if (!firstAnalyzer.compareAndSet(true, false)) { - sb.append(","); - } + /** + * Imports the filter and analyzer configurations and translates those into a settings string that will be parseable + * by Elastic Search. + * + * @return - Elastic Search formatted settings string. + */ + public String getEsIndexSettings() { + + // Generate the es-settings string from our filter and analyzer + // configurations if we have not already done so. + init(SearchDbConstants.SDB_FILTER_CONFIG_FILE, SearchDbConstants.SDB_ANALYSIS_CONFIG_FILE); + + // Now, return the es-settings string. + return esSettings; + } + - // Now, construct the entry for this analyzer. - buildAnalyzerEntry(analyzer, sb); + /** + * Constructs a settings string that is readable by Elastic Search based on the contents of the filter and analyzer + * configuration files. + * + * @return Elastic Search formatted settings string. + */ + public String buildEsIndexSettings() { + + StringBuilder sb = new StringBuilder(); + + sb.append("{"); + sb.append("\"analysis\": {"); + + // Define the custom filters. + boolean atLeastOneFilter = false; + sb.append("\"filter\": {"); + AtomicBoolean firstFilter = new AtomicBoolean(true); + for (FilterSchema filter : customFilters) { + + // Append a comma before the next entry, unless it is the + // first one. + if (!firstFilter.compareAndSet(true, false)) { + sb.append(", "); + } + + // Now, build the filter entry. + buildFilterEntry(filter, sb); + atLeastOneFilter = true; + } + sb.append((atLeastOneFilter) ? "}," : "}"); + + // Define the custom analyzers. + sb.append("\"analyzer\": {"); + AtomicBoolean firstAnalyzer = new AtomicBoolean(true); + for (AnalyzerSchema analyzer : customAnalysers) { + + // Prepend a comma before the entry, unless it is the + // first one. + if (!firstAnalyzer.compareAndSet(true, false)) { + sb.append(","); + } + + // Now, construct the entry for this analyzer. + buildAnalyzerEntry(analyzer, sb); + } + sb.append("}"); + + sb.append("}"); + sb.append("}"); + + return sb.toString(); } - sb.append("}"); - - sb.append("}"); - sb.append("}"); - - return sb.toString(); - } - - - /** - * Constructs an ElasticSearch friendly custom filter definition. - * - * @param filter - The filter to generate ElasticSearch json for. - * @param sb - The string builder to append the filter definition - * to. - */ - private void buildFilterEntry(FilterSchema filter, StringBuilder sb) { - - sb.append("\"" + filter.getName()).append("\": {"); - - sb.append(filter.getConfiguration()); - - sb.append("}"); - } - - - /** - * Constructs an ElasticSearch friendly custom analyzer definition. - * - * @param analyzer - The analyzer to generate ElasticSearch json for. - * @param sb - The string builder to append the analyzer definition - * to. - */ - private void buildAnalyzerEntry(AnalyzerSchema analyzer, StringBuilder sb) { - - sb.append("\"").append(analyzer.getName()).append("\": {"); - sb.append("\"type\": \"custom\","); - sb.append("\"tokenizer\": ").append("\"").append(analyzer.getTokenizer()).append("\","); - sb.append("\"filter\": ["); - boolean firstFilter = true; - for (String filter : analyzer.getFilters()) { - if (!firstFilter) { - sb.append(","); - } else { - firstFilter = false; - } - sb.append("\"").append(filter).append("\""); + + + /** + * Constructs an ElasticSearch friendly custom filter definition. + * + * @param filter - The filter to generate ElasticSearch json for. + * @param sb - The string builder to append the filter definition to. + */ + private void buildFilterEntry(FilterSchema filter, StringBuilder sb) { + + sb.append("\"" + filter.getName()).append("\": {"); + + sb.append(filter.getConfiguration()); + + sb.append("}"); + } + + + /** + * Constructs an ElasticSearch friendly custom analyzer definition. + * + * @param analyzer - The analyzer to generate ElasticSearch json for. + * @param sb - The string builder to append the analyzer definition to. + */ + private void buildAnalyzerEntry(AnalyzerSchema analyzer, StringBuilder sb) { + + sb.append("\"").append(analyzer.getName()).append("\": {"); + sb.append("\"type\": \"custom\","); + sb.append("\"tokenizer\": ").append("\"").append(analyzer.getTokenizer()).append("\","); + sb.append("\"filter\": ["); + boolean firstFilter = true; + for (String filter : analyzer.getFilters()) { + if (!firstFilter) { + sb.append(","); + } else { + firstFilter = false; + } + sb.append("\"").append(filter).append("\""); + } + sb.append("]"); + sb.append("}"); } - sb.append("]"); - sb.append("}"); - } } diff --git a/src/main/java/org/onap/aai/sa/rest/AnalyzerApi.java b/src/main/java/org/onap/aai/sa/rest/AnalyzerApi.java index 210953d..59b526f 100644 --- a/src/main/java/org/onap/aai/sa/rest/AnalyzerApi.java +++ b/src/main/java/org/onap/aai/sa/rest/AnalyzerApi.java @@ -46,121 +46,116 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/services/search-data-service/v1/analyzers/search") public class AnalyzerApi { - private SearchServiceApi searchService = null; + private SearchServiceApi searchService = null; - // Set up the loggers. - private static Logger logger = LoggerFactory.getInstance().getLogger(IndexApi.class.getName()); - private static Logger auditLogger = LoggerFactory.getInstance() - .getAuditLogger(IndexApi.class.getName()); + // Set up the loggers. + private static Logger logger = LoggerFactory.getInstance().getLogger(IndexApi.class.getName()); + private static Logger auditLogger = LoggerFactory.getInstance().getAuditLogger(IndexApi.class.getName()); - public AnalyzerApi( @Qualifier("searchServiceApi") SearchServiceApi searchService) { - this.searchService = searchService; - } + public AnalyzerApi(@Qualifier("searchServiceApi") SearchServiceApi searchService) { + this.searchService = searchService; + } - @RequestMapping(method = RequestMethod.GET, - consumes = {"application/json"}, - produces = {"application/json"}) - public ResponseEntity processGet(HttpServletRequest request, - @RequestHeader HttpHeaders headers, - ApiUtils apiUtils) { + @RequestMapping(method = RequestMethod.GET, consumes = {"application/json"}, produces = {"application/json"}) + public ResponseEntity processGet(HttpServletRequest request, @RequestHeader HttpHeaders headers, + ApiUtils apiUtils) { - HttpStatus responseCode = HttpStatus.INTERNAL_SERVER_ERROR; - String responseString = "Undefined error"; + HttpStatus responseCode = HttpStatus.INTERNAL_SERVER_ERROR; + String responseString = "Undefined error"; - // Initialize the MDC Context for logging purposes. - ApiUtils.initMdcContext(request, headers); + // Initialize the MDC Context for logging purposes. + ApiUtils.initMdcContext(request, headers); - // Validate that the request is correctly authenticated before going - // any further. - try { + // Validate that the request is correctly authenticated before going + // any further. + try { - if (!searchService.validateRequest(headers, request, - ApiUtils.Action.GET, ApiUtils.SEARCH_AUTH_POLICY_NAME)) { - logger.warn(SearchDbMsgs.GET_ANALYZERS_FAILURE, "Authentication failure."); - return ResponseEntity.status(HttpStatus.FORBIDDEN).contentType ( MediaType.APPLICATION_JSON ).body("Authentication failure."); - } + if (!searchService.validateRequest(headers, request, ApiUtils.Action.GET, + ApiUtils.SEARCH_AUTH_POLICY_NAME)) { + logger.warn(SearchDbMsgs.GET_ANALYZERS_FAILURE, "Authentication failure."); + return ResponseEntity.status(HttpStatus.FORBIDDEN).contentType(MediaType.APPLICATION_JSON) + .body("Authentication failure."); + } - } catch (Exception e) { + } catch (Exception e) { - logger.warn(SearchDbMsgs.GET_ANALYZERS_FAILURE, - "Unexpected authentication failure - cause: " + e.getMessage()); - return ResponseEntity.status(HttpStatus.FORBIDDEN).contentType ( MediaType.APPLICATION_JSON ).body("Authentication failure."); - } + logger.warn(SearchDbMsgs.GET_ANALYZERS_FAILURE, + "Unexpected authentication failure - cause: " + e.getMessage()); + return ResponseEntity.status(HttpStatus.FORBIDDEN).contentType(MediaType.APPLICATION_JSON) + .body("Authentication failure."); + } - // Now, build the list of analyzers. - try { - responseString = buildAnalyzerList(ElasticSearchHttpController.getInstance() - .getAnalysisConfig()); - responseCode = HttpStatus.OK; + // Now, build the list of analyzers. + try { + responseString = buildAnalyzerList(ElasticSearchHttpController.getInstance().getAnalysisConfig()); + responseCode = HttpStatus.OK; + + } catch (Exception e) { + + logger.warn(SearchDbMsgs.GET_ANALYZERS_FAILURE, + "Unexpected failure retrieving analysis configuration - cause: " + e.getMessage()); + responseString = "Failed to retrieve analysis configuration. Cause: " + e.getMessage(); + } - } catch (Exception e) { + // Build the HTTP response. + ResponseEntity response = + ResponseEntity.status(responseCode).contentType(MediaType.APPLICATION_JSON).body(responseString); - logger.warn(SearchDbMsgs.GET_ANALYZERS_FAILURE, - "Unexpected failure retrieving analysis configuration - cause: " + e.getMessage()); - responseString = "Failed to retrieve analysis configuration. Cause: " + e.getMessage(); + // Generate our audit log. + auditLogger.info(SearchDbMsgs.PROCESS_REST_REQUEST, + new LogFields().setField(LogLine.DefinedFields.RESPONSE_CODE, responseCode.value()) + .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION, responseCode.value()), + (request != null) ? request.getMethod() : "Unknown", + (request != null) ? request.getRequestURL().toString() : "Unknown", + (request != null) ? request.getRemoteHost() : "Unknown", + Integer.toString(response.getStatusCodeValue())); + + // Clear the MDC context so that no other transaction inadvertently + // uses our transaction id. + ApiUtils.clearMdcContext(); + + return response; } - // Build the HTTP response. - ResponseEntity response = ResponseEntity.status(responseCode).contentType ( MediaType.APPLICATION_JSON ).body(responseString); - - // Generate our audit log. - auditLogger.info(SearchDbMsgs.PROCESS_REST_REQUEST, - new LogFields() - .setField(LogLine.DefinedFields.RESPONSE_CODE, responseCode.value ()) - .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION, responseCode.value()), - (request != null) ? request.getMethod() : "Unknown", - (request != null) ? request.getRequestURL ().toString () : "Unknown", - (request != null) ? request.getRemoteHost () : "Unknown", - Integer.toString(response.getStatusCodeValue ())); - - // Clear the MDC context so that no other transaction inadvertently - // uses our transaction id. - ApiUtils.clearMdcContext(); - - return response; - } - - - /** - * This method takes a list of analyzer objects and generates a simple json - * structure to enumerate them. - * - *

Note, this includes only the aspects of the analyzer object that we want - * to make public to an external client. - * - * @param analysisConfig - The analysis configuration object to extract the - * analyzers from. - * @return - A json string enumerating the defined analyzers. - */ - private String buildAnalyzerList(AnalysisConfiguration analysisConfig) { - - StringBuilder sb = new StringBuilder(); - - sb.append("{"); - AtomicBoolean firstAnalyzer = new AtomicBoolean(true); - for (AnalyzerSchema analyzer : analysisConfig.getAnalyzers()) { - - if (!firstAnalyzer.compareAndSet(true, false)) { - sb.append(", "); - } - - sb.append("{"); - sb.append("\"name\": \"").append(analyzer.getName()).append("\", "); - sb.append("\"description\": \"").append(analyzer.getDescription()).append("\", "); - sb.append("\"behaviours\": ["); - AtomicBoolean firstBehaviour = new AtomicBoolean(true); - for (String behaviour : analyzer.getBehaviours()) { - if (!firstBehaviour.compareAndSet(true, false)) { - sb.append(", "); + + /** + * This method takes a list of analyzer objects and generates a simple json structure to enumerate them. + * + *

+ * Note, this includes only the aspects of the analyzer object that we want to make public to an external client. + * + * @param analysisConfig - The analysis configuration object to extract the analyzers from. + * @return - A json string enumerating the defined analyzers. + */ + private String buildAnalyzerList(AnalysisConfiguration analysisConfig) { + + StringBuilder sb = new StringBuilder(); + + sb.append("{"); + AtomicBoolean firstAnalyzer = new AtomicBoolean(true); + for (AnalyzerSchema analyzer : analysisConfig.getAnalyzers()) { + + if (!firstAnalyzer.compareAndSet(true, false)) { + sb.append(", "); + } + + sb.append("{"); + sb.append("\"name\": \"").append(analyzer.getName()).append("\", "); + sb.append("\"description\": \"").append(analyzer.getDescription()).append("\", "); + sb.append("\"behaviours\": ["); + AtomicBoolean firstBehaviour = new AtomicBoolean(true); + for (String behaviour : analyzer.getBehaviours()) { + if (!firstBehaviour.compareAndSet(true, false)) { + sb.append(", "); + } + sb.append("\"").append(behaviour).append("\""); + } + sb.append("]"); + sb.append("}"); } - sb.append("\"").append(behaviour).append("\""); - } - sb.append("]"); - sb.append("}"); - } - sb.append("}"); + sb.append("}"); - return sb.toString(); - } + return sb.toString(); + } } diff --git a/src/main/java/org/onap/aai/sa/rest/ApiUtils.java b/src/main/java/org/onap/aai/sa/rest/ApiUtils.java index a2ef2b1..bbbc02b 100644 --- a/src/main/java/org/onap/aai/sa/rest/ApiUtils.java +++ b/src/main/java/org/onap/aai/sa/rest/ApiUtils.java @@ -32,167 +32,150 @@ import org.springframework.http.HttpStatus; public class ApiUtils { - public static final String SEARCH_AUTH_POLICY_NAME = "search"; - public static final String URL_PREFIX = "services/search-data-service/v1/search"; - - public enum Action { - POST, GET, PUT, DELETE - }; - - /** - * This method uses the contents of the supplied HTTP headers and request - * structures to populate the MDC Context used for logging purposes. - * - * @param httpReq - HTTP request structure. - * @param headers - HTTP headers - */ -// protected static void initMdcContext(HttpServletRequest httpReq, HttpHeaders headers) { -// -// // Auto generate a transaction if we were not provided one. -// String transId = null; -// if (headers != null) { -// // transId = headers.getRequestHeaders().getFirst("X-TransactionId"); -// transId = headers.getFirst("X-TransactionId"); -// -// if ((transId == null) || (transId.equals(""))) { -// transId = UUID.randomUUID().toString(); -// } -// } -// -// String fromIp = (httpReq != null) ? httpReq.getRemoteAddr() : ""; -// String fromApp = (headers != null) ? headers.getFirst("X-FromAppId") : ""; -// -// MdcContext.initialize(transId, SearchDbConstants.SDB_SERVICE_NAME, "", fromApp, fromIp); -// } - - protected static void initMdcContext ( HttpServletRequest httpReq, HttpHeaders headers) { - - // Auto generate a transaction if we were not provided one. - String transId = null; - if (headers != null) { - // transId = headers.getRequestHeaders().getFirst("X-TransactionId"); - transId = headers.getFirst("X-TransactionId"); - - if ((transId == null) || (transId.equals(""))) { - transId = UUID.randomUUID().toString(); - } - } + public static final String SEARCH_AUTH_POLICY_NAME = "search"; + public static final String URL_PREFIX = "services/search-data-service/v1/search"; + + public enum Action { + POST, + GET, + PUT, + DELETE + }; + + /** + * This method uses the contents of the supplied HTTP headers and request structures to populate the MDC Context + * used for logging purposes. + * + * @param httpReq - HTTP request structure. + * @param headers - HTTP headers + */ + protected static void initMdcContext(HttpServletRequest httpReq, HttpHeaders headers) { + + // Auto generate a transaction if we were not provided one. + String transId = null; + if (headers != null) { + transId = headers.getFirst("X-TransactionId"); + + if ((transId == null) || (transId.equals(""))) { + transId = UUID.randomUUID().toString(); + } + } - String fromIp = (httpReq != null) ? httpReq.getRemoteHost () : ""; - String fromApp = (headers != null) ? headers.getFirst("X-FromAppId") : ""; + String fromIp = (httpReq != null) ? httpReq.getRemoteHost() : ""; + String fromApp = (headers != null) ? headers.getFirst("X-FromAppId") : ""; - MdcContext.initialize(transId, SearchDbConstants.SDB_SERVICE_NAME, "", fromApp, fromIp); - } + MdcContext.initialize(transId, SearchDbConstants.SDB_SERVICE_NAME, "", fromApp, fromIp); + } - protected static void clearMdcContext() { - MDC.clear(); - } + protected static void clearMdcContext() { + MDC.clear(); + } - public static String buildIndexUri(String index) { + public static String buildIndexUri(String index) { - return (URL_PREFIX + "/indexes/") + index; - } + return (URL_PREFIX + "/indexes/") + index; + } - public static String buildDocumentUri(String index, String documentId) { + public static String buildDocumentUri(String index, String documentId) { - return buildIndexUri(index) + "/documents/" + documentId; - } + return buildIndexUri(index) + "/documents/" + documentId; + } - public static boolean validateIndexUri(String uri) { + public static boolean validateIndexUri(String uri) { - // If the URI starts with a leading '/' character, remove it. - uri = uri.startsWith("/") ? uri.substring(1) : uri; + // If the URI starts with a leading '/' character, remove it. + uri = uri.startsWith("/") ? uri.substring(1) : uri; - // Now, tokenize the URI string. - String[] tokens = uri.split("/"); + // Now, tokenize the URI string. + String[] tokens = uri.split("/"); - return (tokens.length == 6) && (tokens[4].equals("indexes")); + return (tokens.length == 6) && (tokens[4].equals("indexes")); - } + } - public static boolean validateDocumentUri(String uri, boolean requireId) { + public static boolean validateDocumentUri(String uri, boolean requireId) { - // If the URI starts with a leading '/' character, remove it. - uri = uri.startsWith("/") ? uri.substring(1) : uri; + // If the URI starts with a leading '/' character, remove it. + uri = uri.startsWith("/") ? uri.substring(1) : uri; - // Now, tokenize the URI string. - String[] tokens = uri.split("/"); + // Now, tokenize the URI string. + String[] tokens = uri.split("/"); - if (requireId) { - return (tokens.length == 8) && (tokens[4].equals("indexes") - && (tokens[6].equals("documents"))); - } else { - return ((tokens.length == 8) || (tokens.length == 7)) - && (tokens[4].equals("indexes") && (tokens[6].equals("documents"))); + if (requireId) { + return (tokens.length == 8) && (tokens[4].equals("indexes") && (tokens[6].equals("documents"))); + } else { + return ((tokens.length == 8) || (tokens.length == 7)) + && (tokens[4].equals("indexes") && (tokens[6].equals("documents"))); + } } - } - public static String extractIndexFromUri(String uri) { + public static String extractIndexFromUri(String uri) { - // If the URI starts with a leading '/' character, remove it. - uri = uri.startsWith("/") ? uri.substring(1) : uri; + // If the URI starts with a leading '/' character, remove it. + uri = uri.startsWith("/") ? uri.substring(1) : uri; - // Now, tokenize the URI string. - String[] tokens = uri.split("/"); + // Now, tokenize the URI string. + String[] tokens = uri.split("/"); - int i = 0; - for (String token : tokens) { - if (token.equals("indexes")) { - if (i + 1 < tokens.length) { - return tokens[i + 1]; + int i = 0; + for (String token : tokens) { + if (token.equals("indexes")) { + if (i + 1 < tokens.length) { + return tokens[i + 1]; + } + } + i++; } - } - i++; - } - return null; - } + return null; + } - public static String extractIdFromUri(String uri) { + public static String extractIdFromUri(String uri) { - // If the URI starts with a leading '/' character, remove it. - uri = uri.startsWith("/") ? uri.substring(1) : uri; + // If the URI starts with a leading '/' character, remove it. + uri = uri.startsWith("/") ? uri.substring(1) : uri; - // Now, tokenize the URI string. - String[] tokens = uri.split("/"); + // Now, tokenize the URI string. + String[] tokens = uri.split("/"); - int i = 0; - for (String token : tokens) { - if (token.equals("documents")) { - if (i + 1 < tokens.length) { - return tokens[i + 1]; + int i = 0; + for (String token : tokens) { + if (token.equals("documents")) { + if (i + 1 < tokens.length) { + return tokens[i + 1]; + } + } + i++; } - } - i++; - } - return null; - } - - public static String getHttpStatusString(int httpStatusCode) { - // Some of the status codes we use are still in draft state in the standards, and are not - // recognized in the javax library. We need to manually translate these to human-readable - // strings. - String statusString = "Unknown"; - HttpStatus status = null; - - try { - status = HttpStatus.valueOf ( httpStatusCode ); - } catch (IllegalArgumentException e) {} - - - if (status == null) { - switch (httpStatusCode) { - case 207: - statusString = "Multi Status"; - break; - default: - } - } else { - statusString = status.getReasonPhrase (); + return null; } - return statusString; - } + public static String getHttpStatusString(int httpStatusCode) { + // Some of the status codes we use are still in draft state in the standards, and are not + // recognized in the javax library. We need to manually translate these to human-readable + // strings. + String statusString = "Unknown"; + HttpStatus status = null; + + try { + status = HttpStatus.valueOf(httpStatusCode); + } catch (IllegalArgumentException e) { + } + + + if (status == null) { + switch (httpStatusCode) { + case 207: + statusString = "Multi Status"; + break; + default: + } + } else { + statusString = status.getReasonPhrase(); + } + + return statusString; + } } diff --git a/src/main/java/org/onap/aai/sa/rest/BulkApi.java b/src/main/java/org/onap/aai/sa/rest/BulkApi.java index 0770bf1..bf8f187 100644 --- a/src/main/java/org/onap/aai/sa/rest/BulkApi.java +++ b/src/main/java/org/onap/aai/sa/rest/BulkApi.java @@ -41,212 +41,196 @@ import org.springframework.http.ResponseEntity; /** - * This class encapsulates the REST end points associated with performing - * bulk operations against the document store. + * This class encapsulates the REST end points associated with performing bulk operations against the document store. */ public class BulkApi { - /** - * Indicates whether or not we have performed the one-time static - * initialization required for performing schema validation. - */ - protected static AtomicBoolean validationInitialized = new AtomicBoolean(false); - - /** - * Factory used for importing our payload schema for validation purposes. - */ - protected static JsonSchemaFactory schemaFactory = null; - - /** - * Imported payload schema that will be used by our validation methods. - */ - protected static JsonSchema schema = null; - - protected SearchServiceApi searchService = null; - - // Instantiate the loggers. - private static Logger logger = LoggerFactory.getInstance().getLogger(BulkApi.class.getName()); - private static Logger auditLogger = LoggerFactory.getInstance() - .getAuditLogger(BulkApi.class.getName()); - - - /** - * Create a new instance of the BulkApi end point. - */ - public BulkApi(SearchServiceApi searchService) { - this.searchService = searchService; - } - - - /** - * Processes client requests containing a set of operations to be - * performed in bulk. - * - *

Method: POST - * - * @param operations - JSON structure enumerating the operations to be - * performed. - * @param request - Raw HTTP request. - * @param headers - HTTP headers. - * @return - A standard REST response structure. - */ - public ResponseEntity processPost(String operations, - HttpServletRequest request, - HttpHeaders headers, - DocumentStoreInterface documentStore, - ApiUtils apiUtils) { - - - // Initialize the MDC Context for logging purposes. - ApiUtils.initMdcContext(request, headers); - - // Set a default result code and entity string for the request. - int resultCode = 500; - String resultString = "Unexpected error"; - - if (logger.isDebugEnabled()) { - logger.debug("SEARCH: Process Bulk Request - operations = [" - + operations.replaceAll("\n", "") + " ]"); - } + /** + * Indicates whether or not we have performed the one-time static initialization required for performing schema + * validation. + */ + protected static AtomicBoolean validationInitialized = new AtomicBoolean(false); - try { + /** + * Factory used for importing our payload schema for validation purposes. + */ + protected static JsonSchemaFactory schemaFactory = null; - // Validate that the request is correctly authenticated before going - // any further. - if (!searchService.validateRequest(headers, request, - ApiUtils.Action.POST, ApiUtils.SEARCH_AUTH_POLICY_NAME)) { - logger.warn(SearchDbMsgs.BULK_OPERATION_FAILURE, "Authentication failure."); + /** + * Imported payload schema that will be used by our validation methods. + */ + protected static JsonSchema schema = null; - return buildResponse(HttpStatus.FORBIDDEN.value (), - "Authentication failure.", request, apiUtils); - } + protected SearchServiceApi searchService = null; - } catch (Exception e) { + // Instantiate the loggers. + private static Logger logger = LoggerFactory.getInstance().getLogger(BulkApi.class.getName()); + private static Logger auditLogger = LoggerFactory.getInstance().getAuditLogger(BulkApi.class.getName()); - // This is a catch all for any unexpected failure trying to perform - // the authentication. - logger.warn(SearchDbMsgs.BULK_OPERATION_FAILURE, - "Unexpected authentication failure - cause: " + e.getMessage()); - if (logger.isDebugEnabled()) { - logger.debug("Stack Trace:\n" + e.getStackTrace()); - } - return buildResponse(HttpStatus.FORBIDDEN.value (), - "Authentication failure - cause " + e.getMessage(), - request, - apiUtils); + /** + * Create a new instance of the BulkApi end point. + */ + public BulkApi(SearchServiceApi searchService) { + this.searchService = searchService; } - // We expect a payload containing a JSON structure enumerating the - // operations to be performed. - if (operations == null) { - logger.warn(SearchDbMsgs.BULK_OPERATION_FAILURE, "Missing operations list payload"); - - return buildResponse(resultCode, "Missing payload", request, apiUtils); - } - - - // Marshal the supplied json string into a Java object. - ObjectMapper mapper = new ObjectMapper(); - BulkRequest[] requests = null; - try { - requests = mapper.readValue(operations, BulkRequest[].class); - } catch (IOException e) { + /** + * Processes client requests containing a set of operations to be performed in bulk. + * + *

+ * Method: POST + * + * @param operations - JSON structure enumerating the operations to be performed. + * @param request - Raw HTTP request. + * @param headers - HTTP headers. + * @return - A standard REST response structure. + */ + public ResponseEntity processPost(String operations, HttpServletRequest request, HttpHeaders headers, + DocumentStoreInterface documentStore, ApiUtils apiUtils) { + + + // Initialize the MDC Context for logging purposes. + ApiUtils.initMdcContext(request, headers); + + // Set a default result code and entity string for the request. + int resultCode = 500; + String resultString = "Unexpected error"; + + if (logger.isDebugEnabled()) { + logger.debug("SEARCH: Process Bulk Request - operations = [" + operations.replaceAll("\n", "") + " ]"); + } + + try { + + // Validate that the request is correctly authenticated before going + // any further. + if (!searchService.validateRequest(headers, request, ApiUtils.Action.POST, + ApiUtils.SEARCH_AUTH_POLICY_NAME)) { + logger.warn(SearchDbMsgs.BULK_OPERATION_FAILURE, "Authentication failure."); + + return buildResponse(HttpStatus.FORBIDDEN.value(), "Authentication failure.", request, apiUtils); + } + + } catch (Exception e) { + + // This is a catch all for any unexpected failure trying to perform + // the authentication. + logger.warn(SearchDbMsgs.BULK_OPERATION_FAILURE, + "Unexpected authentication failure - cause: " + e.getMessage()); + if (logger.isDebugEnabled()) { + logger.debug("Stack Trace:\n" + e.getStackTrace()); + } + + return buildResponse(HttpStatus.FORBIDDEN.value(), "Authentication failure - cause " + e.getMessage(), + request, apiUtils); + } + + // We expect a payload containing a JSON structure enumerating the + // operations to be performed. + if (operations == null) { + logger.warn(SearchDbMsgs.BULK_OPERATION_FAILURE, "Missing operations list payload"); + + return buildResponse(resultCode, "Missing payload", request, apiUtils); + } + + + // Marshal the supplied json string into a Java object. + ObjectMapper mapper = new ObjectMapper(); + BulkRequest[] requests = null; + try { + requests = mapper.readValue(operations, BulkRequest[].class); + + } catch (IOException e) { + + logger.warn(SearchDbMsgs.BULK_OPERATION_FAILURE, "Failed to marshal operations list: " + e.getMessage()); + if (logger.isDebugEnabled()) { + logger.debug("Stack Trace:\n" + e.getStackTrace()); + } + + // Populate the result code and entity string for our HTTP response + // and return the response to the client.. + return buildResponse(HttpStatus.BAD_REQUEST.value(), "Unable to marshal operations: " + e.getMessage(), + request, apiUtils); + } + + // Verify that our parsed operations list actually contains some valid + // operations. + if (requests.length == 0) { + logger.warn(SearchDbMsgs.BULK_OPERATION_FAILURE, "Empty operations list in bulk request"); + + + // Populate the result code and entity string for our HTTP response + // and return the response to the client.. + return buildResponse(HttpStatus.BAD_REQUEST.value(), "Empty operations list in bulk request", request, + apiUtils); + } + try { + + // Now, forward the set of bulk operations to the DAO for processing. + OperationResult result = documentStore.performBulkOperations(requests); + + // Populate the result code and entity string for our HTTP response. + resultCode = result.getResultCode(); + resultString = (result.getFailureCause() == null) ? result.getResult() : result.getFailureCause(); + + } catch (DocumentStoreOperationException e) { + + logger.warn(SearchDbMsgs.BULK_OPERATION_FAILURE, + "Unexpected failure communicating with document store: " + e.getMessage()); + if (logger.isDebugEnabled()) { + logger.debug("Stack Trace:\n" + e.getStackTrace()); + } + + // Populate the result code and entity string for our HTTP response. + resultCode = HttpStatus.INTERNAL_SERVER_ERROR.value(); + resultString = "Unexpected failure processing bulk operations: " + e.getMessage(); + } - logger.warn(SearchDbMsgs.BULK_OPERATION_FAILURE, - "Failed to marshal operations list: " + e.getMessage()); - if (logger.isDebugEnabled()) { - logger.debug("Stack Trace:\n" + e.getStackTrace()); - } - - // Populate the result code and entity string for our HTTP response - // and return the response to the client.. - return buildResponse(HttpStatus.BAD_REQUEST.value(), - "Unable to marshal operations: " + e.getMessage(), - request, - apiUtils); + // Build our HTTP response. + ResponseEntity response = + ResponseEntity.status(resultCode).contentType(MediaType.APPLICATION_JSON).body(resultString); + + // Log the result. + if ((response.getStatusCodeValue() >= 200) && (response.getStatusCodeValue() < 300)) { + logger.info(SearchDbMsgs.PROCESSED_BULK_OPERATIONS); + } else { + logger.warn(SearchDbMsgs.BULK_OPERATION_FAILURE, (String) response.getBody()); + } + + // Finally, return the HTTP response to the client. + return buildResponse(resultCode, resultString, request, apiUtils); } - // Verify that our parsed operations list actually contains some valid - // operations. - if (requests.length == 0) { - logger.warn(SearchDbMsgs.BULK_OPERATION_FAILURE, "Empty operations list in bulk request"); - - // Populate the result code and entity string for our HTTP response - // and return the response to the client.. - return buildResponse(HttpStatus.BAD_REQUEST.value(), - "Empty operations list in bulk request", - request, - apiUtils); + /** + * This method generates an audit log and returns an HTTP response object. + * + * @param resultCode - The result code to report. + * @param resultString - The result string to report. + * @param request - The HTTP request to extract data from for the audit log. + * @return - An HTTP response object. + */ + private ResponseEntity buildResponse(int resultCode, String resultString, HttpServletRequest request, + ApiUtils apiUtils) { + + ResponseEntity response = + ResponseEntity.status(resultCode).contentType(MediaType.APPLICATION_JSON).body(resultString); + + // Generate our audit log. + auditLogger.info(SearchDbMsgs.PROCESS_REST_REQUEST, + new LogFields().setField(LogLine.DefinedFields.RESPONSE_CODE, resultCode) + .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION, ApiUtils.getHttpStatusString(resultCode)), + (request != null) ? request.getMethod().toString() : "Unknown", + (request != null) ? request.getRequestURL().toString() : "Unknown", + (request != null) ? request.getRemoteHost() : "Unknown", + Integer.toString(response.getStatusCodeValue())); + + // Clear the MDC context so that no other transaction inadvertently + // uses our transaction id. + ApiUtils.clearMdcContext(); + + return response; } - try { - - // Now, forward the set of bulk operations to the DAO for processing. - OperationResult result = documentStore.performBulkOperations(requests); - - // Populate the result code and entity string for our HTTP response. - resultCode = result.getResultCode(); - resultString = (result.getFailureCause() == null) - ? result.getResult() : result.getFailureCause(); - - } catch (DocumentStoreOperationException e) { - - logger.warn(SearchDbMsgs.BULK_OPERATION_FAILURE, - "Unexpected failure communicating with document store: " + e.getMessage()); - if (logger.isDebugEnabled()) { - logger.debug("Stack Trace:\n" + e.getStackTrace()); - } - - // Populate the result code and entity string for our HTTP response. - resultCode = HttpStatus.INTERNAL_SERVER_ERROR.value (); - resultString = "Unexpected failure processing bulk operations: " + e.getMessage(); - } - - // Build our HTTP response. - ResponseEntity response = ResponseEntity.status(resultCode).contentType ( MediaType.APPLICATION_JSON ).body(resultString); - - // Log the result. - if ((response.getStatusCodeValue () >= 200) && (response.getStatusCodeValue () < 300)) { - logger.info(SearchDbMsgs.PROCESSED_BULK_OPERATIONS); - } else { - logger.warn(SearchDbMsgs.BULK_OPERATION_FAILURE, (String) response.getBody ()); - } - - // Finally, return the HTTP response to the client. - return buildResponse(resultCode, resultString, request, apiUtils); - } - - - /** - * This method generates an audit log and returns an HTTP response object. - * - * @param resultCode - The result code to report. - * @param resultString - The result string to report. - * @param request - The HTTP request to extract data from for the audit log. - * @return - An HTTP response object. - */ - private ResponseEntity buildResponse(int resultCode, String resultString, - HttpServletRequest request, ApiUtils apiUtils) { - - ResponseEntity response = ResponseEntity.status(resultCode).contentType ( MediaType.APPLICATION_JSON ) .body(resultString); - - // Generate our audit log. - auditLogger.info(SearchDbMsgs.PROCESS_REST_REQUEST, - new LogFields() - .setField(LogLine.DefinedFields.RESPONSE_CODE, resultCode) - .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION, - ApiUtils.getHttpStatusString(resultCode)), - (request != null) ? request.getMethod().toString () : "Unknown", - (request != null) ? request.getRequestURL ().toString () : "Unknown", - (request != null) ? request.getRemoteHost () : "Unknown", - Integer.toString(response.getStatusCodeValue ())); - - // Clear the MDC context so that no other transaction inadvertently - // uses our transaction id. - ApiUtils.clearMdcContext(); - - return response; - } } diff --git a/src/main/java/org/onap/aai/sa/rest/BulkMetaData.java b/src/main/java/org/onap/aai/sa/rest/BulkMetaData.java index d2e3f5c..7c096a6 100644 --- a/src/main/java/org/onap/aai/sa/rest/BulkMetaData.java +++ b/src/main/java/org/onap/aai/sa/rest/BulkMetaData.java @@ -22,28 +22,28 @@ package org.onap.aai.sa.rest; public class BulkMetaData { - private String url; - private String etag; + private String url; + private String etag; - public String getUrl() { - return url; - } + public String getUrl() { + return url; + } - public void setUrl(String url) { - this.url = url; - } + public void setUrl(String url) { + this.url = url; + } - public String getEtag() { - return etag; - } + public String getEtag() { + return etag; + } - public void setEtag(String anEtag) { - this.etag = anEtag; - } + public void setEtag(String anEtag) { + this.etag = anEtag; + } - @Override - public String toString() { - return "MetaData: [url=" + url + ", etag=" + etag + "]"; - } + @Override + public String toString() { + return "MetaData: [url=" + url + ", etag=" + etag + "]"; + } } diff --git a/src/main/java/org/onap/aai/sa/rest/BulkOperation.java b/src/main/java/org/onap/aai/sa/rest/BulkOperation.java index 41325e5..1490f97 100644 --- a/src/main/java/org/onap/aai/sa/rest/BulkOperation.java +++ b/src/main/java/org/onap/aai/sa/rest/BulkOperation.java @@ -21,41 +21,39 @@ package org.onap.aai.sa.rest; /** - * This class represents a single instance of an operation to be performed - * as part of a bulk request. + * This class represents a single instance of an operation to be performed as part of a bulk request. */ public class BulkOperation { - /** - * Contains meta data to be passed to the document store for it - * to perform the operation. - */ - private BulkMetaData metaData; + /** + * Contains meta data to be passed to the document store for it to perform the operation. + */ + private BulkMetaData metaData; - /** - * Contains the contents of the document to be acted on. - */ - private Document document; + /** + * Contains the contents of the document to be acted on. + */ + private Document document; - public void setMetaData(BulkMetaData metaData) { - this.metaData = metaData; - } + public void setMetaData(BulkMetaData metaData) { + this.metaData = metaData; + } - public BulkMetaData getMetaData() { - return metaData; - } + public BulkMetaData getMetaData() { + return metaData; + } - public Document getDocument() { - return document; - } + public Document getDocument() { + return document; + } - public void setDocument(Document document) { - this.document = document; - } + public void setDocument(Document document) { + this.document = document; + } - @Override - public String toString() { - return "Operation: [" + metaData.toString() + ", " + document + "]"; - } + @Override + public String toString() { + return "Operation: [" + metaData.toString() + ", " + document + "]"; + } } diff --git a/src/main/java/org/onap/aai/sa/rest/BulkRequest.java b/src/main/java/org/onap/aai/sa/rest/BulkRequest.java index e86d7bd..1f8b50e 100644 --- a/src/main/java/org/onap/aai/sa/rest/BulkRequest.java +++ b/src/main/java/org/onap/aai/sa/rest/BulkRequest.java @@ -22,90 +22,89 @@ package org.onap.aai.sa.rest; /** - * This class represents a single instance of a request from the search client - * that would be part of a bundle of such operations sent in a single bulk - * request. + * This class represents a single instance of a request from the search client that would be part of a bundle of such + * operations sent in a single bulk request. */ public class BulkRequest { - public enum OperationType { - CREATE, - UPDATE, - DELETE - } - - private BulkOperation create; - private BulkOperation update; - private BulkOperation delete; - - public BulkOperation getCreate() { - return create; - } - - public void setCreate(BulkOperation create) { - this.create = create; - } - - public BulkOperation getUpdate() { - return update; - } - - public void setUpdate(BulkOperation update) { - this.update = update; - } - - public BulkOperation getDelete() { - return delete; - } - - public void setDelete(BulkOperation delete) { - this.delete = delete; - } - - public OperationType getOperationType() { - - if (create != null) { - return OperationType.CREATE; - } else if (update != null) { - return OperationType.UPDATE; - } else if (delete != null) { - return OperationType.DELETE; - } else { - return null; + public enum OperationType { + CREATE, + UPDATE, + DELETE } - } - - public BulkOperation getOperation() { - if (create != null) { - return create; - } else if (update != null) { - return update; - } else if (delete != null) { - return delete; - } else { - return null; + + private BulkOperation create; + private BulkOperation update; + private BulkOperation delete; + + public BulkOperation getCreate() { + return create; + } + + public void setCreate(BulkOperation create) { + this.create = create; + } + + public BulkOperation getUpdate() { + return update; } - } - - public String getIndex() { - return ApiUtils.extractIndexFromUri(getOperation().getMetaData().getUrl()); - } - - public String getId() { - return ApiUtils.extractIdFromUri(getOperation().getMetaData().getUrl()); - } - - @Override - public String toString() { - - if (create != null) { - return "create: [" + create.toString() + "]\n"; - } else if (update != null) { - return "update: [" + update.toString() + "]\n"; - } else if (delete != null) { - return "delete: [" + delete.toString() + "]\n"; - } else { - return "UNDEFINED"; + + public void setUpdate(BulkOperation update) { + this.update = update; + } + + public BulkOperation getDelete() { + return delete; + } + + public void setDelete(BulkOperation delete) { + this.delete = delete; + } + + public OperationType getOperationType() { + + if (create != null) { + return OperationType.CREATE; + } else if (update != null) { + return OperationType.UPDATE; + } else if (delete != null) { + return OperationType.DELETE; + } else { + return null; + } + } + + public BulkOperation getOperation() { + if (create != null) { + return create; + } else if (update != null) { + return update; + } else if (delete != null) { + return delete; + } else { + return null; + } + } + + public String getIndex() { + return ApiUtils.extractIndexFromUri(getOperation().getMetaData().getUrl()); + } + + public String getId() { + return ApiUtils.extractIdFromUri(getOperation().getMetaData().getUrl()); + } + + @Override + public String toString() { + + if (create != null) { + return "create: [" + create.toString() + "]\n"; + } else if (update != null) { + return "update: [" + update.toString() + "]\n"; + } else if (delete != null) { + return "delete: [" + delete.toString() + "]\n"; + } else { + return "UNDEFINED"; + } } - } } diff --git a/src/main/java/org/onap/aai/sa/rest/Document.java b/src/main/java/org/onap/aai/sa/rest/Document.java index 50ef9ea..89ac2e1 100644 --- a/src/main/java/org/onap/aai/sa/rest/Document.java +++ b/src/main/java/org/onap/aai/sa/rest/Document.java @@ -28,33 +28,33 @@ import java.util.HashMap; import java.util.Map; public class Document { - private Map fields = new HashMap(); + private Map fields = new HashMap(); - @JsonAnyGetter - public Map getFields() { - return fields; - } + @JsonAnyGetter + public Map getFields() { + return fields; + } - @JsonAnySetter - public void setField(String name, Object value) { - fields.put(name, value); - } + @JsonAnySetter + public void setField(String name, Object value) { + fields.put(name, value); + } - public String toJson() throws JsonProcessingException { + public String toJson() throws JsonProcessingException { - ObjectMapper mapper = new ObjectMapper(); - return mapper.writeValueAsString(this); - } + ObjectMapper mapper = new ObjectMapper(); + return mapper.writeValueAsString(this); + } - @Override - public String toString() { - String str = "Document: ["; - for (String key : fields.keySet()) { - str += key + ": " + fields.get(key); - } - str += "]"; + @Override + public String toString() { + String str = "Document: ["; + for (String key : fields.keySet()) { + str += key + ": " + fields.get(key); + } + str += "]"; - return str; - } + return str; + } } diff --git a/src/main/java/org/onap/aai/sa/rest/DocumentApi.java b/src/main/java/org/onap/aai/sa/rest/DocumentApi.java index ca1b351..2d9eb1f 100644 --- a/src/main/java/org/onap/aai/sa/rest/DocumentApi.java +++ b/src/main/java/org/onap/aai/sa/rest/DocumentApi.java @@ -25,11 +25,6 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -//import javax.ws.rs.core.HttpHeaders; -//import javax.ws.rs.core.MediaType; -//import javax.ws.rs.core.Response; -//import javax.ws.rs.core.Response.Status; -// Spring Imports import org.onap.aai.cl.api.LogFields; import org.onap.aai.cl.api.LogLine; import org.onap.aai.cl.api.Logger; @@ -48,587 +43,564 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; public class DocumentApi { - private static final String REQUEST_HEADER_RESOURCE_VERSION = "If-Match"; - private static final String RESPONSE_HEADER_RESOURCE_VERSION = "ETag"; - private static final String REQUEST_HEADER_ALLOW_IMPLICIT_INDEX_CREATION = "X-CreateIndex"; - - protected SearchServiceApi searchService = null; - - private Logger logger = LoggerFactory.getInstance().getLogger(DocumentApi.class.getName()); - private Logger auditLogger = LoggerFactory.getInstance() - .getAuditLogger(DocumentApi.class.getName()); - - public DocumentApi(SearchServiceApi searchService) { - this.searchService = searchService; - } - - public ResponseEntity processPost(String content, HttpServletRequest request, HttpHeaders headers, - HttpServletResponse httpResponse, String index, - DocumentStoreInterface documentStore) { - - // Initialize the MDC Context for logging purposes. - ApiUtils.initMdcContext(request, headers); - - try { - ObjectMapper mapper = new ObjectMapper(); - mapper.setSerializationInclusion(Include.NON_EMPTY); - if (content == null) { - return handleError(request, content, HttpStatus.BAD_REQUEST); - } - - boolean isValid; - try { - isValid = searchService.validateRequest(headers, request, ApiUtils.Action.POST, - ApiUtils.SEARCH_AUTH_POLICY_NAME); - } catch (Exception e) { - logger.info(SearchDbMsgs.EXCEPTION_DURING_METHOD_CALL, - "DocumentApi.processPost", - e.getMessage()); - return handleError(request, content, HttpStatus.FORBIDDEN); - } - - if (!isValid) { - return handleError(request, content, HttpStatus.FORBIDDEN); - } - - DocumentStoreDataEntityImpl document = new DocumentStoreDataEntityImpl(); - document.setContent(content); - - DocumentOperationResult result = documentStore.createDocument(index, document, implicitlyCreateIndex(headers)); - String output = null; - if (result.getResultCode() >= 200 && result.getResultCode() <= 299) { - output = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getDocument()); - } else { - output = result.getError() != null - ? mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getError()) - : result.getFailureCause(); - } - - if (httpResponse != null) { - httpResponse.setHeader(RESPONSE_HEADER_RESOURCE_VERSION, result.getResultVersion()); - } - ResponseEntity response = ResponseEntity.status(result.getResultCode()).contentType ( MediaType.APPLICATION_JSON ).body(output); - logResult(request, HttpStatus.valueOf ( response.getStatusCodeValue () )); - logResult(request, HttpStatus.valueOf ( response.getStatusCodeValue () )); - - // Clear the MDC context so that no other transaction inadvertently - // uses our transaction id. - ApiUtils.clearMdcContext(); - - return response; - } catch (Exception e) { - return handleError(request, e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + private static final String REQUEST_HEADER_RESOURCE_VERSION = "If-Match"; + private static final String RESPONSE_HEADER_RESOURCE_VERSION = "ETag"; + private static final String REQUEST_HEADER_ALLOW_IMPLICIT_INDEX_CREATION = "X-CreateIndex"; + + protected SearchServiceApi searchService = null; + + private Logger logger = LoggerFactory.getInstance().getLogger(DocumentApi.class.getName()); + private Logger auditLogger = LoggerFactory.getInstance().getAuditLogger(DocumentApi.class.getName()); + + public DocumentApi(SearchServiceApi searchService) { + this.searchService = searchService; } - } - - public ResponseEntity processPut(String content, HttpServletRequest request, HttpHeaders headers, - HttpServletResponse httpResponse, String index, - String id, DocumentStoreInterface documentStore) { - - // Initialize the MDC Context for logging purposes. - ApiUtils.initMdcContext(request, headers); - - try { - ObjectMapper mapper = new ObjectMapper(); - mapper.setSerializationInclusion(Include.NON_EMPTY); - if (content == null) { - return handleError(request, content, HttpStatus.BAD_REQUEST); - } - - boolean isValid; - try { - isValid = searchService.validateRequest(headers, request, ApiUtils.Action.PUT, - ApiUtils.SEARCH_AUTH_POLICY_NAME); - } catch (Exception e) { - logger.info(SearchDbMsgs.EXCEPTION_DURING_METHOD_CALL, - "DocumentApi.processPut", - e.getMessage()); - return handleError(request, content, HttpStatus.FORBIDDEN); - } - - if (!isValid) { - return handleError(request, content, HttpStatus.FORBIDDEN); - } - - String resourceVersion = headers.getFirst(REQUEST_HEADER_RESOURCE_VERSION); - - DocumentStoreDataEntityImpl document = new DocumentStoreDataEntityImpl(); - document.setId(id); - document.setContent(content); - document.setVersion(resourceVersion); - - DocumentOperationResult result = null; - if (resourceVersion == null) { - result = documentStore.createDocument(index, document, implicitlyCreateIndex(headers)); - } else { - result = documentStore.updateDocument(index, document, implicitlyCreateIndex(headers)); - } - - String output = null; - if (result.getResultCode() >= 200 && result.getResultCode() <= 299) { - output = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getDocument()); - } else { - output = result.getError() != null - ? mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getError()) - : result.getFailureCause(); - } - if (httpResponse != null) { - httpResponse.setHeader(RESPONSE_HEADER_RESOURCE_VERSION, result.getResultVersion()); - } - ResponseEntity response = ResponseEntity.status(result.getResultCode()).contentType ( MediaType.APPLICATION_JSON ).body(output); - logResult(request, HttpStatus.valueOf ( response.getStatusCodeValue () )); - - // Clear the MDC context so that no other transaction inadvertently - // uses our transaction id. - ApiUtils.clearMdcContext(); - - return response; - } catch (Exception e) { - return handleError(request, e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + + public ResponseEntity processPost(String content, HttpServletRequest request, HttpHeaders headers, + HttpServletResponse httpResponse, String index, DocumentStoreInterface documentStore) { + + // Initialize the MDC Context for logging purposes. + ApiUtils.initMdcContext(request, headers); + + try { + ObjectMapper mapper = new ObjectMapper(); + mapper.setSerializationInclusion(Include.NON_EMPTY); + if (content == null) { + return handleError(request, content, HttpStatus.BAD_REQUEST); + } + + boolean isValid; + try { + isValid = searchService.validateRequest(headers, request, ApiUtils.Action.POST, + ApiUtils.SEARCH_AUTH_POLICY_NAME); + } catch (Exception e) { + logger.info(SearchDbMsgs.EXCEPTION_DURING_METHOD_CALL, "DocumentApi.processPost", e.getMessage()); + return handleError(request, content, HttpStatus.FORBIDDEN); + } + + if (!isValid) { + return handleError(request, content, HttpStatus.FORBIDDEN); + } + + DocumentStoreDataEntityImpl document = new DocumentStoreDataEntityImpl(); + document.setContent(content); + + DocumentOperationResult result = + documentStore.createDocument(index, document, implicitlyCreateIndex(headers)); + String output = null; + if (result.getResultCode() >= 200 && result.getResultCode() <= 299) { + output = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getDocument()); + } else { + output = result.getError() != null + ? mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getError()) + : result.getFailureCause(); + } + + if (httpResponse != null) { + httpResponse.setHeader(RESPONSE_HEADER_RESOURCE_VERSION, result.getResultVersion()); + } + ResponseEntity response = + ResponseEntity.status(result.getResultCode()).contentType(MediaType.APPLICATION_JSON).body(output); + logResult(request, HttpStatus.valueOf(response.getStatusCodeValue())); + logResult(request, HttpStatus.valueOf(response.getStatusCodeValue())); + + // Clear the MDC context so that no other transaction inadvertently + // uses our transaction id. + ApiUtils.clearMdcContext(); + + return response; + } catch (Exception e) { + return handleError(request, e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + } } - } - - public ResponseEntity processDelete(String content, HttpServletRequest request, HttpHeaders headers, - HttpServletResponse httpResponse, String index, String id, - DocumentStoreInterface documentStore) { - - // Initialize the MDC Context for logging purposes. - ApiUtils.initMdcContext(request, headers); - - try { - ObjectMapper mapper = new ObjectMapper(); - mapper.setSerializationInclusion(Include.NON_EMPTY); - boolean isValid; - try { - isValid = searchService.validateRequest(headers, request, ApiUtils.Action.DELETE, - ApiUtils.SEARCH_AUTH_POLICY_NAME); - } catch (Exception e) { - logger.info(SearchDbMsgs.EXCEPTION_DURING_METHOD_CALL, - "DocumentApi.processDelete", - e.getMessage()); - return handleError(request, content, HttpStatus.FORBIDDEN); - } - - if (!isValid) { - return handleError(request, content, HttpStatus.FORBIDDEN); - } - - String resourceVersion = headers.getFirst(REQUEST_HEADER_RESOURCE_VERSION); - if (resourceVersion == null || resourceVersion.isEmpty()) { - return handleError(request, "Request header 'If-Match' missing", - HttpStatus.BAD_REQUEST); - } - - DocumentStoreDataEntityImpl document = new DocumentStoreDataEntityImpl(); - document.setId(id); - document.setVersion(resourceVersion); - - DocumentOperationResult result = documentStore.deleteDocument(index, document); - String output = null; - if (!(result.getResultCode() >= 200 && result.getResultCode() <= 299)) { // - output = result.getError() != null - ? mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getError()) - : result.getFailureCause(); - } - - if (httpResponse != null) { - httpResponse.setHeader(RESPONSE_HEADER_RESOURCE_VERSION, result.getResultVersion()); - } - ResponseEntity response; - if (output == null) { - response = ResponseEntity.status(result.getResultCode()).build(); - } else { - response = ResponseEntity.status(result.getResultCode()).contentType ( MediaType.APPLICATION_JSON ).body(output); - } - - logResult(request, HttpStatus.valueOf ( response.getStatusCodeValue () )); - - // Clear the MDC context so that no other transaction inadvertently - // uses our transaction id. - ApiUtils.clearMdcContext(); - - return response; - } catch (Exception e) { - return handleError(request, e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + + public ResponseEntity processPut(String content, HttpServletRequest request, HttpHeaders headers, + HttpServletResponse httpResponse, String index, String id, DocumentStoreInterface documentStore) { + + // Initialize the MDC Context for logging purposes. + ApiUtils.initMdcContext(request, headers); + + try { + ObjectMapper mapper = new ObjectMapper(); + mapper.setSerializationInclusion(Include.NON_EMPTY); + if (content == null) { + return handleError(request, content, HttpStatus.BAD_REQUEST); + } + + boolean isValid; + try { + isValid = searchService.validateRequest(headers, request, ApiUtils.Action.PUT, + ApiUtils.SEARCH_AUTH_POLICY_NAME); + } catch (Exception e) { + logger.info(SearchDbMsgs.EXCEPTION_DURING_METHOD_CALL, "DocumentApi.processPut", e.getMessage()); + return handleError(request, content, HttpStatus.FORBIDDEN); + } + + if (!isValid) { + return handleError(request, content, HttpStatus.FORBIDDEN); + } + + String resourceVersion = headers.getFirst(REQUEST_HEADER_RESOURCE_VERSION); + + DocumentStoreDataEntityImpl document = new DocumentStoreDataEntityImpl(); + document.setId(id); + document.setContent(content); + document.setVersion(resourceVersion); + + DocumentOperationResult result = null; + if (resourceVersion == null) { + result = documentStore.createDocument(index, document, implicitlyCreateIndex(headers)); + } else { + result = documentStore.updateDocument(index, document, implicitlyCreateIndex(headers)); + } + + String output = null; + if (result.getResultCode() >= 200 && result.getResultCode() <= 299) { + output = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getDocument()); + } else { + output = result.getError() != null + ? mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getError()) + : result.getFailureCause(); + } + if (httpResponse != null) { + httpResponse.setHeader(RESPONSE_HEADER_RESOURCE_VERSION, result.getResultVersion()); + } + ResponseEntity response = + ResponseEntity.status(result.getResultCode()).contentType(MediaType.APPLICATION_JSON).body(output); + logResult(request, HttpStatus.valueOf(response.getStatusCodeValue())); + + // Clear the MDC context so that no other transaction inadvertently + // uses our transaction id. + ApiUtils.clearMdcContext(); + + return response; + } catch (Exception e) { + return handleError(request, e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + } } - } - - public ResponseEntity processGet(String content, HttpServletRequest request, HttpHeaders headers, - HttpServletResponse httpResponse, String index, String id, - DocumentStoreInterface documentStore) { - - // Initialize the MDC Context for logging purposes. - ApiUtils.initMdcContext(request, headers); - - try { - ObjectMapper mapper = new ObjectMapper(); - mapper.setSerializationInclusion(Include.NON_EMPTY); - boolean isValid; - try { - isValid = searchService.validateRequest(headers, request, ApiUtils.Action.GET, - ApiUtils.SEARCH_AUTH_POLICY_NAME); - } catch (Exception e) { - logger.info(SearchDbMsgs.EXCEPTION_DURING_METHOD_CALL, - "DocumentApi.processGet", - e.getMessage()); - return handleError(request, content, HttpStatus.FORBIDDEN); - } - - if (!isValid) { - return handleError(request, content, HttpStatus.FORBIDDEN); - } - - String resourceVersion = headers.getFirst(REQUEST_HEADER_RESOURCE_VERSION); - - DocumentStoreDataEntityImpl document = new DocumentStoreDataEntityImpl(); - document.setId(id); - document.setVersion(resourceVersion); - - DocumentOperationResult result = documentStore.getDocument(index, document); - String output = null; - if (result.getResultCode() >= 200 && result.getResultCode() <= 299) { - output = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getDocument()); - } else { - output = result.getError() != null - ? mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getError()) - : result.getFailureCause(); - } - if (httpResponse != null) { - httpResponse.setHeader(RESPONSE_HEADER_RESOURCE_VERSION, result.getResultVersion()); - } - ResponseEntity response = ResponseEntity.status(result.getResultCode()).contentType ( MediaType.APPLICATION_JSON ).body(output); - logResult(request, HttpStatus.valueOf ( response.getStatusCodeValue () )); - - // Clear the MDC context so that no other transaction inadvertently - // uses our transaction id. - ApiUtils.clearMdcContext(); - - return response; - } catch (Exception e) { - return handleError(request, e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + + public ResponseEntity processDelete(String content, HttpServletRequest request, HttpHeaders headers, + HttpServletResponse httpResponse, String index, String id, DocumentStoreInterface documentStore) { + + // Initialize the MDC Context for logging purposes. + ApiUtils.initMdcContext(request, headers); + + try { + ObjectMapper mapper = new ObjectMapper(); + mapper.setSerializationInclusion(Include.NON_EMPTY); + boolean isValid; + try { + isValid = searchService.validateRequest(headers, request, ApiUtils.Action.DELETE, + ApiUtils.SEARCH_AUTH_POLICY_NAME); + } catch (Exception e) { + logger.info(SearchDbMsgs.EXCEPTION_DURING_METHOD_CALL, "DocumentApi.processDelete", e.getMessage()); + return handleError(request, content, HttpStatus.FORBIDDEN); + } + + if (!isValid) { + return handleError(request, content, HttpStatus.FORBIDDEN); + } + + String resourceVersion = headers.getFirst(REQUEST_HEADER_RESOURCE_VERSION); + if (resourceVersion == null || resourceVersion.isEmpty()) { + return handleError(request, "Request header 'If-Match' missing", HttpStatus.BAD_REQUEST); + } + + DocumentStoreDataEntityImpl document = new DocumentStoreDataEntityImpl(); + document.setId(id); + document.setVersion(resourceVersion); + + DocumentOperationResult result = documentStore.deleteDocument(index, document); + String output = null; + if (!(result.getResultCode() >= 200 && result.getResultCode() <= 299)) { // + output = result.getError() != null + ? mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getError()) + : result.getFailureCause(); + } + + if (httpResponse != null) { + httpResponse.setHeader(RESPONSE_HEADER_RESOURCE_VERSION, result.getResultVersion()); + } + ResponseEntity response; + if (output == null) { + response = ResponseEntity.status(result.getResultCode()).build(); + } else { + response = ResponseEntity.status(result.getResultCode()).contentType(MediaType.APPLICATION_JSON) + .body(output); + } + + logResult(request, HttpStatus.valueOf(response.getStatusCodeValue())); + + // Clear the MDC context so that no other transaction inadvertently + // uses our transaction id. + ApiUtils.clearMdcContext(); + + return response; + } catch (Exception e) { + return handleError(request, e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + } } - } - - public ResponseEntity processSearchWithGet(String content, HttpServletRequest request, - HttpHeaders headers, String index, - String queryText, DocumentStoreInterface documentStore) { - - // Initialize the MDC Context for logging purposes. - ApiUtils.initMdcContext(request, headers); - - try { - ObjectMapper mapper = new ObjectMapper(); - mapper.setSerializationInclusion(Include.NON_EMPTY); - - boolean isValid; - try { - isValid = searchService.validateRequest(headers, request, ApiUtils.Action.GET, - ApiUtils.SEARCH_AUTH_POLICY_NAME); - } catch (Exception e) { - logger.info(SearchDbMsgs.EXCEPTION_DURING_METHOD_CALL, - "processSearchWithGet", - e.getMessage()); - return handleError(request, content, HttpStatus.FORBIDDEN); - } - - if (!isValid) { - return handleError(request, content, HttpStatus.FORBIDDEN); - } - - SearchOperationResult result = documentStore.search(index, queryText); - String output = null; - if (result.getResultCode() >= 200 && result.getResultCode() <= 299) { - output = mapper.writerWithDefaultPrettyPrinter() - .writeValueAsString(result.getSearchResult()); - } else { - output = result.getError() != null - ? mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getError()) - : result.getFailureCause(); - } - ResponseEntity response = ResponseEntity.status(result.getResultCode()).contentType ( MediaType.APPLICATION_JSON ).body(output); - - // Clear the MDC context so that no other transaction inadvertently - // uses our transaction id. - ApiUtils.clearMdcContext(); - - return response; - } catch (Exception e) { - return handleError(request, e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + + public ResponseEntity processGet(String content, HttpServletRequest request, HttpHeaders headers, + HttpServletResponse httpResponse, String index, String id, DocumentStoreInterface documentStore) { + + // Initialize the MDC Context for logging purposes. + ApiUtils.initMdcContext(request, headers); + + try { + ObjectMapper mapper = new ObjectMapper(); + mapper.setSerializationInclusion(Include.NON_EMPTY); + boolean isValid; + try { + isValid = searchService.validateRequest(headers, request, ApiUtils.Action.GET, + ApiUtils.SEARCH_AUTH_POLICY_NAME); + } catch (Exception e) { + logger.info(SearchDbMsgs.EXCEPTION_DURING_METHOD_CALL, "DocumentApi.processGet", e.getMessage()); + return handleError(request, content, HttpStatus.FORBIDDEN); + } + + if (!isValid) { + return handleError(request, content, HttpStatus.FORBIDDEN); + } + + String resourceVersion = headers.getFirst(REQUEST_HEADER_RESOURCE_VERSION); + + DocumentStoreDataEntityImpl document = new DocumentStoreDataEntityImpl(); + document.setId(id); + document.setVersion(resourceVersion); + + DocumentOperationResult result = documentStore.getDocument(index, document); + String output = null; + if (result.getResultCode() >= 200 && result.getResultCode() <= 299) { + output = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getDocument()); + } else { + output = result.getError() != null + ? mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getError()) + : result.getFailureCause(); + } + if (httpResponse != null) { + httpResponse.setHeader(RESPONSE_HEADER_RESOURCE_VERSION, result.getResultVersion()); + } + ResponseEntity response = + ResponseEntity.status(result.getResultCode()).contentType(MediaType.APPLICATION_JSON).body(output); + logResult(request, HttpStatus.valueOf(response.getStatusCodeValue())); + + // Clear the MDC context so that no other transaction inadvertently + // uses our transaction id. + ApiUtils.clearMdcContext(); + + return response; + } catch (Exception e) { + return handleError(request, e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + } } - } - public ResponseEntity queryWithGetWithPayload(String content, HttpServletRequest request, - HttpHeaders headers, String index, - DocumentStoreInterface documentStore) { + public ResponseEntity processSearchWithGet(String content, HttpServletRequest request, HttpHeaders headers, + String index, String queryText, DocumentStoreInterface documentStore) { + + // Initialize the MDC Context for logging purposes. + ApiUtils.initMdcContext(request, headers); + + try { + ObjectMapper mapper = new ObjectMapper(); + mapper.setSerializationInclusion(Include.NON_EMPTY); + + boolean isValid; + try { + isValid = searchService.validateRequest(headers, request, ApiUtils.Action.GET, + ApiUtils.SEARCH_AUTH_POLICY_NAME); + } catch (Exception e) { + logger.info(SearchDbMsgs.EXCEPTION_DURING_METHOD_CALL, "processSearchWithGet", e.getMessage()); + return handleError(request, content, HttpStatus.FORBIDDEN); + } + + if (!isValid) { + return handleError(request, content, HttpStatus.FORBIDDEN); + } + + SearchOperationResult result = documentStore.search(index, queryText); + String output = null; + if (result.getResultCode() >= 200 && result.getResultCode() <= 299) { + output = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getSearchResult()); + } else { + output = result.getError() != null + ? mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getError()) + : result.getFailureCause(); + } + ResponseEntity response = + ResponseEntity.status(result.getResultCode()).contentType(MediaType.APPLICATION_JSON).body(output); + + // Clear the MDC context so that no other transaction inadvertently + // uses our transaction id. + ApiUtils.clearMdcContext(); + + return response; + } catch (Exception e) { + return handleError(request, e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + public ResponseEntity queryWithGetWithPayload(String content, HttpServletRequest request, + HttpHeaders headers, String index, DocumentStoreInterface documentStore) { - // Initialize the MDC Context for logging purposes. - ApiUtils.initMdcContext(request, headers); + // Initialize the MDC Context for logging purposes. + ApiUtils.initMdcContext(request, headers); - logger.info(SearchDbMsgs.PROCESS_PAYLOAD_QUERY, "GET", (request != null) - ? request.getRequestURL ().toString () : ""); - if (logger.isDebugEnabled()) { - logger.debug("Request Body: " + content); + logger.info(SearchDbMsgs.PROCESS_PAYLOAD_QUERY, "GET", + (request != null) ? request.getRequestURL().toString() : ""); + if (logger.isDebugEnabled()) { + logger.debug("Request Body: " + content); + } + return processQuery(index, content, request, headers, documentStore); } - return processQuery(index, content, request, headers, documentStore); - } - public ResponseEntity processSearchWithPost(String content, HttpServletRequest request, - HttpHeaders headers, String index, - DocumentStoreInterface documentStore) { + public ResponseEntity processSearchWithPost(String content, HttpServletRequest request, HttpHeaders headers, + String index, DocumentStoreInterface documentStore) { + + // Initialize the MDC Context for logging purposes. + ApiUtils.initMdcContext(request, headers); - // Initialize the MDC Context for logging purposes. - ApiUtils.initMdcContext(request, headers); + logger.info(SearchDbMsgs.PROCESS_PAYLOAD_QUERY, "POST", + (request != null) ? request.getRequestURL().toString() : ""); + if (logger.isDebugEnabled()) { + logger.debug("Request Body: " + content); + } - logger.info(SearchDbMsgs.PROCESS_PAYLOAD_QUERY, "POST", (request != null) - ? request.getRequestURL ().toString () : ""); - if (logger.isDebugEnabled()) { - logger.debug("Request Body: " + content); + return processQuery(index, content, request, headers, documentStore); } - return processQuery(index, content, request, headers, documentStore); - } + public ResponseEntity processSuggestQueryWithPost(String content, HttpServletRequest request, + HttpHeaders headers, String index, DocumentStoreInterface documentStore) { - public ResponseEntity processSuggestQueryWithPost(String content, HttpServletRequest request, - HttpHeaders headers, String index, DocumentStoreInterface documentStore) { + // Initialize the MDC Context for logging purposes. + ApiUtils.initMdcContext(request, headers); - // Initialize the MDC Context for logging purposes. - ApiUtils.initMdcContext(request, headers); + logger.info(SearchDbMsgs.PROCESS_PAYLOAD_QUERY, "POST", + (request != null) ? request.getRequestURL().toString() : ""); + if (logger.isDebugEnabled()) { + logger.debug("Request Body: " + content); + } - logger.info(SearchDbMsgs.PROCESS_PAYLOAD_QUERY, "POST", - (request != null) ? request.getRequestURL().toString() : ""); - if (logger.isDebugEnabled()) { - logger.debug("Request Body: " + content); + return processSuggestQuery(index, content, request, headers, documentStore); } - return processSuggestQuery(index, content, request, headers, documentStore); - } - - /** - * Common handler for query requests. This is called by both the GET with - * payload and POST with payload variants of the query endpoint. - * - * @param index - The index to be queried against. - * @param content - The payload containing the query structure. - * @param request - The HTTP request. - * @param headers - The HTTP headers. - * @return - A standard HTTP response. - */ - private ResponseEntity processQuery(String index, String content, HttpServletRequest request, - HttpHeaders headers, DocumentStoreInterface documentStore) { - - try { - ObjectMapper mapper = new ObjectMapper(); - mapper.setSerializationInclusion(Include.NON_EMPTY); - - // Make sure that we were supplied a payload before proceeding. - if (content == null) { - return handleError(request, content, HttpStatus.BAD_REQUEST); - } - - // Validate that the request has the appropriate authorization. - boolean isValid; - try { - isValid = searchService.validateRequest(headers, request, ApiUtils.Action.POST, - ApiUtils.SEARCH_AUTH_POLICY_NAME); - - } catch (Exception e) { - logger.info(SearchDbMsgs.EXCEPTION_DURING_METHOD_CALL, - "processQuery", - e.getMessage()); - return handleError(request, content, HttpStatus.FORBIDDEN); - } - - if (!isValid) { - return handleError(request, content, HttpStatus.FORBIDDEN); - } - - SearchStatement searchStatement; - - try { - // Marshall the supplied request payload into a search statement - // object. - searchStatement = mapper.readValue(content, SearchStatement.class); - - } catch (Exception e) { - return handleError(request, e.getMessage(), HttpStatus.BAD_REQUEST); - } - - // Now, submit the search statement, translated into - // ElasticSearch syntax, to the document store DAO. - SearchOperationResult result = documentStore.searchWithPayload(index, - searchStatement.toElasticSearch()); - String output = null; - if (result.getResultCode() >= 200 && result.getResultCode() <= 299) { - output = prepareOutput(mapper, result); - } else { - output = result.getError() != null - ? mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getError()) - : result.getFailureCause(); - } - ResponseEntity response = ResponseEntity.status(result.getResultCode()).contentType ( MediaType.APPLICATION_JSON ).body(output); - - // Clear the MDC context so that no other transaction inadvertently - // uses our transaction id. - ApiUtils.clearMdcContext(); - - return response; - - } catch (Exception e) { - return handleError(request, e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + /** + * Common handler for query requests. This is called by both the GET with payload and POST with payload variants of + * the query endpoint. + * + * @param index - The index to be queried against. + * @param content - The payload containing the query structure. + * @param request - The HTTP request. + * @param headers - The HTTP headers. + * @return - A standard HTTP response. + */ + private ResponseEntity processQuery(String index, String content, HttpServletRequest request, HttpHeaders headers, + DocumentStoreInterface documentStore) { + + try { + ObjectMapper mapper = new ObjectMapper(); + mapper.setSerializationInclusion(Include.NON_EMPTY); + + // Make sure that we were supplied a payload before proceeding. + if (content == null) { + return handleError(request, content, HttpStatus.BAD_REQUEST); + } + + // Validate that the request has the appropriate authorization. + boolean isValid; + try { + isValid = searchService.validateRequest(headers, request, ApiUtils.Action.POST, + ApiUtils.SEARCH_AUTH_POLICY_NAME); + + } catch (Exception e) { + logger.info(SearchDbMsgs.EXCEPTION_DURING_METHOD_CALL, "processQuery", e.getMessage()); + return handleError(request, content, HttpStatus.FORBIDDEN); + } + + if (!isValid) { + return handleError(request, content, HttpStatus.FORBIDDEN); + } + + SearchStatement searchStatement; + + try { + // Marshall the supplied request payload into a search statement + // object. + searchStatement = mapper.readValue(content, SearchStatement.class); + + } catch (Exception e) { + return handleError(request, e.getMessage(), HttpStatus.BAD_REQUEST); + } + + // Now, submit the search statement, translated into + // ElasticSearch syntax, to the document store DAO. + SearchOperationResult result = documentStore.searchWithPayload(index, searchStatement.toElasticSearch()); + String output = null; + if (result.getResultCode() >= 200 && result.getResultCode() <= 299) { + output = prepareOutput(mapper, result); + } else { + output = result.getError() != null + ? mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getError()) + : result.getFailureCause(); + } + ResponseEntity response = + ResponseEntity.status(result.getResultCode()).contentType(MediaType.APPLICATION_JSON).body(output); + + // Clear the MDC context so that no other transaction inadvertently + // uses our transaction id. + ApiUtils.clearMdcContext(); + + return response; + + } catch (Exception e) { + return handleError(request, e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + } } - } - - - /** - * Common handler for query requests. This is called by both the GET with payload and POST with - * payload variants of the query endpoint. - * - * @param index - The index to be queried against. - * @param content - The payload containing the query structure. - * @param request - The HTTP request. - * @param headers - The HTTP headers. - * @return - A standard HTTP response. - */ - private ResponseEntity processSuggestQuery(String index, String content, HttpServletRequest request, - HttpHeaders headers, DocumentStoreInterface documentStore) { - - try { - ObjectMapper mapper = new ObjectMapper(); - mapper.setSerializationInclusion(Include.NON_EMPTY); - - // Make sure that we were supplied a payload before proceeding. - if (content == null) { - return handleError(request, content, HttpStatus.BAD_REQUEST); - } - - // Validate that the request has the appropriate authorization. - boolean isValid; - try { - isValid = searchService.validateRequest(headers, request, ApiUtils.Action.POST, - ApiUtils.SEARCH_AUTH_POLICY_NAME); - - } catch (Exception e) { - logger.info(SearchDbMsgs.EXCEPTION_DURING_METHOD_CALL, "processQuery", e.getMessage()); - return handleError(request, content, HttpStatus.FORBIDDEN); - } - - if (!isValid) { - return handleError(request, content, HttpStatus.FORBIDDEN); - } - - SuggestionStatement suggestionStatement; - - try { - // Marshall the supplied request payload into a search statement - // object. - suggestionStatement = mapper.readValue(content, SuggestionStatement.class); - - } catch (Exception e) { - return handleError(request, e.getMessage(), HttpStatus.BAD_REQUEST); - } - - // Now, submit the search statement, translated into - // ElasticSearch syntax, to the document store DAO. - SearchOperationResult result = - documentStore.suggestionQueryWithPayload(index, suggestionStatement.toElasticSearch()); - String output = null; - if (result.getResultCode() >= 200 && result.getResultCode() <= 299) { - output = prepareSuggestOutput(mapper, result); - } else { - output = result.getError() != null - ? mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getError()) - : result.getFailureCause(); - } - ResponseEntity response = ResponseEntity.status(result.getResultCode()).body(output); - - // Clear the MDC context so that no other transaction inadvertently - // uses our transaction id. - ApiUtils.clearMdcContext(); - - return response; - - } catch (Exception e) { - return handleError(request, e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + + + /** + * Common handler for query requests. This is called by both the GET with payload and POST with payload variants of + * the query endpoint. + * + * @param index - The index to be queried against. + * @param content - The payload containing the query structure. + * @param request - The HTTP request. + * @param headers - The HTTP headers. + * @return - A standard HTTP response. + */ + private ResponseEntity processSuggestQuery(String index, String content, HttpServletRequest request, + HttpHeaders headers, DocumentStoreInterface documentStore) { + + try { + ObjectMapper mapper = new ObjectMapper(); + mapper.setSerializationInclusion(Include.NON_EMPTY); + + // Make sure that we were supplied a payload before proceeding. + if (content == null) { + return handleError(request, content, HttpStatus.BAD_REQUEST); + } + + // Validate that the request has the appropriate authorization. + boolean isValid; + try { + isValid = searchService.validateRequest(headers, request, ApiUtils.Action.POST, + ApiUtils.SEARCH_AUTH_POLICY_NAME); + + } catch (Exception e) { + logger.info(SearchDbMsgs.EXCEPTION_DURING_METHOD_CALL, "processQuery", e.getMessage()); + return handleError(request, content, HttpStatus.FORBIDDEN); + } + + if (!isValid) { + return handleError(request, content, HttpStatus.FORBIDDEN); + } + + SuggestionStatement suggestionStatement; + + try { + // Marshall the supplied request payload into a search statement + // object. + suggestionStatement = mapper.readValue(content, SuggestionStatement.class); + + } catch (Exception e) { + return handleError(request, e.getMessage(), HttpStatus.BAD_REQUEST); + } + + // Now, submit the search statement, translated into + // ElasticSearch syntax, to the document store DAO. + SearchOperationResult result = + documentStore.suggestionQueryWithPayload(index, suggestionStatement.toElasticSearch()); + String output = null; + if (result.getResultCode() >= 200 && result.getResultCode() <= 299) { + output = prepareSuggestOutput(mapper, result); + } else { + output = result.getError() != null + ? mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getError()) + : result.getFailureCause(); + } + ResponseEntity response = ResponseEntity.status(result.getResultCode()).body(output); + + // Clear the MDC context so that no other transaction inadvertently + // uses our transaction id. + ApiUtils.clearMdcContext(); + + return response; + + } catch (Exception e) { + return handleError(request, e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + } } - } - - /** - * Checks the supplied HTTP headers to see if we should allow the underlying document - * store to implicitly create the index referenced in a document PUT or POST if it - * does not already exist in the data store. - * - * @param headers - The HTTP headers to examine. - * - * @return - true if the headers indicate that missing indices should be implicitly created, - * false otherwise. - */ - private boolean implicitlyCreateIndex(HttpHeaders headers) { - - boolean createIndexIfNotPresent = false; - String implicitIndexCreationHeader = - headers.getFirst(REQUEST_HEADER_ALLOW_IMPLICIT_INDEX_CREATION); - - if( (implicitIndexCreationHeader != null) && (implicitIndexCreationHeader.equals("true")) ) { - createIndexIfNotPresent = true; + + /** + * Checks the supplied HTTP headers to see if we should allow the underlying document store to implicitly create the + * index referenced in a document PUT or POST if it does not already exist in the data store. + * + * @param headers - The HTTP headers to examine. + * + * @return - true if the headers indicate that missing indices should be implicitly created, false otherwise. + */ + private boolean implicitlyCreateIndex(HttpHeaders headers) { + + boolean createIndexIfNotPresent = false; + String implicitIndexCreationHeader = headers.getFirst(REQUEST_HEADER_ALLOW_IMPLICIT_INDEX_CREATION); + + if ((implicitIndexCreationHeader != null) && (implicitIndexCreationHeader.equals("true"))) { + createIndexIfNotPresent = true; + } + + return createIndexIfNotPresent; + } + + private String prepareOutput(ObjectMapper mapper, SearchOperationResult result) throws JsonProcessingException { + StringBuffer output = new StringBuffer(); + output.append("{\r\n\"searchResult\":"); + output.append(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getSearchResult())); + AggregationResults aggs = result.getAggregationResult(); + if (aggs != null) { + output.append(",\r\n\"aggregationResult\":"); + output.append(mapper.setSerializationInclusion(Include.NON_NULL).writerWithDefaultPrettyPrinter() + .writeValueAsString(aggs)); + } + output.append("\r\n}"); + return output.toString(); + } + + private String prepareSuggestOutput(ObjectMapper mapper, SearchOperationResult result) + throws JsonProcessingException { + StringBuffer output = new StringBuffer(); + output.append("{\r\n\"searchResult\":"); + output.append(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getSuggestResult())); + AggregationResults aggs = result.getAggregationResult(); + if (aggs != null) { + output.append(",\r\n\"aggregationResult\":"); + output.append(mapper.setSerializationInclusion(Include.NON_NULL).writerWithDefaultPrettyPrinter() + .writeValueAsString(aggs)); + } + output.append("\r\n}"); + return output.toString(); } - - return createIndexIfNotPresent; - } - - private String prepareOutput(ObjectMapper mapper, SearchOperationResult result) - throws JsonProcessingException { - StringBuffer output = new StringBuffer(); - output.append("{\r\n\"searchResult\":"); - output.append( - mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getSearchResult())); - AggregationResults aggs = result.getAggregationResult(); - if (aggs != null) { - output.append(",\r\n\"aggregationResult\":"); - output.append(mapper.setSerializationInclusion(Include.NON_NULL) - .writerWithDefaultPrettyPrinter().writeValueAsString(aggs)); + + private ResponseEntity handleError(HttpServletRequest request, String message, HttpStatus status) { + logResult(request, status); + return ResponseEntity.status(status).contentType(MediaType.APPLICATION_JSON).body(message); } - output.append("\r\n}"); - return output.toString(); - } - - private String prepareSuggestOutput(ObjectMapper mapper, SearchOperationResult result) - throws JsonProcessingException { - StringBuffer output = new StringBuffer(); - output.append("{\r\n\"searchResult\":"); - output.append( - mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getSuggestResult())); - AggregationResults aggs = result.getAggregationResult(); - if (aggs != null) { - output.append(",\r\n\"aggregationResult\":"); - output.append(mapper.setSerializationInclusion(Include.NON_NULL) - .writerWithDefaultPrettyPrinter().writeValueAsString(aggs)); + + void logResult(HttpServletRequest request, HttpStatus status) { + + logger.info(SearchDbMsgs.PROCESS_REST_REQUEST, (request != null) ? request.getMethod().toString() : "", + (request != null) ? request.getRequestURL().toString() : "", + (request != null) ? request.getRemoteHost() : "", Integer.toString(status.value())); + + auditLogger.info(SearchDbMsgs.PROCESS_REST_REQUEST, + new LogFields().setField(LogLine.DefinedFields.RESPONSE_CODE, status.value()) + .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION, status.getReasonPhrase()), + (request != null) ? request.getMethod().toString() : "", + (request != null) ? request.getRequestURL().toString() : "", + (request != null) ? request.getRemoteHost() : "", Integer.toString(status.value())); + + // Clear the MDC context so that no other transaction inadvertently + // uses our transaction id. + ApiUtils.clearMdcContext(); } - output.append("\r\n}"); - return output.toString(); - } - - private ResponseEntity handleError( HttpServletRequest request, String message, HttpStatus status) { - logResult(request, status); - return ResponseEntity.status(status).contentType ( MediaType.APPLICATION_JSON ).body(message); - } - - void logResult(HttpServletRequest request, HttpStatus status) { - - logger.info(SearchDbMsgs.PROCESS_REST_REQUEST, (request != null) ? request.getMethod().toString () : "", - (request != null) ? request.getRequestURL ().toString () : "", - (request != null) ? request.getRemoteHost () : "", Integer.toString(status.value ())); - - auditLogger.info(SearchDbMsgs.PROCESS_REST_REQUEST, - new LogFields() - .setField(LogLine.DefinedFields.RESPONSE_CODE, status.value()) - .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION, status.getReasonPhrase()), - (request != null) ? request.getMethod().toString () : "", - (request != null) ? request.getRequestURL ().toString () : "", - (request != null) ? request.getRemoteHost () : "", Integer.toString(status.value())); - - // Clear the MDC context so that no other transaction inadvertently - // uses our transaction id. - ApiUtils.clearMdcContext(); - } } diff --git a/src/main/java/org/onap/aai/sa/rest/IndexApi.java b/src/main/java/org/onap/aai/sa/rest/IndexApi.java index f5840e2..3371fcd 100644 --- a/src/main/java/org/onap/aai/sa/rest/IndexApi.java +++ b/src/main/java/org/onap/aai/sa/rest/IndexApi.java @@ -32,398 +32,383 @@ import org.onap.aai.sa.searchdbabstraction.elasticsearch.dao.DocumentStoreInterf import org.onap.aai.sa.searchdbabstraction.elasticsearch.exception.DocumentStoreOperationException; import org.onap.aai.sa.searchdbabstraction.entity.OperationResult; import org.onap.aai.sa.searchdbabstraction.logging.SearchDbMsgs; -// Spring Imports import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; -// import org.springframework.http.server.HttpServletRequest; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; /** - * This class encapsulates the REST end points associated with manipulating - * indexes in the document store. + * This class encapsulates the REST end points associated with manipulating indexes in the document store. */ public class IndexApi { - private static final String HEADER_VALIDATION_SUCCESS = "SUCCESS"; - protected SearchServiceApi searchService = null; - - /** - * Configuration for the custom analyzers that will be used for indexing. - */ - protected AnalysisConfiguration analysisConfig; - - // Set up the loggers. - private static Logger logger = LoggerFactory.getInstance() - .getLogger(IndexApi.class.getName()); - private static Logger auditLogger = LoggerFactory.getInstance() - .getAuditLogger(IndexApi.class.getName()); - - - public IndexApi(SearchServiceApi searchService) { - this.searchService = searchService; - init(); - } - - - /** - * Initializes the end point. - * - * @throws FileNotFoundException - * @throws IOException - * @throws DocumentStoreOperationException - */ - public void init() { - - // Instantiate our analysis configuration object. - analysisConfig = new AnalysisConfiguration(); - } - - - /** - * Processes client requests to create a new index and document type in the - * document store. - * - * @param documentSchema - The contents of the request body which is expected - * to be a JSON structure which corresponds to the - * schema defined in document.schema.json - * @param index - The name of the index to create. - * @return - A Standard REST response - */ - public ResponseEntity processCreateIndex (String documentSchema, - HttpServletRequest request, - HttpHeaders headers, - String index, - DocumentStoreInterface documentStore) { - - int resultCode = 500; - String resultString = "Unexpected error"; - - // Initialize the MDC Context for logging purposes. - ApiUtils.initMdcContext(request, headers); - - // Validate that the request is correctly authenticated before going - // any further. - try { - - if (!searchService.validateRequest(headers, request, - ApiUtils.Action.POST, ApiUtils.SEARCH_AUTH_POLICY_NAME)) { - logger.warn(SearchDbMsgs.INDEX_CREATE_FAILURE, index, "Authentication failure."); - return errorResponse(HttpStatus.FORBIDDEN, "Authentication failure.", request); - } - - } catch (Exception e) { - - logger.warn(SearchDbMsgs.INDEX_CREATE_FAILURE, index, - "Unexpected authentication failure - cause: " + e.getMessage()); - return errorResponse(HttpStatus.FORBIDDEN, "Authentication failure.", request); + private static final String HEADER_VALIDATION_SUCCESS = "SUCCESS"; + protected SearchServiceApi searchService = null; + + /** + * Configuration for the custom analyzers that will be used for indexing. + */ + protected AnalysisConfiguration analysisConfig; + + // Set up the loggers. + private static Logger logger = LoggerFactory.getInstance().getLogger(IndexApi.class.getName()); + private static Logger auditLogger = LoggerFactory.getInstance().getAuditLogger(IndexApi.class.getName()); + + + public IndexApi(SearchServiceApi searchService) { + this.searchService = searchService; + init(); } - // We expect a payload containing the document schema. Make sure - // it is present. - if (documentSchema == null) { - logger.warn(SearchDbMsgs.INDEX_CREATE_FAILURE, index, "Missing document schema payload"); - return errorResponse(HttpStatus.valueOf(resultCode), "Missing payload", request); + /** + * Initializes the end point. + * + * @throws FileNotFoundException + * @throws IOException + * @throws DocumentStoreOperationException + */ + public void init() { + + // Instantiate our analysis configuration object. + analysisConfig = new AnalysisConfiguration(); } - try { - // Marshal the supplied json string into a document schema object. - ObjectMapper mapper = new ObjectMapper(); - DocumentSchema schema = mapper.readValue(documentSchema, DocumentSchema.class); + /** + * Processes client requests to create a new index and document type in the document store. + * + * @param documentSchema - The contents of the request body which is expected to be a JSON structure which + * corresponds to the schema defined in document.schema.json + * @param index - The name of the index to create. + * @return - A Standard REST response + */ + public ResponseEntity processCreateIndex(String documentSchema, HttpServletRequest request, + HttpHeaders headers, String index, DocumentStoreInterface documentStore) { - // Now, ask the DAO to create the index. - OperationResult result = documentStore.createIndex(index, schema); + int resultCode = 500; + String resultString = "Unexpected error"; - // Extract the result code and string from the OperationResult - // object so that we can use them to generate a standard REST - // response. - // Note that we want to return a 201 result code on a successful - // create, so if we get back a 200 from the document store, - // translate that int a 201. - resultCode = (result.getResultCode() == 200) ? 201 : result.getResultCode(); - resultString = (result.getFailureCause() == null) - ? result.getResult() : result.getFailureCause(); + // Initialize the MDC Context for logging purposes. + ApiUtils.initMdcContext(request, headers); - } catch (com.fasterxml.jackson.core.JsonParseException - | com.fasterxml.jackson.databind.JsonMappingException e) { + // Validate that the request is correctly authenticated before going + // any further. + try { - // We were unable to marshal the supplied json string into a valid - // document schema, so return an appropriate error response. - resultCode = HttpStatus.BAD_REQUEST.value(); - resultString = "Malformed schema: " + e.getMessage(); + if (!searchService.validateRequest(headers, request, ApiUtils.Action.POST, + ApiUtils.SEARCH_AUTH_POLICY_NAME)) { + logger.warn(SearchDbMsgs.INDEX_CREATE_FAILURE, index, "Authentication failure."); + return errorResponse(HttpStatus.FORBIDDEN, "Authentication failure.", request); + } - } catch (IOException e) { + } catch (Exception e) { - // We'll treat this is a general internal error. - resultCode = HttpStatus.INTERNAL_SERVER_ERROR.value(); - resultString = "IO Failure: " + e.getMessage(); - } + logger.warn(SearchDbMsgs.INDEX_CREATE_FAILURE, index, + "Unexpected authentication failure - cause: " + e.getMessage()); + return errorResponse(HttpStatus.FORBIDDEN, "Authentication failure.", request); + } - ResponseEntity response = ResponseEntity.status(resultCode).contentType ( MediaType.APPLICATION_JSON ).body(resultString); + // We expect a payload containing the document schema. Make sure + // it is present. + if (documentSchema == null) { + logger.warn(SearchDbMsgs.INDEX_CREATE_FAILURE, index, "Missing document schema payload"); + return errorResponse(HttpStatus.valueOf(resultCode), "Missing payload", request); + } - // Log the result. - if ((response.getStatusCodeValue() >= 200) && (response.getStatusCodeValue() < 300)) { - logger.info(SearchDbMsgs.CREATED_INDEX, index); - } else { - logger.warn(SearchDbMsgs.INDEX_CREATE_FAILURE, index, resultString); - } + try { - // Generate our audit log. - auditLogger.info(SearchDbMsgs.PROCESS_REST_REQUEST, - new LogFields() - .setField(LogLine.DefinedFields.RESPONSE_CODE, resultCode) - .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION, - HttpStatus.valueOf(resultCode).toString()), - (request != null) ? request.getMethod().toString () : "Unknown", - (request != null) ? request.getRequestURL ().toString () : "Unknown", - (request != null) ? request.getRemoteHost () : "Unknown", - Integer.toString(response.getStatusCodeValue ())); + // Marshal the supplied json string into a document schema object. + ObjectMapper mapper = new ObjectMapper(); + DocumentSchema schema = mapper.readValue(documentSchema, DocumentSchema.class); + // Now, ask the DAO to create the index. + OperationResult result = documentStore.createIndex(index, schema); + // Extract the result code and string from the OperationResult + // object so that we can use them to generate a standard REST + // response. + // Note that we want to return a 201 result code on a successful + // create, so if we get back a 200 from the document store, + // translate that int a 201. + resultCode = (result.getResultCode() == 200) ? 201 : result.getResultCode(); + resultString = (result.getFailureCause() == null) ? result.getResult() : result.getFailureCause(); - // Clear the MDC context so that no other transaction inadvertently - // uses our transaction id. - ApiUtils.clearMdcContext(); + } catch (com.fasterxml.jackson.core.JsonParseException + | com.fasterxml.jackson.databind.JsonMappingException e) { - // Finally, return the response. - return response; - } + // We were unable to marshal the supplied json string into a valid + // document schema, so return an appropriate error response. + resultCode = HttpStatus.BAD_REQUEST.value(); + resultString = "Malformed schema: " + e.getMessage(); - /** - * This function accepts any JSON and will "blindly" write it to the - * document store. - * - * Note, eventually this "dynamic" flow should follow the same JSON-Schema - * validation procedure as the normal create index flow. - * - * @param dynamicSchema - The JSON string that will be sent to the document store. - * @param index - The name of the index to be created. - * @param documentStore - The document store specific interface. - * @return The result of the document store interface's operation. - */ - public ResponseEntity processCreateDynamicIndex(String dynamicSchema, HttpServletRequest request, - HttpHeaders headers, String index, DocumentStoreInterface documentStore) { + } catch (IOException e) { - ResponseEntity response = null; + // We'll treat this is a general internal error. + resultCode = HttpStatus.INTERNAL_SERVER_ERROR.value(); + resultString = "IO Failure: " + e.getMessage(); + } - ResponseEntity validationResponse = validateRequest(request, headers, index, SearchDbMsgs.INDEX_CREATE_FAILURE); + ResponseEntity response = + ResponseEntity.status(resultCode).contentType(MediaType.APPLICATION_JSON).body(resultString); - if (validationResponse.getStatusCodeValue () != HttpStatus.OK.value ()) { - response = validationResponse; - } else { - OperationResult result = documentStore.createDynamicIndex(index, dynamicSchema); + // Log the result. + if ((response.getStatusCodeValue() >= 200) && (response.getStatusCodeValue() < 300)) { + logger.info(SearchDbMsgs.CREATED_INDEX, index); + } else { + logger.warn(SearchDbMsgs.INDEX_CREATE_FAILURE, index, resultString); + } + + // Generate our audit log. + auditLogger.info(SearchDbMsgs.PROCESS_REST_REQUEST, + new LogFields().setField(LogLine.DefinedFields.RESPONSE_CODE, resultCode).setField( + LogLine.DefinedFields.RESPONSE_DESCRIPTION, HttpStatus.valueOf(resultCode).toString()), + (request != null) ? request.getMethod().toString() : "Unknown", + (request != null) ? request.getRequestURL().toString() : "Unknown", + (request != null) ? request.getRemoteHost() : "Unknown", + Integer.toString(response.getStatusCodeValue())); - int resultCode = (result.getResultCode() == 200) ? 201 : result.getResultCode(); - String resultString = (result.getFailureCause() == null) ? result.getResult() : result.getFailureCause(); - response = ResponseEntity.status(resultCode).body(resultString); - } - return response; - } - - /** - * Processes a client request to remove an index from the document store. - * Note that this implicitly deletes all documents contained within that index. - * - * @param index - The index to be deleted. - * @return - A standard REST response. - */ - public ResponseEntity processDelete(String index, - HttpServletRequest request, - HttpHeaders headers, - DocumentStoreInterface documentStore) { - - // Initialize the MDC Context for logging purposes. - ApiUtils.initMdcContext(request, headers); - - // Set a default response in case something unexpected goes wrong. - ResponseEntity response = ResponseEntity.status ( HttpStatus.INTERNAL_SERVER_ERROR ).body ( "Unknown" ); - - // Validate that the request is correctly authenticated before going - // any further. - try { - - if (!searchService.validateRequest(headers, request, ApiUtils.Action.POST, - ApiUtils.SEARCH_AUTH_POLICY_NAME)) { - logger.warn(SearchDbMsgs.INDEX_CREATE_FAILURE, index, "Authentication failure."); - return errorResponse(HttpStatus.FORBIDDEN, "Authentication failure.", request); - } - - } catch (Exception e) { - - logger.warn(SearchDbMsgs.INDEX_CREATE_FAILURE, index, - "Unexpected authentication failure - cause: " + e.getMessage()); - return errorResponse(HttpStatus.FORBIDDEN, "Authentication failure.", request); + // Clear the MDC context so that no other transaction inadvertently + // uses our transaction id. + ApiUtils.clearMdcContext(); + + // Finally, return the response. + return response; } + /** + * This function accepts any JSON and will "blindly" write it to the document store. + * + * Note, eventually this "dynamic" flow should follow the same JSON-Schema validation procedure as the normal create + * index flow. + * + * @param dynamicSchema - The JSON string that will be sent to the document store. + * @param index - The name of the index to be created. + * @param documentStore - The document store specific interface. + * @return The result of the document store interface's operation. + */ + public ResponseEntity processCreateDynamicIndex(String dynamicSchema, HttpServletRequest request, + HttpHeaders headers, String index, DocumentStoreInterface documentStore) { - try { - // Send the request to the document store. - response = responseFromOperationResult(documentStore.deleteIndex(index)); + ResponseEntity response = null; - } catch (DocumentStoreOperationException e) { - response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).contentType ( MediaType.APPLICATION_JSON ).body(e.getMessage()); + ResponseEntity validationResponse = + validateRequest(request, headers, index, SearchDbMsgs.INDEX_CREATE_FAILURE); + + + if (validationResponse.getStatusCodeValue() != HttpStatus.OK.value()) { + response = validationResponse; + } else { + OperationResult result = documentStore.createDynamicIndex(index, dynamicSchema); + + int resultCode = (result.getResultCode() == 200) ? 201 : result.getResultCode(); + String resultString = (result.getFailureCause() == null) ? result.getResult() : result.getFailureCause(); + + response = ResponseEntity.status(resultCode).body(resultString); + } + + return response; } - // Log the result. - if ((response.getStatusCodeValue() >= 200) && (response.getStatusCodeValue() < 300)) { - logger.info(SearchDbMsgs.DELETED_INDEX, index); - } else { - logger.warn(SearchDbMsgs.INDEX_DELETE_FAILURE, index, (String) response.getBody ()); + /** + * Processes a client request to remove an index from the document store. Note that this implicitly deletes all + * documents contained within that index. + * + * @param index - The index to be deleted. + * @return - A standard REST response. + */ + public ResponseEntity processDelete(String index, HttpServletRequest request, HttpHeaders headers, + DocumentStoreInterface documentStore) { + + // Initialize the MDC Context for logging purposes. + ApiUtils.initMdcContext(request, headers); + + // Set a default response in case something unexpected goes wrong. + ResponseEntity response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Unknown"); + + // Validate that the request is correctly authenticated before going + // any further. + try { + + if (!searchService.validateRequest(headers, request, ApiUtils.Action.POST, + ApiUtils.SEARCH_AUTH_POLICY_NAME)) { + logger.warn(SearchDbMsgs.INDEX_CREATE_FAILURE, index, "Authentication failure."); + return errorResponse(HttpStatus.FORBIDDEN, "Authentication failure.", request); + } + + } catch (Exception e) { + + logger.warn(SearchDbMsgs.INDEX_CREATE_FAILURE, index, + "Unexpected authentication failure - cause: " + e.getMessage()); + return errorResponse(HttpStatus.FORBIDDEN, "Authentication failure.", request); + } + + + try { + // Send the request to the document store. + response = responseFromOperationResult(documentStore.deleteIndex(index)); + + } catch (DocumentStoreOperationException e) { + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).contentType(MediaType.APPLICATION_JSON) + .body(e.getMessage()); + } + + // Log the result. + if ((response.getStatusCodeValue() >= 200) && (response.getStatusCodeValue() < 300)) { + logger.info(SearchDbMsgs.DELETED_INDEX, index); + } else { + logger.warn(SearchDbMsgs.INDEX_DELETE_FAILURE, index, response.getBody()); + } + + // Generate our audit log. + auditLogger.info(SearchDbMsgs.PROCESS_REST_REQUEST, + new LogFields().setField(LogLine.DefinedFields.RESPONSE_CODE, response.getStatusCodeValue()).setField( + LogLine.DefinedFields.RESPONSE_DESCRIPTION, response.getStatusCode().getReasonPhrase()), + (request != null) ? request.getMethod().toString() : "Unknown", + (request != null) ? request.getRequestURL().toString() : "Unknown", + (request != null) ? request.getRemoteHost() : "Unknown", + Integer.toString(response.getStatusCodeValue())); + + // Clear the MDC context so that no other transaction inadvertently + // uses our transaction id. + ApiUtils.clearMdcContext(); + + return response; } - // Generate our audit log. - auditLogger.info(SearchDbMsgs.PROCESS_REST_REQUEST, - new LogFields() - .setField(LogLine.DefinedFields.RESPONSE_CODE, response.getStatusCodeValue()) - .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION, - response.getStatusCode ().getReasonPhrase()), - (request != null) ? request.getMethod().toString () : "Unknown", - (request != null) ? request.getRequestURL ().toString () : "Unknown", - (request != null) ? request.getRemoteHost () : "Unknown", - Integer.toString(response.getStatusCodeValue())); - - // Clear the MDC context so that no other transaction inadvertently - // uses our transaction id. - ApiUtils.clearMdcContext(); - - return response; - } - - - /** - * This method takes a JSON format document schema and produces a set of - * field mappings in the form that Elastic Search expects. - * - * @param documentSchema - A document schema expressed as a JSON string. - * @return - A JSON string expressing an Elastic Search mapping configuration. - * @throws com.fasterxml.jackson.core.JsonParseException - * @throws com.fasterxml.jackson.databind.JsonMappingException - * @throws IOException - */ - public String generateDocumentMappings(String documentSchema) - throws com.fasterxml.jackson.core.JsonParseException, - com.fasterxml.jackson.databind.JsonMappingException, IOException { - - // Unmarshal the json content into a document schema object. - ObjectMapper mapper = new ObjectMapper(); - DocumentSchema schema = mapper.readValue(documentSchema, DocumentSchema.class); - - // Now, generate the Elastic Search mapping json and return it. - StringBuilder sb = new StringBuilder(); - sb.append("{"); - sb.append("\"properties\": {"); - - boolean first = true; - for (DocumentFieldSchema field : schema.getFields()) { - - if (!first) { - sb.append(","); - } else { - first = false; - } - - sb.append("\"").append(field.getName()).append("\": {"); - - // The field type is mandatory. - sb.append("\"type\": \"").append(field.getDataType()).append("\""); - - // If the index field was specified, then append it. - if (field.getSearchable() != null) { - sb.append(", \"index\": \"").append(field.getSearchable() - ? "analyzed" : "not_analyzed").append("\""); - } - - // If a search analyzer was specified, then append it. - if (field.getSearchAnalyzer() != null) { - sb.append(", \"search_analyzer\": \"").append(field.getSearchAnalyzer()).append("\""); - } - - // If an indexing analyzer was specified, then append it. - if (field.getIndexAnalyzer() != null) { - sb.append(", \"analyzer\": \"").append(field.getIndexAnalyzer()).append("\""); - } else { - sb.append(", \"analyzer\": \"").append("whitespace").append("\""); - } - - sb.append("}"); + + /** + * This method takes a JSON format document schema and produces a set of field mappings in the form that Elastic + * Search expects. + * + * @param documentSchema - A document schema expressed as a JSON string. + * @return - A JSON string expressing an Elastic Search mapping configuration. + * @throws com.fasterxml.jackson.core.JsonParseException + * @throws com.fasterxml.jackson.databind.JsonMappingException + * @throws IOException + */ + public String generateDocumentMappings(String documentSchema) throws com.fasterxml.jackson.core.JsonParseException, + com.fasterxml.jackson.databind.JsonMappingException, IOException { + + // Unmarshal the json content into a document schema object. + ObjectMapper mapper = new ObjectMapper(); + DocumentSchema schema = mapper.readValue(documentSchema, DocumentSchema.class); + + // Now, generate the Elastic Search mapping json and return it. + StringBuilder sb = new StringBuilder(); + sb.append("{"); + sb.append("\"properties\": {"); + + boolean first = true; + for (DocumentFieldSchema field : schema.getFields()) { + + if (!first) { + sb.append(","); + } else { + first = false; + } + + sb.append("\"").append(field.getName()).append("\": {"); + + // The field type is mandatory. + sb.append("\"type\": \"").append(field.getDataType()).append("\""); + + // If the index field was specified, then append it. + if (field.getSearchable() != null) { + sb.append(", \"index\": \"").append(field.getSearchable() ? "analyzed" : "not_analyzed").append("\""); + } + + // If a search analyzer was specified, then append it. + if (field.getSearchAnalyzer() != null) { + sb.append(", \"search_analyzer\": \"").append(field.getSearchAnalyzer()).append("\""); + } + + // If an indexing analyzer was specified, then append it. + if (field.getIndexAnalyzer() != null) { + sb.append(", \"analyzer\": \"").append(field.getIndexAnalyzer()).append("\""); + } else { + sb.append(", \"analyzer\": \"").append("whitespace").append("\""); + } + + sb.append("}"); + } + + sb.append("}"); + sb.append("}"); + + logger.debug("Generated document mappings: " + sb.toString()); + + return sb.toString(); } - sb.append("}"); - sb.append("}"); - logger.debug("Generated document mappings: " + sb.toString()); + /** + * Converts an {@link OperationResult} to a standard REST {@link ResponseEntity} object. + * + * @param result - The {@link OperationResult} to be converted. + * @return - The equivalent {@link ResponseEntity} object. + */ + public ResponseEntity responseFromOperationResult(OperationResult result) { + + if ((result.getResultCode() >= 200) && (result.getResultCode() < 300)) { + return ResponseEntity.status(result.getResultCode()).contentType(MediaType.APPLICATION_JSON) + .body(result.getResult()); + } else { + if (result.getFailureCause() != null) { + return ResponseEntity.status(result.getResultCode()).contentType(MediaType.APPLICATION_JSON) + .body(result.getFailureCause()); + } else { + return ResponseEntity.status(result.getResultCode()).contentType(MediaType.APPLICATION_JSON) + .body(result.getResult()); + } + } + } - return sb.toString(); - } + public ResponseEntity errorResponse(HttpStatus status, String msg, HttpServletRequest request) { + // Generate our audit log. + auditLogger.info(SearchDbMsgs.PROCESS_REST_REQUEST, + new LogFields().setField(LogLine.DefinedFields.RESPONSE_CODE, status.value()) + .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION, status.getReasonPhrase()), + (request != null) ? request.getMethod().toString() : "Unknown", + (request != null) ? request.getRequestURL().toString() : "Unknown", + (request != null) ? request.getRemoteHost() : "Unknown", Integer.toString(status.value())); - /** - * Converts an {@link OperationResult} to a standard REST {@link ResponseEntity} - * object. - * - * @param result - The {@link OperationResult} to be converted. - * @return - The equivalent {@link ResponseEntity} object. - */ - public ResponseEntity responseFromOperationResult(OperationResult result) { + // Clear the MDC context so that no other transaction inadvertently + // uses our transaction id. + ApiUtils.clearMdcContext(); - if ((result.getResultCode() >= 200) && (result.getResultCode() < 300)) { - return ResponseEntity.status(result.getResultCode()).contentType ( MediaType.APPLICATION_JSON ).body(result.getResult()); - } else { - if (result.getFailureCause() != null) { - return ResponseEntity.status(result.getResultCode()).contentType ( MediaType.APPLICATION_JSON ).body(result.getFailureCause()); - } else { - return ResponseEntity.status(result.getResultCode()).contentType ( MediaType.APPLICATION_JSON ).body(result.getResult()); - } + return ResponseEntity.status(status).contentType(MediaType.APPLICATION_JSON).body(msg); } - } - - public ResponseEntity errorResponse(HttpStatus status, String msg, HttpServletRequest request) { - - // Generate our audit log. - auditLogger.info(SearchDbMsgs.PROCESS_REST_REQUEST, - new LogFields() - .setField(LogLine.DefinedFields.RESPONSE_CODE, status.value ()) - .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION, status.getReasonPhrase()), - (request != null) ? request.getMethod().toString () : "Unknown", - (request != null) ? request.getRequestURL ().toString () : "Unknown", - (request != null) ? request.getRemoteHost () : "Unknown", - Integer.toString(status.value ())); - - // Clear the MDC context so that no other transaction inadvertently - // uses our transaction id. - ApiUtils.clearMdcContext(); - - return ResponseEntity.status(status).contentType ( MediaType.APPLICATION_JSON ).body(msg); - } - - - /** - * A helper method used for validating/authenticating an incoming request. - * - * @param request - The http request that will be validated. - * @param headers - The http headers that will be validated. - * @param index - The name of the index that the document store request is being made against. - * @param failureMsgEnum - The logging message to be used upon validation failure. - * @return A success or failure response - */ - private ResponseEntity validateRequest(HttpServletRequest request, HttpHeaders headers, String index, SearchDbMsgs failureMsgEnum) { - try { - if (!searchService.validateRequest(headers, request, ApiUtils.Action.POST, ApiUtils.SEARCH_AUTH_POLICY_NAME)) { - logger.warn(failureMsgEnum, index, "Authentication failure."); - return errorResponse(HttpStatus.FORBIDDEN, "Authentication failure.", request); - } - } catch (Exception e) { - logger.warn(failureMsgEnum, index, "Unexpected authentication failure - cause: " + e.getMessage()); - return errorResponse(HttpStatus.FORBIDDEN, "Authentication failure.", request); + + + /** + * A helper method used for validating/authenticating an incoming request. + * + * @param request - The http request that will be validated. + * @param headers - The http headers that will be validated. + * @param index - The name of the index that the document store request is being made against. + * @param failureMsgEnum - The logging message to be used upon validation failure. + * @return A success or failure response + */ + private ResponseEntity validateRequest(HttpServletRequest request, HttpHeaders headers, String index, + SearchDbMsgs failureMsgEnum) { + try { + if (!searchService.validateRequest(headers, request, ApiUtils.Action.POST, + ApiUtils.SEARCH_AUTH_POLICY_NAME)) { + logger.warn(failureMsgEnum, index, "Authentication failure."); + return errorResponse(HttpStatus.FORBIDDEN, "Authentication failure.", request); + } + } catch (Exception e) { + logger.warn(failureMsgEnum, index, "Unexpected authentication failure - cause: " + e.getMessage()); + return errorResponse(HttpStatus.FORBIDDEN, "Authentication failure.", request); + } + return ResponseEntity.status(HttpStatus.OK).body(HEADER_VALIDATION_SUCCESS); } - return ResponseEntity.status(HttpStatus.OK).body(HEADER_VALIDATION_SUCCESS); - } } diff --git a/src/main/java/org/onap/aai/sa/rest/SearchServiceApi.java b/src/main/java/org/onap/aai/sa/rest/SearchServiceApi.java index aacba78..d807996 100644 --- a/src/main/java/org/onap/aai/sa/rest/SearchServiceApi.java +++ b/src/main/java/org/onap/aai/sa/rest/SearchServiceApi.java @@ -45,228 +45,175 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/services/search-data-service/v1/search") public class SearchServiceApi { - /** - * The Data Access Object that we will use to interact with the - * document store. - */ - protected DocumentStoreInterface documentStore = null; - protected ApiUtils apiUtils = null; - - /** - * Create a new instance of the end point. - */ - public SearchServiceApi() { - - // Perform one-time initialization. - init(); - } - - - /** - * Performs all one-time initialization required for the end point. - */ - public void init() { - - // Instantiate our Document Store DAO. - documentStore = ElasticSearchHttpController.getInstance(); - - apiUtils = new ApiUtils(); - } - - @RequestMapping(value = "/indexes/{index}", - method = RequestMethod.PUT, - produces = { "application/json" }) - public ResponseEntity processCreateIndex(@RequestBody String requestBody, - HttpServletRequest request, - @RequestHeader HttpHeaders headers, - @PathVariable("index") String index) { - - // Forward the request to our index API to create the index. - IndexApi indexApi = new IndexApi(this); - return indexApi.processCreateIndex(requestBody, request, headers, index, documentStore); - } - - @RequestMapping(value = "/indexes/{index}", - method = RequestMethod.DELETE, - consumes = {"application/json"}, - produces = {"application/json"}) - public ResponseEntity processDeleteIndex(HttpServletRequest request, - @RequestHeader HttpHeaders headers, - @PathVariable ("index") String index) { - - // Forward the request to our index API to delete the index. - IndexApi indexApi = new IndexApi(this); - return indexApi.processDelete(index, request, headers, documentStore); - } - - - @RequestMapping(value = "/indexes/{index}/documents", - method = RequestMethod.POST, - consumes = {"application/json"}) - public ResponseEntity processCreateDocWithoutId(@RequestBody String requestBody, - HttpServletRequest request, - HttpServletResponse httpResponse, - @RequestHeader HttpHeaders headers, - @PathVariable ("index") String index) { - - // Forward the request to our document API to create the document. - DocumentApi documentApi = new DocumentApi(this); - return documentApi.processPost(requestBody, request, headers, httpResponse, - index, documentStore); - } - - @RequestMapping(value = "/indexes/{index}/documents/{id}", - method = RequestMethod.PUT, - consumes = {"application/json"}) - public ResponseEntity processUpsertDoc(@RequestBody String requestBody, - HttpServletRequest request, - HttpServletResponse httpResponse, - @RequestHeader HttpHeaders headers, - @PathVariable ("index") String index, - @PathVariable ("id") String id) { - - // Forward the request to our document API to upsert the document. - DocumentApi documentApi = new DocumentApi(this); - return documentApi.processPut(requestBody, request, headers, httpResponse, - index, id, documentStore); - } - - @RequestMapping(value = "/indexes/{index}/documents/{id}", - method = RequestMethod.GET) - public ResponseEntity processGetDocument(HttpServletRequest request, - HttpServletResponse httpResponse, - @RequestHeader HttpHeaders headers, - @PathVariable ("index") String index, - @PathVariable ("id") String id) { - - // Forward the request to our document API to retrieve the document. - DocumentApi documentApi = new DocumentApi(this); - return documentApi.processGet("", request, headers, httpResponse, - index, id, documentStore); - } - - @RequestMapping(value = "/indexes/{index}/documents/{id}", - method = RequestMethod.DELETE, - consumes = {"application/json"}) - public ResponseEntity processDeleteDoc(HttpServletRequest request, - HttpServletResponse httpResponse, - @RequestHeader HttpHeaders headers, - @PathVariable ("index") String index, - @PathVariable ("id") String id) { - - // Forward the request to our document API to delete the document. - DocumentApi documentApi = new DocumentApi(this); - return documentApi.processDelete("", request, headers, httpResponse, - index, id, documentStore); - } - - @RequestMapping(value = "/indexes/{index}/query/{queryText}", - method = RequestMethod.GET) - public ResponseEntity processInlineQuery(HttpServletRequest request, - @RequestHeader HttpHeaders headers, - @PathVariable ("index") String index, - @PathVariable ("queryText") String queryText) { - - // Forward the request to our document API to delete the document. - DocumentApi documentApi = new DocumentApi(this); - return documentApi.processSearchWithGet("", request, headers, - index, queryText, documentStore); - } - - @RequestMapping(value = "/indexes/{index}/query", - method = RequestMethod.GET, - consumes = {"application/json"}) - public ResponseEntity processQueryWithGet(@RequestBody String requestBody, - HttpServletRequest request, - @RequestHeader HttpHeaders headers, - @PathVariable ("index") String index) { - - // Forward the request to our document API to delete the document. - DocumentApi documentApi = new DocumentApi(this); - return documentApi.queryWithGetWithPayload(requestBody, request, headers, index, documentStore); - } - - @RequestMapping(value = "/indexes/{index}/query", - method = RequestMethod.POST, - consumes = {"application/json"}) - public ResponseEntity processQuery(@RequestBody String requestBody, - HttpServletRequest request, - @RequestHeader HttpHeaders headers, - @PathVariable ("index") String index) { - - // Forward the request to our document API to delete the document. - DocumentApi documentApi = new DocumentApi(this); - return documentApi.processSearchWithPost(requestBody, request, headers, index, documentStore); - } - - @RequestMapping(value = "/indexes/{index}/suggest", - method = RequestMethod.POST, - consumes = {"application/json"}) - public ResponseEntity processSuggestQuery(@RequestBody String requestBody, HttpServletRequest request, - @RequestHeader HttpHeaders headers, @PathVariable("index") String index) { - // Forward the request to our document API to query suggestions in the - // document. - DocumentApi documentApi = new DocumentApi(this); - return documentApi.processSuggestQueryWithPost(requestBody, request, headers, index, - documentStore); - } - - @RequestMapping(value = "/indexes/dynamic/{index}", - method = RequestMethod.PUT, - consumes = {"application/json"}) - public ResponseEntity processCreateDynamicIndex(@RequestBody String requestBody, - HttpServletRequest request, - @RequestHeader HttpHeaders headers, - @PathVariable ("index") String index) { - - // Forward the request to our index API to create the index. - IndexApi indexApi = new IndexApi(this); - return indexApi.processCreateDynamicIndex(requestBody, request, headers, index, documentStore); - } - - @RequestMapping(value = "/bulk", - method = RequestMethod.POST, - consumes = {"application/json"}, - produces = { "application/json"}) - public ResponseEntity processBulkRequest(@RequestBody String requestBody, - HttpServletRequest request, - @RequestHeader HttpHeaders headers) { - - // Forward the request to our document API to delete the document. - BulkApi bulkApi = new BulkApi(this); - ResponseEntity dbugResp = bulkApi.processPost(requestBody, request, headers, documentStore, apiUtils); - return dbugResp; - } - - protected boolean validateRequest(HttpHeaders headers, - HttpServletRequest req, - Action action, - String authPolicyFunctionName) throws Exception { - - SearchDbServiceAuth serviceAuth = new SearchDbServiceAuth(); - - String cipherSuite = (String) req.getAttribute("javax.servlet.request.cipher_suite"); - String authUser = null; - if (cipherSuite != null) { - Object x509CertAttribute = req.getAttribute("javax.servlet.request.X509Certificate"); - if (x509CertAttribute != null) { - X509Certificate[] certChain = (X509Certificate[]) x509CertAttribute; - X509Certificate clientCert = certChain[0]; - X500Principal subjectDn = clientCert.getSubjectX500Principal(); - authUser = subjectDn.toString(); - } + /** + * The Data Access Object that we will use to interact with the document store. + */ + protected DocumentStoreInterface documentStore = null; + protected ApiUtils apiUtils = null; + + /** + * Create a new instance of the end point. + */ + public SearchServiceApi() { + + // Perform one-time initialization. + init(); } - if (authUser == null) { - return false; + + /** + * Performs all one-time initialization required for the end point. + */ + public void init() { + + // Instantiate our Document Store DAO. + documentStore = ElasticSearchHttpController.getInstance(); + + apiUtils = new ApiUtils(); + } + + @RequestMapping(value = "/indexes/{index}", method = RequestMethod.PUT, produces = {"application/json"}) + public ResponseEntity processCreateIndex(@RequestBody String requestBody, HttpServletRequest request, + @RequestHeader HttpHeaders headers, @PathVariable("index") String index) { + + // Forward the request to our index API to create the index. + IndexApi indexApi = new IndexApi(this); + return indexApi.processCreateIndex(requestBody, request, headers, index, documentStore); + } + + @RequestMapping(value = "/indexes/{index}", method = RequestMethod.DELETE, consumes = {"application/json"}, + produces = {"application/json"}) + public ResponseEntity processDeleteIndex(HttpServletRequest request, @RequestHeader HttpHeaders headers, + @PathVariable("index") String index) { + + // Forward the request to our index API to delete the index. + IndexApi indexApi = new IndexApi(this); + return indexApi.processDelete(index, request, headers, documentStore); + } + + + @RequestMapping(value = "/indexes/{index}/documents", method = RequestMethod.POST, consumes = {"application/json"}) + public ResponseEntity processCreateDocWithoutId(@RequestBody String requestBody, HttpServletRequest request, + HttpServletResponse httpResponse, @RequestHeader HttpHeaders headers, @PathVariable("index") String index) { + + // Forward the request to our document API to create the document. + DocumentApi documentApi = new DocumentApi(this); + return documentApi.processPost(requestBody, request, headers, httpResponse, index, documentStore); + } + + @RequestMapping(value = "/indexes/{index}/documents/{id}", method = RequestMethod.PUT, + consumes = {"application/json"}) + public ResponseEntity processUpsertDoc(@RequestBody String requestBody, HttpServletRequest request, + HttpServletResponse httpResponse, @RequestHeader HttpHeaders headers, @PathVariable("index") String index, + @PathVariable("id") String id) { + + // Forward the request to our document API to upsert the document. + DocumentApi documentApi = new DocumentApi(this); + return documentApi.processPut(requestBody, request, headers, httpResponse, index, id, documentStore); + } + + @RequestMapping(value = "/indexes/{index}/documents/{id}", method = RequestMethod.GET) + public ResponseEntity processGetDocument(HttpServletRequest request, HttpServletResponse httpResponse, + @RequestHeader HttpHeaders headers, @PathVariable("index") String index, @PathVariable("id") String id) { + + // Forward the request to our document API to retrieve the document. + DocumentApi documentApi = new DocumentApi(this); + return documentApi.processGet("", request, headers, httpResponse, index, id, documentStore); } - String status = serviceAuth.authUser(headers, authUser.toLowerCase(), - action.toString() + ":" + authPolicyFunctionName); - if (!status.equals("OK")) { - return false; + @RequestMapping(value = "/indexes/{index}/documents/{id}", method = RequestMethod.DELETE, + consumes = {"application/json"}) + public ResponseEntity processDeleteDoc(HttpServletRequest request, HttpServletResponse httpResponse, + @RequestHeader HttpHeaders headers, @PathVariable("index") String index, @PathVariable("id") String id) { + + // Forward the request to our document API to delete the document. + DocumentApi documentApi = new DocumentApi(this); + return documentApi.processDelete("", request, headers, httpResponse, index, id, documentStore); + } + + @RequestMapping(value = "/indexes/{index}/query/{queryText}", method = RequestMethod.GET) + public ResponseEntity processInlineQuery(HttpServletRequest request, @RequestHeader HttpHeaders headers, + @PathVariable("index") String index, @PathVariable("queryText") String queryText) { + + // Forward the request to our document API to delete the document. + DocumentApi documentApi = new DocumentApi(this); + return documentApi.processSearchWithGet("", request, headers, index, queryText, documentStore); + } + + @RequestMapping(value = "/indexes/{index}/query", method = RequestMethod.GET, consumes = {"application/json"}) + public ResponseEntity processQueryWithGet(@RequestBody String requestBody, HttpServletRequest request, + @RequestHeader HttpHeaders headers, @PathVariable("index") String index) { + + // Forward the request to our document API to delete the document. + DocumentApi documentApi = new DocumentApi(this); + return documentApi.queryWithGetWithPayload(requestBody, request, headers, index, documentStore); + } + + @RequestMapping(value = "/indexes/{index}/query", method = RequestMethod.POST, consumes = {"application/json"}) + public ResponseEntity processQuery(@RequestBody String requestBody, HttpServletRequest request, + @RequestHeader HttpHeaders headers, @PathVariable("index") String index) { + + // Forward the request to our document API to delete the document. + DocumentApi documentApi = new DocumentApi(this); + return documentApi.processSearchWithPost(requestBody, request, headers, index, documentStore); } - return true; - } + @RequestMapping(value = "/indexes/{index}/suggest", method = RequestMethod.POST, consumes = {"application/json"}) + public ResponseEntity processSuggestQuery(@RequestBody String requestBody, HttpServletRequest request, + @RequestHeader HttpHeaders headers, @PathVariable("index") String index) { + // Forward the request to our document API to query suggestions in the + // document. + DocumentApi documentApi = new DocumentApi(this); + return documentApi.processSuggestQueryWithPost(requestBody, request, headers, index, documentStore); + } + + @RequestMapping(value = "/indexes/dynamic/{index}", method = RequestMethod.PUT, consumes = {"application/json"}) + public ResponseEntity processCreateDynamicIndex(@RequestBody String requestBody, HttpServletRequest request, + @RequestHeader HttpHeaders headers, @PathVariable("index") String index) { + + // Forward the request to our index API to create the index. + IndexApi indexApi = new IndexApi(this); + return indexApi.processCreateDynamicIndex(requestBody, request, headers, index, documentStore); + } + + @RequestMapping(value = "/bulk", method = RequestMethod.POST, consumes = {"application/json"}, + produces = {"application/json"}) + public ResponseEntity processBulkRequest(@RequestBody String requestBody, HttpServletRequest request, + @RequestHeader HttpHeaders headers) { + + // Forward the request to our document API to delete the document. + BulkApi bulkApi = new BulkApi(this); + ResponseEntity dbugResp = bulkApi.processPost(requestBody, request, headers, documentStore, apiUtils); + return dbugResp; + } + + protected boolean validateRequest(HttpHeaders headers, HttpServletRequest req, Action action, + String authPolicyFunctionName) throws Exception { + + SearchDbServiceAuth serviceAuth = new SearchDbServiceAuth(); + + String cipherSuite = (String) req.getAttribute("javax.servlet.request.cipher_suite"); + String authUser = null; + if (cipherSuite != null) { + Object x509CertAttribute = req.getAttribute("javax.servlet.request.X509Certificate"); + if (x509CertAttribute != null) { + X509Certificate[] certChain = (X509Certificate[]) x509CertAttribute; + X509Certificate clientCert = certChain[0]; + X500Principal subjectDn = clientCert.getSubjectX500Principal(); + authUser = subjectDn.toString(); + } + } + + if (authUser == null) { + return false; + } + + String status = + serviceAuth.authUser(headers, authUser.toLowerCase(), action.toString() + ":" + authPolicyFunctionName); + if (!status.equals("OK")) { + return false; + } + + return true; + } } diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/RestEchoService.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/RestEchoService.java index 1cbebc9..d92a1da 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/RestEchoService.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/RestEchoService.java @@ -35,15 +35,15 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/services/search-data-service/v1") public class RestEchoService { - /** - * REST endpoint for a simple echo service. - * - * @param input - The value to be echoed back. - * @return - The input value. - */ - @RequestMapping(value = "/echo/{input}", method = {RequestMethod.GET}) - public String ping(@PathVariable("input") String input) { - return "[Search Database Abstraction Micro Service] - Echo Service: " + input + "."; - } + /** + * REST endpoint for a simple echo service. + * + * @param input - The value to be echoed back. + * @return - The input value. + */ + @RequestMapping(value = "/echo/{input}", method = {RequestMethod.GET}) + public String ping(@PathVariable("input") String input) { + return "[Search Database Abstraction Micro Service] - Echo Service: " + input + "."; + } } diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/config/ElasticSearchConfig.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/config/ElasticSearchConfig.java index 0cf2f2a..1bf1db7 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/config/ElasticSearchConfig.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/config/ElasticSearchConfig.java @@ -23,61 +23,61 @@ package org.onap.aai.sa.searchdbabstraction.elasticsearch.config; import java.util.Properties; public class ElasticSearchConfig { - private String ipAddress; - private String httpPort; - private String javaApiPort; - private String clusterName; + private String ipAddress; + private String httpPort; + private String javaApiPort; + private String clusterName; - public static final String ES_CLUSTER_NAME = "es.cluster-name"; - public static final String ES_IP_ADDRESS = "es.ip-address"; - public static final String ES_HTTP_PORT = "es.http-port"; + public static final String ES_CLUSTER_NAME = "es.cluster-name"; + public static final String ES_IP_ADDRESS = "es.ip-address"; + public static final String ES_HTTP_PORT = "es.http-port"; - private static final String JAVA_API_PORT_DEFAULT = "9300"; + private static final String JAVA_API_PORT_DEFAULT = "9300"; - public ElasticSearchConfig(Properties props) { + public ElasticSearchConfig(Properties props) { - setClusterName(props.getProperty(ES_CLUSTER_NAME)); - setIpAddress(props.getProperty(ES_IP_ADDRESS)); - setHttpPort(props.getProperty(ES_HTTP_PORT)); - setJavaApiPort(JAVA_API_PORT_DEFAULT); - } + setClusterName(props.getProperty(ES_CLUSTER_NAME)); + setIpAddress(props.getProperty(ES_IP_ADDRESS)); + setHttpPort(props.getProperty(ES_HTTP_PORT)); + setJavaApiPort(JAVA_API_PORT_DEFAULT); + } - public String getIpAddress() { - return ipAddress; - } + public String getIpAddress() { + return ipAddress; + } - public void setIpAddress(String ipAddress) { - this.ipAddress = ipAddress; - } + public void setIpAddress(String ipAddress) { + this.ipAddress = ipAddress; + } - public String getHttpPort() { - return httpPort; - } + public String getHttpPort() { + return httpPort; + } - public void setHttpPort(String httpPort) { - this.httpPort = httpPort; - } + public void setHttpPort(String httpPort) { + this.httpPort = httpPort; + } - public String getJavaApiPort() { - return javaApiPort; - } + public String getJavaApiPort() { + return javaApiPort; + } - public void setJavaApiPort(String javaApiPort) { - this.javaApiPort = javaApiPort; - } + public void setJavaApiPort(String javaApiPort) { + this.javaApiPort = javaApiPort; + } - public String getClusterName() { - return clusterName; - } + public String getClusterName() { + return clusterName; + } - public void setClusterName(String clusterName) { - this.clusterName = clusterName; - } + public void setClusterName(String clusterName) { + this.clusterName = clusterName; + } - @Override - public String toString() { - return "ElasticSearchConfig [ipAddress=" + ipAddress + ", httpPort=" + httpPort - + ", javaApiPort=" + javaApiPort + ", clusterName=" + clusterName + "]"; - } + @Override + public String toString() { + return "ElasticSearchConfig [ipAddress=" + ipAddress + ", httpPort=" + httpPort + ", javaApiPort=" + javaApiPort + + ", clusterName=" + clusterName + "]"; + } -} \ No newline at end of file +} diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/DocumentStoreDataEntity.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/DocumentStoreDataEntity.java index 116e784..3d95a1b 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/DocumentStoreDataEntity.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/DocumentStoreDataEntity.java @@ -22,10 +22,10 @@ package org.onap.aai.sa.searchdbabstraction.elasticsearch.dao; public interface DocumentStoreDataEntity { - public String getId(); + public String getId(); - public String getContentInJson(); + public String getContentInJson(); - public String getVersion(); + public String getVersion(); } diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/DocumentStoreDataEntityImpl.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/DocumentStoreDataEntityImpl.java index 352c01d..413dbb4 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/DocumentStoreDataEntityImpl.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/DocumentStoreDataEntityImpl.java @@ -22,39 +22,39 @@ package org.onap.aai.sa.searchdbabstraction.elasticsearch.dao; public class DocumentStoreDataEntityImpl implements DocumentStoreDataEntity { - private String id; - private String content; - private String version; - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } - - public void setId(String id) { - this.id = id; - } - - @Override - public String getId() { - return id; - } - - @Override - public String getContentInJson() { - return content; - } - - @Override - public String getVersion() { - return version; - } - - public void setVersion(String version) { - this.version = version; - } + private String id; + private String content; + private String version; + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public void setId(String id) { + this.id = id; + } + + @Override + public String getId() { + return id; + } + + @Override + public String getContentInJson() { + return content; + } + + @Override + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } } diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/DocumentStoreInterface.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/DocumentStoreInterface.java index 5eaf9a3..5ea37e1 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/DocumentStoreInterface.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/DocumentStoreInterface.java @@ -31,45 +31,40 @@ import org.onap.aai.sa.searchdbabstraction.entity.SearchOperationResult; public interface DocumentStoreInterface { - public OperationResult createIndex(String index, DocumentSchema documentSchema); + public OperationResult createIndex(String index, DocumentSchema documentSchema); - public OperationResult createDynamicIndex(String index, String dynamicSchema); + public OperationResult createDynamicIndex(String index, String dynamicSchema); - public OperationResult deleteIndex(String indexName) throws DocumentStoreOperationException; + public OperationResult deleteIndex(String indexName) throws DocumentStoreOperationException; - public DocumentOperationResult createDocument(String indexName, - DocumentStoreDataEntity document, - boolean allowImplicitIndexCreation) throws DocumentStoreOperationException; + public DocumentOperationResult createDocument(String indexName, DocumentStoreDataEntity document, + boolean allowImplicitIndexCreation) throws DocumentStoreOperationException; - public DocumentOperationResult updateDocument(String indexName, - DocumentStoreDataEntity document, - boolean allowImplicitIndexCreation) throws DocumentStoreOperationException; + public DocumentOperationResult updateDocument(String indexName, DocumentStoreDataEntity document, + boolean allowImplicitIndexCreation) throws DocumentStoreOperationException; - public SearchOperationResult suggestionQueryWithPayload(String indexName, String query) throws DocumentStoreOperationException; + public SearchOperationResult suggestionQueryWithPayload(String indexName, String query) + throws DocumentStoreOperationException; - public DocumentOperationResult deleteDocument(String indexName, DocumentStoreDataEntity document) - throws DocumentStoreOperationException; + public DocumentOperationResult deleteDocument(String indexName, DocumentStoreDataEntity document) + throws DocumentStoreOperationException; - public DocumentOperationResult getDocument(String indexName, DocumentStoreDataEntity document) - throws DocumentStoreOperationException; + public DocumentOperationResult getDocument(String indexName, DocumentStoreDataEntity document) + throws DocumentStoreOperationException; - public SearchOperationResult search(String indexName, String queryText) - throws DocumentStoreOperationException; + public SearchOperationResult search(String indexName, String queryText) throws DocumentStoreOperationException; - public SearchOperationResult searchWithPayload(String indexName, String query) - throws DocumentStoreOperationException; + public SearchOperationResult searchWithPayload(String indexName, String query) + throws DocumentStoreOperationException; - /** - * Forwards a set of operations to the document store as a single, bulk - * request. - * - * @param anIndex - The index to apply the operations to. - * @param operations - A java object containing the set of operations to - * be performed. - * @return - An operation result. - * @throws DocumentStoreOperationException - */ - public OperationResult performBulkOperations(BulkRequest[] request) - throws DocumentStoreOperationException; + /** + * Forwards a set of operations to the document store as a single, bulk request. + * + * @param anIndex - The index to apply the operations to. + * @param operations - A java object containing the set of operations to be performed. + * @return - An operation result. + * @throws DocumentStoreOperationException + */ + public OperationResult performBulkOperations(BulkRequest[] request) throws DocumentStoreOperationException; } diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchBulkOperationResult.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchBulkOperationResult.java index d1e5fd3..23181df 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchBulkOperationResult.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchBulkOperationResult.java @@ -24,43 +24,43 @@ import java.util.Arrays; public class ElasticSearchBulkOperationResult { - private Integer took; - private Boolean errors; - private ElasticSearchResultItem[] items; + private Integer took; + private Boolean errors; + private ElasticSearchResultItem[] items; - public ElasticSearchBulkOperationResult() { + public ElasticSearchBulkOperationResult() { - } + } - public ElasticSearchResultItem[] getItems() { - return items; - } + public ElasticSearchResultItem[] getItems() { + return items; + } - public void setItems(ElasticSearchResultItem[] items) { - this.items = items; - } + public void setItems(ElasticSearchResultItem[] items) { + this.items = items; + } - public Integer getTook() { - return took; - } + public Integer getTook() { + return took; + } - public void setTook(Integer took) { - this.took = took; - } + public void setTook(Integer took) { + this.took = took; + } - public Boolean getErrors() { - return errors; - } + public Boolean getErrors() { + return errors; + } - public void setErrors(Boolean errors) { - this.errors = errors; - } + public void setErrors(Boolean errors) { + this.errors = errors; + } - @Override - public String toString() { - return "ElasticSearchOperationResult [took=" + took + ", errors=" - + errors + ", items=" + Arrays.toString(items) + "]"; - } + @Override + public String toString() { + return "ElasticSearchOperationResult [took=" + took + ", errors=" + errors + ", items=" + Arrays.toString(items) + + "]"; + } } diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchCause.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchCause.java index 7036440..ee12494 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchCause.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchCause.java @@ -22,22 +22,22 @@ package org.onap.aai.sa.searchdbabstraction.elasticsearch.dao; public class ElasticSearchCause { - private String type; - private String reason; + private String type; + private String reason; - public String getType() { - return type; - } + public String getType() { + return type; + } - public void setType(String type) { - this.type = type; - } + public void setType(String type) { + this.type = type; + } - public String getReason() { - return reason; - } + public String getReason() { + return reason; + } - public void setReason(String reason) { - this.reason = reason; - } + public void setReason(String reason) { + this.reason = reason; + } } diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchError.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchError.java index 27493a0..afb1da3 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchError.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchError.java @@ -27,44 +27,44 @@ import java.util.Map; public class ElasticSearchError { - private String type; - private String reason; - private ElasticSearchCause causedBy; + private String type; + private String reason; + private ElasticSearchCause causedBy; - private Map additionalProperties = new HashMap(); + private Map additionalProperties = new HashMap(); - public String getType() { - return type; - } + public String getType() { + return type; + } - public void setType(String type) { - this.type = type; - } + public void setType(String type) { + this.type = type; + } - public String getReason() { - return reason; - } + public String getReason() { + return reason; + } - public void setReason(String reason) { - this.reason = reason; - } + public void setReason(String reason) { + this.reason = reason; + } - public ElasticSearchCause getCausedBy() { - return causedBy; - } + public ElasticSearchCause getCausedBy() { + return causedBy; + } - public void setCausedBy(ElasticSearchCause causedBy) { - this.causedBy = causedBy; - } + public void setCausedBy(ElasticSearchCause causedBy) { + this.causedBy = causedBy; + } - @JsonAnyGetter - public Map getAdditionalProperties() { - return additionalProperties; - } + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } - @JsonAnySetter - public void setAdditionalProperties(String name, Object value) { - additionalProperties.put(name, value); - } + @JsonAnySetter + public void setAdditionalProperties(String name, Object value) { + additionalProperties.put(name, value); + } } diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchOperationStatus.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchOperationStatus.java index 8ad1ba8..a0941e7 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchOperationStatus.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchOperationStatus.java @@ -27,88 +27,88 @@ import java.util.Map; public class ElasticSearchOperationStatus { - private String index; - private String type; - private String id; - private String version; - private ElasticSearchShardStatus shards; - private Integer status; - private ElasticSearchError error; - - private Map additionalProperties = new HashMap(); - - - public ElasticSearchError getError() { - return error; - } - - public void setError(ElasticSearchError error) { - this.error = error; - } - - public Integer getStatus() { - return status; - } - - public void setStatus(Integer status) { - this.status = status; - } - - public ElasticSearchShardStatus getShards() { - return shards; - } - - public void setShards(ElasticSearchShardStatus shards) { - this.shards = shards; - } - - public String getIndex() { - return index; - } - - public void setIndex(String index) { - this.index = index; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getVersion() { - return version; - } - - public void setVersion(String version) { - this.version = version; - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return additionalProperties; - } - - @JsonAnySetter - public void setAdditionalProperties(String name, Object value) { - additionalProperties.put(name, value); - } - - @Override - public String toString() { - return "ElasticSearchIndexStatus [index=" + index + ", type=" + type + ", id=" - + id + ", version=" + version + ", shards=" + shards + ", status=" + status + "]"; - } + private String index; + private String type; + private String id; + private String version; + private ElasticSearchShardStatus shards; + private Integer status; + private ElasticSearchError error; + + private Map additionalProperties = new HashMap(); + + + public ElasticSearchError getError() { + return error; + } + + public void setError(ElasticSearchError error) { + this.error = error; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public ElasticSearchShardStatus getShards() { + return shards; + } + + public void setShards(ElasticSearchShardStatus shards) { + this.shards = shards; + } + + public String getIndex() { + return index; + } + + public void setIndex(String index) { + this.index = index; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperties(String name, Object value) { + additionalProperties.put(name, value); + } + + @Override + public String toString() { + return "ElasticSearchIndexStatus [index=" + index + ", type=" + type + ", id=" + id + ", version=" + version + + ", shards=" + shards + ", status=" + status + "]"; + } } diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchResultItem.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchResultItem.java index f59805e..529900d 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchResultItem.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchResultItem.java @@ -24,125 +24,126 @@ import org.onap.aai.sa.rest.ApiUtils; public class ElasticSearchResultItem { - public static final String REQUEST_URL = "REQUEST_URL"; + public static final String REQUEST_URL = "REQUEST_URL"; - private ElasticSearchOperationStatus create; - private ElasticSearchOperationStatus index; - private ElasticSearchOperationStatus delete; + private ElasticSearchOperationStatus create; + private ElasticSearchOperationStatus index; + private ElasticSearchOperationStatus delete; - public ElasticSearchOperationStatus getCreate() { - return create; - } - - public void setCreate(ElasticSearchOperationStatus index) { - this.create = index; - } - - public ElasticSearchOperationStatus getIndex() { - return index; - } - - public void setIndex(ElasticSearchOperationStatus index) { - this.index = index; - } - - public ElasticSearchOperationStatus getDelete() { - return delete; - } - - public void setDelete(ElasticSearchOperationStatus delete) { - this.delete = delete; - } - - public String operationType() { - - if (create != null) { - return "create"; - } - if (index != null) { - return "update"; - } - if (delete != null) { - return "delete"; + public ElasticSearchOperationStatus getCreate() { + return create; } - return "unknown"; - } - - public ElasticSearchOperationStatus operationStatus() { + public void setCreate(ElasticSearchOperationStatus index) { + this.create = index; + } - if (create != null) { - return create; + public ElasticSearchOperationStatus getIndex() { + return index; } - if (index != null) { - return index; + + public void setIndex(ElasticSearchOperationStatus index) { + this.index = index; } - if (delete != null) { - return delete; + + public ElasticSearchOperationStatus getDelete() { + return delete; } - return null; - } + public void setDelete(ElasticSearchOperationStatus delete) { + this.delete = delete; + } + public String operationType() { - public String toJson() { - StringBuilder sb = new StringBuilder(); + if (create != null) { + return "create"; + } + if (index != null) { + return "update"; + } + if (delete != null) { + return "delete"; + } - sb.append("{"); + return "unknown"; + } - sb.append("\"operation\": \"").append(operationType()).append("\", "); + public ElasticSearchOperationStatus operationStatus() { - if (operationStatus().getAdditionalProperties().containsKey(REQUEST_URL)) { - sb.append("\"url\": \"").append(operationStatus().getAdditionalProperties() - .get(REQUEST_URL)).append("\", "); - } else { - sb.append("\"url\": \"").append(ApiUtils.buildDocumentUri(operationStatus() - .getIndex(), operationStatus().getId())).append("\", "); - } + if (create != null) { + return create; + } + if (index != null) { + return index; + } + if (delete != null) { + return delete; + } - // We don't want to include an etag field in the response in - // the case of a delete, since that would imply that the client - // could still access that version of the file in some manner - // (which we are not supporting). - if (!operationType().equals("delete")) { - sb.append("\"etag\": \"").append(operationStatus().getVersion()).append("\", "); + return null; } - sb.append("\"status-code\": \"").append(operationStatus().getStatus()).append("\", "); - - sb.append("\"status-message\": \""); - - if ((operationStatus().getStatus() >= 200) && (operationStatus().getStatus() < 300)) { - sb.append("OK"); - } else { - // Sometimes the error object doesn't get populated, so check - // before we try to reference it... - if (operationStatus().getError() != null) { - sb.append(operationStatus().getError().getReason()); - } else { - sb.append(""); - } - } - sb.append("\""); - sb.append("}"); - return sb.toString(); - } + public String toJson() { + StringBuilder sb = new StringBuilder(); + + sb.append("{"); + + sb.append("\"operation\": \"").append(operationType()).append("\", "); + + if (operationStatus().getAdditionalProperties().containsKey(REQUEST_URL)) { + sb.append("\"url\": \"").append(operationStatus().getAdditionalProperties().get(REQUEST_URL)) + .append("\", "); + } else { + sb.append("\"url\": \"") + .append(ApiUtils.buildDocumentUri(operationStatus().getIndex(), operationStatus().getId())) + .append("\", "); + } + + // We don't want to include an etag field in the response in + // the case of a delete, since that would imply that the client + // could still access that version of the file in some manner + // (which we are not supporting). + if (!operationType().equals("delete")) { + sb.append("\"etag\": \"").append(operationStatus().getVersion()).append("\", "); + } + sb.append("\"status-code\": \"").append(operationStatus().getStatus()).append("\", "); + + sb.append("\"status-message\": \""); + + if ((operationStatus().getStatus() >= 200) && (operationStatus().getStatus() < 300)) { + sb.append("OK"); + } else { + // Sometimes the error object doesn't get populated, so check + // before we try to reference it... + if (operationStatus().getError() != null) { + sb.append(operationStatus().getError().getReason()); + } else { + sb.append(""); + } + } + sb.append("\""); + sb.append("}"); + + return sb.toString(); + } - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("ElasticSearchItemStatus ["); - if (create != null) { - sb.append("create " + create); - } else if (index != null) { - sb.append("index " + index); - } else if (delete != null) { - sb.append("delete " + index); + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + + sb.append("ElasticSearchItemStatus ["); + if (create != null) { + sb.append("create " + create); + } else if (index != null) { + sb.append("index " + index); + } else if (delete != null) { + sb.append("delete " + index); + } + sb.append("]"); + return sb.toString(); } - sb.append("]"); - return sb.toString(); - } } diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchShardStatus.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchShardStatus.java index ee29728..e846a38 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchShardStatus.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchShardStatus.java @@ -22,39 +22,38 @@ package org.onap.aai.sa.searchdbabstraction.elasticsearch.dao; public class ElasticSearchShardStatus { - private int total; - private int successful; - private int failed; - - public int getTotal() { - return total; - } - - public void setTotal(int total) { - this.total = total; - } - - public int getSuccessful() { - return successful; - } - - public void setSuccessful(int successful) { - this.successful = successful; - } - - public int getFailed() { - return failed; - } - - public void setFailed(int failed) { - this.failed = failed; - } - - @Override - public String toString() { - return "ElasticSearchShardStatus [total=" + total + ", successful=" + successful - + ", failed=" + failed + "]"; - } + private int total; + private int successful; + private int failed; + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public int getSuccessful() { + return successful; + } + + public void setSuccessful(int successful) { + this.successful = successful; + } + + public int getFailed() { + return failed; + } + + public void setFailed(int failed) { + this.failed = failed; + } + + @Override + public String toString() { + return "ElasticSearchShardStatus [total=" + total + ", successful=" + successful + ", failed=" + failed + "]"; + } } diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/AggregationBucket.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/AggregationBucket.java index 9edea09..ae0a3e9 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/AggregationBucket.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/AggregationBucket.java @@ -24,52 +24,52 @@ import com.fasterxml.jackson.annotation.JsonProperty; import java.util.Arrays; public class AggregationBucket { - private Object key; + private Object key; - @JsonProperty("formatted-key") - private String formattedKey; + @JsonProperty("formatted-key") + private String formattedKey; - private Number count; + private Number count; - @JsonProperty("sub-aggregations") - private AggregationResult[] subAggregationResult; + @JsonProperty("sub-aggregations") + private AggregationResult[] subAggregationResult; - public Object getKey() { - return key; - } + public Object getKey() { + return key; + } - public void setKey(Object key) { - this.key = key; - } + public void setKey(Object key) { + this.key = key; + } - public String getFormattedKey() { - return formattedKey; - } + public String getFormattedKey() { + return formattedKey; + } - public void setFormattedKey(String formattedKey) { - this.formattedKey = formattedKey; - } + public void setFormattedKey(String formattedKey) { + this.formattedKey = formattedKey; + } - public Number getCount() { - return count; - } + public Number getCount() { + return count; + } - public void setCount(Number count) { - this.count = count; - } + public void setCount(Number count) { + this.count = count; + } - public AggregationResult[] getSubAggregationResult() { - return subAggregationResult; - } + public AggregationResult[] getSubAggregationResult() { + return subAggregationResult; + } - public void setSubAggregationResult(AggregationResult[] subAggregationResult) { - this.subAggregationResult = subAggregationResult; - } + public void setSubAggregationResult(AggregationResult[] subAggregationResult) { + this.subAggregationResult = subAggregationResult; + } - @Override - public String toString() { - return "AggregationBucket [key=" + key + ", formattedKey=" + formattedKey + ", count=" + count - + ", subAggregationResult=" + Arrays.toString(subAggregationResult) + "]"; - } + @Override + public String toString() { + return "AggregationBucket [key=" + key + ", formattedKey=" + formattedKey + ", count=" + count + + ", subAggregationResult=" + Arrays.toString(subAggregationResult) + "]"; + } } diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/AggregationResult.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/AggregationResult.java index 88d33b8..923afbf 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/AggregationResult.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/AggregationResult.java @@ -24,52 +24,51 @@ import com.fasterxml.jackson.annotation.JsonProperty; import java.util.Arrays; public class AggregationResult { - private String name; + private String name; - private Number count; + private Number count; - private AggregationBucket[] buckets; + private AggregationBucket[] buckets; - @JsonProperty("nested-aggregations") - private AggregationResult[] nestedAggregations; + @JsonProperty("nested-aggregations") + private AggregationResult[] nestedAggregations; - public String getName() { - return name; - } + public String getName() { + return name; + } - public void setName(String name) { - this.name = name; - } + public void setName(String name) { + this.name = name; + } - public AggregationBucket[] getBuckets() { - return buckets; - } + public AggregationBucket[] getBuckets() { + return buckets; + } - public void setBuckets(AggregationBucket[] buckets) { - this.buckets = buckets; - } + public void setBuckets(AggregationBucket[] buckets) { + this.buckets = buckets; + } - public AggregationResult[] getNestedAggregations() { - return nestedAggregations; - } + public AggregationResult[] getNestedAggregations() { + return nestedAggregations; + } - public void setNestedAggregations(AggregationResult[] nestedAggregations) { - this.nestedAggregations = nestedAggregations; - } + public void setNestedAggregations(AggregationResult[] nestedAggregations) { + this.nestedAggregations = nestedAggregations; + } - public Number getCount() { - return count; - } + public Number getCount() { + return count; + } - public void setCount(Number count) { - this.count = count; - } + public void setCount(Number count) { + this.count = count; + } - @Override - public String toString() { - return "AggregationResult [name=" + name + ", count=" + count + ", buckets=" - + Arrays.toString(buckets) + ", nestedAggregations=" + Arrays.toString(nestedAggregations) - + "]"; - } + @Override + public String toString() { + return "AggregationResult [name=" + name + ", count=" + count + ", buckets=" + Arrays.toString(buckets) + + ", nestedAggregations=" + Arrays.toString(nestedAggregations) + "]"; + } } diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/AggregationResults.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/AggregationResults.java index bb8d282..f8f3ed3 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/AggregationResults.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/AggregationResults.java @@ -23,19 +23,19 @@ package org.onap.aai.sa.searchdbabstraction.entity; import java.util.Arrays; public class AggregationResults { - private AggregationResult[] aggregations; + private AggregationResult[] aggregations; - public AggregationResult[] getAggregations() { - return aggregations; - } + public AggregationResult[] getAggregations() { + return aggregations; + } - public void setAggregations(AggregationResult[] aggregations) { - this.aggregations = aggregations; - } + public void setAggregations(AggregationResult[] aggregations) { + this.aggregations = aggregations; + } - @Override - public String toString() { - return "AggregationResults [aggregations=" + Arrays.toString(aggregations) + "]"; - } + @Override + public String toString() { + return "AggregationResults [aggregations=" + Arrays.toString(aggregations) + "]"; + } } diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/Document.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/Document.java index ae512bd..8b7df43 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/Document.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/Document.java @@ -23,39 +23,39 @@ package org.onap.aai.sa.searchdbabstraction.entity; import org.json.simple.JSONObject; public class Document { - private String etag; - private String url; + private String etag; + private String url; - private JSONObject content; + private JSONObject content; - public String getEtag() { - return etag; - } + public String getEtag() { + return etag; + } - public void setEtag(String etag) { - this.etag = etag; - } + public void setEtag(String etag) { + this.etag = etag; + } - public String getUrl() { - return url; - } + public String getUrl() { + return url; + } - public void setUrl(String url) { - this.url = url; - } + public void setUrl(String url) { + this.url = url; + } - public JSONObject getContent() { - return content; - } + public JSONObject getContent() { + return content; + } - public void setContent(JSONObject content) { - this.content = content; - } + public void setContent(JSONObject content) { + this.content = content; + } - @Override - public String toString() { - return "Document [etag=" + etag + ", url=" + url + "]"; - } + @Override + public String toString() { + return "Document [etag=" + etag + ", url=" + url + "]"; + } } diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/DocumentOperationResult.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/DocumentOperationResult.java index f22c41a..9775446 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/DocumentOperationResult.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/DocumentOperationResult.java @@ -21,20 +21,20 @@ package org.onap.aai.sa.searchdbabstraction.entity; public class DocumentOperationResult extends OperationResult { - private Document document; + private Document document; - public Document getDocument() { - return document; - } + public Document getDocument() { + return document; + } - public void setDocument(Document document) { - this.document = document; - } + public void setDocument(Document document) { + this.document = document; + } - @Override - public String toString() { - return "DocumentOperationResult [document=" + document + "]"; - } + @Override + public String toString() { + return "DocumentOperationResult [document=" + document + "]"; + } } diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/ErrorResult.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/ErrorResult.java index 26253b9..06c788a 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/ErrorResult.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/ErrorResult.java @@ -22,35 +22,35 @@ package org.onap.aai.sa.searchdbabstraction.entity; public class ErrorResult { - private String type; - private String reason; + private String type; + private String reason; - public ErrorResult(String type, String reason) { - super(); - this.type = type; - this.reason = reason; - } + public ErrorResult(String type, String reason) { + super(); + this.type = type; + this.reason = reason; + } - public String getType() { - return type; - } + public String getType() { + return type; + } - public void setType(String type) { - this.type = type; - } + public void setType(String type) { + this.type = type; + } - public String getReason() { - return reason; - } + public String getReason() { + return reason; + } - public void setReason(String reason) { - this.reason = reason; - } + public void setReason(String reason) { + this.reason = reason; + } - @Override - public String toString() { - return "ErrorResponse [type=" + type + ", reason=" + reason + "]"; - } + @Override + public String toString() { + return "ErrorResponse [type=" + type + ", reason=" + reason + "]"; + } } diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/OperationResult.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/OperationResult.java index 3545818..0d3a8bb 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/OperationResult.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/OperationResult.java @@ -22,57 +22,57 @@ package org.onap.aai.sa.searchdbabstraction.entity; public class OperationResult { - private int resultCode; + private int resultCode; - private String failureCause; - private String resultVersion; - private String result; - private ErrorResult error; + private String failureCause; + private String resultVersion; + private String result; + private ErrorResult error; - public int getResultCode() { - return resultCode; - } + public int getResultCode() { + return resultCode; + } - public void setResultCode(int resultCode) { - this.resultCode = resultCode; - } + public void setResultCode(int resultCode) { + this.resultCode = resultCode; + } - public String getFailureCause() { - return failureCause; - } + public String getFailureCause() { + return failureCause; + } - public void setFailureCause(String failureCause) { - this.failureCause = failureCause; - } + public void setFailureCause(String failureCause) { + this.failureCause = failureCause; + } - public String getResultVersion() { - return resultVersion; - } + public String getResultVersion() { + return resultVersion; + } - public void setResultVersion(String resultVersion) { - this.resultVersion = resultVersion; - } + public void setResultVersion(String resultVersion) { + this.resultVersion = resultVersion; + } - public String getResult() { - return result; - } + public String getResult() { + return result; + } - public void setResult(String result) { - this.result = result; - } + public void setResult(String result) { + this.result = result; + } - public ErrorResult getError() { - return error; - } + public ErrorResult getError() { + return error; + } - public void setError(ErrorResult error) { - this.error = error; - } + public void setError(ErrorResult error) { + this.error = error; + } - @Override - public String toString() { - return "OperationResult [resultCode=" + resultCode + ", failureCause=" + failureCause - + ", resultVersion=" + resultVersion + ", result=" + result + ", error=" + error + "]"; - } + @Override + public String toString() { + return "OperationResult [resultCode=" + resultCode + ", failureCause=" + failureCause + ", resultVersion=" + + resultVersion + ", result=" + result + ", error=" + error + "]"; + } } diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/SearchHit.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/SearchHit.java index 1f4a5be..033dafe 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/SearchHit.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/SearchHit.java @@ -21,28 +21,28 @@ package org.onap.aai.sa.searchdbabstraction.entity; public class SearchHit { - private String score; - Document document; + private String score; + Document document; - public String getScore() { - return score; - } + public String getScore() { + return score; + } - public void setScore(String score) { - this.score = score; - } + public void setScore(String score) { + this.score = score; + } - public Document getDocument() { - return document; - } + public Document getDocument() { + return document; + } - public void setDocument(Document document) { - this.document = document; - } + public void setDocument(Document document) { + this.document = document; + } - @Override - public String toString() { - return "SearchHit [score=" + score + ", document=" + document + "]"; - } + @Override + public String toString() { + return "SearchHit [score=" + score + ", document=" + document + "]"; + } } diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/SearchHits.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/SearchHits.java index f3fefe7..cf4fd3a 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/SearchHits.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/SearchHits.java @@ -23,28 +23,28 @@ package org.onap.aai.sa.searchdbabstraction.entity; import java.util.Arrays; public class SearchHits { - private String totalHits; - private SearchHit[] hits; + private String totalHits; + private SearchHit[] hits; - public String getTotalHits() { - return totalHits; - } + public String getTotalHits() { + return totalHits; + } - public void setTotalHits(String totalHits) { - this.totalHits = totalHits; - } + public void setTotalHits(String totalHits) { + this.totalHits = totalHits; + } - public SearchHit[] getHits() { - return hits; - } + public SearchHit[] getHits() { + return hits; + } - public void setHits(SearchHit[] hits) { - this.hits = hits; - } + public void setHits(SearchHit[] hits) { + this.hits = hits; + } - @Override - public String toString() { - return "SearchHits [totalHits=" + totalHits + ", hits=" + Arrays.toString(hits) + "]"; - } + @Override + public String toString() { + return "SearchHits [totalHits=" + totalHits + ", hits=" + Arrays.toString(hits) + "]"; + } } diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/SearchOperationResult.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/SearchOperationResult.java index cdb9ee3..6834d33 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/SearchOperationResult.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/SearchOperationResult.java @@ -22,36 +22,38 @@ package org.onap.aai.sa.searchdbabstraction.entity; public class SearchOperationResult extends OperationResult { - private SearchHits searchResult; - private AggregationResults aggregationResult; - private SuggestHits suggestResult; - - public SearchHits getSearchResult() { - return searchResult; - } - - public SuggestHits getSuggestResult() { - return suggestResult; - } - - public AggregationResults getAggregationResult() { - return aggregationResult; - } - - public void setAggregationResult(AggregationResults aggregations) { - this.aggregationResult = aggregations; - } - - public void setSearchResult(SearchHits hits) { - this.searchResult = hits; - } - - public void setSuggestResult(SuggestHits hits) { this.suggestResult = hits; } - - @Override - public String toString() { - return "SearchOperationResult [searchResult=" + searchResult - + ", aggregationResult=" + aggregationResult + ", suggestResult=" + suggestResult; - } + private SearchHits searchResult; + private AggregationResults aggregationResult; + private SuggestHits suggestResult; + + public SearchHits getSearchResult() { + return searchResult; + } + + public SuggestHits getSuggestResult() { + return suggestResult; + } + + public AggregationResults getAggregationResult() { + return aggregationResult; + } + + public void setAggregationResult(AggregationResults aggregations) { + this.aggregationResult = aggregations; + } + + public void setSearchResult(SearchHits hits) { + this.searchResult = hits; + } + + public void setSuggestResult(SuggestHits hits) { + this.suggestResult = hits; + } + + @Override + public String toString() { + return "SearchOperationResult [searchResult=" + searchResult + ", aggregationResult=" + aggregationResult + + ", suggestResult=" + suggestResult; + } } diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/SuggestHit.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/SuggestHit.java index 82a6c93..4ce267d 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/SuggestHit.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/entity/SuggestHit.java @@ -18,7 +18,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ - package org.onap.aai.sa.searchdbabstraction.entity; +package org.onap.aai.sa.searchdbabstraction.entity; public class SuggestHit { @@ -54,4 +54,4 @@ public class SuggestHit { public String toString() { return "SearchHit [text=" + text + ",score=" + score + ", document=" + document + "]"; } -} \ No newline at end of file +} diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/logging/SearchDbMsgs.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/logging/SearchDbMsgs.java index 9ba8fef..d38de2a 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/logging/SearchDbMsgs.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/logging/SearchDbMsgs.java @@ -25,198 +25,158 @@ import org.onap.aai.cl.eelf.LogMessageEnum; public enum SearchDbMsgs implements LogMessageEnum { - /** - * Arguments: - * None - */ - SERVICE_STARTED, - - /** - * Arguments: - * {0} = url - */ - ELASTIC_SEARCH_CONNECTION_ATTEMPT, - - /** - * Arguments: - * {0} = url - */ - ELASTIC_SEARCH_CONNECTION_SUCCESS, - - /** - * Arguments: - * {0} = url - * {1} = failure cause - */ - ELASTIC_SEARCH_CONNECTION_FAILURE, - - /** - * Arguments: - * {0} = Filter configuration file. - * {1} = Failure cause. - */ - FILTERS_CONFIG_FAILURE, - - /** - * Arguments: - * {0} = Analysys configuration file. - * {1} = Failure case. - */ - ANALYSYS_CONFIG_FAILURE, - - /** - * Arguments: - * {0} = Index name - */ - CREATED_INDEX, - - /** - * Arguments: - * {0} = Index name - * {1} = Document type - */ - CREATE_INDEX_TIME, - - /** - * Arguments: - * {0} = Index name - */ - DELETED_INDEX, - - /** - * Arguments: - * {0} = Index name - */ - DELETE_INDEX_TIME, - - /** - * Arguments: - * {0} = Index name - */ - CHECK_INDEX_TIME, - - /** - * Arguments: - * {0} = Index name - */ - CREATE_DOCUMENT_TIME, - - /** - * Arguments: - * {0} = Index name - * {1} = Document id - */ - UPDATE_DOCUMENT_TIME, - - /** - * Arguments: - * {0} = Index name - * {1} = Document id - */ - DELETE_DOCUMENT_TIME, - - /** - * Arguments: - * {0} = Index name - * {1} = Document id - */ - GET_DOCUMENT_TIME, - - /** - * Arguments: - * {0} = Index name - * {1} = Query string - */ - QUERY_DOCUMENT_TIME, - - /** - * Arguments: - */ - BULK_OPERATIONS_TIME, - - /** - * Arguments: - */ - PROCESSED_BULK_OPERATIONS, - - /** - * Arguments: - * {0} = Event - * {1} = Result - */ - PROCESS_EVENT, - - /** - * Arguments: - * {0} = URL. - */ - PROCESS_INLINE_QUERY, - - /** - * Arguments - * {0} - Operation type (GET or POST) - * {1} - URL. - */ - PROCESS_PAYLOAD_QUERY, - - /** - * Arguments: - * {0} = Index - * {1} = Error - */ - INDEX_CREATE_FAILURE, - - /** - * Arguments: - * {0} = Index name - * {1} = Error cause - */ - INDEX_DELETE_FAILURE, - - /** - * Arguments: - * {0} = Failure cause. - */ - GET_ANALYZERS_FAILURE, - - /** - * Arguments: - * {0} = Failure cause. - */ - BULK_OPERATION_FAILURE, - - /** - * Arguments: - * {0} = Method - * {1} = Exception - */ - EXCEPTION_DURING_METHOD_CALL, - - /** - * Received request {0} {1} from {2}. Sending response: {3} - * - *

Arguments: - * {0} = operation - * {1} = target URL - * {2} = source - * {3} = response code - */ - PROCESS_REST_REQUEST, - - STARTUP_EXCEPTION - /** - * Exception encountered during startup of search service: {0} - * - *

Arguments: - * {0} = exception - */ - ; - - /** - * Load message bundle (SearchDbMsgs.properties file) - */ - static { - EELFResourceManager.loadMessageBundle("logging/SearchDbMsgs"); - } + /** + * Arguments: None + */ + SERVICE_STARTED, + + /** + * Arguments: {0} = url + */ + ELASTIC_SEARCH_CONNECTION_ATTEMPT, + + /** + * Arguments: {0} = url + */ + ELASTIC_SEARCH_CONNECTION_SUCCESS, + + /** + * Arguments: {0} = url {1} = failure cause + */ + ELASTIC_SEARCH_CONNECTION_FAILURE, + + /** + * Arguments: {0} = Filter configuration file. {1} = Failure cause. + */ + FILTERS_CONFIG_FAILURE, + + /** + * Arguments: {0} = Analysys configuration file. {1} = Failure case. + */ + ANALYSYS_CONFIG_FAILURE, + + /** + * Arguments: {0} = Index name + */ + CREATED_INDEX, + + /** + * Arguments: {0} = Index name {1} = Document type + */ + CREATE_INDEX_TIME, + + /** + * Arguments: {0} = Index name + */ + DELETED_INDEX, + + /** + * Arguments: {0} = Index name + */ + DELETE_INDEX_TIME, + + /** + * Arguments: {0} = Index name + */ + CHECK_INDEX_TIME, + + /** + * Arguments: {0} = Index name + */ + CREATE_DOCUMENT_TIME, + + /** + * Arguments: {0} = Index name {1} = Document id + */ + UPDATE_DOCUMENT_TIME, + + /** + * Arguments: {0} = Index name {1} = Document id + */ + DELETE_DOCUMENT_TIME, + + /** + * Arguments: {0} = Index name {1} = Document id + */ + GET_DOCUMENT_TIME, + + /** + * Arguments: {0} = Index name {1} = Query string + */ + QUERY_DOCUMENT_TIME, + + /** + * Arguments: + */ + BULK_OPERATIONS_TIME, + + /** + * Arguments: + */ + PROCESSED_BULK_OPERATIONS, + + /** + * Arguments: {0} = Event {1} = Result + */ + PROCESS_EVENT, + + /** + * Arguments: {0} = URL. + */ + PROCESS_INLINE_QUERY, + + /** + * Arguments {0} - Operation type (GET or POST) {1} - URL. + */ + PROCESS_PAYLOAD_QUERY, + + /** + * Arguments: {0} = Index {1} = Error + */ + INDEX_CREATE_FAILURE, + + /** + * Arguments: {0} = Index name {1} = Error cause + */ + INDEX_DELETE_FAILURE, + + /** + * Arguments: {0} = Failure cause. + */ + GET_ANALYZERS_FAILURE, + + /** + * Arguments: {0} = Failure cause. + */ + BULK_OPERATION_FAILURE, + + /** + * Arguments: {0} = Method {1} = Exception + */ + EXCEPTION_DURING_METHOD_CALL, + + /** + * Received request {0} {1} from {2}. Sending response: {3} + * + *

+ * Arguments: {0} = operation {1} = target URL {2} = source {3} = response code + */ + PROCESS_REST_REQUEST, + + STARTUP_EXCEPTION + /** + * Exception encountered during startup of search service: {0} + * + *

+ * Arguments: {0} = exception + */ + ; + + /** + * Load message bundle (SearchDbMsgs.properties file) + */ + static { + EELFResourceManager.loadMessageBundle("logging/SearchDbMsgs"); + } } diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/AbstractAggregation.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/AbstractAggregation.java index 99c99e5..80b4704 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/AbstractAggregation.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/AbstractAggregation.java @@ -24,55 +24,54 @@ import com.fasterxml.jackson.annotation.JsonProperty; /** - * This is the common parent from which all aggregation types inherit. It defines - * the common fields that all aggregations must include. + * This is the common parent from which all aggregation types inherit. It defines the common fields that all + * aggregations must include. */ public abstract class AbstractAggregation { - /** - * The name of the field to apply the aggregation against. - */ - protected String field; + /** + * The name of the field to apply the aggregation against. + */ + protected String field; - /** - * Optionally allows the number of buckets for the aggregation to be - * specified. - */ - protected Integer size; + /** + * Optionally allows the number of buckets for the aggregation to be specified. + */ + protected Integer size; - /** - * Optionally sets the minimum number of matches that must occur before - * a particular bucket is included in the aggregation result. - */ - @JsonProperty("min-threshold") - protected Integer minThreshold; + /** + * Optionally sets the minimum number of matches that must occur before a particular bucket is included in the + * aggregation result. + */ + @JsonProperty("min-threshold") + protected Integer minThreshold; - public String getField() { - return field; - } + public String getField() { + return field; + } - public void setField(String field) { - this.field = field; - } + public void setField(String field) { + this.field = field; + } - public Integer getSize() { - return size; - } + public Integer getSize() { + return size; + } - public void setSize(Integer size) { - this.size = size; - } + public void setSize(Integer size) { + this.size = size; + } - public Integer getMinThreshold() { - return minThreshold; - } + public Integer getMinThreshold() { + return minThreshold; + } - public void setMinThreshold(Integer minThreshold) { - this.minThreshold = minThreshold; - } + public void setMinThreshold(Integer minThreshold) { + this.minThreshold = minThreshold; + } - public abstract String toElasticSearch(); + public abstract String toElasticSearch(); - public abstract String toString(); + public abstract String toString(); } diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/Aggregation.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/Aggregation.java index 532571b..e1994fe 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/Aggregation.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/Aggregation.java @@ -23,41 +23,41 @@ package org.onap.aai.sa.searchdbabstraction.searchapi; import com.fasterxml.jackson.annotation.JsonProperty; public class Aggregation { - private String name; + private String name; - @JsonProperty("aggregation") - private AggregationStatement aggregation; + @JsonProperty("aggregation") + private AggregationStatement aggregation; - public String getName() { - return name; - } + public String getName() { + return name; + } - public void setName(String name) { - this.name = name; - } + public void setName(String name) { + this.name = name; + } - public AggregationStatement getStatement() { - return aggregation; - } + public AggregationStatement getStatement() { + return aggregation; + } - public void setStatement(AggregationStatement aggregation) { - this.aggregation = aggregation; - } + public void setStatement(AggregationStatement aggregation) { + this.aggregation = aggregation; + } - public String toElasticSearch() { - StringBuffer sb = new StringBuffer(); + public String toElasticSearch() { + StringBuffer sb = new StringBuffer(); - sb.append("\""); - sb.append(name); - sb.append("\": "); - sb.append(aggregation.toElasticSearch()); + sb.append("\""); + sb.append(name); + sb.append("\": "); + sb.append(aggregation.toElasticSearch()); - return sb.toString(); - } + return sb.toString(); + } - @Override - public String toString() { - return "{name: " + name + ", aggregation: " + aggregation.toString(); - } + @Override + public String toString() { + return "{name: " + name + ", aggregation: " + aggregation.toString(); + } } diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/AggregationStatement.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/AggregationStatement.java index 696c9d9..4b446fd 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/AggregationStatement.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/AggregationStatement.java @@ -25,149 +25,149 @@ import java.util.Arrays; public class AggregationStatement { - @JsonProperty("group-by") - private GroupByAggregation groupBy; + @JsonProperty("group-by") + private GroupByAggregation groupBy; - @JsonProperty("date-range") - private DateRangeAggregation dateRange; + @JsonProperty("date-range") + private DateRangeAggregation dateRange; - @JsonProperty("date-histogram") - private DateHistogramAggregation dateHist; + @JsonProperty("date-histogram") + private DateHistogramAggregation dateHist; - @JsonProperty("nested") - private Aggregation[] nested; + @JsonProperty("nested") + private Aggregation[] nested; - @JsonProperty("sub-aggregations") - private Aggregation[] subAggregations; + @JsonProperty("sub-aggregations") + private Aggregation[] subAggregations; - public GroupByAggregation getGroupBy() { - return groupBy; - } - - public void setGroupBy(GroupByAggregation groupBy) { - this.groupBy = groupBy; - } - - public DateRangeAggregation getDateRange() { - return dateRange; - } + public GroupByAggregation getGroupBy() { + return groupBy; + } - public void setDateRange(DateRangeAggregation dateRange) { - this.dateRange = dateRange; - } + public void setGroupBy(GroupByAggregation groupBy) { + this.groupBy = groupBy; + } - public DateHistogramAggregation getDateHist() { - return dateHist; - } + public DateRangeAggregation getDateRange() { + return dateRange; + } - public void setDateHist(DateHistogramAggregation dateHist) { - this.dateHist = dateHist; - } + public void setDateRange(DateRangeAggregation dateRange) { + this.dateRange = dateRange; + } - public Aggregation[] getNested() { - return nested; - } + public DateHistogramAggregation getDateHist() { + return dateHist; + } - public void setNested(Aggregation[] nested) { - this.nested = nested; - } + public void setDateHist(DateHistogramAggregation dateHist) { + this.dateHist = dateHist; + } - public Aggregation[] getSubAggregations() { - return subAggregations; - } + public Aggregation[] getNested() { + return nested; + } - public void setSubAggregations(Aggregation[] subAggregations) { - this.subAggregations = subAggregations; - } + public void setNested(Aggregation[] nested) { + this.nested = nested; + } - public String toElasticSearch() { - StringBuffer sb = new StringBuffer(); + public Aggregation[] getSubAggregations() { + return subAggregations; + } - sb.append("{"); + public void setSubAggregations(Aggregation[] subAggregations) { + this.subAggregations = subAggregations; + } - if (nested != null && nested.length > 0) { - sb.append("\"nested\": {\"path\": \""); - if (nested[0].getStatement() != null) { - sb.append(nested[0].getStatement().getNestedPath()); - } - sb.append("\"}, \"aggs\": {"); - for (int i = 0; i < nested.length; i++) { - if (i > 0) { - sb.append(","); - } - sb.append(nested[i].toElasticSearch()); - } - - sb.append("}"); - } else { - if (groupBy != null) { - sb.append(groupBy.toElasticSearch()); - } else if (dateRange != null) { - sb.append(dateRange.toElasticSearch()); - } else if (dateHist != null) { - sb.append(dateHist.toElasticSearch()); - } - - if (subAggregations != null && subAggregations.length > 0) { - sb.append(", \"aggs\": {"); - for (int i = 0; i < subAggregations.length; i++) { - if (i > 0) { - sb.append(","); - } - sb.append(subAggregations[i].toElasticSearch()); + public String toElasticSearch() { + StringBuffer sb = new StringBuffer(); + + sb.append("{"); + + if (nested != null && nested.length > 0) { + sb.append("\"nested\": {\"path\": \""); + if (nested[0].getStatement() != null) { + sb.append(nested[0].getStatement().getNestedPath()); + } + sb.append("\"}, \"aggs\": {"); + for (int i = 0; i < nested.length; i++) { + if (i > 0) { + sb.append(","); + } + sb.append(nested[i].toElasticSearch()); + } + + sb.append("}"); + } else { + if (groupBy != null) { + sb.append(groupBy.toElasticSearch()); + } else if (dateRange != null) { + sb.append(dateRange.toElasticSearch()); + } else if (dateHist != null) { + sb.append(dateHist.toElasticSearch()); + } + + if (subAggregations != null && subAggregations.length > 0) { + sb.append(", \"aggs\": {"); + for (int i = 0; i < subAggregations.length; i++) { + if (i > 0) { + sb.append(","); + } + sb.append(subAggregations[i].toElasticSearch()); + } + sb.append("}"); + } } + sb.append("}"); - } - } - sb.append("}"); + return sb.toString(); + } - return sb.toString(); - } + @Override + public String toString() { + StringBuffer sb = new StringBuffer(); + + if (nested != null) { + sb.append("{nested: "); + sb.append(Arrays.toString(nested)); + } else if (groupBy != null) { + sb.append(groupBy.toString()); + } else if (dateHist != null) { + sb.append(dateHist.toString()); + } else if (dateRange != null) { + sb.append(dateRange.toString()); + } - @Override - public String toString() { - StringBuffer sb = new StringBuffer(); + if (subAggregations != null) { + sb.append(", sub-aggregations: "); + sb.append(Arrays.toString(subAggregations)); + } - if (nested != null) { - sb.append("{nested: "); - sb.append(Arrays.toString(nested)); - } else if (groupBy != null) { - sb.append(groupBy.toString()); - } else if (dateHist != null) { - sb.append(dateHist.toString()); - } else if (dateRange != null) { - sb.append(dateRange.toString()); - } + sb.append("}"); - if (subAggregations != null) { - sb.append(", sub-aggregations: "); - sb.append(Arrays.toString(subAggregations)); + return sb.toString(); } - sb.append("}"); - - return sb.toString(); - } + public String getNestedPath() { + String path = null; + String fieldName = null; - public String getNestedPath() { - String path = null; - String fieldName = null; + if (groupBy != null) { + fieldName = groupBy.getField(); + } else if (dateRange != null) { + fieldName = dateRange.getField(); + } else if (dateHist != null) { + fieldName = dateHist.getField(); + } - if (groupBy != null) { - fieldName = groupBy.getField(); - } else if (dateRange != null) { - fieldName = dateRange.getField(); - } else if (dateHist != null) { - fieldName = dateHist.getField(); - } + if (fieldName != null && fieldName.contains(".")) { + // we have nested field + path = fieldName.substring(0, fieldName.indexOf(".")); + } - if (fieldName != null && fieldName.contains(".")) { - // we have nested field - path = fieldName.substring(0, fieldName.indexOf(".")); + return path; } - return path; - } - } diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/DateHistogramAggregation.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/DateHistogramAggregation.java index 2967fd2..96bb25d 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/DateHistogramAggregation.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/DateHistogramAggregation.java @@ -25,7 +25,9 @@ import com.fasterxml.jackson.annotation.JsonProperty; /** * An example of elasticsearch date_histogram aggregation: * - *

+ * 

+ * + *

  * {
  *    "aggs": {
  *        "my_group": {
@@ -41,75 +43,75 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class DateHistogramAggregation extends AbstractAggregation {
 
-  private String interval;
+    private String interval;
 
-  private String format;
+    private String format;
 
-  @JsonProperty("time-zone")
-  private String timeZone;
+    @JsonProperty("time-zone")
+    private String timeZone;
 
 
-  public String getInterval() {
-    return interval;
-  }
-
-  public void setInterval(String interval) {
-    this.interval = interval;
-  }
-
-  public String getTimeZone() {
-    return timeZone;
-  }
-
-  public String getFormat() {
-    return format;
-  }
-
-  public void setFormat(String format) {
-    this.format = format;
-  }
-
-  public void setTimeZone(String timeZone) {
-    this.timeZone = timeZone;
-  }
-
-  @Override
-  public String toElasticSearch() {
-    StringBuilder sb = new StringBuilder();
+    public String getInterval() {
+        return interval;
+    }
 
-    sb.append("\"date_histogram\": {\"field\": \"");
-    sb.append(field);
-    sb.append("\"");
-    if (interval != null) {
-      sb.append(", \"interval\": \"");
-      sb.append(interval);
-      sb.append("\"");
+    public void setInterval(String interval) {
+        this.interval = interval;
     }
-    if (format != null) {
-      sb.append(", \"format\": \"");
-      sb.append(format);
-      sb.append("\"");
+
+    public String getTimeZone() {
+        return timeZone;
     }
-    if (timeZone != null) {
-      sb.append(", \"time_zone\": \"");
-      sb.append(timeZone);
-      sb.append("\"");
+
+    public String getFormat() {
+        return format;
     }
-    if (size != null) {
-      sb.append(", \"size\": ");
-      sb.append(size);
+
+    public void setFormat(String format) {
+        this.format = format;
     }
-    if (minThreshold != null) {
-      sb.append(", \"min_doc_count\": ").append(minThreshold);
+
+    public void setTimeZone(String timeZone) {
+        this.timeZone = timeZone;
     }
-    sb.append("}");
 
-    return sb.toString();
-  }
+    @Override
+    public String toElasticSearch() {
+        StringBuilder sb = new StringBuilder();
+
+        sb.append("\"date_histogram\": {\"field\": \"");
+        sb.append(field);
+        sb.append("\"");
+        if (interval != null) {
+            sb.append(", \"interval\": \"");
+            sb.append(interval);
+            sb.append("\"");
+        }
+        if (format != null) {
+            sb.append(", \"format\": \"");
+            sb.append(format);
+            sb.append("\"");
+        }
+        if (timeZone != null) {
+            sb.append(", \"time_zone\": \"");
+            sb.append(timeZone);
+            sb.append("\"");
+        }
+        if (size != null) {
+            sb.append(", \"size\": ");
+            sb.append(size);
+        }
+        if (minThreshold != null) {
+            sb.append(", \"min_doc_count\": ").append(minThreshold);
+        }
+        sb.append("}");
+
+        return sb.toString();
+    }
 
-  @Override
-  public String toString() {
-    return "DateHistogramAggregation: [field=" + field + ", interval=" + interval + ", format="
-        + format + ", timeZone=" + timeZone + ", size=" + size + " minThreshold=" + minThreshold;
-  }
+    @Override
+    public String toString() {
+        return "DateHistogramAggregation: [field=" + field + ", interval=" + interval + ", format=" + format
+                + ", timeZone=" + timeZone + ", size=" + size + " minThreshold=" + minThreshold;
+    }
 }
diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/DateRange.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/DateRange.java
index 8d899b0..78f707a 100644
--- a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/DateRange.java
+++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/DateRange.java
@@ -27,6 +27,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
  * 

* The expected JSON structure for a ranges is as follows: *

+ * *

  * {
  *  "from": 
@@ -35,6 +36,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
  * 

* or *

+ * *

  * {
  *  "to": 
@@ -43,6 +45,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
  * 

* or *

+ * *

  * {
  *  "from": ,
@@ -54,58 +57,58 @@ import com.fasterxml.jackson.annotation.JsonProperty;
  */
 public class DateRange {
 
-  @JsonProperty("from")
-  private String fromDate;
+    @JsonProperty("from")
+    private String fromDate;
 
-  @JsonProperty("to")
-  private String toDate;
+    @JsonProperty("to")
+    private String toDate;
 
-  public String getFromDate() {
-    return fromDate;
-  }
+    public String getFromDate() {
+        return fromDate;
+    }
 
-  public void setFromDate(String fromDate) {
-    this.fromDate = fromDate;
-  }
+    public void setFromDate(String fromDate) {
+        this.fromDate = fromDate;
+    }
 
-  public String getToDate() {
-    return toDate;
-  }
+    public String getToDate() {
+        return toDate;
+    }
 
-  public void setToDate(String toDate) {
-    this.toDate = toDate;
-  }
+    public void setToDate(String toDate) {
+        this.toDate = toDate;
+    }
 
-  public String toElasticSearch() {
-    StringBuilder sb = new StringBuilder();
+    public String toElasticSearch() {
+        StringBuilder sb = new StringBuilder();
 
-    sb.append("{");
+        sb.append("{");
 
-    if (fromDate != null) {
-      sb.append("\"from\": \"");
-      sb.append(fromDate.toString());
-      sb.append("\"");
-    }
+        if (fromDate != null) {
+            sb.append("\"from\": \"");
+            sb.append(fromDate.toString());
+            sb.append("\"");
+        }
 
-    if (toDate != null) {
-      if (fromDate != null) {
-        sb.append(", \"to\": \"");
-        sb.append(toDate.toString());
-        sb.append("\"");
-      } else {
-        sb.append("\"to\": \"");
-        sb.append(toDate.toString());
-        sb.append("\"");
-      }
-    }
+        if (toDate != null) {
+            if (fromDate != null) {
+                sb.append(", \"to\": \"");
+                sb.append(toDate.toString());
+                sb.append("\"");
+            } else {
+                sb.append("\"to\": \"");
+                sb.append(toDate.toString());
+                sb.append("\"");
+            }
+        }
 
-    sb.append("}");
+        sb.append("}");
 
-    return sb.toString();
-  }
+        return sb.toString();
+    }
 
-  public String toString() {
-    return "{from: " + fromDate + ", to: " + toDate + "}";
-  }
+    public String toString() {
+        return "{from: " + fromDate + ", to: " + toDate + "}";
+    }
 
 }
diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/DateRangeAggregation.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/DateRangeAggregation.java
index 1ee42c9..5851f9a 100644
--- a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/DateRangeAggregation.java
+++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/DateRangeAggregation.java
@@ -25,7 +25,9 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 /**
  * An example of a date_range aggregation:
  *
- * 

+ * 

+ * + *

  * {
  *    "aggs": {
  *        "range": {
@@ -47,83 +49,83 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 public class DateRangeAggregation extends AbstractAggregation {
 
 
-  private String format;
+    private String format;
 
-  @JsonProperty("ranges")
-  private DateRange[] dateRanges;
+    @JsonProperty("ranges")
+    private DateRange[] dateRanges;
 
 
-  public String getFormat() {
-    return format;
-  }
+    public String getFormat() {
+        return format;
+    }
+
+    public void setFormat(String format) {
+        this.format = format;
+    }
 
-  public void setFormat(String format) {
-    this.format = format;
-  }
+    public DateRange[] getDateRanges() {
+        return dateRanges;
+    }
 
-  public DateRange[] getDateRanges() {
-    return dateRanges;
-  }
+    public void setDateRanges(DateRange[] dateRanges) {
+        this.dateRanges = dateRanges;
+    }
 
-  public void setDateRanges(DateRange[] dateRanges) {
-    this.dateRanges = dateRanges;
-  }
+    @Override
+    public String toElasticSearch() {
+        StringBuilder sb = new StringBuilder();
 
-  @Override
-  public String toElasticSearch() {
-    StringBuilder sb = new StringBuilder();
+        sb.append("\"date_range\": {\"field\": \"");
+        sb.append(field);
+        sb.append("\"");
 
-    sb.append("\"date_range\": {\"field\": \"");
-    sb.append(field);
-    sb.append("\"");
+        if (format != null) {
+            sb.append(", \"format\": \"");
+            sb.append(format);
+            sb.append("\"");
+        }
 
-    if (format != null) {
-      sb.append(", \"format\": \"");
-      sb.append(format);
-      sb.append("\"");
-    }
+        if (dateRanges != null && dateRanges.length > 0) {
+            sb.append(", \"ranges\": [");
 
-    if (dateRanges != null && dateRanges.length > 0) {
-      sb.append(", \"ranges\": [");
+            for (int i = 0; i < dateRanges.length; i++) {
+                if (i > 0) {
+                    sb.append(",");
+                }
+                sb.append(dateRanges[i].toElasticSearch());
+            }
 
-      for (int i = 0; i < dateRanges.length; i++) {
-        if (i > 0) {
-          sb.append(",");
+            sb.append("]");
         }
-        sb.append(dateRanges[i].toElasticSearch());
-      }
 
-      sb.append("]");
-    }
+        if (size != null) {
+            sb.append(", \"size\": ");
+            sb.append(size);
+        }
 
-    if (size != null) {
-      sb.append(", \"size\": ");
-      sb.append(size);
-    }
+        if (minThreshold != null) {
+            sb.append(", \"min_doc_count\": ").append(minThreshold);
+        }
 
-    if (minThreshold != null) {
-      sb.append(", \"min_doc_count\": ").append(minThreshold);
-    }
+        sb.append("}");
 
-    sb.append("}");
-
-    return sb.toString();
-  }
-
-  @Override
-  public String toString() {
-    StringBuffer sb = new StringBuffer();
-    sb.append("date-range: {field: " + field + ", format: " + format + ", size: " + size
-        + ", minThreshold: " + minThreshold + "ranges: [");
-    for (int i = 0; i < dateRanges.length; i++) {
-      if (i > 0) {
-        sb.append(",");
-      }
-      sb.append(dateRanges[i].toString());
+        return sb.toString();
     }
-    sb.append("]");
 
-    return sb.toString();
-  }
+    @Override
+    public String toString() {
+        StringBuffer sb = new StringBuffer();
+        sb.append("date-range: {field: " + field + ", format: " + format + ", size: " + size + ", minThreshold: "
+                + minThreshold + "ranges: [");
+        for (int i = 0; i < dateRanges.length; i++) {
+            if (i > 0) {
+                sb.append(",");
+            }
+            sb.append(dateRanges[i].toString());
+        }
+        sb.append("]");
+
+        return sb.toString();
+    }
 
 }
diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/Filter.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/Filter.java
index 2d9a8e1..4e8bdd0 100644
--- a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/Filter.java
+++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/Filter.java
@@ -26,7 +26,9 @@ import java.util.List;
 /**
  * This class represents the filter stanza in a search statement.
  *
- * 

The expected JSON structure for a filter stanza is as follows: + *

+ * The expected JSON structure for a filter stanza is as follows: + * *

  * {
  *     "filter": {
@@ -38,149 +40,147 @@ import java.util.List;
  */
 public class Filter {
 
-  /**
-   * All queries in this list must evaluate to true for the filter to pass.
-   */
-  private QueryStatement[] all;
-
-  /**
-   * Any one of the queries in this list must evaluate to true for the
-   * filter to pass.
-   */
-  private QueryStatement[] any;
-
-
-  public QueryStatement[] getAll() {
-    return all;
-  }
-
-  public void setAll(QueryStatement[] all) {
-    this.all = all;
-  }
-
-  public QueryStatement[] getAny() {
-    return any;
-  }
-
-  public void setAny(QueryStatement[] any) {
-    this.any = any;
-  }
-
-  /**
-   * This method returns a string which represents this filter in syntax
-   * that is understandable by ElasticSearch and is suitable for inclusion
-   * in an ElasticSearch query string.
-   *
-   * @return - ElasticSearch syntax string.
-   */
-  public String toElasticSearch() {
-
-    StringBuilder sb = new StringBuilder();
-
-    List notMatchQueries = new ArrayList();
-    sb.append("{");
-    sb.append("\"bool\": {");
-
-    // Add the queries from our 'all' list.
-    int matchQueriesCount = 0;
-    int notMatchQueriesCount = 0;
-    if (all != null) {
-      sb.append("\"must\": [");
-
-      for (QueryStatement query : all) {
-        if (matchQueriesCount > 0) {
-          sb.append(", ");
-        }
+    /**
+     * All queries in this list must evaluate to true for the filter to pass.
+     */
+    private QueryStatement[] all;
 
-        if (query.isNotMatch()) {
-          notMatchQueries.add(query);
-        } else {
-          sb.append(query.toElasticSearch());
-          matchQueriesCount++;
-        }
-      }
-      sb.append("],");
+    /**
+     * Any one of the queries in this list must evaluate to true for the filter to pass.
+     */
+    private QueryStatement[] any;
 
 
-      sb.append("\"must_not\": [");
-      for (QueryStatement query : notMatchQueries) {
-        if (notMatchQueriesCount > 0) {
-          sb.append(", ");
-        }
-        sb.append(query.toElasticSearch());
-        notMatchQueriesCount++;
-      }
-      sb.append("]");
+    public QueryStatement[] getAll() {
+        return all;
     }
 
-    // Add the queries from our 'any' list.
-    notMatchQueries.clear();
-    if (any != null) {
-      if (all != null) {
-        sb.append(",");
-      }
-      sb.append("\"should\": [");
-
-      matchQueriesCount = 0;
-      for (QueryStatement query : any) {
-        //if(!firstQuery.compareAndSet(true, false)) {
-        if (matchQueriesCount > 0) {
-          sb.append(", ");
-        }
+    public void setAll(QueryStatement[] all) {
+        this.all = all;
+    }
+
+    public QueryStatement[] getAny() {
+        return any;
+    }
+
+    public void setAny(QueryStatement[] any) {
+        this.any = any;
+    }
 
-        if (query.isNotMatch()) {
-          notMatchQueries.add(query);
-        } else {
-          sb.append(query.toElasticSearch());
-          matchQueriesCount++;
+    /**
+     * This method returns a string which represents this filter in syntax that is understandable by ElasticSearch and
+     * is suitable for inclusion in an ElasticSearch query string.
+     *
+     * @return - ElasticSearch syntax string.
+     */
+    public String toElasticSearch() {
+
+        StringBuilder sb = new StringBuilder();
+
+        List notMatchQueries = new ArrayList();
+        sb.append("{");
+        sb.append("\"bool\": {");
+
+        // Add the queries from our 'all' list.
+        int matchQueriesCount = 0;
+        int notMatchQueriesCount = 0;
+        if (all != null) {
+            sb.append("\"must\": [");
+
+            for (QueryStatement query : all) {
+                if (matchQueriesCount > 0) {
+                    sb.append(", ");
+                }
+
+                if (query.isNotMatch()) {
+                    notMatchQueries.add(query);
+                } else {
+                    sb.append(query.toElasticSearch());
+                    matchQueriesCount++;
+                }
+            }
+            sb.append("],");
+
+
+            sb.append("\"must_not\": [");
+            for (QueryStatement query : notMatchQueries) {
+                if (notMatchQueriesCount > 0) {
+                    sb.append(", ");
+                }
+                sb.append(query.toElasticSearch());
+                notMatchQueriesCount++;
+            }
+            sb.append("]");
         }
-      }
-      sb.append("],");
-
-      //firstQuery.set(true);
-      notMatchQueriesCount = 0;
-      sb.append("\"must_not\": [");
-      for (QueryStatement query : notMatchQueries) {
-        //if(!firstQuery.compareAndSet(true, false)) {
-        if (notMatchQueriesCount > 0) {
-          sb.append(", ");
+
+        // Add the queries from our 'any' list.
+        notMatchQueries.clear();
+        if (any != null) {
+            if (all != null) {
+                sb.append(",");
+            }
+            sb.append("\"should\": [");
+
+            matchQueriesCount = 0;
+            for (QueryStatement query : any) {
+                // if(!firstQuery.compareAndSet(true, false)) {
+                if (matchQueriesCount > 0) {
+                    sb.append(", ");
+                }
+
+                if (query.isNotMatch()) {
+                    notMatchQueries.add(query);
+                } else {
+                    sb.append(query.toElasticSearch());
+                    matchQueriesCount++;
+                }
+            }
+            sb.append("],");
+
+            // firstQuery.set(true);
+            notMatchQueriesCount = 0;
+            sb.append("\"must_not\": [");
+            for (QueryStatement query : notMatchQueries) {
+                // if(!firstQuery.compareAndSet(true, false)) {
+                if (notMatchQueriesCount > 0) {
+                    sb.append(", ");
+                }
+                sb.append(query.toElasticSearch());
+                notMatchQueriesCount++;
+            }
+            sb.append("]");
         }
-        sb.append(query.toElasticSearch());
-        notMatchQueriesCount++;
-      }
-      sb.append("]");
-    }
-    sb.append("}");
-    sb.append("}");
+        sb.append("}");
+        sb.append("}");
 
-    return sb.toString();
-  }
+        return sb.toString();
+    }
 
-  @Override
-  public String toString() {
+    @Override
+    public String toString() {
 
-    StringBuilder sb = new StringBuilder();
+        StringBuilder sb = new StringBuilder();
 
-    sb.append("{");
+        sb.append("{");
 
-    sb.append("all: [");
-    if (all != null) {
-      for (QueryStatement query : all) {
-        sb.append(query.toString());
-      }
-    }
-    sb.append("], ");
+        sb.append("all: [");
+        if (all != null) {
+            for (QueryStatement query : all) {
+                sb.append(query.toString());
+            }
+        }
+        sb.append("], ");
 
-    sb.append("any: [");
-    if (any != null) {
-      for (QueryStatement query : any) {
-        sb.append(query.toString());
-      }
-    }
-    sb.append("] ");
+        sb.append("any: [");
+        if (any != null) {
+            for (QueryStatement query : any) {
+                sb.append(query.toString());
+            }
+        }
+        sb.append("] ");
 
-    sb.append("}");
+        sb.append("}");
 
-    return sb.toString();
-  }
+        return sb.toString();
+    }
 }
diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/GroupByAggregation.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/GroupByAggregation.java
index df643f2..69730d2 100644
--- a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/GroupByAggregation.java
+++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/GroupByAggregation.java
@@ -23,7 +23,9 @@ package org.onap.aai.sa.searchdbabstraction.searchapi;
 /**
  * An example of a date_range aggregation:
  *
- * 

+ * 

+ * + *

  * {
  *    "aggs": {
  *        "my_group": {
@@ -39,31 +41,30 @@ package org.onap.aai.sa.searchdbabstraction.searchapi;
  */
 public class GroupByAggregation extends AbstractAggregation {
 
-  @Override
-  public String toElasticSearch() {
-    StringBuilder sb = new StringBuilder();
+    @Override
+    public String toElasticSearch() {
+        StringBuilder sb = new StringBuilder();
 
-    sb.append("\"terms\": {\"field\": \"");
-    sb.append(field);
-    sb.append("\"");
-    if (size != null) {
-      sb.append(", \"size\": ");
-      sb.append(size);
-    }
+        sb.append("\"terms\": {\"field\": \"");
+        sb.append(field);
+        sb.append("\"");
+        if (size != null) {
+            sb.append(", \"size\": ");
+            sb.append(size);
+        }
 
-    if (minThreshold != null) {
-      sb.append(", \"min_doc_count\": ").append(minThreshold);
-    }
+        if (minThreshold != null) {
+            sb.append(", \"min_doc_count\": ").append(minThreshold);
+        }
 
-    sb.append("}");
+        sb.append("}");
 
-    return sb.toString();
-  }
+        return sb.toString();
+    }
 
-  @Override
-  public String toString() {
-    return "{group-by: {field: " + field + ", size: " + size
-        + " minThreshold: " + minThreshold + "}}";
-  }
+    @Override
+    public String toString() {
+        return "{group-by: {field: " + field + ", size: " + size + " minThreshold: " + minThreshold + "}}";
+    }
 
 }
diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/ParsedQuery.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/ParsedQuery.java
index e8e3074..19bc250 100644
--- a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/ParsedQuery.java
+++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/ParsedQuery.java
@@ -25,29 +25,34 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 /**
  * This class represents a simple parsed query statement.
  *
- * 

A 'parsed query' specifies a document field to inspect and a query - * string which will be parsed by the document store to generate the - * exact query to be performed. + *

+ * A 'parsed query' specifies a document field to inspect and a query string which will be parsed by the document store + * to generate the exact query to be performed. * - *

The query string will be tokenized into 'terms' and 'operators' where: + *

+ * The query string will be tokenized into 'terms' and 'operators' where: * - *

Terms may be any of the following: + *

+ * Terms may be any of the following: *

    - *
  • single words
  • - *
  • exact phrases (denoted by surrounding the phrase with '"' characters)
  • - *
  • regular expressions (denoted by surrounding the phrase with '/' characters)
  • + *
  • single words
  • + *
  • exact phrases (denoted by surrounding the phrase with '"' characters)
  • + *
  • regular expressions (denoted by surrounding the phrase with '/' characters)
  • *
* - *

Operators may be any of the following: + *

+ * Operators may be any of the following: *

    - *
  • + -- The term to the right of the operator MUST be present to produce a match.
  • - *
  • - -- The term to the right of the operator MUST NOT be present to produce a match.
  • - *
  • AND -- Both the terms to the left and right of the operator MUST be present to produce a match.
  • - *
  • OR -- Either the term to the left or right of the operator MUST be present to produce a match.
  • - *
  • NOT -- The term to the right of the operator MUST NOT be present to produce a match.
  • + *
  • + -- The term to the right of the operator MUST be present to produce a match.
  • + *
  • - -- The term to the right of the operator MUST NOT be present to produce a match.
  • + *
  • AND -- Both the terms to the left and right of the operator MUST be present to produce a match.
  • + *
  • OR -- Either the term to the left or right of the operator MUST be present to produce a match.
  • + *
  • NOT -- The term to the right of the operator MUST NOT be present to produce a match.
  • *
* - *

The expected JSON structure for a parsed query is as follows: + *

+ * The expected JSON structure for a parsed query is as follows: + * *

  *     {
  *         "parsed-query": {
@@ -59,58 +64,57 @@ import com.fasterxml.jackson.annotation.JsonProperty;
  */
 public class ParsedQuery {
 
-  /**
-   * The name of the field which the query is to be applied to.
-   */
-  private String field;
+    /**
+     * The name of the field which the query is to be applied to.
+     */
+    private String field;
 
-  /**
-   * The string to be parsed to generate the full query.
-   */
-  @JsonProperty("query-string")
-  private String queryString;
+    /**
+     * The string to be parsed to generate the full query.
+     */
+    @JsonProperty("query-string")
+    private String queryString;
 
 
-  public String getField() {
-    return field;
-  }
+    public String getField() {
+        return field;
+    }
 
-  public void setField(String field) {
-    this.field = field;
-  }
+    public void setField(String field) {
+        this.field = field;
+    }
 
-  public String getQueryString() {
-    return queryString;
-  }
+    public String getQueryString() {
+        return queryString;
+    }
 
-  public void setQueryString(String queryString) {
-    this.queryString = queryString;
-  }
+    public void setQueryString(String queryString) {
+        this.queryString = queryString;
+    }
 
 
-  /**
-   * This method returns a string which represents this query in syntax
-   * that is understandable by ElasticSearch and is suitable for inclusion
-   * in an ElasticSearch query string.
-   *
-   * @return - ElasticSearch syntax string.
-   */
-  public String toElasticSearch() {
+    /**
+     * This method returns a string which represents this query in syntax that is understandable by ElasticSearch and is
+     * suitable for inclusion in an ElasticSearch query string.
+     *
+     * @return - ElasticSearch syntax string.
+     */
+    public String toElasticSearch() {
 
-    StringBuilder sb = new StringBuilder();
+        StringBuilder sb = new StringBuilder();
 
-    sb.append("{");
-    sb.append("\"query_string\": {");
-    sb.append("\"default_field\": \"").append(field).append("\", ");
-    sb.append("\"query\": \"").append(queryString).append("\"");
-    sb.append("}");
-    sb.append("}");
+        sb.append("{");
+        sb.append("\"query_string\": {");
+        sb.append("\"default_field\": \"").append(field).append("\", ");
+        sb.append("\"query\": \"").append(queryString).append("\"");
+        sb.append("}");
+        sb.append("}");
 
-    return sb.toString();
-  }
+        return sb.toString();
+    }
 
-  @Override
-  public String toString() {
-    return "{field:" + field + ", query-string: '" + queryString + "'}";
-  }
+    @Override
+    public String toString() {
+        return "{field:" + field + ", query-string: '" + queryString + "'}";
+    }
 }
diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/Query.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/Query.java
index 3e4f537..ee8ffdc 100644
--- a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/Query.java
+++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/Query.java
@@ -22,69 +22,69 @@ package org.onap.aai.sa.searchdbabstraction.searchapi;
 
 public class Query {
 
-  private QueryStatement may;
-  private QueryStatement must;
+    private QueryStatement may;
+    private QueryStatement must;
 
-  public QueryStatement getMay() {
-    return may;
-  }
+    public QueryStatement getMay() {
+        return may;
+    }
 
-  public void setMay(QueryStatement may) {
-    this.may = may;
-  }
+    public void setMay(QueryStatement may) {
+        this.may = may;
+    }
 
-  public QueryStatement getMust() {
-    return must;
-  }
+    public QueryStatement getMust() {
+        return must;
+    }
 
-  public void setMust(QueryStatement must) {
-    this.must = must;
-  }
+    public void setMust(QueryStatement must) {
+        this.must = must;
+    }
 
-  public QueryStatement getQueryStatement() {
-    if (isMust()) {
-      return must;
-    } else if (isMay()) {
-      return may;
-    } else {
-      return null;
+    public QueryStatement getQueryStatement() {
+        if (isMust()) {
+            return must;
+        } else if (isMay()) {
+            return may;
+        } else {
+            return null;
+        }
     }
-  }
 
-  public boolean isMust() {
-    return must != null;
-  }
+    public boolean isMust() {
+        return must != null;
+    }
 
-  public boolean isMay() {
-    return may != null;
-  }
+    public boolean isMay() {
+        return may != null;
+    }
 
-  public String toElasticSearch() {
+    public String toElasticSearch() {
 
-    if (isMust()) {
-      return must.toElasticSearch();
-    } else if (isMay()) {
-      return may.toElasticSearch();
-    } else {
-      return ""; // throw an exception?
+        if (isMust()) {
+            return must.toElasticSearch();
+        } else if (isMay()) {
+            return may.toElasticSearch();
+        } else {
+            return ""; // throw an exception?
+        }
     }
-  }
 
-  @Override
-  public String toString() {
+    @Override
+    public String toString() {
 
-    StringBuilder sb = new StringBuilder();
+        StringBuilder sb = new StringBuilder();
 
-    sb.append("Query:[");
-    if (isMust()) {
-      sb.append("must: ").append(must.toString());
-    } else if (isMay()) {
-      sb.append("may: ").append(may.toString());
-    } else {
-      sb.append("INVALID");
-    }
-    sb.append("]");
+        sb.append("Query:[");
+        if (isMust()) {
+            sb.append("must: ").append(must.toString());
+        } else if (isMay()) {
+            sb.append("may: ").append(may.toString());
+        } else {
+            sb.append("INVALID");
+        }
+        sb.append("]");
 
-    return sb.toString();
-  }
+        return sb.toString();
+    }
 }
diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/QueryStatement.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/QueryStatement.java
index 6cfbd40..7764051 100644
--- a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/QueryStatement.java
+++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/QueryStatement.java
@@ -24,115 +24,115 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class QueryStatement {
 
-  private TermQuery match;
+    private TermQuery match;
 
-  @JsonProperty("not-match")
-  private TermQuery notMatch;
+    @JsonProperty("not-match")
+    private TermQuery notMatch;
 
-  @JsonProperty("parsed-query")
-  private ParsedQuery parsedQuery;
+    @JsonProperty("parsed-query")
+    private ParsedQuery parsedQuery;
 
-  private RangeQuery range;
+    private RangeQuery range;
 
-  public TermQuery getMatch() {
-    return match;
-  }
+    public TermQuery getMatch() {
+        return match;
+    }
 
-  public void setMatch(TermQuery match) {
-    this.match = match;
-  }
+    public void setMatch(TermQuery match) {
+        this.match = match;
+    }
 
-  public TermQuery getNotMatch() {
-    return notMatch;
-  }
+    public TermQuery getNotMatch() {
+        return notMatch;
+    }
 
-  public void setNotMatch(TermQuery notMatch) {
-    this.notMatch = notMatch;
-  }
+    public void setNotMatch(TermQuery notMatch) {
+        this.notMatch = notMatch;
+    }
 
-  public ParsedQuery getParsedQuery() {
-    return parsedQuery;
-  }
+    public ParsedQuery getParsedQuery() {
+        return parsedQuery;
+    }
 
-  public void setParsedQuery(ParsedQuery parsedQuery) {
-    this.parsedQuery = parsedQuery;
-  }
+    public void setParsedQuery(ParsedQuery parsedQuery) {
+        this.parsedQuery = parsedQuery;
+    }
 
-  public RangeQuery getRange() {
-    return range;
-  }
+    public RangeQuery getRange() {
+        return range;
+    }
 
-  public void setRange(RangeQuery range) {
-    this.range = range;
-  }
+    public void setRange(RangeQuery range) {
+        this.range = range;
+    }
 
-  public boolean isNotMatch() {
-    return (notMatch != null);
-  }
+    public boolean isNotMatch() {
+        return (notMatch != null);
+    }
 
-  public String toElasticSearch() {
+    public String toElasticSearch() {
 
-    if (match != null) {
-      return match.toElasticSearch();
+        if (match != null) {
+            return match.toElasticSearch();
 
-    } else if (notMatch != null) {
-      return notMatch.toElasticSearch();
+        } else if (notMatch != null) {
+            return notMatch.toElasticSearch();
 
-    } else if (parsedQuery != null) {
+        } else if (parsedQuery != null) {
 
-      // We need some special wrapping if this query is against a nested field.
-      if (fieldIsNested(parsedQuery.getField())) {
-        return "{\"nested\": { \"path\": \"" + pathForNestedField(parsedQuery.getField())
-            + "\", \"query\": " + parsedQuery.toElasticSearch() + "}}";
-      } else {
-        return parsedQuery.toElasticSearch();
-      }
+            // We need some special wrapping if this query is against a nested field.
+            if (fieldIsNested(parsedQuery.getField())) {
+                return "{\"nested\": { \"path\": \"" + pathForNestedField(parsedQuery.getField()) + "\", \"query\": "
+                        + parsedQuery.toElasticSearch() + "}}";
+            } else {
+                return parsedQuery.toElasticSearch();
+            }
 
-    } else if (range != null) {
+        } else if (range != null) {
 
-      // We need some special wrapping if this query is against a nested field.
-      if (fieldIsNested(range.getField())) {
-        return "{\"nested\": { \"path\": \"" + pathForNestedField(range.getField())
-            + "\", \"query\": " + range.toElasticSearch() + "}}";
-      } else {
-        return range.toElasticSearch();
-      }
+            // We need some special wrapping if this query is against a nested field.
+            if (fieldIsNested(range.getField())) {
+                return "{\"nested\": { \"path\": \"" + pathForNestedField(range.getField()) + "\", \"query\": "
+                        + range.toElasticSearch() + "}}";
+            } else {
+                return range.toElasticSearch();
+            }
 
-    } else {
-      // throw an exception?
-      return null;
+        } else {
+            // throw an exception?
+            return null;
+        }
     }
-  }
-
-  private boolean fieldIsNested(String field) {
-    return field.contains(".");
-  }
-
-  private String pathForNestedField(String field) {
-    int index = field.lastIndexOf('.');
-    return field.substring(0, index);
-  }
-
-  @Override
-  public String toString() {
-
-    StringBuilder sb = new StringBuilder();
-
-    sb.append("{");
-
-    if (match != null) {
-      sb.append("TERM QUERY: { match: {").append(match.toString()).append("}}");
-    } else if (notMatch != null) {
-      sb.append("TERM QUERY: { not-match: {").append(match.toString()).append("}}");
-    } else if (parsedQuery != null) {
-      sb.append("PARSED QUERY: { ").append(parsedQuery.toString()).append("}");
-    } else if (range != null) {
-      sb.append("RANGE QUERY: { ").append(range.toString()).append("}");
-    } else {
-      sb.append("UNDEFINED");
+
+    private boolean fieldIsNested(String field) {
+        return field.contains(".");
+    }
+
+    private String pathForNestedField(String field) {
+        int index = field.lastIndexOf('.');
+        return field.substring(0, index);
     }
 
-    sb.append("}");
-    return sb.toString();
-  }
+    @Override
+    public String toString() {
+
+        StringBuilder sb = new StringBuilder();
+
+        sb.append("{");
+
+        if (match != null) {
+            sb.append("TERM QUERY: { match: {").append(match.toString()).append("}}");
+        } else if (notMatch != null) {
+            sb.append("TERM QUERY: { not-match: {").append(match.toString()).append("}}");
+        } else if (parsedQuery != null) {
+            sb.append("PARSED QUERY: { ").append(parsedQuery.toString()).append("}");
+        } else if (range != null) {
+            sb.append("RANGE QUERY: { ").append(range.toString()).append("}");
+        } else {
+            sb.append("UNDEFINED");
+        }
+
+        sb.append("}");
+        return sb.toString();
+    }
 }
diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/RangeQuery.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/RangeQuery.java
index c5b4886..60cc9e6 100644
--- a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/RangeQuery.java
+++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/RangeQuery.java
@@ -25,22 +25,26 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 /**
  * This class represents a simple range query.
  *
- * 

A range query is composed of one or more operator/value pairs which define - * the upper and lower bounds of the range, and a field to apply the query to. + *

+ * A range query is composed of one or more operator/value pairs which define the upper and lower bounds of the range, + * and a field to apply the query to. * - *

Operators may be one of the following: + *

+ * Operators may be one of the following: *

    - *
  • gt - Greater than.
  • - *
  • gte - Greater than or equal to.
  • - *
  • lt - Less than.
  • - *
  • lte - Less than or equal to.
  • + *
  • gt - Greater than.
  • + *
  • gte - Greater than or equal to.
  • + *
  • lt - Less than.
  • + *
  • lte - Less than or equal to.
  • *
- * Values may be either numeric values (Integer or Double) or Strings representing - * dates. + * Values may be either numeric values (Integer or Double) or Strings representing dates. * - *

The following examples illustrate a couple of variants of the range query: + *

+ * The following examples illustrate a couple of variants of the range query: * - *

+ * 

+ * + *

  *     // A simple numeric range query:
  *     {
  *         "range": {
@@ -62,283 +66,271 @@ import com.fasterxml.jackson.annotation.JsonProperty;
  */
 public class RangeQuery {
 
-  /**
-   * The name of the field to apply the range query against.
-   */
-  private String field;
-
-  /**
-   * The value of the field must be greater than this value to be a match.
- * NOTE: Only one of 'gt' or 'gte' should be set on any single {@link RangeQuery} - * instance. - */ - private Object gt; - - /** - * The value of the field must be greater than or equal to this value to be a match.
- * NOTE: Only one of 'gt' or 'gte' should be set on any single {@link RangeQuery} - * instance. - */ - private Object gte; - - /** - * The value of the field must be less than this value to be a match.
- * NOTE: Only one of 'lt' or 'lte' should be set on any single {@link RangeQuery} - * instance. - */ - private Object lt; - - /** - * The value of the field must be less than or equal to than this value to be a match.
- * NOTE: Only one of 'lt' or 'lte' should be set on any single {@link RangeQuery} - * instance. - */ - private Object lte; - - private String format; - - @JsonProperty("time-zone") - private String timeZone; - - public String getField() { - return field; - } - - public void setField(String field) { - this.field = field; - } - - public Object getGt() { - return gt; - } - - public void setGt(Object gt) { - - // It does not make sense to assign a value to both the 'greater than' - // and 'greater than or equal' operations, so make sure we are not - // trying to do that. - if (gte == null) { - - // Make sure that we are not trying to mix both numeric and date - // type values in the same queries. - if (((lt != null) && !typesMatch(gt, lt)) - || ((lte != null) && !typesMatch(gt, lte))) { - throw new IllegalArgumentException("Cannot mix date and numeric values in the same ranged query"); - } - - // If we made it here, then we're all good. Store the value. - this.gt = gt; - } else { - throw new IllegalArgumentException("Cannot assign both 'gt' and 'gte' fields in the same ranged query"); + /** + * The name of the field to apply the range query against. + */ + private String field; + + /** + * The value of the field must be greater than this value to be a match.
+ * NOTE: Only one of 'gt' or 'gte' should be set on any single {@link RangeQuery} instance. + */ + private Object gt; + + /** + * The value of the field must be greater than or equal to this value to be a match.
+ * NOTE: Only one of 'gt' or 'gte' should be set on any single {@link RangeQuery} instance. + */ + private Object gte; + + /** + * The value of the field must be less than this value to be a match.
+ * NOTE: Only one of 'lt' or 'lte' should be set on any single {@link RangeQuery} instance. + */ + private Object lt; + + /** + * The value of the field must be less than or equal to than this value to be a match.
+ * NOTE: Only one of 'lt' or 'lte' should be set on any single {@link RangeQuery} instance. + */ + private Object lte; + + private String format; + + @JsonProperty("time-zone") + private String timeZone; + + public String getField() { + return field; } - } + public void setField(String field) { + this.field = field; + } - public Object getGte() { - return gte; - } - - public void setGte(Object gte) { + public Object getGt() { + return gt; + } - // It does not make sense to assign a value to both the 'greater than' - // and 'greater than or equal' operations, so make sure we are not - // trying to do that. - if (gt == null) { + public void setGt(Object gt) { - // Make sure that we are not trying to mix both numeric and date - // type values in the same queries. - if (((lt != null) && !typesMatch(gte, lt)) - || ((lte != null) && !typesMatch(gte, lte))) { - throw new IllegalArgumentException("Cannot mix date and numeric values in the same ranged query"); - } + // It does not make sense to assign a value to both the 'greater than' + // and 'greater than or equal' operations, so make sure we are not + // trying to do that. + if (gte == null) { - // If we made it here, then we're all good. Store the value. - this.gte = gte; + // Make sure that we are not trying to mix both numeric and date + // type values in the same queries. + if (((lt != null) && !typesMatch(gt, lt)) || ((lte != null) && !typesMatch(gt, lte))) { + throw new IllegalArgumentException("Cannot mix date and numeric values in the same ranged query"); + } - } else { - throw new IllegalArgumentException("Cannot assign both 'gt' and 'gte' fields in the same ranged query"); + // If we made it here, then we're all good. Store the value. + this.gt = gt; + } else { + throw new IllegalArgumentException("Cannot assign both 'gt' and 'gte' fields in the same ranged query"); + } } - } - public Object getLt() { - return lt; - } - public void setLt(Object lt) { + public Object getGte() { + return gte; + } + + public void setGte(Object gte) { - // It does not make sense to assign a value to both the 'less than' - // and 'less than or equal' operations, so make sure we are not - // trying to do that. - if (lte == null) { + // It does not make sense to assign a value to both the 'greater than' + // and 'greater than or equal' operations, so make sure we are not + // trying to do that. + if (gt == null) { - // Make sure that we are not trying to mix both numeric and date - // type values in the same queries. - if (((gt != null) && !typesMatch(lt, gt)) - || ((gte != null) && !typesMatch(lt, gte))) { - throw new IllegalArgumentException("Cannot mix date and numeric values in the same ranged query"); - } + // Make sure that we are not trying to mix both numeric and date + // type values in the same queries. + if (((lt != null) && !typesMatch(gte, lt)) || ((lte != null) && !typesMatch(gte, lte))) { + throw new IllegalArgumentException("Cannot mix date and numeric values in the same ranged query"); + } - // If we made it here, then we're all good. Store the value. + // If we made it here, then we're all good. Store the value. + this.gte = gte; - this.lt = lt; - } else { - throw new IllegalArgumentException("Cannot assign both 'lt' and 'lte' fields in the same ranged query"); + } else { + throw new IllegalArgumentException("Cannot assign both 'gt' and 'gte' fields in the same ranged query"); + } } - } - public Object getLte() { - return lte; - } + public Object getLt() { + return lt; + } - public void setLte(Object lte) { + public void setLt(Object lt) { - // It does not make sense to assign a value to both the 'greater than' - // and 'greater than or equal' operations, so make sure we are not - // trying to do that. - if (lt == null) { + // It does not make sense to assign a value to both the 'less than' + // and 'less than or equal' operations, so make sure we are not + // trying to do that. + if (lte == null) { - // Make sure that we are not trying to mix both numeric and date - // type values in the same queries. - if (((gt != null) && !typesMatch(lte, gt)) - || ((gte != null) && !typesMatch(lte, gte))) { - throw new IllegalArgumentException("Cannot mix date and numeric values in the same ranged query"); - } + // Make sure that we are not trying to mix both numeric and date + // type values in the same queries. + if (((gt != null) && !typesMatch(lt, gt)) || ((gte != null) && !typesMatch(lt, gte))) { + throw new IllegalArgumentException("Cannot mix date and numeric values in the same ranged query"); + } - // If we made it here, then we're all good. Store the value. + // If we made it here, then we're all good. Store the value. - this.lte = lte; - } else { - throw new IllegalArgumentException("Cannot assign both 'lt' and 'lte' fields in the same ranged query"); + this.lt = lt; + } else { + throw new IllegalArgumentException("Cannot assign both 'lt' and 'lte' fields in the same ranged query"); + } } - } - - public String getFormat() { - return format; - } - - public void setFormat(String format) { - this.format = format; - } - - public String getTimeZone() { - return timeZone; - } - - public void setTimeZone(String timeZone) { - this.timeZone = timeZone; - } - - /** - * This convenience method determines whether or not the supplied - * value needs to be enclosed in '"' characters when generating - * ElasticSearch compatible syntax. - * - * @param val - The value to check. - * @return - A string representation of the value for inclusion - * in an ElasticSearch syntax string. - */ - private String formatStringOrNumericVal(Object val) { - - if (val instanceof String) { - return "\"" + val.toString() + "\""; - } else { - return val.toString(); + + public Object getLte() { + return lte; } - } - - - /** - * This convenience method verifies that the supplied objects are - * of classes considered to be compatible for a ranged query. - * - * @param value1 - The first value to check. - * @param value2 - The second value to check. - * @return - True if the two objects are compatible for inclusion in the - * same ranged query, False, otherwise. - */ - boolean typesMatch(Object value1, Object value2) { - - return ((value1 instanceof String) && (value2 instanceof String)) - || (!(value1 instanceof String) && !(value2 instanceof String)); - } - - - /** - * This method returns a string which represents this query in syntax - * that is understandable by ElasticSearch and is suitable for inclusion - * in an ElasticSearch query string. - * - * @return - ElasticSearch syntax string. - */ - public String toElasticSearch() { - - StringBuilder sb = new StringBuilder(); - - sb.append("{"); - sb.append("\"range\": {"); - sb.append("\"").append(field).append("\": {"); - - // We may have one or zero of 'greater than' or 'greater - // than or equal' - boolean needComma = false; - if (gte != null) { - sb.append("\"gte\": ").append(formatStringOrNumericVal(gte)); - needComma = true; - } else if (gt != null) { - sb.append("\"gt\": ").append(formatStringOrNumericVal(gt)); - needComma = true; + + public void setLte(Object lte) { + + // It does not make sense to assign a value to both the 'greater than' + // and 'greater than or equal' operations, so make sure we are not + // trying to do that. + if (lt == null) { + + // Make sure that we are not trying to mix both numeric and date + // type values in the same queries. + if (((gt != null) && !typesMatch(lte, gt)) || ((gte != null) && !typesMatch(lte, gte))) { + throw new IllegalArgumentException("Cannot mix date and numeric values in the same ranged query"); + } + + // If we made it here, then we're all good. Store the value. + + this.lte = lte; + } else { + throw new IllegalArgumentException("Cannot assign both 'lt' and 'lte' fields in the same ranged query"); + } } - // We may have one or zero of 'less than' or 'less - // than or equal' - if (lte != null) { - if (needComma) { - sb.append(", "); - } - sb.append("\"lte\": ").append(formatStringOrNumericVal(lte)); - } else if (lt != null) { - if (needComma) { - sb.append(", "); - } - sb.append("\"lt\": ").append(formatStringOrNumericVal(lt)); + public String getFormat() { + return format; } - // Append the format specifier if one was provided. - if (format != null) { - sb.append(", \"format\": \"").append(format).append("\""); + public void setFormat(String format) { + this.format = format; } - // Append the time zone specifier if one was provided. - if (timeZone != null) { - sb.append(", \"time_zone\": \"").append(timeZone).append("\""); + public String getTimeZone() { + return timeZone; } - sb.append("}"); - sb.append("}"); - sb.append("}"); + public void setTimeZone(String timeZone) { + this.timeZone = timeZone; + } - return sb.toString(); - } + /** + * This convenience method determines whether or not the supplied value needs to be enclosed in '"' characters when + * generating ElasticSearch compatible syntax. + * + * @param val - The value to check. + * @return - A string representation of the value for inclusion in an ElasticSearch syntax string. + */ + private String formatStringOrNumericVal(Object val) { + + if (val instanceof String) { + return "\"" + val.toString() + "\""; + } else { + return val.toString(); + } + } - @Override - public String toString() { - String str = "{ field: " + field + ", "; + /** + * This convenience method verifies that the supplied objects are of classes considered to be compatible for a + * ranged query. + * + * @param value1 - The first value to check. + * @param value2 - The second value to check. + * @return - True if the two objects are compatible for inclusion in the same ranged query, False, otherwise. + */ + boolean typesMatch(Object value1, Object value2) { - if (gt != null) { - str += "gt: " + gt; - } else if (gte != null) { - str += "gte: " + gte; + return ((value1 instanceof String) && (value2 instanceof String)) + || (!(value1 instanceof String) && !(value2 instanceof String)); } - if (lt != null) { - str += (((gt != null) || (gte != null)) ? ", " : "") + "lt: " + lt; - } else if (lte != null) { - str += (((gt != null) || (gte != null)) ? ", " : "") + "lte: " + lte; + + /** + * This method returns a string which represents this query in syntax that is understandable by ElasticSearch and is + * suitable for inclusion in an ElasticSearch query string. + * + * @return - ElasticSearch syntax string. + */ + public String toElasticSearch() { + + StringBuilder sb = new StringBuilder(); + + sb.append("{"); + sb.append("\"range\": {"); + sb.append("\"").append(field).append("\": {"); + + // We may have one or zero of 'greater than' or 'greater + // than or equal' + boolean needComma = false; + if (gte != null) { + sb.append("\"gte\": ").append(formatStringOrNumericVal(gte)); + needComma = true; + } else if (gt != null) { + sb.append("\"gt\": ").append(formatStringOrNumericVal(gt)); + needComma = true; + } + + // We may have one or zero of 'less than' or 'less + // than or equal' + if (lte != null) { + if (needComma) { + sb.append(", "); + } + sb.append("\"lte\": ").append(formatStringOrNumericVal(lte)); + } else if (lt != null) { + if (needComma) { + sb.append(", "); + } + sb.append("\"lt\": ").append(formatStringOrNumericVal(lt)); + } + + // Append the format specifier if one was provided. + if (format != null) { + sb.append(", \"format\": \"").append(format).append("\""); + } + + // Append the time zone specifier if one was provided. + if (timeZone != null) { + sb.append(", \"time_zone\": \"").append(timeZone).append("\""); + } + + sb.append("}"); + sb.append("}"); + sb.append("}"); + + return sb.toString(); } - str += "}"; + @Override + public String toString() { - return str; - } + String str = "{ field: " + field + ", "; + + if (gt != null) { + str += "gt: " + gt; + } else if (gte != null) { + str += "gte: " + gte; + } + + if (lt != null) { + str += (((gt != null) || (gte != null)) ? ", " : "") + "lt: " + lt; + } else if (lte != null) { + str += (((gt != null) || (gte != null)) ? ", " : "") + "lte: " + lte; + } + + str += "}"; + + return str; + } } diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/SearchStatement.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/SearchStatement.java index f008a7c..9f37856 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/SearchStatement.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/SearchStatement.java @@ -29,9 +29,12 @@ import org.radeox.util.logging.Logger; /** * This class represents the structure of a search statement. * - *

The expected JSON structure to represent a search statement is as follows: + *

+ * The expected JSON structure to represent a search statement is as follows: * - *

+ * 

+ * + *

  *     {
  *         "results-start": int,  - Optional: index of starting point in result set.
  *         "results-size": int,   - Optional: maximum number of documents to include in result set.
@@ -60,261 +63,258 @@ import org.radeox.util.logging.Logger;
  */
 public class SearchStatement {
 
-  /**
-   * Defines the filters that should be applied before running the
-   * actual queries.  This is optional.
-   */
-  private Filter filter;
+    /**
+     * Defines the filters that should be applied before running the actual queries. This is optional.
+     */
+    private Filter filter;
 
-  /**
-   * The list of queries to be applied to the document store.
-   */
-  private Query[] queries;
-
-  /**
-   * The list of aggregations to be applied to the search
-   */
-  private Aggregation[] aggregations;
-
-  /**
-   * Defines the sort criteria to apply to the query result set.
-   * This is optional.
-   */
-  private Sort sort;
-
-  @JsonProperty("results-start")
-  private Integer resultsStart;
-
-  @JsonProperty("results-size")
-  private Integer size;
-
-  public Filter getFilter() {
-    return filter;
-  }
-
-  public void setFilter(Filter filter) {
-    this.filter = filter;
-  }
-
-  public Query[] getQueries() {
-    return queries;
-  }
-
-  public void setQueries(Query[] queries) {
-    this.queries = queries;
-  }
-
-  public Sort getSort() {
-    return sort;
-  }
-
-  public void setSort(Sort sort) {
-    this.sort = sort;
-  }
-
-  public boolean isFiltered() {
-    return filter != null;
-  }
-
-  public Aggregation[] getAggregations() {
-    return aggregations;
-  }
-
-  public void setAggregations(Aggregation[] aggregations) {
-    this.aggregations = aggregations;
-  }
-
-  public boolean hasAggregations() {
-    return aggregations != null && aggregations.length > 0;
-  }
-
-  public Integer getFrom() {
-    return resultsStart;
-  }
-
-  public void setFrom(Integer from) {
-    this.resultsStart = from;
-  }
-
-  public Integer getSize() {
-    return size;
-  }
-
-  public void setSize(Integer size) {
-    this.size = size;
-  }
-
-  /**
-   * This method returns a string which represents this statement in syntax
-   * that is understandable by ElasticSearch and is suitable for inclusion
-   * in an ElasticSearch query string.
-   *
-   * @return - ElasticSearch syntax string.
-   */
-  public String toElasticSearch() {
-
-    StringBuilder sb = new StringBuilder();
-    List notMatchQueries = new ArrayList();
-    List mustQueries = new ArrayList();
-    List shouldQueries = new ArrayList();
-
-    createQueryLists(queries, mustQueries, shouldQueries, notMatchQueries);
-
-    sb.append("{");
-
-    sb.append("\"version\": true,");
-
-    // If the client has specified an index into the results for the first
-    // document in the result set then include that in the ElasticSearch
-    // query.
-    if (resultsStart != null) {
-      sb.append("\"from\": ").append(resultsStart).append(", ");
-    }
+    /**
+     * The list of queries to be applied to the document store.
+     */
+    private Query[] queries;
+
+    /**
+     * The list of aggregations to be applied to the search
+     */
+    private Aggregation[] aggregations;
+
+    /**
+     * Defines the sort criteria to apply to the query result set. This is optional.
+     */
+    private Sort sort;
 
-    // If the client has specified a maximum number of documents to be returned
-    // in the result set then include that in the ElasticSearch query.
-    if (size != null) {
-      sb.append("\"size\": ").append(size).append(", ");
+    @JsonProperty("results-start")
+    private Integer resultsStart;
+
+    @JsonProperty("results-size")
+    private Integer size;
+
+    public Filter getFilter() {
+        return filter;
     }
 
-    sb.append("\"query\": {");
-    sb.append("\"bool\": {");
+    public void setFilter(Filter filter) {
+        this.filter = filter;
+    }
 
-    sb.append("\"must\": [");
-    AtomicBoolean firstQuery = new AtomicBoolean(true);
-    for (QueryStatement query : mustQueries) {
+    public Query[] getQueries() {
+        return queries;
+    }
 
-      if (!firstQuery.compareAndSet(true, false)) {
-        sb.append(", ");
-      }
+    public void setQueries(Query[] queries) {
+        this.queries = queries;
+    }
 
-      sb.append(query.toElasticSearch());
+    public Sort getSort() {
+        return sort;
     }
-    sb.append("], ");
 
-    sb.append("\"should\": [");
+    public void setSort(Sort sort) {
+        this.sort = sort;
+    }
 
-    firstQuery = new AtomicBoolean(true);
-    for (QueryStatement query : shouldQueries) {
+    public boolean isFiltered() {
+        return filter != null;
+    }
 
-      if (!firstQuery.compareAndSet(true, false)) {
-        sb.append(", ");
-      }
+    public Aggregation[] getAggregations() {
+        return aggregations;
+    }
 
-      sb.append(query.toElasticSearch());
+    public void setAggregations(Aggregation[] aggregations) {
+        this.aggregations = aggregations;
     }
 
-    sb.append("],"); // close should list
+    public boolean hasAggregations() {
+        return aggregations != null && aggregations.length > 0;
+    }
 
-    sb.append("\"must_not\": [");
-    firstQuery.set(true);
-    for (QueryStatement query : notMatchQueries) {
-      sb.append(query.toElasticSearch());
+    public Integer getFrom() {
+        return resultsStart;
     }
-    sb.append("]");
 
-    // Add the filter stanza, if one is required.
-    if (isFiltered()) {
-      sb.append(", \"filter\": ").append(filter.toElasticSearch());
+    public void setFrom(Integer from) {
+        this.resultsStart = from;
     }
 
-    sb.append("}"); // close bool clause
-    sb.append("}"); // close query clause
+    public Integer getSize() {
+        return size;
+    }
 
-    // Add the sort directive, if one is required.
-    if (sort != null) {
-      sb.append(", \"sort\": ").append(sort.toElasticSearch());
+    public void setSize(Integer size) {
+        this.size = size;
     }
 
-    // Add aggregations
-    if (hasAggregations()) {
-      sb.append(", \"aggs\": {");
+    /**
+     * This method returns a string which represents this statement in syntax that is understandable by ElasticSearch
+     * and is suitable for inclusion in an ElasticSearch query string.
+     *
+     * @return - ElasticSearch syntax string.
+     */
+    public String toElasticSearch() {
+
+        StringBuilder sb = new StringBuilder();
+        List notMatchQueries = new ArrayList();
+        List mustQueries = new ArrayList();
+        List shouldQueries = new ArrayList();
+
+        createQueryLists(queries, mustQueries, shouldQueries, notMatchQueries);
 
-      for (int i = 0; i < aggregations.length; i++) {
-        if (i > 0) {
-          sb.append(",");
+        sb.append("{");
+
+        sb.append("\"version\": true,");
+
+        // If the client has specified an index into the results for the first
+        // document in the result set then include that in the ElasticSearch
+        // query.
+        if (resultsStart != null) {
+            sb.append("\"from\": ").append(resultsStart).append(", ");
         }
-        sb.append(aggregations[i].toElasticSearch());
-      }
 
-      sb.append("}");
-    }
+        // If the client has specified a maximum number of documents to be returned
+        // in the result set then include that in the ElasticSearch query.
+        if (size != null) {
+            sb.append("\"size\": ").append(size).append(", ");
+        }
+
+        sb.append("\"query\": {");
+        sb.append("\"bool\": {");
+
+        sb.append("\"must\": [");
+        AtomicBoolean firstQuery = new AtomicBoolean(true);
+        for (QueryStatement query : mustQueries) {
+
+            if (!firstQuery.compareAndSet(true, false)) {
+                sb.append(", ");
+            }
+
+            sb.append(query.toElasticSearch());
+        }
+        sb.append("], ");
 
-    sb.append("}");
+        sb.append("\"should\": [");
 
-    Logger.debug("Generated raw ElasticSearch query statement: " + sb.toString());
-    return sb.toString();
-  }
+        firstQuery = new AtomicBoolean(true);
+        for (QueryStatement query : shouldQueries) {
 
-  private void createQueryLists(Query[] queries, List mustList,
-                                List mayList, List mustNotList) {
+            if (!firstQuery.compareAndSet(true, false)) {
+                sb.append(", ");
+            }
 
-    for (Query query : queries) {
+            sb.append(query.toElasticSearch());
+        }
 
-      if (query.isMust()) {
+        sb.append("],"); // close should list
 
-        if (query.getQueryStatement().isNotMatch()) {
-          mustNotList.add(query.getQueryStatement());
-        } else {
-          mustList.add(query.getQueryStatement());
+        sb.append("\"must_not\": [");
+        firstQuery.set(true);
+        for (QueryStatement query : notMatchQueries) {
+            sb.append(query.toElasticSearch());
         }
-      } else {
+        sb.append("]");
 
-        if (query.getQueryStatement().isNotMatch()) {
-          mustNotList.add(query.getQueryStatement());
-        } else {
-          mayList.add(query.getQueryStatement());
+        // Add the filter stanza, if one is required.
+        if (isFiltered()) {
+            sb.append(", \"filter\": ").append(filter.toElasticSearch());
         }
-      }
-    }
-  }
 
+        sb.append("}"); // close bool clause
+        sb.append("}"); // close query clause
 
-  @Override
-  public String toString() {
+        // Add the sort directive, if one is required.
+        if (sort != null) {
+            sb.append(", \"sort\": ").append(sort.toElasticSearch());
+        }
 
-    StringBuilder sb = new StringBuilder();
+        // Add aggregations
+        if (hasAggregations()) {
+            sb.append(", \"aggs\": {");
 
-    sb.append("SEARCH STATEMENT: {");
+            for (int i = 0; i < aggregations.length; i++) {
+                if (i > 0) {
+                    sb.append(",");
+                }
+                sb.append(aggregations[i].toElasticSearch());
+            }
 
-    if (size != null) {
-      sb.append("from: ").append(resultsStart).append(", size: ").append(size).append(", ");
-    }
+            sb.append("}");
+        }
 
-    if (filter != null) {
-      sb.append("filter: ").append(filter.toString()).append(", ");
+        sb.append("}");
+
+        Logger.debug("Generated raw ElasticSearch query statement: " + sb.toString());
+        return sb.toString();
     }
 
-    sb.append("queries: [");
-    AtomicBoolean firstQuery = new AtomicBoolean(true);
-    if (queries != null) {
-      for (Query query : queries) {
+    private void createQueryLists(Query[] queries, List mustList, List mayList,
+            List mustNotList) {
+
+        for (Query query : queries) {
+
+            if (query.isMust()) {
 
-        if (!firstQuery.compareAndSet(true, false)) {
-          sb.append(", ");
+                if (query.getQueryStatement().isNotMatch()) {
+                    mustNotList.add(query.getQueryStatement());
+                } else {
+                    mustList.add(query.getQueryStatement());
+                }
+            } else {
+
+                if (query.getQueryStatement().isNotMatch()) {
+                    mustNotList.add(query.getQueryStatement());
+                } else {
+                    mayList.add(query.getQueryStatement());
+                }
+            }
         }
-        sb.append(query.toString());
-      }
     }
-    sb.append("]");
 
-    sb.append("aggregations: [");
-    firstQuery = new AtomicBoolean(true);
 
-    if (aggregations != null) {
-      for (Aggregation agg : aggregations) {
+    @Override
+    public String toString() {
+
+        StringBuilder sb = new StringBuilder();
+
+        sb.append("SEARCH STATEMENT: {");
 
-        if (!firstQuery.compareAndSet(true, false)) {
-          sb.append(", ");
+        if (size != null) {
+            sb.append("from: ").append(resultsStart).append(", size: ").append(size).append(", ");
         }
-        sb.append(agg.toString());
-      }
-    }
-    sb.append("]");
 
-    sb.append("]}");
+        if (filter != null) {
+            sb.append("filter: ").append(filter.toString()).append(", ");
+        }
+
+        sb.append("queries: [");
+        AtomicBoolean firstQuery = new AtomicBoolean(true);
+        if (queries != null) {
+            for (Query query : queries) {
+
+                if (!firstQuery.compareAndSet(true, false)) {
+                    sb.append(", ");
+                }
+                sb.append(query.toString());
+            }
+        }
+        sb.append("]");
+
+        sb.append("aggregations: [");
+        firstQuery = new AtomicBoolean(true);
 
-    return sb.toString();
-  }
+        if (aggregations != null) {
+            for (Aggregation agg : aggregations) {
+
+                if (!firstQuery.compareAndSet(true, false)) {
+                    sb.append(", ");
+                }
+                sb.append(agg.toString());
+            }
+        }
+        sb.append("]");
+
+        sb.append("]}");
+
+        return sb.toString();
+    }
 
 }
diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/Sort.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/Sort.java
index 641ac55..104c4b0 100644
--- a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/Sort.java
+++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/Sort.java
@@ -22,51 +22,51 @@ package org.onap.aai.sa.searchdbabstraction.searchapi;
 
 public class Sort {
 
-  private String field;
-  private SortDirection order = null;
+    private String field;
+    private SortDirection order = null;
 
-  public enum SortDirection {
-    ascending,
-    descending
-  }
+    public enum SortDirection {
+        ascending,
+        descending
+    }
 
-  public String getField() {
-    return field;
-  }
+    public String getField() {
+        return field;
+    }
 
-  public void setField(String field) {
-    this.field = field;
-  }
+    public void setField(String field) {
+        this.field = field;
+    }
 
-  public SortDirection getOrder() {
-    return order;
-  }
+    public SortDirection getOrder() {
+        return order;
+    }
 
-  public void setOrder(SortDirection order) {
-    this.order = order;
-  }
+    public void setOrder(SortDirection order) {
+        this.order = order;
+    }
 
-  public String toElasticSearch() {
+    public String toElasticSearch() {
 
-    StringBuilder sb = new StringBuilder();
+        StringBuilder sb = new StringBuilder();
 
-    sb.append("{ \"").append(field).append("\": { \"order\": ");
+        sb.append("{ \"").append(field).append("\": { \"order\": ");
 
-    // If a sort order wasn't explicitly supplied, default to 'ascending'.
-    if (order != null) {
-      switch (order) {
-        case ascending:
-          sb.append("\"asc\"}}");
-          break;
-        case descending:
-          sb.append("\"desc\"}}");
-          break;
-        default:
-      }
-    } else {
-      sb.append("\"asc\"}}");
-    }
+        // If a sort order wasn't explicitly supplied, default to 'ascending'.
+        if (order != null) {
+            switch (order) {
+                case ascending:
+                    sb.append("\"asc\"}}");
+                    break;
+                case descending:
+                    sb.append("\"desc\"}}");
+                    break;
+                default:
+            }
+        } else {
+            sb.append("\"asc\"}}");
+        }
 
-    return sb.toString();
-  }
+        return sb.toString();
+    }
 }
diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/SuggestionStatement.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/SuggestionStatement.java
index 1bc93b6..2002748 100644
--- a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/SuggestionStatement.java
+++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/SuggestionStatement.java
@@ -67,8 +67,8 @@ public class SuggestionStatement {
     }
 
     /**
-     * This method returns a string which represents this statement in syntax that is understandable
-     * by ElasticSearch and is suitable for inclusion in an ElasticSearch query string.
+     * This method returns a string which represents this statement in syntax that is understandable by ElasticSearch
+     * and is suitable for inclusion in an ElasticSearch query string.
      *
      * @return - ElasticSearch syntax string.
      */
diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/TermQuery.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/TermQuery.java
index 08bd501..b8afa7e 100644
--- a/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/TermQuery.java
+++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/TermQuery.java
@@ -28,18 +28,20 @@ import java.util.concurrent.atomic.AtomicBoolean;
 /**
  * This class represents a simple term query.
  *
- * 

A term query takes an operator, a field to apply the query to and a value to match - * against the query contents. + *

+ * A term query takes an operator, a field to apply the query to and a value to match against the query contents. * - *

Valid operators include: + *

+ * Valid operators include: *

    - *
  • match - Field must contain the supplied value to produce a match.
  • - *
  • not-match - Field must NOT contain the supplied value to produce a match.
  • + *
  • match - Field must contain the supplied value to produce a match.
  • + *
  • not-match - Field must NOT contain the supplied value to produce a match.
  • *
- * The following examples illustrate the structure of a few variants of the - * term query: + * The following examples illustrate the structure of a few variants of the term query: * - *

+ * 

+ * + *

  *     // Single Field Match Query:
  *     {
  *         "match": {"field": "searchTags", "value": "abcd"}
@@ -51,7 +53,9 @@ import java.util.concurrent.atomic.AtomicBoolean;
  *     }
  * 
* - *

+ * 

+ * + *

  *     // Multi Field Match Query With A Single Value:
  *     {
  *         "match": {"field": "entityType searchTags", "value": "pserver"}
@@ -65,280 +69,274 @@ import java.util.concurrent.atomic.AtomicBoolean;
  */
 public class TermQuery {
 
-  /**
-   * The name of the field to apply the term query to.
-   */
-  private String field;
+    /**
+     * The name of the field to apply the term query to.
+     */
+    private String field;
+
+    /**
+     * The value which the field must contain in order to have a match.
+     */
+    private Object value;
+
+    /**
+     * For multi field queries only. Determines the rules for whether or not a document matches the query, as follows:
+     *
+     * 

+ * "and" - At least one occurrence of every supplied value must be present in any of the supplied fields. + * + *

+ * "or" - At least one occurrence of any of the supplied values must be present in any of the supplied fields. + */ + private String operator; + + @JsonProperty("analyzer") + private String searchAnalyzer; + + + public String getField() { + return field; + } + + public void setField(String field) { + this.field = field; + } - /** - * The value which the field must contain in order to have a match. - */ - private Object value; - - /** - * For multi field queries only. Determines the rules for whether or not a document matches - * the query, as follows: - * - *

"and" - At least one occurrence of every supplied value must be present in any of the - * supplied fields. - * - *

"or" - At least one occurrence of any of the supplied values must be present in any of - * the supplied fields. - */ - private String operator; - - @JsonProperty("analyzer") - private String searchAnalyzer; - - - public String getField() { - return field; - } - - public void setField(String field) { - this.field = field; - } - - public Object getValue() { - return value; - } - - public void setValue(Object value) { - this.value = value; - } - - private boolean isNumericValue() { - return ((value instanceof Integer) || (value instanceof Double)); - } - - public String getOperator() { - return operator; - } - - public void setOperator(String operator) { - this.operator = operator; - } - - public String getSearchAnalyzer() { - return searchAnalyzer; - } - - public void setSearchAnalyzer(String searchAnalyzer) { - this.searchAnalyzer = searchAnalyzer; - } - - /** - * This method returns a string which represents this query in syntax - * that is understandable by ElasticSearch and is suitable for inclusion - * in an ElasticSearch query string. - * - * @return - ElasticSearch syntax string. - */ - public String toElasticSearch() { - - StringBuilder sb = new StringBuilder(); - - sb.append("{"); - - // Are we generating a multi field query? - if (isMultiFieldQuery()) { - - // For multi field queries, we have to be careful about how we handle - // nested fields, so check to see if any of the specified fields are - // nested. - if (field.contains(".")) { - - // Build the equivalent of a multi match query across one or more nested fields. - toElasticSearchNestedMultiMatchQuery(sb); - - } else { - - // Build a real multi match query, since we don't need to worry about nested fields. - toElasticSearchMultiFieldQuery(sb); - } - } else { - - // Single field query. - - // Add the necessary wrapping if this is a query against a nested field. - if (fieldIsNested(field)) { - sb.append("{\"nested\": { \"path\": \"").append(pathForNestedField(field)) - .append("\", \"query\": "); - } - - // Build the query. - toElasticSearchSingleFieldQuery(sb); - - if (fieldIsNested(field)) { - sb.append("}}"); - } + public Object getValue() { + return value; } - sb.append("}"); + public void setValue(Object value) { + this.value = value; + } + + private boolean isNumericValue() { + return ((value instanceof Integer) || (value instanceof Double)); + } - return sb.toString(); - } + public String getOperator() { + return operator; + } + public void setOperator(String operator) { + this.operator = operator; + } - /** - * Determines whether or not the client has specified a term query with - * multiple fields. - * - * @return - true if the query is referencing multiple fields, false, otherwise. - */ - private boolean isMultiFieldQuery() { + public String getSearchAnalyzer() { + return searchAnalyzer; + } - return (field.split(" ").length > 1); - } + public void setSearchAnalyzer(String searchAnalyzer) { + this.searchAnalyzer = searchAnalyzer; + } + /** + * This method returns a string which represents this query in syntax that is understandable by ElasticSearch and is + * suitable for inclusion in an ElasticSearch query string. + * + * @return - ElasticSearch syntax string. + */ + public String toElasticSearch() { - /** - * Constructs a single field term query in ElasticSearch syntax. - * - * @param sb - The string builder to assemble the query string with. - * @return - The single term query. - */ - private void toElasticSearchSingleFieldQuery(StringBuilder sb) { + StringBuilder sb = new StringBuilder(); - sb.append("\"term\": {\"").append(field).append("\" : "); + sb.append("{"); - // For numeric values, don't enclose the value in quotes. - if (!isNumericValue()) { - sb.append("\"").append(value).append("\""); - } else { - sb.append(value); - } + // Are we generating a multi field query? + if (isMultiFieldQuery()) { - sb.append("}"); - } + // For multi field queries, we have to be careful about how we handle + // nested fields, so check to see if any of the specified fields are + // nested. + if (field.contains(".")) { + // Build the equivalent of a multi match query across one or more nested fields. + toElasticSearchNestedMultiMatchQuery(sb); - /** - * Constructs a multi field query in ElasticSearch syntax. - * - * @param sb - The string builder to assemble the query string with. - * @return - The multi field query. - */ - private void toElasticSearchMultiFieldQuery(StringBuilder sb) { + } else { - sb.append("\"multi_match\": {"); + // Build a real multi match query, since we don't need to worry about nested fields. + toElasticSearchMultiFieldQuery(sb); + } + } else { - sb.append("\"query\": \"").append(value).append("\", "); - sb.append("\"type\": \"cross_fields\","); - sb.append("\"fields\": ["); + // Single field query. - List fields = Arrays.asList(field.split(" ")); - AtomicBoolean firstField = new AtomicBoolean(true); - for (String f : fields) { - if (!firstField.compareAndSet(true, false)) { - sb.append(", "); - } - sb.append("\"").append(f.trim()).append("\""); - } - sb.append("],"); + // Add the necessary wrapping if this is a query against a nested field. + if (fieldIsNested(field)) { + sb.append("{\"nested\": { \"path\": \"").append(pathForNestedField(field)).append("\", \"query\": "); + } - sb.append("\"operator\": \"").append((operator != null) - ? operator.toLowerCase() : "and").append("\""); + // Build the query. + toElasticSearchSingleFieldQuery(sb); - if (searchAnalyzer != null) { - sb.append(", \"analyzer\": \"").append(searchAnalyzer).append("\""); + if (fieldIsNested(field)) { + sb.append("}}"); + } + } + + sb.append("}"); + + return sb.toString(); } - sb.append("}"); - } + /** + * Determines whether or not the client has specified a term query with multiple fields. + * + * @return - true if the query is referencing multiple fields, false, otherwise. + */ + private boolean isMultiFieldQuery() { - /** - * Constructs the equivalent of an ElasticSearch multi match query across - * multiple nested fields. - * - *

Since ElasticSearch doesn't really let you do that, we have to be clever - * and construct an equivalent query using boolean operators to produce - * the same result. - * - * @param sb - The string builder to use to build the query. - */ - public void toElasticSearchNestedMultiMatchQuery(StringBuilder sb) { + return (field.split(" ").length > 1); + } - // Break out our whitespace delimited list of fields and values into a actual lists. - List fields = Arrays.asList(field.split(" ")); - List values = Arrays.asList(((String) value).split(" ")); // GDF: revisit this cast. - sb.append("\"bool\": {"); + /** + * Constructs a single field term query in ElasticSearch syntax. + * + * @param sb - The string builder to assemble the query string with. + * @return - The single term query. + */ + private void toElasticSearchSingleFieldQuery(StringBuilder sb) { - if (operator != null) { + sb.append("\"term\": {\"").append(field).append("\" : "); - if (operator.toLowerCase().equals("and")) { - sb.append("\"must\": ["); - } else if (operator.toLowerCase().equals("or")) { - sb.append("\"should\": ["); - } + // For numeric values, don't enclose the value in quotes. + if (!isNumericValue()) { + sb.append("\"").append(value).append("\""); + } else { + sb.append(value); + } - } else { - sb.append("\"must\": ["); + sb.append("}"); } - AtomicBoolean firstField = new AtomicBoolean(true); - for (String f : fields) { - if (!firstField.compareAndSet(true, false)) { - sb.append(", "); - } + /** + * Constructs a multi field query in ElasticSearch syntax. + * + * @param sb - The string builder to assemble the query string with. + * @return - The multi field query. + */ + private void toElasticSearchMultiFieldQuery(StringBuilder sb) { - sb.append("{ "); + sb.append("\"multi_match\": {"); - // Is this a nested field? - if (fieldIsNested(f)) { + sb.append("\"query\": \"").append(value).append("\", "); + sb.append("\"type\": \"cross_fields\","); + sb.append("\"fields\": ["); - sb.append("\"nested\": {"); - sb.append("\"path\": \"").append(pathForNestedField(f)).append("\", "); - sb.append("\"query\": "); - } + List fields = Arrays.asList(field.split(" ")); + AtomicBoolean firstField = new AtomicBoolean(true); + for (String f : fields) { + if (!firstField.compareAndSet(true, false)) { + sb.append(", "); + } + sb.append("\"").append(f.trim()).append("\""); + } + sb.append("],"); - sb.append("{\"bool\": {"); - sb.append("\"should\": ["); + sb.append("\"operator\": \"").append((operator != null) ? operator.toLowerCase() : "and").append("\""); - AtomicBoolean firstValue = new AtomicBoolean(true); - for (String v : values) { - if (!firstValue.compareAndSet(true, false)) { - sb.append(", "); + if (searchAnalyzer != null) { + sb.append(", \"analyzer\": \"").append(searchAnalyzer).append("\""); } - sb.append("{\"match\": { \""); - sb.append(f).append("\": {\"query\": \"").append(v).append("\""); - if (searchAnalyzer != null) { - sb.append(", \"analyzer\": \"").append(searchAnalyzer).append("\""); + sb.append("}"); + } + + + /** + * Constructs the equivalent of an ElasticSearch multi match query across multiple nested fields. + * + *

+ * Since ElasticSearch doesn't really let you do that, we have to be clever and construct an equivalent query using + * boolean operators to produce the same result. + * + * @param sb - The string builder to use to build the query. + */ + public void toElasticSearchNestedMultiMatchQuery(StringBuilder sb) { + + // Break out our whitespace delimited list of fields and values into a actual lists. + List fields = Arrays.asList(field.split(" ")); + List values = Arrays.asList(((String) value).split(" ")); // GDF: revisit this cast. + + sb.append("\"bool\": {"); + + if (operator != null) { + + if (operator.toLowerCase().equals("and")) { + sb.append("\"must\": ["); + } else if (operator.toLowerCase().equals("or")) { + sb.append("\"should\": ["); + } + + } else { + sb.append("\"must\": ["); } - sb.append("}}}"); - } - sb.append("]"); - sb.append("}"); + AtomicBoolean firstField = new AtomicBoolean(true); + for (String f : fields) { - if (fieldIsNested(f)) { - sb.append("}"); - sb.append("}"); - } + if (!firstField.compareAndSet(true, false)) { + sb.append(", "); + } - sb.append("}"); - } + sb.append("{ "); + + // Is this a nested field? + if (fieldIsNested(f)) { + + sb.append("\"nested\": {"); + sb.append("\"path\": \"").append(pathForNestedField(f)).append("\", "); + sb.append("\"query\": "); + } - sb.append("]"); - sb.append("}"); - } + sb.append("{\"bool\": {"); + sb.append("\"should\": ["); + AtomicBoolean firstValue = new AtomicBoolean(true); + for (String v : values) { + if (!firstValue.compareAndSet(true, false)) { + sb.append(", "); + } + sb.append("{\"match\": { \""); + sb.append(f).append("\": {\"query\": \"").append(v).append("\""); - @Override - public String toString() { - return "field: " + field + ", value: " + value + " (" + value.getClass().getName() + ")"; - } + if (searchAnalyzer != null) { + sb.append(", \"analyzer\": \"").append(searchAnalyzer).append("\""); + } + sb.append("}}}"); + } - public boolean fieldIsNested(String field) { - return field.contains("."); - } + sb.append("]"); + sb.append("}"); - public String pathForNestedField(String field) { - int index = field.lastIndexOf('.'); - return field.substring(0, index); - } + if (fieldIsNested(f)) { + sb.append("}"); + sb.append("}"); + } + + sb.append("}"); + } + + sb.append("]"); + sb.append("}"); + } + + + @Override + public String toString() { + return "field: " + field + ", value: " + value + " (" + value.getClass().getName() + ")"; + } + + public boolean fieldIsNested(String field) { + return field.contains("."); + } + + public String pathForNestedField(String field) { + int index = field.lastIndexOf('.'); + return field.substring(0, index); + } } diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/service/SearchService.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/service/SearchService.java index 2d7a290..350ddf0 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/service/SearchService.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/service/SearchService.java @@ -32,25 +32,25 @@ import org.springframework.beans.factory.annotation.Autowired; public class SearchService { - private ElasticSearchHttpController esController = null; + private ElasticSearchHttpController esController = null; - static Logger logger = LoggerFactory.getInstance().getLogger(SearchService.class.getName()); + static Logger logger = LoggerFactory.getInstance().getLogger(SearchService.class.getName()); - @Autowired - private ElasticSearchConfig esConfig; + @Autowired + private ElasticSearchConfig esConfig; - public SearchService() { - try { - start(); - } catch (Exception e) { - logger.error(SearchDbMsgs.STARTUP_EXCEPTION, e.getLocalizedMessage()); + public SearchService() { + try { + start(); + } catch (Exception e) { + logger.error(SearchDbMsgs.STARTUP_EXCEPTION, e.getLocalizedMessage()); + } } - } - protected void start() throws Exception { - Properties configProperties = new Properties(); - configProperties.load(new FileInputStream(SearchDbConstants.ES_CONFIG_FILE)); - esController = new ElasticSearchHttpController(esConfig); - logger.info(SearchDbMsgs.SERVICE_STARTED); - } + protected void start() throws Exception { + Properties configProperties = new Properties(); + configProperties.load(new FileInputStream(SearchDbConstants.ES_CONFIG_FILE)); + esController = new ElasticSearchHttpController(esConfig); + logger.info(SearchDbMsgs.SERVICE_STARTED); + } } diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/util/AggregationParsingUtil.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/util/AggregationParsingUtil.java index 93ee23e..def3f04 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/util/AggregationParsingUtil.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/util/AggregationParsingUtil.java @@ -29,73 +29,71 @@ import org.onap.aai.sa.searchdbabstraction.entity.AggregationBucket; import org.onap.aai.sa.searchdbabstraction.entity.AggregationResult; public class AggregationParsingUtil { - public static AggregationResult[] parseAggregationResults(JSONObject aggregations) - throws JsonProcessingException { + public static AggregationResult[] parseAggregationResults(JSONObject aggregations) throws JsonProcessingException { - // Obtain the set of aggregation names - Set keySet = aggregations.keySet(); - AggregationResult[] aggResults = new AggregationResult[keySet.size()]; + // Obtain the set of aggregation names + Set keySet = aggregations.keySet(); + AggregationResult[] aggResults = new AggregationResult[keySet.size()]; - int index = 0; - for (Iterator it = keySet.iterator(); it.hasNext(); ) { - String key = (String) it.next(); - AggregationResult aggResult = new AggregationResult(); - aggResult.setName(key); + int index = 0; + for (Iterator it = keySet.iterator(); it.hasNext();) { + String key = (String) it.next(); + AggregationResult aggResult = new AggregationResult(); + aggResult.setName(key); - JSONObject bucketsOrNested = (JSONObject) aggregations.get(key); - Object buckets = bucketsOrNested.get("buckets"); - if (buckets == null) { - // we have a nested - Number count = (Number) bucketsOrNested.remove("doc_count"); - aggResult.setCount(count); - AggregationResult[] nestedResults = parseAggregationResults(bucketsOrNested); - aggResult.setNestedAggregations(nestedResults); - } else { - AggregationBucket[] aggBuckets = parseAggregationBuckets((JSONArray) buckets); - aggResult.setBuckets(aggBuckets); - } + JSONObject bucketsOrNested = (JSONObject) aggregations.get(key); + Object buckets = bucketsOrNested.get("buckets"); + if (buckets == null) { + // we have a nested + Number count = (Number) bucketsOrNested.remove("doc_count"); + aggResult.setCount(count); + AggregationResult[] nestedResults = parseAggregationResults(bucketsOrNested); + aggResult.setNestedAggregations(nestedResults); + } else { + AggregationBucket[] aggBuckets = parseAggregationBuckets((JSONArray) buckets); + aggResult.setBuckets(aggBuckets); + } - aggResults[index] = aggResult; - index++; - } + aggResults[index] = aggResult; + index++; + } - return aggResults; + return aggResults; - } + } - private static AggregationBucket[] parseAggregationBuckets(JSONArray buckets) - throws JsonProcessingException { - AggregationBucket[] aggBuckets = new AggregationBucket[buckets.size()]; - for (int i = 0; i < buckets.size(); i++) { - AggregationBucket aggBucket = new AggregationBucket(); - JSONObject bucketContent = (JSONObject) buckets.get(i); - Object key = bucketContent.remove("key"); - aggBucket.setKey(key); - Object formatted = bucketContent.remove("key_as_string"); - if (formatted != null) { - aggBucket.setFormattedKey((String) formatted); - } - Object count = bucketContent.remove("doc_count"); - if (count != null) { - aggBucket.setCount((Number) count); - } - bucketContent.remove("from"); - bucketContent.remove("from_as_string"); - bucketContent.remove("to"); - bucketContent.remove("to_as_string"); + private static AggregationBucket[] parseAggregationBuckets(JSONArray buckets) throws JsonProcessingException { + AggregationBucket[] aggBuckets = new AggregationBucket[buckets.size()]; + for (int i = 0; i < buckets.size(); i++) { + AggregationBucket aggBucket = new AggregationBucket(); + JSONObject bucketContent = (JSONObject) buckets.get(i); + Object key = bucketContent.remove("key"); + aggBucket.setKey(key); + Object formatted = bucketContent.remove("key_as_string"); + if (formatted != null) { + aggBucket.setFormattedKey((String) formatted); + } + Object count = bucketContent.remove("doc_count"); + if (count != null) { + aggBucket.setCount((Number) count); + } + bucketContent.remove("from"); + bucketContent.remove("from_as_string"); + bucketContent.remove("to"); + bucketContent.remove("to_as_string"); - if (!bucketContent.entrySet().isEmpty()) { - // we have results from sub-aggregation - AggregationResult[] subResult = parseAggregationResults(bucketContent); - if (subResult != null) { - aggBucket.setSubAggregationResult(subResult); + if (!bucketContent.entrySet().isEmpty()) { + // we have results from sub-aggregation + AggregationResult[] subResult = parseAggregationResults(bucketContent); + if (subResult != null) { + aggBucket.setSubAggregationResult(subResult); + } + } + aggBuckets[i] = aggBucket; } - } - aggBuckets[i] = aggBucket; - } - return aggBuckets; - } + return aggBuckets; + } } diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/util/DocumentSchemaUtil.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/util/DocumentSchemaUtil.java index a22f59e..09ef76b 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/util/DocumentSchemaUtil.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/util/DocumentSchemaUtil.java @@ -34,104 +34,106 @@ import org.onap.aai.sa.rest.DocumentSchema; public class DocumentSchemaUtil { - private static String dynamicCustomMapping = null; - private static final String DYNAMIC_CUSTOM_TEMPALTE_FILE = System.getProperty("CONFIG_HOME") + File.separator - + "dynamic-custom-template.json"; - - public static String generateDocumentMappings(String documentSchema) - throws JsonParseException, JsonMappingException, IOException { + private static String dynamicCustomMapping = null; + private static final String DYNAMIC_CUSTOM_TEMPALTE_FILE = + System.getProperty("CONFIG_HOME") + File.separator + "dynamic-custom-template.json"; - // Unmarshal the json content into a document schema object. - ObjectMapper mapper = new ObjectMapper(); - DocumentSchema schema = mapper.readValue(documentSchema, DocumentSchema.class); + public static String generateDocumentMappings(String documentSchema) + throws JsonParseException, JsonMappingException, IOException { - return generateDocumentMappings(schema); - } + // Unmarshal the json content into a document schema object. + ObjectMapper mapper = new ObjectMapper(); + DocumentSchema schema = mapper.readValue(documentSchema, DocumentSchema.class); - public static String generateDocumentMappings(DocumentSchema schema) throws IOException { - - // Adding dynamic template to add fielddata=true to dynamic fields of type "string" - // in order to avoid aggregation queries breaking in ESv6.1.2 - if(dynamicCustomMapping == null) { - try { - dynamicCustomMapping = IOUtils.toString(new FileInputStream(DYNAMIC_CUSTOM_TEMPALTE_FILE), "UTF-8").replaceAll("\\s+", ""); - } catch (IOException e) { - throw new IOException("Dynamic Custom template configuration went wrong! Please check for the correct template file.", e); - } - } - - // Now, generate the Elastic Search mapping json and return it. - StringBuilder sb = new StringBuilder(); - sb.append("{"); - // Adding custom mapping which adds fielddata=true to dynamic fields of type "string" - sb.append(dynamicCustomMapping != null ? dynamicCustomMapping : ""); - sb.append("\"properties\": {"); - - generateFieldMappings(schema.getFields(), sb); - - sb.append("}"); - sb.append("}"); + return generateDocumentMappings(schema); + } - return sb.toString(); - } + public static String generateDocumentMappings(DocumentSchema schema) throws IOException { + + // Adding dynamic template to add fielddata=true to dynamic fields of type "string" + // in order to avoid aggregation queries breaking in ESv6.1.2 + if (dynamicCustomMapping == null) { + try { + dynamicCustomMapping = IOUtils.toString(new FileInputStream(DYNAMIC_CUSTOM_TEMPALTE_FILE), "UTF-8") + .replaceAll("\\s+", ""); + } catch (IOException e) { + throw new IOException( + "Dynamic Custom template configuration went wrong! Please check for the correct template file.", + e); + } + } + + // Now, generate the Elastic Search mapping json and return it. + StringBuilder sb = new StringBuilder(); + sb.append("{"); + // Adding custom mapping which adds fielddata=true to dynamic fields of type "string" + sb.append(dynamicCustomMapping != null ? dynamicCustomMapping : ""); + sb.append("\"properties\": {"); + + generateFieldMappings(schema.getFields(), sb); + + sb.append("}"); + sb.append("}"); + + return sb.toString(); + } - private static void generateFieldMappings(List fields, StringBuilder sb) { + private static void generateFieldMappings(List fields, StringBuilder sb) { - AtomicBoolean firstField = new AtomicBoolean(true); + AtomicBoolean firstField = new AtomicBoolean(true); - for (DocumentFieldSchema field : fields) { + for (DocumentFieldSchema field : fields) { - // If this isn't the first field in the list, prepend it with a ',' - if (!firstField.compareAndSet(true, false)) { - sb.append(", "); - } + // If this isn't the first field in the list, prepend it with a ',' + if (!firstField.compareAndSet(true, false)) { + sb.append(", "); + } - // Now, append the translated field contents. - generateFieldMapping(field, sb); + // Now, append the translated field contents. + generateFieldMapping(field, sb); + } } - } - private static void generateFieldMapping(DocumentFieldSchema fieldSchema, StringBuilder sb) { + private static void generateFieldMapping(DocumentFieldSchema fieldSchema, StringBuilder sb) { - sb.append("\"").append(fieldSchema.getName()).append("\": {"); + sb.append("\"").append(fieldSchema.getName()).append("\": {"); - // The field type is mandatory. - sb.append("\"type\": \"").append(fieldSchema.getDataType()).append("\""); + // The field type is mandatory. + sb.append("\"type\": \"").append(fieldSchema.getDataType()).append("\""); - // For date type fields we may optionally supply a format specifier. - if (fieldSchema.getDataType().equals("date")) { - if (fieldSchema.getFormat() != null) { - sb.append(", \"format\": \"").append(fieldSchema.getFormat()).append("\""); - } - } + // For date type fields we may optionally supply a format specifier. + if (fieldSchema.getDataType().equals("date")) { + if (fieldSchema.getFormat() != null) { + sb.append(", \"format\": \"").append(fieldSchema.getFormat()).append("\""); + } + } - // If the index field was specified, then append it. - if (fieldSchema.getSearchable() != null) { - sb.append(", \"index\": \"").append(fieldSchema.getSearchable() - ? "analyzed" : "not_analyzed").append("\""); - } + // If the index field was specified, then append it. + if (fieldSchema.getSearchable() != null) { + sb.append(", \"index\": \"").append(fieldSchema.getSearchable() ? "analyzed" : "not_analyzed").append("\""); + } - // If a search analyzer was specified, then append it. - if (fieldSchema.getSearchAnalyzer() != null) { - sb.append(", \"search_analyzer\": \"").append(fieldSchema.getSearchAnalyzer()).append("\""); - } + // If a search analyzer was specified, then append it. + if (fieldSchema.getSearchAnalyzer() != null) { + sb.append(", \"search_analyzer\": \"").append(fieldSchema.getSearchAnalyzer()).append("\""); + } - // If an indexing analyzer was specified, then append it. - if (fieldSchema.getIndexAnalyzer() != null) { - sb.append(", \"analyzer\": \"").append(fieldSchema.getIndexAnalyzer()).append("\""); - } + // If an indexing analyzer was specified, then append it. + if (fieldSchema.getIndexAnalyzer() != null) { + sb.append(", \"analyzer\": \"").append(fieldSchema.getIndexAnalyzer()).append("\""); + } - if (fieldSchema.getDataType().equals("nested")) { + if (fieldSchema.getDataType().equals("nested")) { - sb.append(", \"properties\": {"); - generateFieldMappings(fieldSchema.getSubFields(), sb); - sb.append("}"); - } + sb.append(", \"properties\": {"); + generateFieldMappings(fieldSchema.getSubFields(), sb); + sb.append("}"); + } - sb.append("}"); - } + sb.append("}"); + } } diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/util/ElasticSearchPayloadTranslator.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/util/ElasticSearchPayloadTranslator.java index d73001b..79b145d 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/util/ElasticSearchPayloadTranslator.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/util/ElasticSearchPayloadTranslator.java @@ -37,62 +37,64 @@ import org.onap.aai.sa.searchdbabstraction.logging.SearchDbMsgs; /** - * This class as the name suggests is to translate the payload of PUT & POST requests - * to ElasticSearch (ES) to its compatible syntax, specially compatible with ES v6 or above. + * This class as the name suggests is to translate the payload of PUT & POST requests to ElasticSearch (ES) to its + * compatible syntax, specially compatible with ES v6 or above. * - * For example, data type such as "string" is now replaced by "text" or "keyword". + * For example, data type such as "string" is now replaced by "text" or "keyword". * - * So this class will make those translations reading off from a json configuration file, therefore - * the configuration can be updated with new translations as and when required without touching the code. + * So this class will make those translations reading off from a json configuration file, therefore the configuration + * can be updated with new translations as and when required without touching the code. * * @author EDWINL * */ public class ElasticSearchPayloadTranslator { - private static Logger logger = LoggerFactory.getInstance().getLogger(ElasticSearchPayloadTranslator.class.getName()); - private static final String CONFIG_DIRECTORY = System.getProperty("CONFIG_HOME"); - private static final String ES_PAYLOAD_TRANSLATION_FILE = "es-payload-translation.json"; + private static Logger logger = + LoggerFactory.getInstance().getLogger(ElasticSearchPayloadTranslator.class.getName()); + private static final String CONFIG_DIRECTORY = System.getProperty("CONFIG_HOME"); + private static final String ES_PAYLOAD_TRANSLATION_FILE = "es-payload-translation.json"; - /** - * Using JSON Path query to filter objects to translate the payload to ES compatible version - * The filter queries and the replacement attributes are configured in the es-payload-translation.json file. - * - * @param source - * @return translated payload in String - * @throws IOException - */ - public static String translateESPayload(String source) throws IOException { - logger.info(SearchDbMsgs.PROCESS_PAYLOAD_QUERY, "translateESPayload, method-params[ source=" + source + "]"); - String pathToTranslationFile = CONFIG_DIRECTORY + File.separator + ES_PAYLOAD_TRANSLATION_FILE; + /** + * Using JSON Path query to filter objects to translate the payload to ES compatible version The filter queries and + * the replacement attributes are configured in the es-payload-translation.json file. + * + * @param source + * @return translated payload in String + * @throws IOException + */ + public static String translateESPayload(String source) throws IOException { + logger.info(SearchDbMsgs.PROCESS_PAYLOAD_QUERY, "translateESPayload, method-params[ source=" + source + "]"); + String pathToTranslationFile = CONFIG_DIRECTORY + File.separator + ES_PAYLOAD_TRANSLATION_FILE; - try { - - JSONObject translationConfigPayload = new JSONObject(IOUtils.toString( - new FileInputStream(new File(pathToTranslationFile)), "UTF-8")); - JSONArray attrTranslations = translationConfigPayload.getJSONArray("attr-translations"); - DocumentContext payloadToTranslate = JsonPath.parse(source); + try { - for(Object obj : attrTranslations) { - JSONObject jsonObj = ((JSONObject) obj); - String query = jsonObj.get("query").toString(); - JSONObject attrToUpdate = (JSONObject) jsonObj.get("update"); - List> filteredObjects = payloadToTranslate.read(query); - for(Map objMap : filteredObjects) { - objMap.putAll(attrToUpdate.toMap()); - } - } - - logger.info(SearchDbMsgs.PROCESS_PAYLOAD_QUERY, "Payload after translation: "+payloadToTranslate.jsonString()); - return payloadToTranslate.jsonString(); - - } catch (JSONException | IOException e) { - logger.error(SearchDbMsgs.FILTERS_CONFIG_FAILURE, e, ES_PAYLOAD_TRANSLATION_FILE, e.getMessage()); - if(e instanceof JSONException) { - throw new IOException("Payload translation configuration looks corrupted. Please correct!", e); - } - throw new IOException("Error in configuring payload translation file. Please check if it exists.", e); - } - } + JSONObject translationConfigPayload = + new JSONObject(IOUtils.toString(new FileInputStream(new File(pathToTranslationFile)), "UTF-8")); + JSONArray attrTranslations = translationConfigPayload.getJSONArray("attr-translations"); + DocumentContext payloadToTranslate = JsonPath.parse(source); + + for (Object obj : attrTranslations) { + JSONObject jsonObj = ((JSONObject) obj); + String query = jsonObj.get("query").toString(); + JSONObject attrToUpdate = (JSONObject) jsonObj.get("update"); + List> filteredObjects = payloadToTranslate.read(query); + for (Map objMap : filteredObjects) { + objMap.putAll(attrToUpdate.toMap()); + } + } + + logger.info(SearchDbMsgs.PROCESS_PAYLOAD_QUERY, + "Payload after translation: " + payloadToTranslate.jsonString()); + return payloadToTranslate.jsonString(); + + } catch (JSONException | IOException e) { + logger.error(SearchDbMsgs.FILTERS_CONFIG_FAILURE, e, ES_PAYLOAD_TRANSLATION_FILE, e.getMessage()); + if (e instanceof JSONException) { + throw new IOException("Payload translation configuration looks corrupted. Please correct!", e); + } + throw new IOException("Error in configuring payload translation file. Please check if it exists.", e); + } + } } diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/util/SearchDbConstants.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/util/SearchDbConstants.java index bd7d58b..1171895 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/util/SearchDbConstants.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/util/SearchDbConstants.java @@ -21,37 +21,32 @@ package org.onap.aai.sa.searchdbabstraction.util; public class SearchDbConstants { - public static final String SDB_FILESEP = (System.getProperty("file.separator") == null) ? "/" - : System.getProperty("file.separator"); - public static final String SDB_BUNDLECONFIG_NAME = - (System.getProperty("BUNDLECONFIG_DIR") == null) - ? "bundleconfig" : System.getProperty("BUNDLECONFIG_DIR"); -// - public static final String SDB_HOME_BUNDLECONFIG = (System.getProperty("AJSC_HOME") == null) - ? SDB_FILESEP + "opt" + SDB_FILESEP + "app" + SDB_FILESEP + "searchdb" - + SDB_FILESEP + SDB_BUNDLECONFIG_NAME - : System.getProperty("AJSC_HOME") + SDB_FILESEP + SDB_BUNDLECONFIG_NAME; -// - public static final String SDB_HOME_ETC = - SDB_HOME_BUNDLECONFIG + SDB_FILESEP + "etc" + SDB_FILESEP; - public static final String SDB_CONFIG_APP_LOCATION = SDB_HOME_ETC + "appprops" + SDB_FILESEP; + public static final String SDB_FILESEP = + (System.getProperty("file.separator") == null) ? "/" : System.getProperty("file.separator"); + public static final String SDB_BUNDLECONFIG_NAME = + (System.getProperty("BUNDLECONFIG_DIR") == null) ? "bundleconfig" : System.getProperty("BUNDLECONFIG_DIR"); + // + public static final String SDB_HOME_BUNDLECONFIG = (System.getProperty("AJSC_HOME") == null) + ? SDB_FILESEP + "opt" + SDB_FILESEP + "app" + SDB_FILESEP + "searchdb" + SDB_FILESEP + SDB_BUNDLECONFIG_NAME + : System.getProperty("AJSC_HOME") + SDB_FILESEP + SDB_BUNDLECONFIG_NAME; + // + public static final String SDB_HOME_ETC = SDB_HOME_BUNDLECONFIG + SDB_FILESEP + "etc" + SDB_FILESEP; + public static final String SDB_CONFIG_APP_LOCATION = SDB_HOME_ETC + "appprops" + SDB_FILESEP; - // Elastic Search related - public static final String SDB_SPECIFIC_CONFIG = (System.getProperty("CONFIG_HOME") == null) - ? SDB_CONFIG_APP_LOCATION : System.getProperty("CONFIG_HOME") + SDB_FILESEP; - public static final String ES_CONFIG_FILE = SDB_SPECIFIC_CONFIG + SDB_FILESEP - + "elastic-search.properties"; - public static final String SDB_AUTH = SDB_SPECIFIC_CONFIG + "auth" + SDB_FILESEP; - public static final String SDB_AUTH_CONFIG_FILENAME = SDB_AUTH + "search_policy.json"; - public static final String SDB_FILTER_CONFIG_FILE = SDB_SPECIFIC_CONFIG + "filter-config.json"; - public static final String SDB_ANALYSIS_CONFIG_FILE = - SDB_SPECIFIC_CONFIG + "analysis-config.json"; + // Elastic Search related + public static final String SDB_SPECIFIC_CONFIG = (System.getProperty("CONFIG_HOME") == null) + ? SDB_CONFIG_APP_LOCATION : System.getProperty("CONFIG_HOME") + SDB_FILESEP; + public static final String ES_CONFIG_FILE = SDB_SPECIFIC_CONFIG + SDB_FILESEP + "elastic-search.properties"; + public static final String SDB_AUTH = SDB_SPECIFIC_CONFIG + "auth" + SDB_FILESEP; + public static final String SDB_AUTH_CONFIG_FILENAME = SDB_AUTH + "search_policy.json"; + public static final String SDB_FILTER_CONFIG_FILE = SDB_SPECIFIC_CONFIG + "filter-config.json"; + public static final String SDB_ANALYSIS_CONFIG_FILE = SDB_SPECIFIC_CONFIG + "analysis-config.json"; -// public static final String SDB_HOME_SEARCHCONFIG = (System.getProperty("app.config") == null) -// ? System.getProperty("user.dir") + SDB_FILESEP + "config" + SDB_FILESEP + "searchdb" -// + SDB_FILESEP + "elastic-search.properties" -// : System.getProperty("app.config") + SDB_FILESEP + "searchdb" + SDB_FILESEP + "elastic-search.properties"; + // public static final String SDB_HOME_SEARCHCONFIG = (System.getProperty("app.config") == null) + // ? System.getProperty("user.dir") + SDB_FILESEP + "config" + SDB_FILESEP + "searchdb" + // + SDB_FILESEP + "elastic-search.properties" + // : System.getProperty("app.config") + SDB_FILESEP + "searchdb" + SDB_FILESEP + "elastic-search.properties"; - // Logging related - public static final String SDB_SERVICE_NAME = "SearchDataService"; + // Logging related + public static final String SDB_SERVICE_NAME = "SearchDataService"; } diff --git a/src/test/java/org/onap/aai/sa/auth/SearchDbServiceAuthTest.java b/src/test/java/org/onap/aai/sa/auth/SearchDbServiceAuthTest.java index 3ffb422..a4b5395 100644 --- a/src/test/java/org/onap/aai/sa/auth/SearchDbServiceAuthTest.java +++ b/src/test/java/org/onap/aai/sa/auth/SearchDbServiceAuthTest.java @@ -39,47 +39,47 @@ public class SearchDbServiceAuthTest { @Mock HttpHeaders headers; -// @Mock -// Cookie mockedCookie; + // @Mock + // Cookie mockedCookie; @Before public void setUp() throws NoSuchFieldException, IllegalAccessException, IOException { MockitoAnnotations.initMocks(this); System.setProperty("AJSC_HOME", new File(".").getCanonicalPath().replace('\\', '/')); - setFinalStatic(System.getProperty("AJSC_HOME")+"/src/test/resources/json/search_policy.json"); + setFinalStatic(System.getProperty("AJSC_HOME") + "/src/test/resources/json/search_policy.json"); } @Test - public void testAuthUser(){ + public void testAuthUser() { SearchDbServiceAuth aaiAuth = new SearchDbServiceAuth(); String auth = aaiAuth.authUser(headers, "user-1", "function-1"); Assert.assertEquals(auth, "AAI_9101"); } -// @Test -// public void testAuthCookie_NullCookie(){ -// SearchDbServiceAuth aaiAuth = new SearchDbServiceAuth(); -// Cookie cookie = null; -// Assert.assertFalse(aaiAuth.authCookie(cookie, "function-1", new StringBuilder("user-1"))); -// } + // @Test + // public void testAuthCookie_NullCookie(){ + // SearchDbServiceAuth aaiAuth = new SearchDbServiceAuth(); + // Cookie cookie = null; + // Assert.assertFalse(aaiAuth.authCookie(cookie, "function-1", new StringBuilder("user-1"))); + // } -// @Test -// public void testAuthCookie_NotNullCookie(){ -// SearchDbServiceAuth aaiAuth = new SearchDbServiceAuth(); -// Cookie cookie = new Cookie ( "TestCookie", "TestValue"); -// // Cookie cookie = new Cookie ( "TestCookie", "TestValue" ); -// boolean retValue = aaiAuth.authCookie(cookie, "GET:testFunction", new StringBuilder("testuser")); -// Assert.assertTrue(retValue); -// } + // @Test + // public void testAuthCookie_NotNullCookie(){ + // SearchDbServiceAuth aaiAuth = new SearchDbServiceAuth(); + // Cookie cookie = new Cookie ( "TestCookie", "TestValue"); + // // Cookie cookie = new Cookie ( "TestCookie", "TestValue" ); + // boolean retValue = aaiAuth.authCookie(cookie, "GET:testFunction", new StringBuilder("testuser")); + // Assert.assertTrue(retValue); + // } - static void setFinalStatic(String fieldValue) throws NoSuchFieldException, SecurityException, - IllegalArgumentException, IllegalAccessException { + static void setFinalStatic(String fieldValue) + throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { Field configField = SearchDbConstants.class.getDeclaredField("SDB_AUTH_CONFIG_FILENAME"); configField.setAccessible(true); - Field modifiersField = Field.class.getDeclaredField( "modifiers" ); - modifiersField.setAccessible( true ); - modifiersField.setInt( configField, configField.getModifiers() & ~Modifier.FINAL ); + Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setAccessible(true); + modifiersField.setInt(configField, configField.getModifiers() & ~Modifier.FINAL); configField.set(null, fieldValue); } diff --git a/src/test/java/org/onap/aai/sa/rest/ApiUtilsTest.java b/src/test/java/org/onap/aai/sa/rest/ApiUtilsTest.java index 457dbdd..593ec92 100644 --- a/src/test/java/org/onap/aai/sa/rest/ApiUtilsTest.java +++ b/src/test/java/org/onap/aai/sa/rest/ApiUtilsTest.java @@ -27,16 +27,16 @@ import org.junit.Test; public class ApiUtilsTest { - @Test - public void testHTTPStatusConversion() { - String statusString; - statusString = ApiUtils.getHttpStatusString(201); - assertEquals(0, statusString.compareToIgnoreCase("Created")); + @Test + public void testHTTPStatusConversion() { + String statusString; + statusString = ApiUtils.getHttpStatusString(201); + assertEquals(0, statusString.compareToIgnoreCase("Created")); - statusString = ApiUtils.getHttpStatusString(207); - assertEquals(0, statusString.compareToIgnoreCase("Multi-Status")); + statusString = ApiUtils.getHttpStatusString(207); + assertEquals(0, statusString.compareToIgnoreCase("Multi-Status")); - statusString = ApiUtils.getHttpStatusString(9999); - assertEquals(0, statusString.compareToIgnoreCase("Unknown")); - } + statusString = ApiUtils.getHttpStatusString(9999); + assertEquals(0, statusString.compareToIgnoreCase("Unknown")); + } } diff --git a/src/test/java/org/onap/aai/sa/rest/BulkApiTest.java b/src/test/java/org/onap/aai/sa/rest/BulkApiTest.java index a1c255c..eff4efc 100644 --- a/src/test/java/org/onap/aai/sa/rest/BulkApiTest.java +++ b/src/test/java/org/onap/aai/sa/rest/BulkApiTest.java @@ -38,8 +38,7 @@ import org.springframework.test.web.servlet.ResultActions; /** - * This suite of tests validates the behaviour of the bulk operations REST - * end point. + * This suite of tests validates the behaviour of the bulk operations REST end point. */ @RunWith(SpringRunner.class) @SpringBootTest(classes = org.onap.aai.sa.Application.class) @@ -54,16 +53,16 @@ public class BulkApiTest { @Test public void authenticationFailureTest() throws Exception { - this.mockMvc.perform ( post ( TOP_URI) .contentType( MediaType.APPLICATION_JSON) - .content ( SearchServiceApiHarness.FAIL_AUTHENTICATION_TRIGGER )).andExpect ( status ().isForbidden () ); + this.mockMvc + .perform(post(TOP_URI).contentType(MediaType.APPLICATION_JSON) + .content(SearchServiceApiHarness.FAIL_AUTHENTICATION_TRIGGER)) + .andExpect(status().isForbidden()); } /** - * This test validates that properly constructed json payloads are - * correctly validated and that improperly contructed payloads will - * be rejected with the appropriate response code returned to the - * client. + * This test validates that properly constructed json payloads are correctly validated and that improperly + * contructed payloads will be rejected with the appropriate response code returned to the client. * * @throws IOException */ @@ -72,19 +71,20 @@ public class BulkApiTest { // Post a request to the bulk operations endpoint with a valid // operations list payload. - File validBulkOpsFile = new File ("src/test/resources/json/bulk-ops-valid.json"); + File validBulkOpsFile = new File("src/test/resources/json/bulk-ops-valid.json"); String validPayloadStr = TestUtils.readFileToString(validBulkOpsFile); // Validate that the payload is accepted as expected. - this.mockMvc.perform ( post ( TOP_URI ).contentType ( MediaType.APPLICATION_JSON ) - .content ( validPayloadStr ) ).andExpect ( status ().isOk () ); + this.mockMvc.perform(post(TOP_URI).contentType(MediaType.APPLICATION_JSON).content(validPayloadStr)) + .andExpect(status().isOk()); // Post a request to the bulk operations endpoint with an invalid // operations list payload. File inValidBulkOpsFile = new File("src/test/resources/json/bulk-ops-invalid.json"); String inValidPayloadStr = TestUtils.readFileToString(inValidBulkOpsFile); - ResultActions invalid = this.mockMvc.perform ( post ( TOP_URI ).contentType ( MediaType.APPLICATION_JSON ) - .content ( inValidPayloadStr ) ).andExpect ( status ().isBadRequest ()); + ResultActions invalid = + this.mockMvc.perform(post(TOP_URI).contentType(MediaType.APPLICATION_JSON).content(inValidPayloadStr)) + .andExpect(status().isBadRequest()); } } diff --git a/src/test/java/org/onap/aai/sa/rest/BulkRequestTest.java b/src/test/java/org/onap/aai/sa/rest/BulkRequestTest.java index d085d04..d5999b8 100644 --- a/src/test/java/org/onap/aai/sa/rest/BulkRequestTest.java +++ b/src/test/java/org/onap/aai/sa/rest/BulkRequestTest.java @@ -33,7 +33,7 @@ import org.springframework.test.context.junit4.SpringRunner; public class BulkRequestTest { @Test - public void testBulkRequest_Delete(){ + public void testBulkRequest_Delete() { BulkRequest request = new BulkRequest(); BulkOperation operation = new BulkOperation(); Document document = new Document(); @@ -54,7 +54,7 @@ public class BulkRequestTest { } @Test - public void testBulkRequest_Update(){ + public void testBulkRequest_Update() { BulkRequest request = new BulkRequest(); BulkOperation operation = new BulkOperation(); Document document = new Document(); @@ -74,7 +74,7 @@ public class BulkRequestTest { } @Test - public void testBulkRequest_Create(){ + public void testBulkRequest_Create() { BulkRequest request = new BulkRequest(); BulkOperation operation = new BulkOperation(); Document document = new Document(); @@ -94,7 +94,7 @@ public class BulkRequestTest { } @Test - public void testBulkRequest_Undefined(){ + public void testBulkRequest_Undefined() { BulkRequest request = new BulkRequest(); Assert.assertNull(request.getOperation()); Assert.assertNull(request.getOperationType()); @@ -102,7 +102,7 @@ public class BulkRequestTest { } @Test - public void testGetIndex(){ + public void testGetIndex() { BulkRequest request = new BulkRequest(); BulkOperation operation = new BulkOperation(); BulkMetaData metaData = new BulkMetaData(); @@ -114,7 +114,7 @@ public class BulkRequestTest { } @Test - public void testGetId(){ + public void testGetId() { BulkRequest request = new BulkRequest(); BulkOperation operation = new BulkOperation(); BulkMetaData metaData = new BulkMetaData(); @@ -126,16 +126,15 @@ public class BulkRequestTest { } @Test - public void testApiUtils(){ - Assert.assertEquals("services/search-data-service/v1/search/indexes/index1", - ApiUtils.buildIndexUri("index1")); + public void testApiUtils() { + Assert.assertEquals("services/search-data-service/v1/search/indexes/index1", ApiUtils.buildIndexUri("index1")); Assert.assertEquals("services/search-data-service/v1/search/indexes/index1/documents/document1", ApiUtils.buildDocumentUri("index1", "document1")); Assert.assertTrue(ApiUtils.validateIndexUri("services/search-data-service/v1/search/indexes/index1")); - Assert.assertTrue(ApiUtils.validateDocumentUri - ("services/search-data-service/v1/search/indexes/index1/documents/document1", true)); - Assert.assertTrue(ApiUtils.validateDocumentUri - ("services/search-data-service/v1/search/indexes/index1/documents/document1", false)); + Assert.assertTrue(ApiUtils.validateDocumentUri( + "services/search-data-service/v1/search/indexes/index1/documents/document1", true)); + Assert.assertTrue(ApiUtils.validateDocumentUri( + "services/search-data-service/v1/search/indexes/index1/documents/document1", false)); } private BulkMetaData getMetaData() { diff --git a/src/test/java/org/onap/aai/sa/rest/DocumentApiTest.java b/src/test/java/org/onap/aai/sa/rest/DocumentApiTest.java index 78fec3e..4276f3d 100644 --- a/src/test/java/org/onap/aai/sa/rest/DocumentApiTest.java +++ b/src/test/java/org/onap/aai/sa/rest/DocumentApiTest.java @@ -46,186 +46,182 @@ import org.springframework.test.web.servlet.MvcResult; @RunWith(SpringRunner.class) @SpringBootTest @AutoConfigureMockMvc -public class DocumentApiTest { - - private static final String INDEXES_URI = "/test/indexes/"; - private static final String DOCUMENT_URI = "documents/"; - - private static final String SEARCH_URI = "query/"; - private static final String INDEX_NAME = "test-index"; - private static final String DOC_ID = "test-1"; - private static final String SIMPLE_QUERY = "\"parsed-query\": {\"my-field\": \"something\", \"query-string\": \"string\"}"; - private static final String COMPLEX_QUERY = - "{" - + "\"filter\": {" - + "\"all\": [" - + "{\"match\": {\"field\": \"searchTags\", \"value\": \"a\"}}" - + "]" - + "}," - + "\"queries\": [" - + "{\"may\": {\"parsed-query\": {\"field\": \"searchTags\", \"query-string\": \"b\"}}}" - + "]" - + "}"; - - private static final String CREATE_JSON_CONTENT = "creation content"; +public class DocumentApiTest { + + private static final String INDEXES_URI = "/test/indexes/"; + private static final String DOCUMENT_URI = "documents/"; + + private static final String SEARCH_URI = "query/"; + private static final String INDEX_NAME = "test-index"; + private static final String DOC_ID = "test-1"; + private static final String SIMPLE_QUERY = + "\"parsed-query\": {\"my-field\": \"something\", \"query-string\": \"string\"}"; + private static final String COMPLEX_QUERY = "{" + "\"filter\": {" + "\"all\": [" + + "{\"match\": {\"field\": \"searchTags\", \"value\": \"a\"}}" + "]" + "}," + "\"queries\": [" + + "{\"may\": {\"parsed-query\": {\"field\": \"searchTags\", \"query-string\": \"b\"}}}" + "]" + "}"; + + private static final String CREATE_JSON_CONTENT = "creation content"; @Autowired private MockMvc mockMvc; - /** - * This test validates the behaviour of the 'Create Document' POST request - * endpoint. - * - * @throws IOException - * @throws ParseException - */ - @Test - public void createDocumentTest() throws Exception { - - MvcResult result = this.mockMvc.perform ( post ( INDEXES_URI + INDEX_NAME + "/" + DOCUMENT_URI ).contentType ( MediaType.APPLICATION_JSON ) - .content ( CREATE_JSON_CONTENT ) ).andReturn ( ); - - // Our stub document store DAO returns the parameters that it was - // passed as the result string, so now we can validate that our - // endpoint invoked it with the correct parameters. - - JSONParser parser = new JSONParser(); - JSONObject json = (JSONObject) parser.parse(result.getResponse ().getContentAsString ()); - - assertTrue("Unexpected Result ", !json.get("etag").toString().isEmpty()); - } - - /** - * This test validates the behaviour of the 'Create Document' PUT request - * endpoint. - * - * @throws IOException - * @throws ParseException - */ - @Test - public void updateDocumentTest() throws Exception { - // WebTarget target = target(INDEXES_URI + INDEX_NAME + "/" + DOCUMENT_URI + DOC_ID); - // Builder request = target.request().header("If-Match", "1"); - // String result = request.put(Entity.json(CREATE_JSON_CONTENT), String.class); - - MvcResult result = this.mockMvc.perform ( put ( INDEXES_URI + INDEX_NAME + "/" + DOCUMENT_URI + DOC_ID ).contentType ( MediaType.APPLICATION_JSON ) - .header ( "If-Match", "1" ).content ( CREATE_JSON_CONTENT ) ).andReturn ( ); - - // Our stub document store DAO returns the parameters that it was - // passed as the result string, so now we can validate that our - // endpoint invoked it with the correct parameters. - JSONParser parser = new JSONParser(); - JSONObject json = (JSONObject) parser.parse(result.getResponse ().getContentAsString ()); - - assertTrue("Unexpected Result ", !json.get("etag").toString().isEmpty()); - } - - /** - * This test validates the behaviour of the 'Get Document' GET request - * endpoint. - * - * @throws IOException - * @throws ParseException - */ - @Test - public void getDocumentTest() throws Exception { - // String result = target(INDEXES_URI + INDEX_NAME + "/" + DOCUMENT_URI + DOC_ID).request().get(String.class); - - // MvcResult result = this.mockMvc.perform ( get ( INDEXES_URI + INDEX_NAME + "/" + DOCUMENT_URI + DOC_ID ) ).andReturn (); - MvcResult result = this.mockMvc.perform ( get ( INDEXES_URI + INDEX_NAME + "/" + DOCUMENT_URI + DOC_ID ) - .contentType ( MediaType.APPLICATION_JSON ) - .header ( "If-Match", "1" ) - .content ( CREATE_JSON_CONTENT ) ).andReturn ( ); - - - // Our stub document store DAO returns the parameters that it was - // passed as the result string, so now we can validate that our - // endpoint invoked it with the correct parameters. - JSONParser parser = new JSONParser(); - JSONObject json = (JSONObject) parser.parse(result.getResponse ().getContentAsString ()); - - assertTrue("Unexpected Result ", !json.get("etag").toString().isEmpty()); - - } -// -// /** -// * This test validates the behaviour of the 'Delete Document' DELETE request -// * endpoint. -// * -// * @throws IOException -// * @throws ParseException -// */ - @Test - public void deleteDocumentTest() throws Exception { -// WebTarget target = target(INDEXES_URI + INDEX_NAME + "/" + DOCUMENT_URI + DOC_ID); -// Builder request = target.request().header("If-Match", "1"); -// String result = request.delete(String.class); - MvcResult result = this.mockMvc.perform ( delete ( INDEXES_URI + INDEX_NAME + "/" + DOCUMENT_URI + DOC_ID ) - .contentType ( MediaType.APPLICATION_JSON ) - .header ( "If-Match", "1" ) - .content ( CREATE_JSON_CONTENT ) ).andReturn ( ); - - - - // Our stub document store DAO returns the parameters that it was - // passed as the result string, so now we can validate that our - // endpoint invoked it with the correct parameters. - assertTrue("Unexpected Result ", result.getResponse ().getContentAsString ().isEmpty ()); - - } -// -// /** -// * This test validates the behaviour of the 'Search Documents' GET request -// * endpoint. -// * -// * @throws IOException -// * @throws ParseException -// */ - @Ignore - @Test - public void searchDocumentTest1() throws Exception { - // String result = target(INDEXES_URI + INDEX_NAME + "/" + SEARCH_URI + SIMPLE_QUERY).request().get(String.class); - - MvcResult result = this.mockMvc.perform ( get ( INDEXES_URI + INDEX_NAME + "/" + SEARCH_URI + SIMPLE_QUERY ) - .contentType ( MediaType.APPLICATION_JSON ) - .header ( "If-Match", "1" ) - .content ( CREATE_JSON_CONTENT ) ).andReturn ( ); - - // Our stub document store DAO returns the parameters that it was - // passed as the result string, so now we can validate that our - // endpoint invoked it with the correct parameters. - JSONParser parser = new JSONParser(); - JSONObject json = (JSONObject) parser.parse(result.getResponse ().getContentAsString ()); - - assertTrue("Unexpected Result ", json.get("totalHits").toString().equals("1")); - - - } -// - /** - * This test validates the behaviour of the 'Search Documents' GET request - * endpoint. - * - * @throws IOException - * @throws ParseException - */ - @Test - public void searchDocumentTest2() throws Exception { - // String result = target(INDEXES_URI + INDEX_NAME + "/" + SEARCH_URI).request().post(Entity.json(COMPLEX_QUERY), String.class); - - MvcResult result = this.mockMvc.perform ( get ( INDEXES_URI + INDEX_NAME + "/" + SEARCH_URI) - .contentType ( MediaType.APPLICATION_JSON ) - .content ( COMPLEX_QUERY ) ).andReturn ( ); - - // Our stub document store DAO returns the parameters that it was - // passed as the result string, so now we can validate that our - // endpoint invoked it with the correct parameters. - JSONParser parser = new JSONParser(); - JSONObject json = (JSONObject) parser.parse(result.getResponse ().getContentAsString ()); - JSONObject resultJson = (JSONObject) json.get("searchResult"); - - assertTrue("Unexpected Result ", resultJson.get("totalHits").toString().equals("1")); - - } + /** + * This test validates the behaviour of the 'Create Document' POST request endpoint. + * + * @throws IOException + * @throws ParseException + */ + @Test + public void createDocumentTest() throws Exception { + + MvcResult result = this.mockMvc.perform(post(INDEXES_URI + INDEX_NAME + "/" + DOCUMENT_URI) + .contentType(MediaType.APPLICATION_JSON).content(CREATE_JSON_CONTENT)).andReturn(); + + // Our stub document store DAO returns the parameters that it was + // passed as the result string, so now we can validate that our + // endpoint invoked it with the correct parameters. + + JSONParser parser = new JSONParser(); + JSONObject json = (JSONObject) parser.parse(result.getResponse().getContentAsString()); + + assertTrue("Unexpected Result ", !json.get("etag").toString().isEmpty()); + } + + /** + * This test validates the behaviour of the 'Create Document' PUT request endpoint. + * + * @throws IOException + * @throws ParseException + */ + @Test + public void updateDocumentTest() throws Exception { + // WebTarget target = target(INDEXES_URI + INDEX_NAME + "/" + DOCUMENT_URI + DOC_ID); + // Builder request = target.request().header("If-Match", "1"); + // String result = request.put(Entity.json(CREATE_JSON_CONTENT), String.class); + + MvcResult result = this.mockMvc + .perform(put(INDEXES_URI + INDEX_NAME + "/" + DOCUMENT_URI + DOC_ID) + .contentType(MediaType.APPLICATION_JSON).header("If-Match", "1").content(CREATE_JSON_CONTENT)) + .andReturn(); + + // Our stub document store DAO returns the parameters that it was + // passed as the result string, so now we can validate that our + // endpoint invoked it with the correct parameters. + JSONParser parser = new JSONParser(); + JSONObject json = (JSONObject) parser.parse(result.getResponse().getContentAsString()); + + assertTrue("Unexpected Result ", !json.get("etag").toString().isEmpty()); + } + + /** + * This test validates the behaviour of the 'Get Document' GET request endpoint. + * + * @throws IOException + * @throws ParseException + */ + @Test + public void getDocumentTest() throws Exception { + // String result = target(INDEXES_URI + INDEX_NAME + "/" + DOCUMENT_URI + DOC_ID).request().get(String.class); + + // MvcResult result = this.mockMvc.perform ( get ( INDEXES_URI + INDEX_NAME + "/" + DOCUMENT_URI + DOC_ID ) + // ).andReturn (); + MvcResult result = this.mockMvc + .perform(get(INDEXES_URI + INDEX_NAME + "/" + DOCUMENT_URI + DOC_ID) + .contentType(MediaType.APPLICATION_JSON).header("If-Match", "1").content(CREATE_JSON_CONTENT)) + .andReturn(); + + + // Our stub document store DAO returns the parameters that it was + // passed as the result string, so now we can validate that our + // endpoint invoked it with the correct parameters. + JSONParser parser = new JSONParser(); + JSONObject json = (JSONObject) parser.parse(result.getResponse().getContentAsString()); + + assertTrue("Unexpected Result ", !json.get("etag").toString().isEmpty()); + + } + + // + // /** + // * This test validates the behaviour of the 'Delete Document' DELETE request + // * endpoint. + // * + // * @throws IOException + // * @throws ParseException + // */ + @Test + public void deleteDocumentTest() throws Exception { + // WebTarget target = target(INDEXES_URI + INDEX_NAME + "/" + DOCUMENT_URI + DOC_ID); + // Builder request = target.request().header("If-Match", "1"); + // String result = request.delete(String.class); + MvcResult result = this.mockMvc + .perform(delete(INDEXES_URI + INDEX_NAME + "/" + DOCUMENT_URI + DOC_ID) + .contentType(MediaType.APPLICATION_JSON).header("If-Match", "1").content(CREATE_JSON_CONTENT)) + .andReturn(); + + + + // Our stub document store DAO returns the parameters that it was + // passed as the result string, so now we can validate that our + // endpoint invoked it with the correct parameters. + assertTrue("Unexpected Result ", result.getResponse().getContentAsString().isEmpty()); + + } + + // + // /** + // * This test validates the behaviour of the 'Search Documents' GET request + // * endpoint. + // * + // * @throws IOException + // * @throws ParseException + // */ + @Ignore + @Test + public void searchDocumentTest1() throws Exception { + // String result = target(INDEXES_URI + INDEX_NAME + "/" + SEARCH_URI + + // SIMPLE_QUERY).request().get(String.class); + + MvcResult result = this.mockMvc + .perform(get(INDEXES_URI + INDEX_NAME + "/" + SEARCH_URI + SIMPLE_QUERY) + .contentType(MediaType.APPLICATION_JSON).header("If-Match", "1").content(CREATE_JSON_CONTENT)) + .andReturn(); + + // Our stub document store DAO returns the parameters that it was + // passed as the result string, so now we can validate that our + // endpoint invoked it with the correct parameters. + JSONParser parser = new JSONParser(); + JSONObject json = (JSONObject) parser.parse(result.getResponse().getContentAsString()); + + assertTrue("Unexpected Result ", json.get("totalHits").toString().equals("1")); + + + } + + // + /** + * This test validates the behaviour of the 'Search Documents' GET request endpoint. + * + * @throws IOException + * @throws ParseException + */ + @Test + public void searchDocumentTest2() throws Exception { + // String result = target(INDEXES_URI + INDEX_NAME + "/" + + // SEARCH_URI).request().post(Entity.json(COMPLEX_QUERY), String.class); + + MvcResult result = this.mockMvc.perform(get(INDEXES_URI + INDEX_NAME + "/" + SEARCH_URI) + .contentType(MediaType.APPLICATION_JSON).content(COMPLEX_QUERY)).andReturn(); + + // Our stub document store DAO returns the parameters that it was + // passed as the result string, so now we can validate that our + // endpoint invoked it with the correct parameters. + JSONParser parser = new JSONParser(); + JSONObject json = (JSONObject) parser.parse(result.getResponse().getContentAsString()); + JSONObject resultJson = (JSONObject) json.get("searchResult"); + + assertTrue("Unexpected Result ", resultJson.get("totalHits").toString().equals("1")); + + } } diff --git a/src/test/java/org/onap/aai/sa/rest/DocumentSchemaTest.java b/src/test/java/org/onap/aai/sa/rest/DocumentSchemaTest.java index 44ed60c..b18928d 100644 --- a/src/test/java/org/onap/aai/sa/rest/DocumentSchemaTest.java +++ b/src/test/java/org/onap/aai/sa/rest/DocumentSchemaTest.java @@ -32,68 +32,69 @@ import org.junit.Test; public class DocumentSchemaTest { - private final String SIMPLE_DOC_SCHEMA_JSON = "src/test/resources/json/simpleDocument.json"; - private final String NESTED_DOC_SCHEMA_JSON = "src/test/resources/json/nested-document.json"; - - - /** - * This test validates that we convert document definitions back and - * forth between json strings and POJOs without any loss of data. - * - * @throws com.fasterxml.jackson.core.JsonParseException - * @throws com.fasterxml.jackson.databind.JsonMappingException - * @throws IOException - */ - @Test - public void simpleDocSchemaFromJsonFileTest() throws com.fasterxml.jackson.core.JsonParseException, com.fasterxml.jackson.databind.JsonMappingException, IOException { - - // Import our json format document schema from a file. - File schemaFile = new File(SIMPLE_DOC_SCHEMA_JSON); - String fileString = TestUtils.readFileToString(schemaFile); - - // Unmarshall that to a Java POJO - ObjectMapper mapper = new ObjectMapper(); - DocumentSchema docSchema = mapper.readValue(schemaFile, DocumentSchema.class); - - // Now, for the purposes of comparison, produce a JSON string from - // our Java object. - String jsonString = mapper.writeValueAsString(docSchema); - - // Assert that the raw JSON that we read from the file matches the marshalled - // JSON we generated from our Java object (ie: validate that we didn't lose - // anything going in either direction). - assertTrue("Marshalled object does not match the original json source that produced it", - fileString.equals(jsonString)); - } - -// -// /** -// * This test validates that we convert document definitions back and -// * forth between json strings and POJOs without any loss of data in -// * the case of document schemas which contain nested fields. -// * -// * @throws com.fasterxml.jackson.core.JsonParseException -// * @throws com.fasterxml.jackson.databind.JsonMappingException -// * @throws IOException -// */ - - @Test - public void nestedDocSchemaFromJsonFileTest() throws JsonParseException, JsonMappingException, IOException { - - // Import our json format document schema from a file. - File schemaFile = new File(NESTED_DOC_SCHEMA_JSON); - String fileString = TestUtils.readFileToString(schemaFile); - - // Unmarshall that to a Java POJO - ObjectMapper mapper = new ObjectMapper(); - DocumentSchema docSchema = mapper.readValue(schemaFile, DocumentSchema.class); - - String jsonString = mapper.writeValueAsString(docSchema); - - // Assert that the raw JSON that we read from the file matches the marshalled - // JSON we generated from our Java object (ie: validate that we didn't lose - // anything going in either direction). - assertTrue("Marshalled object does not match the original json source that produced it", - fileString.equals(jsonString)); - } -} \ No newline at end of file + private final String SIMPLE_DOC_SCHEMA_JSON = "src/test/resources/json/simpleDocument.json"; + private final String NESTED_DOC_SCHEMA_JSON = "src/test/resources/json/nested-document.json"; + + + /** + * This test validates that we convert document definitions back and forth between json strings and POJOs without + * any loss of data. + * + * @throws com.fasterxml.jackson.core.JsonParseException + * @throws com.fasterxml.jackson.databind.JsonMappingException + * @throws IOException + */ + @Test + public void simpleDocSchemaFromJsonFileTest() throws com.fasterxml.jackson.core.JsonParseException, + com.fasterxml.jackson.databind.JsonMappingException, IOException { + + // Import our json format document schema from a file. + File schemaFile = new File(SIMPLE_DOC_SCHEMA_JSON); + String fileString = TestUtils.readFileToString(schemaFile); + + // Unmarshall that to a Java POJO + ObjectMapper mapper = new ObjectMapper(); + DocumentSchema docSchema = mapper.readValue(schemaFile, DocumentSchema.class); + + // Now, for the purposes of comparison, produce a JSON string from + // our Java object. + String jsonString = mapper.writeValueAsString(docSchema); + + // Assert that the raw JSON that we read from the file matches the marshalled + // JSON we generated from our Java object (ie: validate that we didn't lose + // anything going in either direction). + assertTrue("Marshalled object does not match the original json source that produced it", + fileString.equals(jsonString)); + } + + // + // /** + // * This test validates that we convert document definitions back and + // * forth between json strings and POJOs without any loss of data in + // * the case of document schemas which contain nested fields. + // * + // * @throws com.fasterxml.jackson.core.JsonParseException + // * @throws com.fasterxml.jackson.databind.JsonMappingException + // * @throws IOException + // */ + + @Test + public void nestedDocSchemaFromJsonFileTest() throws JsonParseException, JsonMappingException, IOException { + + // Import our json format document schema from a file. + File schemaFile = new File(NESTED_DOC_SCHEMA_JSON); + String fileString = TestUtils.readFileToString(schemaFile); + + // Unmarshall that to a Java POJO + ObjectMapper mapper = new ObjectMapper(); + DocumentSchema docSchema = mapper.readValue(schemaFile, DocumentSchema.class); + + String jsonString = mapper.writeValueAsString(docSchema); + + // Assert that the raw JSON that we read from the file matches the marshalled + // JSON we generated from our Java object (ie: validate that we didn't lose + // anything going in either direction). + assertTrue("Marshalled object does not match the original json source that produced it", + fileString.equals(jsonString)); + } +} diff --git a/src/test/java/org/onap/aai/sa/rest/DocumentTest.java b/src/test/java/org/onap/aai/sa/rest/DocumentTest.java index efff07b..9fa5fe1 100644 --- a/src/test/java/org/onap/aai/sa/rest/DocumentTest.java +++ b/src/test/java/org/onap/aai/sa/rest/DocumentTest.java @@ -71,7 +71,7 @@ public class DocumentTest { DocumentApi documentApi; @Before - public void setUp(){ + public void setUp() { MockitoAnnotations.initMocks(this); documentApi = new DocumentApi(searchServiceApi); } @@ -80,14 +80,14 @@ public class DocumentTest { public void testDocumentClass_AllMethods() throws JsonProcessingException { Document doc = new Document(); doc.setField("name-1", "value-1"); - Assert.assertTrue(doc.getFields().size()==1); + Assert.assertTrue(doc.getFields().size() == 1); Assert.assertTrue(doc.toJson().contains("value-1")); Assert.assertNotNull(doc.toString()); Assert.assertTrue(doc.toString().contains("name-1")); } @Test - public void testProcessPost_NullContent(){ + public void testProcessPost_NullContent() { String transactionId = "transactionId-1"; String remoteAddr = "http://127.0.0.1"; String content = null; @@ -97,10 +97,10 @@ public class DocumentTest { Mockito.when(request.getMethod()).thenReturn("testMethod"); Mockito.when(request.getRequestURL()).thenReturn(new StringBuffer("http://127.0.0.1")); Mockito.when(request.getRemoteHost()).thenReturn("localhost"); - ResponseEntity response = documentApi.processPost(content, request, headers, httpResponse, "index", - documentStore); + ResponseEntity response = + documentApi.processPost(content, request, headers, httpResponse, "index", documentStore); Assert.assertNotNull(response); - Assert.assertTrue( HttpStatus.BAD_REQUEST.value () == response.getStatusCodeValue ()); + Assert.assertTrue(HttpStatus.BAD_REQUEST.value() == response.getStatusCodeValue()); } @Test @@ -117,12 +117,13 @@ public class DocumentTest { Mockito.when(searchServiceApi.validateRequest(Mockito.any(HttpHeaders.class), Mockito.any(HttpServletRequest.class), Mockito.any(ApiUtils.Action.class), Mockito.anyString())) .thenThrow(IllegalArgumentException.class); - ResponseEntity response = documentApi.processPost(content, request, headers, httpResponse, "index", - documentStore); + ResponseEntity response = + documentApi.processPost(content, request, headers, httpResponse, "index", documentStore); Assert.assertNotNull(response); - Assert.assertTrue(HttpStatus.FORBIDDEN.value () == response.getStatusCodeValue ()); + Assert.assertTrue(HttpStatus.FORBIDDEN.value() == response.getStatusCodeValue()); } -// + + // @Test public void testProcessPost_ValidRequest() throws Exception { String transactionId = "transactionId-1"; @@ -144,12 +145,13 @@ public class DocumentTest { Mockito.when(documentStore.createDocument(Mockito.anyString(), Mockito.any(DocumentStoreDataEntity.class), Mockito.anyBoolean())).thenReturn(result); Mockito.doNothing().when(httpResponse).setHeader(Mockito.anyString(), Mockito.anyString()); - ResponseEntity response = documentApi.processPost(content, request, headers, httpResponse, "index", - documentStore); + ResponseEntity response = + documentApi.processPost(content, request, headers, httpResponse, "index", documentStore); Assert.assertNotNull(response); - Assert.assertTrue(HttpStatus.INTERNAL_SERVER_ERROR.value () == response.getStatusCodeValue ()); + Assert.assertTrue(HttpStatus.INTERNAL_SERVER_ERROR.value() == response.getStatusCodeValue()); } -// + + // @Test public void testProcessSearchWithGet_Created() throws Exception { String transactionId = "transactionId-1"; @@ -170,13 +172,14 @@ public class DocumentTest { Mockito.any(HttpServletRequest.class), Mockito.any(ApiUtils.Action.class), Mockito.anyString())) .thenReturn(true); Mockito.when(documentStore.search(Mockito.anyString(), Mockito.anyString())).thenReturn(result); - ResponseEntityresponse = documentApi.processSearchWithGet(content, request, headers, "index-1", - "query-text", documentStore); + ResponseEntity response = + documentApi.processSearchWithGet(content, request, headers, "index-1", "query-text", documentStore); Assert.assertNotNull(response); Assert.assertTrue(HttpStatus.CREATED.value() == response.getStatusCodeValue()); } -// + + // @Test public void testProcessSearchWithGet_ValidateThrowsException() throws Exception { String transactionId = "transactionId-1"; @@ -197,13 +200,14 @@ public class DocumentTest { Mockito.any(HttpServletRequest.class), Mockito.any(ApiUtils.Action.class), Mockito.anyString())) .thenThrow(IllegalArgumentException.class); Mockito.when(documentStore.search(Mockito.anyString(), Mockito.anyString())).thenReturn(result); - ResponseEntityresponse = documentApi.processSearchWithGet(content, request, headers, "index-1", - "query-text", documentStore); + ResponseEntity response = + documentApi.processSearchWithGet(content, request, headers, "index-1", "query-text", documentStore); Assert.assertNotNull(response); Assert.assertTrue(HttpStatus.FORBIDDEN.value() == response.getStatusCodeValue()); } -// + + // @Test public void testProcessSearchWithGet_ValidateIsFalse() throws Exception { String transactionId = "transactionId-1"; @@ -224,8 +228,8 @@ public class DocumentTest { Mockito.any(HttpServletRequest.class), Mockito.any(ApiUtils.Action.class), Mockito.anyString())) .thenReturn(false); Mockito.when(documentStore.search(Mockito.anyString(), Mockito.anyString())).thenReturn(result); - ResponseEntityresponse = documentApi.processSearchWithGet(content, request, headers, "index-1", - "query-text", documentStore); + ResponseEntity response = + documentApi.processSearchWithGet(content, request, headers, "index-1", "query-text", documentStore); Assert.assertNotNull(response); Assert.assertTrue(HttpStatus.FORBIDDEN.value() == response.getStatusCodeValue()); @@ -251,15 +255,15 @@ public class DocumentTest { Mockito.any(HttpServletRequest.class), Mockito.any(ApiUtils.Action.class), Mockito.anyString())) .thenReturn(true); Mockito.when(documentStore.search(Mockito.anyString(), Mockito.anyString())).thenReturn(result); - ResponseEntityresponse = documentApi.processSearchWithGet(content, request, headers, "index-1", - "query-text", documentStore); + ResponseEntity response = + documentApi.processSearchWithGet(content, request, headers, "index-1", "query-text", documentStore); Assert.assertNotNull(response); Assert.assertTrue(HttpStatus.FOUND.value() == response.getStatusCodeValue()); } @Test - public void testProcessPut_NullContent(){ + public void testProcessPut_NullContent() { String transactionId = "transactionId-1"; String remoteAddr = "http://127.0.0.1"; String content = null; @@ -269,8 +273,8 @@ public class DocumentTest { Mockito.when(request.getMethod()).thenReturn("testMethod"); Mockito.when(request.getRequestURL()).thenReturn(new StringBuffer("http://127.0.0.1")); Mockito.when(request.getRemoteHost()).thenReturn("localhost"); - ResponseEntityresponse = documentApi.processPut(content, request, headers, httpResponse, "index","id-1", - documentStore); + ResponseEntity response = + documentApi.processPut(content, request, headers, httpResponse, "index", "id-1", documentStore); Assert.assertNotNull(response); Assert.assertTrue(HttpStatus.BAD_REQUEST.value() == response.getStatusCodeValue()); } @@ -289,8 +293,8 @@ public class DocumentTest { Mockito.when(searchServiceApi.validateRequest(Mockito.any(HttpHeaders.class), Mockito.any(HttpServletRequest.class), Mockito.any(ApiUtils.Action.class), Mockito.anyString())) .thenThrow(IllegalArgumentException.class); - ResponseEntityresponse = documentApi.processPut(content, request, headers, httpResponse, "index","id-1", - documentStore); + ResponseEntity response = + documentApi.processPut(content, request, headers, httpResponse, "index", "id-1", documentStore); Assert.assertNotNull(response); Assert.assertTrue(HttpStatus.FORBIDDEN.value() == response.getStatusCodeValue()); } @@ -309,8 +313,8 @@ public class DocumentTest { Mockito.when(searchServiceApi.validateRequest(Mockito.any(HttpHeaders.class), Mockito.any(HttpServletRequest.class), Mockito.any(ApiUtils.Action.class), Mockito.anyString())) .thenReturn(false); - ResponseEntityresponse = documentApi.processPut(content, request, headers, httpResponse, "index","id-1", - documentStore); + ResponseEntity response = + documentApi.processPut(content, request, headers, httpResponse, "index", "id-1", documentStore); Assert.assertNotNull(response); Assert.assertTrue(HttpStatus.FORBIDDEN.value() == response.getStatusCodeValue()); } @@ -336,8 +340,8 @@ public class DocumentTest { .thenReturn(true); Mockito.when(documentStore.updateDocument(Mockito.anyString(), Mockito.any(DocumentStoreDataEntity.class), Mockito.anyBoolean())).thenReturn(result); - ResponseEntityresponse = documentApi.processPut(content, request, headers, httpResponse, "index","id-1", - documentStore); + ResponseEntity response = + documentApi.processPut(content, request, headers, httpResponse, "index", "id-1", documentStore); Assert.assertNotNull(response); Assert.assertTrue(HttpStatus.FOUND.value() == response.getStatusCodeValue()); } @@ -356,8 +360,8 @@ public class DocumentTest { Mockito.when(searchServiceApi.validateRequest(Mockito.any(HttpHeaders.class), Mockito.any(HttpServletRequest.class), Mockito.any(ApiUtils.Action.class), Mockito.anyString())) .thenThrow(IllegalArgumentException.class); - ResponseEntityresponse = documentApi.processDelete(content, request, headers, httpResponse, "index","id-1", - documentStore); + ResponseEntity response = + documentApi.processDelete(content, request, headers, httpResponse, "index", "id-1", documentStore); Assert.assertNotNull(response); Assert.assertTrue(HttpStatus.FORBIDDEN.value() == response.getStatusCodeValue()); } @@ -376,8 +380,8 @@ public class DocumentTest { Mockito.when(searchServiceApi.validateRequest(Mockito.any(HttpHeaders.class), Mockito.any(HttpServletRequest.class), Mockito.any(ApiUtils.Action.class), Mockito.anyString())) .thenReturn(false); - ResponseEntityresponse = documentApi.processDelete(content, request, headers, httpResponse, "index","id-1", - documentStore); + ResponseEntity response = + documentApi.processDelete(content, request, headers, httpResponse, "index", "id-1", documentStore); Assert.assertNotNull(response); Assert.assertTrue(HttpStatus.FORBIDDEN.value() == response.getStatusCodeValue()); } @@ -403,8 +407,8 @@ public class DocumentTest { .thenReturn(true); Mockito.when(documentStore.deleteDocument(Mockito.anyString(), Mockito.any(DocumentStoreDataEntity.class))) .thenReturn(result); - ResponseEntityresponse = documentApi.processDelete(content, request, headers, httpResponse, "index","id-1", - documentStore); + ResponseEntity response = + documentApi.processDelete(content, request, headers, httpResponse, "index", "id-1", documentStore); Assert.assertNotNull(response); Assert.assertTrue(HttpStatus.FOUND.value() == response.getStatusCodeValue()); } @@ -423,8 +427,8 @@ public class DocumentTest { Mockito.when(searchServiceApi.validateRequest(Mockito.any(HttpHeaders.class), Mockito.any(HttpServletRequest.class), Mockito.any(ApiUtils.Action.class), Mockito.anyString())) .thenThrow(IllegalArgumentException.class); - ResponseEntityresponse = documentApi.processGet(content, request, headers, httpResponse, "index","id-1", - documentStore); + ResponseEntity response = + documentApi.processGet(content, request, headers, httpResponse, "index", "id-1", documentStore); Assert.assertNotNull(response); Assert.assertTrue(HttpStatus.FORBIDDEN.value() == response.getStatusCodeValue()); } @@ -443,8 +447,8 @@ public class DocumentTest { Mockito.when(searchServiceApi.validateRequest(Mockito.any(HttpHeaders.class), Mockito.any(HttpServletRequest.class), Mockito.any(ApiUtils.Action.class), Mockito.anyString())) .thenReturn(false); - ResponseEntityresponse = documentApi.processGet(content, request, headers, httpResponse, "index","id-1", - documentStore); + ResponseEntity response = + documentApi.processGet(content, request, headers, httpResponse, "index", "id-1", documentStore); Assert.assertNotNull(response); Assert.assertTrue(HttpStatus.FORBIDDEN.value() == response.getStatusCodeValue()); } @@ -469,14 +473,14 @@ public class DocumentTest { .thenReturn(true); Mockito.when(documentStore.getDocument(Mockito.anyString(), Mockito.any(DocumentStoreDataEntity.class))) .thenReturn(result); - ResponseEntityresponse = documentApi.processGet(content, request, headers, httpResponse, "index","id-1", - documentStore); + ResponseEntity response = + documentApi.processGet(content, request, headers, httpResponse, "index", "id-1", documentStore); Assert.assertNotNull(response); Assert.assertTrue(HttpStatus.FOUND.value() == response.getStatusCodeValue()); } @Test - public void testQueryWithGetWithPayload_NullContent(){ + public void testQueryWithGetWithPayload_NullContent() { String transactionId = "transactionId-1"; String remoteAddr = "http://127.0.0.1"; String content = null; @@ -486,8 +490,8 @@ public class DocumentTest { Mockito.when(request.getMethod()).thenReturn("testMethod"); Mockito.when(request.getRequestURL()).thenReturn(new StringBuffer("http://127.0.0.1")); Mockito.when(request.getRemoteHost()).thenReturn("localhost"); - ResponseEntityresponse = documentApi.queryWithGetWithPayload(content, request, headers, "index-1", - documentStore); + ResponseEntity response = + documentApi.queryWithGetWithPayload(content, request, headers, "index-1", documentStore); Assert.assertNotNull(response); Assert.assertTrue(HttpStatus.BAD_REQUEST.value() == response.getStatusCodeValue()); } @@ -506,8 +510,8 @@ public class DocumentTest { Mockito.when(searchServiceApi.validateRequest(Mockito.any(HttpHeaders.class), Mockito.any(HttpServletRequest.class), Mockito.any(ApiUtils.Action.class), Mockito.anyString())) .thenThrow(IllegalArgumentException.class); - ResponseEntityresponse = documentApi.queryWithGetWithPayload(content, request, headers, "index-1", - documentStore); + ResponseEntity response = + documentApi.queryWithGetWithPayload(content, request, headers, "index-1", documentStore); Assert.assertNotNull(response); Assert.assertTrue(HttpStatus.FORBIDDEN.value() == response.getStatusCodeValue()); } @@ -526,8 +530,8 @@ public class DocumentTest { Mockito.when(searchServiceApi.validateRequest(Mockito.any(HttpHeaders.class), Mockito.any(HttpServletRequest.class), Mockito.any(ApiUtils.Action.class), Mockito.anyString())) .thenReturn(false); - ResponseEntityresponse = documentApi.queryWithGetWithPayload(content, request, headers, "index-1", - documentStore); + ResponseEntity response = + documentApi.queryWithGetWithPayload(content, request, headers, "index-1", documentStore); Assert.assertNotNull(response); Assert.assertTrue(HttpStatus.FORBIDDEN.value() == response.getStatusCodeValue()); } @@ -545,8 +549,8 @@ public class DocumentTest { Mockito.when(searchServiceApi.validateRequest(Mockito.any(HttpHeaders.class), Mockito.any(HttpServletRequest.class), Mockito.any(ApiUtils.Action.class), Mockito.anyString())) .thenReturn(false); - ResponseEntityresponse = indexApi.processCreateIndex("document-1", request, headers, "index-1", - documentStore); + ResponseEntity response = + indexApi.processCreateIndex("document-1", request, headers, "index-1", documentStore); Assert.assertNotNull(response); Assert.assertTrue(HttpStatus.FORBIDDEN.value() == response.getStatusCodeValue()); } @@ -564,8 +568,8 @@ public class DocumentTest { Mockito.when(searchServiceApi.validateRequest(Mockito.any(HttpHeaders.class), Mockito.any(HttpServletRequest.class), Mockito.any(ApiUtils.Action.class), Mockito.anyString())) .thenThrow(IllegalArgumentException.class); - ResponseEntityresponse = indexApi.processCreateIndex("document-1", request, headers, "index-1", - documentStore); + ResponseEntity response = + indexApi.processCreateIndex("document-1", request, headers, "index-1", documentStore); Assert.assertNotNull(response); Assert.assertTrue(HttpStatus.FORBIDDEN.value() == response.getStatusCodeValue()); } @@ -574,7 +578,7 @@ public class DocumentTest { public void testCreateProcessIndex_IndexApi_NullDocument() throws Exception { String transactionId = "transactionId-1"; String remoteAddr = "http://127.0.0.1"; - String documentSchema= null; + String documentSchema = null; // Mockito.when(headers.getRequestHeaders()).thenReturn(multivaluedMap);; Mockito.when(multivaluedMap.getFirst(Mockito.anyString())).thenReturn(transactionId); Mockito.when(request.getRemoteAddr()).thenReturn(remoteAddr); @@ -584,8 +588,8 @@ public class DocumentTest { Mockito.when(searchServiceApi.validateRequest(Mockito.any(HttpHeaders.class), Mockito.any(HttpServletRequest.class), Mockito.any(ApiUtils.Action.class), Mockito.anyString())) .thenReturn(true); - ResponseEntityresponse = indexApi.processCreateIndex(documentSchema, request, headers, "index-1", - documentStore); + ResponseEntity response = + indexApi.processCreateIndex(documentSchema, request, headers, "index-1", documentStore); Assert.assertNotNull(response); Assert.assertTrue(HttpStatus.INTERNAL_SERVER_ERROR.value() == response.getStatusCodeValue()); } @@ -603,7 +607,7 @@ public class DocumentTest { Mockito.when(searchServiceApi.validateRequest(Mockito.any(HttpHeaders.class), Mockito.any(HttpServletRequest.class), Mockito.any(ApiUtils.Action.class), Mockito.anyString())) .thenReturn(false); - ResponseEntityresponse = indexApi.processDelete("document-1", request, headers, documentStore); + ResponseEntity response = indexApi.processDelete("document-1", request, headers, documentStore); Assert.assertNotNull(response); Assert.assertTrue(HttpStatus.FORBIDDEN.value() == response.getStatusCodeValue()); } @@ -621,7 +625,7 @@ public class DocumentTest { Mockito.when(searchServiceApi.validateRequest(Mockito.any(HttpHeaders.class), Mockito.any(HttpServletRequest.class), Mockito.any(ApiUtils.Action.class), Mockito.anyString())) .thenThrow(IllegalArgumentException.class); - ResponseEntityresponse = indexApi.processDelete("document-1", request, headers, documentStore); + ResponseEntity response = indexApi.processDelete("document-1", request, headers, documentStore); Assert.assertNotNull(response); Assert.assertTrue(HttpStatus.FORBIDDEN.value() == response.getStatusCodeValue()); } @@ -640,7 +644,7 @@ public class DocumentTest { Mockito.any(HttpServletRequest.class), Mockito.any(ApiUtils.Action.class), Mockito.anyString())) .thenReturn(true); Mockito.when(documentStore.deleteIndex(Mockito.anyString())).thenThrow(DocumentStoreOperationException.class); - ResponseEntityresponse = indexApi.processDelete("document-1", request, headers, documentStore); + ResponseEntity response = indexApi.processDelete("document-1", request, headers, documentStore); Assert.assertNotNull(response); Assert.assertTrue(HttpStatus.INTERNAL_SERVER_ERROR.value() == response.getStatusCodeValue()); } diff --git a/src/test/java/org/onap/aai/sa/rest/IndexApiTest.java b/src/test/java/org/onap/aai/sa/rest/IndexApiTest.java index 0f5932b..cd33edd 100644 --- a/src/test/java/org/onap/aai/sa/rest/IndexApiTest.java +++ b/src/test/java/org/onap/aai/sa/rest/IndexApiTest.java @@ -50,238 +50,231 @@ import org.springframework.test.web.servlet.MvcResult; /** - * This suite of tests is intended to exercise the set of REST endpoints - * associated with manipulating Indexes in the document store. + * This suite of tests is intended to exercise the set of REST endpoints associated with manipulating Indexes in the + * document store. */ @RunWith(SpringRunner.class) @SpringBootTest @AutoConfigureMockMvc public class IndexApiTest { - private final String TOP_URI = "/test/indexes/"; - private final String SIMPLE_DOC_SCHEMA_JSON = "src/test/resources/json/simpleDocument.json"; - private final String DYNAMIC_INDEX_PAYLOAD = "src/test/resources/json/dynamicIndex.json"; - - @Autowired - private MockMvc mockMvc; - -// -// @Override -// protected Application configure() { -// -// // Make sure that our test endpoint is on the resource path -// // for Jersey Test. -// return new ResourceConfig(SearchServiceApiHarness.class); -// } -// -// - - @Before - public void setup() throws Exception { - System.setProperty("CONFIG_HOME", System.getProperty("user.dir")+ File.separator + "src/test/resources/json"); - } - - /** - * Tests the dynamic shcema creation flow that send the request - * JSON to the data store without any JSON validation against a schema - * - * @throws IOException - */ - @Test - public void createDynamicIndexTest() throws Exception { - String indexName = "super-ultra-dynamic-mega-index"; - String dynamicUri = TOP_URI + "dynamic/"; - File indexFile = new File(DYNAMIC_INDEX_PAYLOAD); - String indexPayload = TestUtils.readFileToString(indexFile); - -// String result = target(dynamicUri + indexName).request().put(Entity.json(indexPayload), String.class); - MvcResult result = this.mockMvc.perform ( put (dynamicUri + indexName) - .contentType ( MediaType.APPLICATION_JSON ).content ( indexPayload )).andReturn (); - - assertEquals(indexPayload, result.getResponse ().getContentAsString ()); - } - - - /** - * This test validates that the {@link IndexApi} is able to convert {@link OperationResult} - * obects to standard REST {@link ResponseEntity} objects. - * - * @throws FileNotFoundException - * @throws IOException - * @throws DocumentStoreOperationException - */ - @Test - public void responseFromOperationResultTest() throws FileNotFoundException, IOException, DocumentStoreOperationException { - - int SUCCESS_RESULT_CODE = 200; - String SUCCESS_RESULT_STRING = "Everything is ay-okay!"; - int FAILURE_RESULT_CODE = 500; - String FAILURE_CAUSE_STRING = "Something went wrong!"; - - - // Create an instance of the index API endpoint that we will test against. - // We will override the init() method because we don't want it to try to - // connect to a real document store. - IndexApi indexApi = new IndexApi(new SearchServiceApiHarness()) { - @Override - public void init() { /* do nothing */ } - }; -// - //Construct an OperationResult instance with a success code and string. - OperationResult successResult = new OperationResult(); - successResult.setResultCode(SUCCESS_RESULT_CODE); - successResult.setResult(SUCCESS_RESULT_STRING); - - // Convert our success OperationResult to a standard REST Response... - ResponseEntity successResponse = indexApi.responseFromOperationResult(successResult); - - // ...and validate that the Response is correctly populated. - assertEquals("Unexpected result code", SUCCESS_RESULT_CODE, successResponse.getStatusCodeValue ()); - assertTrue("Incorrect result string", ((String) successResponse.getBody ()).equals(SUCCESS_RESULT_STRING)); - - // Construct an OperationResult instance with an error code and failure - // cause. - OperationResult failureResult = new OperationResult(); - failureResult.setResultCode(FAILURE_RESULT_CODE); - failureResult.setFailureCause(FAILURE_CAUSE_STRING); - - // Convert our failure OperationResult to a standard REST Response... - ResponseEntity failureResponse = indexApi.responseFromOperationResult(failureResult); - - // ...and validate that the Response is correctly populated. - assertEquals("Unexpected result code", FAILURE_RESULT_CODE, failureResponse.getStatusCodeValue ()); - assertTrue("Incorrect result string", ((String) failureResponse.getBody ()).equals(FAILURE_CAUSE_STRING)); - } -// -// -// /** -// * This test validates the behaviour of the 'Create Index' POST request -// * endpoint. -// * -// * @throws IOException -// */ - @Test - public void createIndexTest() throws Exception { - - String INDEX_NAME = "test-index"; - String EXPECTED_SETTINGS = - "{\"analysis\": " - + "{\"filter\": " - + "{\"nGram_filter\": { " - + "\"type\": \"nGram\", " - + "\"min_gram\": 1, " - + "\"max_gram\": 50, " - + "\"token_chars\": [ \"letter\", \"digit\", \"punctuation\", \"symbol\" ]}}," - + "\"analyzer\": {" - + "\"nGram_analyzer\": " - + "{\"type\": \"custom\"," - + "\"tokenizer\": \"whitespace\"," - + "\"filter\": [\"lowercase\",\"asciifolding\",\"nGram_filter\"]}," - + "\"whitespace_analyzer\": " - + "{\"type\": \"custom\"," - + "\"tokenizer\": \"whitespace\"," - + "\"filter\": [\"lowercase\",\"asciifolding\"]}}}}"; - String EXPECTED_MAPPINGS = - "{\"dynamic_templates\":[{\"strings\":{\"match_mapping_type\":\"string\",\"match\":\"*\",\"mapping\":{\"type\":\"text\",\"fielddata\":true}}}]" - + ",\"properties\": {" - + "\"serverName\": {" - + "\"type\": \"string\", " - + "\"index\": \"analyzed\", " - + "\"search_analyzer\": \"whitespace\"}, " - + "\"serverComplex\": {" - + "\"type\": \"string\", " - + "\"search_analyzer\": \"whitespace\"}}}"; - - // Read a valid document schema from a json file. - File schemaFile = new File(SIMPLE_DOC_SCHEMA_JSON); - String documentJson = TestUtils.readFileToString(schemaFile); - - // Send a request to our 'create index' endpoint, using the schema - // which we just read. - // String result = target(TOP_URI + INDEX_NAME).request().put(Entity.json(documentJson), String.class); - MvcResult result = this.mockMvc.perform ( put ( TOP_URI + INDEX_NAME ).contentType ( MediaType.APPLICATION_JSON ) - .content ( documentJson) ).andReturn (); - - - // Our stub document store DAO returns the parameters that it was - // passed as the result string, so now we can validate that our - // endpoint invoked it with the correct parameters. - String[] tokenizedResult = result.getResponse ().getContentAsString ().split("@"); - assertTrue("Unexpected Index Name '" + tokenizedResult[0] + "' passed to doc store DAO", - tokenizedResult[0].equals(INDEX_NAME)); - assertTrue("Unexpected settings string '" + tokenizedResult[1] + "' passed to doc store DAO", - tokenizedResult[1].equals(EXPECTED_SETTINGS)); - assertTrue("Unexpected mappings string '" + tokenizedResult[2] + "' passed to doc store DAO", - tokenizedResult[2].equals(EXPECTED_MAPPINGS)); - } -// -// - /** - * This test validates that a 'create index' request with an improperly - * formatted document schema as the payload will result in an - * appropriate error being returned from the endpoint. - */ - @Test - public void createIndexWithMangledSchemaTest() throws Exception { - - String INDEX_NAME = "test-index"; - int BAD_REQUEST_CODE = 400; - - String invalidSchemaString = "this is definitely not json!"; - - // ResponseEntity result = target(TOP_URI + INDEX_NAME).request().put(Entity.json(invalidSchemaString), ResponseEntity.class); - MvcResult result = this.mockMvc.perform ( put ( TOP_URI + INDEX_NAME ).contentType ( MediaType.APPLICATION_JSON ) - .content ( invalidSchemaString) ).andReturn (); - - assertEquals("Invalid document schema should result in a 400 error", - BAD_REQUEST_CODE, result.getResponse ().getStatus ()); - } -// -// - /** - * This test validates the behaviour of the 'Delete Index' end point. - */ - @Test - public void deleteIndexTest() throws Exception { - - String INDEX_NAME = "test-index"; - - // Send a request to the 'delete index' endpoint. - // String result = target(TOP_URI + INDEX_NAME).request().delete(String.class); - - MvcResult result = this.mockMvc.perform ( delete ( TOP_URI + INDEX_NAME ) - .contentType ( MediaType.APPLICATION_JSON ) - .header ( "If-Match", "1" ) - .content ( "Some Json" ) ).andReturn ( ); - - // Validate that the expected parameters were passed to the document - // store DAO. - assertTrue("Unexpected index name '" + result.getResponse ().getContentAsString () + "' passed to doc store DAO", - result.getResponse ().getContentAsString ().equals(INDEX_NAME)); - } -// -// -// /** -// * This test validates that attempting to delete an index which does not -// * exist results in a 404 error. -// */ - @Test - public void deleteIndexDoesNotExistTest() throws Exception { - - int NOT_FOUND_CODE = 404; - - // Send a request to the 'delete index' endpoint, specifying a - // non-existent index. - // ResponseEntity result = target(TOP_URI + StubEsController.DOES_NOT_EXIST_INDEX).request().delete(ResponseEntity.class); - - MvcResult result = this.mockMvc.perform ( delete ( TOP_URI + StubEsController.DOES_NOT_EXIST_INDEX ) - .contentType ( MediaType.APPLICATION_JSON ) - .header ( "If-Match", "1" ) - .content ( "Some Json" ) ).andReturn ( ); - - - // Validate that a 404 error code is returned from the end point. - assertEquals("Deleting an index which does not exist should result in a 404 error", - NOT_FOUND_CODE, result.getResponse ().getStatus ()); - } + private final String TOP_URI = "/test/indexes/"; + private final String SIMPLE_DOC_SCHEMA_JSON = "src/test/resources/json/simpleDocument.json"; + private final String DYNAMIC_INDEX_PAYLOAD = "src/test/resources/json/dynamicIndex.json"; + + @Autowired + private MockMvc mockMvc; + + // + // @Override + // protected Application configure() { + // + // // Make sure that our test endpoint is on the resource path + // // for Jersey Test. + // return new ResourceConfig(SearchServiceApiHarness.class); + // } + // + // + + @Before + public void setup() throws Exception { + System.setProperty("CONFIG_HOME", System.getProperty("user.dir") + File.separator + "src/test/resources/json"); + } + + /** + * Tests the dynamic shcema creation flow that send the request JSON to the data store without any JSON validation + * against a schema + * + * @throws IOException + */ + @Test + public void createDynamicIndexTest() throws Exception { + String indexName = "super-ultra-dynamic-mega-index"; + String dynamicUri = TOP_URI + "dynamic/"; + File indexFile = new File(DYNAMIC_INDEX_PAYLOAD); + String indexPayload = TestUtils.readFileToString(indexFile); + + // String result = target(dynamicUri + indexName).request().put(Entity.json(indexPayload), String.class); + MvcResult result = this.mockMvc + .perform(put(dynamicUri + indexName).contentType(MediaType.APPLICATION_JSON).content(indexPayload)) + .andReturn(); + + assertEquals(indexPayload, result.getResponse().getContentAsString()); + } + + + /** + * This test validates that the {@link IndexApi} is able to convert {@link OperationResult} obects to standard REST + * {@link ResponseEntity} objects. + * + * @throws FileNotFoundException + * @throws IOException + * @throws DocumentStoreOperationException + */ + @Test + public void responseFromOperationResultTest() + throws FileNotFoundException, IOException, DocumentStoreOperationException { + + int SUCCESS_RESULT_CODE = 200; + String SUCCESS_RESULT_STRING = "Everything is ay-okay!"; + int FAILURE_RESULT_CODE = 500; + String FAILURE_CAUSE_STRING = "Something went wrong!"; + + + // Create an instance of the index API endpoint that we will test against. + // We will override the init() method because we don't want it to try to + // connect to a real document store. + IndexApi indexApi = new IndexApi(new SearchServiceApiHarness()) { + @Override + public void init() { /* do nothing */ } + }; + // + // Construct an OperationResult instance with a success code and string. + OperationResult successResult = new OperationResult(); + successResult.setResultCode(SUCCESS_RESULT_CODE); + successResult.setResult(SUCCESS_RESULT_STRING); + + // Convert our success OperationResult to a standard REST Response... + ResponseEntity successResponse = indexApi.responseFromOperationResult(successResult); + + // ...and validate that the Response is correctly populated. + assertEquals("Unexpected result code", SUCCESS_RESULT_CODE, successResponse.getStatusCodeValue()); + assertTrue("Incorrect result string", ((String) successResponse.getBody()).equals(SUCCESS_RESULT_STRING)); + + // Construct an OperationResult instance with an error code and failure + // cause. + OperationResult failureResult = new OperationResult(); + failureResult.setResultCode(FAILURE_RESULT_CODE); + failureResult.setFailureCause(FAILURE_CAUSE_STRING); + + // Convert our failure OperationResult to a standard REST Response... + ResponseEntity failureResponse = indexApi.responseFromOperationResult(failureResult); + + // ...and validate that the Response is correctly populated. + assertEquals("Unexpected result code", FAILURE_RESULT_CODE, failureResponse.getStatusCodeValue()); + assertTrue("Incorrect result string", ((String) failureResponse.getBody()).equals(FAILURE_CAUSE_STRING)); + } + + // + // + // /** + // * This test validates the behaviour of the 'Create Index' POST request + // * endpoint. + // * + // * @throws IOException + // */ + @Test + public void createIndexTest() throws Exception { + + String INDEX_NAME = "test-index"; + String EXPECTED_SETTINGS = "{\"analysis\": " + "{\"filter\": " + "{\"nGram_filter\": { " + + "\"type\": \"nGram\", " + "\"min_gram\": 1, " + "\"max_gram\": 50, " + + "\"token_chars\": [ \"letter\", \"digit\", \"punctuation\", \"symbol\" ]}}," + "\"analyzer\": {" + + "\"nGram_analyzer\": " + "{\"type\": \"custom\"," + "\"tokenizer\": \"whitespace\"," + + "\"filter\": [\"lowercase\",\"asciifolding\",\"nGram_filter\"]}," + "\"whitespace_analyzer\": " + + "{\"type\": \"custom\"," + "\"tokenizer\": \"whitespace\"," + + "\"filter\": [\"lowercase\",\"asciifolding\"]}}}}"; + String EXPECTED_MAPPINGS = + "{\"dynamic_templates\":[{\"strings\":{\"match_mapping_type\":\"string\",\"match\":\"*\",\"mapping\":{\"type\":\"text\",\"fielddata\":true}}}]" + + ",\"properties\": {" + "\"serverName\": {" + "\"type\": \"string\", " + + "\"index\": \"analyzed\", " + "\"search_analyzer\": \"whitespace\"}, " + + "\"serverComplex\": {" + "\"type\": \"string\", " + "\"search_analyzer\": \"whitespace\"}}}"; + + // Read a valid document schema from a json file. + File schemaFile = new File(SIMPLE_DOC_SCHEMA_JSON); + String documentJson = TestUtils.readFileToString(schemaFile); + + // Send a request to our 'create index' endpoint, using the schema + // which we just read. + // String result = target(TOP_URI + INDEX_NAME).request().put(Entity.json(documentJson), String.class); + MvcResult result = this.mockMvc + .perform(put(TOP_URI + INDEX_NAME).contentType(MediaType.APPLICATION_JSON).content(documentJson)) + .andReturn(); + + + // Our stub document store DAO returns the parameters that it was + // passed as the result string, so now we can validate that our + // endpoint invoked it with the correct parameters. + String[] tokenizedResult = result.getResponse().getContentAsString().split("@"); + assertTrue("Unexpected Index Name '" + tokenizedResult[0] + "' passed to doc store DAO", + tokenizedResult[0].equals(INDEX_NAME)); + assertTrue("Unexpected settings string '" + tokenizedResult[1] + "' passed to doc store DAO", + tokenizedResult[1].equals(EXPECTED_SETTINGS)); + assertTrue("Unexpected mappings string '" + tokenizedResult[2] + "' passed to doc store DAO", + tokenizedResult[2].equals(EXPECTED_MAPPINGS)); + } + + // + // + /** + * This test validates that a 'create index' request with an improperly formatted document schema as the payload + * will result in an appropriate error being returned from the endpoint. + */ + @Test + public void createIndexWithMangledSchemaTest() throws Exception { + + String INDEX_NAME = "test-index"; + int BAD_REQUEST_CODE = 400; + + String invalidSchemaString = "this is definitely not json!"; + + // ResponseEntity result = target(TOP_URI + INDEX_NAME).request().put(Entity.json(invalidSchemaString), + // ResponseEntity.class); + MvcResult result = this.mockMvc + .perform(put(TOP_URI + INDEX_NAME).contentType(MediaType.APPLICATION_JSON).content(invalidSchemaString)) + .andReturn(); + + assertEquals("Invalid document schema should result in a 400 error", BAD_REQUEST_CODE, + result.getResponse().getStatus()); + } + + // + // + /** + * This test validates the behaviour of the 'Delete Index' end point. + */ + @Test + public void deleteIndexTest() throws Exception { + + String INDEX_NAME = "test-index"; + + // Send a request to the 'delete index' endpoint. + // String result = target(TOP_URI + INDEX_NAME).request().delete(String.class); + + MvcResult result = this.mockMvc.perform(delete(TOP_URI + INDEX_NAME).contentType(MediaType.APPLICATION_JSON) + .header("If-Match", "1").content("Some Json")).andReturn(); + + // Validate that the expected parameters were passed to the document + // store DAO. + assertTrue("Unexpected index name '" + result.getResponse().getContentAsString() + "' passed to doc store DAO", + result.getResponse().getContentAsString().equals(INDEX_NAME)); + } + + // + // + // /** + // * This test validates that attempting to delete an index which does not + // * exist results in a 404 error. + // */ + @Test + public void deleteIndexDoesNotExistTest() throws Exception { + + int NOT_FOUND_CODE = 404; + + // Send a request to the 'delete index' endpoint, specifying a + // non-existent index. + // ResponseEntity result = target(TOP_URI + + // StubEsController.DOES_NOT_EXIST_INDEX).request().delete(ResponseEntity.class); + + MvcResult result = + this.mockMvc + .perform(delete(TOP_URI + StubEsController.DOES_NOT_EXIST_INDEX) + .contentType(MediaType.APPLICATION_JSON).header("If-Match", "1").content("Some Json")) + .andReturn(); + + + // Validate that a 404 error code is returned from the end point. + assertEquals("Deleting an index which does not exist should result in a 404 error", NOT_FOUND_CODE, + result.getResponse().getStatus()); + } } diff --git a/src/test/java/org/onap/aai/sa/rest/SearchServiceApiHarness.java b/src/test/java/org/onap/aai/sa/rest/SearchServiceApiHarness.java index 0621cd8..072b090 100644 --- a/src/test/java/org/onap/aai/sa/rest/SearchServiceApiHarness.java +++ b/src/test/java/org/onap/aai/sa/rest/SearchServiceApiHarness.java @@ -20,7 +20,7 @@ */ package org.onap.aai.sa.rest; - import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.http.HttpHeaders; import org.springframework.http.ResponseEntity; @@ -38,172 +38,128 @@ import org.springframework.web.bind.annotation.RestController; public class SearchServiceApiHarness extends SearchServiceApi { - public static final String FAIL_AUTHENTICATION_TRIGGER = "FAIL AUTHENTICATION"; - - private boolean authenticationShouldSucceed = true; - - - /** - * Performs all one-time initialization required for the end point. - */ - @Override - public void init() { - - // Instantiate our Document Store DAO. - documentStore = new StubEsController(); - } - - @Override - @RequestMapping (value="/indexes/dynamic/{index}", - method = RequestMethod.PUT, - consumes = { "application/json"}) - public ResponseEntity processCreateDynamicIndex(@RequestBody String requestBody, - HttpServletRequest request, - @RequestHeader HttpHeaders headers, - @PathVariable("index") String index) { - - return super.processCreateDynamicIndex(requestBody, request, headers, index); - } - - - @Override - @RequestMapping (value="/indexes/{index}", - method = RequestMethod.PUT, - consumes = { "application/json"}) - public ResponseEntity processCreateIndex(@RequestBody String requestBody, - HttpServletRequest request, - @RequestHeader HttpHeaders headers, - @PathVariable("index") String index) { - - return super.processCreateIndex(requestBody, request, headers, index); - } - - @Override - @RequestMapping (value="/indexes/{index}", - method = RequestMethod.DELETE, - consumes = { "application/json"}) - public ResponseEntity processDeleteIndex(HttpServletRequest request, - @RequestHeader HttpHeaders headers, - @PathVariable("index") String index) { - - return super.processDeleteIndex(request, headers, index); - } - - @Override - @RequestMapping (value="/indexes/{index}/documents/{id}", - method = RequestMethod.GET) - public ResponseEntity processGetDocument( - HttpServletRequest request, - HttpServletResponse httpResponse, - @RequestHeader HttpHeaders headers, - @PathVariable("index") String index, - @PathVariable("id") String id) { - - return super.processGetDocument(request, httpResponse, headers, index, id); - } - - @Override - @RequestMapping (value="/indexes/{index}/documents", - method = RequestMethod.POST, - consumes = { "application/json", "application/xml" }) - public ResponseEntity processCreateDocWithoutId(@RequestBody String requestBody, - HttpServletRequest request, - HttpServletResponse httpResponse, - @RequestHeader HttpHeaders headers, - @PathVariable("index") String index) { - - return super.processCreateDocWithoutId(requestBody, request, httpResponse, headers, index); - } - - @Override - @RequestMapping (value="/indexes/{index}/documents/{id}", - method = RequestMethod.PUT, - consumes = { "application/json", "application/xml" }) - public ResponseEntity processUpsertDoc(@RequestBody String requestBody, - HttpServletRequest request, - HttpServletResponse httpResponse, - @RequestHeader HttpHeaders headers, - @PathVariable("index") String index, - @PathVariable("id") String id) { - - return super.processUpsertDoc(requestBody, request, httpResponse, headers, index, id); - } - - @Override - @RequestMapping(value = "/indexes/{index}/documents/{id}", - method = RequestMethod.DELETE, - consumes = { "application/json"}) - public ResponseEntity processDeleteDoc(HttpServletRequest request, - HttpServletResponse httpResponse, - @RequestHeader HttpHeaders headers, - @PathVariable("index") String index, - @PathVariable("id") String id) { - - return super.processDeleteDoc(request, httpResponse, headers, index, id); - } - - @Override - @RequestMapping(value = "/indexes/{index}/query/{queryText}", - method = RequestMethod.GET) - public ResponseEntity processInlineQuery(HttpServletRequest request, - @RequestHeader HttpHeaders headers, - @PathVariable("index") String index, - @PathVariable("queryText") String queryText) { - - return super.processInlineQuery(request, headers, index, queryText); - } - - @Override - @RequestMapping(value = "/indexes/{index}/query", - method = RequestMethod.GET, - consumes = { "application/json"}) - public ResponseEntity processQueryWithGet(@RequestBody String requestBody, - HttpServletRequest request, - @RequestHeader HttpHeaders headers, - @PathVariable("index") String index) { - - return super.processQueryWithGet(requestBody, request, headers, index); - } - - @Override - @RequestMapping(value = "/indexes/{index}/query", - method = RequestMethod.POST, - consumes = { "application/json"}) - public ResponseEntity processQuery(@RequestBody String requestBody, - HttpServletRequest request, - @RequestHeader HttpHeaders headers, - @PathVariable("index") String index) { - - return super.processQuery(requestBody, request, headers, index); - } - - @Override - @RequestMapping(value = "/bulk", - method = RequestMethod.POST, - consumes = { "application/json"}, - produces = { "application/json"}) - public ResponseEntity processBulkRequest(@RequestBody String requestBody, - HttpServletRequest request, - @RequestHeader HttpHeaders headers) { - - // If the operations string contains a special keyword, set the - // harness to fail the authentication validation. - if (requestBody.contains(FAIL_AUTHENTICATION_TRIGGER)) { - authenticationShouldSucceed = false; + public static final String FAIL_AUTHENTICATION_TRIGGER = "FAIL AUTHENTICATION"; + + private boolean authenticationShouldSucceed = true; + + + /** + * Performs all one-time initialization required for the end point. + */ + @Override + public void init() { + + // Instantiate our Document Store DAO. + documentStore = new StubEsController(); + } + + @Override + @RequestMapping(value = "/indexes/dynamic/{index}", method = RequestMethod.PUT, consumes = {"application/json"}) + public ResponseEntity processCreateDynamicIndex(@RequestBody String requestBody, HttpServletRequest request, + @RequestHeader HttpHeaders headers, @PathVariable("index") String index) { + + return super.processCreateDynamicIndex(requestBody, request, headers, index); } - // Just pass the request up to the parent, since that is the code - // that we really want to test. - //return super.processPost(operations, request, headers, index); - return super.processBulkRequest(requestBody, request, headers); - } - @Override - protected boolean validateRequest(HttpHeaders headers, - HttpServletRequest req, - ApiUtils.Action action, - String authPolicyFunctionName) throws Exception { + @Override + @RequestMapping(value = "/indexes/{index}", method = RequestMethod.PUT, consumes = {"application/json"}) + public ResponseEntity processCreateIndex(@RequestBody String requestBody, HttpServletRequest request, + @RequestHeader HttpHeaders headers, @PathVariable("index") String index) { + + return super.processCreateIndex(requestBody, request, headers, index); + } + + @Override + @RequestMapping(value = "/indexes/{index}", method = RequestMethod.DELETE, consumes = {"application/json"}) + public ResponseEntity processDeleteIndex(HttpServletRequest request, @RequestHeader HttpHeaders headers, + @PathVariable("index") String index) { + + return super.processDeleteIndex(request, headers, index); + } + + @Override + @RequestMapping(value = "/indexes/{index}/documents/{id}", method = RequestMethod.GET) + public ResponseEntity processGetDocument(HttpServletRequest request, HttpServletResponse httpResponse, + @RequestHeader HttpHeaders headers, @PathVariable("index") String index, @PathVariable("id") String id) { + + return super.processGetDocument(request, httpResponse, headers, index, id); + } + + @Override + @RequestMapping(value = "/indexes/{index}/documents", method = RequestMethod.POST, + consumes = {"application/json", "application/xml"}) + public ResponseEntity processCreateDocWithoutId(@RequestBody String requestBody, HttpServletRequest request, + HttpServletResponse httpResponse, @RequestHeader HttpHeaders headers, @PathVariable("index") String index) { + + return super.processCreateDocWithoutId(requestBody, request, httpResponse, headers, index); + } + + @Override + @RequestMapping(value = "/indexes/{index}/documents/{id}", method = RequestMethod.PUT, + consumes = {"application/json", "application/xml"}) + public ResponseEntity processUpsertDoc(@RequestBody String requestBody, HttpServletRequest request, + HttpServletResponse httpResponse, @RequestHeader HttpHeaders headers, @PathVariable("index") String index, + @PathVariable("id") String id) { - return authenticationShouldSucceed; - } + return super.processUpsertDoc(requestBody, request, httpResponse, headers, index, id); + } + + @Override + @RequestMapping(value = "/indexes/{index}/documents/{id}", method = RequestMethod.DELETE, + consumes = {"application/json"}) + public ResponseEntity processDeleteDoc(HttpServletRequest request, HttpServletResponse httpResponse, + @RequestHeader HttpHeaders headers, @PathVariable("index") String index, @PathVariable("id") String id) { + + return super.processDeleteDoc(request, httpResponse, headers, index, id); + } + + @Override + @RequestMapping(value = "/indexes/{index}/query/{queryText}", method = RequestMethod.GET) + public ResponseEntity processInlineQuery(HttpServletRequest request, @RequestHeader HttpHeaders headers, + @PathVariable("index") String index, @PathVariable("queryText") String queryText) { + + return super.processInlineQuery(request, headers, index, queryText); + } + + @Override + @RequestMapping(value = "/indexes/{index}/query", method = RequestMethod.GET, consumes = {"application/json"}) + public ResponseEntity processQueryWithGet(@RequestBody String requestBody, HttpServletRequest request, + @RequestHeader HttpHeaders headers, @PathVariable("index") String index) { + + return super.processQueryWithGet(requestBody, request, headers, index); + } + + @Override + @RequestMapping(value = "/indexes/{index}/query", method = RequestMethod.POST, consumes = {"application/json"}) + public ResponseEntity processQuery(@RequestBody String requestBody, HttpServletRequest request, + @RequestHeader HttpHeaders headers, @PathVariable("index") String index) { + + return super.processQuery(requestBody, request, headers, index); + } + + @Override + @RequestMapping(value = "/bulk", method = RequestMethod.POST, consumes = {"application/json"}, + produces = {"application/json"}) + public ResponseEntity processBulkRequest(@RequestBody String requestBody, HttpServletRequest request, + @RequestHeader HttpHeaders headers) { + + // If the operations string contains a special keyword, set the + // harness to fail the authentication validation. + if (requestBody.contains(FAIL_AUTHENTICATION_TRIGGER)) { + authenticationShouldSucceed = false; + } + + // Just pass the request up to the parent, since that is the code + // that we really want to test. + // return super.processPost(operations, request, headers, index); + return super.processBulkRequest(requestBody, request, headers); + } + + @Override + protected boolean validateRequest(HttpHeaders headers, HttpServletRequest req, ApiUtils.Action action, + String authPolicyFunctionName) throws Exception { + + return authenticationShouldSucceed; + } } diff --git a/src/test/java/org/onap/aai/sa/rest/StubEsController.java b/src/test/java/org/onap/aai/sa/rest/StubEsController.java index 0472283..14a7534 100644 --- a/src/test/java/org/onap/aai/sa/rest/StubEsController.java +++ b/src/test/java/org/onap/aai/sa/rest/StubEsController.java @@ -36,242 +36,235 @@ import org.onap.aai.sa.searchdbabstraction.entity.SearchOperationResult; import org.onap.aai.sa.searchdbabstraction.util.DocumentSchemaUtil; /** - * This class implements a stubbed version of the document store DAO so - * that we can run unit tests without trying to connect to a real - * document store. + * This class implements a stubbed version of the document store DAO so that we can run unit tests without trying to + * connect to a real document store. */ public class StubEsController implements DocumentStoreInterface { - public static final String DOES_NOT_EXIST_INDEX = "index-does-not-exist"; + public static final String DOES_NOT_EXIST_INDEX = "index-does-not-exist"; - private AnalysisConfiguration analysisConfig = null; + private AnalysisConfiguration analysisConfig = null; - /** - * - */ - //private IndexAPIHarness indexAPIHarness; + /** + * + */ + // private IndexAPIHarness indexAPIHarness; + + StubEsController() { + analysisConfig = new AnalysisConfiguration(); + analysisConfig.init("src/test/resources/json/filter-config.json", + "src/test/resources/json/analysis-config.json"); + } - StubEsController() { - analysisConfig = new AnalysisConfiguration(); - analysisConfig.init("src/test/resources/json/filter-config.json", - "src/test/resources/json/analysis-config.json"); - } + @Override + public OperationResult createIndex(String index, DocumentSchema documentSchema) { - @Override - public OperationResult createIndex(String index, - DocumentSchema documentSchema) { + // Just return an OK result, with the parameters that we were passed + // bundled in the response string. This allows unit tests to validate + // that those parameters match what they expected to be passed. + OperationResult opResult = new OperationResult(); + opResult.setResultCode(200); - // Just return an OK result, with the parameters that we were passed - // bundled in the response string. This allows unit tests to validate - // that those parameters match what they expected to be passed. - OperationResult opResult = new OperationResult(); - opResult.setResultCode(200); + try { + opResult.setResult(index + "@" + analysisConfig.getEsIndexSettings() + "@" + + DocumentSchemaUtil.generateDocumentMappings(documentSchema)); + } catch (IOException e) { + e.printStackTrace(); + } - try { - opResult.setResult(index + "@" + analysisConfig.getEsIndexSettings() + "@" - + DocumentSchemaUtil.generateDocumentMappings(documentSchema)); - } catch (IOException e) { - e.printStackTrace(); - } + return opResult; + } - return opResult; - } + @Override + public OperationResult createDynamicIndex(String index, String dynamicSchema) { + OperationResult opResult = new OperationResult(); + opResult.setResultCode(200); + // Directly return the json as this flow should not edit the json in any way + opResult.setResult(dynamicSchema); + return opResult; + } - @Override - public OperationResult createDynamicIndex(String index, String dynamicSchema) { - OperationResult opResult = new OperationResult(); - opResult.setResultCode(200); - // Directly return the json as this flow should not edit the json in any way - opResult.setResult(dynamicSchema); - return opResult; - } + @Override + public OperationResult deleteIndex(String indexName) throws DocumentStoreOperationException { - @Override - public OperationResult deleteIndex(String indexName) throws DocumentStoreOperationException { + OperationResult opResult = new OperationResult(); - OperationResult opResult = new OperationResult(); + if (indexName.equals(DOES_NOT_EXIST_INDEX)) { + opResult.setResultCode(404); + } else { + opResult.setResultCode(200); + opResult.setResult(indexName); + } - if (indexName.equals(DOES_NOT_EXIST_INDEX)) { - opResult.setResultCode(404); - } else { - opResult.setResultCode(200); - opResult.setResult(indexName); + return opResult; } - return opResult; - } - - @Override - public DocumentOperationResult createDocument(String indexName, - DocumentStoreDataEntity document, - boolean allowImplicitIndexCreation) - throws DocumentStoreOperationException { - - DocumentOperationResult opResult = buildSampleDocumentOperationResult(); - - if (indexName.equals(DOES_NOT_EXIST_INDEX)) { - opResult.setResultCode(404); - } else { - opResult.setResultCode(200); - String id = "dummy"; - if (document.getId() != null) { - id = document.getId(); - } - opResult.setResultVersion("1"); + @Override + public DocumentOperationResult createDocument(String indexName, DocumentStoreDataEntity document, + boolean allowImplicitIndexCreation) throws DocumentStoreOperationException { + + DocumentOperationResult opResult = buildSampleDocumentOperationResult(); + + if (indexName.equals(DOES_NOT_EXIST_INDEX)) { + opResult.setResultCode(404); + } else { + opResult.setResultCode(200); + String id = "dummy"; + if (document.getId() != null) { + id = document.getId(); + } + opResult.setResultVersion("1"); + } + + return opResult; } - return opResult; - } - - @Override - public DocumentOperationResult updateDocument(String indexName, - DocumentStoreDataEntity document, - boolean allowImplicitIndexCreation) - throws DocumentStoreOperationException { - - DocumentOperationResult opResult = buildSampleDocumentOperationResult(); - - if (indexName.equals(DOES_NOT_EXIST_INDEX)) { - opResult.setResultCode(404); - } else { - opResult.setResultCode(200); - String version = "1"; - if (document.getVersion() != null) { - version = String.valueOf(Integer.parseInt(document.getVersion()) + 1); - } - opResult.setResultVersion(version); + @Override + public DocumentOperationResult updateDocument(String indexName, DocumentStoreDataEntity document, + boolean allowImplicitIndexCreation) throws DocumentStoreOperationException { + + DocumentOperationResult opResult = buildSampleDocumentOperationResult(); + + if (indexName.equals(DOES_NOT_EXIST_INDEX)) { + opResult.setResultCode(404); + } else { + opResult.setResultCode(200); + String version = "1"; + if (document.getVersion() != null) { + version = String.valueOf(Integer.parseInt(document.getVersion()) + 1); + } + opResult.setResultVersion(version); + } + + return opResult; } - return opResult; - } - - @Override - public DocumentOperationResult deleteDocument(String indexName, - DocumentStoreDataEntity document) throws DocumentStoreOperationException { - DocumentOperationResult opResult = buildSampleDocumentOperationResult(); - - - if (indexName.equals(DOES_NOT_EXIST_INDEX)) { - opResult.setResultCode(404); - } else { - if (opResult.getDocument() != null) { - opResult.getDocument().setEtag(null); - opResult.getDocument().setUrl(null); - opResult.setResultVersion("1"); - } - opResult.setResultCode(200); - opResult.setResult(indexName + "@" + document.getId()); - opResult.setResultVersion("1"); + @Override + public DocumentOperationResult deleteDocument(String indexName, DocumentStoreDataEntity document) + throws DocumentStoreOperationException { + DocumentOperationResult opResult = buildSampleDocumentOperationResult(); + + + if (indexName.equals(DOES_NOT_EXIST_INDEX)) { + opResult.setResultCode(404); + } else { + if (opResult.getDocument() != null) { + opResult.getDocument().setEtag(null); + opResult.getDocument().setUrl(null); + opResult.setResultVersion("1"); + } + opResult.setResultCode(200); + opResult.setResult(indexName + "@" + document.getId()); + opResult.setResultVersion("1"); + } + + return opResult; } - return opResult; - } - - @Override - public DocumentOperationResult getDocument(String indexName, - DocumentStoreDataEntity document) throws DocumentStoreOperationException { - DocumentOperationResult opResult = buildSampleDocumentOperationResult(); - - if (indexName.equals(DOES_NOT_EXIST_INDEX)) { - opResult.setResultCode(404); - // Adding it to make the tests pass. - opResult.setResultVersion ("1"); - } else { - opResult.setResultCode(200); - // Adding it to make the tests pass. - opResult.setResultVersion ("1"); + @Override + public DocumentOperationResult getDocument(String indexName, DocumentStoreDataEntity document) + throws DocumentStoreOperationException { + DocumentOperationResult opResult = buildSampleDocumentOperationResult(); + + if (indexName.equals(DOES_NOT_EXIST_INDEX)) { + opResult.setResultCode(404); + // Adding it to make the tests pass. + opResult.setResultVersion("1"); + } else { + opResult.setResultCode(200); + // Adding it to make the tests pass. + opResult.setResultVersion("1"); + } + + return opResult; } - return opResult; - } + @Override + public SearchOperationResult search(String indexName, String queryText) throws DocumentStoreOperationException { - @Override - public SearchOperationResult search(String indexName, - String queryText) throws DocumentStoreOperationException { + SearchOperationResult opResult = buildSampleSearchOperationResult(); - SearchOperationResult opResult = buildSampleSearchOperationResult(); + if (indexName.equals(DOES_NOT_EXIST_INDEX)) { + opResult.setResultCode(404); + } else { + opResult.setResultCode(200); + opResult.setResult(indexName + "@" + queryText); + } - if (indexName.equals(DOES_NOT_EXIST_INDEX)) { - opResult.setResultCode(404); - } else { - opResult.setResultCode(200); - opResult.setResult(indexName + "@" + queryText); + return opResult; } - return opResult; - } + @Override + public SearchOperationResult searchWithPayload(String indexName, String query) + throws DocumentStoreOperationException { + SearchOperationResult opResult = buildSampleSearchOperationResult(); - @Override - public SearchOperationResult searchWithPayload(String indexName, - String query) throws DocumentStoreOperationException { - SearchOperationResult opResult = buildSampleSearchOperationResult(); + if (indexName.equals(DOES_NOT_EXIST_INDEX)) { + opResult.setResultCode(404); + } else { + opResult.setResultCode(200); + opResult.setResult(indexName + "@" + query); + } - if (indexName.equals(DOES_NOT_EXIST_INDEX)) { - opResult.setResultCode(404); - } else { - opResult.setResultCode(200); - opResult.setResult(indexName + "@" + query); + return opResult; } - return opResult; - } + @Override + public SearchOperationResult suggestionQueryWithPayload(String indexName, String query) + throws DocumentStoreOperationException { + SearchOperationResult opResult = new SearchOperationResult(); - @Override - public SearchOperationResult suggestionQueryWithPayload(String indexName, String query) - throws DocumentStoreOperationException { - SearchOperationResult opResult = new SearchOperationResult(); + if (indexName.equals(DOES_NOT_EXIST_INDEX)) { + opResult.setResultCode(404); + } else { + opResult.setResultCode(200); + opResult.setResult(indexName + "@" + query); + } - if (indexName.equals(DOES_NOT_EXIST_INDEX)) { - opResult.setResultCode(404); - } else { - opResult.setResultCode(200); - opResult.setResult(indexName + "@" + query); + return opResult; } - return opResult; - } - - @Override - public OperationResult performBulkOperations(BulkRequest[] requests) throws DocumentStoreOperationException { + @Override + public OperationResult performBulkOperations(BulkRequest[] requests) throws DocumentStoreOperationException { - OperationResult opResult = new OperationResult(); - opResult.setResultCode(200); + OperationResult opResult = new OperationResult(); + opResult.setResultCode(200); - return opResult; - } + return opResult; + } - private DocumentOperationResult buildSampleDocumentOperationResult() { - DocumentOperationResult result = new DocumentOperationResult(); - Document doc = new Document(); - doc.setEtag("etag1"); + private DocumentOperationResult buildSampleDocumentOperationResult() { + DocumentOperationResult result = new DocumentOperationResult(); + Document doc = new Document(); + doc.setEtag("etag1"); - doc.setContent(new JSONObject()); - result.setDocument(doc); - return result; - } + doc.setContent(new JSONObject()); + result.setDocument(doc); + return result; + } - private SearchOperationResult buildSampleSearchOperationResult() { - SearchOperationResult result = new SearchOperationResult(); + private SearchOperationResult buildSampleSearchOperationResult() { + SearchOperationResult result = new SearchOperationResult(); - SearchHits searchHits = new SearchHits(); - SearchHit[] searchHitArray = new SearchHit[1]; - SearchHit searchHit = new SearchHit(); - Document doc = new Document(); - doc.setEtag("etag1"); - Map content = new HashMap(); - content.put("key1", "value1"); - doc.setContent(new JSONObject()); - searchHit.setDocument(doc); - searchHitArray[0] = searchHit; + SearchHits searchHits = new SearchHits(); + SearchHit[] searchHitArray = new SearchHit[1]; + SearchHit searchHit = new SearchHit(); + Document doc = new Document(); + doc.setEtag("etag1"); + Map content = new HashMap(); + content.put("key1", "value1"); + doc.setContent(new JSONObject()); + searchHit.setDocument(doc); + searchHitArray[0] = searchHit; - searchHits.setHits(searchHitArray); - searchHits.setTotalHits("1"); - result.setSearchResult(searchHits); + searchHits.setHits(searchHitArray); + searchHits.setTotalHits("1"); + result.setSearchResult(searchHits); - return result; + return result; - } + } -} \ No newline at end of file +} diff --git a/src/test/java/org/onap/aai/sa/rest/TestUtils.java b/src/test/java/org/onap/aai/sa/rest/TestUtils.java index 503e808..e990438 100644 --- a/src/test/java/org/onap/aai/sa/rest/TestUtils.java +++ b/src/test/java/org/onap/aai/sa/rest/TestUtils.java @@ -29,35 +29,34 @@ import java.io.IOException; public class TestUtils { - /** - * This helper method reads the contents of a file into a - * simple string. - * - * @param aFile - The file to be imported. - * - * @return - The file contents expressed as a simple string. - * - * @throws IOException - */ - public static String readFileToString(File aFile) throws IOException { + /** + * This helper method reads the contents of a file into a simple string. + * + * @param aFile - The file to be imported. + * + * @return - The file contents expressed as a simple string. + * + * @throws IOException + */ + public static String readFileToString(File aFile) throws IOException { - BufferedReader br = new BufferedReader(new FileReader(aFile)); - try { - StringBuilder sb = new StringBuilder(); - String line = br.readLine(); + BufferedReader br = new BufferedReader(new FileReader(aFile)); + try { + StringBuilder sb = new StringBuilder(); + String line = br.readLine(); - while (line != null) { - sb.append(line); - line = br.readLine(); - } + while (line != null) { + sb.append(line); + line = br.readLine(); + } - return sb.toString().replaceAll("\\s+", ""); - } finally { - try { - br.close(); - } catch (IOException e) { - fail("Unexpected IOException: " + e.getMessage()); - } + return sb.toString().replaceAll("\\s+", ""); + } finally { + try { + br.close(); + } catch (IOException e) { + fail("Unexpected IOException: " + e.getMessage()); + } + } } - } -} \ No newline at end of file +} diff --git a/src/test/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/config/ElasticSearchConfigTest.java b/src/test/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/config/ElasticSearchConfigTest.java index 8c4de81..b976f17 100644 --- a/src/test/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/config/ElasticSearchConfigTest.java +++ b/src/test/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/config/ElasticSearchConfigTest.java @@ -26,23 +26,24 @@ import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; + public class ElasticSearchConfigTest { @Autowired ElasticSearchConfig elasticSearchConfig; @Before - public void setUp(){ + public void setUp() { Properties prop = new Properties(); prop.put("es.cluster-name", "cluster-1"); prop.put("es.ip-address", "127.0.0.1"); prop.put("es.http-port", "9001"); -// elasticSearchConfig = new ElasticSearchConfig(prop); + // elasticSearchConfig = new ElasticSearchConfig(prop); } @Ignore @Test - public void testAllGetMethods(){ + public void testAllGetMethods() { Assert.assertEquals(elasticSearchConfig.getClusterName(), "cluster-1"); Assert.assertEquals(elasticSearchConfig.getIpAddress(), "127.0.0.1"); Assert.assertEquals(elasticSearchConfig.getHttpPort(), "9001"); diff --git a/src/test/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/AggregationResponseParsingTest.java b/src/test/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/AggregationResponseParsingTest.java index 61e64f5..fbc077d 100644 --- a/src/test/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/AggregationResponseParsingTest.java +++ b/src/test/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/AggregationResponseParsingTest.java @@ -31,69 +31,69 @@ import org.onap.aai.sa.searchdbabstraction.util.AggregationParsingUtil; public class AggregationResponseParsingTest { - @Test - public void testParseAggregationResponse() { - JSONParser parser = new JSONParser(); - JSONObject root; + @Test + public void testParseAggregationResponse() { + JSONParser parser = new JSONParser(); + JSONObject root; - String input = - "{\r\n \"aggregations\": {\r\n \"violations\": {\r\n \"doc_count\": 2,\r\n \"by_Timestamp\": {\r\n \"doc_count_error_upper_bound\": 0,\r\n \"sum_other_doc_count\": 0,\r\n \"buckets\": [\r\n {\r\n \"key\": 7199992,\r\n \"key_as_string\": \"Jan 1 1970 01:59:59\",\r\n \"doc_count\": 2\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n}"; + String input = + "{\r\n \"aggregations\": {\r\n \"violations\": {\r\n \"doc_count\": 2,\r\n \"by_Timestamp\": {\r\n \"doc_count_error_upper_bound\": 0,\r\n \"sum_other_doc_count\": 0,\r\n \"buckets\": [\r\n {\r\n \"key\": 7199992,\r\n \"key_as_string\": \"Jan 1 1970 01:59:59\",\r\n \"doc_count\": 2\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n}"; - try { - root = (JSONObject) parser.parse(input); - JSONObject aggregations = (JSONObject) root.get("aggregations"); - AggregationResult[] results = AggregationParsingUtil.parseAggregationResults(aggregations); - AggregationResults aggs = new AggregationResults(); - ObjectMapper mapper = new ObjectMapper(); - aggs.setAggregations(results); - System.out.println(mapper.setSerializationInclusion(Include.NON_NULL) - .writerWithDefaultPrettyPrinter().writeValueAsString(aggs)); - } catch (Exception e) { - e.printStackTrace(); + try { + root = (JSONObject) parser.parse(input); + JSONObject aggregations = (JSONObject) root.get("aggregations"); + AggregationResult[] results = AggregationParsingUtil.parseAggregationResults(aggregations); + AggregationResults aggs = new AggregationResults(); + ObjectMapper mapper = new ObjectMapper(); + aggs.setAggregations(results); + System.out.println(mapper.setSerializationInclusion(Include.NON_NULL).writerWithDefaultPrettyPrinter() + .writeValueAsString(aggs)); + } catch (Exception e) { + e.printStackTrace(); + } } - } - @Test - public void testParseAggregationResponse2() { - JSONParser parser = new JSONParser(); - JSONObject root; + @Test + public void testParseAggregationResponse2() { + JSONParser parser = new JSONParser(); + JSONObject root; - String input = - "{\r\n \"aggregations\": {\r\n \"entityType\": {\r\n \"doc_count_error_upper_bound\": 0,\r\n \"sum_other_doc_count\": 0,\r\n \"buckets\": [\r\n {\r\n \"key\": \"entity1\",\r\n \"doc_count\": 5,\r\n \"byVersion\": {\r\n \"doc_count_error_upper_bound\": 0,\r\n \"sum_other_doc_count\": 0,\r\n \"buckets\": [\r\n {\r\n \"key\": \"0\",\r\n \"doc_count\": 5\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n}"; + String input = + "{\r\n \"aggregations\": {\r\n \"entityType\": {\r\n \"doc_count_error_upper_bound\": 0,\r\n \"sum_other_doc_count\": 0,\r\n \"buckets\": [\r\n {\r\n \"key\": \"entity1\",\r\n \"doc_count\": 5,\r\n \"byVersion\": {\r\n \"doc_count_error_upper_bound\": 0,\r\n \"sum_other_doc_count\": 0,\r\n \"buckets\": [\r\n {\r\n \"key\": \"0\",\r\n \"doc_count\": 5\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n}"; - try { - root = (JSONObject) parser.parse(input); - JSONObject aggregations = (JSONObject) root.get("aggregations"); - AggregationResult[] results = AggregationParsingUtil.parseAggregationResults(aggregations); - AggregationResults aggs = new AggregationResults(); - ObjectMapper mapper = new ObjectMapper(); - aggs.setAggregations(results); - System.out.println(mapper.setSerializationInclusion(Include.NON_NULL) - .writerWithDefaultPrettyPrinter().writeValueAsString(aggs)); - } catch (Exception e) { - e.printStackTrace(); + try { + root = (JSONObject) parser.parse(input); + JSONObject aggregations = (JSONObject) root.get("aggregations"); + AggregationResult[] results = AggregationParsingUtil.parseAggregationResults(aggregations); + AggregationResults aggs = new AggregationResults(); + ObjectMapper mapper = new ObjectMapper(); + aggs.setAggregations(results); + System.out.println(mapper.setSerializationInclusion(Include.NON_NULL).writerWithDefaultPrettyPrinter() + .writeValueAsString(aggs)); + } catch (Exception e) { + e.printStackTrace(); + } } - } - @Test - public void testParseAggregationResponse3() { - JSONParser parser = new JSONParser(); - JSONObject root; + @Test + public void testParseAggregationResponse3() { + JSONParser parser = new JSONParser(); + JSONObject root; - String input = - "{\r\n \"aggregations\": {\r\n \"validateTimes\": {\r\n \"buckets\": [\r\n {\r\n \"key\": \"Jan 10 2017 21:6:6-Jan 24 2017 13:43:5\",\r\n \"from\": 1484082366000,\r\n \"from_as_string\": \"Jan 10 2017 21:6:6\",\r\n \"to\": 1485265385000,\r\n \"to_as_string\": \"Jan 24 2017 13:43:5\",\r\n \"doc_count\": 95\r\n },\r\n {\r\n \"key\": \"Feb 3 2017 18:27:39-*\",\r\n \"from\": 1486146459000,\r\n \"from_as_string\": \"Feb 3 2017 18:27:39\",\r\n \"doc_count\": 2\r\n }\r\n ]\r\n }\r\n }\r\n}"; + String input = + "{\r\n \"aggregations\": {\r\n \"validateTimes\": {\r\n \"buckets\": [\r\n {\r\n \"key\": \"Jan 10 2017 21:6:6-Jan 24 2017 13:43:5\",\r\n \"from\": 1484082366000,\r\n \"from_as_string\": \"Jan 10 2017 21:6:6\",\r\n \"to\": 1485265385000,\r\n \"to_as_string\": \"Jan 24 2017 13:43:5\",\r\n \"doc_count\": 95\r\n },\r\n {\r\n \"key\": \"Feb 3 2017 18:27:39-*\",\r\n \"from\": 1486146459000,\r\n \"from_as_string\": \"Feb 3 2017 18:27:39\",\r\n \"doc_count\": 2\r\n }\r\n ]\r\n }\r\n }\r\n}"; - try { - root = (JSONObject) parser.parse(input); - JSONObject aggregations = (JSONObject) root.get("aggregations"); - AggregationResult[] results = AggregationParsingUtil.parseAggregationResults(aggregations); - AggregationResults aggs = new AggregationResults(); - ObjectMapper mapper = new ObjectMapper(); - aggs.setAggregations(results); - System.out.println(mapper.setSerializationInclusion(Include.NON_NULL) - .writerWithDefaultPrettyPrinter().writeValueAsString(aggs)); - } catch (Exception e) { - e.printStackTrace(); + try { + root = (JSONObject) parser.parse(input); + JSONObject aggregations = (JSONObject) root.get("aggregations"); + AggregationResult[] results = AggregationParsingUtil.parseAggregationResults(aggregations); + AggregationResults aggs = new AggregationResults(); + ObjectMapper mapper = new ObjectMapper(); + aggs.setAggregations(results); + System.out.println(mapper.setSerializationInclusion(Include.NON_NULL).writerWithDefaultPrettyPrinter() + .writeValueAsString(aggs)); + } catch (Exception e) { + e.printStackTrace(); + } } - } } diff --git a/src/test/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchResultItemTest.java b/src/test/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchResultItemTest.java index 89e75cd..43203c9 100644 --- a/src/test/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchResultItemTest.java +++ b/src/test/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchResultItemTest.java @@ -26,7 +26,7 @@ import org.junit.Test; public class ElasticSearchResultItemTest { @Test - public void testAllMethods(){ + public void testAllMethods() { ElasticSearchShardStatus shardStatus = new ElasticSearchShardStatus(); shardStatus.setTotal(10); shardStatus.setSuccessful(0); @@ -51,7 +51,7 @@ public class ElasticSearchResultItemTest { error.setAdditionalProperties("name-1", "value-1"); Assert.assertNotNull(error.getAdditionalProperties()); - //Create Status + // Create Status ElasticSearchResultItem resultItem1 = new ElasticSearchResultItem(); resultItem1.setCreate(getStatus(shardStatus, error)); Assert.assertNotNull(resultItem1.getCreate()); @@ -60,7 +60,7 @@ public class ElasticSearchResultItemTest { Assert.assertTrue(resultItem1.toString().contains("create")); Assert.assertNotNull(resultItem1.toJson()); - //Index Status + // Index Status ElasticSearchResultItem resultItem2 = new ElasticSearchResultItem(); resultItem2.setIndex(getStatus(shardStatus, error)); Assert.assertNotNull(resultItem2.getIndex()); @@ -69,7 +69,7 @@ public class ElasticSearchResultItemTest { Assert.assertTrue(resultItem2.toString().contains("index")); Assert.assertNotNull(resultItem2.toJson()); - //Delete Status + // Delete Status ElasticSearchResultItem resultItem3 = new ElasticSearchResultItem(); resultItem3.setDelete(getStatus(shardStatus, error)); Assert.assertNotNull(resultItem3.getDelete()); @@ -78,12 +78,12 @@ public class ElasticSearchResultItemTest { Assert.assertTrue(resultItem3.toString().contains("delete")); Assert.assertNotNull(resultItem3.toJson()); - //Unknown Status + // Unknown Status ElasticSearchResultItem resultItem4 = new ElasticSearchResultItem(); Assert.assertEquals(resultItem4.operationType(), "unknown"); Assert.assertNull(resultItem4.operationStatus()); - //ElasticSearchBulkOperationResult + // ElasticSearchBulkOperationResult ElasticSearchResultItem[] resultItems = {resultItem1, resultItem2, resultItem3}; ElasticSearchBulkOperationResult result = new ElasticSearchBulkOperationResult(); result.setErrors(true); diff --git a/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/AggregationStatementTest.java b/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/AggregationStatementTest.java index 495a456..bff0f4f 100644 --- a/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/AggregationStatementTest.java +++ b/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/AggregationStatementTest.java @@ -28,116 +28,127 @@ import org.junit.Test; public class AggregationStatementTest { - private static ObjectMapper mapper = new ObjectMapper(); + private static ObjectMapper mapper = new ObjectMapper(); - @Test - public void testGroupBy() { - String input = "{\r\n \"group-by\": {\r\n \"field\": \"entityType\"\r\n }\r\n }"; + @Test + public void testGroupBy() { + String input = "{\r\n \"group-by\": {\r\n \"field\": \"entityType\"\r\n }\r\n }"; - String expected = "{\"terms\": {\"field\": \"entityType\"}}"; + String expected = "{\"terms\": {\"field\": \"entityType\"}}"; + + AggregationStatement actual; + try { + actual = mapper.readValue(input, AggregationStatement.class); + assertEquals(expected, actual.toElasticSearch()); + } catch (Exception e) { + fail("Exception occurred: " + e.getMessage()); + } - AggregationStatement actual; - try { - actual = mapper.readValue(input, AggregationStatement.class); - assertEquals(expected, actual.toElasticSearch()); - } catch (Exception e) { - fail("Exception occurred: " + e.getMessage()); } - } + @Test + public void testDateRange() { + String input = + "{\r\n \"date-range\": {\r\n \"field\": \"mydate\",\r\n \"ranges\": [\r\n {\r\n \"from\": \"2016-12-19T00:00:00.738-05:00\",\r\n \"to\": \"2016-12-23T23:59:59.738-05:00\"\r\n }\r\n ],\r\n \"format\": \"MM-yyy\",\r\n \"size\": \"5\"\r\n }\r\n}"; - @Test - public void testDateRange() { - String input = "{\r\n \"date-range\": {\r\n \"field\": \"mydate\",\r\n \"ranges\": [\r\n {\r\n \"from\": \"2016-12-19T00:00:00.738-05:00\",\r\n \"to\": \"2016-12-23T23:59:59.738-05:00\"\r\n }\r\n ],\r\n \"format\": \"MM-yyy\",\r\n \"size\": \"5\"\r\n }\r\n}"; + String expected = + "{\"date_range\": {\"field\": \"mydate\", \"format\": \"MM-yyy\", \"ranges\": [{\"from\": \"2016-12-19T00:00:00.738-05:00\", \"to\": \"2016-12-23T23:59:59.738-05:00\"}], \"size\": 5}}"; - String expected = "{\"date_range\": {\"field\": \"mydate\", \"format\": \"MM-yyy\", \"ranges\": [{\"from\": \"2016-12-19T00:00:00.738-05:00\", \"to\": \"2016-12-23T23:59:59.738-05:00\"}], \"size\": 5}}"; + AggregationStatement actual; + try { + actual = mapper.readValue(input, AggregationStatement.class); + assertEquals(expected, actual.toElasticSearch()); + } catch (Exception e) { + fail("Exception occurred: " + e.getMessage()); + } - AggregationStatement actual; - try { - actual = mapper.readValue(input, AggregationStatement.class); - assertEquals(expected, actual.toElasticSearch()); - } catch (Exception e) { - fail("Exception occurred: " + e.getMessage()); } - } + @Test + public void testDateHistogram() { + String input = + "{\r\n \"date-histogram\": {\r\n \"field\": \"mydate\",\r\n \"interval\": \"day\"\r\n }\r\n}"; - @Test - public void testDateHistogram() { - String input = "{\r\n \"date-histogram\": {\r\n \"field\": \"mydate\",\r\n \"interval\": \"day\"\r\n }\r\n}"; + String expected = "{\"date_histogram\": {\"field\": \"mydate\", \"interval\": \"day\"}}"; - String expected = "{\"date_histogram\": {\"field\": \"mydate\", \"interval\": \"day\"}}"; + AggregationStatement actual; + try { + actual = mapper.readValue(input, AggregationStatement.class); + assertEquals(expected, actual.toElasticSearch()); + } catch (Exception e) { + fail("Exception occurred: " + e.getMessage()); + } - AggregationStatement actual; - try { - actual = mapper.readValue(input, AggregationStatement.class); - assertEquals(expected, actual.toElasticSearch()); - } catch (Exception e) { - fail("Exception occurred: " + e.getMessage()); } - } - - @Test - public void testSubAggregation1() { - String input = "{\r\n \"group-by\": {\r\n \"field\": \"severity\"\r\n },\r\n \"sub-aggregations\": [\r\n {\r\n \"name\": \"byType\",\r\n \"aggregation\": {\r\n \"group-by\": {\r\n \"field\": \"entityType\"\r\n }\r\n }\r\n }\r\n ]\r\n}"; - String expected = "{\"terms\": {\"field\": \"severity\"}, \"aggs\": {\"byType\": {\"terms\": {\"field\": \"entityType\"}}}}"; + @Test + public void testSubAggregation1() { + String input = + "{\r\n \"group-by\": {\r\n \"field\": \"severity\"\r\n },\r\n \"sub-aggregations\": [\r\n {\r\n \"name\": \"byType\",\r\n \"aggregation\": {\r\n \"group-by\": {\r\n \"field\": \"entityType\"\r\n }\r\n }\r\n }\r\n ]\r\n}"; + String expected = + "{\"terms\": {\"field\": \"severity\"}, \"aggs\": {\"byType\": {\"terms\": {\"field\": \"entityType\"}}}}"; + + AggregationStatement actual; + try { + actual = mapper.readValue(input, AggregationStatement.class); + assertEquals(expected, actual.toElasticSearch()); + } catch (Exception e) { + fail("Exception occurred: " + e.getMessage()); + } - AggregationStatement actual; - try { - actual = mapper.readValue(input, AggregationStatement.class); - assertEquals(expected, actual.toElasticSearch()); - } catch (Exception e) { - fail("Exception occurred: " + e.getMessage()); } - } - - @Test - public void testSubAggregation2() { - String input = "{\r\n \"group-by\": {\r\n \"field\": \"severity\"\r\n },\r\n \"sub-aggregations\": [\r\n {\r\n \"name\": \"byType\",\r\n \"aggregation\": {\r\n \"group-by\": {\r\n \"field\": \"violationType\"\r\n }\r\n }\r\n },\r\n {\r\n \"name\": \"byRule\",\r\n \"aggregation\": {\r\n \"group-by\": {\r\n \"field\": \"validationRule\"\r\n }\r\n }\r\n }\r\n ]\r\n}"; - String expected = "{\"terms\": {\"field\": \"severity\"}, \"aggs\": {\"byType\": {\"terms\": {\"field\": \"violationType\"}},\"byRule\": {\"terms\": {\"field\": \"validationRule\"}}}}"; + @Test + public void testSubAggregation2() { + String input = + "{\r\n \"group-by\": {\r\n \"field\": \"severity\"\r\n },\r\n \"sub-aggregations\": [\r\n {\r\n \"name\": \"byType\",\r\n \"aggregation\": {\r\n \"group-by\": {\r\n \"field\": \"violationType\"\r\n }\r\n }\r\n },\r\n {\r\n \"name\": \"byRule\",\r\n \"aggregation\": {\r\n \"group-by\": {\r\n \"field\": \"validationRule\"\r\n }\r\n }\r\n }\r\n ]\r\n}"; + String expected = + "{\"terms\": {\"field\": \"severity\"}, \"aggs\": {\"byType\": {\"terms\": {\"field\": \"violationType\"}},\"byRule\": {\"terms\": {\"field\": \"validationRule\"}}}}"; + + AggregationStatement actual; + try { + actual = mapper.readValue(input, AggregationStatement.class); + assertEquals(expected, actual.toElasticSearch()); + } catch (Exception e) { + fail("Exception occurred: " + e.getMessage()); + } - AggregationStatement actual; - try { - actual = mapper.readValue(input, AggregationStatement.class); - assertEquals(expected, actual.toElasticSearch()); - } catch (Exception e) { - fail("Exception occurred: " + e.getMessage()); } - } + @Test + public void testNestedAggregation1() { + String input = + "{\r\n \"nested\": [{\r\n \"name\": \"by_severity\",\r\n \"aggregation\": {\r\n \"group-by\": {\r\n \"field\": \"violations.severity\"\r\n }\r\n }\r\n }]\r\n}"; + String expected = + "{\"nested\": {\"path\": \"violations\"}, \"aggs\": {\"by_severity\": {\"terms\": {\"field\": \"violations.severity\"}}}}"; - @Test - public void testNestedAggregation1() { - String input = "{\r\n \"nested\": [{\r\n \"name\": \"by_severity\",\r\n \"aggregation\": {\r\n \"group-by\": {\r\n \"field\": \"violations.severity\"\r\n }\r\n }\r\n }]\r\n}"; - String expected = "{\"nested\": {\"path\": \"violations\"}, \"aggs\": {\"by_severity\": {\"terms\": {\"field\": \"violations.severity\"}}}}"; + AggregationStatement actual; + try { + actual = mapper.readValue(input, AggregationStatement.class); + assertEquals(expected, actual.toElasticSearch()); + } catch (Exception e) { + fail("Exception occurred: " + e.getMessage()); + } - AggregationStatement actual; - try { - actual = mapper.readValue(input, AggregationStatement.class); - assertEquals(expected, actual.toElasticSearch()); - } catch (Exception e) { - fail("Exception occurred: " + e.getMessage()); } - } + @Test + public void testNestedAggregation2() { + String input = + "{\r\n \"nested\": [\r\n {\r\n \"name\": \"by_severity\",\r\n \"aggregation\": {\r\n \"group-by\": {\r\n \"field\": \"violations.severity\"\r\n }\r\n }\r\n },\r\n {\r\n \"name\": \"by_type\",\r\n \"aggregation\": {\r\n \"group-by\": {\r\n \"field\": \"violations.violationType\"\r\n }\r\n }\r\n }\r\n ]\r\n}"; + String expected = + "{\"nested\": {\"path\": \"violations\"}, \"aggs\": {\"by_severity\": {\"terms\": {\"field\": \"violations.severity\"}},\"by_type\": {\"terms\": {\"field\": \"violations.violationType\"}}}}"; + + AggregationStatement actual; + try { + actual = mapper.readValue(input, AggregationStatement.class); + assertEquals(expected, actual.toElasticSearch()); + } catch (Exception e) { + fail("Exception occurred: " + e.getMessage()); + } - @Test - public void testNestedAggregation2() { - String input = "{\r\n \"nested\": [\r\n {\r\n \"name\": \"by_severity\",\r\n \"aggregation\": {\r\n \"group-by\": {\r\n \"field\": \"violations.severity\"\r\n }\r\n }\r\n },\r\n {\r\n \"name\": \"by_type\",\r\n \"aggregation\": {\r\n \"group-by\": {\r\n \"field\": \"violations.violationType\"\r\n }\r\n }\r\n }\r\n ]\r\n}"; - String expected = "{\"nested\": {\"path\": \"violations\"}, \"aggs\": {\"by_severity\": {\"terms\": {\"field\": \"violations.severity\"}},\"by_type\": {\"terms\": {\"field\": \"violations.violationType\"}}}}"; - - AggregationStatement actual; - try { - actual = mapper.readValue(input, AggregationStatement.class); - assertEquals(expected, actual.toElasticSearch()); - } catch (Exception e) { - fail("Exception occurred: " + e.getMessage()); } - } - } diff --git a/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/AggregationTest.java b/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/AggregationTest.java index d85e075..12b18d1 100644 --- a/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/AggregationTest.java +++ b/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/AggregationTest.java @@ -27,22 +27,25 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; public class AggregationTest { - private static ObjectMapper mapper = new ObjectMapper(); -// - @Test - public void test() { - String input = "{\r\n \"name\": \"byDate\",\r\n \"aggregation\": {\r\n \"date-range\": {\r\n \"field\": \"mydate\",\r\n \"ranges\": [\r\n {\r\n \"from\": \"2016-12-19T00:00:00.738-05:00\",\r\n \"to\": \"2016-12-23T23:59:59.738-05:00\"\r\n }\r\n ]\r\n },\r\n \"sub-aggregations\": [{\r\n \"name\": \"byTerm\",\r\n \"aggregation\": {\r\n \"group-by\": {\r\n \"field\": \"myterm\"\r\n }\r\n }\r\n }]\r\n }\r\n}"; - - String expected = "\"byDate\": {\"date_range\": {\"field\": \"mydate\", \"ranges\": [{\"from\": \"2016-12-19T00:00:00.738-05:00\", \"to\": \"2016-12-23T23:59:59.738-05:00\"}]}, \"aggs\": {\"byTerm\": {\"terms\": {\"field\": \"myterm\"}}}}"; - - Aggregation actual; - try { - actual = mapper.readValue(input, Aggregation.class); - assertEquals(expected, actual.toElasticSearch()); - } catch (Exception e) { - fail("Exception occurred: " + e.getMessage()); - } + private static ObjectMapper mapper = new ObjectMapper(); + + // + @Test + public void test() { + String input = + "{\r\n \"name\": \"byDate\",\r\n \"aggregation\": {\r\n \"date-range\": {\r\n \"field\": \"mydate\",\r\n \"ranges\": [\r\n {\r\n \"from\": \"2016-12-19T00:00:00.738-05:00\",\r\n \"to\": \"2016-12-23T23:59:59.738-05:00\"\r\n }\r\n ]\r\n },\r\n \"sub-aggregations\": [{\r\n \"name\": \"byTerm\",\r\n \"aggregation\": {\r\n \"group-by\": {\r\n \"field\": \"myterm\"\r\n }\r\n }\r\n }]\r\n }\r\n}"; + + String expected = + "\"byDate\": {\"date_range\": {\"field\": \"mydate\", \"ranges\": [{\"from\": \"2016-12-19T00:00:00.738-05:00\", \"to\": \"2016-12-23T23:59:59.738-05:00\"}]}, \"aggs\": {\"byTerm\": {\"terms\": {\"field\": \"myterm\"}}}}"; - } + Aggregation actual; + try { + actual = mapper.readValue(input, Aggregation.class); + assertEquals(expected, actual.toElasticSearch()); + } catch (Exception e) { + fail("Exception occurred: " + e.getMessage()); + } + + } } diff --git a/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/DateHistogramAggregationTest.java b/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/DateHistogramAggregationTest.java index 6a3ecf7..005cb76 100644 --- a/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/DateHistogramAggregationTest.java +++ b/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/DateHistogramAggregationTest.java @@ -27,57 +27,52 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; public class DateHistogramAggregationTest { - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = new ObjectMapper(); - @Test - public void testFullSet() { - String input = - "{\r\n \"field\": \"mydate\",\r\n \"interval\": \"day\",\r\n \"time-zone\": \"-01:00\"\r\n}"; + @Test + public void testFullSet() { + String input = "{\r\n \"field\": \"mydate\",\r\n \"interval\": \"day\",\r\n \"time-zone\": \"-01:00\"\r\n}"; - String expected = - "\"date_histogram\": {\"field\": \"mydate\", \"interval\": \"day\", \"time_zone\": \"-01:00\"}"; + String expected = + "\"date_histogram\": {\"field\": \"mydate\", \"interval\": \"day\", \"time_zone\": \"-01:00\"}"; - DateHistogramAggregation actual; - try { - actual = mapper.readValue(input, DateHistogramAggregation.class); - assertEquals(expected, actual.toElasticSearch()); - } catch (Exception e) { - fail("Exception occurred: " + e.getMessage()); + DateHistogramAggregation actual; + try { + actual = mapper.readValue(input, DateHistogramAggregation.class); + assertEquals(expected, actual.toElasticSearch()); + } catch (Exception e) { + fail("Exception occurred: " + e.getMessage()); + } } - } - @Test - public void test2() { - String input = - "{\r\n \"field\": \"mydate\",\r\n \"interval\": \"day\"\r\n}"; + @Test + public void test2() { + String input = "{\r\n \"field\": \"mydate\",\r\n \"interval\": \"day\"\r\n}"; - String expected = - "\"date_histogram\": {\"field\": \"mydate\", \"interval\": \"day\"}"; + String expected = "\"date_histogram\": {\"field\": \"mydate\", \"interval\": \"day\"}"; - DateHistogramAggregation actual; - try { - actual = mapper.readValue(input, DateHistogramAggregation.class); - assertEquals(expected, actual.toElasticSearch()); - } catch (Exception e) { - fail("Exception occurred: " + e.getMessage()); + DateHistogramAggregation actual; + try { + actual = mapper.readValue(input, DateHistogramAggregation.class); + assertEquals(expected, actual.toElasticSearch()); + } catch (Exception e) { + fail("Exception occurred: " + e.getMessage()); + } } - } - @Test - public void test3() { - String input = - "{\r\n \"field\": \"mydate\"\r\n}"; + @Test + public void test3() { + String input = "{\r\n \"field\": \"mydate\"\r\n}"; - String expected = - "\"date_histogram\": {\"field\": \"mydate\"}"; + String expected = "\"date_histogram\": {\"field\": \"mydate\"}"; - DateHistogramAggregation actual; - try { - actual = mapper.readValue(input, DateHistogramAggregation.class); - assertEquals(expected, actual.toElasticSearch()); - } catch (Exception e) { - fail("Exception occurred: " + e.getMessage()); + DateHistogramAggregation actual; + try { + actual = mapper.readValue(input, DateHistogramAggregation.class); + assertEquals(expected, actual.toElasticSearch()); + } catch (Exception e) { + fail("Exception occurred: " + e.getMessage()); + } } - } } diff --git a/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/DateRangeAggregationTest.java b/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/DateRangeAggregationTest.java index 3183687..45e7c51 100644 --- a/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/DateRangeAggregationTest.java +++ b/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/DateRangeAggregationTest.java @@ -28,40 +28,42 @@ import org.junit.Test; public class DateRangeAggregationTest { - private static ObjectMapper mapper = new ObjectMapper(); + private static ObjectMapper mapper = new ObjectMapper(); - @Test - public void test() { + @Test + public void test() { - String input = - "{\r\n \"field\": \"mydate\",\r\n \"ranges\": [\r\n {\r\n \"from\": \"2016-12-19T00:00:00.738-05:00\",\r\n \"to\": \"2016-12-23T23:59:59.738-05:00\"\r\n },\r\n {\r\n \"to\": \"2016-12-23T23:59:59.738-05:00\"\r\n },\r\n {\r\n \"from\": \"2016-12-19T00:00:00.738-05:00\"\r\n }\r\n ],\r\n \"format\": \"MM-yyy\",\r\n \"size\": \"5\"\r\n}"; - String expected = "\"date_range\": {\"field\": \"mydate\", \"format\": \"MM-yyy\", \"ranges\": [{\"from\": \"2016-12-19T00:00:00.738-05:00\", \"to\": \"2016-12-23T23:59:59.738-05:00\"},{\"to\": \"2016-12-23T23:59:59.738-05:00\"},{\"from\": \"2016-12-19T00:00:00.738-05:00\"}], \"size\": 5}"; + String input = + "{\r\n \"field\": \"mydate\",\r\n \"ranges\": [\r\n {\r\n \"from\": \"2016-12-19T00:00:00.738-05:00\",\r\n \"to\": \"2016-12-23T23:59:59.738-05:00\"\r\n },\r\n {\r\n \"to\": \"2016-12-23T23:59:59.738-05:00\"\r\n },\r\n {\r\n \"from\": \"2016-12-19T00:00:00.738-05:00\"\r\n }\r\n ],\r\n \"format\": \"MM-yyy\",\r\n \"size\": \"5\"\r\n}"; + String expected = + "\"date_range\": {\"field\": \"mydate\", \"format\": \"MM-yyy\", \"ranges\": [{\"from\": \"2016-12-19T00:00:00.738-05:00\", \"to\": \"2016-12-23T23:59:59.738-05:00\"},{\"to\": \"2016-12-23T23:59:59.738-05:00\"},{\"from\": \"2016-12-19T00:00:00.738-05:00\"}], \"size\": 5}"; - DateRangeAggregation actual; - try { - actual = mapper.readValue(input, DateRangeAggregation.class); - assertEquals(expected, actual.toElasticSearch()); - } catch (Exception e) { - fail("Exception occurred: " + e.getMessage()); + DateRangeAggregation actual; + try { + actual = mapper.readValue(input, DateRangeAggregation.class); + assertEquals(expected, actual.toElasticSearch()); + } catch (Exception e) { + fail("Exception occurred: " + e.getMessage()); + } } - } - @Test - public void testNoFormatNoSize() { + @Test + public void testNoFormatNoSize() { - String input = - "{\r\n \"field\": \"mydate\",\r\n \"ranges\": [\r\n {\r\n \"from\": \"2016-12-19T00:00:00.738-05:00\",\r\n \"to\": \"2016-12-23T23:59:59.738-05:00\"\r\n },\r\n {\r\n \"to\": \"2016-12-23T23:59:59.738-05:00\"\r\n },\r\n {\r\n \"from\": \"2016-12-19T00:00:00.738-05:00\"\r\n }\r\n ]\r\n}"; - String expected = "\"date_range\": {\"field\": \"mydate\", \"ranges\": [{\"from\": \"2016-12-19T00:00:00.738-05:00\", \"to\": \"2016-12-23T23:59:59.738-05:00\"},{\"to\": \"2016-12-23T23:59:59.738-05:00\"},{\"from\": \"2016-12-19T00:00:00.738-05:00\"}]}"; + String input = + "{\r\n \"field\": \"mydate\",\r\n \"ranges\": [\r\n {\r\n \"from\": \"2016-12-19T00:00:00.738-05:00\",\r\n \"to\": \"2016-12-23T23:59:59.738-05:00\"\r\n },\r\n {\r\n \"to\": \"2016-12-23T23:59:59.738-05:00\"\r\n },\r\n {\r\n \"from\": \"2016-12-19T00:00:00.738-05:00\"\r\n }\r\n ]\r\n}"; + String expected = + "\"date_range\": {\"field\": \"mydate\", \"ranges\": [{\"from\": \"2016-12-19T00:00:00.738-05:00\", \"to\": \"2016-12-23T23:59:59.738-05:00\"},{\"to\": \"2016-12-23T23:59:59.738-05:00\"},{\"from\": \"2016-12-19T00:00:00.738-05:00\"}]}"; - DateRangeAggregation actual; - try { - actual = mapper.readValue(input, DateRangeAggregation.class); - assertEquals(expected, actual.toElasticSearch()); - } catch (Exception e) { - fail("Exception occurred: " + e.getMessage()); + DateRangeAggregation actual; + try { + actual = mapper.readValue(input, DateRangeAggregation.class); + assertEquals(expected, actual.toElasticSearch()); + } catch (Exception e) { + fail("Exception occurred: " + e.getMessage()); + } } - } } diff --git a/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/DateRangeTest.java b/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/DateRangeTest.java index 52880c0..ef7325e 100644 --- a/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/DateRangeTest.java +++ b/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/DateRangeTest.java @@ -27,48 +27,49 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; public class DateRangeTest { - private static ObjectMapper mapper = new ObjectMapper(); + private static ObjectMapper mapper = new ObjectMapper(); - @Test - public void testBoth() { - String input = "{\r\n \"from\": \"2016-12-19T00:00:00.738-05:00\",\r\n \"to\": \"2016-12-23T23:59:59.738-05:00\"\r\n}"; - String expected = "{\"from\": \"2016-12-19T00:00:00.738-05:00\", \"to\": \"2016-12-23T23:59:59.738-05:00\"}"; + @Test + public void testBoth() { + String input = + "{\r\n \"from\": \"2016-12-19T00:00:00.738-05:00\",\r\n \"to\": \"2016-12-23T23:59:59.738-05:00\"\r\n}"; + String expected = "{\"from\": \"2016-12-19T00:00:00.738-05:00\", \"to\": \"2016-12-23T23:59:59.738-05:00\"}"; - DateRange actual; - try { - actual = mapper.readValue(input, DateRange.class); - assertEquals(expected, actual.toElasticSearch()); - } catch (Exception e) { - fail("Exception occurred: " + e.getMessage()); + DateRange actual; + try { + actual = mapper.readValue(input, DateRange.class); + assertEquals(expected, actual.toElasticSearch()); + } catch (Exception e) { + fail("Exception occurred: " + e.getMessage()); + } } - } - @Test - public void testFrom() { - String input = "{\"from\": \"2016-12-19T00:00:00.738-05:00\"}"; - String expected = "{\"from\": \"2016-12-19T00:00:00.738-05:00\"}"; + @Test + public void testFrom() { + String input = "{\"from\": \"2016-12-19T00:00:00.738-05:00\"}"; + String expected = "{\"from\": \"2016-12-19T00:00:00.738-05:00\"}"; - DateRange actual; - try { - actual = mapper.readValue(input, DateRange.class); - assertEquals(expected, actual.toElasticSearch()); - } catch (Exception e) { - fail("Exception occurred: " + e.getMessage()); + DateRange actual; + try { + actual = mapper.readValue(input, DateRange.class); + assertEquals(expected, actual.toElasticSearch()); + } catch (Exception e) { + fail("Exception occurred: " + e.getMessage()); + } } - } - @Test - public void testTo() { - String input = "{\r\n \"to\": \"2016-12-23T23:59:59.738-05:00\"\r\n}"; - String expected = "{\"to\": \"2016-12-23T23:59:59.738-05:00\"}"; + @Test + public void testTo() { + String input = "{\r\n \"to\": \"2016-12-23T23:59:59.738-05:00\"\r\n}"; + String expected = "{\"to\": \"2016-12-23T23:59:59.738-05:00\"}"; - DateRange actual; - try { - actual = mapper.readValue(input, DateRange.class); - assertEquals(expected, actual.toElasticSearch()); - } catch (Exception e) { - fail("Exception occurred: " + e.getMessage()); + DateRange actual; + try { + actual = mapper.readValue(input, DateRange.class); + assertEquals(expected, actual.toElasticSearch()); + } catch (Exception e) { + fail("Exception occurred: " + e.getMessage()); + } } - } } diff --git a/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/FilterTest.java b/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/FilterTest.java index 7b7abd0..81fa07f 100644 --- a/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/FilterTest.java +++ b/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/FilterTest.java @@ -28,21 +28,16 @@ import org.junit.Test; public class FilterTest { - @Test - public void test() throws JsonParseException, JsonMappingException, IOException { + @Test + public void test() throws JsonParseException, JsonMappingException, IOException { - String json = "{ \"any\": [ " - + "{\"match\": {\"field\": \"searchTags\", \"value\": \"a\"}}," - + "{\"match\": {\"field\": \"searchTags\", \"value\": \"b\"}}" - + "]," - + "\"all\": [" - + "{\"parsed-query\": {\"field\": \"fieldname\", \"query-string\": \"string\"}}" - + "]" - + "}"; + String json = "{ \"any\": [ " + "{\"match\": {\"field\": \"searchTags\", \"value\": \"a\"}}," + + "{\"match\": {\"field\": \"searchTags\", \"value\": \"b\"}}" + "]," + "\"all\": [" + + "{\"parsed-query\": {\"field\": \"fieldname\", \"query-string\": \"string\"}}" + "]" + "}"; - ObjectMapper mapper = new ObjectMapper(); - Filter filter = mapper.readValue(json, Filter.class); - System.out.println("GDF: filter = " + filter); - } + ObjectMapper mapper = new ObjectMapper(); + Filter filter = mapper.readValue(json, Filter.class); + System.out.println("GDF: filter = " + filter); + } } diff --git a/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/GroupByAggregationTest.java b/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/GroupByAggregationTest.java index be50243..1ebed91 100644 --- a/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/GroupByAggregationTest.java +++ b/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/GroupByAggregationTest.java @@ -27,36 +27,36 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; public class GroupByAggregationTest { - private static ObjectMapper mapper = new ObjectMapper(); + private static ObjectMapper mapper = new ObjectMapper(); - @Test - public void test() { - String input = "{\"field\" : \"entityType\", \"size\": 20}\r\n"; + @Test + public void test() { + String input = "{\"field\" : \"entityType\", \"size\": 20}\r\n"; - String expected = "\"terms\": {\"field\": \"entityType\", \"size\": 20}"; + String expected = "\"terms\": {\"field\": \"entityType\", \"size\": 20}"; - GroupByAggregation actual; - try { - actual = mapper.readValue(input, GroupByAggregation.class); - assertEquals(expected, actual.toElasticSearch()); - } catch (Exception e) { - fail("Exception occurred: " + e.getMessage()); + GroupByAggregation actual; + try { + actual = mapper.readValue(input, GroupByAggregation.class); + assertEquals(expected, actual.toElasticSearch()); + } catch (Exception e) { + fail("Exception occurred: " + e.getMessage()); + } } - } - @Test - public void testNoSize() { - String input = "{\"field\" : \"entityType\"}\r\n"; + @Test + public void testNoSize() { + String input = "{\"field\" : \"entityType\"}\r\n"; - String expected = "\"terms\": {\"field\": \"entityType\"}"; + String expected = "\"terms\": {\"field\": \"entityType\"}"; - GroupByAggregation actual; - try { - actual = mapper.readValue(input, GroupByAggregation.class); - assertEquals(expected, actual.toElasticSearch()); - } catch (Exception e) { - fail("Exception occurred: " + e.getMessage()); + GroupByAggregation actual; + try { + actual = mapper.readValue(input, GroupByAggregation.class); + assertEquals(expected, actual.toElasticSearch()); + } catch (Exception e) { + fail("Exception occurred: " + e.getMessage()); + } } - } } diff --git a/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/QueryTest.java b/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/QueryTest.java index 0e60649..2f22605 100644 --- a/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/QueryTest.java +++ b/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/QueryTest.java @@ -32,320 +32,338 @@ import org.junit.Test; public class QueryTest { - /** - * This test validates that we are able to marshal json structures - * representing term queries into POJOs and that we can then - * unmarshal those POJOs into ElasticSearch syntax. - * - * @throws JsonParseException - * @throws JsonMappingException - * @throws IOException - */ - @Test - public void termQueryTest() throws JsonParseException, JsonMappingException, IOException { - - Integer intValue = 1; - String field = "searchTags"; - String termQueryWithIntegerValueJson = "{\"field\": \"" + field + "\", \"value\": " + intValue + "}"; - String termQueryWithIntegerValueExpectedES = "{\"term\": {\"" + field + "\" : " + intValue + "}}"; - - Double doubleValue = 5.7; - String termQueryWithDoubleValueJson = "{\"field\": \"" + field + "\", \"value\": " + doubleValue + "}"; - String termQueryWithDoubleValueExpectedES = "{\"term\": {\"" + field + "\" : " + doubleValue + "}}"; - - String stringValue = "theValue"; - String termQueryWithStringValueJson = "{\"field\": \"" + field + "\", \"value\": \"" + stringValue + "\"}"; - String termQueryWithStringValueExpectedES = "{\"term\": {\"" + field + "\" : \"" + stringValue + "\"}}"; - - ObjectMapper mapper = new ObjectMapper(); - - - // Validate that we can marshal a term query where the supplied value - // is an Integer. - TermQuery integerTermQuery = mapper.readValue(termQueryWithIntegerValueJson, TermQuery.class); - assertTrue("Expected value to be of type Integer, but was type " + integerTermQuery.getValue().getClass().getName(), - integerTermQuery.getValue() instanceof Integer); - assertEquals(intValue, integerTermQuery.getValue()); - - assertTrue("ElasticSearch term query translation does not match the expected result", - termQueryWithIntegerValueExpectedES.equals(integerTermQuery.toElasticSearch())); - - // Validate that we can marshal a term query where the supplied value - // is a Double. - TermQuery doubleTermQuery = mapper.readValue(termQueryWithDoubleValueJson, TermQuery.class); - assertTrue("Expected value to be of type Double, but was type " + doubleTermQuery.getValue().getClass().getName(), - doubleTermQuery.getValue() instanceof Double); - assertEquals(doubleValue, doubleTermQuery.getValue()); - assertTrue("ElasticSearch term query translation does not match the expected result", - termQueryWithDoubleValueExpectedES.equals(doubleTermQuery.toElasticSearch())); - - // Validate that we can marshal a term query where the supplied value - // is a String literal. - TermQuery stringTermQuery = mapper.readValue(termQueryWithStringValueJson, TermQuery.class); - assertTrue("Expected value to be of type String, but was type " + stringTermQuery.getValue().getClass().getName(), - stringTermQuery.getValue() instanceof String); - assertEquals(stringValue, stringTermQuery.getValue()); - assertTrue("ElasticSearch term query translation does not match the expected result", - termQueryWithStringValueExpectedES.equals(stringTermQuery.toElasticSearch())); - - - } - - - /** - * This test validates that we are able to marshal json structures - * representing parsed queries into POJOs and that we can then - * unmarshal those POJOs into ElasticSearch syntax. - * - * @throws JsonParseException - * @throws JsonMappingException - * @throws IOException - */ - @Test - public void parsedQueryTest() throws JsonParseException, JsonMappingException, IOException { - - String field = "fieldname"; - String queryString = "The query string"; - - String queryJson = "{\"field\": \"" + field + "\", \"query-string\": \"" + queryString + "\"}"; - String queryExpectedES = "{\"query_string\": {\"default_field\": \"" + field + "\", \"query\": \"" + queryString + "\"}}"; - - ObjectMapper mapper = new ObjectMapper(); - ParsedQuery pq = mapper.readValue(queryJson, ParsedQuery.class); - - assertTrue("Unexpected marshalled value for 'field' - expected: " + field + " actual: " + pq.getField(), - field.equals(pq.getField())); - assertTrue("Unexpected marshalled value for 'query-string' - expected: " + queryString + " actual: " + pq.getQueryString(), - queryString.equals(pq.getQueryString())); - assertTrue("Unexpected ElasticSearch syntax. Expected: " + queryExpectedES + " Actual: " + pq.toElasticSearch(), - queryExpectedES.equals(pq.toElasticSearch())); - } - - - /** - * This test validates that a ranged query cannot be parsed with values - * for both the 'gte' and 'gt' fields or the 'lte' and 'lt' fields, and - * that we do not allow mixing of numeric and date types in the same - * query. - * - * @throws JsonParseException - * @throws IOException - */ - @Test - public void rangeQueryConflictingBoundsTest() throws JsonParseException, IOException { - - String invalidGTAndGTE = "{ \"field\": \"timestamp\", \"gte\": \"2016-10-06T00:00:00.558+03:00\", \"gt\": \"2016-10-06T23:59:59.558+03:00\"}"; - String invalidLTAndLTE = "{ \"field\": \"timestamp\", \"lte\": \"2016-10-06T00:00:00.558+03:00\", \"lt\": \"2016-10-06T23:59:59.558+03:00\"}"; - String invalidTypes = "{ \"field\": \"timestamp\", \"lte\": 5, \"gte\": \"2016-10-06T23:59:59.558+03:00\"}"; - - ObjectMapper mapper = new ObjectMapper(); - - // Attempt to parse a query where we are setting values for both the - // 'greater than' and 'greater than and equal to' operators. - boolean gotExpectedException = false; - try { - RangeQuery badRangeQuery = mapper.readValue(invalidGTAndGTE, RangeQuery.class); - } catch (JsonMappingException e) { - gotExpectedException = true; - } - assertTrue("Attempting to set both a 'gt' and 'gte' value on the same query should not have been allowed", - gotExpectedException); - - // Attempt to parse a query where we are setting values for both the - // 'less than' and 'less than and equal to' operators. - gotExpectedException = false; - try { - RangeQuery badRangeQuery = mapper.readValue(invalidLTAndLTE, RangeQuery.class); - } catch (JsonMappingException e) { - gotExpectedException = true; - } - assertTrue("Attempting to set both a 'lt' and 'lte' value on the same query should not have been allowed", - gotExpectedException); - - // Attempt to parse a query where we are mixing numeric and date values - // in the same query. - gotExpectedException = false; - try { - RangeQuery badRangeQuery = mapper.readValue(invalidTypes, RangeQuery.class); - } catch (JsonMappingException e) { - gotExpectedException = true; - } - assertTrue("Attempting to mix numeric and date values in the same query should not have been allowed", - gotExpectedException); - - - } - + /** + * This test validates that we are able to marshal json structures representing term queries into POJOs and that we + * can then unmarshal those POJOs into ElasticSearch syntax. + * + * @throws JsonParseException + * @throws JsonMappingException + * @throws IOException + */ + @Test + public void termQueryTest() throws JsonParseException, JsonMappingException, IOException { + + Integer intValue = 1; + String field = "searchTags"; + String termQueryWithIntegerValueJson = "{\"field\": \"" + field + "\", \"value\": " + intValue + "}"; + String termQueryWithIntegerValueExpectedES = "{\"term\": {\"" + field + "\" : " + intValue + "}}"; + + Double doubleValue = 5.7; + String termQueryWithDoubleValueJson = "{\"field\": \"" + field + "\", \"value\": " + doubleValue + "}"; + String termQueryWithDoubleValueExpectedES = "{\"term\": {\"" + field + "\" : " + doubleValue + "}}"; + + String stringValue = "theValue"; + String termQueryWithStringValueJson = "{\"field\": \"" + field + "\", \"value\": \"" + stringValue + "\"}"; + String termQueryWithStringValueExpectedES = "{\"term\": {\"" + field + "\" : \"" + stringValue + "\"}}"; + + ObjectMapper mapper = new ObjectMapper(); + + + // Validate that we can marshal a term query where the supplied value + // is an Integer. + TermQuery integerTermQuery = mapper.readValue(termQueryWithIntegerValueJson, TermQuery.class); + assertTrue( + "Expected value to be of type Integer, but was type " + + integerTermQuery.getValue().getClass().getName(), + integerTermQuery.getValue() instanceof Integer); + assertEquals(intValue, integerTermQuery.getValue()); + + assertTrue("ElasticSearch term query translation does not match the expected result", + termQueryWithIntegerValueExpectedES.equals(integerTermQuery.toElasticSearch())); + + // Validate that we can marshal a term query where the supplied value + // is a Double. + TermQuery doubleTermQuery = mapper.readValue(termQueryWithDoubleValueJson, TermQuery.class); + assertTrue( + "Expected value to be of type Double, but was type " + doubleTermQuery.getValue().getClass().getName(), + doubleTermQuery.getValue() instanceof Double); + assertEquals(doubleValue, doubleTermQuery.getValue()); + assertTrue("ElasticSearch term query translation does not match the expected result", + termQueryWithDoubleValueExpectedES.equals(doubleTermQuery.toElasticSearch())); + + // Validate that we can marshal a term query where the supplied value + // is a String literal. + TermQuery stringTermQuery = mapper.readValue(termQueryWithStringValueJson, TermQuery.class); + assertTrue( + "Expected value to be of type String, but was type " + stringTermQuery.getValue().getClass().getName(), + stringTermQuery.getValue() instanceof String); + assertEquals(stringValue, stringTermQuery.getValue()); + assertTrue("ElasticSearch term query translation does not match the expected result", + termQueryWithStringValueExpectedES.equals(stringTermQuery.toElasticSearch())); - /** - * This test validates that date range queries can be marshalled to a Java - * POJO and unmarshalled to ElasticSearch syntax. - * - * @throws JsonParseException - * @throws JsonMappingException - * @throws IOException - */ - @Test - public void dateRangeQueryTest() throws JsonParseException, JsonMappingException, IOException { - String field = "timestamp"; - String greaterThanDate = "2016-10-06T00:00:00.558+03:00"; - String lessThanDate = "2016-10-06T23:59:59.558+03:00"; - - ObjectMapper mapper = new ObjectMapper(); - - // Generate a date range query using 'greater than or equal' and 'less - // than or equal' operations. - String dateRangeJson = - "{ \"field\": \"" + field + "\", \"gte\": \"" + greaterThanDate + "\", \"lte\": \"" + lessThanDate + "\"}"; - String dateRangeExpectedES = - "{\"range\": {\"timestamp\": {\"gte\": \"2016-10-06T00:00:00.558+03:00\", \"lte\": \"2016-10-06T23:59:59.558+03:00\"}}}"; + } - // Validate that the query is marshalled correctly to the POJO and that - // the generated ElasticSearch syntax looks as expected. - RangeQuery dateRangeQuery = mapper.readValue(dateRangeJson, RangeQuery.class); - - assertTrue("Unexpected marshalled value for 'field'. Expected: " + field + " Actual: " + dateRangeQuery.getField(), - field.equals(dateRangeQuery.getField())); - assertTrue("Unexpected type for 'gte' value. Expected: String Actual: " + dateRangeQuery.getGte().getClass().getName(), - dateRangeQuery.getGte() instanceof String); - assertTrue("Unexpected type for 'lte' value. Expected: String Actual: " + dateRangeQuery.getLte().getClass().getName(), - dateRangeQuery.getLte() instanceof String); - assertTrue("Unexpected marshalled value for 'gte'. Expected: " + greaterThanDate + " Actual: " + dateRangeQuery.getGte(), - greaterThanDate.equals(dateRangeQuery.getGte())); - assertTrue("Unexpected marshalled value for 'lte'. Expected: " + lessThanDate + " Actual: " + dateRangeQuery.getLte(), - lessThanDate.equals(dateRangeQuery.getLte())); - assertTrue("Unexpected ElasticSearch syntax. Expected: " + dateRangeExpectedES + " Actual: " + dateRangeQuery.toElasticSearch(), - dateRangeExpectedES.equals(dateRangeQuery.toElasticSearch())); - - - // Generate a date range query using 'greater than' and 'less than or - // equal' operations. - dateRangeJson = - "{ \"field\": \"" + field + "\", \"gt\": \"" + greaterThanDate + "\", \"lte\": \"" + lessThanDate + "\"}"; - dateRangeExpectedES = - "{\"range\": {\"timestamp\": {\"gt\": \"2016-10-06T00:00:00.558+03:00\", \"lte\": \"2016-10-06T23:59:59.558+03:00\"}}}"; - - // Validate that the query is marshalled correctly to the POJO and that - // the generated ElasticSearch syntax looks as expected. - dateRangeQuery = mapper.readValue(dateRangeJson, RangeQuery.class); - - assertTrue("Unexpected marshalled value for 'field'. Expected: " + field + " Actual: " + dateRangeQuery.getField(), - field.equals(dateRangeQuery.getField())); - - assertTrue("Unexpected type for 'gt' value. Expected: String Actual: " + dateRangeQuery.getGt().getClass().getName(), - dateRangeQuery.getGt() instanceof String); - - assertTrue("Unexpected type for 'lte' value. Expected: String Actual: " + dateRangeQuery.getLte().getClass().getName(), - dateRangeQuery.getLte() instanceof String); - - assertTrue("Unexpected marshalled value for 'gt'. Expected: " + greaterThanDate + " Actual: " + dateRangeQuery.getGt(), - greaterThanDate.equals(dateRangeQuery.getGt())); - - assertTrue("Unexpected marshalled value for 'lte'. Expected: " + lessThanDate + " Actual: " + dateRangeQuery.getLte(), - lessThanDate.equals(dateRangeQuery.getLte())); - - assertTrue("Unexpected ElasticSearch syntax. Expected: " + dateRangeExpectedES + " Actual: " + dateRangeQuery.toElasticSearch(), - dateRangeExpectedES.equals(dateRangeQuery.toElasticSearch())); - - - // Generate a date range query using only a 'greater than' operation. - dateRangeJson = - "{ \"field\": \"" + field + "\", \"gt\": \"" + greaterThanDate + "\"}"; - dateRangeExpectedES = - "{\"range\": {\"timestamp\": {\"gt\": \"2016-10-06T00:00:00.558+03:00\"}}}"; - - // Validate that the query is marshalled correctly to the POJO and that - // the generated ElasticSearch syntax looks as expected. - dateRangeQuery = mapper.readValue(dateRangeJson, RangeQuery.class); - - assertTrue("Unexpected marshalled value for 'field'. Expected: " + field + " Actual: " + dateRangeQuery.getField(), - field.equals(dateRangeQuery.getField())); - - assertTrue("Unexpected type for 'gt' value. Expected: String Actual: " + dateRangeQuery.getGt().getClass().getName(), - dateRangeQuery.getGt() instanceof String); - - assertTrue("Unexpected marshalled value for 'gt'. Expected: " + greaterThanDate + " Actual: " + dateRangeQuery.getGt(), - greaterThanDate.equals(dateRangeQuery.getGt())); - - assertTrue("Unexpected ElasticSearch syntax. Expected: " + dateRangeExpectedES + " Actual: " + dateRangeQuery.toElasticSearch(), - dateRangeExpectedES.equals(dateRangeQuery.toElasticSearch())); - - } - - /** - * This test validates that numeric range queries can be marshalled to a Java - * POJO and unmarshalled to ElasticSearch syntax. - * - * @throws JsonParseException - * @throws JsonMappingException - * @throws IOException - */ - @Test - public void numericRangeQueryTest() throws JsonParseException, JsonMappingException, IOException { - - String field = "version"; - Integer greaterThanInt = 5; - Integer lessThanInt = 100; - - ObjectMapper mapper = new ObjectMapper(); - - // Generate a numeric range query using 'greater than or equal' and 'less - // than or equal' operations. - String numericRangeJson = - "{ \"field\": \"" + field + "\", \"gte\": " + greaterThanInt + ", \"lte\": " + lessThanInt + "}"; - String numericRangeExpectedES = - "{\"range\": {\"" + field + "\": {\"gte\": " + greaterThanInt + ", \"lte\": " + lessThanInt + "}}}"; - - // Validate that the query is marshalled correctly to the POJO and that - // the generated ElasticSearch syntax looks as expected. - RangeQuery numericRangeQuery = mapper.readValue(numericRangeJson, RangeQuery.class); - - assertTrue("Unexpected marshalled value for 'field'. Expected: " + field + " Actual: " + numericRangeQuery.getField(), - field.equals(numericRangeQuery.getField())); - assertTrue("Unexpected type for 'gte' value. Expected: Integer Actual: " + numericRangeQuery.getGte().getClass().getName(), - numericRangeQuery.getGte() instanceof Integer); - assertTrue("Unexpected type for 'lte' value. Expected: Integer Actual: " + numericRangeQuery.getLte().getClass().getName(), - numericRangeQuery.getLte() instanceof Integer); - assertEquals("Unexpected marshalled value for 'gte'. Expected: " + greaterThanInt + " Actual: " + numericRangeQuery.getGte(), - greaterThanInt, numericRangeQuery.getGte()); - assertEquals("Unexpected marshalled value for 'lte'. Expected: " + lessThanInt + " Actual: " + numericRangeQuery.getLte(), - lessThanInt, numericRangeQuery.getLte()); - assertTrue("Unexpected ElasticSearch syntax. Expected: " + numericRangeExpectedES + " Actual: " + numericRangeQuery.toElasticSearch(), - numericRangeExpectedES.equals(numericRangeQuery.toElasticSearch())); + /** + * This test validates that we are able to marshal json structures representing parsed queries into POJOs and that + * we can then unmarshal those POJOs into ElasticSearch syntax. + * + * @throws JsonParseException + * @throws JsonMappingException + * @throws IOException + */ + @Test + public void parsedQueryTest() throws JsonParseException, JsonMappingException, IOException { + + String field = "fieldname"; + String queryString = "The query string"; + + String queryJson = "{\"field\": \"" + field + "\", \"query-string\": \"" + queryString + "\"}"; + String queryExpectedES = + "{\"query_string\": {\"default_field\": \"" + field + "\", \"query\": \"" + queryString + "\"}}"; + + ObjectMapper mapper = new ObjectMapper(); + ParsedQuery pq = mapper.readValue(queryJson, ParsedQuery.class); + + assertTrue("Unexpected marshalled value for 'field' - expected: " + field + " actual: " + pq.getField(), + field.equals(pq.getField())); + assertTrue("Unexpected marshalled value for 'query-string' - expected: " + queryString + " actual: " + + pq.getQueryString(), queryString.equals(pq.getQueryString())); + assertTrue( + "Unexpected ElasticSearch syntax. Expected: " + queryExpectedES + " Actual: " + pq.toElasticSearch(), + queryExpectedES.equals(pq.toElasticSearch())); + } - Double greaterThanDouble = 5.0; - Double lessThanDouble = 100.0; - // Generate a date range query using 'greater than' and 'less than or - // equal' operations. - numericRangeJson = - "{ \"field\": \"" + field + "\", \"gt\": " + greaterThanDouble + ", \"lte\": " + lessThanDouble + "}"; - numericRangeExpectedES = - "{\"range\": {\"" + field + "\": {\"gt\": " + greaterThanDouble + ", \"lte\": " + lessThanDouble + "}}}"; + /** + * This test validates that a ranged query cannot be parsed with values for both the 'gte' and 'gt' fields or the + * 'lte' and 'lt' fields, and that we do not allow mixing of numeric and date types in the same query. + * + * @throws JsonParseException + * @throws IOException + */ + @Test + public void rangeQueryConflictingBoundsTest() throws JsonParseException, IOException { + + String invalidGTAndGTE = + "{ \"field\": \"timestamp\", \"gte\": \"2016-10-06T00:00:00.558+03:00\", \"gt\": \"2016-10-06T23:59:59.558+03:00\"}"; + String invalidLTAndLTE = + "{ \"field\": \"timestamp\", \"lte\": \"2016-10-06T00:00:00.558+03:00\", \"lt\": \"2016-10-06T23:59:59.558+03:00\"}"; + String invalidTypes = "{ \"field\": \"timestamp\", \"lte\": 5, \"gte\": \"2016-10-06T23:59:59.558+03:00\"}"; + + ObjectMapper mapper = new ObjectMapper(); + + // Attempt to parse a query where we are setting values for both the + // 'greater than' and 'greater than and equal to' operators. + boolean gotExpectedException = false; + try { + RangeQuery badRangeQuery = mapper.readValue(invalidGTAndGTE, RangeQuery.class); + } catch (JsonMappingException e) { + gotExpectedException = true; + } + assertTrue("Attempting to set both a 'gt' and 'gte' value on the same query should not have been allowed", + gotExpectedException); + + // Attempt to parse a query where we are setting values for both the + // 'less than' and 'less than and equal to' operators. + gotExpectedException = false; + try { + RangeQuery badRangeQuery = mapper.readValue(invalidLTAndLTE, RangeQuery.class); + } catch (JsonMappingException e) { + gotExpectedException = true; + } + assertTrue("Attempting to set both a 'lt' and 'lte' value on the same query should not have been allowed", + gotExpectedException); + + // Attempt to parse a query where we are mixing numeric and date values + // in the same query. + gotExpectedException = false; + try { + RangeQuery badRangeQuery = mapper.readValue(invalidTypes, RangeQuery.class); + } catch (JsonMappingException e) { + gotExpectedException = true; + } + assertTrue("Attempting to mix numeric and date values in the same query should not have been allowed", + gotExpectedException); - // Validate that the query is marshalled correctly to the POJO and that - // the generated ElasticSearch syntax looks as expected. - numericRangeQuery = mapper.readValue(numericRangeJson, RangeQuery.class); - assertTrue("Unexpected marshalled value for 'field'. Expected: " + field + " Actual: " + numericRangeQuery.getField(), - field.equals(numericRangeQuery.getField())); + } - assertTrue("Unexpected type for 'gt' value. Expected: Double Actual: " + numericRangeQuery.getGt().getClass().getName(), - numericRangeQuery.getGt() instanceof Double); - assertTrue("Unexpected type for 'lte' value. Expected: Double Actual: " + numericRangeQuery.getLte().getClass().getName(), - numericRangeQuery.getLte() instanceof Double); + /** + * This test validates that date range queries can be marshalled to a Java POJO and unmarshalled to ElasticSearch + * syntax. + * + * @throws JsonParseException + * @throws JsonMappingException + * @throws IOException + */ + @Test + public void dateRangeQueryTest() throws JsonParseException, JsonMappingException, IOException { + + String field = "timestamp"; + String greaterThanDate = "2016-10-06T00:00:00.558+03:00"; + String lessThanDate = "2016-10-06T23:59:59.558+03:00"; + + ObjectMapper mapper = new ObjectMapper(); + + // Generate a date range query using 'greater than or equal' and 'less + // than or equal' operations. + String dateRangeJson = "{ \"field\": \"" + field + "\", \"gte\": \"" + greaterThanDate + "\", \"lte\": \"" + + lessThanDate + "\"}"; + String dateRangeExpectedES = + "{\"range\": {\"timestamp\": {\"gte\": \"2016-10-06T00:00:00.558+03:00\", \"lte\": \"2016-10-06T23:59:59.558+03:00\"}}}"; + + // Validate that the query is marshalled correctly to the POJO and that + // the generated ElasticSearch syntax looks as expected. + RangeQuery dateRangeQuery = mapper.readValue(dateRangeJson, RangeQuery.class); + + assertTrue("Unexpected marshalled value for 'field'. Expected: " + field + " Actual: " + + dateRangeQuery.getField(), field.equals(dateRangeQuery.getField())); + assertTrue("Unexpected type for 'gte' value. Expected: String Actual: " + + dateRangeQuery.getGte().getClass().getName(), dateRangeQuery.getGte() instanceof String); + assertTrue("Unexpected type for 'lte' value. Expected: String Actual: " + + dateRangeQuery.getLte().getClass().getName(), dateRangeQuery.getLte() instanceof String); + assertTrue("Unexpected marshalled value for 'gte'. Expected: " + greaterThanDate + " Actual: " + + dateRangeQuery.getGte(), greaterThanDate.equals(dateRangeQuery.getGte())); + assertTrue("Unexpected marshalled value for 'lte'. Expected: " + lessThanDate + " Actual: " + + dateRangeQuery.getLte(), lessThanDate.equals(dateRangeQuery.getLte())); + assertTrue( + "Unexpected ElasticSearch syntax. Expected: " + dateRangeExpectedES + " Actual: " + + dateRangeQuery.toElasticSearch(), + dateRangeExpectedES.equals(dateRangeQuery.toElasticSearch())); + + + // Generate a date range query using 'greater than' and 'less than or + // equal' operations. + dateRangeJson = "{ \"field\": \"" + field + "\", \"gt\": \"" + greaterThanDate + "\", \"lte\": \"" + + lessThanDate + "\"}"; + dateRangeExpectedES = + "{\"range\": {\"timestamp\": {\"gt\": \"2016-10-06T00:00:00.558+03:00\", \"lte\": \"2016-10-06T23:59:59.558+03:00\"}}}"; + + // Validate that the query is marshalled correctly to the POJO and that + // the generated ElasticSearch syntax looks as expected. + dateRangeQuery = mapper.readValue(dateRangeJson, RangeQuery.class); + + assertTrue("Unexpected marshalled value for 'field'. Expected: " + field + " Actual: " + + dateRangeQuery.getField(), field.equals(dateRangeQuery.getField())); + + assertTrue("Unexpected type for 'gt' value. Expected: String Actual: " + + dateRangeQuery.getGt().getClass().getName(), dateRangeQuery.getGt() instanceof String); + + assertTrue("Unexpected type for 'lte' value. Expected: String Actual: " + + dateRangeQuery.getLte().getClass().getName(), dateRangeQuery.getLte() instanceof String); + + assertTrue("Unexpected marshalled value for 'gt'. Expected: " + greaterThanDate + " Actual: " + + dateRangeQuery.getGt(), greaterThanDate.equals(dateRangeQuery.getGt())); + + assertTrue("Unexpected marshalled value for 'lte'. Expected: " + lessThanDate + " Actual: " + + dateRangeQuery.getLte(), lessThanDate.equals(dateRangeQuery.getLte())); + + assertTrue( + "Unexpected ElasticSearch syntax. Expected: " + dateRangeExpectedES + " Actual: " + + dateRangeQuery.toElasticSearch(), + dateRangeExpectedES.equals(dateRangeQuery.toElasticSearch())); + + + // Generate a date range query using only a 'greater than' operation. + dateRangeJson = "{ \"field\": \"" + field + "\", \"gt\": \"" + greaterThanDate + "\"}"; + dateRangeExpectedES = "{\"range\": {\"timestamp\": {\"gt\": \"2016-10-06T00:00:00.558+03:00\"}}}"; + + // Validate that the query is marshalled correctly to the POJO and that + // the generated ElasticSearch syntax looks as expected. + dateRangeQuery = mapper.readValue(dateRangeJson, RangeQuery.class); + + assertTrue("Unexpected marshalled value for 'field'. Expected: " + field + " Actual: " + + dateRangeQuery.getField(), field.equals(dateRangeQuery.getField())); + + assertTrue("Unexpected type for 'gt' value. Expected: String Actual: " + + dateRangeQuery.getGt().getClass().getName(), dateRangeQuery.getGt() instanceof String); + + assertTrue("Unexpected marshalled value for 'gt'. Expected: " + greaterThanDate + " Actual: " + + dateRangeQuery.getGt(), greaterThanDate.equals(dateRangeQuery.getGt())); + + assertTrue( + "Unexpected ElasticSearch syntax. Expected: " + dateRangeExpectedES + " Actual: " + + dateRangeQuery.toElasticSearch(), + dateRangeExpectedES.equals(dateRangeQuery.toElasticSearch())); - assertEquals("Unexpected marshalled value for 'gt'. Expected: " + greaterThanDouble + " Actual: " + numericRangeQuery.getGt(), - greaterThanDouble, numericRangeQuery.getGt()); + } - assertEquals("Unexpected marshalled value for 'lte'. Expected: " + lessThanDouble + " Actual: " + numericRangeQuery.getLte(), - lessThanDouble, numericRangeQuery.getLte()); - - assertTrue("Unexpected ElasticSearch syntax. Expected: " + numericRangeExpectedES + " Actual: " + numericRangeQuery.toElasticSearch(), - numericRangeExpectedES.equals(numericRangeQuery.toElasticSearch())); - } + /** + * This test validates that numeric range queries can be marshalled to a Java POJO and unmarshalled to ElasticSearch + * syntax. + * + * @throws JsonParseException + * @throws JsonMappingException + * @throws IOException + */ + @Test + public void numericRangeQueryTest() throws JsonParseException, JsonMappingException, IOException { + + String field = "version"; + Integer greaterThanInt = 5; + Integer lessThanInt = 100; + + ObjectMapper mapper = new ObjectMapper(); + + // Generate a numeric range query using 'greater than or equal' and 'less + // than or equal' operations. + String numericRangeJson = + "{ \"field\": \"" + field + "\", \"gte\": " + greaterThanInt + ", \"lte\": " + lessThanInt + "}"; + String numericRangeExpectedES = + "{\"range\": {\"" + field + "\": {\"gte\": " + greaterThanInt + ", \"lte\": " + lessThanInt + "}}}"; + + // Validate that the query is marshalled correctly to the POJO and that + // the generated ElasticSearch syntax looks as expected. + RangeQuery numericRangeQuery = mapper.readValue(numericRangeJson, RangeQuery.class); + + assertTrue("Unexpected marshalled value for 'field'. Expected: " + field + " Actual: " + + numericRangeQuery.getField(), field.equals(numericRangeQuery.getField())); + assertTrue( + "Unexpected type for 'gte' value. Expected: Integer Actual: " + + numericRangeQuery.getGte().getClass().getName(), + numericRangeQuery.getGte() instanceof Integer); + assertTrue( + "Unexpected type for 'lte' value. Expected: Integer Actual: " + + numericRangeQuery.getLte().getClass().getName(), + numericRangeQuery.getLte() instanceof Integer); + assertEquals("Unexpected marshalled value for 'gte'. Expected: " + greaterThanInt + " Actual: " + + numericRangeQuery.getGte(), greaterThanInt, numericRangeQuery.getGte()); + assertEquals("Unexpected marshalled value for 'lte'. Expected: " + lessThanInt + " Actual: " + + numericRangeQuery.getLte(), lessThanInt, numericRangeQuery.getLte()); + assertTrue( + "Unexpected ElasticSearch syntax. Expected: " + numericRangeExpectedES + " Actual: " + + numericRangeQuery.toElasticSearch(), + numericRangeExpectedES.equals(numericRangeQuery.toElasticSearch())); + + + Double greaterThanDouble = 5.0; + Double lessThanDouble = 100.0; + + // Generate a date range query using 'greater than' and 'less than or + // equal' operations. + numericRangeJson = + "{ \"field\": \"" + field + "\", \"gt\": " + greaterThanDouble + ", \"lte\": " + lessThanDouble + "}"; + numericRangeExpectedES = "{\"range\": {\"" + field + "\": {\"gt\": " + greaterThanDouble + ", \"lte\": " + + lessThanDouble + "}}}"; + + // Validate that the query is marshalled correctly to the POJO and that + // the generated ElasticSearch syntax looks as expected. + numericRangeQuery = mapper.readValue(numericRangeJson, RangeQuery.class); + + assertTrue("Unexpected marshalled value for 'field'. Expected: " + field + " Actual: " + + numericRangeQuery.getField(), field.equals(numericRangeQuery.getField())); + + assertTrue("Unexpected type for 'gt' value. Expected: Double Actual: " + + numericRangeQuery.getGt().getClass().getName(), numericRangeQuery.getGt() instanceof Double); + + assertTrue( + "Unexpected type for 'lte' value. Expected: Double Actual: " + + numericRangeQuery.getLte().getClass().getName(), + numericRangeQuery.getLte() instanceof Double); + + assertEquals("Unexpected marshalled value for 'gt'. Expected: " + greaterThanDouble + " Actual: " + + numericRangeQuery.getGt(), greaterThanDouble, numericRangeQuery.getGt()); + + assertEquals("Unexpected marshalled value for 'lte'. Expected: " + lessThanDouble + " Actual: " + + numericRangeQuery.getLte(), lessThanDouble, numericRangeQuery.getLte()); + + assertTrue( + "Unexpected ElasticSearch syntax. Expected: " + numericRangeExpectedES + " Actual: " + + numericRangeQuery.toElasticSearch(), + numericRangeExpectedES.equals(numericRangeQuery.toElasticSearch())); + } } diff --git a/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/RangeQueryTest.java b/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/RangeQueryTest.java index a06a2a0..e8ca844 100644 --- a/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/RangeQueryTest.java +++ b/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/RangeQueryTest.java @@ -29,8 +29,8 @@ import org.onap.aai.sa.rest.TestUtils; public class RangeQueryTest { - @Test(expected=IllegalArgumentException.class) - public void testSetGt(){ + @Test(expected = IllegalArgumentException.class) + public void testSetGt() { RangeQuery rq = new RangeQuery(); rq.setLt(new String("2x")); @@ -40,8 +40,8 @@ public class RangeQueryTest { rq.setGt(new Integer(1)); } - @Test(expected=IllegalArgumentException.class) - public void testSetGte(){ + @Test(expected = IllegalArgumentException.class) + public void testSetGte() { RangeQuery rq = new RangeQuery(); rq.setGt(new Integer(1)); @@ -50,8 +50,8 @@ public class RangeQueryTest { rq.setGte(new Integer(1)); } - @Test(expected=IllegalArgumentException.class) - public void testSetLt(){ + @Test(expected = IllegalArgumentException.class) + public void testSetLt() { RangeQuery rq = new RangeQuery(); rq.setLt(new Integer(1)); @@ -66,8 +66,8 @@ public class RangeQueryTest { rq.setLt(new String("10")); } - @Test(expected=IllegalArgumentException.class) - public void testSetLte(){ + @Test(expected = IllegalArgumentException.class) + public void testSetLte() { RangeQuery rq = new RangeQuery(); rq.setGt(new Integer(1)); rq.setTimeZone("CT"); @@ -88,12 +88,12 @@ public class RangeQueryTest { Aggregation a1 = getAggregationObject(); Aggregation a2 = getAggregationObject(); - Aggregation[] aggs= new Aggregation[] {a1, a2}; + Aggregation[] aggs = new Aggregation[] {a1, a2}; ss.setAggregations(aggs); Assert.assertNotNull(ss.toString()); } - private Aggregation getAggregationObject(){ + private Aggregation getAggregationObject() { Aggregation a = new Aggregation(); AggregationStatement as = new AggregationStatement(); @@ -126,7 +126,7 @@ public class RangeQueryTest { Assert.assertEquals(dr.getToDate(), "21-12-2017"); DateRange[] drs = {dr}; dra.setDateRanges(drs); - Assert.assertTrue(dra.getDateRanges().length==1); + Assert.assertTrue(dra.getDateRanges().length == 1); Assert.assertNotNull(dra.toElasticSearch()); Assert.assertNotNull(dra.toString()); as.setDateRange(dra); diff --git a/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/SearchStatementTest.java b/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/SearchStatementTest.java index 03cf238..45ad666 100644 --- a/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/SearchStatementTest.java +++ b/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/SearchStatementTest.java @@ -36,234 +36,176 @@ import org.onap.aai.sa.rest.TestUtils; public class SearchStatementTest { - @Test - public void simpleQueryTest() throws JsonParseException, JsonMappingException, IOException { - - String field = "searchTags"; - String queryString = "aai3255"; - String queryJson = - "{" - + "\"queries\": [" - + "{\"may\": {\"parsed-query\": {" - + "\"field\": \"" + field + "\"," - + "\"query-string\": \"" + queryString + "\"}}}" - + "]" - + "}" - + "}"; - - String queryES = - "{" - + "\"version\": true," - + "\"query\": {" - + "\"bool\": {" - + "\"must\": [], " - + "\"should\": [" - + "{\"query_string\": {\"default_field\": \"searchTags\", \"query\": \"aai3255\"}}" - + "]," - + "\"must_not\": []}" - + "}" - + "}"; - - // Marshal our simple query JSON to a SearchStatement object. - ObjectMapper mapper = new ObjectMapper(); - SearchStatement ss = mapper.readValue(queryJson, SearchStatement.class); - - // We expect to have a search statement with one query. - assertEquals("Unexpected number of queries in marshalled result", - 1, ss.getQueries().length); - - // Validate that the query is of the expected type and contains the - // expected values. - QueryStatement query = ss.getQueries()[0].getQueryStatement(); - assertNotNull("Expected marshalled statement to contain a 'parsed query'", - query.getParsedQuery()); - assertTrue("Unexpected field name in marshalled query. Expected: " + field + " Actual: " + query.getParsedQuery().getField(), - field.equals(query.getParsedQuery().getField())); - assertTrue("Unexpected query string in marshalled query. Expected: " + queryString + " Actual: " + query.getParsedQuery().getQueryString(), - queryString.equals(query.getParsedQuery().getQueryString())); - - // Validate that we are able to produce the expected ElasticSearch - // query syntax from the search statement. - assertTrue("Unexpected ElasticSearch syntax. Expected: " + queryES + " Actual: " + ss.toElasticSearch(), - queryES.equals(ss.toElasticSearch())); - } - - - @Test - public void simpleSortedQueryTest() throws JsonParseException, JsonMappingException, IOException { - - String field = "searchTags"; - String queryString = "aai3255"; - String queryJson = - "{" - + "\"queries\": [" - + "{\"may\": {\"parsed-query\": {" - + "\"field\": \"" + field + "\"," - + "\"query-string\": \"" + queryString + "\"}}}" - + "]," - + "\"sort\": { \"field\": \"date\", \"order\": \"ascending\" }" - + "}"; - - - String queryES = - "{" - + "\"version\": true," - + "\"query\": {" - + "\"bool\": {" - + "\"must\": [], " - + "\"should\": [" - + "{\"query_string\": {\"default_field\": \"searchTags\", \"query\": \"aai3255\"}}" - + "]," - + "\"must_not\": []" - + "}" - + "}, " - + "\"sort\": { \"date\": { \"order\": \"asc\"}}" - + "}"; - - // Marshal our simple query JSON to a SearchStatement object. - ObjectMapper mapper = new ObjectMapper(); - SearchStatement ss = mapper.readValue(queryJson, SearchStatement.class); - - // We expect to have a search statement with one query. - assertEquals("Unexpected number of queries in marshalled result", - 1, ss.getQueries().length); - - // Validate that the query is of the expected type and contains the - // expected values. - QueryStatement query = ss.getQueries()[0].getQueryStatement(); - assertNotNull("Expected marshalled statement to contain a 'parsed query'", - query.getParsedQuery()); - assertTrue("Unexpected field name in marshalled query. Expected: " + field + " Actual: " + query.getParsedQuery().getField(), - field.equals(query.getParsedQuery().getField())); - assertTrue("Unexpected query string in marshalled query. Expected: " + queryString + " Actual: " + query.getParsedQuery().getQueryString(), - queryString.equals(query.getParsedQuery().getQueryString())); - System.out.println("GDF: ES = " + ss.toElasticSearch()); - // Validate that we are able to produce the expected ElasticSearch - // query syntax from the search statement. - assertTrue("Unexpected ElasticSearch syntax. Expected: " + queryES + " Actual: " + ss.toElasticSearch(), - queryES.equals(ss.toElasticSearch())); - assertNull(ss.getAggregations()); - } - - @Test - public void filteredQueryTest() throws JsonParseException, JsonMappingException, IOException { - - String filterField1 = "field1"; - String filterField2 = "field2"; - String filterField3 = "field3"; - String filterValue1 = "a"; - String filterValue2 = "b"; - String filterValue3 = "string"; - String filterJson = "{ \"any\": [ " - + "{\"match\": {\"field\": \"" + filterField1 + "\", \"value\": \"" + filterValue1 + "\"}}," - + "{\"match\": {\"field\": \"" + filterField2 + "\", \"value\": \"" + filterValue2 + "\"}}" - + "]," - + "\"all\": [" - + "{\"parsed-query\": {\"field\": \"" + filterField3 + "\", \"query-string\": \"" + filterValue3 + "\"}}" - + "]" - + "}"; - - String filterStanzaJson = "\"filter\": " + filterJson; - - String queryStanzaJson = "\"queries\": [ " - + "{\"may\": {\"match\": {\"field\": \"searchTags\", \"value\": \"a\"}}}," - + "{\"may\": {\"match\": {\"field\": \"searchTags\", \"value\": \"b\"}}}," - + "{\"may\": {\"parsed-query\": {\"field\": \"fieldname\", \"query-string\": \"string\"}}}" - + "]"; - - String queryES = - "{" - + "\"version\": true," - + "\"query\": {" - + "\"bool\": {" - + "\"must\": [], " - + "\"should\": [" - + "{\"term\": {\"searchTags\" : \"a\"}}, " - + "{\"term\": {\"searchTags\" : \"b\"}}, " - + "{\"query_string\": {\"default_field\": \"fieldname\", \"query\": \"string\"}}" - + "]," - + "\"must_not\": [], " - + "\"filter\": {" - + "\"bool\": {" - + "\"must\": [" - + "{\"query_string\": {\"default_field\": \"field3\", \"query\": \"string\"}}" - + "]," - + "\"must_not\": []," - + "\"should\": [" - + "{\"term\": {\"field1\" : \"a\"}}, " - + "{\"term\": {\"field2\" : \"b\"}}" - + "]," - + "\"must_not\": []" - + "}" - + "}" - + "}" - + "}" - + "}"; - - StringBuilder sb = new StringBuilder(); - sb.append("{"); - sb.append(filterStanzaJson).append(", "); - sb.append(queryStanzaJson); - sb.append("}"); - - ObjectMapper mapper = new ObjectMapper(); - SearchStatement ss = mapper.readValue(sb.toString(), SearchStatement.class); - - assertEquals("Unexpected number of queries in the 'any' list for this statement's filter", - 2, ss.getFilter().getAny().length); - assertEquals("Unexpected number of queries in the 'all' list for this statement's filter", - 1, ss.getFilter().getAll().length); - - assertTrue("Unexpected ElasticSearch syntax. Expected: " + queryES + " Actual: " + ss.toElasticSearch(), - queryES.equals(ss.toElasticSearch())); - - assertNull(ss.getAggregations()); - } - - @Test - public void aggregationTest() { - String input = "{\r\n \"queries\": [\r\n {\r\n \"must\": {\r\n \"match\": {\r\n \"field\": \"searchTags\",\r\n \"value\": \"a\"\r\n }\r\n }\r\n }\r\n ],\r\n \"aggregations\": [\r\n {\r\n \"name\": \"byDate\",\r\n \"aggregation\": {\r\n \"date-range\": {\r\n \"field\": \"mydate\",\r\n \"ranges\": [\r\n {\r\n \"from\": \"2016-12-19T00:00:00.738-05:00\",\r\n \"to\": \"2016-12-23T23:59:59.738-05:00\"\r\n }\r\n ]\r\n },\r\n \"sub-aggregations\": [\r\n {\r\n \"name\": \"byTerm\",\r\n \"aggregation\": {\r\n \"group-by\": {\r\n \"field\": \"myterm\"\r\n }\r\n }\r\n },\r\n {\r\n \"name\": \"byDate\",\r\n \"aggregation\": {\r\n \"date-histogram\": {\r\n \"field\": \"myDate\",\r\n \"interval\": \"myInterval\"\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"name\": \"2nd\",\r\n \"aggregation\": {\r\n \"group-by\": {\r\n \"field\": \"anotherTerm\"\r\n }\r\n }\r\n }\r\n ]\r\n}"; - - ObjectMapper mapper = new ObjectMapper(); - try { - SearchStatement ss = mapper.readValue(input, SearchStatement.class); - Aggregation[] aggs = ss.getAggregations(); - assertNotNull(aggs); - assertEquals("Unexpected number aggregations", 2, aggs.length); - assertEquals("byDate", aggs[0].getName()); - assertNotNull(aggs[0].getStatement().getDateRange()); - assertEquals("mydate", aggs[0].getStatement().getDateRange().getField()); - assertNotNull(aggs[0].getStatement().getSubAggregations()); - assertEquals(2, aggs[0].getStatement().getSubAggregations().length); - assertEquals("byTerm", aggs[0].getStatement().getSubAggregations()[0].getName()); - assertEquals("byDate", aggs[0].getStatement().getSubAggregations()[1].getName()); - assertNull(aggs[0].getStatement().getGroupBy()); - assertEquals("2nd", aggs[1].getName()); - assertNotNull(aggs[1].getStatement().getGroupBy()); - assertEquals("anotherTerm", aggs[1].getStatement().getGroupBy().getField()); - assertNull(aggs[1].getStatement().getDateRange()); - assertNull(aggs[1].getStatement().getSubAggregations()); - - } catch (Exception e) { - fail("Encountered exception: " + e.getMessage()); + @Test + public void simpleQueryTest() throws JsonParseException, JsonMappingException, IOException { + + String field = "searchTags"; + String queryString = "aai3255"; + String queryJson = "{" + "\"queries\": [" + "{\"may\": {\"parsed-query\": {" + "\"field\": \"" + field + "\"," + + "\"query-string\": \"" + queryString + "\"}}}" + "]" + "}" + "}"; + + String queryES = "{" + "\"version\": true," + "\"query\": {" + "\"bool\": {" + "\"must\": [], " + + "\"should\": [" + "{\"query_string\": {\"default_field\": \"searchTags\", \"query\": \"aai3255\"}}" + + "]," + "\"must_not\": []}" + "}" + "}"; + + // Marshal our simple query JSON to a SearchStatement object. + ObjectMapper mapper = new ObjectMapper(); + SearchStatement ss = mapper.readValue(queryJson, SearchStatement.class); + + // We expect to have a search statement with one query. + assertEquals("Unexpected number of queries in marshalled result", 1, ss.getQueries().length); + + // Validate that the query is of the expected type and contains the + // expected values. + QueryStatement query = ss.getQueries()[0].getQueryStatement(); + assertNotNull("Expected marshalled statement to contain a 'parsed query'", query.getParsedQuery()); + assertTrue("Unexpected field name in marshalled query. Expected: " + field + " Actual: " + + query.getParsedQuery().getField(), field.equals(query.getParsedQuery().getField())); + assertTrue( + "Unexpected query string in marshalled query. Expected: " + queryString + " Actual: " + + query.getParsedQuery().getQueryString(), + queryString.equals(query.getParsedQuery().getQueryString())); + + // Validate that we are able to produce the expected ElasticSearch + // query syntax from the search statement. + assertTrue("Unexpected ElasticSearch syntax. Expected: " + queryES + " Actual: " + ss.toElasticSearch(), + queryES.equals(ss.toElasticSearch())); } - } - @Test - public void resultSetRangeTest() throws IOException { - // Simple query with a result set subrange specified. - File queryWithSubrangeFile = new File("src/test/resources/json/queries/query-with-subrange.json"); - String queryWithSubrangeStr = TestUtils.readFileToString(queryWithSubrangeFile); - String queryWithSubrangeExpectedESString = - "{\"version\": true,\"from\": 0, \"size\": 10, \"query\": {\"bool\": {\"must\": [{\"term\": {\"field1\" : \"Bob\"}}], \"should\": [],\"must_not\": []}}}"; + @Test + public void simpleSortedQueryTest() throws JsonParseException, JsonMappingException, IOException { + + String field = "searchTags"; + String queryString = "aai3255"; + String queryJson = "{" + "\"queries\": [" + "{\"may\": {\"parsed-query\": {" + "\"field\": \"" + field + "\"," + + "\"query-string\": \"" + queryString + "\"}}}" + "]," + + "\"sort\": { \"field\": \"date\", \"order\": \"ascending\" }" + "}"; + + + String queryES = "{" + "\"version\": true," + "\"query\": {" + "\"bool\": {" + "\"must\": [], " + + "\"should\": [" + "{\"query_string\": {\"default_field\": \"searchTags\", \"query\": \"aai3255\"}}" + + "]," + "\"must_not\": []" + "}" + "}, " + "\"sort\": { \"date\": { \"order\": \"asc\"}}" + "}"; + + // Marshal our simple query JSON to a SearchStatement object. + ObjectMapper mapper = new ObjectMapper(); + SearchStatement ss = mapper.readValue(queryJson, SearchStatement.class); + + // We expect to have a search statement with one query. + assertEquals("Unexpected number of queries in marshalled result", 1, ss.getQueries().length); + + // Validate that the query is of the expected type and contains the + // expected values. + QueryStatement query = ss.getQueries()[0].getQueryStatement(); + assertNotNull("Expected marshalled statement to contain a 'parsed query'", query.getParsedQuery()); + assertTrue("Unexpected field name in marshalled query. Expected: " + field + " Actual: " + + query.getParsedQuery().getField(), field.equals(query.getParsedQuery().getField())); + assertTrue( + "Unexpected query string in marshalled query. Expected: " + queryString + " Actual: " + + query.getParsedQuery().getQueryString(), + queryString.equals(query.getParsedQuery().getQueryString())); + System.out.println("GDF: ES = " + ss.toElasticSearch()); + // Validate that we are able to produce the expected ElasticSearch + // query syntax from the search statement. + assertTrue("Unexpected ElasticSearch syntax. Expected: " + queryES + " Actual: " + ss.toElasticSearch(), + queryES.equals(ss.toElasticSearch())); + assertNull(ss.getAggregations()); + } + + @Test + public void filteredQueryTest() throws JsonParseException, JsonMappingException, IOException { + + String filterField1 = "field1"; + String filterField2 = "field2"; + String filterField3 = "field3"; + String filterValue1 = "a"; + String filterValue2 = "b"; + String filterValue3 = "string"; + String filterJson = "{ \"any\": [ " + "{\"match\": {\"field\": \"" + filterField1 + "\", \"value\": \"" + + filterValue1 + "\"}}," + "{\"match\": {\"field\": \"" + filterField2 + "\", \"value\": \"" + + filterValue2 + "\"}}" + "]," + "\"all\": [" + "{\"parsed-query\": {\"field\": \"" + filterField3 + + "\", \"query-string\": \"" + filterValue3 + "\"}}" + "]" + "}"; + + String filterStanzaJson = "\"filter\": " + filterJson; + + String queryStanzaJson = "\"queries\": [ " + + "{\"may\": {\"match\": {\"field\": \"searchTags\", \"value\": \"a\"}}}," + + "{\"may\": {\"match\": {\"field\": \"searchTags\", \"value\": \"b\"}}}," + + "{\"may\": {\"parsed-query\": {\"field\": \"fieldname\", \"query-string\": \"string\"}}}" + "]"; + + String queryES = "{" + "\"version\": true," + "\"query\": {" + "\"bool\": {" + "\"must\": [], " + + "\"should\": [" + "{\"term\": {\"searchTags\" : \"a\"}}, " + "{\"term\": {\"searchTags\" : \"b\"}}, " + + "{\"query_string\": {\"default_field\": \"fieldname\", \"query\": \"string\"}}" + "]," + + "\"must_not\": [], " + "\"filter\": {" + "\"bool\": {" + "\"must\": [" + + "{\"query_string\": {\"default_field\": \"field3\", \"query\": \"string\"}}" + "]," + + "\"must_not\": []," + "\"should\": [" + "{\"term\": {\"field1\" : \"a\"}}, " + + "{\"term\": {\"field2\" : \"b\"}}" + "]," + "\"must_not\": []" + "}" + "}" + "}" + "}" + "}"; + + StringBuilder sb = new StringBuilder(); + sb.append("{"); + sb.append(filterStanzaJson).append(", "); + sb.append(queryStanzaJson); + sb.append("}"); + + ObjectMapper mapper = new ObjectMapper(); + SearchStatement ss = mapper.readValue(sb.toString(), SearchStatement.class); + + assertEquals("Unexpected number of queries in the 'any' list for this statement's filter", 2, + ss.getFilter().getAny().length); + assertEquals("Unexpected number of queries in the 'all' list for this statement's filter", 1, + ss.getFilter().getAll().length); + + assertTrue("Unexpected ElasticSearch syntax. Expected: " + queryES + " Actual: " + ss.toElasticSearch(), + queryES.equals(ss.toElasticSearch())); + + assertNull(ss.getAggregations()); + } + + @Test + public void aggregationTest() { + String input = + "{\r\n \"queries\": [\r\n {\r\n \"must\": {\r\n \"match\": {\r\n \"field\": \"searchTags\",\r\n \"value\": \"a\"\r\n }\r\n }\r\n }\r\n ],\r\n \"aggregations\": [\r\n {\r\n \"name\": \"byDate\",\r\n \"aggregation\": {\r\n \"date-range\": {\r\n \"field\": \"mydate\",\r\n \"ranges\": [\r\n {\r\n \"from\": \"2016-12-19T00:00:00.738-05:00\",\r\n \"to\": \"2016-12-23T23:59:59.738-05:00\"\r\n }\r\n ]\r\n },\r\n \"sub-aggregations\": [\r\n {\r\n \"name\": \"byTerm\",\r\n \"aggregation\": {\r\n \"group-by\": {\r\n \"field\": \"myterm\"\r\n }\r\n }\r\n },\r\n {\r\n \"name\": \"byDate\",\r\n \"aggregation\": {\r\n \"date-histogram\": {\r\n \"field\": \"myDate\",\r\n \"interval\": \"myInterval\"\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"name\": \"2nd\",\r\n \"aggregation\": {\r\n \"group-by\": {\r\n \"field\": \"anotherTerm\"\r\n }\r\n }\r\n }\r\n ]\r\n}"; + + ObjectMapper mapper = new ObjectMapper(); + try { + SearchStatement ss = mapper.readValue(input, SearchStatement.class); + Aggregation[] aggs = ss.getAggregations(); + assertNotNull(aggs); + assertEquals("Unexpected number aggregations", 2, aggs.length); + assertEquals("byDate", aggs[0].getName()); + assertNotNull(aggs[0].getStatement().getDateRange()); + assertEquals("mydate", aggs[0].getStatement().getDateRange().getField()); + assertNotNull(aggs[0].getStatement().getSubAggregations()); + assertEquals(2, aggs[0].getStatement().getSubAggregations().length); + assertEquals("byTerm", aggs[0].getStatement().getSubAggregations()[0].getName()); + assertEquals("byDate", aggs[0].getStatement().getSubAggregations()[1].getName()); + assertNull(aggs[0].getStatement().getGroupBy()); + assertEquals("2nd", aggs[1].getName()); + assertNotNull(aggs[1].getStatement().getGroupBy()); + assertEquals("anotherTerm", aggs[1].getStatement().getGroupBy().getField()); + assertNull(aggs[1].getStatement().getDateRange()); + assertNull(aggs[1].getStatement().getSubAggregations()); + + } catch (Exception e) { + fail("Encountered exception: " + e.getMessage()); + } + } + + @Test + public void resultSetRangeTest() throws IOException { - ObjectMapper mapper = new ObjectMapper(); - SearchStatement ss = mapper.readValue(queryWithSubrangeStr, SearchStatement.class); + // Simple query with a result set subrange specified. + File queryWithSubrangeFile = new File("src/test/resources/json/queries/query-with-subrange.json"); + String queryWithSubrangeStr = TestUtils.readFileToString(queryWithSubrangeFile); + String queryWithSubrangeExpectedESString = + "{\"version\": true,\"from\": 0, \"size\": 10, \"query\": {\"bool\": {\"must\": [{\"term\": {\"field1\" : \"Bob\"}}], \"should\": [],\"must_not\": []}}}"; - assertEquals("Unexpected index for result set start", ss.getFrom(), (Integer) 0); - assertEquals("Unexpected value for result set size", ss.getSize(), (Integer) 10); - assertTrue("Unexpected elastic search query generated from search statement", - ss.toElasticSearch().equals(queryWithSubrangeExpectedESString)); - } + ObjectMapper mapper = new ObjectMapper(); + SearchStatement ss = mapper.readValue(queryWithSubrangeStr, SearchStatement.class); + + assertEquals("Unexpected index for result set start", ss.getFrom(), (Integer) 0); + assertEquals("Unexpected value for result set size", ss.getSize(), (Integer) 10); + assertTrue("Unexpected elastic search query generated from search statement", + ss.toElasticSearch().equals(queryWithSubrangeExpectedESString)); + } } diff --git a/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/SortTest.java b/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/SortTest.java index 9b93a25..832fa98 100644 --- a/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/SortTest.java +++ b/src/test/java/org/onap/aai/sa/searchdbabstraction/searchapi/SortTest.java @@ -30,20 +30,20 @@ import org.junit.Test; public class SortTest { - @Test - public void sortFieldTest() throws JsonParseException, JsonMappingException, IOException { + @Test + public void sortFieldTest() throws JsonParseException, JsonMappingException, IOException { - String field = "fieldname"; - String order = "ascending"; - String json = "{\"field\": \"" + field + "\", \"order\": \"" + order + "\"}"; + String field = "fieldname"; + String order = "ascending"; + String json = "{\"field\": \"" + field + "\", \"order\": \"" + order + "\"}"; - ObjectMapper mapper = new ObjectMapper(); - Sort sort = mapper.readValue(json, Sort.class); + ObjectMapper mapper = new ObjectMapper(); + Sort sort = mapper.readValue(json, Sort.class); - assertTrue("Unexpected field name in marshalled object. Expected: " + field + " Actual: " + sort.getField(), - field.equals(sort.getField())); - assertTrue("Unexpected order field in marshalled object. Expected: " + order + " Actual: " + sort.getOrder(), - order.equals(sort.getOrder().toString())); + assertTrue("Unexpected field name in marshalled object. Expected: " + field + " Actual: " + sort.getField(), + field.equals(sort.getField())); + assertTrue("Unexpected order field in marshalled object. Expected: " + order + " Actual: " + sort.getOrder(), + order.equals(sort.getOrder().toString())); - } + } } diff --git a/src/test/java/org/onap/aai/sa/searchdbabstraction/util/ElasticSearchPayloadTranslatorTest.java b/src/test/java/org/onap/aai/sa/searchdbabstraction/util/ElasticSearchPayloadTranslatorTest.java index 40209d6..877b64f 100644 --- a/src/test/java/org/onap/aai/sa/searchdbabstraction/util/ElasticSearchPayloadTranslatorTest.java +++ b/src/test/java/org/onap/aai/sa/searchdbabstraction/util/ElasticSearchPayloadTranslatorTest.java @@ -30,26 +30,26 @@ import org.junit.Before; import org.junit.Test; public class ElasticSearchPayloadTranslatorTest { - - private final String SIMPLE_DOC_SCHEMA_JSON = "src/test/resources/json/index-mapping.json"; - @Before - public void setup() throws Exception { - System.setProperty("CONFIG_HOME", System.getProperty("user.dir")+ File.separator + "src/test/resources/json"); - } - - @Test - public void testPayloadTranslation() throws Exception { - String expectedErrMsg = "Sample error message for whitespace check"; - File schemaFile = new File(SIMPLE_DOC_SCHEMA_JSON); - String documentJson = IOUtils.toString(new FileInputStream(schemaFile), "UTF-8"); - assertTrue(documentJson.contains("\"type\": \"string\"")); - assertTrue(documentJson.contains("\"index\": \"analyzed\"")); - String translatedPayload = ElasticSearchPayloadTranslator.translateESPayload(documentJson); - assertTrue(translatedPayload.contains("\"type\":\"text\"")); - assertTrue(translatedPayload.contains("\"index\":true")); - assertTrue(translatedPayload.contains("\"fielddata\":true")); - assertFalse(documentJson.contains("\"index\":\"analyzed\"")); - assertTrue(translatedPayload.contains("\"errMsg\":\""+expectedErrMsg+"\"")); - } + private final String SIMPLE_DOC_SCHEMA_JSON = "src/test/resources/json/index-mapping.json"; + + @Before + public void setup() throws Exception { + System.setProperty("CONFIG_HOME", System.getProperty("user.dir") + File.separator + "src/test/resources/json"); + } + + @Test + public void testPayloadTranslation() throws Exception { + String expectedErrMsg = "Sample error message for whitespace check"; + File schemaFile = new File(SIMPLE_DOC_SCHEMA_JSON); + String documentJson = IOUtils.toString(new FileInputStream(schemaFile), "UTF-8"); + assertTrue(documentJson.contains("\"type\": \"string\"")); + assertTrue(documentJson.contains("\"index\": \"analyzed\"")); + String translatedPayload = ElasticSearchPayloadTranslator.translateESPayload(documentJson); + assertTrue(translatedPayload.contains("\"type\":\"text\"")); + assertTrue(translatedPayload.contains("\"index\":true")); + assertTrue(translatedPayload.contains("\"fielddata\":true")); + assertFalse(documentJson.contains("\"index\":\"analyzed\"")); + assertTrue(translatedPayload.contains("\"errMsg\":\"" + expectedErrMsg + "\"")); + } } -- 2.16.6