Project

General

Profile

Download (11.3 KB) Statistics
| Branch: | Tag: | Revision:
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
}
(10-10/11)