1 | package eu.clarin.sru.cqibridge; |
---|
2 | |
---|
3 | import java.util.HashMap; |
---|
4 | import java.util.List; |
---|
5 | import java.util.Map; |
---|
6 | import javax.xml.XMLConstants; |
---|
7 | import javax.xml.stream.XMLStreamException; |
---|
8 | import javax.xml.stream.XMLStreamWriter; |
---|
9 | |
---|
10 | /** |
---|
11 | * |
---|
12 | * @author akislev |
---|
13 | */ |
---|
14 | public class ResourceInfo { |
---|
15 | |
---|
16 | private static final String FCS_RESOURCE_INFO_NS = "http://clarin.eu/fcs/1.0/resource-info"; |
---|
17 | private final String corpusId; |
---|
18 | private final int resourceCount; |
---|
19 | private final boolean hasSubResources; |
---|
20 | private final Map<String, String> title; |
---|
21 | private final Map<String, String> description; |
---|
22 | private final List<String> languages; |
---|
23 | private final Map<String, String> indexes; |
---|
24 | |
---|
25 | public ResourceInfo(String corpusId, int resourceCount, |
---|
26 | boolean hasSubResources, List<String> title, |
---|
27 | List<String> description, List<String> languages, |
---|
28 | List<String> indexes) { |
---|
29 | this.corpusId = corpusId; |
---|
30 | this.resourceCount = (resourceCount > 0) ? resourceCount : -1; |
---|
31 | this.hasSubResources = hasSubResources; |
---|
32 | this.title = listToMap(title, true); |
---|
33 | this.description = listToMap(description, false); |
---|
34 | this.languages = languages; |
---|
35 | this.indexes = listToMap(indexes, false); |
---|
36 | } |
---|
37 | |
---|
38 | public String getCorpusId() { |
---|
39 | return corpusId; |
---|
40 | } |
---|
41 | |
---|
42 | public int getResourceCount() { |
---|
43 | return resourceCount; |
---|
44 | } |
---|
45 | |
---|
46 | public void writeResourceInfo(XMLStreamWriter writer, String prefix) |
---|
47 | throws XMLStreamException { |
---|
48 | final boolean defaultNS = (prefix == null || prefix.isEmpty()); |
---|
49 | if (defaultNS) { |
---|
50 | writer.setDefaultNamespace(FCS_RESOURCE_INFO_NS); |
---|
51 | } else { |
---|
52 | writer.setPrefix(prefix, FCS_RESOURCE_INFO_NS); |
---|
53 | } |
---|
54 | writer.writeStartElement(FCS_RESOURCE_INFO_NS, "resource-info"); |
---|
55 | if (defaultNS) { |
---|
56 | writer.writeDefaultNamespace(FCS_RESOURCE_INFO_NS); |
---|
57 | } else { |
---|
58 | writer.writeNamespace(prefix, FCS_RESOURCE_INFO_NS); |
---|
59 | } |
---|
60 | if (hasSubResources) { |
---|
61 | writer.writeAttribute("has-sub-resources", "true"); |
---|
62 | } |
---|
63 | for (Map.Entry<String, String> i : title.entrySet()) { |
---|
64 | writer.writeStartElement(FCS_RESOURCE_INFO_NS, "title"); |
---|
65 | writer.writeAttribute(XMLConstants.XML_NS_URI, |
---|
66 | "lang", i.getKey()); |
---|
67 | writer.writeCharacters(i.getValue()); |
---|
68 | writer.writeEndElement(); // "title" element |
---|
69 | } |
---|
70 | |
---|
71 | if (description != null) { |
---|
72 | for (Map.Entry<String, String> i : description.entrySet()) { |
---|
73 | writer.writeStartElement(FCS_RESOURCE_INFO_NS, |
---|
74 | "description"); |
---|
75 | writer.writeAttribute(XMLConstants.XML_NS_URI, "lang", |
---|
76 | i.getKey()); |
---|
77 | writer.writeCharacters(i.getValue()); |
---|
78 | writer.writeEndElement(); // "description" element |
---|
79 | } |
---|
80 | } |
---|
81 | |
---|
82 | writer.writeStartElement(FCS_RESOURCE_INFO_NS, "languages"); |
---|
83 | for (String i : languages) { |
---|
84 | writer.writeStartElement(FCS_RESOURCE_INFO_NS, "language"); |
---|
85 | writer.writeCharacters(i); |
---|
86 | writer.writeEndElement(); // "language" element |
---|
87 | |
---|
88 | } |
---|
89 | writer.writeEndElement(); // "languages" element |
---|
90 | |
---|
91 | if (indexes != null) { |
---|
92 | writer.writeStartElement(FCS_RESOURCE_INFO_NS, "indexes"); |
---|
93 | for (Map.Entry<String, String> i : indexes.entrySet()) { |
---|
94 | writer.writeStartElement(FCS_RESOURCE_INFO_NS, |
---|
95 | "index"); |
---|
96 | writer.writeAttribute("category", i.getKey()); |
---|
97 | writer.writeCharacters(i.getValue()); |
---|
98 | writer.writeEndElement(); // "index" element |
---|
99 | } |
---|
100 | writer.writeEndElement(); // "indexes" element |
---|
101 | } |
---|
102 | writer.writeEndElement(); // "resource-info" element |
---|
103 | } |
---|
104 | |
---|
105 | private static Map<String, String> listToMap(List<String> list, |
---|
106 | boolean mandatory) { |
---|
107 | if (list != null) { |
---|
108 | if (list.isEmpty() || ((list.size() % 2) != 0)) { |
---|
109 | throw new IllegalArgumentException( |
---|
110 | "list must contain an even number of elements and must not be empty"); |
---|
111 | } |
---|
112 | Map<String, String> result = new HashMap<String, String>(); |
---|
113 | for (int i = 0; i < list.size(); i += 2) { |
---|
114 | String key = list.get(i); |
---|
115 | String val = list.get(i + 1); |
---|
116 | if ((key == null) || (val == null)) { |
---|
117 | throw new NullPointerException( |
---|
118 | "key == null || val == null"); |
---|
119 | } |
---|
120 | result.put(list.get(i), list.get(i + 1)); |
---|
121 | } |
---|
122 | return result; |
---|
123 | } else { |
---|
124 | if (mandatory) { |
---|
125 | throw new NullPointerException("list == null"); |
---|
126 | } |
---|
127 | return null; |
---|
128 | } |
---|
129 | } |
---|
130 | } |
---|