1
22
23 package com.liferay.portal.search;
24
25 import com.liferay.portal.SystemException;
26 import com.liferay.portal.kernel.dao.search.SearchContainer;
27 import com.liferay.portal.kernel.search.OpenSearch;
28 import com.liferay.portal.kernel.search.SearchException;
29 import com.liferay.portal.kernel.util.GetterUtil;
30 import com.liferay.portal.kernel.util.HttpUtil;
31 import com.liferay.portal.kernel.util.StringPool;
32 import com.liferay.portal.kernel.util.StringUtil;
33 import com.liferay.portal.kernel.uuid.PortalUUIDUtil;
34 import com.liferay.portal.kernel.xml.Document;
35 import com.liferay.portal.kernel.xml.Element;
36 import com.liferay.portal.kernel.xml.SAXReaderUtil;
37 import com.liferay.portal.model.Layout;
38 import com.liferay.portal.service.LayoutLocalServiceUtil;
39 import com.liferay.portal.service.UserLocalServiceUtil;
40 import com.liferay.portal.theme.ThemeDisplay;
41 import com.liferay.portal.util.PortalUtil;
42 import com.liferay.portal.util.WebKeys;
43 import com.liferay.portlet.PortletURLImpl;
44
45 import java.util.Date;
46
47 import javax.portlet.PortletMode;
48 import javax.portlet.PortletModeException;
49 import javax.portlet.PortletRequest;
50 import javax.portlet.PortletURL;
51 import javax.portlet.WindowState;
52 import javax.portlet.WindowStateException;
53
54 import javax.servlet.http.HttpServletRequest;
55
56
62 public abstract class BaseOpenSearchImpl implements OpenSearch {
63
64 public boolean isEnabled() {
65 return true;
66 }
67
68 public String search(HttpServletRequest request, String url)
69 throws SearchException {
70
71 try {
72 long userId = PortalUtil.getUserId(request);
73
74 if (userId == 0) {
75 long companyId = PortalUtil.getCompanyId(request);
76
77 userId = UserLocalServiceUtil.getDefaultUserId(companyId);
78 }
79
80 String keywords = GetterUtil.getString(
81 HttpUtil.getParameter(url, "keywords", false));
82 int startPage = GetterUtil.getInteger(
83 HttpUtil.getParameter(url, "p", false), 1);
84 int itemsPerPage = GetterUtil.getInteger(
85 HttpUtil.getParameter(url, "c", false),
86 SearchContainer.DEFAULT_DELTA);
87 String format = GetterUtil.getString(
88 HttpUtil.getParameter(url, "format", false));
89
90 return search(
91 request, userId, keywords, startPage, itemsPerPage, format);
92 }
93 catch (SearchException se) {
94 throw se;
95 }
96 catch (Exception e) {
97 throw new SearchException(e);
98 }
99 }
100
101 public String search(
102 HttpServletRequest request, long userId, String keywords,
103 int startPage, int itemsPerPage, String format)
104 throws SearchException {
105
106 return search(
107 request, 0, userId, keywords, startPage, itemsPerPage, format);
108 }
109
110 public abstract String search(
111 HttpServletRequest request, long groupId, long userId,
112 String keywords, int startPage, int itemsPerPage, String format)
113 throws SearchException;
114
115 protected void addSearchResult(
116 Element root, String title, String link, Date updated,
117 String summary, double score, String format) {
118
119 addSearchResult(
120 root, title, link, updated, summary, new String[0], 0, score,
121 format);
122 }
123
124 protected void addSearchResult(
125 Element root, String title, String link, Date updated, String summary,
126 String[] tags, double ratings, double score, String format) {
127
128 if (format.equals("rss")) {
129 addSearchResultRSS(
130 root, title, link, updated, summary, tags, ratings, score);
131 }
132 else {
133 addSearchResultAtom(
134 root, title, link, updated, summary, tags, ratings, score);
135 }
136 }
137
138 protected void addSearchResultAtom(
139 Element root, String title, String link, Date updated, String summary,
140 String[] tags, double ratings, double score) {
141
142
144 Element entry = OpenSearchUtil.addElement(
145 root, "entry", OpenSearchUtil.DEFAULT_NAMESPACE);
146
147
149 OpenSearchUtil.addElement(
150 entry, "title", OpenSearchUtil.DEFAULT_NAMESPACE, title);
151
152
154 Element entryLink = OpenSearchUtil.addElement(
155 entry, "link", OpenSearchUtil.DEFAULT_NAMESPACE);
156
157 entryLink.addAttribute("href", link);
158
159
161 OpenSearchUtil.addElement(
162 entry, "id", OpenSearchUtil.DEFAULT_NAMESPACE,
163 "urn:uuid:" + PortalUUIDUtil.generate());
164
165
167 OpenSearchUtil.addElement(
168 entry, "updated", OpenSearchUtil.DEFAULT_NAMESPACE, updated);
169
170
172 OpenSearchUtil.addElement(
173 entry, "summary", OpenSearchUtil.DEFAULT_NAMESPACE, summary);
174
175
177 OpenSearchUtil.addElement(
178 entry, "tags", OpenSearchUtil.DEFAULT_NAMESPACE,
179 StringUtil.merge(tags));
180
181
183 OpenSearchUtil.addElement(
184 entry, "ratings", OpenSearchUtil.DEFAULT_NAMESPACE, ratings);
185
186
188 OpenSearchUtil.addElement(
189 entry, "score", OpenSearchUtil.RELEVANCE_NAMESPACE, score);
190 }
191
192 protected void addSearchResultRSS(
193 Element root, String title, String link, Date updated, String summary,
194 String[] tags, double ratings, double score) {
195
196
198 Element item = root.addElement("item");
199
200
202 OpenSearchUtil.addElement(
203 item, "title", OpenSearchUtil.NO_NAMESPACE, title);
204
205
207 OpenSearchUtil.addElement(
208 item, "link", OpenSearchUtil.NO_NAMESPACE, link);
209
210
212 OpenSearchUtil.addElement(
213 item, "description", OpenSearchUtil.NO_NAMESPACE, summary);
214
215
217 OpenSearchUtil.addElement(
218 item, "tags", OpenSearchUtil.NO_NAMESPACE, StringUtil.merge(tags));
219
220
222 OpenSearchUtil.addElement(
223 item, "ratings", OpenSearchUtil.NO_NAMESPACE, ratings);
224
225
227 OpenSearchUtil.addElement(
228 item, "score", OpenSearchUtil.RELEVANCE_NAMESPACE, score);
229 }
230
231
234 protected Object[] addSearchResults(
235 String keywords, int startPage, int itemsPerPage, int total, int start,
236 String title, String searchPath, String format,
237 ThemeDisplay themeDisplay) {
238
239 return addSearchResults(
240 new String[0], keywords, startPage, itemsPerPage, total, start,
241 title, searchPath, format, themeDisplay);
242 }
243
244 protected Object[] addSearchResults(
245 String[] queryTerms, String keywords, int startPage, int itemsPerPage,
246 int total, int start, String title, String searchPath, String format,
247 ThemeDisplay themeDisplay) {
248
249 int totalPages = 0;
250
251 if (total % itemsPerPage == 0) {
252 totalPages = total / itemsPerPage;
253 }
254 else {
255 totalPages = (total / itemsPerPage) + 1;
256 }
257
258 int previousPage = startPage - 1;
259 int nextPage = startPage + 1;
260
261 Document doc = SAXReaderUtil.createDocument();
262
263 if (format.equals("rss")) {
264 return addSearchResultsRSS(
265 doc, queryTerms, keywords, startPage, itemsPerPage, total,
266 start, totalPages, previousPage, nextPage, title, searchPath,
267 themeDisplay);
268 }
269 else {
270 return addSearchResultsAtom(
271 doc, queryTerms, keywords, startPage, itemsPerPage, total,
272 start, totalPages, previousPage, nextPage, title, searchPath,
273 themeDisplay);
274 }
275 }
276
277 protected Object[] addSearchResultsAtom(
278 Document doc, String[] queryTerms, String keywords, int startPage,
279 int itemsPerPage, int total, int start, int totalPages,
280 int previousPage, int nextPage, String title, String searchPath,
281 ThemeDisplay themeDisplay) {
282
283
285 Element root = doc.addElement("feed");
286
287 root.add(OpenSearchUtil.getNamespace(OpenSearchUtil.DEFAULT_NAMESPACE));
288 root.add(OpenSearchUtil.getNamespace(OpenSearchUtil.OS_NAMESPACE));
289 root.add(
290 OpenSearchUtil.getNamespace(OpenSearchUtil.RELEVANCE_NAMESPACE));
291
292
294 OpenSearchUtil.addElement(
295 root, "title", OpenSearchUtil.DEFAULT_NAMESPACE, title);
296
297
299 OpenSearchUtil.addElement(
300 root, "updated", OpenSearchUtil.DEFAULT_NAMESPACE, new Date());
301
302
304 Element author = OpenSearchUtil.addElement(
305 root, "author", OpenSearchUtil.DEFAULT_NAMESPACE);
306
307
309 OpenSearchUtil.addElement(
310 author, "name", OpenSearchUtil.DEFAULT_NAMESPACE,
311 themeDisplay.getUserId());
312
313
315 OpenSearchUtil.addElement(
316 root, "id", OpenSearchUtil.DEFAULT_NAMESPACE,
317 "urn:uuid:" + PortalUUIDUtil.generate());
318
319
321 OpenSearchUtil.addElement(
322 root, "queryTerms", OpenSearchUtil.DEFAULT_NAMESPACE,
323 StringUtil.merge(queryTerms, StringPool.COMMA_AND_SPACE));
324
325
327 OpenSearchUtil.addElement(
328 root, "totalResults", OpenSearchUtil.OS_NAMESPACE, total);
329
330
332 OpenSearchUtil.addElement(
333 root, "startIndex", OpenSearchUtil.OS_NAMESPACE, start + 1);
334
335
337 OpenSearchUtil.addElement(
338 root, "itemsPerPage", OpenSearchUtil.OS_NAMESPACE, itemsPerPage);
339
340
342 Element query = OpenSearchUtil.addElement(
343 root, "Query", OpenSearchUtil.OS_NAMESPACE);
344
345 query.addAttribute("role", "request");
346 query.addAttribute("searchTerms", keywords);
347 query.addAttribute("startPage", String.valueOf(startPage));
348
349
351 String searchURL = themeDisplay.getURLPortal() + searchPath;
352
353 OpenSearchUtil.addLink(
354 root, searchURL, "self", keywords, startPage, itemsPerPage);
355 OpenSearchUtil.addLink(
356 root, searchURL, "first", keywords, 1, itemsPerPage);
357
358 if (previousPage > 0) {
359 OpenSearchUtil.addLink(
360 root, searchURL, "previous", keywords, previousPage,
361 itemsPerPage);
362 }
363
364 if (nextPage <= totalPages) {
365 OpenSearchUtil.addLink(
366 root, searchURL, "next", keywords, nextPage, itemsPerPage);
367 }
368
369 OpenSearchUtil.addLink(
370 root, searchURL, "last", keywords, totalPages, itemsPerPage);
371
372 Element link = OpenSearchUtil.addElement(
373 root, "link", OpenSearchUtil.DEFAULT_NAMESPACE);
374
375 link.addAttribute("rel", "search");
376 link.addAttribute("href", searchPath + "_description.xml");
377 link.addAttribute("type", "application/opensearchdescription+xml");
378
379 return new Object[] {doc, root};
380 }
381
382 protected Object[] addSearchResultsRSS(
383 Document doc, String[] queryTerms, String keywords, int startPage,
384 int itemsPerPage, int total, int start, int totalPages,
385 int previousPage, int nextPage, String title, String searchPath,
386 ThemeDisplay themeDisplay) {
387
388
390 Element root = doc.addElement("rss");
391
392 root.addAttribute("version", "2.0");
393 root.add(
394 SAXReaderUtil.createNamespace(
395 "atom", "http://www.w3.org/2005/Atom"));
396 root.add(OpenSearchUtil.getNamespace(OpenSearchUtil.OS_NAMESPACE));
397 root.add(
398 OpenSearchUtil.getNamespace(OpenSearchUtil.RELEVANCE_NAMESPACE));
399
400
402 Element channel = root.addElement("channel");
403
404
406 OpenSearchUtil.addElement(
407 channel, "title", OpenSearchUtil.NO_NAMESPACE, title);
408
409
411 OpenSearchUtil.addElement(
412 channel, "link", OpenSearchUtil.NO_NAMESPACE,
413 themeDisplay.getURLPortal() + searchPath);
414
415
417 OpenSearchUtil.addElement(
418 channel, "description", OpenSearchUtil.NO_NAMESPACE, title);
419
420
422 OpenSearchUtil.addElement(
423 channel, "queryTerms", OpenSearchUtil.NO_NAMESPACE,
424 StringUtil.merge(queryTerms, StringPool.COMMA_AND_SPACE));
425
426
428 OpenSearchUtil.addElement(
429 channel, "totalResults", OpenSearchUtil.OS_NAMESPACE, total);
430
431
433 OpenSearchUtil.addElement(
434 channel, "startIndex", OpenSearchUtil.OS_NAMESPACE, start + 1);
435
436
438 OpenSearchUtil.addElement(
439 channel, "itemsPerPage", OpenSearchUtil.OS_NAMESPACE, itemsPerPage);
440
441
443 Element query = OpenSearchUtil.addElement(
444 channel, "Query", OpenSearchUtil.OS_NAMESPACE);
445
446 query.addAttribute("role", "request");
447 query.addAttribute("searchTerms", keywords);
448 query.addAttribute("startPage", String.valueOf(startPage));
449
450 return new Object[] {doc, channel};
451 }
452
453 protected PortletURL getPortletURL(
454 HttpServletRequest request, String portletId)
455 throws PortletModeException, SystemException, WindowStateException {
456
457 return getPortletURL(request, portletId, 0);
458 }
459
460 protected PortletURL getPortletURL(
461 HttpServletRequest request, String portletId, long groupId)
462 throws PortletModeException, SystemException, WindowStateException {
463
464 long plid = LayoutLocalServiceUtil.getDefaultPlid(
465 groupId, false, portletId);
466
467 if (plid == 0) {
468 plid = LayoutLocalServiceUtil.getDefaultPlid(
469 groupId, true, portletId);
470 }
471
472 if (plid == 0) {
473 Layout layout = (Layout)request.getAttribute(WebKeys.LAYOUT);
474
475 if (layout != null) {
476 plid = layout.getPlid();
477 }
478 }
479
480 PortletURL portletURL = new PortletURLImpl(
481 request, portletId, plid, PortletRequest.RENDER_PHASE);
482
483 portletURL.setWindowState(WindowState.MAXIMIZED);
484 portletURL.setPortletMode(PortletMode.VIEW);
485
486 return portletURL;
487 }
488
489 }