diff options
Diffstat (limited to 'utils/src/main/java/org/onap/policy/common/utils/resources/ResourceUtils.java')
-rw-r--r-- | utils/src/main/java/org/onap/policy/common/utils/resources/ResourceUtils.java | 105 |
1 files changed, 50 insertions, 55 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 index 365efabe..3ee062f1 100644 --- 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 @@ -1,7 +1,8 @@ /*- * ============LICENSE_START======================================================= * Copyright (C) 2018 Ericsson. All rights reserved. - * Modifications Copyright (C) 2020 Nordix Foundation. + * Modifications Copyright (C) 2020, 2023 Nordix Foundation. + * Modifications Copyright (C) 2020-2021 AT&T 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. @@ -21,18 +22,22 @@ package org.onap.policy.common.utils.resources; -import java.io.ByteArrayOutputStream; +import com.google.re2j.Pattern; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URL; +import java.nio.charset.StandardCharsets; import java.util.Collections; import java.util.Enumeration; +import java.util.Objects; import java.util.Set; import java.util.TreeSet; import java.util.jar.JarEntry; import java.util.jar.JarFile; - +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -40,25 +45,18 @@ 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 { +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final 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 static final Pattern SLASH_PAT = Pattern.compile("/"); // Resource types private static final String FILE_PROTOCOL = "file"; private static final String JAR_PROTOCOL = "jar"; /** - * 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 @@ -66,7 +64,7 @@ public abstract class ResourceUtils { */ public static URL getUrl4Resource(final String resourceName) { // Check the local fine system first - final URL urlToResource = getLocalFile(resourceName); + final var urlToResource = getLocalFile(resourceName); // Check if this is a local file if (urlToResource != null) { @@ -86,25 +84,16 @@ public abstract class ResourceUtils { */ 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); + // Read the stream contents, closing when done + try (var resourceStream = getResourceAsStream(resourceName)) { + if (resourceStream == null) { + return null; } + return IOUtils.toString(resourceStream, StandardCharsets.UTF_8); } catch (final IOException e) { - LOGGER.debug("error reading resource stream \"{}\" : " + e.getMessage(), resourceName, e); + LOGGER.debug("error reading resource stream {}", resourceName, e); return null; } - - return resourceOutputStreamBuffer.toString(); } /** @@ -116,12 +105,12 @@ public abstract class ResourceUtils { */ public static InputStream getResourceAsStream(final String resourceName) { // Find a URL to the resource first - final URL urlToResource = getUrl4Resource(resourceName); + final var urlToResource = getUrl4Resource(resourceName); // Check if the resource exists if (urlToResource == null) { // No resource found - LOGGER.debug("cound not find resource \"{}\" : ", resourceName); + LOGGER.debug("could not find resource \"{}\" : ", resourceName); return null; } @@ -130,7 +119,7 @@ public abstract class ResourceUtils { 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); + LOGGER.debug("error attaching resource {}", resourceName, e); return null; } } @@ -143,11 +132,11 @@ public abstract class ResourceUtils { */ public static URL getUrlResource(final String resourceName) { try { - final ClassLoader classLoader = ResourceUtils.class.getClassLoader(); + final var classLoader = ResourceUtils.class.getClassLoader(); - final String[] fileParts = resourceName.split("/"); + final String[] fileParts = SLASH_PAT.split(resourceName); // Read the resource - URL url = classLoader.getResource(resourceName); + var url = classLoader.getResource(resourceName); // Check if the resource is defined if (url != null) { @@ -164,7 +153,7 @@ public abstract class ResourceUtils { return url; } } catch (final Exception e) { - LOGGER.debug("error getting URL resource \"{}\" : " + e.getMessage(), e); + LOGGER.debug("error getting URL resource {}", resourceName, e); return null; } } @@ -178,8 +167,8 @@ public abstract class ResourceUtils { 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()); + final var ret = new URL(resourceName); + final var f = new File(ret.toURI()); if (f.exists()) { return ret; } @@ -188,10 +177,10 @@ public abstract class ResourceUtils { } try { - final File f = new File(resourceName); + final var f = new File(resourceName); // Check if the file exists if (f.exists()) { - final URL urlret = f.toURI().toURL(); + final var urlret = f.toURI().toURL(); LOGGER.debug("resource \"{}\" was found on the local file system", f.toURI().toURL()); return urlret; } else { @@ -199,7 +188,7 @@ public abstract class ResourceUtils { return null; } } catch (final Exception e) { - LOGGER.debug("error finding resource \"{}\" : " + e.getMessage(), e); + LOGGER.debug("error finding resource {}", resourceName, e); return null; } } @@ -215,7 +204,7 @@ public abstract class ResourceUtils { return null; } - URL modelFileUrl = getUrl4Resource(resource); + var modelFileUrl = getUrl4Resource(resource); if (modelFileUrl != null) { return modelFileUrl.getPath(); } else { @@ -227,11 +216,11 @@ public abstract class ResourceUtils { * Read the list of entries in a resource directory. * * @param resourceDirectoryName the name of the resource directory - * @return the list of entries + * @return a set of entries */ public static Set<String> getDirectoryContents(final String resourceDirectoryName) { // Find the location of the resource, is it in a Jar or on the local file system? - URL directoryUrl = ResourceUtils.getUrl4Resource(resourceDirectoryName); + var directoryUrl = ResourceUtils.getUrl4Resource(resourceDirectoryName); if (directoryUrl == null) { LOGGER.debug("resource \"{}\" was not found", resourceDirectoryName); @@ -255,11 +244,11 @@ public abstract class ResourceUtils { * * @param localResourceDirectoryUrl the local resource file URL * @param resourceDirectoryName the name of the resource directory - * @return a list of the directory contents + * @return a set of the directory contents */ public static Set<String> getDirectoryContentsLocal(final URL localResourceDirectoryUrl, final String resourceDirectoryName) { - File localDirectory = new File(localResourceDirectoryUrl.getFile()); + var localDirectory = new File(localResourceDirectoryUrl.getFile()); if (!localDirectory.isDirectory()) { LOGGER.debug("resource \"{}\" is not a directory", resourceDirectoryName); @@ -267,7 +256,7 @@ public abstract class ResourceUtils { } Set<String> localDirectorySet = new TreeSet<>(); - for (File localDirectoryEntry : localDirectory.listFiles()) { + for (File localDirectoryEntry : Objects.requireNonNull(localDirectory.listFiles())) { if (localDirectoryEntry.isDirectory()) { localDirectorySet .add(resourceDirectoryName + File.separator + localDirectoryEntry.getName() + File.separator); @@ -284,23 +273,29 @@ public abstract class ResourceUtils { * * @param jarResourceDirectoryUrl the name of the resource directory in the jar * @param resourceDirectoryName the name of the resource directory - * @return a list of the directory contents + * @return a set of the directory contents */ public static Set<String> getDirectoryContentsJar(final URL jarResourceDirectoryUrl, final String resourceDirectoryName) { - File jarResourceDirectory = new File(jarResourceDirectoryUrl.getPath()); + String dirNameWithSlash = resourceDirectoryName + "/"; + int minLength = dirNameWithSlash.length() + 1; + var jarResourceDirectory = new File(jarResourceDirectoryUrl.getPath()); String jarFileName = jarResourceDirectory.getParent().replaceFirst("^file:", "").replaceFirst("!.*$", ""); Set<String> localDirectorySet = new TreeSet<>(); - try (JarFile jarFile = new JarFile(jarFileName)) { - Enumeration<JarEntry> entries = jarFile.entries(); + try (var jarFile = new JarFile(jarFileName)) { + Enumeration<JarEntry> entries = jarFile.entries(); // NOSONAR while (entries.hasMoreElements()) { - JarEntry je = entries.nextElement(); - - if (je.getName().matches("^" + resourceDirectoryName + "\\/.+")) { - localDirectorySet.add(je.getName()); + /* + * Ignore sonar issue, as the entries are not being expanded here. + */ + JarEntry je = entries.nextElement(); // NOSONAR + String jeName = je.getName(); + + if (jeName.length() >= minLength && jeName.startsWith(dirNameWithSlash)) { + localDirectorySet.add(jeName); } } } catch (IOException ioe) { |