1
|
package eu.dnetlib.data.search.web.servlet;
|
2
|
|
3
|
import eu.dnetlib.api.data.SearchService;
|
4
|
import eu.dnetlib.data.search.app.SearchServiceImpl;
|
5
|
import eu.dnetlib.domain.data.FormattedSearchResult;
|
6
|
import org.apache.commons.lang.IncompleteArgumentException;
|
7
|
import org.apache.commons.lang.StringEscapeUtils;
|
8
|
import org.apache.log4j.Logger;
|
9
|
import org.springframework.context.ApplicationContext;
|
10
|
import org.springframework.web.context.support.WebApplicationContextUtils;
|
11
|
|
12
|
import javax.servlet.ServletConfig;
|
13
|
import javax.servlet.ServletException;
|
14
|
import javax.servlet.http.HttpServlet;
|
15
|
import javax.servlet.http.HttpServletRequest;
|
16
|
import javax.servlet.http.HttpServletResponse;
|
17
|
import java.io.PrintWriter;
|
18
|
import java.util.ArrayList;
|
19
|
import java.util.Collection;
|
20
|
|
21
|
@SuppressWarnings("serial")
|
22
|
public class SearchServlet extends HttpServlet{
|
23
|
|
24
|
private SearchServiceImpl searchService = null;
|
25
|
private ApplicationContext context = null;
|
26
|
private static Logger logger = Logger.getLogger(SearchService.class);
|
27
|
|
28
|
public void init(ServletConfig config) throws ServletException {
|
29
|
super.init(config);
|
30
|
context = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
|
31
|
searchService = (SearchServiceImpl) context.getBean("searchService");
|
32
|
}
|
33
|
|
34
|
@Override
|
35
|
public void doGet(HttpServletRequest request, HttpServletResponse response) {
|
36
|
PrintWriter writer = null;
|
37
|
FormattedSearchResult formattedSearchResult = null;
|
38
|
|
39
|
String action = request.getParameter("action");
|
40
|
if (action == null) {
|
41
|
throw new UnsupportedOperationException("Undefined action.");
|
42
|
}
|
43
|
|
44
|
String query = request.getParameter("query");
|
45
|
if (query == null) {
|
46
|
throw new IncompleteArgumentException("Undefined query. Search request");
|
47
|
}
|
48
|
|
49
|
String format = (request.getParameter("format") != null) ?
|
50
|
request.getParameter("format") : "xml";
|
51
|
|
52
|
String locale = request.getParameter("locale");
|
53
|
|
54
|
int page = readParameter(request, "page", 1);
|
55
|
int size = readParameter(request, "size", 10);
|
56
|
|
57
|
String sTransformer = request.getParameter("sTransformer");
|
58
|
String rTransformer = request.getParameter("rTransformer");
|
59
|
|
60
|
Collection<String> fields = readParameter(request, "fields");
|
61
|
|
62
|
response.setContentType("text/xml;charset=UTF-8");
|
63
|
|
64
|
try {
|
65
|
writer = response.getWriter();
|
66
|
if(action.equals("search")) {
|
67
|
if (sTransformer == null) {
|
68
|
throw new IncompleteArgumentException("Undefined search transformer. Search request");
|
69
|
}
|
70
|
|
71
|
formattedSearchResult = searchService.search(query, sTransformer, format, locale, page, size);
|
72
|
|
73
|
} else if(action.equals("refine")) {
|
74
|
if(rTransformer == null) {
|
75
|
throw new IncompleteArgumentException("Undefined refine transformer. Refine request");
|
76
|
}
|
77
|
|
78
|
if(fields == null) {
|
79
|
throw new IncompleteArgumentException("Undefined refine fields. Refine request");
|
80
|
}
|
81
|
|
82
|
formattedSearchResult = searchService.refine(query, rTransformer, format, locale, fields);
|
83
|
|
84
|
} else if(action.equals("searchNrefine")) {
|
85
|
|
86
|
if(sTransformer == null) {
|
87
|
throw new IncompleteArgumentException("Undefined search transformer. Search and Refine request");
|
88
|
}
|
89
|
|
90
|
if(rTransformer == null) {
|
91
|
throw new IncompleteArgumentException("Undefined refine transformer. Search and Refine request");
|
92
|
}
|
93
|
|
94
|
if(fields == null) {
|
95
|
throw new IncompleteArgumentException("Undefined refine fields. Search and Refine request");
|
96
|
}
|
97
|
|
98
|
formattedSearchResult = searchService.searchNrefine(query, sTransformer, rTransformer, format, locale, page, size, fields);
|
99
|
|
100
|
} else {
|
101
|
throw new UnsupportedOperationException("The action " + action + " is not supported.");
|
102
|
}
|
103
|
|
104
|
writer.append(formattedSearchResult.getFormattedResult());
|
105
|
|
106
|
} catch (Exception e) {
|
107
|
writer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
|
108
|
writer.append("<error>");
|
109
|
writer.append("<exception>").append(StringEscapeUtils.escapeXml(e.getClass().getName())).append("</exception>");
|
110
|
if (e.getMessage() != null) {
|
111
|
writer.append("<message>").append(StringEscapeUtils.escapeXml(e.getMessage())).append("</message>");
|
112
|
}
|
113
|
if (e.getCause() != null) {
|
114
|
writer.append("<cause>").append(StringEscapeUtils.escapeXml(e.getCause().toString())).append("</cause>");
|
115
|
}
|
116
|
|
117
|
StackTraceElement[] trace = e.getStackTrace();
|
118
|
writer.append("<trace>");
|
119
|
for (int i = 0; i < trace.length; i++) {
|
120
|
writer.append(StringEscapeUtils.escapeXml(trace[i].toString())).append("\n");
|
121
|
}
|
122
|
writer.append("</trace>");
|
123
|
|
124
|
writer.append("</error>");
|
125
|
|
126
|
} finally {
|
127
|
writer.close();
|
128
|
}
|
129
|
}
|
130
|
|
131
|
private Collection<String> readParameter(HttpServletRequest request, String parameterName) {
|
132
|
Collection<String> fields = null;
|
133
|
String[] paramfields = request.getParameterValues(parameterName);
|
134
|
if (paramfields != null) {
|
135
|
fields = new ArrayList<String>();
|
136
|
for (int i=0; i<paramfields.length; i++)
|
137
|
fields.add(paramfields[i]);
|
138
|
}
|
139
|
return fields;
|
140
|
}
|
141
|
|
142
|
public int readParameter(HttpServletRequest request, String parameterName, int defaultValue) {
|
143
|
String param = request.getParameter(parameterName);
|
144
|
return (param != null)?Integer.parseInt(param):defaultValue;
|
145
|
}
|
146
|
}
|