1
|
package org.cybertaxonomy.utis.utils;
|
2
|
|
3
|
import java.io.IOException;
|
4
|
import java.io.StringReader;
|
5
|
import java.io.StringWriter;
|
6
|
import java.util.ArrayList;
|
7
|
import java.util.HashMap;
|
8
|
import java.util.Iterator;
|
9
|
import java.util.List;
|
10
|
import java.util.Map;
|
11
|
|
12
|
import javax.xml.bind.JAXBContext;
|
13
|
import javax.xml.bind.JAXBException;
|
14
|
import javax.xml.bind.Marshaller;
|
15
|
import javax.xml.bind.Unmarshaller;
|
16
|
import javax.xml.parsers.DocumentBuilder;
|
17
|
import javax.xml.parsers.DocumentBuilderFactory;
|
18
|
import javax.xml.parsers.ParserConfigurationException;
|
19
|
import javax.xml.transform.OutputKeys;
|
20
|
import javax.xml.transform.Transformer;
|
21
|
import javax.xml.transform.TransformerConfigurationException;
|
22
|
import javax.xml.transform.TransformerException;
|
23
|
import javax.xml.transform.TransformerFactory;
|
24
|
import javax.xml.transform.TransformerFactoryConfigurationError;
|
25
|
import javax.xml.transform.dom.DOMSource;
|
26
|
import javax.xml.transform.stream.StreamResult;
|
27
|
|
28
|
import org.apache.commons.lang3.StringUtils;
|
29
|
import org.cybertaxonomy.utis.checklist.SearchMode;
|
30
|
import org.cybertaxonomy.utis.client.ServiceProviderInfo;
|
31
|
import org.cybertaxonomy.utis.tnr.msg.Query;
|
32
|
import org.cybertaxonomy.utis.tnr.msg.Response;
|
33
|
import org.cybertaxonomy.utis.tnr.msg.TnrMsg;
|
34
|
import org.cybertaxonomy.utis.tnr.msg.Query.ClientStatus;
|
35
|
import org.cybertaxonomy.utis.tnr.msg.Query.Request;
|
36
|
import org.w3c.dom.Document;
|
37
|
import org.w3c.dom.Node;
|
38
|
import org.xml.sax.SAXException;
|
39
|
|
40
|
import com.fasterxml.jackson.annotation.JsonInclude;
|
41
|
import com.fasterxml.jackson.core.JsonGenerationException;
|
42
|
import com.fasterxml.jackson.databind.AnnotationIntrospector;
|
43
|
import com.fasterxml.jackson.databind.JsonMappingException;
|
44
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
45
|
import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector;
|
46
|
|
47
|
public class TnrMsgUtils {
|
48
|
|
49
|
public static Node convertTnrMsgToNode(TnrMsg tnrMsg) throws JAXBException, ParserConfigurationException {
|
50
|
JAXBContext context = JAXBContext.newInstance(TnrMsg.class);
|
51
|
|
52
|
Marshaller m = context.createMarshaller();
|
53
|
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
|
54
|
|
55
|
// Write to System.out
|
56
|
//m.marshal(tnrMsg, System.out);
|
57
|
|
58
|
// Write to Node
|
59
|
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
|
60
|
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
|
61
|
|
62
|
// root elements
|
63
|
Document doc = docBuilder.newDocument();
|
64
|
|
65
|
m.marshal(tnrMsg, doc);
|
66
|
return doc;
|
67
|
}
|
68
|
|
69
|
public static String convertTnrMsgToJson(TnrMsg tnrMsg) throws JsonGenerationException, JsonMappingException, IOException {
|
70
|
ObjectMapper mapper = new ObjectMapper();
|
71
|
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
|
72
|
AnnotationIntrospector introspector = new JaxbAnnotationIntrospector();
|
73
|
mapper.setAnnotationIntrospector(introspector);
|
74
|
|
75
|
// Printing JSON
|
76
|
return mapper.writeValueAsString(tnrMsg);
|
77
|
}
|
78
|
|
79
|
public static String convertTnrMsgToXML(TnrMsg tnrMsg) throws TnrMsgException {
|
80
|
Node node;
|
81
|
try {
|
82
|
node = convertTnrMsgToNode(tnrMsg);
|
83
|
|
84
|
Transformer t = TransformerFactory.newInstance().newTransformer();
|
85
|
t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
|
86
|
t.setOutputProperty(OutputKeys.INDENT, "yes");
|
87
|
|
88
|
StringWriter sw = new StringWriter();
|
89
|
t.transform(new DOMSource(node), new StreamResult(sw));
|
90
|
|
91
|
return sw.toString();
|
92
|
} catch (JAXBException e) {
|
93
|
// TODO Auto-generated catch block
|
94
|
e.printStackTrace();
|
95
|
throw new TnrMsgException(e);
|
96
|
} catch (ParserConfigurationException e) {
|
97
|
// TODO Auto-generated catch block
|
98
|
e.printStackTrace();
|
99
|
throw new TnrMsgException(e);
|
100
|
} catch (TransformerConfigurationException e) {
|
101
|
// TODO Auto-generated catch block
|
102
|
e.printStackTrace();
|
103
|
throw new TnrMsgException(e);
|
104
|
} catch (TransformerFactoryConfigurationError e) {
|
105
|
// TODO Auto-generated catch block
|
106
|
e.printStackTrace();
|
107
|
throw new TnrMsgException(e);
|
108
|
} catch (TransformerException e) {
|
109
|
// TODO Auto-generated catch block
|
110
|
e.printStackTrace();
|
111
|
throw new TnrMsgException(e);
|
112
|
}
|
113
|
|
114
|
}
|
115
|
|
116
|
public static TnrMsg convertXMLToTnrMsg(String xmlMsg) throws JAXBException {
|
117
|
JAXBContext context = JAXBContext.newInstance(TnrMsg.class);
|
118
|
|
119
|
Unmarshaller um = context.createUnmarshaller();
|
120
|
return (TnrMsg) um.unmarshal(new StringReader(xmlMsg));
|
121
|
}
|
122
|
|
123
|
public static Response convertXMLToTnrResponse(String xmlMsg) throws JAXBException, ParserConfigurationException, SAXException, IOException {
|
124
|
JAXBContext context = JAXBContext.newInstance(Response.class);
|
125
|
|
126
|
Unmarshaller um = context.createUnmarshaller();
|
127
|
return (Response) um.unmarshal(new StringReader(xmlMsg));
|
128
|
}
|
129
|
|
130
|
public static TnrMsg convertXMLListToTnrMsg(List<String> xmlMsg) throws JAXBException {
|
131
|
TnrMsg finalTnrMsg = new TnrMsg();
|
132
|
Iterator<String> itrXMLMsg = xmlMsg.iterator();
|
133
|
while(itrXMLMsg.hasNext()) {
|
134
|
TnrMsg tnrMsg = convertXMLToTnrMsg(itrXMLMsg.next());
|
135
|
finalTnrMsg.getQuery().add(tnrMsg.getQuery().get(0));
|
136
|
}
|
137
|
return finalTnrMsg;
|
138
|
}
|
139
|
|
140
|
public static List<TnrMsg> convertXMLListToTnrMsgList(List<String> xmlMsgs) throws JAXBException {
|
141
|
List<TnrMsg> finalTnrMsgList = new ArrayList<TnrMsg>();
|
142
|
Iterator<String> itrXMLMsg = xmlMsgs.iterator();
|
143
|
while(itrXMLMsg.hasNext()) {
|
144
|
TnrMsg tnrMsg = convertXMLToTnrMsg(itrXMLMsg.next());
|
145
|
finalTnrMsgList.add(tnrMsg);
|
146
|
}
|
147
|
return finalTnrMsgList;
|
148
|
}
|
149
|
|
150
|
public static TnrMsg convertStringToTnrMsg(String name, SearchMode searchMode, boolean addSynonymy) {
|
151
|
TnrMsg tnrMsg = new TnrMsg();
|
152
|
Query query = new Query();
|
153
|
Request request = new Request();
|
154
|
|
155
|
request.setQueryString(name);
|
156
|
request.setSearchMode(searchMode.toString());
|
157
|
request.setAddSynonymy(addSynonymy);
|
158
|
query.setRequest(request);
|
159
|
tnrMsg.getQuery().add(query);
|
160
|
|
161
|
return tnrMsg;
|
162
|
}
|
163
|
|
164
|
public static List<TnrMsg> convertStringListToTnrMsgList(List<String> names, SearchMode searchMode, boolean addSynonymy) {
|
165
|
List<TnrMsg> tnrMsgList = new ArrayList<TnrMsg>();
|
166
|
Iterator<String> itrStringMsg = names.iterator();
|
167
|
while(itrStringMsg.hasNext()) {
|
168
|
TnrMsg tnrMsg = convertStringToTnrMsg(itrStringMsg.next(), searchMode, addSynonymy);
|
169
|
tnrMsgList.add(tnrMsg);
|
170
|
}
|
171
|
return tnrMsgList;
|
172
|
}
|
173
|
|
174
|
public static TnrMsg mergeTnrMsgs(List<TnrMsg> tnrMsgs) {
|
175
|
Map<String,Query> nameQueryMap = new HashMap<String,Query>();
|
176
|
Iterator<TnrMsg> itrTnrMsg = tnrMsgs.iterator();
|
177
|
while(itrTnrMsg.hasNext()) {
|
178
|
TnrMsg currentTnrMsg = itrTnrMsg.next();
|
179
|
Iterator<Query> itrQuery = currentTnrMsg.getQuery().iterator();
|
180
|
while(itrQuery.hasNext()) {
|
181
|
Query currentQuery = itrQuery.next();
|
182
|
String nameComplete = currentQuery.getRequest().getQueryString();
|
183
|
Query query = nameQueryMap.get(nameComplete);
|
184
|
if(query == null) {
|
185
|
nameQueryMap.put(nameComplete, currentQuery);
|
186
|
} else {
|
187
|
query.getResponse().addAll(currentQuery.getResponse());
|
188
|
}
|
189
|
}
|
190
|
}
|
191
|
TnrMsg finalTnrMsg = new TnrMsg();
|
192
|
finalTnrMsg.getQuery().addAll(new ArrayList<Query>(nameQueryMap.values()));
|
193
|
return finalTnrMsg;
|
194
|
}
|
195
|
|
196
|
public static TnrMsg mergeTnrXMLList(List<String> xmlMsgs) throws JAXBException {
|
197
|
return mergeTnrMsgs(convertXMLListToTnrMsgList(xmlMsgs));
|
198
|
}
|
199
|
|
200
|
/**
|
201
|
* @param ci
|
202
|
* @return
|
203
|
*/
|
204
|
public static Response tnrResponseFor(ServiceProviderInfo ci) {
|
205
|
Response tnrResponse = new Response();
|
206
|
tnrResponse.setChecklistId(ci.getId());
|
207
|
tnrResponse.setChecklist(ci.getLabel());
|
208
|
tnrResponse.setChecklistUrl(ci.getDocumentationUrl());
|
209
|
return tnrResponse;
|
210
|
}
|
211
|
|
212
|
public static ClientStatus tnrClientStatusFor(ServiceProviderInfo ci) {
|
213
|
ClientStatus tnrClientStatus = new ClientStatus();
|
214
|
StringBuilder checklistId = new StringBuilder(ci.getId());
|
215
|
if(!ci.getSubChecklists().isEmpty()){
|
216
|
ArrayList<String> subIds = new ArrayList<String>(ci.getSubChecklists().size());
|
217
|
for(ServiceProviderInfo sci : ci.getSubChecklists()){
|
218
|
subIds.add(sci.getId());
|
219
|
}
|
220
|
StringUtils.join(subIds, ',');
|
221
|
|
222
|
checklistId.append('[').append(StringUtils.join(subIds, ',')).append(']');
|
223
|
}
|
224
|
|
225
|
tnrClientStatus.setChecklistId(checklistId.toString());
|
226
|
return tnrClientStatus;
|
227
|
}
|
228
|
|
229
|
/**
|
230
|
* Sets the given <code>searchMode</code> to the requests in all queries of the TnrMsg
|
231
|
*
|
232
|
* @deprecated this is a temporary solution to overcome the inconsistencies in the
|
233
|
* current implementation of the SearchModes in the library. It should only be used
|
234
|
* in test classes
|
235
|
*/
|
236
|
@Deprecated
|
237
|
public static void updateWithSearchMode(TnrMsg tnrMsg, SearchMode searchMode){
|
238
|
for(Query query : tnrMsg.getQuery()){
|
239
|
query.getRequest().setSearchMode(searchMode.toString());
|
240
|
}
|
241
|
}
|
242
|
|
243
|
public static void assertSearchModeSet(TnrMsg tnrMsg, boolean unique){
|
244
|
|
245
|
String lastSearchMode = null;
|
246
|
for(Query query : tnrMsg.getQuery()){
|
247
|
String searchMode = query.getRequest().getSearchMode();
|
248
|
if(searchMode == null){
|
249
|
throw new AssertionError("SearchMode missing in query : " + query.toString());
|
250
|
}
|
251
|
if(unique && lastSearchMode != null && !lastSearchMode.equals(searchMode)){
|
252
|
throw new AssertionError("mixed searchModes in queries");
|
253
|
}
|
254
|
}
|
255
|
}
|
256
|
|
257
|
public static SearchMode getSearchMode(TnrMsg tnrMsg){
|
258
|
|
259
|
for(Query query : tnrMsg.getQuery()){
|
260
|
String searchMode = query.getRequest().getSearchMode();
|
261
|
if(searchMode != null){
|
262
|
return SearchMode.valueOf(searchMode);
|
263
|
}
|
264
|
}
|
265
|
return null;
|
266
|
}
|
267
|
|
268
|
public static TnrMsg createRequest(SearchMode searchMode, String queryString, boolean addSynonymy) {
|
269
|
TnrMsg msg = new TnrMsg();
|
270
|
Query q = new Query();
|
271
|
Request r = new Request();
|
272
|
r.setQueryString(queryString);
|
273
|
r.setSearchMode(searchMode.name());
|
274
|
r.setAddSynonymy(addSynonymy);
|
275
|
q.setRequest(r);
|
276
|
msg.getQuery().add(q);
|
277
|
return msg;
|
278
|
}
|
279
|
|
280
|
|
281
|
|
282
|
}
|