1 package emissary.directory;
2
3 import emissary.util.xml.SaferJDOMUtil;
4
5 import jakarta.annotation.Nullable;
6 import org.jdom2.Document;
7 import org.jdom2.Element;
8 import org.jdom2.JDOMException;
9 import org.slf4j.Logger;
10 import org.slf4j.LoggerFactory;
11
12 import java.util.List;
13 import java.util.Map;
14
15
16
17
18 public class DirectoryXmlContainer {
19
20 private static final Logger logger = LoggerFactory.getLogger(DirectoryXmlContainer.class);
21
22 public static final String DIRECTORY = "directory";
23 public static final String LOC_ATTR = "location";
24 public static final String DATAID_ATTR = "dataid";
25
26
27
28
29 public static Document buildDocument(final IDirectoryPlace dir) {
30 final Element root = new Element(DIRECTORY);
31 root.setAttribute(LOC_ATTR, dir.getKey());
32
33
34 for (final String dataId : dir.getEntryKeys()) {
35 final DirectoryEntryList list = dir.getEntryList(dataId);
36 if (list != null) {
37 final Element listEl = list.getXml();
38 listEl.setAttribute(DATAID_ATTR, dataId);
39 root.addContent(listEl);
40 }
41 }
42
43 return new Document(root);
44 }
45
46
47
48
49
50
51
52 public static Document buildDocument(final DirectoryEntryMap map, final String loc) {
53 final Element root = new Element(DIRECTORY);
54 root.setAttribute(LOC_ATTR, loc);
55
56
57 for (final Map.Entry<String, DirectoryEntryList> entry : map.entrySet()) {
58 final String dataId = entry.getKey();
59 final DirectoryEntryList list = entry.getValue();
60 if (list != null) {
61 final Element listEl = list.getXml();
62 listEl.setAttribute(DATAID_ATTR, dataId);
63 root.addContent(listEl);
64 }
65 }
66
67 return new Document(root);
68 }
69
70
71
72
73
74
75
76
77 public static Document buildProxyDocument(final IRemoteDirectory dir, final String requester) {
78 final String proxyKey = dir.getKey();
79 final Element root = new Element(DIRECTORY);
80 root.setAttribute(LOC_ATTR, proxyKey);
81
82 logger.debug("Building proxy view of dir contents for {}", requester);
83
84
85 for (final String dataId : dir.getEntryKeys()) {
86 final DirectoryEntryList list = dir.getEntryList(dataId);
87 logger.debug("List of {} for {} has {} entries", dataId, requester, list.size());
88
89 for (final DirectoryEntry e : list) {
90 e.proxyFor(proxyKey);
91 }
92
93
94 if (!list.isEmpty()) {
95 final Element listEl = list.getXml();
96 listEl.setAttribute(DATAID_ATTR, dataId);
97 root.addContent(listEl);
98 }
99 }
100 return new Document(root);
101 }
102
103
104
105
106
107
108
109 public static String toXmlString(final IDirectoryPlace dir) {
110 final Document jdom = buildDocument(dir);
111 return SaferJDOMUtil.toString(jdom);
112 }
113
114
115
116
117
118
119
120
121
122
123 public static String toXmlString(final IDirectoryPlace dir, @Nullable final String proxyKey, final String requester) {
124 logger.debug("Building xml string for {}", requester);
125 final String xml;
126 if ((proxyKey == null) || !(dir instanceof IRemoteDirectory)) {
127 xml = toXmlString(dir);
128 } else {
129 final Document jdom = buildProxyDocument((IRemoteDirectory) dir, requester);
130 xml = SaferJDOMUtil.toString(jdom);
131 }
132 return xml;
133 }
134
135
136
137
138 public static DirectoryEntryMap buildEntryListMap(final String xml) throws JDOMException {
139 final Document jdom = SaferJDOMUtil.createDocument(xml);
140 return buildEntryListMap(jdom);
141 }
142
143
144
145
146 public static DirectoryEntryMap buildEntryListMap(final Document jdom) {
147 final Element el = jdom.getRootElement();
148 return buildEntryListMap(el);
149 }
150
151
152
153
154 public static DirectoryEntryMap buildEntryListMap(final Element el) {
155 final DirectoryEntryMap map = new DirectoryEntryMap();
156 final List<Element> entryLists = el.getChildren(DirectoryEntryList.ENTRYLIST);
157 for (final Element listElement : entryLists) {
158 final DirectoryEntryList d = DirectoryEntryList.fromXml(listElement);
159 final String dataId = listElement.getAttributeValue(DATAID_ATTR);
160 map.put(dataId, d);
161 }
162 logger.debug("Constructed map of {} directory entry lists from xml", map.size());
163
164 return map;
165 }
166
167
168 private DirectoryXmlContainer() {}
169 }