summaryrefslogtreecommitdiffstats
path: root/src/test/java/org/onap
diff options
context:
space:
mode:
authorMichael Arrastia <MArrasti@amdocs.com>2018-07-12 13:37:43 +0100
committerMichael Arrastia <MArrasti@amdocs.com>2018-07-12 14:01:38 +0100
commit7d3dcdbff807ba1facb84f94ac39ff91bf410b29 (patch)
tree0f72ce4d3a15e8c77ec1b0b81865cd942176d454 /src/test/java/org/onap
parent3105617e4686774f98b398ee8d6f8a7bd021f86a (diff)
Migrate Spike code to ONAP
Move what was originally an Open ECOMP microservice into ONAP. This is primarily a code move and includes: - removal of AJSC and replacement with latest version of Spring Boot - alignment with ONAP standards - license headers - package renaming - FOSSology scan completed Further work is required to add JJB and OOM. Change-Id: I305c8407256bf2dbcc816f34f031f92eafd6ef5a Issue-ID: AAI-1374 Signed-off-by: Michael Arrastia <MArrasti@amdocs.com>
Diffstat (limited to 'src/test/java/org/onap')
-rw-r--r--src/test/java/org/onap/aai/spike/event/OffsetManagerTest.java90
-rw-r--r--src/test/java/org/onap/aai/spike/event/envelope/EventEnvelopeParserTest.java40
-rw-r--r--src/test/java/org/onap/aai/spike/event/envelope/EventEnvelopeTest.java53
-rw-r--r--src/test/java/org/onap/aai/spike/schema/EdgeRulesLoaderTest.java69
-rw-r--r--src/test/java/org/onap/aai/spike/schema/GraphEventTransformerTest.java121
-rw-r--r--src/test/java/org/onap/aai/spike/schema/OxmModelLoaderTest.java62
-rw-r--r--src/test/java/org/onap/aai/spike/test/util/TestFileReader.java88
7 files changed, 523 insertions, 0 deletions
diff --git a/src/test/java/org/onap/aai/spike/event/OffsetManagerTest.java b/src/test/java/org/onap/aai/spike/event/OffsetManagerTest.java
new file mode 100644
index 0000000..7975d6f
--- /dev/null
+++ b/src/test/java/org/onap/aai/spike/event/OffsetManagerTest.java
@@ -0,0 +1,90 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright © 2017-2018 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=========================================================
+ */
+package org.onap.aai.spike.event;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.junit.Test;
+import org.onap.aai.spike.event.incoming.OffsetManager;
+
+public class OffsetManagerTest {
+
+ /**
+ * This test validates that as events are cached, and flagged as published, that the 'safe' offset
+ * is advanced correctly.
+ */
+ @Test
+ public void testOffsetAdvancement() throws Exception {
+
+ final Long offsetPeriod = 50L; // ms
+
+ // Create an instance of the offset manager.
+ OffsetManager offsetManager = new OffsetManager(10, offsetPeriod);
+
+ // Now, cache some events as if we had consumed them and they
+ // are in flight.
+ final int event1Index = offsetManager.cacheEvent("1", 1);
+ final int event2Index = offsetManager.cacheEvent("2", 2);
+ final int event3Index = offsetManager.cacheEvent("3", 3);
+ final int event4Index = offsetManager.cacheEvent("4", 4);
+
+ // Mark some of them as 'published'
+ offsetManager.markAsPublished(event1Index);
+ offsetManager.markAsPublished(event2Index);
+ offsetManager.markAsPublished(event4Index);
+
+ // Validate that the offset manager reported the expected offset (ie: we can only commit up
+ // to event2, event though event4 has been processed, since event3 is still in flight).
+ Long nextOffset = waitForOffsetUpdate(null, offsetPeriod, offsetManager);
+ assertTrue("Unexpected 'next offset' value. Expected=2, actual=" + nextOffset, nextOffset == 2);
+
+ // Now, let's mark event3 as 'published'. We should see the next safe offset
+ // advance to event4 (since is was previously flagged as 'published').
+ offsetManager.markAsPublished(event3Index);
+
+ nextOffset = waitForOffsetUpdate(nextOffset, offsetPeriod, offsetManager);
+ assertTrue("Unexpected 'next offset' value. Expected=4, actual=" + nextOffset, nextOffset == 4);
+ }
+
+ private Long waitForOffsetUpdate(Long currentOffset, Long offsetPeriod, OffsetManager offsetManager)
+ throws InterruptedException {
+
+ Long newOffset = currentOffset;
+ int retries = 3;
+ while (currentOffset == newOffset) {
+
+ // Wait long enough for the offset manager to have hopefully kicked it's offset
+ // update task.
+ Thread.sleep(offsetPeriod);
+ newOffset = offsetManager.getNextOffsetToCommit();
+
+ // We might have just missed the update due to timing, so we will retry a
+ // few times before giving up...
+ retries--;
+ if (retries == 0) {
+ fail("Safe offset was not updated as expected");
+ }
+ }
+ return newOffset;
+ }
+
+}
diff --git a/src/test/java/org/onap/aai/spike/event/envelope/EventEnvelopeParserTest.java b/src/test/java/org/onap/aai/spike/event/envelope/EventEnvelopeParserTest.java
new file mode 100644
index 0000000..2435a43
--- /dev/null
+++ b/src/test/java/org/onap/aai/spike/event/envelope/EventEnvelopeParserTest.java
@@ -0,0 +1,40 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright © 2017-2018 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=========================================================
+ */
+package org.onap.aai.spike.event.envelope;
+
+import org.junit.Test;
+import org.onap.aai.spike.event.incoming.GizmoGraphEvent;
+import org.onap.aai.spike.test.util.TestFileReader;
+import org.skyscreamer.jsonassert.JSONAssert;
+import org.skyscreamer.jsonassert.JSONCompareMode;
+
+public class EventEnvelopeParserTest {
+
+ @Test
+ public void testParseEvent() throws Exception {
+ String champNotification = TestFileReader.getFileAsString("event/champ-update-notification-raw.json");
+ String expectedParsedEvent = TestFileReader.getFileAsString("event/gizmo-graph-event.json");
+
+ GizmoGraphEvent gizmoGraphEvent = new EventEnvelopeParser().parseEvent(champNotification);
+
+ JSONAssert.assertEquals(expectedParsedEvent, gizmoGraphEvent.toJson(), JSONCompareMode.NON_EXTENSIBLE);
+ }
+}
diff --git a/src/test/java/org/onap/aai/spike/event/envelope/EventEnvelopeTest.java b/src/test/java/org/onap/aai/spike/event/envelope/EventEnvelopeTest.java
new file mode 100644
index 0000000..49f7bda
--- /dev/null
+++ b/src/test/java/org/onap/aai/spike/event/envelope/EventEnvelopeTest.java
@@ -0,0 +1,53 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright © 2017-2018 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=========================================================
+ */
+package org.onap.aai.spike.event.envelope;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import org.junit.Test;
+import org.onap.aai.spike.event.incoming.GizmoGraphEvent;
+import org.onap.aai.spike.event.outgoing.SpikeEventExclusionStrategy;
+import org.onap.aai.spike.event.outgoing.SpikeGraphEvent;
+import org.onap.aai.spike.test.util.TestFileReader;
+import org.skyscreamer.jsonassert.Customization;
+import org.skyscreamer.jsonassert.JSONAssert;
+import org.skyscreamer.jsonassert.JSONCompareMode;
+import org.skyscreamer.jsonassert.comparator.CustomComparator;
+
+public class EventEnvelopeTest {
+
+ private static final Gson gson =
+ new GsonBuilder().setExclusionStrategies(new SpikeEventExclusionStrategy()).setPrettyPrinting().create();
+
+ @Test
+ public void testPublishedEventFormat() throws Exception {
+ String champNotification = TestFileReader.getFileAsString("event/champ-update-notification-raw.json");
+ String expectedEventEnvelope = TestFileReader.getFileAsString("event/spike-event.json");
+
+ GizmoGraphEvent gizmoGraphEvent = new EventEnvelopeParser().parseEvent(champNotification);
+ SpikeGraphEvent spikeGraphEvent = gizmoGraphEvent.toSpikeGraphEvent();
+ String eventEnvelope = gson.toJson(new EventEnvelope(spikeGraphEvent));
+
+
+ JSONAssert.assertEquals(expectedEventEnvelope, eventEnvelope, new CustomComparator(
+ JSONCompareMode.NON_EXTENSIBLE, new Customization("header.timestamp", (o1, o2) -> true)));
+ }
+}
diff --git a/src/test/java/org/onap/aai/spike/schema/EdgeRulesLoaderTest.java b/src/test/java/org/onap/aai/spike/schema/EdgeRulesLoaderTest.java
new file mode 100644
index 0000000..987e8a3
--- /dev/null
+++ b/src/test/java/org/onap/aai/spike/schema/EdgeRulesLoaderTest.java
@@ -0,0 +1,69 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright © 2017-2018 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=========================================================
+ */
+package org.onap.aai.spike.schema;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.onap.aai.spike.exception.SpikeException;
+
+public class EdgeRulesLoaderTest {
+
+ @Test
+ public void loadModels() throws Exception {
+ EdgeRulesLoader.loadModels();
+ assertTrue(EdgeRulesLoader.getSchemaForVersion("v11")
+ .isValidType("org.onap.relationships.inventory.groupsResourcesIn"));
+ }
+
+ @Test
+ public void loadModelsWithAVersion() throws Exception {
+ EdgeRulesLoader.resetSchemaVersionContext();
+ EdgeRulesLoader.loadModels("V11");
+ assertEquals(1, EdgeRulesLoader.getSchemas().size());
+ assertEquals("v11", EdgeRulesLoader.getLatestSchemaVersion());
+ }
+
+ @Test
+ public void getSchemaForVersion() throws Exception {
+ EdgeRulesLoader.resetSchemaVersionContext();
+ EdgeRulesLoader.loadModels("v11");
+ String version = EdgeRulesLoader.getLatestSchemaVersion();
+ RelationshipSchema schema = EdgeRulesLoader.getSchemaForVersion(version);
+ assertNotNull(schema.lookupRelationType("org.onap.relationships.inventory.groupsResourcesIn"));
+ assertNotNull(schema.lookupRelation("U:V:org.onap.relationships.inventory.groupsResourcesIn"));
+ assertNull(schema.lookupRelation("U:W:org.onap.relationships.inventory.groupsResourcesIn"));
+ }
+
+
+ @Test
+ public void getSchemaForVersionFail() throws Exception {
+ EdgeRulesLoader.loadModels();
+ try {
+ EdgeRulesLoader.getSchemaForVersion("v1");
+ } catch (SpikeException e) {
+ assertEquals("Error loading DB Edge Rules for: v1", e.getMessage());
+ }
+ }
+}
diff --git a/src/test/java/org/onap/aai/spike/schema/GraphEventTransformerTest.java b/src/test/java/org/onap/aai/spike/schema/GraphEventTransformerTest.java
new file mode 100644
index 0000000..f58bbfc
--- /dev/null
+++ b/src/test/java/org/onap/aai/spike/schema/GraphEventTransformerTest.java
@@ -0,0 +1,121 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright © 2017-2018 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=========================================================
+ */
+package org.onap.aai.spike.schema;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import javax.xml.bind.JAXBException;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.aai.spike.event.incoming.GizmoGraphEvent;
+import org.onap.aai.spike.exception.SpikeException;
+
+
+/**
+ * This set of tests validates the ability of the {@link GraphEventTransformer} to produce OXM model
+ * compliant representations of generic graph entities.
+ */
+public class GraphEventTransformerTest {
+
+ /**
+ * Performs all setup steps expected to be performed prior to each test.
+ */
+ @Before
+ public void setup() throws Exception {
+ // Load the OXM model definitions.
+ OXMModelLoader.loadModels();
+
+ // Load the relationship definitions.
+ System.setProperty("CONFIG_HOME", "src/test/resources/");
+ EdgeRulesLoader.loadModels();
+ }
+
+
+ /**
+ * Validates that, given a raw vertex from the graph abstraction layer, we can transform it into a
+ * JSON string which corresponds to the OXM model.
+ *
+ */
+ @Test
+ public void vertexToJsonTest() throws Exception {
+ // Instantiate the vertex that we will apply the translation to.
+ String vertexJson = readFileToString(new File("src/test/resources/vertex.json"));
+ GizmoGraphEvent graphEvent = GizmoGraphEvent.fromJson(vertexJson);
+ graphEvent.getVertex().getProperties().getAsJsonObject().addProperty("invalid-key1", "invalid-key2");
+
+
+ // Now, validate our raw vertex from OXM model
+ GraphEventTransformer.validateVertexModel(graphEvent.getVertex());
+
+ // Validate the marshalled string we got back against our OXM model.
+ assertTrue("Object failed to validate against OXM model.",
+ graphEvent.getVertex().getProperties().getAsJsonObject().get("invalid-key1") == null);
+ }
+
+ @Test
+ public void edgeToJsonTest() throws Exception {
+ // Instantiate the edge that we will apply the translation to.
+ String edgeJson = readFileToString(new File("src/test/resources/edge.json"));
+ GizmoGraphEvent graphEvent = GizmoGraphEvent.fromJson(edgeJson);
+ graphEvent.getRelationship().getProperties().getAsJsonObject().addProperty("invalid-key1", "invalid-key2");
+
+ // Now, validate our raw edge from relationship model
+ GraphEventTransformer.validateEdgeModel(graphEvent.getRelationship());
+
+ // Validate the marshalled string we got back against our relationship model.
+ assertTrue("Object failed to validate against OXM model.",
+ graphEvent.getRelationship().getProperties().getAsJsonObject().get("invalid-key1") == null);
+ }
+
+ /**
+ * This helper method reads the contents of a file into a simple string.
+ *
+ * @param file - The file to be imported.
+ * @return - The file contents expressed as a simple string.
+ * @throws IOException if there is a problem reading the file
+ */
+ public static String readFileToString(File file) throws IOException {
+
+ BufferedReader br = new BufferedReader(new FileReader(file));
+ try {
+ StringBuilder sb = new StringBuilder();
+ String line = br.readLine();
+
+ while (line != null) {
+ sb.append(line);
+ line = br.readLine();
+ }
+
+ return sb.toString().replaceAll("\\s+", "");
+ } finally {
+ try {
+ br.close();
+ } catch (IOException e) {
+ fail("Unexpected IOException: " + e.getMessage());
+ }
+ }
+ }
+}
diff --git a/src/test/java/org/onap/aai/spike/schema/OxmModelLoaderTest.java b/src/test/java/org/onap/aai/spike/schema/OxmModelLoaderTest.java
new file mode 100644
index 0000000..ca8eb88
--- /dev/null
+++ b/src/test/java/org/onap/aai/spike/schema/OxmModelLoaderTest.java
@@ -0,0 +1,62 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright © 2017-2018 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=========================================================
+ */
+package org.onap.aai.spike.schema;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import org.eclipse.persistence.dynamic.DynamicType;
+import org.eclipse.persistence.internal.helper.DatabaseField;
+import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext;
+import org.eclipse.persistence.mappings.DatabaseMapping;
+import org.junit.Test;
+import org.onap.aai.spike.exception.SpikeException;
+
+public class OxmModelLoaderTest {
+ @Test
+ public void testLoadingMultipleOxmFiles() throws SpikeException {
+ OXMModelLoader.loadModels();
+
+ DynamicJAXBContext jaxbContext = OXMModelLoader.getContextForVersion(OXMModelLoader.getLatestVersion());
+
+ DynamicType pserver = jaxbContext.getDynamicType("Pserver");
+ DynamicType genericVnf = jaxbContext.getDynamicType("GenericVnf");
+
+ assertNotNull(pserver);
+ assertNotNull(genericVnf);
+
+ DatabaseMapping mapping = pserver.getDescriptor().getMappings().firstElement();
+ if (mapping.isAbstractDirectMapping()) {
+ DatabaseField field = mapping.getField();
+ String keyName = field.getName().substring(0, field.getName().indexOf("/"));
+ assertTrue(keyName.equals("hostname"));
+ }
+
+ mapping = genericVnf.getDescriptor().getMappings().firstElement();
+ if (mapping.isAbstractDirectMapping()) {
+ DatabaseField field = mapping.getField();
+ String keyName = field.getName().substring(0, field.getName().indexOf("/"));
+ assertTrue(keyName.equals("vnf-id"));
+ }
+
+ }
+
+}
diff --git a/src/test/java/org/onap/aai/spike/test/util/TestFileReader.java b/src/test/java/org/onap/aai/spike/test/util/TestFileReader.java
new file mode 100644
index 0000000..1f9e57f
--- /dev/null
+++ b/src/test/java/org/onap/aai/spike/test/util/TestFileReader.java
@@ -0,0 +1,88 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright © 2017-2018 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=========================================================
+ */
+package org.onap.aai.spike.test.util;
+
+import static org.junit.Assert.fail;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+public class TestFileReader {
+
+ public static String getFileAsString(String resourceFilename) throws IOException, URISyntaxException {
+ return getContentUtf8(getPath(resourceFilename));
+ }
+
+ /**
+ * This helper method reads the contents of a file into a simple string.
+ *
+ * @param file - The file to be imported.
+ * @return - The file contents expressed as a simple string.
+ * @throws IOException if there is a problem reading the file
+ */
+ public static String readFileToString(File file) throws IOException {
+
+ BufferedReader br = new BufferedReader(new FileReader(file));
+ try {
+ StringBuilder sb = new StringBuilder();
+ String line = br.readLine();
+
+ while (line != null) {
+ sb.append(line);
+ line = br.readLine();
+ }
+
+ return sb.toString().replaceAll("\\s+", "");
+ } finally {
+ try {
+ br.close();
+ } catch (IOException e) {
+ fail("Unexpected IOException: " + e.getMessage());
+ }
+ }
+ }
+
+ private static Path getPath(String resourceFilename) throws URISyntaxException {
+ URL resource = ClassLoader.getSystemResource(resourceFilename);
+ if (resource != null) {
+ return Paths.get(resource.toURI());
+ }
+
+ // If the resource is not found relative to the classpath, try to get it from the file system
+ // directly.
+ File file = new File(resourceFilename);
+ if (!file.exists()) {
+ throw new RuntimeException("Resource does not exist: " + resourceFilename);
+ }
+ return file.toPath();
+ }
+
+ private static String getContentUtf8(Path filePath) throws IOException {
+ return new String(Files.readAllBytes(filePath));
+ }
+}