From 27da2e3395b009702c9032f9fa184f253747c8a7 Mon Sep 17 00:00:00 2001 From: Shawn Severin Date: Fri, 8 Dec 2017 08:57:17 -0500 Subject: Adding back-end support for UI filters Issue-ID: AAI-543 Change-Id: I15b7ef1a9d4091981444019b5cceac08c4045c51 Signed-off-by: Shawn Severin --- pom.xml | 55 +-- .../routes/sparky-core-unifiedFilterRequest.route | 4 + .../org/onap/aai/sparky/logging/AaiUiMsgs.java | 6 + .../search/filters/FilterElasticSearchAdapter.java | 137 ++++++++ .../aai/sparky/search/filters/FilterProcessor.java | 142 ++++++++ .../sparky/search/filters/FilterQueryBuilder.java | 220 ++++++++++++ .../search/filters/FilteredSearchHelper.java | 156 +++++++++ .../search/filters/UiFiltersEntityConverter.java | 178 ++++++++++ .../search/filters/config/FiltersConfig.java | 157 +++++++++ .../filters/config/FiltersDetailsConfig.java | 55 +++ .../filters/config/FiltersForViewsConfig.java | 55 +++ .../search/filters/config/UiFilterConfig.java | 186 ++++++++++ .../filters/config/UiFilterDataSourceConfig.java | 97 ++++++ .../filters/config/UiFilterListItemConfig.java | 69 ++++ .../config/UiFilterOptionsValuesConfig.java | 66 ++++ .../filters/config/UiViewListItemConfig.java | 66 ++++ .../search/filters/entity/AggregationEntity.java | 78 +++++ .../search/filters/entity/BoolQueryBuilder.java | 121 +++++++ .../entity/FilteredAggregationQueryBuilder.java | 63 ++++ .../filters/entity/MatchFilterCriteriaEntity.java | 75 +++++ .../sparky/search/filters/entity/SearchFilter.java | 86 +++++ .../search/filters/entity/UiFilterEntity.java | 178 ++++++++++ .../search/filters/entity/UiFilterValueEntity.java | 78 +++++ .../search/filters/entity/UiFiltersEntity.java | 51 +++ .../security/portal/PortalRestAPIServiceImpl.java | 8 +- .../config/NetworkStatisticsConfig.java | 237 +++++++++++++ .../config/TierSupportUiConstants.java | 26 +- .../sparky/search/filters/FilterProcessorTest.java | 373 +++++++++++++++++++++ .../search/filters/FilteredSearchHelperTest.java | 69 ++++ .../filters/entity/DiscoverFiltersRequest.java | 40 +++ .../search/filters/entity/ViewConfiguration.java | 68 ++++ .../sparky/search/filters/entity/ViewFilter.java | 57 ++++ ...estionEntity_getIndexDocumentJson_expected.json | 1 + src/test/resources/filters/aaiui_filters.json | 88 +++++ src/test/resources/filters/aaiui_views.json | 38 +++ ...Endpoint_emptyRequestBody_expectedResponse.json | 1 + ...t_emptyRequestFilterArray_expectedResponse.json | 1 + ...dpoint_emptyRequestFilterArray_requestBody.json | 3 + ...ationEndpoint_successPath_expectedResponse.json | 1 + ...gationEndpoint_successPath_operationResult.json | 1 + ...ggregationEndpoint_successPath_requestBody.json | 11 + 41 files changed, 3369 insertions(+), 33 deletions(-) create mode 100644 src/main/ajsc/inventory-ui-service_v1/inventory-ui-service/v1/routes/sparky-core-unifiedFilterRequest.route create mode 100644 src/main/java/org/onap/aai/sparky/search/filters/FilterElasticSearchAdapter.java create mode 100644 src/main/java/org/onap/aai/sparky/search/filters/FilterProcessor.java create mode 100644 src/main/java/org/onap/aai/sparky/search/filters/FilterQueryBuilder.java create mode 100644 src/main/java/org/onap/aai/sparky/search/filters/FilteredSearchHelper.java create mode 100644 src/main/java/org/onap/aai/sparky/search/filters/UiFiltersEntityConverter.java create mode 100644 src/main/java/org/onap/aai/sparky/search/filters/config/FiltersConfig.java create mode 100644 src/main/java/org/onap/aai/sparky/search/filters/config/FiltersDetailsConfig.java create mode 100644 src/main/java/org/onap/aai/sparky/search/filters/config/FiltersForViewsConfig.java create mode 100644 src/main/java/org/onap/aai/sparky/search/filters/config/UiFilterConfig.java create mode 100644 src/main/java/org/onap/aai/sparky/search/filters/config/UiFilterDataSourceConfig.java create mode 100644 src/main/java/org/onap/aai/sparky/search/filters/config/UiFilterListItemConfig.java create mode 100644 src/main/java/org/onap/aai/sparky/search/filters/config/UiFilterOptionsValuesConfig.java create mode 100644 src/main/java/org/onap/aai/sparky/search/filters/config/UiViewListItemConfig.java create mode 100644 src/main/java/org/onap/aai/sparky/search/filters/entity/AggregationEntity.java create mode 100644 src/main/java/org/onap/aai/sparky/search/filters/entity/BoolQueryBuilder.java create mode 100644 src/main/java/org/onap/aai/sparky/search/filters/entity/FilteredAggregationQueryBuilder.java create mode 100644 src/main/java/org/onap/aai/sparky/search/filters/entity/MatchFilterCriteriaEntity.java create mode 100644 src/main/java/org/onap/aai/sparky/search/filters/entity/SearchFilter.java create mode 100644 src/main/java/org/onap/aai/sparky/search/filters/entity/UiFilterEntity.java create mode 100644 src/main/java/org/onap/aai/sparky/search/filters/entity/UiFilterValueEntity.java create mode 100644 src/main/java/org/onap/aai/sparky/search/filters/entity/UiFiltersEntity.java create mode 100644 src/main/java/org/onap/aai/sparky/synchronizer/config/NetworkStatisticsConfig.java create mode 100644 src/test/java/org/onap/aai/sparky/search/filters/FilterProcessorTest.java create mode 100644 src/test/java/org/onap/aai/sparky/search/filters/FilteredSearchHelperTest.java create mode 100644 src/test/java/org/onap/aai/sparky/search/filters/entity/DiscoverFiltersRequest.java create mode 100644 src/test/java/org/onap/aai/sparky/search/filters/entity/ViewConfiguration.java create mode 100644 src/test/java/org/onap/aai/sparky/search/filters/entity/ViewFilter.java create mode 100644 src/test/resources/filters/AggregationSuggestionEntity_getIndexDocumentJson_expected.json create mode 100644 src/test/resources/filters/aaiui_filters.json create mode 100644 src/test/resources/filters/aaiui_views.json create mode 100644 src/test/resources/filters/filterAggregationEndpoint_emptyRequestBody_expectedResponse.json create mode 100644 src/test/resources/filters/filterAggregationEndpoint_emptyRequestFilterArray_expectedResponse.json create mode 100644 src/test/resources/filters/filterAggregationEndpoint_emptyRequestFilterArray_requestBody.json create mode 100644 src/test/resources/filters/filterAggregationEndpoint_successPath_expectedResponse.json create mode 100644 src/test/resources/filters/filterAggregationEndpoint_successPath_operationResult.json create mode 100644 src/test/resources/filters/filterAggregationEndpoint_successPath_requestBody.json diff --git a/pom.xml b/pom.xml index da73f2b..39370ea 100644 --- a/pom.xml +++ b/pom.xml @@ -18,6 +18,9 @@ v1 2.0.0 /appl/${project.artifactId} + org.amdocs.aaiee + sparky-fe + 1.1.0-SNAPSHOT - java - jacoco - ${project.build.directory}/surefire-reports - ${project.build.directory}/coverage-reports/jacoco.exec - false - ${project.version} + https://nexus.onap.org + + + java + jacoco + ${project.build.directory}/surefire-reports + ${project.build.directory}/coverage-reports/jacoco.exec + false + ${project.version} @@ -105,13 +108,6 @@ 1.7.20 - - org.onap.aai - rest-client - 1.1.0-SNAPSHOT - - - org.hamcrest hamcrest-library @@ -149,13 +145,24 @@ 2.7.4 - - - org.onap.aai.logging-service - common-logging - 1.1.0-SNAPSHOT - - + + org.onap.aai.logging-service + common-logging + 1.2.0-SNAPSHOT + + + + org.onap.aai.aai-common + aai-schema + 1.2.0-SNAPSHOT + + + + org.onap.aai + rest-client + 1.2.0-SNAPSHOT + + com.google.code.gson gson @@ -400,7 +407,7 @@ org.onap.aai.sparky-fe sparky-fe - 1.0.0-SNAPSHOT + 1.1.0-SNAPSHOT war ${basedir}/target/swm/package/nix/dist_files${distFilesRoot}/extApps/ aai.war diff --git a/src/main/ajsc/inventory-ui-service_v1/inventory-ui-service/v1/routes/sparky-core-unifiedFilterRequest.route b/src/main/ajsc/inventory-ui-service_v1/inventory-ui-service/v1/routes/sparky-core-unifiedFilterRequest.route new file mode 100644 index 0000000..36cf518 --- /dev/null +++ b/src/main/ajsc/inventory-ui-service_v1/inventory-ui-service/v1/routes/sparky-core-unifiedFilterRequest.route @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/main/java/org/onap/aai/sparky/logging/AaiUiMsgs.java b/src/main/java/org/onap/aai/sparky/logging/AaiUiMsgs.java index 12e53b5..4555b70 100644 --- a/src/main/java/org/onap/aai/sparky/logging/AaiUiMsgs.java +++ b/src/main/java/org/onap/aai/sparky/logging/AaiUiMsgs.java @@ -412,6 +412,12 @@ public enum AaiUiMsgs implements LogMessageEnum { ERROR_AAI_QUERY_WITH_RETRY, /** Arguments: Error extracting resource path from self-link. Error = {0} */ ERROR_EXTRACTING_RESOURCE_PATH_FROM_LINK, + /** Arguments: {0} = Schema file location */ + ERROR_READING_JSON_SCHEMA, + /** Arguments: {0} = UI view name */ + VIEW_NAME_NOT_SUPPORTED, + /** Arguments: {0} = response code, {1} = filter name */ + ERROR_FETCHING_FILTER_VALUES, /** Arguments: {0} = URI */ RESOURCE_NOT_FOUND; /** diff --git a/src/main/java/org/onap/aai/sparky/search/filters/FilterElasticSearchAdapter.java b/src/main/java/org/onap/aai/sparky/search/filters/FilterElasticSearchAdapter.java new file mode 100644 index 0000000..2fe8a0a --- /dev/null +++ b/src/main/java/org/onap/aai/sparky/search/filters/FilterElasticSearchAdapter.java @@ -0,0 +1,137 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017 Amdocs + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ +package org.onap.aai.sparky.search.filters; + +import java.util.ArrayList; +import java.util.List; + +import javax.json.JsonObject; + +import org.json.JSONArray; +import org.json.JSONObject; +import org.onap.aai.cl.api.Logger; +import org.onap.aai.cl.eelf.LoggerFactory; +import org.onap.aai.restclient.client.OperationResult; +import org.onap.aai.sparky.dal.elasticsearch.SearchAdapter; +import org.onap.aai.sparky.dal.elasticsearch.config.ElasticSearchConfig; +import org.onap.aai.sparky.logging.AaiUiMsgs; +import org.onap.aai.sparky.search.filters.config.UiFilterDataSourceConfig; +import org.onap.aai.sparky.search.filters.entity.UiFilterEntity; +import org.onap.aai.sparky.viewandinspect.config.TierSupportUiConstants; + + +/** + * Performs all Elasticsearch related queries for filters related to + * the Sparky-FE. + */ +public class FilterElasticSearchAdapter { + + private static ElasticSearchConfig esConfig = null; + private static SearchAdapter search = null; + private static final String ES_SEARCH_API = TierSupportUiConstants.ES_SEARCH_API; + private static final String APP_JSON = "application/json"; + private static final Logger LOG = LoggerFactory.getInstance().getLogger(FilterElasticSearchAdapter.class); + private static final String AGGS = "aggregations"; + private static final String CONTAINER = "default"; + private static final String BUCKETS = "buckets"; + private static final String FILTER_VALUE_KEY = "key"; + + + public FilterElasticSearchAdapter() { + try { + if (esConfig == null) { + esConfig = ElasticSearchConfig.getConfig(); + } + if (search == null) { + search = new SearchAdapter(); + } + } catch (Exception exc) { + LOG.error(AaiUiMsgs.CONFIGURATION_ERROR, "Search"); + } + } + + /** + * Get Full URL for search using elastic search configuration. + * + * @param api the api + * @return the full url + */ + private String getFullUrl(String indexName, String api) { + final String host = esConfig.getIpAddress(); + final String port = esConfig.getHttpPort(); + return String.format("http://%s:%s/%s/%s", host, port, indexName, api); + } + + /** + * For a given UiFilterEntity, will attempt to contact an Elasticsearch instance + * and fetch all possible values for filter's field name. + * + * @param filter - Filter object against which the search will take place. + * @param sourceData - If present, contains the index name and field value to search against. + * @return - A List of strings if results were found, else empty list. + */ + public List fetchValuesForFilter(UiFilterEntity filter, UiFilterDataSourceConfig dataSourceConfig) { + ArrayList filterValues = new ArrayList(); + + if(dataSourceConfig != null) { + JsonObject filterValueQuery = null; + if(dataSourceConfig.getPathToField() != null) { + filterValueQuery = FilterQueryBuilder.createNestedFilterValueQueryObject(dataSourceConfig.getFieldName(), dataSourceConfig.getPathToField()); + } else { + filterValueQuery = FilterQueryBuilder.createFilterValueQueryObject(dataSourceConfig.getFieldName()); + } + + org.onap.aai.sparky.dal.rest.OperationResult opResult = search.doPost(getFullUrl(dataSourceConfig.getIndexName(), ES_SEARCH_API), filterValueQuery.toString(), APP_JSON); + + String result = opResult.getResult(); + if(opResult.wasSuccessful() && result != null) { + JSONObject responseJson = new JSONObject(result); + JSONObject aggJson = responseJson.getJSONObject(AGGS); + + JSONObject containerJson = null; + if(dataSourceConfig.getPathToField() != null) { + JSONObject nestedContainer = aggJson.getJSONObject(dataSourceConfig.getPathToField()); + containerJson = nestedContainer.getJSONObject(dataSourceConfig.getFieldName()); + } else { + containerJson = aggJson.getJSONObject(CONTAINER); + } + + JSONArray buckets = containerJson.getJSONArray(BUCKETS); + + int bucketLength = buckets.length(); + for(int i = 0; i < bucketLength; i++) { + JSONObject filterBucket = buckets.getJSONObject(i); + + String filterValue = filterBucket.getString(FILTER_VALUE_KEY); + if(filterValue != null && !filterValue.isEmpty()) { + filterValues.add(filterValue); + } + } + } else { + LOG.error(AaiUiMsgs.ERROR_FETCHING_FILTER_VALUES, String.valueOf(opResult.getResultCode()), filter.getFilterName()); + } + } + filterValues.sort(String::compareToIgnoreCase); + return filterValues; + } +} diff --git a/src/main/java/org/onap/aai/sparky/search/filters/FilterProcessor.java b/src/main/java/org/onap/aai/sparky/search/filters/FilterProcessor.java new file mode 100644 index 0000000..100257b --- /dev/null +++ b/src/main/java/org/onap/aai/sparky/search/filters/FilterProcessor.java @@ -0,0 +1,142 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017 Amdocs + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ +package org.onap.aai.sparky.search.filters; + +import java.util.ArrayList; +import java.util.List; + +import javax.json.JsonObject; + +import org.apache.camel.Exchange; +import org.apache.camel.component.restlet.RestletConstants; +import org.onap.aai.cl.api.Logger; +import org.onap.aai.cl.eelf.LoggerFactory; +import org.onap.aai.sparky.logging.AaiUiMsgs; +import org.onap.aai.sparky.search.filters.FilteredSearchHelper; +import org.onap.aai.sparky.search.filters.entity.UiFilterEntity; +import org.onap.aai.sparky.search.filters.entity.UiFiltersEntity; +import org.onap.aai.sparky.viewandinspect.config.TierSupportUiConstants; +import org.restlet.Request; +import org.restlet.Response; +import org.restlet.data.MediaType; +import org.restlet.data.Status; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class FilterProcessor { + + private static final Logger LOG = LoggerFactory.getInstance().getLogger(FilterProcessor.class); + + private ObjectMapper mapper; + private FilteredSearchHelper filteredSearchHelper; + + public FilterProcessor() { + this.mapper = new ObjectMapper(); + } + + public FilterProcessor(FilteredSearchHelper filteredSearchHelper) { + this.mapper = new ObjectMapper(); + this.filteredSearchHelper = filteredSearchHelper; + } + + public ObjectMapper getMapper() { + return mapper; + } + + public FilteredSearchHelper getFilteredSearchHelper() { + return filteredSearchHelper; + } + + public void setFilteredSearchHelper(FilteredSearchHelper filteredSearchHelper) { + this.filteredSearchHelper = filteredSearchHelper; + } + + public void getFiltersWithValues(Exchange exchange) { + Response response = exchange.getIn().getHeader(RestletConstants.RESTLET_RESPONSE, Response.class); + + Request request = exchange.getIn().getHeader(RestletConstants.RESTLET_REQUEST, Request.class); + + /* Disables automatic Apache Camel Restlet component logging which prints out an undesirable log entry + which includes client (e.g. browser) information */ + request.setLoggable(false); + + UiFiltersEntity viewFiltersList = null; + boolean wasErrorDuringFilterDiscovery = false; + + try { + String payload = exchange.getIn().getBody(String.class); + + if (payload == null || payload.isEmpty()) { + /* Don't throw back an error, just return an empty set */ + LOG.error(AaiUiMsgs.SEARCH_SERVLET_ERROR, "Request Payload is empty"); + wasErrorDuringFilterDiscovery = true; + } else { + String viewName = mapper.readValue(payload, JsonNode.class).get(TierSupportUiConstants.UI_FILTER_VIEW_NAME_PARAMETER).asText(); + + if (viewName == null || viewName.isEmpty()) { + wasErrorDuringFilterDiscovery = true; + } else { + viewFiltersList = filteredSearchHelper.doFilterDiscovery(viewName); + } + } + } catch(Exception exc) { + LOG.error(AaiUiMsgs.ERROR_GENERIC, "FilterProcessor failed to get filter list due to error = " + exc.getMessage()); + wasErrorDuringFilterDiscovery = true; + } + + boolean wasErrorDuringValueSearch = false; + if(!wasErrorDuringFilterDiscovery) { + try { + if(!viewFiltersList.getFilters().isEmpty()) { + List filterIds = new ArrayList(); + + for(UiFilterEntity filterEntity : viewFiltersList.getFilters()) { + filterIds.add(filterEntity.getFilterId()); + } + + UiFiltersEntity responseFiltersList = filteredSearchHelper.doFilterEnumeration(filterIds); + + JsonObject finalResponse = UiFiltersEntityConverter.convertUiFiltersEntityToUnifiedFilterResponse(responseFiltersList); + + response.setStatus(Status.SUCCESS_OK); + response.setEntity(finalResponse.toString(), MediaType.APPLICATION_JSON); + exchange.getOut().setBody(response); + } else { + wasErrorDuringValueSearch = true; + } + } catch(Exception exc) { + LOG.error(AaiUiMsgs.ERROR_GENERIC, "FilterProcessor failed to generate valid unifiedFilterRequest response due to error, " + exc.getMessage()); + response.setStatus(Status.SERVER_ERROR_INTERNAL); + } + } + + // In the case of an error we want to respond with a valid empty response + if(wasErrorDuringFilterDiscovery || wasErrorDuringValueSearch) { + response.setStatus(Status.SUCCESS_OK); + response.setEntity(UiFiltersEntityConverter.generateEmptyResponse().toString(), MediaType.APPLICATION_JSON); + exchange.getOut().setBody(response); + } + } + +} diff --git a/src/main/java/org/onap/aai/sparky/search/filters/FilterQueryBuilder.java b/src/main/java/org/onap/aai/sparky/search/filters/FilterQueryBuilder.java new file mode 100644 index 0000000..23f0dce --- /dev/null +++ b/src/main/java/org/onap/aai/sparky/search/filters/FilterQueryBuilder.java @@ -0,0 +1,220 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017 Amdocs + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ +package org.onap.aai.sparky.search.filters; + +import java.util.ArrayList; +import java.util.List; + +import javax.json.Json; +import javax.json.JsonArrayBuilder; +import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; + +import org.onap.aai.sparky.search.filters.config.FiltersConfig; +import org.onap.aai.sparky.search.filters.config.UiFilterConfig; +import org.onap.aai.sparky.search.filters.entity.AggregationEntity; +import org.onap.aai.sparky.search.filters.entity.BoolQueryBuilder; +import org.onap.aai.sparky.search.filters.entity.FilteredAggregationQueryBuilder; +import org.onap.aai.sparky.search.filters.entity.MatchFilterCriteriaEntity; +import org.onap.aai.sparky.search.filters.entity.SearchFilter; + +/** + * Used to generate queries against Elasticsearch for filter related queries. + */ +public class FilterQueryBuilder { + + private static final int EXISTING_FILTERS_LIMIT = 0; + private static final int SHOULD_BRANCH_LIMIT = 2; + + public static JsonObject createFilteredBoolQueryObject(List searchFilters, int minShouldMatch, List fields) { + + if (searchFilters == null || searchFilters.size() == 0) { + return null; + } + + int searchFilterValueSize = 0; + + BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); + + FiltersConfig filters = FiltersConfig.getInstance(); + + for (SearchFilter searchFilter : searchFilters) { + + searchFilterValueSize = searchFilter.getValues().size(); + + /* + * translate the filter-id into the filter-name from the oxm data model/config file + */ + UiFilterConfig filter = filters.getFilterById(searchFilter.getFilterId()); + + if (filter == null || filter.getFilterName() == null) { + // log error and continue + } else { + + String fieldName = filter.getDataSource().getFieldName(); + if(!fields.contains(fieldName)) { + fields.add(fieldName); + } + + if (searchFilterValueSize >= SHOULD_BRANCH_LIMIT) { + // Add should branches + for (String filterValue : searchFilter.getValues()) { + boolQueryBuilder.addShouldFilter(new MatchFilterCriteriaEntity(fieldName, filterValue)); + } + + } else if (searchFilterValueSize > EXISTING_FILTERS_LIMIT) { + // Add must branch + for (String filterValue : searchFilter.getValues()) { + boolQueryBuilder.addMustFilter(new MatchFilterCriteriaEntity(fieldName, filterValue)); + } + } + } + } + + boolQueryBuilder.setMinShouldMatch(minShouldMatch); + + return boolQueryBuilder.getJsonObject(); + } + + public static JsonObject createAggregationQueryArray(List searchFilters) { + + if (searchFilters == null || searchFilters.size() == 0) { + // log error + return null; + } + + FilteredAggregationQueryBuilder aggQueryBuilder = new FilteredAggregationQueryBuilder(); + + FiltersConfig filters = FiltersConfig.getInstance(); + + for (SearchFilter searchFilter : searchFilters) { + + /* + * translate the filter-id into the filter-name from the oxm data model/config file + */ + UiFilterConfig filter = filters.getFilterById(searchFilter.getFilterId()); + + if (filter == null || filter.getFilterName() == null) { + // log error and continue + } else { + String fieldName = filter.getDataSource().getFieldName(); + aggQueryBuilder.addAggregationEntity(new AggregationEntity(fieldName, fieldName, 0)); + } + + } + + return aggQueryBuilder.getJsonObject(); + } + + public static JsonObject createCombinedBoolAndAggQuery(List searchFilters, int minShouldMatch) { + JsonObjectBuilder wrappedQueryBuilder = Json.createObjectBuilder(); + if(searchFilters != null) { + List fields = new ArrayList(); + JsonObject boolQuery = createFilteredBoolQueryObject(searchFilters, minShouldMatch, fields); + JsonObject aggQuery = createAggregationQueryArray(searchFilters); + + if (boolQuery != null) { + wrappedQueryBuilder.add("size", 0); + + JsonArrayBuilder filedsArrayBuilder = Json.createBuilderFactory(null).createArrayBuilder(); // TODO -> Should we use a class instance factory? + for(String field : fields) { + filedsArrayBuilder.add(field); + } + wrappedQueryBuilder.add("fields", filedsArrayBuilder.build()); + + wrappedQueryBuilder.add("query", boolQuery); + } + + if (aggQuery != null) { + wrappedQueryBuilder.add("aggs", aggQuery); + } + } + return wrappedQueryBuilder.build(); + } + + public static JsonObject createFilterValueQueryObject(String fieldValue) { + JsonObjectBuilder jsonBuilder = Json.createObjectBuilder(); + jsonBuilder.add("size", "0"); // avoid source data + buildZeroTermSummaryQuery(jsonBuilder, fieldValue); + + return jsonBuilder.build(); + } + + public static JsonObject createNestedFilterValueQueryObject(String fieldValue, + String pathToField) { + JsonObjectBuilder jsonBuilder = Json.createObjectBuilder(); + jsonBuilder.add("size", "0"); // avoid source data + generateNestedAggregations(jsonBuilder, fieldValue, pathToField); + + return jsonBuilder.build(); + } + + public static void buildZeroTermSummaryQuery(JsonObjectBuilder jsonBuilder, String fieldValue) { + JsonObjectBuilder aggsBlobBuilder = Json.createObjectBuilder(); + getSummaryAggsBlob(aggsBlobBuilder, fieldValue, 0); + jsonBuilder.add("aggs", aggsBlobBuilder.build()); + } + + public static void getSummaryAggsBlob(JsonObjectBuilder aggsBlobBuilder, String fieldValue, + int resultSize) { + JsonObjectBuilder fieldBuilder = + Json.createObjectBuilder().add("field", fieldValue).add("size", resultSize); + JsonObject aggsFieldBlob = fieldBuilder.build(); + JsonObjectBuilder defaultBlobBuilder = Json.createObjectBuilder().add("terms", aggsFieldBlob); + JsonObject defaultBlob = defaultBlobBuilder.build(); + aggsBlobBuilder.add("default", defaultBlob); + } + + public static void addNestedSummaryAggsBlob(JsonObjectBuilder nestedAggsBuilder, + String containerValue, String fieldValue, int resultSize) { + JsonObjectBuilder fieldBuilder = Json.createObjectBuilder() + .add("field", containerValue + "." + fieldValue).add("size", resultSize); + JsonObject aggsFieldObject = fieldBuilder.build(); + + JsonObjectBuilder termBuilder = Json.createObjectBuilder().add("terms", aggsFieldObject); + JsonObject termObject = termBuilder.build(); + + JsonObjectBuilder namedAggsBuilder = Json.createObjectBuilder().add(fieldValue, termObject); + JsonObject namedAggsObject = namedAggsBuilder.build(); + + nestedAggsBuilder.add("aggs", namedAggsObject); + } + + public static void generateNestedAggregations(JsonObjectBuilder jsonBuilder, String fieldValue, + String pathToField) { + JsonObjectBuilder nestedAggsBuilder = Json.createObjectBuilder(); + + JsonObjectBuilder pathObjectBuilder = Json.createObjectBuilder().add("path", pathToField); + JsonObject nestedPathObject = pathObjectBuilder.build(); + + JsonObjectBuilder nestedObjectBuilder = + Json.createObjectBuilder().add("nested", nestedPathObject); + + addNestedSummaryAggsBlob(nestedObjectBuilder, pathToField, fieldValue, 0); + + JsonObject nestedObject = nestedObjectBuilder.build(); + nestedAggsBuilder.add(pathToField, nestedObject); + + jsonBuilder.add("aggs", nestedAggsBuilder.build()); + } +} diff --git a/src/main/java/org/onap/aai/sparky/search/filters/FilteredSearchHelper.java b/src/main/java/org/onap/aai/sparky/search/filters/FilteredSearchHelper.java new file mode 100644 index 0000000..825dc5e --- /dev/null +++ b/src/main/java/org/onap/aai/sparky/search/filters/FilteredSearchHelper.java @@ -0,0 +1,156 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017 Amdocs + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ +package org.onap.aai.sparky.search.filters; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.onap.aai.cl.api.Logger; +import org.onap.aai.cl.eelf.LoggerFactory; +import org.onap.aai.sparky.logging.AaiUiMsgs; +import org.onap.aai.sparky.search.filters.config.FiltersConfig; +import org.onap.aai.sparky.search.filters.config.FiltersDetailsConfig; +import org.onap.aai.sparky.search.filters.config.UiFilterConfig; +import org.onap.aai.sparky.search.filters.config.UiFilterDataSourceConfig; +import org.onap.aai.sparky.search.filters.config.UiFilterListItemConfig; +import org.onap.aai.sparky.search.filters.config.UiViewListItemConfig; +import org.onap.aai.sparky.search.filters.entity.UiFilterEntity; +import org.onap.aai.sparky.search.filters.entity.UiFilterValueEntity; +import org.onap.aai.sparky.search.filters.entity.UiFiltersEntity; + +public class FilteredSearchHelper { + private static final Logger LOG = LoggerFactory.getInstance().getLogger(FilteredSearchHelper.class); + + private FiltersConfig filtersConfig; + private Map filtersMap = null; + private FilterElasticSearchAdapter filterSearchAdapter = null; + + public FilteredSearchHelper(FiltersConfig filterConfig) { + this.filtersConfig = filterConfig; + + if (filtersMap == null) { + filtersMap = new HashMap<>(); + + final FiltersDetailsConfig uiFiltersConfig = filterConfig.getFiltersConfig(); + + if (uiFiltersConfig != null) { + for (UiFilterConfig filter : uiFiltersConfig.getFilters()) { + filtersMap.put(filter.getFilterId(), filter); + } + } + } + + filterSearchAdapter = new FilterElasticSearchAdapter(); + } + + public FiltersConfig getFiltersConfig() { + return filtersConfig; + } + + public void setFiltersConfig(FiltersConfig filterConfig) { + this.filtersConfig = filterConfig; + } + + public UiFiltersEntity doFilterDiscovery(String viewName) { + List views = filtersConfig.getViewsConfig().getViews(); + List filters = null; + UiFiltersEntity viewFiltersList = new UiFiltersEntity(); + + if(viewName != null) { + for (UiViewListItemConfig view: views) { + if (viewName.equalsIgnoreCase(view.getViewName())) { + filters = view.getFilters(); + break; + } + } + + if (filters == null) { + LOG.error(AaiUiMsgs.VIEW_NAME_NOT_SUPPORTED, viewName); + } else { + for (UiFilterListItemConfig filter : filters) { + FiltersDetailsConfig filtersDetailsConfig = filtersConfig.getFiltersConfig(); + + for (UiFilterConfig filterConfig: filtersDetailsConfig.getFilters()) { + if (filterConfig.getFilterId().equals(filter.getFilterId())) { + UiFilterEntity filterEntity = new UiFilterEntity(filterConfig); + if(filter.getDefaultValue() != null) { + filterEntity.setDefaultValue(filter.getDefaultValue()); + } + viewFiltersList.addFilter(filterEntity); + } + } + } + } + } + return viewFiltersList; + } + + public UiFiltersEntity doFilterEnumeration(List requestedFilterIds) { + UiFiltersEntity viewFiltersList = new UiFiltersEntity(); + + for (String requestedFilterId : requestedFilterIds) { + if (null == filtersMap.get(requestedFilterId)) { + String errorMessage = "Requested filter ID '" + requestedFilterId + "' does not exist."; + LOG.error(AaiUiMsgs.SEARCH_SERVLET_ERROR, errorMessage); + } else { + UiFilterConfig sourceData = filtersMap.get(requestedFilterId); + UiFilterEntity filterEntity = new UiFilterEntity(sourceData); + this.getFilterEnumeration(filterEntity, sourceData); + viewFiltersList.addFilter(filterEntity); + } + } + + return viewFiltersList; + } + + public void getFilterEnumeration(UiFilterEntity filter, UiFilterConfig sourceData) { + List filterValues = filterSearchAdapter.fetchValuesForFilter(filter, sourceData.getDataSource()); + + for(String value : filterValues) { + UiFilterValueEntity valueEntity = new UiFilterValueEntity(); + valueEntity.setDisplayName(value); + valueEntity.setFilterValue(value); + filter.addFilterValue(valueEntity); + } + } + + public Map getFiltersMap() { + return filtersMap; + } + + public void setFiltersMap(Map filtersMap) { + this.filtersMap = filtersMap; + } + + public UiFilterDataSourceConfig getFilterDataSource(String filterId) { + UiFilterConfig filterConfig = filtersMap.get(filterId); + UiFilterDataSourceConfig returnValue = null; + + if(filterConfig != null) { + returnValue = filterConfig.getDataSource(); + } + + return returnValue; + } +} diff --git a/src/main/java/org/onap/aai/sparky/search/filters/UiFiltersEntityConverter.java b/src/main/java/org/onap/aai/sparky/search/filters/UiFiltersEntityConverter.java new file mode 100644 index 0000000..24851f7 --- /dev/null +++ b/src/main/java/org/onap/aai/sparky/search/filters/UiFiltersEntityConverter.java @@ -0,0 +1,178 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017 Amdocs + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ +package org.onap.aai.sparky.search.filters; + +import java.util.List; + +import javax.json.Json; +import javax.json.JsonArray; +import javax.json.JsonArrayBuilder; +import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; + +import org.onap.aai.sparky.search.filters.config.UiFilterOptionsValuesConfig; +import org.onap.aai.sparky.search.filters.entity.UiFilterEntity; +import org.onap.aai.sparky.search.filters.entity.UiFilterValueEntity; +import org.onap.aai.sparky.search.filters.entity.UiFiltersEntity; + +public class UiFiltersEntityConverter { + + private static final String KEY_TYPE = "type"; + private static final String KEY_MULTISELECT = "multiSelect"; + private static final String KEY_WATERMARK = "watermark"; + private static final String KEY_CONTROLS = "controls"; + private static final String KEY_LABEL = "label"; + private static final String KEY_FILTERS = "filters"; + private static final String KEY_DECODE = "decode"; + private static final String KEY_CODE = "code"; + private static final String KEY_DEFAULT_VALUE = "defaultValue"; + + /** + * Converts a UiFiltersEntity into a JSON object to satisfy a new (as of 23 Oct 2017) + * filter library being used in the FE. + * + * @param entityToConvert - The UiFiltersEntity to be converted into a JSON response. + * @return A JsonObject representing the passed in UiFiltersEntity. + */ + public static JsonObject convertUiFiltersEntityToUnifiedFilterResponse(UiFiltersEntity entityToConvert) { + JsonObjectBuilder filterBuilder = Json.createObjectBuilder(); + + if(entityToConvert != null) { + List filterEntities = entityToConvert.getFilters(); + if(filterEntities != null) { + for(UiFilterEntity entity : filterEntities) { + filterBuilder.add(entity.getFilterId(), generateFilterObject(entity)); + } + } + } + + JsonObjectBuilder finalObject = Json.createObjectBuilder(); + finalObject.add(KEY_FILTERS, filterBuilder.build()); + return finalObject.build(); + } + + /** + * Generates the core body of the a single filter within the JSON body. + * + * @param entity - The filter entity (loaded from config and populated from data store). + * @return A JsonObject representing the core data of a filter. + */ + private static JsonObject generateFilterObject(UiFilterEntity entity) { + JsonObjectBuilder filterBuilder = Json.createObjectBuilder(); + + filterBuilder.add(KEY_LABEL, entity.getDisplayName()); + filterBuilder.add(KEY_CONTROLS, generateControlObject(entity, entity.getFilterValueList())); + + return filterBuilder.build(); + } + + /** + * Generates the "controls" object within the filter JSON. + * + * @param filterEntity - The filter entity on which this filter will be based. + * @param filterValues - The list of values associated with the filter + * from data store queries. + * @return A JsonObject representing the "controls" object of the filter JSON. + */ + private static JsonObject generateControlObject(UiFilterEntity filterEntity, List filterValues) { + JsonObjectBuilder controls = Json.createObjectBuilder(); + JsonObjectBuilder subControl = Json.createObjectBuilder(); + + subControl.add(KEY_TYPE, filterEntity.getDataType()); + subControl.add(KEY_MULTISELECT, filterEntity.getMultiSelect()); + subControl.add(KEY_WATERMARK, filterEntity.getWatermark()); + + if(filterEntity.getDefaultValue() != null && !filterEntity.getDefaultValue().getCode().isEmpty() && !filterEntity.getDefaultValue().getDecode().isEmpty()) { + JsonObjectBuilder defaultValueBuilder = Json.createObjectBuilder(); + + defaultValueBuilder.add(KEY_DECODE, filterEntity.getDefaultValue().getDecode()); + defaultValueBuilder.add(KEY_CODE, filterEntity.getDefaultValue().getCode()); + + subControl.add(KEY_DEFAULT_VALUE, defaultValueBuilder.build()); + } + + if(filterEntity.getOptionsValues() == null || filterEntity.getOptionsValues().isEmpty()) { + subControl.add(filterEntity.getOptionsType(), generateOptionsObject(filterValues)); + } else { + subControl.add(filterEntity.getOptionsType(), generateOptionsValuesObject(filterEntity.getOptionsValues())); + } + + controls.add(filterEntity.getFilterName(), subControl.build()); + + return controls.build(); + } + + /** + * Creates a JsonArray representing the list of options for a filter. + * Similar to function generateOptionsObject, except using different arguments. + * + * @param optionsValues - Values that are loaded from config. + * @return JsonArray of options for a filter. + */ + private static JsonArray generateOptionsValuesObject(List optionsValues) { + JsonArrayBuilder optionsBuilder = Json.createArrayBuilder(); + + if(optionsValues != null && !optionsValues.isEmpty()) { + for(UiFilterOptionsValuesConfig optionValue : optionsValues) { + JsonObjectBuilder option = Json.createObjectBuilder(); + + option.add(KEY_DECODE, optionValue.getDecode()); + option.add(KEY_CODE, optionValue.getCode()); + + optionsBuilder.add(option.build()); + } + } + + return optionsBuilder.build(); + } + + /** + * Creates a JsonArray representing the list of options for a filter. + * + * @param filterValues - The list of values associates with a filter (likely from a data store query). + * @return JsonArray of options for a filter. + */ + private static JsonArray generateOptionsObject(List filterValues) { + JsonArrayBuilder optionsBuilder = Json.createArrayBuilder(); + + if(filterValues != null && !filterValues.isEmpty()) { + for(UiFilterValueEntity valueEntity : filterValues) { + JsonObjectBuilder option = Json.createObjectBuilder(); + + option.add(KEY_DECODE, valueEntity.getDisplayName()); + option.add(KEY_CODE, valueEntity.getFilterValue()); + + optionsBuilder.add(option.build()); + } + } + + return optionsBuilder.build(); + } + + public static JsonObject generateEmptyResponse() { + JsonObjectBuilder filterBuilder = Json.createObjectBuilder(); + JsonObjectBuilder finalObject = Json.createObjectBuilder(); + finalObject.add(KEY_FILTERS, filterBuilder.build()); + return finalObject.build(); + } +} diff --git a/src/main/java/org/onap/aai/sparky/search/filters/config/FiltersConfig.java b/src/main/java/org/onap/aai/sparky/search/filters/config/FiltersConfig.java new file mode 100644 index 0000000..b1b503c --- /dev/null +++ b/src/main/java/org/onap/aai/sparky/search/filters/config/FiltersConfig.java @@ -0,0 +1,157 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017 Amdocs + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ +package org.onap.aai.sparky.search.filters.config; + +import java.io.File; + +import org.onap.aai.cl.api.Logger; +import org.onap.aai.cl.eelf.LoggerFactory; +import org.onap.aai.sparky.logging.AaiUiMsgs; +import org.onap.aai.sparky.synchronizer.config.NetworkStatisticsConfig; +import org.onap.aai.sparky.viewandinspect.config.TierSupportUiConstants; + +import com.fasterxml.jackson.databind.ObjectMapper; + +public class FiltersConfig { + + private static final Logger LOG = LoggerFactory.getInstance().getLogger(FiltersConfig.class); + + private static FiltersConfig instance; + + private String filtersFileName; + + private String filterMappingsFileName; + + private FiltersForViewsConfig viewsConfig; + + private FiltersDetailsConfig filtersConfig; + + private NetworkStatisticsConfig processorConfig; + + public NetworkStatisticsConfig getProcessorConfig() { + return processorConfig; + } + + public void setProcessorConfig(NetworkStatisticsConfig processorConfig) { + this.processorConfig = processorConfig; + } + + public static FiltersConfig getInstance() { + if (instance == null) { + instance = new FiltersConfig(); + instance.initializeFilters(); + } + + return instance; + } + + public static void setConfig(FiltersConfig config) { + FiltersConfig.instance = config; + } + + /** + * Instantiates a new UiViewFilterConfig. + */ + private FiltersConfig() {} + + /** + * Initialize config. + */ + private void initializeFilters() { + filtersFileName = TierSupportUiConstants.FILTER_LIST_FILE_DEFAULT; + filterMappingsFileName = TierSupportUiConstants.FILTER_MAPPING_FILE_DEFAULT; + + viewsConfig = this.readUiViewsConfig(); + filtersConfig = this.readUiFiltersConfig(); + } + + public String getFilterMappingsFileName() { + return filterMappingsFileName; + } + + public void setFilterMappingsFileName(String filterMappingsFileName) { + this.filterMappingsFileName = filterMappingsFileName; + } + + public String getFiltersFileName() { + return filtersFileName; + } + + public void setFiltersFileName(String filtersFileName) { + this.filtersFileName = filtersFileName; + } + + public FiltersForViewsConfig getViewsConfig() { + return viewsConfig; + } + + public void setViewsConfig(FiltersForViewsConfig filtersMapEntity) { + this.viewsConfig = filtersMapEntity; + } + + public FiltersDetailsConfig getFiltersConfig() { + return filtersConfig; + } + + public UiFilterConfig getFilterById(String filterId) { + for ( UiFilterConfig filter : filtersConfig.getFilters()) { + if ( filter.getFilterId().equals(filterId)) { + return filter; + } + } + + return null; + } + + public void setFiltersConfig(FiltersDetailsConfig filtersConfig) { + this.filtersConfig = filtersConfig; + } + + public FiltersDetailsConfig readUiFiltersConfig(){ + ObjectMapper mapper = new ObjectMapper(); + FiltersDetailsConfig filtersConfig = null; + try{ + filtersConfig = mapper.readValue(new File(this.getFiltersFileName()), FiltersDetailsConfig.class); + System.out.println(String.valueOf(filtersConfig)); + } catch (Exception e){ + LOG.error(AaiUiMsgs.ERROR_READING_JSON_SCHEMA, TierSupportUiConstants.getConfigPath(this.getFiltersFileName())); + } + + return filtersConfig; + } + + public FiltersForViewsConfig readUiViewsConfig(){ + ObjectMapper mapper = new ObjectMapper(); + FiltersForViewsConfig viewsConfig = null; + + try { + viewsConfig = mapper.readValue(new File(this.getFilterMappingsFileName()), FiltersForViewsConfig.class); + System.out.println(String.valueOf(viewsConfig)); + } catch (Exception e){ + LOG.error(AaiUiMsgs.ERROR_READING_JSON_SCHEMA, TierSupportUiConstants.getConfigPath(this.getFilterMappingsFileName())); + } + + return viewsConfig; + } +} + diff --git a/src/main/java/org/onap/aai/sparky/search/filters/config/FiltersDetailsConfig.java b/src/main/java/org/onap/aai/sparky/search/filters/config/FiltersDetailsConfig.java new file mode 100644 index 0000000..09eec02 --- /dev/null +++ b/src/main/java/org/onap/aai/sparky/search/filters/config/FiltersDetailsConfig.java @@ -0,0 +1,55 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017 Amdocs + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ +package org.onap.aai.sparky.search.filters.config; + +import java.util.ArrayList; +import java.util.List; + +import com.att.aft.dme2.internal.jackson.annotate.JsonCreator; +import com.att.aft.dme2.internal.jackson.annotate.JsonProperty; + +public class FiltersDetailsConfig { + @JsonProperty("filters") + private List filters = new ArrayList(); + + public FiltersDetailsConfig(){} + + @JsonCreator + public FiltersDetailsConfig(@JsonProperty("filters") final List filters) { + this.filters = filters; + } + + public List getFilters() { + return filters; + } + + public void setFilters(List filters) { + this.filters = filters; + } + + @Override + public String toString() { + return "UiFiltersConfig [filters=" + filters + "]"; + } + +} diff --git a/src/main/java/org/onap/aai/sparky/search/filters/config/FiltersForViewsConfig.java b/src/main/java/org/onap/aai/sparky/search/filters/config/FiltersForViewsConfig.java new file mode 100644 index 0000000..7340758 --- /dev/null +++ b/src/main/java/org/onap/aai/sparky/search/filters/config/FiltersForViewsConfig.java @@ -0,0 +1,55 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017 Amdocs + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ +package org.onap.aai.sparky.search.filters.config; + +import java.util.ArrayList; +import java.util.List; + +import com.att.aft.dme2.internal.jackson.annotate.JsonCreator; +import com.att.aft.dme2.internal.jackson.annotate.JsonProperty; + +public class FiltersForViewsConfig { + + private List views = new ArrayList(); + + public FiltersForViewsConfig(){} + + @JsonCreator + public FiltersForViewsConfig(@JsonProperty("views") final List views) { + this.views = views; + } + + @JsonProperty("views") + public List getViews() { + return views; + } + + public void setViews(List views) { + this.views = views; + } + + @Override + public String toString() { + return "UiViewToFilterMappingEntity [allUiViews=" + views + "]"; + } +} diff --git a/src/main/java/org/onap/aai/sparky/search/filters/config/UiFilterConfig.java b/src/main/java/org/onap/aai/sparky/search/filters/config/UiFilterConfig.java new file mode 100644 index 0000000..c566565 --- /dev/null +++ b/src/main/java/org/onap/aai/sparky/search/filters/config/UiFilterConfig.java @@ -0,0 +1,186 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017 Amdocs + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ +package org.onap.aai.sparky.search.filters.config; + +import java.util.List; + +import com.att.aft.dme2.internal.jackson.annotate.JsonCreator; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonInclude(Include.NON_NULL) +public class UiFilterConfig { + + @JsonProperty("filterId") + private String filterId; + + @JsonProperty("filterName") + private String filterName; + + @JsonProperty("displayName") + private String displayName; + + @JsonProperty("dataType") + private String dataType; + + @JsonProperty("multiSelect") + private String multiSelect; + + @JsonProperty("watermark") + private String watermark; + + @JsonProperty("defaultValue") + private UiFilterOptionsValuesConfig defaultValue; + + @JsonProperty("optionsType") + private String optionsType; + + @JsonProperty("optionsValues") + private List optionsValues; + + @JsonProperty("dataSource") + private UiFilterDataSourceConfig dataSource = new UiFilterDataSourceConfig(); + + @JsonCreator + public UiFilterConfig(@JsonProperty("filterId") final String filterId, + @JsonProperty("filterName") final String filterName, + @JsonProperty("displayName") final String displayName, + @JsonProperty("dataType") final String dataType, + @JsonProperty("multiSelect") final String multiSelect, + @JsonProperty("watermark") final String watermark, + @JsonProperty("defaultValue") final UiFilterOptionsValuesConfig defaultValue, + @JsonProperty("optionsType") final String optionsType, + @JsonProperty("optionsValues") final List optionsValues, + @JsonProperty("dataSource") final UiFilterDataSourceConfig dataSource + ) { + this.filterId = filterId; + this.filterName = filterName; + this.displayName = displayName; + this.dataType = dataType; + this.multiSelect = multiSelect; + this.watermark = watermark; + this.defaultValue = defaultValue; + this.optionsType = optionsType; + this.optionsValues = optionsValues; + this.dataSource = dataSource; + } + + @JsonProperty("filterId") + public String getFilterId() { + return filterId; + } + + public void setFilterId(String filterId) { + this.filterId = filterId; + } + + @JsonProperty("filterName") + public String getFilterName() { + return filterName; + } + + public void setFilterName(String filterName) { + this.filterName = filterName; + } + + @JsonProperty("displayName") + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + @JsonProperty("dataType") + public String getDataType() { + return dataType; + } + + public void setDataType(String dataType) { + this.dataType = dataType; + } + + @JsonProperty("multiSelect") + public String getMultiSelect() { + return multiSelect; + } + + public void setMultiSelect(String multiSelect) { + this.multiSelect = multiSelect; + } + + @JsonProperty("watermark") + public String getWatermark() { + return watermark; + } + + public void setWatermark(String watermark) { + this.watermark = watermark; + } + + @JsonProperty("defaultValue") + public UiFilterOptionsValuesConfig getDefaultValue() { + return defaultValue; + } + + public void setDefaultValue(UiFilterOptionsValuesConfig defaultValue) { + this.defaultValue = defaultValue; + } + + @JsonProperty("optionsType") + public String getOptionsType() { + return optionsType; + } + + public void setOptionsType(String optionsType) { + this.optionsType = optionsType; + } + @JsonProperty("optionsValues") + public List getOptionsValues() { + return optionsValues; + } + + public void setOptionsValues(List optionsValues) { + this.optionsValues = optionsValues; + } + + @JsonProperty("dataSource") + public UiFilterDataSourceConfig getDataSource() { + return dataSource; + } + + public void setDataSource(UiFilterDataSourceConfig dataSource) { + this.dataSource = dataSource; + } + + @Override + public String toString() { + return "UiFilterConfig [filterId=" + filterId + ", filterName=" + filterName + ", displayName=" + + displayName + ", dataType=" + dataType + ", multiSelect=" + multiSelect + ", watermark=" + + watermark + ", optionsType=" + optionsType + ", optionsValues=" + optionsValues + + ", dataSource=" + dataSource + "]"; + } +} + diff --git a/src/main/java/org/onap/aai/sparky/search/filters/config/UiFilterDataSourceConfig.java b/src/main/java/org/onap/aai/sparky/search/filters/config/UiFilterDataSourceConfig.java new file mode 100644 index 0000000..be0603b --- /dev/null +++ b/src/main/java/org/onap/aai/sparky/search/filters/config/UiFilterDataSourceConfig.java @@ -0,0 +1,97 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017 Amdocs + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ +package org.onap.aai.sparky.search.filters.config; + +import com.att.aft.dme2.internal.jackson.annotate.JsonCreator; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonInclude(Include.NON_NULL) +public class UiFilterDataSourceConfig { + + @JsonProperty("indexName") + private String indexName; + + @JsonProperty("docType") + private String docType; + + @JsonProperty("fieldName") + private String fieldName; + + @JsonProperty("pathToField") + private String pathToField; + + public UiFilterDataSourceConfig(){} + + @JsonCreator + public UiFilterDataSourceConfig(@JsonProperty("indexName") final String indexName, @JsonProperty("docType") final String docType, @JsonProperty("fieldName") final String fieldName, @JsonProperty("pathToField") final String pathToField) { + this.indexName = indexName; + this.docType = docType; + this.fieldName = fieldName; + this.pathToField = pathToField; + } + + @JsonProperty("indexName") + public String getIndexName() { + return indexName; + } + + public void setIndexName(String indexName) { + this.indexName = indexName; + } + + @JsonProperty("docType") + public String getDocType() { + return docType; + } + + public void setDocType(String docType) { + this.docType = docType; + } + + @JsonProperty("fieldName") + public String getFieldName() { + return fieldName; + } + + public void setFieldName(String fieldName) { + this.fieldName = fieldName; + } + + @JsonProperty("pathToField") + public String getPathToField() { + return pathToField; + } + + public void setPathToField(String pathToField) { + this.pathToField = pathToField; + } + + @Override + public String toString() { + return "UiFilterDataSourceConfig [indexName=" + indexName + ", docType=" + docType + + ", fieldName=" + fieldName + ", pathToField=" + pathToField + "]"; + } +} + diff --git a/src/main/java/org/onap/aai/sparky/search/filters/config/UiFilterListItemConfig.java b/src/main/java/org/onap/aai/sparky/search/filters/config/UiFilterListItemConfig.java new file mode 100644 index 0000000..c1ee089 --- /dev/null +++ b/src/main/java/org/onap/aai/sparky/search/filters/config/UiFilterListItemConfig.java @@ -0,0 +1,69 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017 Amdocs + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ +package org.onap.aai.sparky.search.filters.config; + +import com.att.aft.dme2.internal.jackson.annotate.JsonCreator; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonInclude(Include.NON_NULL) +public class UiFilterListItemConfig { + @JsonProperty("filterId") + private String filterId; + + @JsonProperty("defaultValue") + private UiFilterOptionsValuesConfig defaultValue; + + + @JsonCreator + public UiFilterListItemConfig(@JsonProperty("filterId") final String filterId, @JsonProperty("defaultValue") final UiFilterOptionsValuesConfig defaultValue) { + this.filterId = filterId; + this.defaultValue = defaultValue; + } + + @JsonProperty("filterId") + public String getFilterId() { + return filterId; + } + + public void setFilterId(String filterId) { + this.filterId = filterId; + } + + @JsonProperty("defaultValue") + public UiFilterOptionsValuesConfig getDefaultValue() { + return defaultValue; + } + + public void setDefaultValue(UiFilterOptionsValuesConfig defaultValue) { + this.defaultValue = defaultValue; + } + + @Override + public String toString() { + return "FilterListItemEntity [filterId=" + filterId + ", defaultValue=" + defaultValue + "]"; + } + + +} diff --git a/src/main/java/org/onap/aai/sparky/search/filters/config/UiFilterOptionsValuesConfig.java b/src/main/java/org/onap/aai/sparky/search/filters/config/UiFilterOptionsValuesConfig.java new file mode 100644 index 0000000..2abdfdd --- /dev/null +++ b/src/main/java/org/onap/aai/sparky/search/filters/config/UiFilterOptionsValuesConfig.java @@ -0,0 +1,66 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017 Amdocs + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ +package org.onap.aai.sparky.search.filters.config; + +import com.att.aft.dme2.internal.jackson.annotate.JsonCreator; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonInclude(Include.NON_NULL) +public class UiFilterOptionsValuesConfig { + @JsonProperty("decode") + private String decode; + + @JsonProperty("code") + private String code; + + @JsonCreator + public UiFilterOptionsValuesConfig(@JsonProperty("decode") final String decode, @JsonProperty("code") final String code) { + this.decode = decode; + this.code = code; + } + + @JsonProperty("decode") + public String getDecode() { + return decode; + } + + public void setDecode(String decode) { + this.decode = decode; + } + + @JsonProperty("code") + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + @Override + public String toString() { + return "UiFilterOptionsValuesConfig [decode=" + decode + ", code=" + code + "]"; + } +} diff --git a/src/main/java/org/onap/aai/sparky/search/filters/config/UiViewListItemConfig.java b/src/main/java/org/onap/aai/sparky/search/filters/config/UiViewListItemConfig.java new file mode 100644 index 0000000..3707417 --- /dev/null +++ b/src/main/java/org/onap/aai/sparky/search/filters/config/UiViewListItemConfig.java @@ -0,0 +1,66 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017 Amdocs + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ +package org.onap.aai.sparky.search.filters.config; + +import java.util.ArrayList; +import java.util.List; + +import com.att.aft.dme2.internal.jackson.annotate.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class UiViewListItemConfig { + @JsonProperty("viewName") + private String viewName; + + private List filters = new ArrayList(); + + @JsonCreator + public UiViewListItemConfig(@JsonProperty("viewName") final String viewName, @JsonProperty("filters") final List filters) { + this.viewName = viewName; + this.filters = filters; + } + + @JsonProperty("viewName") + public String getViewName() { + return viewName; + } + + public void setViewName(String viewName) { + this.viewName = viewName; + } + + @JsonProperty("filters") + public List getFilters() { + return filters; + } + + public void setListOfFilters(List filters) { + this.filters = filters; + } + + @Override + public String toString() { + return "UiViewEntity [viewName=" + viewName + ", filters=" + filters + "]"; + } + +} diff --git a/src/main/java/org/onap/aai/sparky/search/filters/entity/AggregationEntity.java b/src/main/java/org/onap/aai/sparky/search/filters/entity/AggregationEntity.java new file mode 100644 index 0000000..bf901e2 --- /dev/null +++ b/src/main/java/org/onap/aai/sparky/search/filters/entity/AggregationEntity.java @@ -0,0 +1,78 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017 Amdocs + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ +package org.onap.aai.sparky.search.filters.entity; + +import javax.json.Json; +import javax.json.JsonBuilderFactory; +import javax.json.JsonObject; + +public class AggregationEntity { + + private String aggregationName; + private String aggregationFieldName; + private int size; + + public AggregationEntity(String aggName, String fieldName, int size) { + + this.aggregationName = aggName; + this.aggregationFieldName = fieldName; + this.size = size; + } + + public String getAggregationName() { + return aggregationName; + } + + public void setAggregationName(String aggregationName) { + this.aggregationName = aggregationName; + } + + public String getAggregationFieldName() { + return aggregationFieldName; + } + + public void setAggregationFieldName(String aggregationFieldName) { + this.aggregationFieldName = aggregationFieldName; + } + + public int getSize() { + return size; + } + + public void setSize(int size) { + this.size = size; + } + + public JsonObject getJsonObject() { + + JsonBuilderFactory factory = Json.createBuilderFactory(null); + + return factory.createObjectBuilder() + .add("terms", factory.createObjectBuilder() + .add("field", aggregationFieldName) + .add("size", size)) + .build(); + } + + +} diff --git a/src/main/java/org/onap/aai/sparky/search/filters/entity/BoolQueryBuilder.java b/src/main/java/org/onap/aai/sparky/search/filters/entity/BoolQueryBuilder.java new file mode 100644 index 0000000..dabe061 --- /dev/null +++ b/src/main/java/org/onap/aai/sparky/search/filters/entity/BoolQueryBuilder.java @@ -0,0 +1,121 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017 Amdocs + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ +package org.onap.aai.sparky.search.filters.entity; + +import java.util.ArrayList; +import java.util.List; + +import javax.json.Json; +import javax.json.JsonArray; +import javax.json.JsonArrayBuilder; +import javax.json.JsonBuilderFactory; +import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; + +public class BoolQueryBuilder { + + private List mustFilters; + private List shouldFilters; + + private int minShouldMatch; + + public BoolQueryBuilder() { + + mustFilters = new ArrayList(); + shouldFilters = new ArrayList(); + minShouldMatch = -1; + + } + + public void addMustFilter(MatchFilterCriteriaEntity filter) { + + if (!mustFilters.contains(filter)) { + mustFilters.add(filter); + } + + } + + public void addShouldFilter(MatchFilterCriteriaEntity filter) { + + if (!shouldFilters.contains(filter)) { + shouldFilters.add(filter); + } + + } + + public void setMinShouldMatch(int minShouldMatch) { + this.minShouldMatch = minShouldMatch; + } + + public boolean isMatchAll() { + return (mustFilters.isEmpty() && shouldFilters.isEmpty()); + } + + public JsonObject getJsonObject() { + /* + * Specify a null config for now, but if we want normalize all the builders, we can do it at one + * location, when we are ready. + */ + JsonBuilderFactory factory = Json.createBuilderFactory(null); + + JsonObjectBuilder boolBuilder = factory.createObjectBuilder(); + + if(!mustFilters.isEmpty()){ + JsonArrayBuilder mustArrayBuilder = factory.createArrayBuilder(); + + for (MatchFilterCriteriaEntity matchCriteria : mustFilters) { + mustArrayBuilder.add(matchCriteria.getJsonObject()); + } + + JsonArray mustArray = mustArrayBuilder.build(); + boolBuilder.add("must", mustArray); + } + + if (!shouldFilters.isEmpty()) { + JsonArray shouldArray = null; + JsonArrayBuilder shouldArrayBuilder = factory.createArrayBuilder(); + + for (MatchFilterCriteriaEntity matchCriteria : shouldFilters) { + shouldArrayBuilder.add(matchCriteria.getJsonObject()); + } + + shouldArray = shouldArrayBuilder.build(); + boolBuilder.add("should", shouldArray).add("min_should_match", minShouldMatch); + } + + JsonObjectBuilder queryObjectBuilder = factory.createObjectBuilder(); + + /* + * If both filter lists are empty then we are doing an aggregation + * based off fields. Just match-all for the query. + */ + if(isMatchAll()) { + JsonObject matchAllObject = factory.createObjectBuilder().build(); + queryObjectBuilder.add("match_all", matchAllObject); + } else { + queryObjectBuilder.add("bool", boolBuilder.build()); + } + + return queryObjectBuilder.build(); + } +} diff --git a/src/main/java/org/onap/aai/sparky/search/filters/entity/FilteredAggregationQueryBuilder.java b/src/main/java/org/onap/aai/sparky/search/filters/entity/FilteredAggregationQueryBuilder.java new file mode 100644 index 0000000..ef334f2 --- /dev/null +++ b/src/main/java/org/onap/aai/sparky/search/filters/entity/FilteredAggregationQueryBuilder.java @@ -0,0 +1,63 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017 Amdocs + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ +package org.onap.aai.sparky.search.filters.entity; + +import java.util.ArrayList; +import java.util.List; + +import javax.json.Json; +import javax.json.JsonBuilderFactory; +import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; + +public class FilteredAggregationQueryBuilder { + + private List aggregationEntities; + + public FilteredAggregationQueryBuilder() { + aggregationEntities = new ArrayList(); + } + + public void addAggregationEntity(AggregationEntity aggregationEntity) { + if (!aggregationEntities.contains(aggregationEntity)) { + aggregationEntities.add(aggregationEntity); + } + } + + public JsonObject getJsonObject() { + + /* + * Specify a null config for now, but if we want normalize all the builders, we can do it at one + * location, when we are ready. + */ + JsonBuilderFactory factory = Json.createBuilderFactory(null); + + JsonObjectBuilder aggsArrayBuilder = factory.createObjectBuilder(); + + for (AggregationEntity aggEntity : aggregationEntities) { + aggsArrayBuilder.add(aggEntity.getAggregationName(), aggEntity.getJsonObject()); + } + + return aggsArrayBuilder.build(); + } +} diff --git a/src/main/java/org/onap/aai/sparky/search/filters/entity/MatchFilterCriteriaEntity.java b/src/main/java/org/onap/aai/sparky/search/filters/entity/MatchFilterCriteriaEntity.java new file mode 100644 index 0000000..3b59279 --- /dev/null +++ b/src/main/java/org/onap/aai/sparky/search/filters/entity/MatchFilterCriteriaEntity.java @@ -0,0 +1,75 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017 Amdocs + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ +package org.onap.aai.sparky.search.filters.entity; + +import javax.json.Json; +import javax.json.JsonBuilderFactory; +import javax.json.JsonObject; + +public class MatchFilterCriteriaEntity { + + private String criteriaName; + private String criteriaValue; + + public MatchFilterCriteriaEntity(String criteriaName, String criteriaValue) { + super(); + this.criteriaName = criteriaName; + this.criteriaValue = criteriaValue; + } + + public String getCriteriaName() { + return criteriaName; + } + + public void setCriteriaName(String criteriaName) { + this.criteriaName = criteriaName; + } + + public String getCriteriaValue() { + return criteriaValue; + } + + public void setCriteriaValue(String criteriaValue) { + this.criteriaValue = criteriaValue; + } + + public JsonObject getJsonObject() { + + /* + * Specify a null config for now, but if we want normalize all the builders, we can do it at one + * location, when we are ready. + */ + JsonBuilderFactory factory = Json.createBuilderFactory(null); + + return factory.createObjectBuilder() + .add("match", factory.createObjectBuilder().add(criteriaName, criteriaValue)).build(); + + } + + @Override + public String toString() { + return "MatchFilterCriteriaEntity [criteriaName=" + criteriaName + ", criteriaValue=" + + criteriaValue + "]"; + } + +} diff --git a/src/main/java/org/onap/aai/sparky/search/filters/entity/SearchFilter.java b/src/main/java/org/onap/aai/sparky/search/filters/entity/SearchFilter.java new file mode 100644 index 0000000..1b23203 --- /dev/null +++ b/src/main/java/org/onap/aai/sparky/search/filters/entity/SearchFilter.java @@ -0,0 +1,86 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017 Amdocs + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ +package org.onap.aai.sparky.search.filters.entity; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * A base entity to contain the details of the filter id and values from the FE to the BE for the + * purpose of driving DAL calls into ElasticSearch, Search Abstraction Service, or as a utility + * object within the query builders. + * + * The class has unique identifier for the filter id, and then 1 or more filter values. The value + * list has been introduced to help us with a multi-select use case that will need to be supported + * eventually. + */ +public class SearchFilter { + + private String filterId; + private List values; + + public SearchFilter() { + values = new ArrayList(); + } + + public SearchFilter(String filterId) { + this(); + this.filterId = filterId; + } + + public SearchFilter(String filterId, String... values) { + this(); + this.filterId = filterId; + this.values.addAll(Arrays.asList(values)); + } + + public String getFilterId() { + return filterId; + } + + public void setFilterId(String filterId) { + this.filterId = filterId; + } + + public List getValues() { + return values; + } + + public void setValues(List values) { + this.values = values; + } + + public void addValue(String v) { + if (!values.contains(v)) { + values.add(v); + } + + } + + @Override + public String toString() { + return "SearchFilter [filterId=" + filterId + ", values=" + values + "]"; + } + +} diff --git a/src/main/java/org/onap/aai/sparky/search/filters/entity/UiFilterEntity.java b/src/main/java/org/onap/aai/sparky/search/filters/entity/UiFilterEntity.java new file mode 100644 index 0000000..2770052 --- /dev/null +++ b/src/main/java/org/onap/aai/sparky/search/filters/entity/UiFilterEntity.java @@ -0,0 +1,178 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017 Amdocs + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ +package org.onap.aai.sparky.search.filters.entity; + +import java.util.ArrayList; +import java.util.List; + +import org.onap.aai.sparky.search.filters.config.UiFilterConfig; +import org.onap.aai.sparky.search.filters.config.UiFilterOptionsValuesConfig; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +/** + * Stores data for a single filter for a given UI view. + *

+ * When a UI view wants to know which filters it should display, an object of this class is created for each + * filter discovered and stores data for that filter. Each filter/object of this class is added to a + * ViewFilterList object which is then serialized to JSON and returned to the view in the response body. + */ +@JsonInclude(Include.NON_NULL) +public class UiFilterEntity { + private String filterId; + private String filterName; + private String displayName; + private String dataType; + + private String multiSelect; + private String watermark; + private UiFilterOptionsValuesConfig defaultValue; + private String optionsType; + + private List optionsValues; + + private List filterValueList; + + public UiFilterEntity() {} + + public UiFilterEntity(UiFilterConfig filterConfig) { + if (filterConfig.getFilterId() != null) { + this.setFilterId(filterConfig.getFilterId()); + } + if (filterConfig.getFilterName() != null) { + this.setFilterName(filterConfig.getFilterName()); + } + if (filterConfig.getDisplayName() != null) { + this.setDisplayName(filterConfig.getDisplayName()); + } + if (filterConfig.getDataType() != null) { + this.setDataType(filterConfig.getDataType()); + } + if (filterConfig.getMultiSelect() != null) { + this.setMultiSelect(filterConfig.getMultiSelect()); + } + if (filterConfig.getWatermark() != null) { + this.setWatermark(filterConfig.getWatermark()); + } + if (filterConfig.getDefaultValue() != null) { + this.setDefaultValue(filterConfig.getDefaultValue()); + } + if (filterConfig.getOptionsType() != null) { + this.setOptionsType(filterConfig.getOptionsType()); + } + if(filterConfig.getOptionsValues() != null && !filterConfig.getOptionsValues().isEmpty()) { + this.setOptionsValues(filterConfig.getOptionsValues()); + } else { + this.optionsValues = new ArrayList(); + } + } + + public void addFilterValue(UiFilterValueEntity valueEntity) { + if (null == filterValueList) { + filterValueList = new ArrayList<>(); + } + + this.filterValueList.add(valueEntity); + } + + public String getFilterId() { + return filterId; + } + + public String getFilterName() { + return filterName; + } + + public String getDisplayName() { + return displayName; + } + + public String getDataType() { + return dataType; + } + + public UiFilterOptionsValuesConfig getDefaultValue() { + return defaultValue; + } + + public List getFilterValueList() { + return filterValueList; + } + + public void setFilterId(String filterId) { + this.filterId = filterId; + } + + public void setFilterName(String filterName) { + this.filterName = filterName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public void setDataType(String dataType) { + this.dataType = dataType; + } + + public String getMultiSelect() { + return multiSelect; + } + + public void setMultiSelect(String multiSelect) { + this.multiSelect = multiSelect; + } + + public String getWatermark() { + return watermark; + } + + public void setWatermark(String watermark) { + this.watermark = watermark; + } + + public String getOptionsType() { + return optionsType; + } + + public void setOptionsType(String optionsType) { + this.optionsType = optionsType; + } + + public List getOptionsValues() { + return optionsValues; + } + + public void setOptionsValues(List optionsValues) { + this.optionsValues = optionsValues; + } + + public void setDefaultValue(UiFilterOptionsValuesConfig defaultValue) { + this.defaultValue = defaultValue; + } + + public void setFilterValueList(List values) { + this.filterValueList = values; + } +} diff --git a/src/main/java/org/onap/aai/sparky/search/filters/entity/UiFilterValueEntity.java b/src/main/java/org/onap/aai/sparky/search/filters/entity/UiFilterValueEntity.java new file mode 100644 index 0000000..a0bbd90 --- /dev/null +++ b/src/main/java/org/onap/aai/sparky/search/filters/entity/UiFilterValueEntity.java @@ -0,0 +1,78 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017 Amdocs + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ +package org.onap.aai.sparky.search.filters.entity; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +/** + * This class represents a single item or value to populate the FE filter component with. + * A drop-down list, for example, may be populated with the values from several instances of this class. + */ +@JsonInclude(Include.NON_NULL) +public class UiFilterValueEntity { + private String filterId; + private String filterValue; + private String displayName; // The string that will be rendered in the view + + public UiFilterValueEntity() {} + + public UiFilterValueEntity(String filterId, String filterValue, String displayName) { + this.filterId = filterId; + this.filterValue = filterValue; + this.displayName = displayName; + } + + public String getFilterId() { + return filterId; + } + + public String getFilterValue() { + return filterValue; + } + + public String getDisplayName() { + return displayName; + } + + public void setFilterId(String filterId) { + this.filterId = filterId; + } + + public void setFilterValue(String filterValue) { + this.filterValue = filterValue; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + @Override + public String toString() { + return "UiFilterValueEntity [" + (filterId != null ? "filterId=" + filterId + ", " : "") + + (filterValue != null ? "filterValue=" + filterValue + ", " : "") + + (displayName != null ? "displayName=" + displayName : "") + "]"; + } + + +} diff --git a/src/main/java/org/onap/aai/sparky/search/filters/entity/UiFiltersEntity.java b/src/main/java/org/onap/aai/sparky/search/filters/entity/UiFiltersEntity.java new file mode 100644 index 0000000..2e8fd17 --- /dev/null +++ b/src/main/java/org/onap/aai/sparky/search/filters/entity/UiFiltersEntity.java @@ -0,0 +1,51 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017 Amdocs + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ +package org.onap.aai.sparky.search.filters.entity; + +import java.util.ArrayList; +import java.util.List; + +/** + * Represents a list of filters that a given UI view should display. + *

+ * When a UI view wants to know which filters it should display, an object of this class is created to keep + * track of all the filters that are discovered for that view and is then serialized to JSON and returned to + * the view in the response body. + */ +public class UiFiltersEntity { + private List filters = new ArrayList<>(); + + + + public void addFilter(UiFilterEntity viewFilter) { + filters.add(viewFilter); + } + + public List getFilters() { + return filters; + } + + public void setFilters(List filters) { + this.filters = filters; + } +} diff --git a/src/main/java/org/onap/aai/sparky/security/portal/PortalRestAPIServiceImpl.java b/src/main/java/org/onap/aai/sparky/security/portal/PortalRestAPIServiceImpl.java index 798022a..9e405b5 100644 --- a/src/main/java/org/onap/aai/sparky/security/portal/PortalRestAPIServiceImpl.java +++ b/src/main/java/org/onap/aai/sparky/security/portal/PortalRestAPIServiceImpl.java @@ -176,13 +176,8 @@ public class PortalRestAPIServiceImpl implements IPortalRestAPIService { // Role interface ///////////////////////////////////////////////////////////////////////////// - /* - * (non-Javadoc) - * - * @see com.att.fusion.core.onboarding.crossapi.IPortalRestAPIService#getAvailableRoles() - */ @Override - public List getAvailableRoles(String role) throws PortalAPIException { + public List getAvailableRoles(String requestedLoginId) throws PortalAPIException { LOG.debug("Get available roles"); return UserManager.getRoles(); } @@ -250,5 +245,4 @@ public class PortalRestAPIServiceImpl implements IPortalRestAPIService { formatter.applyPattern(message); return formatter.format(args); } - } \ No newline at end of file diff --git a/src/main/java/org/onap/aai/sparky/synchronizer/config/NetworkStatisticsConfig.java b/src/main/java/org/onap/aai/sparky/synchronizer/config/NetworkStatisticsConfig.java new file mode 100644 index 0000000..90429a1 --- /dev/null +++ b/src/main/java/org/onap/aai/sparky/synchronizer/config/NetworkStatisticsConfig.java @@ -0,0 +1,237 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017 Amdocs + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ +package org.onap.aai.sparky.synchronizer.config; + +public class NetworkStatisticsConfig { + + private int numSamplesPerThreadForRunningAverage; + + private String bytesHistogramLabel; + + private long bytesHistogramMaxYAxis; + + private int bytesHistogramNumBins; + + private int bytesHistogramNumDecimalPoints; + + private String queueLengthHistogramLabel; + + private long queueLengthHistogramMaxYAxis; + + private int queueLengthHistogramNumBins; + + private int queueLengthHistogramNumDecimalPoints; + + private String taskAgeHistogramLabel; + + private long taskAgeHistogramMaxYAxis; + + private int taskAgeHistogramNumBins; + + private int taskAgeHistogramNumDecimalPoints; + + private String responseTimeHistogramLabel; + + private long responseTimeHistogramMaxYAxis; + + private int responseTimeHistogramNumBins; + + private int responseTimeHistogramNumDecimalPoints; + + private String tpsHistogramLabel; + + private long tpsHistogramMaxYAxis; + + private int tpsHistogramNumBins; + + private int tpsHistogramNumDecimalPoints; + + public int getNumSamplesPerThreadForRunningAverage() { + return numSamplesPerThreadForRunningAverage; + } + + public void setNumSamplesPerThreadForRunningAverage(int numSamplesPerThreadForRunningAverage) { + this.numSamplesPerThreadForRunningAverage = numSamplesPerThreadForRunningAverage; + } + + public String getBytesHistogramLabel() { + return bytesHistogramLabel; + } + + public void setBytesHistogramLabel(String bytesHistogramLabel) { + this.bytesHistogramLabel = bytesHistogramLabel; + } + + public long getBytesHistogramMaxYAxis() { + return bytesHistogramMaxYAxis; + } + + public void setBytesHistogramMaxYAxis(long bytesHistogramMaxYAxis) { + this.bytesHistogramMaxYAxis = bytesHistogramMaxYAxis; + } + + public int getBytesHistogramNumBins() { + return bytesHistogramNumBins; + } + + public void setBytesHistogramNumBins(int bytesHistogramNumBins) { + this.bytesHistogramNumBins = bytesHistogramNumBins; + } + + public int getBytesHistogramNumDecimalPoints() { + return bytesHistogramNumDecimalPoints; + } + + public void setBytesHistogramNumDecimalPoints(int bytesHistogramNumDecimalPoints) { + this.bytesHistogramNumDecimalPoints = bytesHistogramNumDecimalPoints; + } + + public String getQueueLengthHistogramLabel() { + return queueLengthHistogramLabel; + } + + public void setQueueLengthHistogramLabel(String queueLengthHistogramLabel) { + this.queueLengthHistogramLabel = queueLengthHistogramLabel; + } + + public long getQueueLengthHistogramMaxYAxis() { + return queueLengthHistogramMaxYAxis; + } + + public void setQueueLengthHistogramMaxYAxis(long queueLengthHistogramMaxYAxis) { + this.queueLengthHistogramMaxYAxis = queueLengthHistogramMaxYAxis; + } + + public int getQueueLengthHistogramNumBins() { + return queueLengthHistogramNumBins; + } + + public void setQueueLengthHistogramNumBins(int queueLengthHistogramNumBins) { + this.queueLengthHistogramNumBins = queueLengthHistogramNumBins; + } + + public int getQueueLengthHistogramNumDecimalPoints() { + return queueLengthHistogramNumDecimalPoints; + } + + public void setQueueLengthHistogramNumDecimalPoints(int queueLengthHistogramNumDecimalPoints) { + this.queueLengthHistogramNumDecimalPoints = queueLengthHistogramNumDecimalPoints; + } + + public String getTaskAgeHistogramLabel() { + return taskAgeHistogramLabel; + } + + public void setTaskAgeHistogramLabel(String taskAgeHistogramLabel) { + this.taskAgeHistogramLabel = taskAgeHistogramLabel; + } + + public long getTaskAgeHistogramMaxYAxis() { + return taskAgeHistogramMaxYAxis; + } + + public void setTaskAgeHistogramMaxYAxis(long taskAgeHistogramMaxYAxis) { + this.taskAgeHistogramMaxYAxis = taskAgeHistogramMaxYAxis; + } + + public int getTaskAgeHistogramNumBins() { + return taskAgeHistogramNumBins; + } + + public void setTaskAgeHistogramNumBins(int taskAgeHistogramNumBins) { + this.taskAgeHistogramNumBins = taskAgeHistogramNumBins; + } + + public int getTaskAgeHistogramNumDecimalPoints() { + return taskAgeHistogramNumDecimalPoints; + } + + public void setTaskAgeHistogramNumDecimalPoints(int taskAgeHistogramNumDecimalPoints) { + this.taskAgeHistogramNumDecimalPoints = taskAgeHistogramNumDecimalPoints; + } + + public String getResponseTimeHistogramLabel() { + return responseTimeHistogramLabel; + } + + public void setResponseTimeHistogramLabel(String responseTimeHistogramLabel) { + this.responseTimeHistogramLabel = responseTimeHistogramLabel; + } + + public long getResponseTimeHistogramMaxYAxis() { + return responseTimeHistogramMaxYAxis; + } + + public void setResponseTimeHistogramMaxYAxis(long responseTimeHistogramMaxYAxis) { + this.responseTimeHistogramMaxYAxis = responseTimeHistogramMaxYAxis; + } + + public int getResponseTimeHistogramNumBins() { + return responseTimeHistogramNumBins; + } + + public void setResponseTimeHistogramNumBins(int responseTimeHistogramNumBins) { + this.responseTimeHistogramNumBins = responseTimeHistogramNumBins; + } + + public int getResponseTimeHistogramNumDecimalPoints() { + return responseTimeHistogramNumDecimalPoints; + } + + public void setResponseTimeHistogramNumDecimalPoints(int responseTimeHistogramNumDecimalPoints) { + this.responseTimeHistogramNumDecimalPoints = responseTimeHistogramNumDecimalPoints; + } + + public String getTpsHistogramLabel() { + return tpsHistogramLabel; + } + + public void setTpsHistogramLabel(String tpsHistogramLabel) { + this.tpsHistogramLabel = tpsHistogramLabel; + } + + public long getTpsHistogramMaxYAxis() { + return tpsHistogramMaxYAxis; + } + + public void setTpsHistogramMaxYAxis(long tpsHistogramMaxYAxis) { + this.tpsHistogramMaxYAxis = tpsHistogramMaxYAxis; + } + + public int getTpsHistogramNumBins() { + return tpsHistogramNumBins; + } + + public void setTpsHistogramNumBins(int tpsHistogramNumBins) { + this.tpsHistogramNumBins = tpsHistogramNumBins; + } + + public int getTpsHistogramNumDecimalPoints() { + return tpsHistogramNumDecimalPoints; + } + + public void setTpsHistogramNumDecimalPoints(int tpsHistogramNumDecimalPoints) { + this.tpsHistogramNumDecimalPoints = tpsHistogramNumDecimalPoints; + } + +} diff --git a/src/main/java/org/onap/aai/sparky/viewandinspect/config/TierSupportUiConstants.java b/src/main/java/org/onap/aai/sparky/viewandinspect/config/TierSupportUiConstants.java index f7fc4a2..8569712 100644 --- a/src/main/java/org/onap/aai/sparky/viewandinspect/config/TierSupportUiConstants.java +++ b/src/main/java/org/onap/aai/sparky/viewandinspect/config/TierSupportUiConstants.java @@ -40,7 +40,7 @@ public class TierSupportUiConstants { public static String DYNAMIC_CONFIG_APP_LOCATION = CONFIG_HOME; public static String CONFIG_OXM_LOCATION = CONFIG_HOME + "model" + FILESEP; - + public static String CONFIG_FILTERS_BASE_LOCATION = CONFIG_HOME + FILESEP; public static String CONFIG_AUTH_LOCATION = CONFIG_HOME + "auth" + FILESEP; public static String HOST = "host"; @@ -56,7 +56,10 @@ public class TierSupportUiConstants { public static final String ES_SUGGEST_API = "_suggest"; public static final String ES_COUNT_API = "_count"; public static final String ES_SEARCH_API = "_search"; - + + public static final String UI_FILTER_VIEW_NAME_PARAMETER = "viewName"; + public static final String UI_FILTER_ID_LIST_PARAMETER = "filterIdList"; + public static final String ENTITY_AUTO_SUGGEST_INDEX_NAME_DEFAULT = "entityautosuggestindex-localhost"; public static final String ENTITY_AUTO_SUGGEST_SETTINGS_FILE_DEFAULT = @@ -65,6 +68,10 @@ public class TierSupportUiConstants { "/etc/autoSuggestMappings.json"; public static final String ENTITY_DYNAMIC_MAPPINGS_FILE_DEFAULT = "/etc/dynamicMappings.json"; + public static final String FILTER_LIST_FILE_DEFAULT = + CONFIG_FILTERS_BASE_LOCATION + "filters" + FILESEP + "aaiui_filters.json"; + public static final String FILTER_MAPPING_FILE_DEFAULT = + CONFIG_FILTERS_BASE_LOCATION + "filters" + FILESEP + "aaiui_views.json"; // JUnit testing synchronizer.properties file public static String TEST_CONFIG_FILE = @@ -182,6 +189,21 @@ public class TierSupportUiConstants { CONFIG_OXM_LOCATION = cONFIG_OXM_LOCATION; } + /** + * @return the cONFIG_FILTERS_BASE_LOCATION + */ + public static String getCONFIG_FILTERS_BASE_LOCATION() { + return CONFIG_FILTERS_BASE_LOCATION; + } + + /** + * @param cONFIG_FILTERS_BASE_LOCATION the cONFIG_FILTERS_BASE_LOCATION to set + */ + public static void setCONFIG_FILTERS_BASE_LOCATION(String cONFIG_FILTERS_BASE_LOCATION) { + CONFIG_FILTERS_BASE_LOCATION = cONFIG_FILTERS_BASE_LOCATION; + } + + /** * @return the cONFIG_AUTH_LOCATION */ diff --git a/src/test/java/org/onap/aai/sparky/search/filters/FilterProcessorTest.java b/src/test/java/org/onap/aai/sparky/search/filters/FilterProcessorTest.java new file mode 100644 index 0000000..a6c4f22 --- /dev/null +++ b/src/test/java/org/onap/aai/sparky/search/filters/FilterProcessorTest.java @@ -0,0 +1,373 @@ +/** + * ============LICENSE_START=================================================== SPARKY (AAI UI + * service) ============================================================================ Copyright © + * 2017 AT&T Intellectual Property. Copyright © 2017 Amdocs All rights reserved. + * ============================================================================ Licensed under the + * Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. ============LICENSE_END===================================================== + * + * ECOMP and OpenECOMP are trademarks and service marks of AT&T Intellectual Property. + */ + +package org.onap.aai.sparky.search.filters; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; + +import javax.json.Json; +import javax.json.JsonArray; +import javax.json.JsonObject; +import javax.json.JsonReader; + +import org.apache.camel.Exchange; +import org.apache.camel.Message; +import org.apache.camel.component.restlet.RestletConstants; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Mockito; +import org.onap.aai.sparky.search.filters.FilterProcessor; +import org.onap.aai.sparky.search.filters.FilteredSearchHelper; +import org.onap.aai.sparky.search.filters.config.UiFilterConfig; +import org.onap.aai.sparky.search.filters.config.UiFilterListItemConfig; +import org.onap.aai.sparky.search.filters.config.UiFilterOptionsValuesConfig; +import org.onap.aai.sparky.search.filters.config.FiltersDetailsConfig; +import org.onap.aai.sparky.search.filters.config.FiltersConfig; +import org.onap.aai.sparky.search.filters.config.UiViewListItemConfig; +import org.onap.aai.sparky.search.filters.entity.DiscoverFiltersRequest; +import org.onap.aai.sparky.search.filters.entity.ViewConfiguration; +import org.onap.aai.sparky.search.filters.entity.ViewFilter; +import org.onap.aai.sparky.util.NodeUtils; +import org.onap.aai.sparky.search.filters.config.FiltersForViewsConfig; +import org.restlet.Request; +import org.restlet.Response; +import org.restlet.data.MediaType; +import org.restlet.data.Status; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class FilterProcessorTest { + + private FilterProcessor filterProcessor; + private Exchange mockExchange; + private Message mockRequestMessage; + private Message mockResponseMessage; + private Request mockRestletRequest; + private Response mockRestletResponse; + private FilteredSearchHelper filteredSearchHelper; + private ObjectMapper mapper; + + protected UiViewListItemConfig generateViewConfig(ViewConfiguration viewConfig) { + + UiViewListItemConfig uiViewConfig = new UiViewListItemConfig(viewConfig.getViewName(), null); + + List filters = new ArrayList(); + + for (ViewFilter viewFilter : viewConfig.getViewFilters()) { + filters.add(new UiFilterListItemConfig(viewFilter.getId(), viewFilter.getDefaultValue())); + } + + uiViewConfig.setListOfFilters(filters); + + return uiViewConfig; + } + + protected FiltersConfig generateDefaultViewsFilterConfig() { + + FiltersForViewsConfig uiViewsConfig = new FiltersForViewsConfig(); + FiltersConfig viewFilterConfig = FiltersConfig.getInstance(); + + List views = new ArrayList(); + + // Default filter value to use below + UiFilterOptionsValuesConfig defaultValue = + new UiFilterOptionsValuesConfig("Today", "Last 0 hours"); + + // VNF View - 4 Filters + ViewConfiguration vnfViewConfig = new ViewConfiguration("vnfSearch"); + vnfViewConfig.addViewFilter(new ViewFilter("1", null)); + vnfViewConfig.addViewFilter(new ViewFilter("2", null)); + vnfViewConfig.addViewFilter(new ViewFilter("7", null)); + vnfViewConfig.addViewFilter(new ViewFilter("8", null)); + views.add(generateViewConfig(vnfViewConfig)); + + // View and Inspect (Schema) - 0 Filters + ViewConfiguration viewInspectConfig = new ViewConfiguration("viewInspect"); + views.add(generateViewConfig(viewInspectConfig)); + + // Data Integrity - 4 Filters + ViewConfiguration dataIntegrityConfig = new ViewConfiguration("dataIntegrity"); + dataIntegrityConfig.addViewFilter(new ViewFilter("3", null)); + dataIntegrityConfig.addViewFilter(new ViewFilter("4", null)); + dataIntegrityConfig.addViewFilter(new ViewFilter("5", defaultValue)); + dataIntegrityConfig.addViewFilter(new ViewFilter("6", null)); + views.add(generateViewConfig(dataIntegrityConfig)); + + uiViewsConfig.setViews(views); + + viewFilterConfig.setViewsConfig(uiViewsConfig); + + List optionsValues = new ArrayList(); + optionsValues.add(new UiFilterOptionsValuesConfig("Today", "Last 0 hours")); + optionsValues.add(new UiFilterOptionsValuesConfig("Since Yesterday", "Last 24 hours")); + optionsValues.add(new UiFilterOptionsValuesConfig("Since Last Week", "Last 7 days")); + optionsValues.add(new UiFilterOptionsValuesConfig("Since Last Month", "Last 30 days")); + optionsValues.add(new UiFilterOptionsValuesConfig("Custom Range", "Custom Range")); + + + + FiltersDetailsConfig uiFiltersConfig = new FiltersDetailsConfig(); + + List uiFilterConfig = new ArrayList(); + uiFilterConfig.add(new UiFilterConfig("1", "filterName1", "Display Name 1", "dropDown", "false", + "Any 1", null, "options", null, null)); + uiFilterConfig.add(new UiFilterConfig("2", "filterName2", "Display Name 2", "dropDown", "false", + "Any 2", null, "options", null, null)); + uiFilterConfig.add(new UiFilterConfig("3", "filterName3", "Display Name 3", "dropDown", "false", + "Any 3", null, "options", null, null)); + uiFilterConfig.add(new UiFilterConfig("4", "filterName4", "Display Name 4", "dropDown", "false", + "Any 4", null, "options", null, null)); + uiFilterConfig.add(new UiFilterConfig("5", "filterName5", "Display Name 5", "date", "false", + "Any 5", defaultValue, "dynamicOptions", optionsValues, null)); + uiFilterConfig.add(new UiFilterConfig("6", "filterName6", "Display Name 6", "dropDown", "false", + "Any 6", null, "options", null, null)); + uiFilterConfig.add(new UiFilterConfig("7", "filterName7", "Display Name 7", "dropDown", "false", + "Any 7", null, "options", null, null)); + uiFilterConfig.add(new UiFilterConfig("8", "filterName8", "Display Name 8", "dropDown", "false", + "Any 8", null, "options", null, null)); + + uiFiltersConfig.setFilters(uiFilterConfig); + + viewFilterConfig.setFiltersConfig(uiFiltersConfig); + + return viewFilterConfig; + } + + @Before + public void init() { + mockExchange = Mockito.mock(Exchange.class); + mockRequestMessage = Mockito.mock(Message.class); + mockResponseMessage = Mockito.mock(Message.class); + mockRestletRequest = Mockito.mock(Request.class); + mockRestletResponse = Mockito.mock(Response.class); + + filteredSearchHelper = new FilteredSearchHelper(generateDefaultViewsFilterConfig()); + filterProcessor = new FilterProcessor(filteredSearchHelper); + + mapper = new ObjectMapper(); + } + + + @Test + public void validateDefaultConstructor() { + assertNotNull(filterProcessor.getMapper()); + assertNotNull(filterProcessor.getFilteredSearchHelper()); + } + + private void verifyResponseAndNumFiltersForBadRequest(Status expectedStatus, + int numExpectedFilters) throws JsonParseException, JsonMappingException, IOException { + + ArgumentCaptor responseCodeCaptor = ArgumentCaptor.forClass(Status.class); + Mockito.verify(mockRestletResponse, Mockito.atLeast(1)).setStatus(responseCodeCaptor.capture()); + assertEquals(expectedStatus, responseCodeCaptor.getValue()); + + ArgumentCaptor entityPayload = ArgumentCaptor.forClass(String.class); + ArgumentCaptor payloadMediaType = ArgumentCaptor.forClass(MediaType.class); + Mockito.verify(mockRestletResponse, Mockito.atLeast(1)).setEntity(entityPayload.capture(), + payloadMediaType.capture()); + assertNotNull(entityPayload.getValue()); + + ArgumentCaptor responseObject = ArgumentCaptor.forClass(Response.class); + Mockito.verify(mockResponseMessage, Mockito.atLeast(1)).setBody(responseObject.capture()); + assertEquals(MediaType.APPLICATION_JSON, payloadMediaType.getValue()); + + JsonReader jsonReader = Json.createReader(new StringReader(entityPayload.getValue())); + JsonObject responsePayload = jsonReader.readObject(); + + JsonObject filters = responsePayload.getJsonObject("filters"); + assertEquals(0, filters.size()); + } + + private void initializeMocks(String requestPayload) { + + Mockito.when(mockRequestMessage.getBody(String.class)).thenReturn(requestPayload); + + Mockito.when(mockExchange.getIn()).thenReturn(mockRequestMessage); + Mockito.when(mockExchange.getOut()).thenReturn(mockResponseMessage); + + Mockito.when(mockRequestMessage.getHeader(RestletConstants.RESTLET_REQUEST, Request.class)) + .thenReturn(mockRestletRequest); + Mockito.when(mockRequestMessage.getHeader(RestletConstants.RESTLET_RESPONSE, Response.class)) + .thenReturn(mockRestletResponse); + } + + + @Test + public void testGetFiltersWithValues_success_path() throws IOException { + + // Initialize for call against 'vnfSearch' + DiscoverFiltersRequest vnfSearchrequest = new DiscoverFiltersRequest(); + vnfSearchrequest.setViewName("vnfSearch"); + + initializeMocks(NodeUtils.convertObjectToJson(vnfSearchrequest, false)); + + // Test call against 'vnfSearch' + filterProcessor.getFiltersWithValues(mockExchange); + + ArgumentCaptor vnfResponseCodeCaptor = ArgumentCaptor.forClass(Status.class); + Mockito.verify(mockRestletResponse, Mockito.atLeast(1)) + .setStatus(vnfResponseCodeCaptor.capture()); + assertEquals(Status.SUCCESS_OK, vnfResponseCodeCaptor.getValue()); + + ArgumentCaptor vnfEntityPayload = ArgumentCaptor.forClass(String.class); + ArgumentCaptor vnfPayloadMediaType = ArgumentCaptor.forClass(MediaType.class); + Mockito.verify(mockRestletResponse, Mockito.atLeast(1)).setEntity(vnfEntityPayload.capture(), + vnfPayloadMediaType.capture()); + assertNotNull(vnfEntityPayload.getValue()); + + ArgumentCaptor vnfResponseObject = ArgumentCaptor.forClass(Response.class); + Mockito.verify(mockResponseMessage, Mockito.atLeast(1)).setBody(vnfResponseObject.capture()); + assertEquals(MediaType.APPLICATION_JSON, vnfPayloadMediaType.getValue()); + + JsonReader vnfJsonReader = Json.createReader(new StringReader(vnfEntityPayload.getValue())); + JsonObject vnfResponsePayload = vnfJsonReader.readObject(); + + JsonObject vnfFilters = vnfResponsePayload.getJsonObject("filters"); + assertNotNull(vnfFilters); + assertEquals(4, vnfFilters.size()); + + JsonObject filterOne = vnfFilters.getJsonObject("1"); + assertNotNull(filterOne); + assertEquals("Display Name 1", filterOne.getString("label")); + + JsonObject filterEight = vnfFilters.getJsonObject("8"); + assertNotNull(filterEight); + JsonObject eightInnerControl = + filterEight.getJsonObject("controls").getJsonObject("filterName8"); + assertEquals(4, eightInnerControl.size()); + assertEquals("dropDown", eightInnerControl.getString("type")); + assertEquals("false", eightInnerControl.getString("multiSelect")); + assertEquals("Any 8", eightInnerControl.getString("watermark")); + assertEquals(0, eightInnerControl.getJsonArray("options").size()); + + // Initialize for call against 'dataIntegrity' + DiscoverFiltersRequest dataIntegrityRequest = new DiscoverFiltersRequest(); + dataIntegrityRequest.setViewName("dataIntegrity"); + + initializeMocks(NodeUtils.convertObjectToJson(dataIntegrityRequest, false)); + + // Test call against 'dataIntegrity' + filterProcessor.getFiltersWithValues(mockExchange); + + ArgumentCaptor dIResponseCodeCaptor = ArgumentCaptor.forClass(Status.class); + Mockito.verify(mockRestletResponse, Mockito.atLeast(1)) + .setStatus(dIResponseCodeCaptor.capture()); + assertEquals(Status.SUCCESS_OK, dIResponseCodeCaptor.getValue()); + + ArgumentCaptor dIEntityPayload = ArgumentCaptor.forClass(String.class); + ArgumentCaptor dIPayloadMediaType = ArgumentCaptor.forClass(MediaType.class); + Mockito.verify(mockRestletResponse, Mockito.atLeast(1)).setEntity(dIEntityPayload.capture(), + dIPayloadMediaType.capture()); + assertNotNull(dIEntityPayload.getValue()); + + ArgumentCaptor dIResponseObject = ArgumentCaptor.forClass(Response.class); + Mockito.verify(mockResponseMessage, Mockito.atLeast(1)).setBody(dIResponseObject.capture()); + assertEquals(MediaType.APPLICATION_JSON, dIPayloadMediaType.getValue()); + + JsonReader dIJsonReader = Json.createReader(new StringReader(dIEntityPayload.getValue())); + JsonObject dIResponsePayload = dIJsonReader.readObject(); + + JsonObject dIFilters = dIResponsePayload.getJsonObject("filters"); + assertNotNull(dIFilters); + assertEquals(4, dIFilters.size()); + + JsonObject filterFour = dIFilters.getJsonObject("4"); + assertNotNull(filterFour); + assertEquals("Display Name 4", filterFour.getString("label")); + + JsonObject filterFive = dIFilters.getJsonObject("5"); + assertNotNull(filterFive); + JsonObject fiveInnerControl = filterFive.getJsonObject("controls").getJsonObject("filterName5"); + assertEquals(5, fiveInnerControl.size()); + assertEquals("date", fiveInnerControl.getString("type")); + assertEquals("false", fiveInnerControl.getString("multiSelect")); + assertEquals("Any 5", fiveInnerControl.getString("watermark")); + JsonArray dynamicOptions = fiveInnerControl.getJsonArray("dynamicOptions"); + assertEquals(5, dynamicOptions.size()); + JsonObject today = dynamicOptions.getJsonObject(0); + assertEquals("Today", today.getString("decode")); + } + + @Test + public void testGetFiltersWithValues_viewNameNull() throws IOException { + + DiscoverFiltersRequest discoverFiltersRequest = new DiscoverFiltersRequest(); + initializeMocks(NodeUtils.convertObjectToJson(discoverFiltersRequest, false)); + + // Method under test + filterProcessor.getFiltersWithValues(mockExchange); + + verifyResponseAndNumFiltersForBadRequest(Status.SUCCESS_OK, 0); + } + + @Test + public void testGetFiltersWithValues_viewNameEmptyString() throws IOException { + + DiscoverFiltersRequest discoverFiltersRequest = new DiscoverFiltersRequest(); + discoverFiltersRequest.setViewName(""); + + initializeMocks(NodeUtils.convertObjectToJson(discoverFiltersRequest, false)); + + // Method under test + filterProcessor.getFiltersWithValues(mockExchange); + + verifyResponseAndNumFiltersForBadRequest(Status.SUCCESS_OK, 0); + } + + @Test + public void testGetFiltersWithValues_requestPayloadIsNull() throws IOException { + + initializeMocks(null); + + // Method under test + filterProcessor.getFiltersWithValues(mockExchange); + + verifyResponseAndNumFiltersForBadRequest(Status.SUCCESS_OK, 0); + } + + @Test + public void testGetFiltersWithValues_requestPayloadIsEmptyString() throws IOException { + + initializeMocks(""); + + // Method under test + filterProcessor.getFiltersWithValues(mockExchange); + + verifyResponseAndNumFiltersForBadRequest(Status.SUCCESS_OK, 0); + } + + @Test + public void testGetFiltersWithValues_requestPayloadCausesException() throws IOException { + + initializeMocks("{"); + + // Method under test + filterProcessor.getFiltersWithValues(mockExchange); + + verifyResponseAndNumFiltersForBadRequest(Status.SUCCESS_OK, 0); + } +} diff --git a/src/test/java/org/onap/aai/sparky/search/filters/FilteredSearchHelperTest.java b/src/test/java/org/onap/aai/sparky/search/filters/FilteredSearchHelperTest.java new file mode 100644 index 0000000..aa37d42 --- /dev/null +++ b/src/test/java/org/onap/aai/sparky/search/filters/FilteredSearchHelperTest.java @@ -0,0 +1,69 @@ +/** + * ============LICENSE_START=================================================== + * SPARKY (AAI UI service) + * ============================================================================ + * Copyright © 2017 AT&T Intellectual Property. + * Copyright © 2017 Amdocs + * All rights reserved. + * ============================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END===================================================== + * + * ECOMP and OpenECOMP are trademarks + * and service marks of AT&T Intellectual Property. + */ + +package org.onap.aai.sparky.search.filters; + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; + +import org.junit.BeforeClass; +import org.junit.Test; +import org.onap.aai.sparky.search.filters.FilteredSearchHelper; +import org.onap.aai.sparky.search.filters.config.FiltersConfig; + +public class FilteredSearchHelperTest { + + private static FilteredSearchHelper filteredSearchHelper; + + @BeforeClass + public static void init() throws IOException { + FiltersConfig config = FiltersConfig.getInstance(); + config.setFilterMappingsFileName("src/test/resources/filters/aaiui_views.json"); + config.setFiltersFileName("src/test/resources/filters/aaiui_filters.json"); + System.out.println("SETTING UIVIEWSCONFIG"); + config.setViewsConfig(config.readUiViewsConfig()); + System.out.println("SETTING UIFILTERSCONFIG"); + config.setFiltersConfig(config.readUiFiltersConfig()); + + filteredSearchHelper = new FilteredSearchHelper(config); + } + + @Test + public void testDoFilterDiscovery_validViewName() { + assertEquals(4, filteredSearchHelper.doFilterDiscovery("vnfSearch").getFilters().size()); + assertEquals(4, filteredSearchHelper.doFilterDiscovery("dataIntegrity").getFilters().size()); + } + + @Test + public void testDoFilterDiscovery_invalidViewName_nameGiven() { + assertEquals(0, filteredSearchHelper.doFilterDiscovery("InvalidViewName").getFilters().size()); + } + + @Test + public void testDoFilterDiscovery_invalidViewName_emptyString() { + assertEquals(0, filteredSearchHelper.doFilterDiscovery("").getFilters().size()); + } +} diff --git a/src/test/java/org/onap/aai/sparky/search/filters/entity/DiscoverFiltersRequest.java b/src/test/java/org/onap/aai/sparky/search/filters/entity/DiscoverFiltersRequest.java new file mode 100644 index 0000000..336e3b1 --- /dev/null +++ b/src/test/java/org/onap/aai/sparky/search/filters/entity/DiscoverFiltersRequest.java @@ -0,0 +1,40 @@ +/** + * ============LICENSE_START=================================================== + * SPARKY (AAI UI service) + * ============================================================================ + * Copyright © 2017 AT&T Intellectual Property. + * Copyright © 2017 Amdocs + * All rights reserved. + * ============================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END===================================================== + * + * ECOMP and OpenECOMP are trademarks + * and service marks of AT&T Intellectual Property. + */ + +package org.onap.aai.sparky.search.filters.entity; + +public class DiscoverFiltersRequest { + + private String viewName; + + public String getViewName() { + return viewName; + } + + public void setViewName(String viewName) { + this.viewName = viewName; + } + +} diff --git a/src/test/java/org/onap/aai/sparky/search/filters/entity/ViewConfiguration.java b/src/test/java/org/onap/aai/sparky/search/filters/entity/ViewConfiguration.java new file mode 100644 index 0000000..f6c352b --- /dev/null +++ b/src/test/java/org/onap/aai/sparky/search/filters/entity/ViewConfiguration.java @@ -0,0 +1,68 @@ +/** + * ============LICENSE_START=================================================== + * SPARKY (AAI UI service) + * ============================================================================ + * Copyright © 2017 AT&T Intellectual Property. + * Copyright © 2017 Amdocs + * All rights reserved. + * ============================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END===================================================== + * + * ECOMP and OpenECOMP are trademarks + * and service marks of AT&T Intellectual Property. + */ + +package org.onap.aai.sparky.search.filters.entity; + +import java.util.ArrayList; +import java.util.List; + +public class ViewConfiguration { + + private String viewName; + private List viewFilters; + + public ViewConfiguration() { + viewFilters = new ArrayList(); + } + + public ViewConfiguration(String viewName) { + viewFilters = new ArrayList(); + this.setViewName(viewName); + } + + public String getViewName() { + return viewName; + } + + public void setViewName(String viewName) { + this.viewName = viewName; + } + + public List getViewFilters() { + return viewFilters; + } + + public void setViewFilters(List viewFilters) { + this.viewFilters = viewFilters; + } + + public void addViewFilter(ViewFilter viewFilter) { + if (viewFilters != null) { + if (!viewFilters.contains(viewFilter)) { + viewFilters.add(viewFilter); + } + } + } +} diff --git a/src/test/java/org/onap/aai/sparky/search/filters/entity/ViewFilter.java b/src/test/java/org/onap/aai/sparky/search/filters/entity/ViewFilter.java new file mode 100644 index 0000000..94832d5 --- /dev/null +++ b/src/test/java/org/onap/aai/sparky/search/filters/entity/ViewFilter.java @@ -0,0 +1,57 @@ +/** + * ============LICENSE_START=================================================== + * SPARKY (AAI UI service) + * ============================================================================ + * Copyright © 2017 AT&T Intellectual Property. + * Copyright © 2017 Amdocs + * All rights reserved. + * ============================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END===================================================== + * + * ECOMP and OpenECOMP are trademarks + * and service marks of AT&T Intellectual Property. + */ + +package org.onap.aai.sparky.search.filters.entity; + +import org.onap.aai.sparky.search.filters.config.UiFilterOptionsValuesConfig; + +public class ViewFilter { + + private String id; + private UiFilterOptionsValuesConfig defaultValue; + + public ViewFilter() {} + + public ViewFilter(String id, UiFilterOptionsValuesConfig defaultValue) { + this.id = id; + this.defaultValue = defaultValue; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public UiFilterOptionsValuesConfig getDefaultValue() { + return defaultValue; + } + + public void setDefaultValue(UiFilterOptionsValuesConfig defaultValue) { + this.defaultValue = defaultValue; + } +} diff --git a/src/test/resources/filters/AggregationSuggestionEntity_getIndexDocumentJson_expected.json b/src/test/resources/filters/AggregationSuggestionEntity_getIndexDocumentJson_expected.json new file mode 100644 index 0000000..53e9ec9 --- /dev/null +++ b/src/test/resources/filters/AggregationSuggestionEntity_getIndexDocumentJson_expected.json @@ -0,0 +1 @@ +"filterList":[{"filterId":"1"},{"filterId":"2"},{"filterId":"7"},{"filterId":"8"}] \ No newline at end of file diff --git a/src/test/resources/filters/aaiui_filters.json b/src/test/resources/filters/aaiui_filters.json new file mode 100644 index 0000000..31716ed --- /dev/null +++ b/src/test/resources/filters/aaiui_filters.json @@ -0,0 +1,88 @@ +{ + "filters": [ + { + "filterId": "1", + "filterName": "Orchestration-Status", + "displayName": "Orchestration Status", + "dataType": "list", + "dataSource": { + "indexName": "aggregate_generic-vnf_index", + "docType": "default", + "fieldName": "orchestration-status" + } + }, + { + "filterId": "2", + "filterName": "Prov-Status", + "displayName": "Provisioning Status", + "dataType": "list", + "dataSource": { + "indexName": "aggregate_generic-vnf_index", + "docType": "default", + "fieldName": "prov-status" + } + }, + { + "filterId": "3", + "filterName": "Severity", + "displayName": "Severity", + "dataType": "list", + "dataSource": { + "indexName": "di-violations", + "docType": "default", + "fieldName": "severity" + } + }, + { + "filterId": "4", + "filterName": "Category", + "displayName": "Category", + "dataType": "list", + "dataSource": { + "indexName": "di-violations", + "docType": "default", + "fieldName": "category" + } + }, + { + "filterId": "5", + "filterName": "Date", + "displayName": "Date", + "dataType": "date" + }, + { + "filterId": "6", + "filterName": "EntityType", + "displayName": "Object Type", + "dataType": "list", + "dataSource": { + "indexName": "di-violations", + "docType": "default", + "fieldName": "entityType" + } + }, + { + "filterId": "7", + "filterName": "NF-Type", + "displayName": "Network Function Type", + "dataType": "list", + "dataSource": { + "indexName": "aggregate_generic-vnf_index", + "docType": "default", + "fieldName": "nf-type" + } + }, + { + "filterId": "8", + "filterName": "NF-Role", + "displayName": "Network Function Role", + "dataType": "list", + "dataSource": { + "indexName": "aggregate_generic-vnf_index", + "docType": "default", + "fieldName": "nf-role" + } + } + + ] +} \ No newline at end of file diff --git a/src/test/resources/filters/aaiui_views.json b/src/test/resources/filters/aaiui_views.json new file mode 100644 index 0000000..e6ece9f --- /dev/null +++ b/src/test/resources/filters/aaiui_views.json @@ -0,0 +1,38 @@ +{ + "views": [ + { + "viewName" : "vnfSearch", + "filters" : [ + { + "filterId": "1" + }, + { + "filterId": "2" + }, + { + "filterId": "7" + }, + { + "filterId": "8" + } + ] + }, + { + "viewName" : "dataIntegrity", + "filters" : [ + { + "filterId": "3" + }, + { + "filterId": "4" + }, + { + "filterId": "5" + }, + { + "filterId": "6" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/test/resources/filters/filterAggregationEndpoint_emptyRequestBody_expectedResponse.json b/src/test/resources/filters/filterAggregationEndpoint_emptyRequestBody_expectedResponse.json new file mode 100644 index 0000000..95a2b16 --- /dev/null +++ b/src/test/resources/filters/filterAggregationEndpoint_emptyRequestBody_expectedResponse.json @@ -0,0 +1 @@ +{"count":0} \ No newline at end of file diff --git a/src/test/resources/filters/filterAggregationEndpoint_emptyRequestFilterArray_expectedResponse.json b/src/test/resources/filters/filterAggregationEndpoint_emptyRequestFilterArray_expectedResponse.json new file mode 100644 index 0000000..36ae0a5 --- /dev/null +++ b/src/test/resources/filters/filterAggregationEndpoint_emptyRequestFilterArray_expectedResponse.json @@ -0,0 +1 @@ +{"groupby_aggregation":[{"totalChartHits":0,"buckets":[]}]} \ No newline at end of file diff --git a/src/test/resources/filters/filterAggregationEndpoint_emptyRequestFilterArray_requestBody.json b/src/test/resources/filters/filterAggregationEndpoint_emptyRequestFilterArray_requestBody.json new file mode 100644 index 0000000..ba7d987 --- /dev/null +++ b/src/test/resources/filters/filterAggregationEndpoint_emptyRequestFilterArray_requestBody.json @@ -0,0 +1,3 @@ +{ + "filters": [] +} \ No newline at end of file diff --git a/src/test/resources/filters/filterAggregationEndpoint_successPath_expectedResponse.json b/src/test/resources/filters/filterAggregationEndpoint_successPath_expectedResponse.json new file mode 100644 index 0000000..e2c5766 --- /dev/null +++ b/src/test/resources/filters/filterAggregationEndpoint_successPath_expectedResponse.json @@ -0,0 +1 @@ +{"total":116,"aggregations":{"prov-status":[{"doc_count":77,"key":""},{"doc_count":2,"key":"PREPROV"}],"orchestration-status":[{"doc_count":116,"key":"Created"}]}} diff --git a/src/test/resources/filters/filterAggregationEndpoint_successPath_operationResult.json b/src/test/resources/filters/filterAggregationEndpoint_successPath_operationResult.json new file mode 100644 index 0000000..753a11f --- /dev/null +++ b/src/test/resources/filters/filterAggregationEndpoint_successPath_operationResult.json @@ -0,0 +1 @@ +{"took":39,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":116,"max_score":0.0,"hits":[]},"aggregations":{"prov-status":{"doc_count_error_upper_bound":0,"sum_other_doc_count":0,"buckets":[{"key":"","doc_count":77},{"key":"PREPROV","doc_count":2}]},"orchestration-status":{"doc_count_error_upper_bound":0,"sum_other_doc_count":0,"buckets":[{"key":"Created","doc_count":116}]}}} \ No newline at end of file diff --git a/src/test/resources/filters/filterAggregationEndpoint_successPath_requestBody.json b/src/test/resources/filters/filterAggregationEndpoint_successPath_requestBody.json new file mode 100644 index 0000000..c321760 --- /dev/null +++ b/src/test/resources/filters/filterAggregationEndpoint_successPath_requestBody.json @@ -0,0 +1,11 @@ +{ + "filters": [ + { + "filterId": "1", + "filterValue": "Created" + }, + { + "filterId": "2" + } + ] +} \ No newline at end of file -- cgit 1.2.3-korg