diff options
Diffstat (limited to 'utils/src/main/java')
-rw-r--r-- | utils/src/main/java/org/onap/policy/common/utils/resources/ResourceUtils.java | 105 |
1 files changed, 102 insertions, 3 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 cca6e626..365efabe 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,19 +1,20 @@ /*- * ============LICENSE_START======================================================= * Copyright (C) 2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2020 Nordix Foundation. * ================================================================================ * 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========================================================= */ @@ -25,6 +26,12 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URL; +import java.util.Collections; +import java.util.Enumeration; +import java.util.Set; +import java.util.TreeSet; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -40,6 +47,10 @@ public abstract class ResourceUtils { // The length of byte buffers used to read resources into strings private static final int BYTE_BUFFER_LENGH = 1024; + // Resource types + private static final String FILE_PROTOCOL = "file"; + private static final String JAR_PROTOCOL = "jar"; + /** * Private constructor used to prevent sub class instantiation. */ @@ -211,4 +222,92 @@ public abstract class ResourceUtils { return resource; } } + + /** + * Read the list of entries in a resource directory. + * + * @param resourceDirectoryName the name of the resource directory + * @return the list 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); + + if (directoryUrl == null) { + LOGGER.debug("resource \"{}\" was not found", resourceDirectoryName); + return Collections.emptySet(); + } + + if (FILE_PROTOCOL.equals(directoryUrl.getProtocol())) { + return getDirectoryContentsLocal(directoryUrl, resourceDirectoryName); + } else if (JAR_PROTOCOL.equals(directoryUrl.getProtocol())) { + // Examine the Jar + return getDirectoryContentsJar(directoryUrl, resourceDirectoryName); + } else { + LOGGER.debug("resource \"{}\" has an unsupported protocol {}", resourceDirectoryName, + directoryUrl.getProtocol()); + return Collections.emptySet(); + } + } + + /** + * Get a list of the contents of a local resource directory. + * + * @param localResourceDirectoryUrl the local resource file URL + * @param resourceDirectoryName the name of the resource directory + * @return a list of the directory contents + */ + public static Set<String> getDirectoryContentsLocal(final URL localResourceDirectoryUrl, + final String resourceDirectoryName) { + File localDirectory = new File(localResourceDirectoryUrl.getFile()); + + if (!localDirectory.isDirectory()) { + LOGGER.debug("resource \"{}\" is not a directory", resourceDirectoryName); + return Collections.emptySet(); + } + + Set<String> localDirectorySet = new TreeSet<>(); + for (File localDirectoryEntry : localDirectory.listFiles()) { + if (localDirectoryEntry.isDirectory()) { + localDirectorySet + .add(resourceDirectoryName + File.separator + localDirectoryEntry.getName() + File.separator); + } else { + localDirectorySet.add(resourceDirectoryName + File.separator + localDirectoryEntry.getName()); + } + } + + return localDirectorySet; + } + + /** + * Get a list of the contents of a local resource directory. + * + * @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 + */ + public static Set<String> getDirectoryContentsJar(final URL jarResourceDirectoryUrl, + final String resourceDirectoryName) { + File 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(); + + while (entries.hasMoreElements()) { + JarEntry je = entries.nextElement(); + + if (je.getName().matches("^" + resourceDirectoryName + "\\/.+")) { + localDirectorySet.add(je.getName()); + } + } + } catch (IOException ioe) { + LOGGER.debug("error opening jar file {}", jarResourceDirectoryUrl.getPath()); + return Collections.emptySet(); + } + + return localDirectorySet; + } } |