--- /dev/null
+/**\r
+ * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.\r
+ *\r
+ * This library is free software; you can redistribute it and/or modify it under\r
+ * the terms of the GNU Lesser General Public License as published by the Free\r
+ * Software Foundation; either version 2.1 of the License, or (at your option)\r
+ * any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\r
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more\r
+ * details.\r
+ */\r
+\r
+package com.liferay.portal.kernel.search;\r
+\r
+import com.liferay.portal.kernel.dao.search.SearchContainer;\r
+import com.liferay.portal.kernel.util.GetterUtil;\r
+import com.liferay.portal.kernel.util.HttpUtil;\r
+import com.liferay.portal.kernel.util.PropsUtil;\r
+import com.liferay.portal.kernel.util.StringPool;\r
+import com.liferay.portal.kernel.util.StringUtil;\r
+import com.liferay.portal.kernel.util.WebKeys;\r
+import com.liferay.portal.kernel.uuid.PortalUUIDUtil;\r
+import com.liferay.portal.kernel.xml.Document;\r
+import com.liferay.portal.kernel.xml.Element;\r
+import com.liferay.portal.kernel.xml.SAXReaderUtil;\r
+import com.liferay.portal.model.Layout;\r
+import com.liferay.portal.service.LayoutServiceUtil;\r
+import com.liferay.portal.service.UserLocalServiceUtil;\r
+import com.liferay.portal.theme.ThemeDisplay;\r
+import com.liferay.portal.util.PortalUtil;\r
+import com.liferay.portlet.PortletURLFactoryUtil;\r
+\r
+import java.util.Date;\r
+\r
+import javax.portlet.PortletMode;\r
+import javax.portlet.PortletRequest;\r
+import javax.portlet.PortletURL;\r
+import javax.portlet.WindowState;\r
+\r
+import javax.servlet.http.HttpServletRequest;\r
+\r
+/**\r
+ * @author Charles May\r
+ * @author Brian Wing Shun Chan\r
+ */\r
+public abstract class BaseOpenSearchImpl implements OpenSearch {\r
+\r
+ public boolean isEnabled() {\r
+ return _enabled;\r
+ }\r
+\r
+ public abstract String search(\r
+ HttpServletRequest request, long groupId, long userId,\r
+ String keywords, int startPage, int itemsPerPage, String format)\r
+ throws SearchException;\r
+\r
+ public String search(\r
+ HttpServletRequest request, long userId, String keywords,\r
+ int startPage, int itemsPerPage, String format)\r
+ throws SearchException {\r
+\r
+ return search(\r
+ request, 0, userId, keywords, startPage, itemsPerPage, format);\r
+ }\r
+\r
+ public String search(HttpServletRequest request, String url)\r
+ throws SearchException {\r
+\r
+ try {\r
+ long userId = PortalUtil.getUserId(request);\r
+\r
+ if (userId == 0) {\r
+ long companyId = PortalUtil.getCompanyId(request);\r
+\r
+ userId = UserLocalServiceUtil.getDefaultUserId(companyId);\r
+ }\r
+\r
+ String keywords = GetterUtil.getString(\r
+ HttpUtil.getParameter(url, "keywords", false));\r
+ int startPage = GetterUtil.getInteger(\r
+ HttpUtil.getParameter(url, "p", false), 1);\r
+ int itemsPerPage = GetterUtil.getInteger(\r
+ HttpUtil.getParameter(url, "c", false),\r
+ SearchContainer.DEFAULT_DELTA);\r
+ String format = GetterUtil.getString(\r
+ HttpUtil.getParameter(url, "format", false));\r
+\r
+ return search(\r
+ request, userId, keywords, startPage, itemsPerPage, format);\r
+ }\r
+ catch (SearchException se) {\r
+ throw se;\r
+ }\r
+ catch (Exception e) {\r
+ throw new SearchException(e);\r
+ }\r
+ }\r
+\r
+ protected void addSearchResult(\r
+ Element root, long groupId, long scopeGroupId, String entryClassName,\r
+ long entryClassPK, String title, String link, Date updated,\r
+ String summary, double score, String format) {\r
+\r
+ addSearchResult(\r
+ root, groupId, scopeGroupId, entryClassName, entryClassPK, title,\r
+ link, updated, summary, new String[0], 0, score, format);\r
+ }\r
+\r
+ protected void addSearchResult(\r
+ Element root, long groupId, long scopeGroupId, String entryClassName,\r
+ long entryClassPK, String title, String link, Date updated,\r
+ String summary, String[] tags, double ratings, double score,\r
+ String format) {\r
+\r
+ if (format.equals("rss")) {\r
+ addSearchResultRSS(\r
+ root, groupId, scopeGroupId, entryClassName, entryClassPK,\r
+ title, link, updated, summary, tags, ratings, score);\r
+ }\r
+ else {\r
+ addSearchResultAtom(\r
+ root, groupId, scopeGroupId, entryClassName, entryClassPK,\r
+ title, link, updated, summary, tags, ratings, score);\r
+ }\r
+ }\r
+\r
+ protected void addSearchResultAtom(\r
+ Element root, long groupId, long scopeGroupId, String entryClassName,\r
+ long entryClassPK, String title, String link, Date updated,\r
+ String summary, String[] tags, double ratings, double score) {\r
+\r
+ // entry\r
+\r
+ Element entry = OpenSearchUtil.addElement(\r
+ root, "entry", OpenSearchUtil.DEFAULT_NAMESPACE);\r
+\r
+ // groupId\r
+\r
+ OpenSearchUtil.addElement(\r
+ entry, "groupId", OpenSearchUtil.LIFERAY_NAMESPACE, groupId);\r
+\r
+ // scopeGroupId\r
+\r
+ OpenSearchUtil.addElement(\r
+ entry, "scopeGroupId", OpenSearchUtil.LIFERAY_NAMESPACE,\r
+ scopeGroupId);\r
+\r
+ // entryClassName\r
+\r
+ OpenSearchUtil.addElement(\r
+ entry, "entryClassName", OpenSearchUtil.LIFERAY_NAMESPACE,\r
+ entryClassName);\r
+\r
+ // entryClassPK\r
+\r
+ OpenSearchUtil.addElement(\r
+ entry, "entryClassPK", OpenSearchUtil.LIFERAY_NAMESPACE,\r
+ entryClassPK);\r
+\r
+ // title\r
+\r
+ OpenSearchUtil.addElement(\r
+ entry, "title", OpenSearchUtil.DEFAULT_NAMESPACE, title);\r
+\r
+ // link\r
+\r
+ Element entryLink = OpenSearchUtil.addElement(\r
+ entry, "link", OpenSearchUtil.DEFAULT_NAMESPACE);\r
+\r
+ entryLink.addAttribute("href", link);\r
+\r
+ // id\r
+\r
+ OpenSearchUtil.addElement(\r
+ entry, "id", OpenSearchUtil.DEFAULT_NAMESPACE,\r
+ "urn:uuid:" + PortalUUIDUtil.generate());\r
+\r
+ // updated\r
+\r
+ OpenSearchUtil.addElement(\r
+ entry, "updated", OpenSearchUtil.DEFAULT_NAMESPACE, updated);\r
+\r
+ // summary\r
+\r
+ OpenSearchUtil.addElement(\r
+ entry, "summary", OpenSearchUtil.DEFAULT_NAMESPACE, summary);\r
+\r
+ // tags\r
+\r
+ OpenSearchUtil.addElement(\r
+ entry, "tags", OpenSearchUtil.DEFAULT_NAMESPACE,\r
+ StringUtil.merge(tags));\r
+\r
+ // ratings\r
+\r
+ OpenSearchUtil.addElement(\r
+ entry, "ratings", OpenSearchUtil.DEFAULT_NAMESPACE, ratings);\r
+\r
+ // relevance:score\r
+\r
+ OpenSearchUtil.addElement(\r
+ entry, "score", OpenSearchUtil.RELEVANCE_NAMESPACE, score);\r
+ }\r
+\r
+ protected void addSearchResultRSS(\r
+ Element root, long groupId, long scopeGroupId, String entryClassName,\r
+ long entryClassPK, String title, String link, Date updated,\r
+ String summary, String[] tags, double ratings, double score) {\r
+\r
+ // item\r
+\r
+ Element item = root.addElement("item");\r
+\r
+ // groupId\r
+\r
+ OpenSearchUtil.addElement(\r
+ item, "groupId", OpenSearchUtil.LIFERAY_NAMESPACE, groupId);\r
+\r
+ // scopeGroupId\r
+\r
+ OpenSearchUtil.addElement(\r
+ item, "scopeGroupId", OpenSearchUtil.LIFERAY_NAMESPACE,\r
+ scopeGroupId);\r
+\r
+ // entryClassName\r
+\r
+ OpenSearchUtil.addElement(\r
+ item, "entryClassName", OpenSearchUtil.LIFERAY_NAMESPACE,\r
+ entryClassName);\r
+\r
+ // entryClassPK\r
+\r
+ OpenSearchUtil.addElement(\r
+ item, "entryClassPK", OpenSearchUtil.LIFERAY_NAMESPACE,\r
+ entryClassPK);\r
+\r
+ // title\r
+\r
+ OpenSearchUtil.addElement(\r
+ item, "title", OpenSearchUtil.NO_NAMESPACE, title);\r
+\r
+ // link\r
+\r
+ OpenSearchUtil.addElement(\r
+ item, "link", OpenSearchUtil.NO_NAMESPACE, link);\r
+\r
+ // summary\r
+\r
+ OpenSearchUtil.addElement(\r
+ item, "description", OpenSearchUtil.NO_NAMESPACE, summary);\r
+\r
+ // tags\r
+\r
+ OpenSearchUtil.addElement(\r
+ item, "tags", OpenSearchUtil.NO_NAMESPACE, StringUtil.merge(tags));\r
+\r
+ // ratings\r
+\r
+ OpenSearchUtil.addElement(\r
+ item, "ratings", OpenSearchUtil.NO_NAMESPACE, ratings);\r
+\r
+ // relevance:score\r
+\r
+ OpenSearchUtil.addElement(\r
+ item, "score", OpenSearchUtil.RELEVANCE_NAMESPACE, score);\r
+ }\r
+\r
+ /**\r
+ * @deprecated\r
+ */\r
+ protected Object[] addSearchResults(\r
+ String keywords, int startPage, int itemsPerPage, int total, int start,\r
+ String title, String searchPath, String format,\r
+ ThemeDisplay themeDisplay) {\r
+\r
+ return addSearchResults(\r
+ new String[0], keywords, startPage, itemsPerPage, total, start,\r
+ title, searchPath, format, themeDisplay);\r
+ }\r
+\r
+ protected Object[] addSearchResults(\r
+ String[] queryTerms, String keywords, int startPage, int itemsPerPage,\r
+ int total, int start, String title, String searchPath, String format,\r
+ ThemeDisplay themeDisplay) {\r
+\r
+ int totalPages = 0;\r
+\r
+ if ((total % itemsPerPage) == 0) {\r
+ totalPages = total / itemsPerPage;\r
+ }\r
+ else {\r
+ totalPages = (total / itemsPerPage) + 1;\r
+ }\r
+\r
+ int previousPage = startPage - 1;\r
+ int nextPage = startPage + 1;\r
+\r
+ Document doc = SAXReaderUtil.createDocument();\r
+\r
+ if (format.equals("rss")) {\r
+ return addSearchResultsRSS(\r
+ doc, queryTerms, keywords, startPage, itemsPerPage, total,\r
+ start, totalPages, previousPage, nextPage, title, searchPath,\r
+ themeDisplay);\r
+ }\r
+ else {\r
+ return addSearchResultsAtom(\r
+ doc, queryTerms, keywords, startPage, itemsPerPage, total,\r
+ start, totalPages, previousPage, nextPage, title, searchPath,\r
+ themeDisplay);\r
+ }\r
+ }\r
+\r
+ protected Object[] addSearchResultsAtom(\r
+ Document doc, String[] queryTerms, String keywords, int startPage,\r
+ int itemsPerPage, int total, int start, int totalPages,\r
+ int previousPage, int nextPage, String title, String searchPath,\r
+ ThemeDisplay themeDisplay) {\r
+\r
+ // feed\r
+\r
+ Element root = doc.addElement("feed");\r
+\r
+ root.add(OpenSearchUtil.getNamespace(OpenSearchUtil.DEFAULT_NAMESPACE));\r
+ root.add(OpenSearchUtil.getNamespace(OpenSearchUtil.OS_NAMESPACE));\r
+ root.add(\r
+ OpenSearchUtil.getNamespace(OpenSearchUtil.RELEVANCE_NAMESPACE));\r
+\r
+ // title\r
+\r
+ OpenSearchUtil.addElement(\r
+ root, "title", OpenSearchUtil.DEFAULT_NAMESPACE, title);\r
+\r
+ // updated\r
+\r
+ OpenSearchUtil.addElement(\r
+ root, "updated", OpenSearchUtil.DEFAULT_NAMESPACE, new Date());\r
+\r
+ // author\r
+\r
+ Element author = OpenSearchUtil.addElement(\r
+ root, "author", OpenSearchUtil.DEFAULT_NAMESPACE);\r
+\r
+ // name\r
+\r
+ OpenSearchUtil.addElement(\r
+ author, "name", OpenSearchUtil.DEFAULT_NAMESPACE,\r
+ themeDisplay.getUserId());\r
+\r
+ // id\r
+\r
+ OpenSearchUtil.addElement(\r
+ root, "id", OpenSearchUtil.DEFAULT_NAMESPACE,\r
+ "urn:uuid:" + PortalUUIDUtil.generate());\r
+\r
+ // queryTerms\r
+\r
+ OpenSearchUtil.addElement(\r
+ root, "queryTerms", OpenSearchUtil.DEFAULT_NAMESPACE,\r
+ StringUtil.merge(queryTerms, StringPool.COMMA_AND_SPACE));\r
+\r
+ // opensearch:totalResults\r
+\r
+ OpenSearchUtil.addElement(\r
+ root, "totalResults", OpenSearchUtil.OS_NAMESPACE, total);\r
+\r
+ // opensearch:startIndex\r
+\r
+ OpenSearchUtil.addElement(\r
+ root, "startIndex", OpenSearchUtil.OS_NAMESPACE, start + 1);\r
+\r
+ // opensearch:itemsPerPage\r
+\r
+ OpenSearchUtil.addElement(\r
+ root, "itemsPerPage", OpenSearchUtil.OS_NAMESPACE, itemsPerPage);\r
+\r
+ // opensearch:Query\r
+\r
+ Element query = OpenSearchUtil.addElement(\r
+ root, "Query", OpenSearchUtil.OS_NAMESPACE);\r
+\r
+ query.addAttribute("role", "request");\r
+ query.addAttribute("searchTerms", keywords);\r
+ query.addAttribute("startPage", String.valueOf(startPage));\r
+\r
+ // links\r
+\r
+ String searchURL = themeDisplay.getURLPortal() + searchPath;\r
+\r
+ OpenSearchUtil.addLink(\r
+ root, searchURL, "self", keywords, startPage, itemsPerPage);\r
+ OpenSearchUtil.addLink(\r
+ root, searchURL, "first", keywords, 1, itemsPerPage);\r
+\r
+ if (previousPage > 0) {\r
+ OpenSearchUtil.addLink(\r
+ root, searchURL, "previous", keywords, previousPage,\r
+ itemsPerPage);\r
+ }\r
+\r
+ if (nextPage <= totalPages) {\r
+ OpenSearchUtil.addLink(\r
+ root, searchURL, "next", keywords, nextPage, itemsPerPage);\r
+ }\r
+\r
+ OpenSearchUtil.addLink(\r
+ root, searchURL, "last", keywords, totalPages, itemsPerPage);\r
+\r
+ Element link = OpenSearchUtil.addElement(\r
+ root, "link", OpenSearchUtil.DEFAULT_NAMESPACE);\r
+\r
+ link.addAttribute("rel", "search");\r
+ link.addAttribute("href", searchPath + "_description.xml");\r
+ link.addAttribute("type", "application/opensearchdescription+xml");\r
+\r
+ return new Object[] {doc, root};\r
+ }\r
+\r
+ protected Object[] addSearchResultsRSS(\r
+ Document doc, String[] queryTerms, String keywords, int startPage,\r
+ int itemsPerPage, int total, int start, int totalPages,\r
+ int previousPage, int nextPage, String title, String searchPath,\r
+ ThemeDisplay themeDisplay) {\r
+\r
+ // rss\r
+\r
+ Element root = doc.addElement("rss");\r
+\r
+ root.addAttribute("version", "2.0");\r
+ root.add(\r
+ SAXReaderUtil.createNamespace(\r
+ "atom", "http://www.w3.org/2005/Atom"));\r
+ root.add(OpenSearchUtil.getNamespace(OpenSearchUtil.OS_NAMESPACE));\r
+ root.add(\r
+ OpenSearchUtil.getNamespace(OpenSearchUtil.RELEVANCE_NAMESPACE));\r
+\r
+ // channel\r
+\r
+ Element channel = root.addElement("channel");\r
+\r
+ // title\r
+\r
+ OpenSearchUtil.addElement(\r
+ channel, "title", OpenSearchUtil.NO_NAMESPACE, title);\r
+\r
+ // link\r
+\r
+ OpenSearchUtil.addElement(\r
+ channel, "link", OpenSearchUtil.NO_NAMESPACE,\r
+ themeDisplay.getURLPortal() + searchPath);\r
+\r
+ // description\r
+\r
+ OpenSearchUtil.addElement(\r
+ channel, "description", OpenSearchUtil.NO_NAMESPACE, title);\r
+\r
+ // queryTerms\r
+\r
+ OpenSearchUtil.addElement(\r
+ channel, "queryTerms", OpenSearchUtil.NO_NAMESPACE,\r
+ StringUtil.merge(queryTerms, StringPool.COMMA_AND_SPACE));\r
+\r
+ // opensearch:totalResults\r
+\r
+ OpenSearchUtil.addElement(\r
+ channel, "totalResults", OpenSearchUtil.OS_NAMESPACE, total);\r
+\r
+ // opensearch:startIndex\r
+\r
+ OpenSearchUtil.addElement(\r
+ channel, "startIndex", OpenSearchUtil.OS_NAMESPACE, start + 1);\r
+\r
+ // opensearch:itemsPerPage\r
+\r
+ OpenSearchUtil.addElement(\r
+ channel, "itemsPerPage", OpenSearchUtil.OS_NAMESPACE, itemsPerPage);\r
+\r
+ // opensearch:Query\r
+\r
+ Element query = OpenSearchUtil.addElement(\r
+ channel, "Query", OpenSearchUtil.OS_NAMESPACE);\r
+\r
+ query.addAttribute("role", "request");\r
+ query.addAttribute("searchTerms", keywords);\r
+ query.addAttribute("startPage", String.valueOf(startPage));\r
+\r
+ return new Object[] {doc, channel};\r
+ }\r
+\r
+ protected PortletURL getPortletURL(\r
+ HttpServletRequest request, String portletId)\r
+ throws Exception {\r
+\r
+ return getPortletURL(request, portletId, 0);\r
+ }\r
+\r
+ protected PortletURL getPortletURL(\r
+ HttpServletRequest request, String portletId, long scopeGroupId)\r
+ throws Exception {\r
+\r
+ Layout layout = (Layout)request.getAttribute(WebKeys.LAYOUT);\r
+\r
+ long layoutGroupId = scopeGroupId;\r
+\r
+ if (layout != null) {\r
+ layoutGroupId = layout.getGroupId();\r
+ }\r
+\r
+ long plid = LayoutServiceUtil.getDefaultPlid(\r
+ layoutGroupId, scopeGroupId, false, portletId);\r
+\r
+ if (plid == 0) {\r
+ plid = LayoutServiceUtil.getDefaultPlid(\r
+ layoutGroupId, scopeGroupId, true, portletId);\r
+ }\r
+\r
+ if (plid == 0) {\r
+ if (layout != null) {\r
+ plid = layout.getPlid();\r
+ }\r
+ }\r
+\r
+ PortletURL portletURL = PortletURLFactoryUtil.create(\r
+ request, portletId, plid, PortletRequest.RENDER_PHASE, true);\r
+\r
+ portletURL.setWindowState(WindowState.MAXIMIZED);\r
+ portletURL.setPortletMode(PortletMode.VIEW);\r
+\r
+ return portletURL;\r
+ }\r
+\r
+ private boolean _enabled = GetterUtil.getBoolean(\r
+ PropsUtil.get(getClass().getName()), true);\r
+\r
+}
\ No newline at end of file