1package eu.siacs.conversations.utils;
 2
 3import com.google.common.base.Joiner;
 4import com.google.common.collect.Iterables;
 5import com.google.common.collect.Lists;
 6
 7import eu.siacs.conversations.xml.Element;
 8
 9import java.util.Collection;
10import java.util.Collections;
11import java.util.List;
12
13public class XmlHelper {
14    public static String encodeEntities(String content) {
15        content = content.replace("&", "&");
16        content = content.replace("<", "<");
17        content = content.replace(">", ">");
18        content = content.replace("\"", """);
19        content = content.replace("'", "'");
20        content = content.replaceAll("[\\p{Cntrl}&&[^\n\t\r]]", "");
21        return content;
22    }
23
24    public static void appendEncodedEntities(final String content, final StringBuilder sb) {
25        final var length = content.length();
26        var needsEscape = false;
27        for (int i = 0; i < length; i++) {
28            final var c = content.charAt(i);
29            if (c == '<' || c == '&' || c == '"') {
30                needsEscape = true;
31                break;
32            }
33        }
34        if (needsEscape) {
35            for (int i = 0; i < length; i++) {
36                final var c = content.charAt(i);
37                switch (c) {
38                case '&': sb.append("&"); break;
39                case '<': sb.append("<"); break;
40                case '>': sb.append(">"); break;
41                case '"': sb.append("""); break;
42                case '\'': sb.append("'"); break;
43                default: sb.append(c);
44                }
45            }
46        } else {
47            sb.append(content);
48        }
49    }
50
51    public static String printElementNames(final Element element) {
52        final List<String> features =
53                element == null
54                        ? Collections.emptyList()
55                        : Lists.transform(
56                                element.getChildren(),
57                                child -> child != null ? child.getName() : null);
58        return Joiner.on(", ").join(features);
59    }
60
61    public static String print(final Collection<Element> children) {
62        if (children == null) {
63            return null;
64        }
65        return Joiner.on("").join(Iterables.transform(children, Element::toString));
66    }
67}