2 * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
\r
4 * This library is free software; you can redistribute it and/or modify it under
\r
5 * the terms of the GNU Lesser General Public License as published by the Free
\r
6 * Software Foundation; either version 2.1 of the License, or (at your option)
\r
9 * This library is distributed in the hope that it will be useful, but WITHOUT
\r
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
\r
11 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
\r
15 package com.liferay.portal.kernel.search;
\r
17 import com.liferay.portal.kernel.dao.search.SearchContainer;
\r
18 import com.liferay.portal.kernel.util.GetterUtil;
\r
19 import com.liferay.portal.kernel.util.HttpUtil;
\r
20 import com.liferay.portal.kernel.util.PropsUtil;
\r
21 import com.liferay.portal.kernel.util.StringPool;
\r
22 import com.liferay.portal.kernel.util.StringUtil;
\r
23 import com.liferay.portal.kernel.util.WebKeys;
\r
24 import com.liferay.portal.kernel.uuid.PortalUUIDUtil;
\r
25 import com.liferay.portal.kernel.xml.Document;
\r
26 import com.liferay.portal.kernel.xml.Element;
\r
27 import com.liferay.portal.kernel.xml.SAXReaderUtil;
\r
28 import com.liferay.portal.model.Layout;
\r
29 import com.liferay.portal.service.LayoutServiceUtil;
\r
30 import com.liferay.portal.service.UserLocalServiceUtil;
\r
31 import com.liferay.portal.theme.ThemeDisplay;
\r
32 import com.liferay.portal.util.PortalUtil;
\r
33 import com.liferay.portlet.PortletURLFactoryUtil;
\r
35 import java.util.Date;
\r
37 import javax.portlet.PortletMode;
\r
38 import javax.portlet.PortletRequest;
\r
39 import javax.portlet.PortletURL;
\r
40 import javax.portlet.WindowState;
\r
42 import javax.servlet.http.HttpServletRequest;
\r
45 * @author Charles May
\r
46 * @author Brian Wing Shun Chan
\r
48 public abstract class BaseOpenSearchImpl implements OpenSearch {
\r
50 public boolean isEnabled() {
\r
54 public abstract String search(
\r
55 HttpServletRequest request, long groupId, long userId,
\r
56 String keywords, int startPage, int itemsPerPage, String format)
\r
57 throws SearchException;
\r
59 public String search(
\r
60 HttpServletRequest request, long userId, String keywords,
\r
61 int startPage, int itemsPerPage, String format)
\r
62 throws SearchException {
\r
65 request, 0, userId, keywords, startPage, itemsPerPage, format);
\r
68 public String search(HttpServletRequest request, String url)
\r
69 throws SearchException {
\r
72 long userId = PortalUtil.getUserId(request);
\r
75 long companyId = PortalUtil.getCompanyId(request);
\r
77 userId = UserLocalServiceUtil.getDefaultUserId(companyId);
\r
80 String keywords = GetterUtil.getString(
\r
81 HttpUtil.getParameter(url, "keywords", false));
\r
82 int startPage = GetterUtil.getInteger(
\r
83 HttpUtil.getParameter(url, "p", false), 1);
\r
84 int itemsPerPage = GetterUtil.getInteger(
\r
85 HttpUtil.getParameter(url, "c", false),
\r
86 SearchContainer.DEFAULT_DELTA);
\r
87 String format = GetterUtil.getString(
\r
88 HttpUtil.getParameter(url, "format", false));
\r
91 request, userId, keywords, startPage, itemsPerPage, format);
\r
93 catch (SearchException se) {
\r
96 catch (Exception e) {
\r
97 throw new SearchException(e);
\r
101 protected void addSearchResult(
\r
102 Element root, long groupId, long scopeGroupId, String entryClassName,
\r
103 long entryClassPK, String title, String link, Date updated,
\r
104 String summary, double score, String format) {
\r
107 root, groupId, scopeGroupId, entryClassName, entryClassPK, title,
\r
108 link, updated, summary, new String[0], 0, score, format);
\r
111 protected void addSearchResult(
\r
112 Element root, long groupId, long scopeGroupId, String entryClassName,
\r
113 long entryClassPK, String title, String link, Date updated,
\r
114 String summary, String[] tags, double ratings, double score,
\r
117 if (format.equals("rss")) {
\r
118 addSearchResultRSS(
\r
119 root, groupId, scopeGroupId, entryClassName, entryClassPK,
\r
120 title, link, updated, summary, tags, ratings, score);
\r
123 addSearchResultAtom(
\r
124 root, groupId, scopeGroupId, entryClassName, entryClassPK,
\r
125 title, link, updated, summary, tags, ratings, score);
\r
129 protected void addSearchResultAtom(
\r
130 Element root, long groupId, long scopeGroupId, String entryClassName,
\r
131 long entryClassPK, String title, String link, Date updated,
\r
132 String summary, String[] tags, double ratings, double score) {
\r
136 Element entry = OpenSearchUtil.addElement(
\r
137 root, "entry", OpenSearchUtil.DEFAULT_NAMESPACE);
\r
141 OpenSearchUtil.addElement(
\r
142 entry, "groupId", OpenSearchUtil.LIFERAY_NAMESPACE, groupId);
\r
146 OpenSearchUtil.addElement(
\r
147 entry, "scopeGroupId", OpenSearchUtil.LIFERAY_NAMESPACE,
\r
152 OpenSearchUtil.addElement(
\r
153 entry, "entryClassName", OpenSearchUtil.LIFERAY_NAMESPACE,
\r
158 OpenSearchUtil.addElement(
\r
159 entry, "entryClassPK", OpenSearchUtil.LIFERAY_NAMESPACE,
\r
164 OpenSearchUtil.addElement(
\r
165 entry, "title", OpenSearchUtil.DEFAULT_NAMESPACE, title);
\r
169 Element entryLink = OpenSearchUtil.addElement(
\r
170 entry, "link", OpenSearchUtil.DEFAULT_NAMESPACE);
\r
172 entryLink.addAttribute("href", link);
\r
176 OpenSearchUtil.addElement(
\r
177 entry, "id", OpenSearchUtil.DEFAULT_NAMESPACE,
\r
178 "urn:uuid:" + PortalUUIDUtil.generate());
\r
182 OpenSearchUtil.addElement(
\r
183 entry, "updated", OpenSearchUtil.DEFAULT_NAMESPACE, updated);
\r
187 OpenSearchUtil.addElement(
\r
188 entry, "summary", OpenSearchUtil.DEFAULT_NAMESPACE, summary);
\r
192 OpenSearchUtil.addElement(
\r
193 entry, "tags", OpenSearchUtil.DEFAULT_NAMESPACE,
\r
194 StringUtil.merge(tags));
\r
198 OpenSearchUtil.addElement(
\r
199 entry, "ratings", OpenSearchUtil.DEFAULT_NAMESPACE, ratings);
\r
203 OpenSearchUtil.addElement(
\r
204 entry, "score", OpenSearchUtil.RELEVANCE_NAMESPACE, score);
\r
207 protected void addSearchResultRSS(
\r
208 Element root, long groupId, long scopeGroupId, String entryClassName,
\r
209 long entryClassPK, String title, String link, Date updated,
\r
210 String summary, String[] tags, double ratings, double score) {
\r
214 Element item = root.addElement("item");
\r
218 OpenSearchUtil.addElement(
\r
219 item, "groupId", OpenSearchUtil.LIFERAY_NAMESPACE, groupId);
\r
223 OpenSearchUtil.addElement(
\r
224 item, "scopeGroupId", OpenSearchUtil.LIFERAY_NAMESPACE,
\r
229 OpenSearchUtil.addElement(
\r
230 item, "entryClassName", OpenSearchUtil.LIFERAY_NAMESPACE,
\r
235 OpenSearchUtil.addElement(
\r
236 item, "entryClassPK", OpenSearchUtil.LIFERAY_NAMESPACE,
\r
241 OpenSearchUtil.addElement(
\r
242 item, "title", OpenSearchUtil.NO_NAMESPACE, title);
\r
246 OpenSearchUtil.addElement(
\r
247 item, "link", OpenSearchUtil.NO_NAMESPACE, link);
\r
251 OpenSearchUtil.addElement(
\r
252 item, "description", OpenSearchUtil.NO_NAMESPACE, summary);
\r
256 OpenSearchUtil.addElement(
\r
257 item, "tags", OpenSearchUtil.NO_NAMESPACE, StringUtil.merge(tags));
\r
261 OpenSearchUtil.addElement(
\r
262 item, "ratings", OpenSearchUtil.NO_NAMESPACE, ratings);
\r
266 OpenSearchUtil.addElement(
\r
267 item, "score", OpenSearchUtil.RELEVANCE_NAMESPACE, score);
\r
273 protected Object[] addSearchResults(
\r
274 String keywords, int startPage, int itemsPerPage, int total, int start,
\r
275 String title, String searchPath, String format,
\r
276 ThemeDisplay themeDisplay) {
\r
278 return addSearchResults(
\r
279 new String[0], keywords, startPage, itemsPerPage, total, start,
\r
280 title, searchPath, format, themeDisplay);
\r
283 protected Object[] addSearchResults(
\r
284 String[] queryTerms, String keywords, int startPage, int itemsPerPage,
\r
285 int total, int start, String title, String searchPath, String format,
\r
286 ThemeDisplay themeDisplay) {
\r
288 int totalPages = 0;
\r
290 if ((total % itemsPerPage) == 0) {
\r
291 totalPages = total / itemsPerPage;
\r
294 totalPages = (total / itemsPerPage) + 1;
\r
297 int previousPage = startPage - 1;
\r
298 int nextPage = startPage + 1;
\r
300 Document doc = SAXReaderUtil.createDocument();
\r
302 if (format.equals("rss")) {
\r
303 return addSearchResultsRSS(
\r
304 doc, queryTerms, keywords, startPage, itemsPerPage, total,
\r
305 start, totalPages, previousPage, nextPage, title, searchPath,
\r
309 return addSearchResultsAtom(
\r
310 doc, queryTerms, keywords, startPage, itemsPerPage, total,
\r
311 start, totalPages, previousPage, nextPage, title, searchPath,
\r
316 protected Object[] addSearchResultsAtom(
\r
317 Document doc, String[] queryTerms, String keywords, int startPage,
\r
318 int itemsPerPage, int total, int start, int totalPages,
\r
319 int previousPage, int nextPage, String title, String searchPath,
\r
320 ThemeDisplay themeDisplay) {
\r
324 Element root = doc.addElement("feed");
\r
326 root.add(OpenSearchUtil.getNamespace(OpenSearchUtil.DEFAULT_NAMESPACE));
\r
327 root.add(OpenSearchUtil.getNamespace(OpenSearchUtil.OS_NAMESPACE));
\r
329 OpenSearchUtil.getNamespace(OpenSearchUtil.RELEVANCE_NAMESPACE));
\r
333 OpenSearchUtil.addElement(
\r
334 root, "title", OpenSearchUtil.DEFAULT_NAMESPACE, title);
\r
338 OpenSearchUtil.addElement(
\r
339 root, "updated", OpenSearchUtil.DEFAULT_NAMESPACE, new Date());
\r
343 Element author = OpenSearchUtil.addElement(
\r
344 root, "author", OpenSearchUtil.DEFAULT_NAMESPACE);
\r
348 OpenSearchUtil.addElement(
\r
349 author, "name", OpenSearchUtil.DEFAULT_NAMESPACE,
\r
350 themeDisplay.getUserId());
\r
354 OpenSearchUtil.addElement(
\r
355 root, "id", OpenSearchUtil.DEFAULT_NAMESPACE,
\r
356 "urn:uuid:" + PortalUUIDUtil.generate());
\r
360 OpenSearchUtil.addElement(
\r
361 root, "queryTerms", OpenSearchUtil.DEFAULT_NAMESPACE,
\r
362 StringUtil.merge(queryTerms, StringPool.COMMA_AND_SPACE));
\r
364 // opensearch:totalResults
\r
366 OpenSearchUtil.addElement(
\r
367 root, "totalResults", OpenSearchUtil.OS_NAMESPACE, total);
\r
369 // opensearch:startIndex
\r
371 OpenSearchUtil.addElement(
\r
372 root, "startIndex", OpenSearchUtil.OS_NAMESPACE, start + 1);
\r
374 // opensearch:itemsPerPage
\r
376 OpenSearchUtil.addElement(
\r
377 root, "itemsPerPage", OpenSearchUtil.OS_NAMESPACE, itemsPerPage);
\r
379 // opensearch:Query
\r
381 Element query = OpenSearchUtil.addElement(
\r
382 root, "Query", OpenSearchUtil.OS_NAMESPACE);
\r
384 query.addAttribute("role", "request");
\r
385 query.addAttribute("searchTerms", keywords);
\r
386 query.addAttribute("startPage", String.valueOf(startPage));
\r
390 String searchURL = themeDisplay.getURLPortal() + searchPath;
\r
392 OpenSearchUtil.addLink(
\r
393 root, searchURL, "self", keywords, startPage, itemsPerPage);
\r
394 OpenSearchUtil.addLink(
\r
395 root, searchURL, "first", keywords, 1, itemsPerPage);
\r
397 if (previousPage > 0) {
\r
398 OpenSearchUtil.addLink(
\r
399 root, searchURL, "previous", keywords, previousPage,
\r
403 if (nextPage <= totalPages) {
\r
404 OpenSearchUtil.addLink(
\r
405 root, searchURL, "next", keywords, nextPage, itemsPerPage);
\r
408 OpenSearchUtil.addLink(
\r
409 root, searchURL, "last", keywords, totalPages, itemsPerPage);
\r
411 Element link = OpenSearchUtil.addElement(
\r
412 root, "link", OpenSearchUtil.DEFAULT_NAMESPACE);
\r
414 link.addAttribute("rel", "search");
\r
415 link.addAttribute("href", searchPath + "_description.xml");
\r
416 link.addAttribute("type", "application/opensearchdescription+xml");
\r
418 return new Object[] {doc, root};
\r
421 protected Object[] addSearchResultsRSS(
\r
422 Document doc, String[] queryTerms, String keywords, int startPage,
\r
423 int itemsPerPage, int total, int start, int totalPages,
\r
424 int previousPage, int nextPage, String title, String searchPath,
\r
425 ThemeDisplay themeDisplay) {
\r
429 Element root = doc.addElement("rss");
\r
431 root.addAttribute("version", "2.0");
\r
433 SAXReaderUtil.createNamespace(
\r
434 "atom", "http://www.w3.org/2005/Atom"));
\r
435 root.add(OpenSearchUtil.getNamespace(OpenSearchUtil.OS_NAMESPACE));
\r
437 OpenSearchUtil.getNamespace(OpenSearchUtil.RELEVANCE_NAMESPACE));
\r
441 Element channel = root.addElement("channel");
\r
445 OpenSearchUtil.addElement(
\r
446 channel, "title", OpenSearchUtil.NO_NAMESPACE, title);
\r
450 OpenSearchUtil.addElement(
\r
451 channel, "link", OpenSearchUtil.NO_NAMESPACE,
\r
452 themeDisplay.getURLPortal() + searchPath);
\r
456 OpenSearchUtil.addElement(
\r
457 channel, "description", OpenSearchUtil.NO_NAMESPACE, title);
\r
461 OpenSearchUtil.addElement(
\r
462 channel, "queryTerms", OpenSearchUtil.NO_NAMESPACE,
\r
463 StringUtil.merge(queryTerms, StringPool.COMMA_AND_SPACE));
\r
465 // opensearch:totalResults
\r
467 OpenSearchUtil.addElement(
\r
468 channel, "totalResults", OpenSearchUtil.OS_NAMESPACE, total);
\r
470 // opensearch:startIndex
\r
472 OpenSearchUtil.addElement(
\r
473 channel, "startIndex", OpenSearchUtil.OS_NAMESPACE, start + 1);
\r
475 // opensearch:itemsPerPage
\r
477 OpenSearchUtil.addElement(
\r
478 channel, "itemsPerPage", OpenSearchUtil.OS_NAMESPACE, itemsPerPage);
\r
480 // opensearch:Query
\r
482 Element query = OpenSearchUtil.addElement(
\r
483 channel, "Query", OpenSearchUtil.OS_NAMESPACE);
\r
485 query.addAttribute("role", "request");
\r
486 query.addAttribute("searchTerms", keywords);
\r
487 query.addAttribute("startPage", String.valueOf(startPage));
\r
489 return new Object[] {doc, channel};
\r
492 protected PortletURL getPortletURL(
\r
493 HttpServletRequest request, String portletId)
\r
496 return getPortletURL(request, portletId, 0);
\r
499 protected PortletURL getPortletURL(
\r
500 HttpServletRequest request, String portletId, long scopeGroupId)
\r
503 Layout layout = (Layout)request.getAttribute(WebKeys.LAYOUT);
\r
505 long layoutGroupId = scopeGroupId;
\r
507 if (layout != null) {
\r
508 layoutGroupId = layout.getGroupId();
\r
511 long plid = LayoutServiceUtil.getDefaultPlid(
\r
512 layoutGroupId, scopeGroupId, false, portletId);
\r
515 plid = LayoutServiceUtil.getDefaultPlid(
\r
516 layoutGroupId, scopeGroupId, true, portletId);
\r
520 if (layout != null) {
\r
521 plid = layout.getPlid();
\r
525 PortletURL portletURL = PortletURLFactoryUtil.create(
\r
526 request, portletId, plid, PortletRequest.RENDER_PHASE, true);
\r
528 portletURL.setWindowState(WindowState.MAXIMIZED);
\r
529 portletURL.setPortletMode(PortletMode.VIEW);
\r
534 private boolean _enabled = GetterUtil.getBoolean(
\r
535 PropsUtil.get(getClass().getName()), true);
\r