1 /*
2 * This file is part of dependency-check-core.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 * Copyright (c) 2012 Jeremy Long. All Rights Reserved.
17 */
18 package org.owasp.dependencycheck.utils;
19
20 import java.io.Closeable;
21 import org.apache.commons.io.FilenameUtils;
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
24
25 import java.io.File;
26 import java.io.IOException;
27 import java.util.UUID;
28 import org.apache.commons.lang3.SystemUtils;
29
30 /**
31 * A collection of utilities for processing information about files.
32 *
33 * @author Jeremy Long
34 */
35 public final class FileUtils {
36
37 /**
38 * The logger.
39 */
40 private static final Logger LOGGER = LoggerFactory.getLogger(FileUtils.class);
41 /**
42 * Bit bucket for non-Windows systems
43 */
44 private static final String BIT_BUCKET_UNIX = "/dev/null";
45
46 /**
47 * Bit bucket for Windows systems (yes, only one 'L')
48 */
49 private static final String BIT_BUCKET_WIN = "NUL";
50
51 /**
52 * Private constructor for a utility class.
53 */
54 private FileUtils() {
55 }
56
57 /**
58 * Returns the (lowercase) file extension for a specified file.
59 *
60 * @param fileName the file name to retrieve the file extension from.
61 * @return the file extension.
62 */
63 public static String getFileExtension(String fileName) {
64 final String fileExt = FilenameUtils.getExtension(fileName);
65 return null == fileExt || fileExt.isEmpty() ? null : fileExt.toLowerCase();
66 }
67
68 /**
69 * Deletes a file. If the File is a directory it will recursively delete the
70 * contents.
71 *
72 * @param file the File to delete
73 * @return true if the file was deleted successfully, otherwise false
74 */
75 public static boolean delete(File file) {
76 final boolean success = org.apache.commons.io.FileUtils.deleteQuietly(file);
77 if (!success) {
78 LOGGER.debug("Failed to delete file: {}; attempting to delete on exit.", file.getPath());
79 file.deleteOnExit();
80 }
81 return success;
82 }
83
84 /**
85 * Creates a unique temporary directory in the given directory.
86 *
87 * @param base the base directory to create a temporary directory within
88 * @return the temporary directory
89 * @throws IOException thrown when a directory cannot be created within the
90 * base directory
91 */
92 public static File createTempDirectory(File base) throws IOException {
93 final File tempDir = new File(base, "dctemp" + UUID.randomUUID().toString());
94 if (tempDir.exists()) {
95 return createTempDirectory(base);
96 }
97 if (!tempDir.mkdirs()) {
98 throw new IOException("Could not create temp directory `" + tempDir.getAbsolutePath() + "`");
99 }
100 return tempDir;
101 }
102
103 /**
104 * Generates a new temporary file name that is guaranteed to be unique.
105 *
106 * @param prefix the prefix for the file name to generate
107 * @param extension the extension of the generated file name
108 * @return a temporary File
109 * @throws java.io.IOException thrown if the temporary folder could not be
110 * created
111 */
112 public static File getTempFile(String prefix, String extension) throws IOException {
113 final File dir = Settings.getTempDirectory();
114 final String tempFileName = String.format("%s%s.%s", prefix, UUID.randomUUID().toString(), extension);
115 final File tempFile = new File(dir, tempFileName);
116 if (tempFile.exists()) {
117 return getTempFile(prefix, extension);
118 }
119 return tempFile;
120 }
121
122 /**
123 * Return the bit bucket for the OS. '/dev/null' for Unix and 'NUL' for
124 * Windows
125 *
126 * @return a String containing the bit bucket
127 */
128 public static String getBitBucket() {
129 if (SystemUtils.IS_OS_WINDOWS) {
130 return BIT_BUCKET_WIN;
131 } else {
132 return BIT_BUCKET_UNIX;
133 }
134 }
135
136 /**
137 * Close the given {@link Closeable} instance, ignoring nulls, and logging
138 * any thrown {@link IOException}.
139 *
140 * @param closeable to be closed
141 */
142 public static void close(Closeable closeable) {
143 if (null != closeable) {
144 try {
145 closeable.close();
146 } catch (IOException ex) {
147 LOGGER.trace("", ex);
148 }
149 }
150 }
151 }