package de.micromata.borgbutler.utils; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.Map; public class ReplaceUtils { public static final String ALLOWED_FILENAME_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789._-"; public static final String PRESERVED_FILENAME_CHARS = "\"*/:<>?\\|"; public static final char FILENAME_REPLACE_CHAR = '_'; private static Map umlautReplacementMap; static { umlautReplacementMap = new HashMap<>(); umlautReplacementMap.put('Ä', "Ae"); umlautReplacementMap.put('Ö', "Oe"); umlautReplacementMap.put('Ü', "Ue"); umlautReplacementMap.put('ä', "ae"); umlautReplacementMap.put('ö', "oe"); umlautReplacementMap.put('ü', "ue"); umlautReplacementMap.put('ß', "ss"); } /** * Preserved characters (Windows): 0x00-0x1F 0x7F " * / : < > ? \ | * Preserved characters (Mac OS): ':' * Preserved characters (Unix): '/' * Max length: 255 * * @param filename * @param reducedCharsOnly if true, only {@link #ALLOWED_FILENAME_CHARS} are allowed and German Umlaute are replaced * 'Ä'->'Ae' etc. If not, all characters excluding {@link #PRESERVED_FILENAME_CHARS} are allowed and * all white spaces will be replaced by ' ' char. * @return */ public static String encodeFilename(String filename, boolean reducedCharsOnly) { if (StringUtils.isEmpty(filename)) { return "file"; } if (reducedCharsOnly) { filename = replaceGermanUmlauteAndAccents(filename); } StringBuilder sb = new StringBuilder(); char[] charArray = filename.toCharArray(); for (int i = 0; i < charArray.length; i++) { char ch = charArray[i]; if (reducedCharsOnly) { if (ALLOWED_FILENAME_CHARS.indexOf(ch) >= 0) { sb.append(ch); } else { sb.append(FILENAME_REPLACE_CHAR); } } else { if (ch <= 31 || ch == 127) { // Not 0x00-0x1F and not 0x7F sb.append(FILENAME_REPLACE_CHAR); } else if (PRESERVED_FILENAME_CHARS.indexOf(ch) >= 0) { sb.append(FILENAME_REPLACE_CHAR); } else if (Character.isWhitespace(ch)) { sb.append(' '); } else { sb.append(ch); } } } String result = sb.toString(); if (result.length() > 255) { return result.substring(0, 255); } return result; } public static String replaceGermanUmlauteAndAccents(String text) { if (text == null) { return null; } StringBuilder sb = new StringBuilder(); char[] charArray = text.toCharArray(); for (int i = 0; i < charArray.length; i++) { char ch = charArray[i]; if (umlautReplacementMap.containsKey(ch)) { sb.append(umlautReplacementMap.get(ch)); } else { sb.append(ch); } } return StringUtils.stripAccents(sb.toString()); } }