247 lines
9.1 KiB
Java
247 lines
9.1 KiB
Java
package stirling.software.SPDF.utils;
|
|
|
|
import java.io.File;
|
|
import java.io.FileOutputStream;
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.net.MalformedURLException;
|
|
import java.nio.file.FileVisitResult;
|
|
import java.nio.file.Files;
|
|
import java.nio.file.Path;
|
|
import java.nio.file.Paths;
|
|
import java.nio.file.SimpleFileVisitor;
|
|
import java.nio.file.attribute.BasicFileAttributes;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.springframework.web.multipart.MultipartFile;
|
|
|
|
import com.fathzer.soft.javaluator.DoubleEvaluator;
|
|
|
|
import io.github.pixee.security.HostValidator;
|
|
import io.github.pixee.security.Urls;
|
|
|
|
public class GeneralUtils {
|
|
|
|
private static final Logger logger = LoggerFactory.getLogger(GeneralUtils.class);
|
|
|
|
public static File convertMultipartFileToFile(MultipartFile multipartFile) throws IOException {
|
|
File tempFile = Files.createTempFile("temp", null).toFile();
|
|
try (FileOutputStream os = new FileOutputStream(tempFile)) {
|
|
os.write(multipartFile.getBytes());
|
|
}
|
|
return tempFile;
|
|
}
|
|
|
|
public static void deleteDirectory(Path path) throws IOException {
|
|
Files.walkFileTree(
|
|
path,
|
|
new SimpleFileVisitor<Path>() {
|
|
@Override
|
|
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
|
|
throws IOException {
|
|
Files.deleteIfExists(file);
|
|
return FileVisitResult.CONTINUE;
|
|
}
|
|
|
|
@Override
|
|
public FileVisitResult postVisitDirectory(Path dir, IOException exc)
|
|
throws IOException {
|
|
Files.deleteIfExists(dir);
|
|
return FileVisitResult.CONTINUE;
|
|
}
|
|
});
|
|
}
|
|
|
|
public static String convertToFileName(String name) {
|
|
String safeName = name.replaceAll("[^a-zA-Z0-9]", "_");
|
|
if (safeName.length() > 50) {
|
|
safeName = safeName.substring(0, 50);
|
|
}
|
|
return safeName;
|
|
}
|
|
|
|
public static boolean isValidURL(String urlStr) {
|
|
try {
|
|
Urls.create(
|
|
urlStr, Urls.HTTP_PROTOCOLS, HostValidator.DENY_COMMON_INFRASTRUCTURE_TARGETS);
|
|
return true;
|
|
} catch (MalformedURLException e) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static File multipartToFile(MultipartFile multipart) throws IOException {
|
|
Path tempFile = Files.createTempFile("overlay-", ".pdf");
|
|
try (InputStream in = multipart.getInputStream();
|
|
FileOutputStream out = new FileOutputStream(tempFile.toFile())) {
|
|
byte[] buffer = new byte[1024];
|
|
int bytesRead;
|
|
while ((bytesRead = in.read(buffer)) != -1) {
|
|
out.write(buffer, 0, bytesRead);
|
|
}
|
|
}
|
|
return tempFile.toFile();
|
|
}
|
|
|
|
public static Long convertSizeToBytes(String sizeStr) {
|
|
if (sizeStr == null) {
|
|
return null;
|
|
}
|
|
|
|
sizeStr = sizeStr.trim().toUpperCase();
|
|
sizeStr = sizeStr.replace(",", ".").replace(" ", "");
|
|
try {
|
|
if (sizeStr.endsWith("KB")) {
|
|
return (long)
|
|
(Double.parseDouble(sizeStr.substring(0, sizeStr.length() - 2)) * 1024);
|
|
} else if (sizeStr.endsWith("MB")) {
|
|
return (long)
|
|
(Double.parseDouble(sizeStr.substring(0, sizeStr.length() - 2))
|
|
* 1024
|
|
* 1024);
|
|
} else if (sizeStr.endsWith("GB")) {
|
|
return (long)
|
|
(Double.parseDouble(sizeStr.substring(0, sizeStr.length() - 2))
|
|
* 1024
|
|
* 1024
|
|
* 1024);
|
|
} else if (sizeStr.endsWith("B")) {
|
|
return Long.parseLong(sizeStr.substring(0, sizeStr.length() - 1));
|
|
} else {
|
|
// Assume MB if no unit is specified
|
|
return (long) (Double.parseDouble(sizeStr) * 1024 * 1024);
|
|
}
|
|
} catch (NumberFormatException e) {
|
|
// The numeric part of the input string cannot be parsed, handle this case
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public static List<Integer> parsePageList(String pages, int totalPages, boolean oneBased) {
|
|
if (pages == null) {
|
|
return List.of(1); // Default to first page if input is null
|
|
}
|
|
try {
|
|
return parsePageList(pages.split(","), totalPages, oneBased);
|
|
} catch (NumberFormatException e) {
|
|
return List.of(1); // Default to first page if input is invalid
|
|
}
|
|
}
|
|
|
|
public static List<Integer> parsePageList(String[] pages, int totalPages) {
|
|
return parsePageList(pages, totalPages, false);
|
|
}
|
|
|
|
public static List<Integer> parsePageList(String[] pages, int totalPages, boolean oneBased) {
|
|
List<Integer> result = new ArrayList<>();
|
|
int offset = oneBased ? 1 : 0;
|
|
for (String page : pages) {
|
|
if ("all".equalsIgnoreCase(page)) {
|
|
|
|
for (int i = 0; i < totalPages; i++) {
|
|
result.add(i + offset);
|
|
}
|
|
} else if (page.contains(",")) {
|
|
// Split the string into parts, could be single pages or ranges
|
|
String[] parts = page.split(",");
|
|
for (String part : parts) {
|
|
result.addAll(handlePart(part, totalPages, offset));
|
|
}
|
|
} else {
|
|
result.addAll(handlePart(page, totalPages, offset));
|
|
}
|
|
}
|
|
return new ArrayList<>(
|
|
new java.util.LinkedHashSet<>(result)); // Remove duplicates and maintain order
|
|
}
|
|
|
|
public static List<Integer> evaluateNFunc(String expression, int maxValue) {
|
|
List<Integer> results = new ArrayList<>();
|
|
DoubleEvaluator evaluator = new DoubleEvaluator();
|
|
|
|
// Validate the expression
|
|
if (!expression.matches("[0-9n+\\-*/() ]+")) {
|
|
throw new IllegalArgumentException("Invalid expression");
|
|
}
|
|
|
|
int n = 0;
|
|
while (true) {
|
|
// Replace 'n' with the current value of n, correctly handling numbers before 'n'
|
|
String sanitizedExpression = insertMultiplicationBeforeN(expression, n);
|
|
Double result = evaluator.evaluate(sanitizedExpression);
|
|
|
|
// Check if the result is null or not within bounds
|
|
if (result == null || result <= 0 || result.intValue() > maxValue) {
|
|
if (n != 0) break;
|
|
} else {
|
|
results.add(result.intValue());
|
|
}
|
|
n++;
|
|
}
|
|
|
|
return results;
|
|
}
|
|
|
|
private static String insertMultiplicationBeforeN(String expression, int nValue) {
|
|
// Insert multiplication between a number and 'n' (e.g., "4n" becomes "4*n")
|
|
String withMultiplication = expression.replaceAll("(\\d)n", "$1*n");
|
|
// Now replace 'n' with its current value
|
|
return withMultiplication.replace("n", String.valueOf(nValue));
|
|
}
|
|
|
|
private static List<Integer> handlePart(String part, int totalPages, int offset) {
|
|
List<Integer> partResult = new ArrayList<>();
|
|
|
|
// First check for n-syntax because it should not be processed as a range
|
|
if (part.contains("n")) {
|
|
partResult = evaluateNFunc(part, totalPages);
|
|
// Adjust the results according to the offset
|
|
for (int i = 0; i < partResult.size(); i++) {
|
|
int adjustedValue = partResult.get(i) - 1 + offset;
|
|
partResult.set(i, adjustedValue);
|
|
}
|
|
} else if (part.contains("-")) {
|
|
// Process ranges only if it's not n-syntax
|
|
String[] rangeParts = part.split("-");
|
|
try {
|
|
int start = Integer.parseInt(rangeParts[0]);
|
|
int end = Integer.parseInt(rangeParts[1]);
|
|
for (int i = start; i <= end; i++) {
|
|
if (i >= 1 && i <= totalPages) {
|
|
partResult.add(i - 1 + offset);
|
|
}
|
|
}
|
|
} catch (NumberFormatException e) {
|
|
// Range is invalid, ignore this part
|
|
}
|
|
} else {
|
|
// This is a single page number
|
|
try {
|
|
int pageNum = Integer.parseInt(part.trim());
|
|
if (pageNum >= 1 && pageNum <= totalPages) {
|
|
partResult.add(pageNum - 1 + offset);
|
|
}
|
|
} catch (NumberFormatException ignored) {
|
|
// Ignore invalid numbers
|
|
}
|
|
}
|
|
return partResult;
|
|
}
|
|
|
|
public static boolean createDir(String path) {
|
|
Path folder = Paths.get(path);
|
|
if (!Files.exists(folder)) {
|
|
try {
|
|
Files.createDirectories(folder);
|
|
} catch (IOException e) {
|
|
logger.error("exception", e);
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
}
|