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.log4j.Logger;
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, message);
22
        }
23
        return String.format(XMLResponseFormat.error404Message, 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, message);
29
        }
30
        return String.format(XMLResponseFormat.error400Message, 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, message, description);
36
        }
37
        return String.format(XMLResponseFormat.error500Message, message, description);
38
    }
39

    
40
    public static String createEntitiesResponse(HttpServletRequest request, RequestResponseHandler.Entity entityType, String query, List<String> filters, SearchResult searchResult, boolean refine, String type) {
41
        if (refine) {
42
            if (type.equals(MediaType.APPLICATION_JSON)) {
43
                return String.format(JSONResponseFormat.response, createMeta(request, type, query, filters, searchResult.getTotal(), searchResult.getPage(), searchResult.getSize()), formatSearchResults(type,searchResult.getSearchResults()), formatRefineResults(type, searchResult.getBrowseResults()));
44
            }
45
            return String.format(XMLResponseFormat.response, createMeta(request, type, query, filters, searchResult.getTotal(), searchResult.getPage(), searchResult.getSize()), formatSearchResults(type,searchResult.getSearchResults()), formatRefineResults(type, searchResult.getBrowseResults()));
46
        }
47

    
48
        if  (type.equals(MediaType.APPLICATION_JSON)) {
49
                return String.format(JSONResponseFormat.response, createMeta(request, type, query, filters, searchResult.getTotal(), searchResult.getPage(), searchResult.getSize()), formatSearchResults(type, searchResult.getSearchResults()), "");
50
        }
51
        return String.format(XMLResponseFormat.response, createMeta(request, type, query, filters, searchResult.getTotal(), searchResult.getPage(), searchResult.getSize()), formatSearchResults(type, searchResult.getSearchResults()), "");
52

    
53
    }
54

    
55
    private static String formatRefineResults(String type, List<String> refineResults) {
56
        if (type.equals(MediaType.APPLICATION_JSON)) {
57
            if (refineResults == null || refineResults.isEmpty()) {
58
                return ",\"refineResults\":{}";
59
            }
60

    
61
            return ",\"refineResults\": {" + appendJSONStrings(refineResults) + "}";
62
        }
63

    
64
        if (refineResults == null || refineResults.isEmpty()) {
65
            return "<refineResults></refineResults>";
66
        }
67

    
68
        return "<refineResults>" + appendXMLStrings(refineResults) + "</refineResults>";
69
    }
70

    
71
    private static String formatSearchResults(String type, List<String> searchResults) {
72
        if (searchResults == null || searchResults.isEmpty()) {
73
            return "";
74
        }
75

    
76
        if (type.equals(MediaType.APPLICATION_JSON)) {
77
            return appendJSONStrings(searchResults);
78
        }
79

    
80
        return appendXMLStrings(searchResults);
81

    
82
    }
83

    
84
    private static String appendXMLStrings(List<String> searchResults) {
85
        StringBuilder stringBuilder = new StringBuilder();
86
        for (String xml:searchResults) {
87
            stringBuilder.append(xml);
88
        }
89
        return stringBuilder.toString();
90
    }
91

    
92
    private static String appendJSONStrings(List<String> searchResults) {
93
        StringBuilder stringBuilder = new StringBuilder();
94
        for (Iterator<String> iterator = searchResults.iterator(); iterator.hasNext();) {
95
            stringBuilder.append(iterator.next());
96
            if (iterator.hasNext()) {
97
               stringBuilder.append(",");
98
            }
99
        }
100
        return stringBuilder.toString();
101
    }
102

    
103
    /*
104
    public static String createEntitiesResponse(HttpServletRequest request, RequestResponseHandler.Entity entityType,
105
                                                String query, String entities, List<String> filters, int total, int currentOffset, int limit, boolean refine, List<String> refineResults, String type) {
106
        if (refine) {
107
            if (type.equals(MediaType.APPLICATION_JSON)) {
108
                return String.format(JSONResponseFormat.response, createMeta(request, type, query, filters, total, currentOffset, limit), entities, ", refine", new Gson().toJson(refineResults));
109
            }
110
            return String.format(XMLResponseFormat.response, createMeta(request, type, query, filters, total, currentOffset, limit), entities, "", "");
111
        }
112

    
113
        if  (type.equals(MediaType.APPLICATION_JSON)) {
114
            return String.format(JSONResponseFormat.response, createMeta(request, type, query, filters, total, currentOffset, limit), entities, "", "");
115
        }
116

    
117
        return String.format(XMLResponseFormat.response, createMeta(request, type, query, filters, total, currentOffset, limit));
118

    
119
    }*/
120

    
121
    public static String createMeta(HttpServletRequest request, String type, String query, List<String> filters, int total, int currentOffset, int limit) {
122
        if  (type.equals(MediaType.APPLICATION_JSON)) {
123
            return String.format(JSONResponseFormat.metaSearch, query, createFilters(type, filters), total, currentOffset, limit, createPaging(request, type, total, currentOffset, limit));
124
        }
125
        return String.format(XMLResponseFormat.metaSearch, query, createFilters(type, filters), total, currentOffset, limit, createPaging(request, type, total, currentOffset, limit));
126
    }
127

    
128
    public static String createFilters(String type, List<String> fieldQueries) {
129
        StringBuilder builder = new StringBuilder();
130
        if (fieldQueries != null) {
131
            if (type.equals(MediaType.APPLICATION_JSON)) {
132
                for (Iterator<String> iterator = fieldQueries.iterator(); iterator.hasNext(); ) {
133
                    builder.append("\"").append(iterator.next()).append("\"");
134
                    if (iterator.hasNext()) {
135
                        builder.append(",");
136
                    }
137
                }
138
            } else {
139
                for (Iterator<String> iterator = fieldQueries.iterator(); iterator.hasNext(); ) {
140
                    builder.append("<filter>").append(iterator.next()).append("</filter>");
141
                }
142
            }
143
        }
144

    
145
        return builder.toString();
146
    }
147

    
148
    private static String createPaging(HttpServletRequest request, String type, int total, int currentOffset, int limit) {
149
        String url = request.getRequestURL().toString();
150

    
151
        if (limit > 0) {
152
            String selfPageUrl = pageUrlCreation(url, currentOffset, limit);
153
            String firstPageUrl = pageUrlCreation(url, 0, limit);
154
            String lastPageUrl = pageUrlCreation(url, calculateLastPage(total, limit), limit);
155
            String previousPageUrl = pageUrlCreation(url, calculatePreviousPage(total, currentOffset, limit), limit);
156
            String nextPageUrl = pageUrlCreation(url, calculateNextPage(total, currentOffset, limit), limit);
157

    
158
            return formatPaging(type, firstPageUrl, lastPageUrl, previousPageUrl, nextPageUrl, selfPageUrl);
159

    
160
        }
161

    
162
        String selfPageUrl = pageUrlCreation(url, currentOffset, limit);
163
        return formatSelfPaging(type, selfPageUrl);
164
    }
165

    
166
    private static String formatPaging(String type, String first, String last, String previous, String next, String self) {
167
        if (type.equals(MediaType.APPLICATION_JSON)) {
168
            return String.format(JSONResponseFormat._links, first, last, previous, next, self);
169
        }
170

    
171
        return String.format(XMLResponseFormat._links, first, last, previous, next, self);
172
    }
173

    
174
    private static String formatSelfPaging(String type, String self) {
175
        if (type.equals(MediaType.APPLICATION_JSON)) {
176
            return String.format(JSONResponseFormat._selflink, self);
177
        }
178

    
179
        return String.format(XMLResponseFormat._selflink, self);
180
    }
181

    
182
    private static int calculateLastPage(int total, int limit) {
183
        if (total <= limit) {
184
            return 0;
185

    
186
        } else {
187
            if (total%limit == 0) {
188
                return total / limit - 1;
189
            }
190
            return total/limit ;
191
        }
192
    }
193

    
194
    private static int calculatePreviousPage(int total, int currentOffset, int limit) {
195
        if (currentOffset-1 <= 0) {
196
            return 0;
197
        }
198

    
199
        return currentOffset-1;
200
    }
201

    
202
    private static int calculateNextPage(int total, int currentOffset, int limit) {
203
        int lastPage = calculateLastPage(total, limit);
204

    
205
        if (currentOffset + 1 >= lastPage) {
206
            return lastPage;
207
        }
208
        return currentOffset + 1;
209
    }
210

    
211
    private static String pageUrlCreation(String urlPrefix, int offset, int limit) {
212
        return urlPrefix + "?page=" + offset + "&size=" + limit;
213
    }
214

    
215
}
(1-1/8)