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

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

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

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

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

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

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

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

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

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

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

    
63
    public static String createEntitiesResponse(HttpServletRequest request, RequestResponseHandler.Entity entityType, String query, List<String> filters, SearchResult searchResult, boolean refine, String type) {
64
        if (refine) {
65
            if (type.equals(MediaType.APPLICATION_JSON)) {
66
                return String.format(JSONResponseFormat.response, createMeta(request, type, query, filters, searchResult.getTotal(), searchResult.getPage(), searchResult.getSize()), formatSearchResults(type,searchResult.getSearchResults()), formatRefineResults(type, searchResult.getBrowseResults()));
67
            }
68
            return String.format(XMLResponseFormat.response, createMeta(request, type, query, filters, searchResult.getTotal(), searchResult.getPage(), searchResult.getSize()), formatSearchResults(type,searchResult.getSearchResults()), formatRefineResults(type, searchResult.getBrowseResults()));
69
        }
70

    
71
        if  (type.equals(MediaType.APPLICATION_JSON)) {
72
                return String.format(JSONResponseFormat.response, createMeta(request, type, query, filters, searchResult.getTotal(), searchResult.getPage(), searchResult.getSize()), formatSearchResults(type, searchResult.getSearchResults()), "");
73
        }
74
        return String.format(XMLResponseFormat.response, createMeta(request, type, query, filters, searchResult.getTotal(), searchResult.getPage(), searchResult.getSize()), formatSearchResults(type, searchResult.getSearchResults()), "");
75
    }
76

    
77
    private static String formatRefineResults(String type, List<String> refineResults) {
78
        if (type.equals(MediaType.APPLICATION_JSON)) {
79
            if (refineResults == null || refineResults.isEmpty()) {
80
                return ",\"refineResults\":{}";
81
            }
82

    
83
            return ",\"refineResults\": {" + appendJSONStrings(refineResults) + "}";
84
        }
85

    
86
        if (refineResults == null || refineResults.isEmpty()) {
87
            return "<refineResults></refineResults>";
88
        }
89

    
90
        return "<refineResults>" + appendXMLStrings(refineResults) + "</refineResults>";
91
    }
92

    
93
    private static String formatSearchResults(String type, List<String> searchResults) {
94
        if (searchResults == null || searchResults.isEmpty()) {
95
            return "";
96
        }
97

    
98
        if (type.equals(MediaType.APPLICATION_JSON)) {
99
            return appendJSONStrings(searchResults);
100
        }
101

    
102
        return appendXMLStrings(searchResults);
103

    
104
    }
105

    
106
    private static String appendXMLStrings(List<String> searchResults) {
107
        StringBuilder stringBuilder = new StringBuilder();
108
        for (String xml:searchResults) {
109
            stringBuilder.append(xml);
110
        }
111
        return stringBuilder.toString();
112
    }
113

    
114
    private static String appendJSONStrings(List<String> searchResults) {
115
        StringBuilder stringBuilder = new StringBuilder();
116
        for (Iterator<String> iterator = searchResults.iterator(); iterator.hasNext();) {
117
            stringBuilder.append(iterator.next());
118
            if (iterator.hasNext()) {
119
               stringBuilder.append(",");
120
            }
121
        }
122
        return stringBuilder.toString();
123
    }
124

    
125
    public static String createMetaBasic(HttpServletRequest request, String type) {
126
        String selfPageUrl = pageUrlCreation(request);
127
        if  (type.equals(MediaType.APPLICATION_JSON)) {
128
            return String.format(JSONResponseFormat.metaBasic, formatSelfPaging(type, selfPageUrl));
129
        }
130
        return String.format(XMLResponseFormat.metaBasic, formatSelfPaging(type, selfPageUrl));
131
    }
132

    
133
    public static String createMeta(HttpServletRequest request, String type, String query, List<String> filters, int total, int currentOffset, int limit) {
134
        if  (type.equals(MediaType.APPLICATION_JSON)) {
135
            return String.format(JSONResponseFormat.metaSearch, StringEscapeUtils.escapeJson(query), createFilters(type, filters), total, currentOffset, limit, createPaging(request, type, total, currentOffset, limit));
136
        }
137
        return String.format(XMLResponseFormat.metaSearch, StringEscapeUtils.escapeXml10(query), createFilters(type, filters), total, currentOffset, limit, createPaging(request, type, total, currentOffset, limit));
138
    }
139

    
140
    public static String createFilters(String type, List<String> fieldQueries) {
141
        StringBuilder builder = new StringBuilder();
142
        if (fieldQueries != null) {
143
            if (type.equals(MediaType.APPLICATION_JSON)) {
144
                for (Iterator<String> iterator = fieldQueries.iterator(); iterator.hasNext(); ) {
145
                    builder.append("\"").append(StringEscapeUtils.escapeJson(iterator.next())).append("\"");
146
                    if (iterator.hasNext()) {
147
                        builder.append(",");
148
                    }
149
                }
150
            } else {
151
                for (Iterator<String> iterator = fieldQueries.iterator(); iterator.hasNext(); ) {
152
                    builder.append("<filter>").append(StringEscapeUtils.escapeXml10(iterator.next())).append("</filter>");
153
                }
154
            }
155
        }
156

    
157
        return builder.toString();
158
    }
159

    
160
    private static String createPaging(HttpServletRequest request, String type, int total, int currentOffset, int limit) {
161
        String url = request.getRequestURL().toString();
162
        String selfPageUrl = null;
163

    
164
        if (limit > 0) {
165
            String firstPageUrl = null;
166
            String lastPageUrl = null;
167
            String previousPageUrl = null;
168
            String nextPageUrl = null;
169

    
170
            if (type.equals(MediaType.APPLICATION_JSON)) {
171
                selfPageUrl = pageUrlCreation(url, currentOffset, limit);
172
                firstPageUrl = pageUrlCreation(url, 0, limit);
173
                lastPageUrl = pageUrlCreation(url, calculateLastPage(total, limit), limit);
174
                previousPageUrl = pageUrlCreation(url, calculatePreviousPage(total, currentOffset, limit), limit);
175
                nextPageUrl = pageUrlCreation(url, calculateNextPage(total, currentOffset, limit), limit);
176
            } else {
177
                selfPageUrl = StringEscapeUtils.escapeXml10(pageUrlCreation(url, currentOffset, limit));
178
                firstPageUrl = StringEscapeUtils.escapeXml10(pageUrlCreation(url, 0, limit));
179
                lastPageUrl = StringEscapeUtils.escapeXml10(pageUrlCreation(url, calculateLastPage(total, limit), limit));
180
                previousPageUrl = StringEscapeUtils.escapeXml10(pageUrlCreation(url, calculatePreviousPage(total, currentOffset, limit), limit));
181
                nextPageUrl = StringEscapeUtils.escapeXml10(pageUrlCreation(url, calculateNextPage(total, currentOffset, limit), limit));
182
            }
183

    
184
            return formatPaging(type, firstPageUrl, lastPageUrl, previousPageUrl, nextPageUrl, selfPageUrl);
185

    
186
        }
187

    
188
        if (type.equals(MediaType.APPLICATION_JSON)) {
189
            selfPageUrl = pageUrlCreation(url, currentOffset, limit);
190
        } else {
191
            selfPageUrl = StringEscapeUtils.escapeXml10(pageUrlCreation(url, currentOffset, limit));
192
        }
193
        return formatSelfPaging(type, selfPageUrl);
194
    }
195

    
196
    private static String formatPaging(String type, String first, String last, String previous, String next, String self) {
197
        if (type.equals(MediaType.APPLICATION_JSON)) {
198
            return String.format(JSONResponseFormat._links, first, last, previous, next, self);
199
        }
200
        return String.format(XMLResponseFormat._links, first, last, previous, next, self);
201
    }
202

    
203
    private static String formatSelfPaging(String type, String self) {
204
        if (type.equals(MediaType.APPLICATION_JSON)) {
205
            return String.format(JSONResponseFormat._selflink, self);
206
        }
207

    
208
        return String.format(XMLResponseFormat._selflink, self);
209
    }
210

    
211
    private static int calculateLastPage(int total, int limit) {
212
        if (total <= limit) {
213
            return 0;
214

    
215
        } else {
216
            if (total%limit == 0) {
217
                return total / limit - 1;
218
            }
219
            return total/limit ;
220
        }
221
    }
222

    
223
    private static int calculatePreviousPage(int total, int currentOffset, int limit) {
224
        if (currentOffset-1 <= 0) {
225
            return 0;
226
        }
227

    
228
        int lastPage = calculateLastPage(total, limit);
229
        return (currentOffset-1 < lastPage) ? (currentOffset-1) : lastPage;
230
    }
231

    
232
    private static int calculateNextPage(int total, int currentOffset, int limit) {
233
        int lastPage = calculateLastPage(total, limit);
234
        return (currentOffset + 1 >= lastPage) ? lastPage:(currentOffset+1);
235
    }
236

    
237
    private static String pageUrlCreation(String urlPrefix, int offset, int limit) {
238
        return urlPrefix + "?page=" + offset + "&size=" + limit;
239
    }
240

    
241
    private static String pageUrlCreation(HttpServletRequest request) {
242
        StringBuffer requestURL = request.getRequestURL();
243
        String queryString = request.getQueryString();
244

    
245
        if (queryString == null) {
246
            return requestURL.toString();
247
        } else {
248
            return requestURL.append('?').append(queryString).toString();
249
        }
250
    }
251

    
252
}
(1-1/5)