package org.jabref.model.entry; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; public class FileFieldWriter { private FileFieldWriter() { } public static String getStringRepresentation(List<LinkedFile> fields) { String[][] array = new String[fields.size()][]; int i = 0; for (LinkedFile entry : fields) { array[i] = new String[] {entry.getDescription(), entry.getLink(), entry.getFileType()}; i++; } return encodeStringArray(array); } public static String getStringRepresentation(LinkedFile field) { return getStringRepresentation(Collections.singletonList(field)); } /** * Encodes a two-dimensional String array into a single string, using ':' and * ';' as separators. The characters ':' and ';' are escaped with '\'. * @param values The String array. * @return The encoded String. */ public static String encodeStringArray(String[][] values) { return Arrays.stream(values) .map(FileFieldWriter::encodeStringArray) .collect(Collectors.joining(";")); } /** * Encodes a String array into a single string, using ':' as separator. * The characters ':' and ';' are escaped with '\'. * @param entry The String array. * @return The encoded String. */ private static String encodeStringArray(String[] entry) { return Arrays.stream(entry) .map(FileFieldWriter::quote) .collect(Collectors.joining(":")); } public static String quote(String s) { if (s == null) { return null; } StringBuilder sb = new StringBuilder(); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if ((c == ';') || (c == ':') || (c == '\\')) { sb.append('\\'); } sb.append(c); } return sb.toString(); } }