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}