aboutsummaryrefslogtreecommitdiffstats
path: root/common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main')
-rw-r--r--common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/GABService.java57
-rw-r--r--common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/GABServiceImpl.java42
-rw-r--r--common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/model/GABQuery.java60
-rw-r--r--common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/model/GABResult.java48
-rw-r--r--common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/model/GABResultEntry.java52
-rw-r--r--common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/model/GABResults.java47
-rw-r--r--common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/yaml/GABYamlParser.java118
-rw-r--r--common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/yaml/YamlParser.java188
8 files changed, 612 insertions, 0 deletions
diff --git a/common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/GABService.java b/common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/GABService.java
new file mode 100644
index 0000000000..0ac976a18a
--- /dev/null
+++ b/common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/GABService.java
@@ -0,0 +1,57 @@
+/*
+ * ============LICENSE_START=======================================================
+ * GAB
+ * ================================================================================
+ * Copyright (C) 2019 Nokia Intellectual Property. 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=========================================================
+ */
+
+package org.onap.sdc.gab;
+
+import java.io.IOException;
+import org.onap.sdc.gab.model.GABQuery;
+import org.onap.sdc.gab.model.GABResults;
+
+/**
+ * <pre>
+ * SDC/DCAE-DS FM/PM artifact browser service.
+ * </pre>
+ *
+ * Currently the artifact browser is able to parse VES_EVENT_REGISTRATION action (registering of all VES events -
+ * including alarms/faults) to serve required data from the given document.
+ *
+ * @version %I%, %G%
+ * @since 1.4.0-SNAPSHOT
+ */
+public interface GABService {
+
+ /**
+ * Extracting event data based on given YAML paths. As an output, a list of results is returned.
+ *
+ * @param gabQuery the parameter should contain three entries:
+ * <br>* JSON paths for querying specific data
+ * <br>* path/content of YAML document containing faults/measurements data
+ * <br>* type of the query - can be defined as a PATH or CONTENT depends of document-parameter type
+ *
+ * @exception IOException thrown in case of file/content problem.
+ * @return Result of search the query inside the given document.
+ *
+ * @see GABResults
+ * @see GABQuery
+ */
+ GABResults searchFor(GABQuery gabQuery) throws IOException;
+
+}
+
diff --git a/common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/GABServiceImpl.java b/common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/GABServiceImpl.java
new file mode 100644
index 0000000000..7f6c3539e2
--- /dev/null
+++ b/common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/GABServiceImpl.java
@@ -0,0 +1,42 @@
+/*
+ * ============LICENSE_START=======================================================
+ * GAB
+ * ================================================================================
+ * Copyright (C) 2019 Nokia Intellectual Property. 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=========================================================
+ */
+
+package org.onap.sdc.gab;
+
+import java.io.IOException;
+import org.onap.sdc.gab.model.GABQuery;
+import org.onap.sdc.gab.model.GABQuery.GABQueryType;
+import org.onap.sdc.gab.model.GABResults;
+import org.onap.sdc.gab.yaml.GABYamlParser;
+import org.onap.sdc.gab.yaml.YamlParser;
+
+public class GABServiceImpl implements GABService {
+
+ public GABResults searchFor(GABQuery gabQuery) throws IOException {
+ try (GABYamlParser gabYamlParser = new GABYamlParser(new YamlParser())) {
+ return parse(gabQuery, gabYamlParser).filter(gabQuery.getFields()).collect();
+ }
+ }
+
+ private GABYamlParser parse(GABQuery gabQuery, GABYamlParser gabYamlParser){
+ return gabQuery.getType() == GABQueryType.PATH ?
+ gabYamlParser.parseFile(gabQuery.getDocument()) : gabYamlParser.parseContent(gabQuery.getDocument());
+ }
+}
diff --git a/common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/model/GABQuery.java b/common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/model/GABQuery.java
new file mode 100644
index 0000000000..f306e09665
--- /dev/null
+++ b/common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/model/GABQuery.java
@@ -0,0 +1,60 @@
+/*
+ * ============LICENSE_START=======================================================
+ * GAB
+ * ================================================================================
+ * Copyright (C) 2019 Nokia Intellectual Property. 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=========================================================
+ */
+
+package org.onap.sdc.gab.model;
+
+import java.util.Set;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * See GABQuery.{@link #fields}, GABQuery.{@link #document}
+ */
+@AllArgsConstructor
+@Getter
+public class GABQuery {
+
+ /**
+ * PATH - when provided path to the yaml file
+ * CONTENT - when provided yaml file content
+ */
+ public enum GABQueryType{
+ PATH, CONTENT
+ }
+
+ /**
+ * JSON paths for querying specific data (this will be the definition of a "column").
+ */
+ private Set<String> fields;
+
+ /**
+ * An YAML document path/content
+ */
+ private String document;
+
+ /**
+ * Used for query type checking.
+ *
+ * @see GABQueryType
+ *
+ */
+ private GABQueryType type;
+
+}
diff --git a/common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/model/GABResult.java b/common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/model/GABResult.java
new file mode 100644
index 0000000000..3338024db8
--- /dev/null
+++ b/common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/model/GABResult.java
@@ -0,0 +1,48 @@
+/*
+ * ============LICENSE_START=======================================================
+ * GAB
+ * ================================================================================
+ * Copyright (C) 2019 Nokia Intellectual Property. 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=========================================================
+ */
+
+package org.onap.sdc.gab.model;
+
+import com.google.common.base.MoreObjects;
+import java.util.List;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * See GABResults.{@link #entries}
+ */
+@Getter
+@AllArgsConstructor
+public class GABResult {
+
+ /**
+ * Result entries list of the executed GABQuery.
+ *
+ * @see GABQuery
+ * @see GABResultEntry
+ */
+ private List<GABResultEntry> entries;
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(this).add("entries", entries).toString();
+ }
+
+}
diff --git a/common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/model/GABResultEntry.java b/common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/model/GABResultEntry.java
new file mode 100644
index 0000000000..45b2412c1e
--- /dev/null
+++ b/common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/model/GABResultEntry.java
@@ -0,0 +1,52 @@
+/*
+ * ============LICENSE_START=======================================================
+ * GAB
+ * ================================================================================
+ * Copyright (C) 2019 Nokia Intellectual Property. 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=========================================================
+ */
+
+package org.onap.sdc.gab.model;
+
+import com.google.common.base.MoreObjects;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import org.onap.sdc.gab.GABService;
+
+/**
+ * See GABResultEntry.{@link #path}, GABResultEntry.{@link #data}
+ */
+@Getter
+@AllArgsConstructor
+public class GABResultEntry {
+ /**
+ * Path of queried data.
+ */
+ private String path;
+
+ /**
+ * Specific events-template data served by the GABService
+ * @see GABService
+ */
+ private Object data;
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(this)
+ .add("path", path)
+ .add("data", data)
+ .toString();
+ }
+}
diff --git a/common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/model/GABResults.java b/common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/model/GABResults.java
new file mode 100644
index 0000000000..23d026b2f4
--- /dev/null
+++ b/common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/model/GABResults.java
@@ -0,0 +1,47 @@
+/*
+ * ============LICENSE_START=======================================================
+ * GAB
+ * ================================================================================
+ * Copyright (C) 2019 Nokia Intellectual Property. 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=========================================================
+ */
+
+package org.onap.sdc.gab.model;
+
+import com.google.common.base.MoreObjects;
+import java.util.List;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * See GABResults.{@link #rows}
+ */
+@Getter
+@AllArgsConstructor
+public class GABResults {
+
+ /**
+ * Results list of the executed GABQuery.
+ *
+ * @see GABQuery
+ * @see GABResult
+ */
+ private List<GABResult> rows;
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(this).add("rows", rows).toString();
+ }
+}
diff --git a/common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/yaml/GABYamlParser.java b/common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/yaml/GABYamlParser.java
new file mode 100644
index 0000000000..fae94421ae
--- /dev/null
+++ b/common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/yaml/GABYamlParser.java
@@ -0,0 +1,118 @@
+/*
+ * ============LICENSE_START=======================================================
+ * GAB
+ * ================================================================================
+ * Copyright (C) 2019 Nokia Intellectual Property. 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=========================================================
+ */
+
+package org.onap.sdc.gab.yaml;
+
+import java.io.IOException;
+import java.util.AbstractMap.SimpleEntry;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+import org.onap.sdc.gab.model.GABResult;
+import org.onap.sdc.gab.model.GABResultEntry;
+import org.onap.sdc.gab.model.GABResults;
+
+/**
+ * Yaml parser and searcher for GAB. Requires 3 steps:
+ *
+ * <br>1. Load content of Yaml file using {@link #parseContent(String)} or {@link #parseFile(String)}
+ * <br>2. Provide keywords to search using {@link #filter(String)} or {@link #filter(Set)}
+ * <br>3. Collect the results using {@link #collect()}
+ */
+public class GABYamlParser implements AutoCloseable {
+
+ private YamlParser yamlParser;
+
+ public GABYamlParser(YamlParser yamlParser) {
+ this.yamlParser = yamlParser;
+ }
+
+ /**
+ * Provides yaml path for processing.
+ *
+ * @param path Yaml file path.
+ * @return Same parser with loaded source.
+ */
+ public GABYamlParser parseFile(String path) {
+ yamlParser.parseFile(path);
+ return this;
+ }
+
+ /**
+ * Provides yaml content for processing.
+ *
+ * @param content Yaml file content.
+ * @return Same parser with loaded source.
+ */
+ public GABYamlParser parseContent(String content) {
+ yamlParser.parseContent(content);
+ return this;
+ }
+
+ /**
+ * Adds set of filters for processing.
+ *
+ * @param filters correct json paths for searching resources.
+ * @return Same parser with loaded filters.
+ */
+ public GABYamlParser filter(Set<String> filters) {
+ yamlParser.filter(filters);
+ return this;
+ }
+
+ /**
+ * Adds single filter for processing.
+ *
+ * @param filter correct json path for searching resource.
+ * @return Same parser with loaded filter.
+ */
+ public GABYamlParser filter(String filter) {
+ yamlParser.filter(filter);
+ return this;
+ }
+
+ /**
+ * Collects the results from parsed yaml file and applied filters.
+ *
+ * @exception IOException Means that yaml file has invalid content.
+ * @return {@link GABResults}
+ */
+ public GABResults collect() throws IOException {
+ return new GABResults(yamlParser.collect().stream()
+ .map(results -> new GABResult(createGabResultEntryList(results)))
+ .collect(Collectors.toList()));
+ }
+
+ private List<GABResultEntry> createGabResultEntryList(List<SimpleEntry<String, ? extends Collection<Object>>> parsedContent) {
+ return Objects.isNull(parsedContent) ? Collections.emptyList() : parsedContent.stream()
+ .map(result -> result.getValue().stream()
+ .map(entry -> new GABResultEntry(result.getKey(), entry))
+ .collect(Collectors.toList())).flatMap(Collection::stream)
+ .collect(Collectors.toList());
+ }
+
+ @Override
+ public void close() throws IOException {
+ yamlParser.close();
+ }
+}
diff --git a/common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/yaml/YamlParser.java b/common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/yaml/YamlParser.java
new file mode 100644
index 0000000000..0d3575920c
--- /dev/null
+++ b/common/onap-generic-artifact-browser/onap-generic-artifact-browser-service/src/main/java/org/onap/sdc/gab/yaml/YamlParser.java
@@ -0,0 +1,188 @@
+/*
+ * ============LICENSE_START=======================================================
+ * GAB
+ * ================================================================================
+ * Copyright (C) 2019 Nokia Intellectual Property. 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=========================================================
+ */
+
+package org.onap.sdc.gab.yaml;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonElement;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.AbstractMap.SimpleEntry;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.function.Predicate;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
+import org.antlr.v4.runtime.misc.ParseCancellationException;
+import org.apache.commons.io.IOUtils;
+import org.jsfr.json.JsonSurfer;
+import org.jsfr.json.JsonSurferGson;
+import org.yaml.snakeyaml.Yaml;
+
+/**
+ * Yaml parser and searcher which requires 3 steps:
+ *
+ * <br>1. Load content of Yaml file using {@link #parseContent(String)} or {@link #parseFile(String)}
+ * <br>2. Provide keywords to search using {@link #filter(String)} or {@link #filter(Set)}
+ * <br>3. Collect the results using {@link #collect()}
+ */
+public class YamlParser implements AutoCloseable {
+
+ private static Logger LOGGER = Logger.getLogger(YamlParser.class.getName());
+
+ private Stream<Object> parsedYamlContent;
+ private InputStream inputStream;
+ private Set<String> filters;
+
+ public YamlParser() {
+ this.parsedYamlContent = Stream.empty();
+ filters = new HashSet<>();
+ }
+
+ /**
+ * Provides yaml path for processing.
+ *
+ * @param path Yaml file path.
+ * @return Same parser with loaded source.
+ */
+ YamlParser parseFile(String path) {
+ filters = new HashSet<>();
+ InputStream newInputStream = this.getClass().getClassLoader().getResourceAsStream(path);
+ parse(path, newInputStream);
+ return this;
+ }
+
+ /**
+ * Provides yaml content for processing.
+ *
+ * @param content Yaml file content.
+ * @return Same parser with loaded source.
+ */
+ YamlParser parseContent(String content) {
+ filters = new HashSet<>();
+ InputStream newInputStream = IOUtils.toInputStream(content);
+ parse(content, newInputStream);
+ return this;
+ }
+
+ /**
+ * Adds set of filters for processing.
+ *
+ * @param filters correct json paths for searching resources.
+ * @return Same parser with loaded filters.
+ */
+ YamlParser filter(Set<String> filters) {
+ this.filters.addAll(filters);
+ return this;
+ }
+
+ /**
+ * Adds single filter for processing.
+ *
+ * @param filter correct json path for searching resource.
+ * @return Same parser with loaded filter.
+ */
+ YamlParser filter(String filter) {
+ filters.add(filter);
+ return this;
+ }
+
+ /**
+ * Collects the results from parsed yaml file and applied filters.
+ *
+ * @exception IOException Means that yaml file has invalid content.
+ * @return List of List of simple entry 'key: collection of data'
+ */
+ List<List<SimpleEntry<String, ? extends Collection<Object>>>> collect() throws IOException {
+ try {
+ return parsedYamlContent.map(containsKeys).filter(notEmptyListPredicate()).collect(Collectors.toList());
+ } catch(Exception e){
+ LOGGER.log(Level.WARNING, "Unexpected document content. Please check body of the yaml file.", e);
+ throw new IOException("Unexpected document content");
+ }
+ }
+
+ private void parse(String yaml, InputStream newInputStream) {
+ try {
+ closeStream(inputStream);
+ inputStream = newInputStream;
+ if (Objects.isNull(inputStream) || inputStream.available() <= 0) {
+ throw new IOException("Empty input stream of yaml content.");
+ }
+ parsedYamlContent = StreamSupport.stream(new Yaml().loadAll(inputStream).spliterator(), false);
+ } catch (IOException e) {
+ LOGGER.log(Level.WARNING, "Cannot parse yaml: " + yaml, e);
+ parsedYamlContent = Stream.empty();
+ }
+ }
+
+ private Function<Object, List<SimpleEntry<String, ? extends Collection<Object>>>> containsKeys = parsedYamlSingleDocument -> {
+ JsonElement jsonElement = new Gson().toJsonTree(parsedYamlSingleDocument);
+ return findInJson(filters, jsonElement);
+ };
+
+ private List<SimpleEntry<String, ? extends Collection<Object>>> findInJson(Set<String> keys,
+ JsonElement document) {
+ return keys.stream()
+ .map(getEntryForKeyFunction(document))
+ .filter(notEmptyEntryPredicate())
+ .collect(Collectors.toList());
+ }
+
+ private Predicate<? super List<SimpleEntry<String, ? extends Collection<Object>>>> notEmptyListPredicate() {
+ return list -> !list.isEmpty();
+ }
+
+ private Predicate<SimpleEntry<String, ? extends Collection<Object>>> notEmptyEntryPredicate() {
+ return entry -> !entry.getValue().isEmpty();
+ }
+
+ private Function<String, SimpleEntry<String, ? extends Collection<Object>>> getEntryForKeyFunction(
+ JsonElement document) {
+ return key -> {
+ JsonSurfer surfer = JsonSurferGson.INSTANCE;
+ try {
+ return new SimpleEntry<>(key, surfer.collectAll(document.toString(), "$." + key));
+ } catch (ParseCancellationException e) {
+ LOGGER.log(Level.WARNING, "Invalid filter key: " + key, e);
+ return new SimpleEntry<>(key, Collections.emptyList());
+ }
+ };
+ }
+
+ private void closeStream(InputStream stream) throws IOException {
+ if (!Objects.isNull(stream) && !(stream.available() > 0)) {
+ stream.close();
+ }
+ }
+
+ @Override
+ public void close() throws IOException {
+ closeStream(inputStream);
+ }
+}