com.liferay.portal.kernel.search.BaseOpenSearchImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.portal.kernel.search.BaseOpenSearchImpl.java

Source

/**
 * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 */

package com.liferay.portal.kernel.search;

import com.liferay.petra.string.StringPool;
import com.liferay.portal.kernel.dao.search.SearchContainer;
import com.liferay.portal.kernel.model.Layout;
import com.liferay.portal.kernel.portlet.LiferayPortletURL;
import com.liferay.portal.kernel.portlet.PortletProvider;
import com.liferay.portal.kernel.portlet.PortletProviderUtil;
import com.liferay.portal.kernel.portlet.PortletURLFactoryUtil;
import com.liferay.portal.kernel.service.LayoutServiceUtil;
import com.liferay.portal.kernel.service.UserLocalServiceUtil;
import com.liferay.portal.kernel.theme.ThemeDisplay;
import com.liferay.portal.kernel.util.ClassUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.HttpUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.PropsUtil;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.kernel.uuid.PortalUUIDUtil;
import com.liferay.portal.kernel.xml.Document;
import com.liferay.portal.kernel.xml.Element;
import com.liferay.portal.kernel.xml.SAXReaderUtil;

import java.util.Date;

import javax.portlet.PortletMode;
import javax.portlet.PortletRequest;
import javax.portlet.PortletURL;
import javax.portlet.WindowState;

import javax.servlet.http.HttpServletRequest;

/**
 * @author Charles May
 * @author Brian Wing Shun Chan
 */
public abstract class BaseOpenSearchImpl implements OpenSearch {

    public BaseOpenSearchImpl() {
        Class<?> clazz = getClass();

        _enabled = GetterUtil.getBoolean(PropsUtil.get(clazz.getName()), true);

        _openSearchURL = StringPool.BLANK;
        _openSearchDescriptionURL = StringPool.BLANK;
    }

    public BaseOpenSearchImpl(String openSearchURL, String openSearchDescriptionURL) {

        _openSearchURL = openSearchURL;
        _openSearchDescriptionURL = openSearchDescriptionURL;

        _enabled = GetterUtil.getBoolean(PropsUtil.get(ClassUtil.getClassName(this)), true);
    }

    @Override
    public String getClassName() {
        return StringPool.BLANK;
    }

    @Override
    public boolean isEnabled() {
        return _enabled;
    }

    @Override
    public abstract String search(HttpServletRequest httpServletRequest, long groupId, long userId, String keywords,
            int startPage, int itemsPerPage, String format) throws SearchException;

    @Override
    public String search(HttpServletRequest httpServletRequest, long userId, String keywords, int startPage,
            int itemsPerPage, String format) throws SearchException {

        return search(httpServletRequest, 0, userId, keywords, startPage, itemsPerPage, format);
    }

    @Override
    public String search(HttpServletRequest httpServletRequest, String url) throws SearchException {

        try {
            long userId = PortalUtil.getUserId(httpServletRequest);

            if (userId == 0) {
                userId = UserLocalServiceUtil.getDefaultUserId(PortalUtil.getCompanyId(httpServletRequest));
            }

            String keywords = GetterUtil.getString(HttpUtil.getParameter(url, "keywords", false));
            int startPage = GetterUtil.getInteger(HttpUtil.getParameter(url, "p", false), 1);
            int itemsPerPage = GetterUtil.getInteger(HttpUtil.getParameter(url, "c", false),
                    SearchContainer.DEFAULT_DELTA);
            String format = GetterUtil.getString(HttpUtil.getParameter(url, "format", false));

            return search(httpServletRequest, userId, keywords, startPage, itemsPerPage, format);
        } catch (SearchException se) {
            throw se;
        } catch (Exception e) {
            throw new SearchException(e);
        }
    }

    protected void addSearchResult(Element root, long groupId, long scopeGroupId, String entryClassName,
            long entryClassPK, String title, String link, Date updated, String summary, double score,
            String format) {

        addSearchResult(root, groupId, scopeGroupId, entryClassName, entryClassPK, title, link, updated, summary,
                new String[0], 0, score, format);
    }

    protected void addSearchResult(Element root, long groupId, long scopeGroupId, String entryClassName,
            long entryClassPK, String title, String link, Date updated, String summary, String[] tags,
            double ratings, double score, String format) {

        if (format.equals("rss")) {
            addSearchResultRSS(root, groupId, scopeGroupId, entryClassName, entryClassPK, title, link, updated,
                    summary, tags, ratings, score);
        } else {
            addSearchResultAtom(root, groupId, scopeGroupId, entryClassName, entryClassPK, title, link, updated,
                    summary, tags, ratings, score);
        }
    }

    protected void addSearchResultAtom(Element root, long groupId, long scopeGroupId, String entryClassName,
            long entryClassPK, String title, String link, Date updated, String summary, String[] tags,
            double ratings, double score) {

        // entry

        Element entry = OpenSearchUtil.addElement(root, "entry", OpenSearchUtil.DEFAULT_NAMESPACE);

        // groupId

        OpenSearchUtil.addElement(entry, "groupId", OpenSearchUtil.LIFERAY_NAMESPACE, groupId);

        // scopeGroupId

        OpenSearchUtil.addElement(entry, "scopeGroupId", OpenSearchUtil.LIFERAY_NAMESPACE, scopeGroupId);

        // entryClassName

        OpenSearchUtil.addElement(entry, "entryClassName", OpenSearchUtil.LIFERAY_NAMESPACE, entryClassName);

        // entryClassPK

        OpenSearchUtil.addElement(entry, "entryClassPK", OpenSearchUtil.LIFERAY_NAMESPACE, entryClassPK);

        // title

        OpenSearchUtil.addElement(entry, "title", OpenSearchUtil.DEFAULT_NAMESPACE, title);

        // link

        Element entryLink = OpenSearchUtil.addElement(entry, "link", OpenSearchUtil.DEFAULT_NAMESPACE);

        entryLink.addAttribute("href", link);

        // id

        OpenSearchUtil.addElement(entry, "id", OpenSearchUtil.DEFAULT_NAMESPACE,
                "urn:uuid:" + PortalUUIDUtil.generate());

        // updated

        OpenSearchUtil.addElement(entry, "updated", OpenSearchUtil.DEFAULT_NAMESPACE, updated);

        // summary

        OpenSearchUtil.addElement(entry, "summary", OpenSearchUtil.DEFAULT_NAMESPACE, summary);

        // tags

        OpenSearchUtil.addElement(entry, "tags", OpenSearchUtil.DEFAULT_NAMESPACE, StringUtil.merge(tags));

        // ratings

        OpenSearchUtil.addElement(entry, "ratings", OpenSearchUtil.DEFAULT_NAMESPACE, ratings);

        // relevance:score

        OpenSearchUtil.addElement(entry, "score", OpenSearchUtil.RELEVANCE_NAMESPACE, score);
    }

    protected void addSearchResultRSS(Element root, long groupId, long scopeGroupId, String entryClassName,
            long entryClassPK, String title, String link, Date updated, String summary, String[] tags,
            double ratings, double score) {

        // item

        Element item = root.addElement("item");

        // groupId

        OpenSearchUtil.addElement(item, "groupId", OpenSearchUtil.LIFERAY_NAMESPACE, groupId);

        // scopeGroupId

        OpenSearchUtil.addElement(item, "scopeGroupId", OpenSearchUtil.LIFERAY_NAMESPACE, scopeGroupId);

        // entryClassName

        OpenSearchUtil.addElement(item, "entryClassName", OpenSearchUtil.LIFERAY_NAMESPACE, entryClassName);

        // entryClassPK

        OpenSearchUtil.addElement(item, "entryClassPK", OpenSearchUtil.LIFERAY_NAMESPACE, entryClassPK);

        // title

        OpenSearchUtil.addElement(item, "title", OpenSearchUtil.NO_NAMESPACE, title);

        // link

        OpenSearchUtil.addElement(item, "link", OpenSearchUtil.NO_NAMESPACE, link);

        // summary

        OpenSearchUtil.addElement(item, "description", OpenSearchUtil.NO_NAMESPACE, summary);

        // tags

        OpenSearchUtil.addElement(item, "tags", OpenSearchUtil.NO_NAMESPACE, StringUtil.merge(tags));

        // ratings

        OpenSearchUtil.addElement(item, "ratings", OpenSearchUtil.NO_NAMESPACE, ratings);

        // relevance:score

        OpenSearchUtil.addElement(item, "score", OpenSearchUtil.RELEVANCE_NAMESPACE, score);
    }

    protected Object[] addSearchResults(String[] queryTerms, String keywords, int startPage, int itemsPerPage,
            int total, int start, String title, String searchPath, String format, ThemeDisplay themeDisplay) {

        int totalPages = 0;

        if ((total % itemsPerPage) == 0) {
            totalPages = total / itemsPerPage;
        } else {
            totalPages = (total / itemsPerPage) + 1;
        }

        int previousPage = startPage - 1;
        int nextPage = startPage + 1;

        Document doc = SAXReaderUtil.createDocument();

        if (format.equals("rss")) {
            return addSearchResultsRSS(doc, queryTerms, keywords, startPage, itemsPerPage, total, start, totalPages,
                    previousPage, nextPage, title, searchPath, themeDisplay);
        }

        return addSearchResultsAtom(doc, queryTerms, keywords, startPage, itemsPerPage, total, start, totalPages,
                previousPage, nextPage, title, searchPath, themeDisplay);
    }

    protected Object[] addSearchResultsAtom(Document doc, String[] queryTerms, String keywords, int startPage,
            int itemsPerPage, int total, int start, int totalPages, int previousPage, int nextPage, String title,
            String searchPath, ThemeDisplay themeDisplay) {

        // feed

        Element root = doc.addElement("feed");

        root.add(OpenSearchUtil.getNamespace(OpenSearchUtil.DEFAULT_NAMESPACE));
        root.add(OpenSearchUtil.getNamespace(OpenSearchUtil.OS_NAMESPACE));
        root.add(OpenSearchUtil.getNamespace(OpenSearchUtil.RELEVANCE_NAMESPACE));

        // title

        OpenSearchUtil.addElement(root, "title", OpenSearchUtil.DEFAULT_NAMESPACE, title);

        // updated

        OpenSearchUtil.addElement(root, "updated", OpenSearchUtil.DEFAULT_NAMESPACE, new Date());

        // author

        Element author = OpenSearchUtil.addElement(root, "author", OpenSearchUtil.DEFAULT_NAMESPACE);

        // name

        OpenSearchUtil.addElement(author, "name", OpenSearchUtil.DEFAULT_NAMESPACE, themeDisplay.getUserId());

        // id

        OpenSearchUtil.addElement(root, "id", OpenSearchUtil.DEFAULT_NAMESPACE,
                "urn:uuid:" + PortalUUIDUtil.generate());

        // queryTerms

        OpenSearchUtil.addElement(root, "queryTerms", OpenSearchUtil.DEFAULT_NAMESPACE,
                StringUtil.merge(queryTerms, StringPool.COMMA_AND_SPACE));

        // opensearch:totalResults

        OpenSearchUtil.addElement(root, "totalResults", OpenSearchUtil.OS_NAMESPACE, total);

        // opensearch:startIndex

        OpenSearchUtil.addElement(root, "startIndex", OpenSearchUtil.OS_NAMESPACE, start + 1);

        // opensearch:itemsPerPage

        OpenSearchUtil.addElement(root, "itemsPerPage", OpenSearchUtil.OS_NAMESPACE, itemsPerPage);

        // opensearch:Query

        Element query = OpenSearchUtil.addElement(root, "Query", OpenSearchUtil.OS_NAMESPACE);

        query.addAttribute("role", "request");
        query.addAttribute("searchTerms", keywords);
        query.addAttribute("startPage", String.valueOf(startPage));

        // links

        String searchURL = getOpenSearchURL(searchPath, themeDisplay);

        OpenSearchUtil.addLink(root, searchURL, "self", keywords, startPage, itemsPerPage);
        OpenSearchUtil.addLink(root, searchURL, "first", keywords, 1, itemsPerPage);

        if (previousPage > 0) {
            OpenSearchUtil.addLink(root, searchURL, "previous", keywords, previousPage, itemsPerPage);
        }

        if (nextPage <= totalPages) {
            OpenSearchUtil.addLink(root, searchURL, "next", keywords, nextPage, itemsPerPage);
        }

        OpenSearchUtil.addLink(root, searchURL, "last", keywords, totalPages, itemsPerPage);

        Element link = OpenSearchUtil.addElement(root, "link", OpenSearchUtil.DEFAULT_NAMESPACE);

        link.addAttribute("rel", "search");
        link.addAttribute("href", getOpenSearchDescriptionURL(searchPath, themeDisplay));
        link.addAttribute("type", "application/opensearchdescription+xml");

        return new Object[] { doc, root };
    }

    protected Object[] addSearchResultsRSS(Document doc, String[] queryTerms, String keywords, int startPage,
            int itemsPerPage, int total, int start, int totalPages, int previousPage, int nextPage, String title,
            String searchPath, ThemeDisplay themeDisplay) {

        // rss

        Element root = doc.addElement("rss");

        root.addAttribute("version", "2.0");
        root.add(SAXReaderUtil.createNamespace("atom", "http://www.w3.org/2005/Atom"));
        root.add(OpenSearchUtil.getNamespace(OpenSearchUtil.OS_NAMESPACE));
        root.add(OpenSearchUtil.getNamespace(OpenSearchUtil.RELEVANCE_NAMESPACE));

        // channel

        Element channel = root.addElement("channel");

        // title

        OpenSearchUtil.addElement(channel, "title", OpenSearchUtil.NO_NAMESPACE, title);

        // link

        OpenSearchUtil.addElement(channel, "link", OpenSearchUtil.NO_NAMESPACE,
                getOpenSearchURL(searchPath, themeDisplay));

        // description

        OpenSearchUtil.addElement(channel, "description", OpenSearchUtil.NO_NAMESPACE, title);

        // queryTerms

        OpenSearchUtil.addElement(channel, "queryTerms", OpenSearchUtil.NO_NAMESPACE,
                StringUtil.merge(queryTerms, StringPool.COMMA_AND_SPACE));

        // opensearch:totalResults

        OpenSearchUtil.addElement(channel, "totalResults", OpenSearchUtil.OS_NAMESPACE, total);

        // opensearch:startIndex

        OpenSearchUtil.addElement(channel, "startIndex", OpenSearchUtil.OS_NAMESPACE, start + 1);

        // opensearch:itemsPerPage

        OpenSearchUtil.addElement(channel, "itemsPerPage", OpenSearchUtil.OS_NAMESPACE, itemsPerPage);

        // opensearch:Query

        Element query = OpenSearchUtil.addElement(channel, "Query", OpenSearchUtil.OS_NAMESPACE);

        query.addAttribute("role", "request");
        query.addAttribute("searchTerms", keywords);
        query.addAttribute("startPage", String.valueOf(startPage));

        return new Object[] { doc, channel };
    }

    protected String getOpenSearchDescriptionURL(String searchPath, ThemeDisplay themeDisplay) {

        if (Validator.isNotNull(_openSearchDescriptionURL)) {
            return _openSearchDescriptionURL;
        }

        return themeDisplay.getPortalURL() + searchPath + "_description.xml";
    }

    protected String getOpenSearchURL(String searchPath, ThemeDisplay themeDisplay) {

        if (Validator.isNotNull(_openSearchURL)) {
            return _openSearchURL;
        }

        return themeDisplay.getPortalURL() + searchPath;
    }

    protected long getPlid(HttpServletRequest httpServletRequest, String portletId, long scopeGroupId)
            throws Exception {

        Layout layout = (Layout) httpServletRequest.getAttribute(WebKeys.LAYOUT);

        long layoutGroupId = scopeGroupId;

        if (layout != null) {
            layoutGroupId = layout.getGroupId();
        }

        long plid = LayoutServiceUtil.getDefaultPlid(layoutGroupId, scopeGroupId, false, portletId);

        if (plid == 0) {
            plid = LayoutServiceUtil.getDefaultPlid(layoutGroupId, scopeGroupId, true, portletId);
        }

        if ((plid == 0) && (layout != null)) {
            plid = layout.getPlid();
        }

        return plid;
    }

    protected PortletURL getPortletURL(HttpServletRequest httpServletRequest, String portletId) throws Exception {

        return getPortletURL(httpServletRequest, portletId, 0);
    }

    protected PortletURL getPortletURL(HttpServletRequest httpServletRequest, String portletId, long scopeGroupId)
            throws Exception {

        long plid = getPlid(httpServletRequest, portletId, scopeGroupId);

        PortletURL portletURL = PortletURLFactoryUtil.create(httpServletRequest, portletId, plid,
                PortletRequest.RENDER_PHASE);

        portletURL.setPortletMode(PortletMode.VIEW);
        portletURL.setWindowState(WindowState.MAXIMIZED);

        return portletURL;
    }

    protected PortletURL getPortletURL(HttpServletRequest httpServletRequest, String className,
            PortletProvider.Action action, long scopeGroupId) throws Exception {

        LiferayPortletURL portletURL = (LiferayPortletURL) PortletProviderUtil.getPortletURL(httpServletRequest,
                className, action);

        long plid = getPlid(httpServletRequest, portletURL.getPortletId(), scopeGroupId);

        portletURL.setPlid(plid);

        portletURL.setPortletMode(PortletMode.VIEW);
        portletURL.setWindowState(WindowState.MAXIMIZED);

        return portletURL;
    }

    private final boolean _enabled;
    private final String _openSearchDescriptionURL;
    private final String _openSearchURL;

}