summaryrefslogtreecommitdiffstats
path: root/utils/src/main
diff options
context:
space:
mode:
authorliamfallon <liam.fallon@ericsson.com>2018-07-30 17:13:22 +0100
committerliamfallon <liam.fallon@ericsson.com>2018-07-31 20:34:46 +0100
commit1b6404f2ab7fe93ecc0c7e4c91bc90c7aa94b42f (patch)
tree301e7ee74880a2d9155738d7489cde7d79eb3169 /utils/src/main
parentc36939ee0e648f4ac28b9cdc538991ced0c603bd (diff)
Add resource handling utility class
Add ResourceUtils, a class that provides utility methods for dealing with Java resources on the classpath. Change-Id: Ie4df249315ad145aabdfb35bb827ffbf6d79e095 Issue-ID: POLICY-922 Signed-off-by: liamfallon <liam.fallon@ericsson.com>
Diffstat (limited to 'utils/src/main')
-rw-r--r--utils/src/main/java/org/onap/policy/common/utils/resources/ResourceUtils.java214
1 files changed, 214 insertions, 0 deletions
diff --git a/utils/src/main/java/org/onap/policy/common/utils/resources/ResourceUtils.java b/utils/src/main/java/org/onap/policy/common/utils/resources/ResourceUtils.java
new file mode 100644
index 00000000..cca6e626
--- /dev/null
+++ b/utils/src/main/java/org/onap/policy/common/utils/resources/ResourceUtils.java
@@ -0,0 +1,214 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2018 Ericsson. 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.common.utils.resources;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This is common utility class with static methods for handling Java resources on the class path. It is an abstract
+ * class to prevent any direct instantiation and private constructor to prevent extending this class.
+ */
+public abstract class ResourceUtils {
+ // Get a reference to the logger
+ private static final Logger LOGGER = LoggerFactory.getLogger(ResourceUtils.class);
+
+ // The length of byte buffers used to read resources into strings
+ private static final int BYTE_BUFFER_LENGH = 1024;
+
+ /**
+ * Private constructor used to prevent sub class instantiation.
+ */
+ private ResourceUtils() {
+ // Prevent construction of this class
+ }
+
+ /**
+ * Method to resolve a resource; the local file system is checked first and then the class path is checked.
+ *
+ * @param resourceName The resource name
+ * @return A URL to a resource
+ */
+ public static URL getUrl4Resource(final String resourceName) {
+ // Check the local fine system first
+ final URL urlToResource = getLocalFile(resourceName);
+
+ // Check if this is a local file
+ if (urlToResource != null) {
+ return urlToResource;
+ } else {
+ // Resort to the class path
+ return getUrlResource(resourceName);
+ }
+ }
+
+ /**
+ * Method to return a resource as a string. The resource can be on the local file system or in the class path. The
+ * resource is resolved and loaded into a string.
+ *
+ * @param resourceName The resource name
+ * @return A string containing the resource
+ */
+ public static String getResourceAsString(final String resourceName) {
+ // Get the resource as a stream, we'll convert it to a string then
+ final InputStream resourceStream = getResourceAsStream(resourceName);
+ if (resourceStream == null) {
+ return null;
+ }
+
+ // Read the stream contents in to an output stream
+ final ByteArrayOutputStream resourceOutputStreamBuffer = new ByteArrayOutputStream();
+ final byte[] resourceBuffer = new byte[BYTE_BUFFER_LENGH];
+ int length;
+ try {
+ while ((length = resourceStream.read(resourceBuffer)) != -1) {
+ resourceOutputStreamBuffer.write(resourceBuffer, 0, length);
+ }
+ } catch (final IOException e) {
+ LOGGER.debug("error reading resource stream \"{}\" : " + e.getMessage(), resourceName, e);
+ return null;
+ }
+
+ return resourceOutputStreamBuffer.toString();
+ }
+
+ /**
+ * Method to return a resource as a stream. The resource can be on the local file system or in the class path. The
+ * resource is resolved and returned as a stream.
+ *
+ * @param resourceName The resource name
+ * @return A stream attached to the resource
+ */
+ public static InputStream getResourceAsStream(final String resourceName) {
+ // Find a URL to the resource first
+ final URL urlToResource = getUrl4Resource(resourceName);
+
+ // Check if the resource exists
+ if (urlToResource == null) {
+ // No resource found
+ LOGGER.debug("cound not find resource \"{}\" : ", resourceName);
+ return null;
+ }
+
+ // Read the resource into a string
+ try {
+ return urlToResource.openStream();
+ } catch (final IOException e) {
+ // Any of many IO exceptions such as the resource is a directory
+ LOGGER.debug("error attaching resource \"{}\" to stream : " + e.getMessage(), resourceName, e);
+ return null;
+ }
+ }
+
+ /**
+ * Method to get a URL resource from the class path.
+ *
+ * @param resourceName The resource name
+ * @return The URL to the resource
+ */
+ public static URL getUrlResource(final String resourceName) {
+ try {
+ final ClassLoader classLoader = ResourceUtils.class.getClassLoader();
+
+ final String[] fileParts = resourceName.split("/");
+ // Read the resource
+ URL url = classLoader.getResource(resourceName);
+
+ // Check if the resource is defined
+ if (url != null) {
+ // Return the resource as a file name
+ LOGGER.debug("found URL resource \"{}\" : ", url);
+ return url;
+ } else {
+ url = classLoader.getResource(fileParts[fileParts.length - 1]);
+ if (url == null) {
+ LOGGER.debug("cound not find URL resource \"{}\" : ", resourceName);
+ return null;
+ }
+ LOGGER.debug("found URL resource \"{}\" : ", url);
+ return url;
+ }
+ } catch (final Exception e) {
+ LOGGER.debug("error getting URL resource \"{}\" : " + e.getMessage(), e);
+ return null;
+ }
+ }
+
+ /**
+ * Method to get a URL resource from the local machine.
+ *
+ * @param resourceName The resource name
+ * @return The URL to the resource
+ */
+ public static URL getLocalFile(final String resourceName) {
+ try {
+ // Input might already be in URL format
+ final URL ret = new URL(resourceName);
+ final File f = new File(ret.toURI());
+ if (f.exists()) {
+ return ret;
+ }
+ } catch (final Exception ignore) {
+ // We ignore exceptions here and catch them below
+ }
+
+ try {
+ final File f = new File(resourceName);
+ // Check if the file exists
+ if (f.exists()) {
+ final URL urlret = f.toURI().toURL();
+ LOGGER.debug("resource \"{}\" was found on the local file system", f.toURI().toURL());
+ return urlret;
+ } else {
+ LOGGER.debug("resource \"{}\" does not exist on the local file system", resourceName);
+ return null;
+ }
+ } catch (final Exception e) {
+ LOGGER.debug("error finding resource \"{}\" : " + e.getMessage(), e);
+ return null;
+ }
+ }
+
+ /**
+ * Gets the file path for a resource on the local file system or on the class path.
+ *
+ * @param resource the resource to the get the file path for
+ * @return the resource file path
+ */
+ public static String getFilePath4Resource(final String resource) {
+ if (resource == null) {
+ return null;
+ }
+
+ URL modelFileUrl = getUrl4Resource(resource);
+ if (modelFileUrl != null) {
+ return modelFileUrl.getPath();
+ } else {
+ return resource;
+ }
+ }
+}