Project

General

Profile

1
package eu.dnetlib.data.search.web.api;
2

    
3
import eu.dnetlib.data.search.web.utils.RequestResponseHandler;
4
import eu.dnetlib.domain.data.SearchResult;
5
import org.apache.commons.lang3.StringEscapeUtils;
6
import org.apache.log4j.Logger;
7

    
8
import javax.servlet.http.HttpServletRequest;
9
import javax.ws.rs.core.MediaType;
10
import java.util.Iterator;
11
import java.util.List;
12

    
13
/**
14
 * Created by kiatrop on 21/11/2016.
15
 */
16
public class APIResponseFormatter {
17

    
18
    private static final Logger logger = Logger.getLogger(APIResponseFormatter.class);
19

    
20
    public static String compose404Message(String type, String message) {
21
        if(type.equals(MediaType.APPLICATION_JSON)) {
22
           return String.format(JSONResponseFormat.error404Message, StringEscapeUtils.escapeJson(message));
23
        }
24
        return String.format(XMLResponseFormat.error404Message, StringEscapeUtils.escapeXml10(message));
25
    }
26

    
27
    public static String compose400Message(String type, String message) {
28
         if(type.equals(MediaType.APPLICATION_JSON)) {
29
            return String.format(JSONResponseFormat.error400Message, StringEscapeUtils.escapeJson(message));
30
        }
31
        return String.format(XMLResponseFormat.error400Message, StringEscapeUtils.escapeXml10(message));
32
    }
33

    
34
    public static String compose500Message(String type, String message, String description) {
35
        if(type.equals(MediaType.APPLICATION_JSON)) {
36
            return String.format(JSONResponseFormat.error500Message, StringEscapeUtils.escapeJson(message), StringEscapeUtils.escapeJson(description));
37
        }
38
        return String.format(XMLResponseFormat.error500Message, StringEscapeUtils.escapeXml10(message), StringEscapeUtils.escapeXml10(description));
39
    }
40

    
41
    public static String createCountMeta(HttpServletRequest request, String query, int total, String type) {
42
        String selfPageUrl = pageUrlCreation(request);
43

    
44
        if  (type.equals(MediaType.APPLICATION_JSON)) {
45
            return String.format(JSONResponseFormat.countSearch, StringEscapeUtils.escapeJson(query), total, formatSelfPaging(type, selfPageUrl));
46
        }
47

    
48
        return String.format(XMLResponseFormat.countSearch, StringEscapeUtils.escapeXml10(query), total, formatSelfPaging(type, selfPageUrl));
49
    }
50

    
51
    public static String createEntityResponse(HttpServletRequest request, RequestResponseHandler.Entity entityType, String entity, String type) {
52
        if (type.equals(MediaType.APPLICATION_JSON)) {
53
            String cleanEntity = null;
54
            if (entity != null && !entity.isEmpty()) {
55
                cleanEntity = entity.substring(1, entity.length() - 1);
56
            } else {
57
                cleanEntity = "\"result\":{}";
58
            }
59
            return String.format(JSONResponseFormat.singleValueResponse, createMetaBasic(request, type), cleanEntity);
60
        }
61
        return String.format(XMLResponseFormat.singleValueResponse, createMetaBasic(request, type), entity);
62
    }
63

    
64
    public static String createEntitiesResponse(HttpServletRequest request, RequestResponseHandler.Entity entityType, String query, List<String> filters, SearchResult searchResult, boolean refine, String type, boolean special) {
65

    
66
        if  (type.equals(MediaType.APPLICATION_JSON)) {
67
                return String.format(JSONResponseFormat.response, createMeta(request, type, query, filters, searchResult.getTotal(), searchResult.getPage(), searchResult.getSize()), formatSearchResults(type, searchResult.getSearchResults()), formatRefineResults(type, searchResult.getBrowseResults()));
68
        }
69

    
70
        if(type.equals("text/csv")) {
71
            //if (special) {
72
                return String.format(CSVResponseFormat.response, CSVResponseFormat.appendTitle(entityType, special), formatSearchResults("text/csv", searchResult.getSearchResults()));
73
            //}
74
            //return String.format(CSVResponseFormat.response, CSVResponseFormat.appendTitle(entityType, special), formatSearchResults(type, searchResult.getSearchResults()));
75

    
76
        } else if (type.equals(MediaType.TEXT_HTML)) {
77
            return String.format(HTMLResponseFormat.response, formatSearchResults(type, searchResult.getSearchResults()), formatRefineResults(type, searchResult.getBrowseResults()));
78
        }
79

    
80
        //default xml
81
        return String.format(XMLResponseFormat.response, createMeta(request, type, query, filters, searchResult.getTotal(), searchResult.getPage(), searchResult.getSize()), formatSearchResults(type, searchResult.getSearchResults()), formatRefineResults(type, searchResult.getBrowseResults()));
82
    }
83

    
84
    private static String formatRefineResults(String type, List<String> refineResults) {
85
        if (type.equals(MediaType.APPLICATION_JSON)) {
86
            if (refineResults == null || refineResults.isEmpty()) {
87
                return ",\"refineResults\":{}";
88
            }
89

    
90
            return ",\"refineResults\": {" + appendJSONStrings(refineResults) + "}";
91
        }
92

    
93
        if (refineResults == null || refineResults.isEmpty()) {
94
            return "<refineResults></refineResults>";
95
        }
96

    
97
        return "<refineResults>" + appendXMLStrings(refineResults) + "</refineResults>";
98
    }
99

    
100
    private static String formatSearchResults(String type, List<String> searchResults) {
101
        if (searchResults == null || searchResults.isEmpty()) {
102
            return "";
103
        }
104

    
105
        if (type.equals(MediaType.APPLICATION_JSON)) {
106
            return appendJSONStrings(searchResults);
107
        }
108

    
109
        return appendXMLStrings(searchResults);
110
    }
111

    
112
    private static String appendXMLStrings(List<String> searchResults) {
113
        StringBuilder stringBuilder = new StringBuilder();
114
        for (String xml:searchResults) {
115
            stringBuilder.append(xml);
116
            //logger.debug("APPEND " + xml);
117
        }
118
        return stringBuilder.toString();
119
    }
120

    
121

    
122
    private static String appendCSVString(List<String> searchResults) {
123
        StringBuilder stringBuilder = new StringBuilder();
124
        for (String xml:searchResults) {
125
            stringBuilder.append(xml.replaceAll("\"", "'"));
126
            //logger.debug("APPEND " + xml);
127
        }
128
        return stringBuilder.toString();
129
    }
130

    
131
    private static String appendJSONStrings(List<String> searchResults) {
132
        StringBuilder stringBuilder = new StringBuilder();
133
        for (Iterator<String> iterator = searchResults.iterator(); iterator.hasNext();) {
134
            stringBuilder.append(iterator.next());
135
            if (iterator.hasNext()) {
136
               stringBuilder.append(",");
137
            }
138
        }
139
        return stringBuilder.toString();
140
    }
141

    
142
    public static String createMetaBasic(HttpServletRequest request, String type) {
143
        String selfPageUrl = pageUrlCreation(request);
144
        if  (type.equals(MediaType.APPLICATION_JSON)) {
145
            return String.format(JSONResponseFormat.metaBasic, formatSelfPaging(type, selfPageUrl));
146
        }
147
        return String.format(XMLResponseFormat.metaBasic, formatSelfPaging(type, selfPageUrl));
148
    }
149

    
150
    public static String createMeta(HttpServletRequest request, String type, String query, List<String> filters, int total, int currentOffset, int limit) {
151
        if  (type.equals(MediaType.APPLICATION_JSON)) {
152
            return String.format(JSONResponseFormat.metaSearch, StringEscapeUtils.escapeJson(query), createFilters(type, filters), total, currentOffset, limit, createPaging(request, type, total, currentOffset, limit));
153
        }
154
        return String.format(XMLResponseFormat.metaSearch, StringEscapeUtils.escapeXml10(query), createFilters(type, filters), total, currentOffset, limit, createPaging(request, type, total, currentOffset, limit));
155
    }
156

    
157
    public static String createFilters(String type, List<String> fieldQueries) {
158
        StringBuilder builder = new StringBuilder();
159
        if (fieldQueries != null) {
160
            if (type.equals(MediaType.APPLICATION_JSON)) {
161
                for (Iterator<String> iterator = fieldQueries.iterator(); iterator.hasNext(); ) {
162
                    builder.append("\"").append(StringEscapeUtils.escapeJson(iterator.next())).append("\"");
163
                    if (iterator.hasNext()) {
164
                        builder.append(",");
165
                    }
166
                }
167
            } else {
168
                for (Iterator<String> iterator = fieldQueries.iterator(); iterator.hasNext(); ) {
169
                    builder.append("<filter>").append(StringEscapeUtils.escapeXml10(iterator.next())).append("</filter>");
170
                }
171
            }
172
        }
173

    
174
        return builder.toString();
175
    }
176

    
177
    private static String createPaging(HttpServletRequest request, String type, int total, int currentOffset, int limit) {
178
        String url = request.getRequestURL().toString();
179
        String selfPageUrl = null;
180

    
181
        if (limit > 0) {
182
            String firstPageUrl = null;
183
            String lastPageUrl = null;
184
            String previousPageUrl = null;
185
            String nextPageUrl = null;
186

    
187
            if (type.equals(MediaType.APPLICATION_JSON)) {
188
                selfPageUrl = pageUrlCreation(url, currentOffset, limit);
189
                firstPageUrl = pageUrlCreation(url, 0, limit);
190
                lastPageUrl = pageUrlCreation(url, calculateLastPage(total, limit), limit);
191
                previousPageUrl = pageUrlCreation(url, calculatePreviousPage(total, currentOffset, limit), limit);
192
                nextPageUrl = pageUrlCreation(url, calculateNextPage(total, currentOffset, limit), limit);
193
            } else {
194
                selfPageUrl = StringEscapeUtils.escapeXml10(pageUrlCreation(url, currentOffset, limit));
195
                firstPageUrl = StringEscapeUtils.escapeXml10(pageUrlCreation(url, 0, limit));
196
                lastPageUrl = StringEscapeUtils.escapeXml10(pageUrlCreation(url, calculateLastPage(total, limit), limit));
197
                previousPageUrl = StringEscapeUtils.escapeXml10(pageUrlCreation(url, calculatePreviousPage(total, currentOffset, limit), limit));
198
                nextPageUrl = StringEscapeUtils.escapeXml10(pageUrlCreation(url, calculateNextPage(total, currentOffset, limit), limit));
199
            }
200

    
201
            return formatPaging(type, firstPageUrl, lastPageUrl, previousPageUrl, nextPageUrl, selfPageUrl);
202

    
203
        }
204

    
205
        if (type.equals(MediaType.APPLICATION_JSON)) {
206
            selfPageUrl = pageUrlCreation(url, currentOffset, limit);
207
        } else {
208
            selfPageUrl = StringEscapeUtils.escapeXml10(pageUrlCreation(url, currentOffset, limit));
209
        }
210
        return formatSelfPaging(type, selfPageUrl);
211
    }
212

    
213
    private static String formatPaging(String type, String first, String last, String previous, String next, String self) {
214
        if (type.equals(MediaType.APPLICATION_JSON)) {
215
            return String.format(JSONResponseFormat._links, first, last, previous, next, self);
216
        }
217
        return String.format(XMLResponseFormat._links, first, last, previous, next, self);
218
    }
219

    
220
    private static String formatSelfPaging(String type, String self) {
221
        if (type.equals(MediaType.APPLICATION_JSON)) {
222
            return String.format(JSONResponseFormat._selflink, self);
223
        }
224

    
225
        return String.format(XMLResponseFormat._selflink, self);
226
    }
227

    
228
    private static int calculateLastPage(int total, int limit) {
229
        if (total <= limit) {
230
            return 0;
231

    
232
        } else {
233
            if (total%limit == 0) {
234
                return total / limit - 1;
235
            }
236
            return total/limit ;
237
        }
238
    }
239

    
240
    private static int calculatePreviousPage(int total, int currentOffset, int limit) {
241
        if (currentOffset-1 <= 0) {
242
            return 0;
243
        }
244

    
245
        int lastPage = calculateLastPage(total, limit);
246
        return (currentOffset-1 < lastPage) ? (currentOffset-1) : lastPage;
247
    }
248

    
249
    private static int calculateNextPage(int total, int currentOffset, int limit) {
250
        int lastPage = calculateLastPage(total, limit);
251
        return (currentOffset + 1 >= lastPage) ? lastPage:(currentOffset+1);
252
    }
253

    
254
    private static String pageUrlCreation(String urlPrefix, int offset, int limit) {
255
        return urlPrefix + "?page=" + offset + "&size=" + limit;
256
    }
257

    
258
    private static String pageUrlCreation(HttpServletRequest request) {
259
        StringBuffer requestURL = request.getRequestURL();
260
        String queryString = request.getQueryString();
261

    
262
        if (queryString == null) {
263
            return requestURL.toString();
264
        } else {
265
            return requestURL.append('?').append(queryString).toString();
266
        }
267
    }
268

    
269
}
(1-1/8)