Search in sources :

Example 1 with EventMapping

use of org.springframework.web.portlet.bind.annotation.EventMapping in project SimpleContentPortlet by Jasig.

the class SearchContentController method searchContent.

@EventMapping(SearchConstants.SEARCH_REQUEST_QNAME_STRING)
public void searchContent(EventRequest request, EventResponse response) {
    final Event event = request.getEvent();
    final SearchRequest searchQuery = (SearchRequest) event.getValue();
    final String textContent = getTextContent(request);
    final String[] searchTerms = searchQuery.getSearchTerms().split(" ");
    for (final String term : searchTerms) {
        if (StringUtils.containsIgnoreCase(textContent, term)) {
            // matched, create results object and copy over the query id
            final SearchResults searchResults = new SearchResults();
            searchResults.setQueryId(searchQuery.getQueryId());
            searchResults.setWindowId(request.getWindowID());
            // Build the result object for the match
            final SearchResult searchResult = new SearchResult();
            String title = request.getPreferences().getValue("searchResultsTitle", "${portlet.title}");
            searchResult.setTitle(title);
            searchResult.setSummary(getContentSummary(textContent));
            searchResult.getType().add("Portlet Content");
            // Add the result to the results and send the event
            searchResults.getSearchResult().add(searchResult);
            response.setEvent(SearchConstants.SEARCH_RESULTS_QNAME, searchResults);
            // Stop processing
            return;
        }
    }
}
Also used : SearchRequest(org.jasig.portal.search.SearchRequest) Event(javax.portlet.Event) SearchResult(org.jasig.portal.search.SearchResult) SearchResults(org.jasig.portal.search.SearchResults) EventMapping(org.springframework.web.portlet.bind.annotation.EventMapping)

Example 2 with EventMapping

use of org.springframework.web.portlet.bind.annotation.EventMapping in project uPortal by Jasig.

the class DirectoryPortletController method search2.

@EventMapping(SearchConstants.SEARCH_REQUEST_QNAME_STRING)
public void search2(EventRequest request, EventResponse response) {
    // get the search query object from the event
    Event event = request.getEvent();
    SearchRequest query = (SearchRequest) event.getValue();
    // search the portal's directory service for people matching the request
    final List<IPersonAttributes> people = searchDirectory(query.getSearchTerms(), request);
    if (people.size() > 0) {
        // transform the list of directory results into our generic search
        // response object
        final SearchResults results = new SearchResults();
        results.setQueryId(query.getQueryId());
        results.setWindowId(request.getWindowID());
        for (IPersonAttributes person : people) {
            final SearchResult result = new SearchResult();
            result.setTitle((String) person.getAttributeValue("displayName"));
            result.getType().add(directorySearchResultType);
            PortletUrl url = new PortletUrl();
            url.setType(PortletUrlType.RENDER);
            url.setPortletMode("VIEW");
            url.setWindowState("maximized");
            PortletUrlParameter actionParam = new PortletUrlParameter();
            actionParam.setName("action");
            actionParam.getValue().add("findByUsername");
            url.getParam().add(actionParam);
            PortletUrlParameter usernameParam = new PortletUrlParameter();
            usernameParam.setName("username");
            usernameParam.getValue().add(person.getName());
            url.getParam().add(usernameParam);
            result.setPortletUrl(url);
            results.getSearchResult().add(result);
        }
        // fire a search response event
        response.setEvent(SearchConstants.SEARCH_RESULTS_QNAME, results);
    }
}
Also used : SearchRequest(org.apereo.portal.search.SearchRequest) IPersonAttributes(org.apereo.services.persondir.IPersonAttributes) Event(javax.portlet.Event) PortletUrlParameter(org.apereo.portal.search.PortletUrlParameter) SearchResult(org.apereo.portal.search.SearchResult) SearchResults(org.apereo.portal.search.SearchResults) PortletUrl(org.apereo.portal.search.PortletUrl) EventMapping(org.springframework.web.portlet.bind.annotation.EventMapping)

Example 3 with EventMapping

use of org.springframework.web.portlet.bind.annotation.EventMapping in project uPortal by Jasig.

the class SearchPortletController method handleSearchRequest.

/**
 * Performs a search of the explicitly configured {@link IPortalSearchService}s. This is done as
 * an event handler so that it can run concurrently with the other portlets handling the search
 * request
 */
@SuppressWarnings("unchecked")
@EventMapping(SearchConstants.SEARCH_REQUEST_QNAME_STRING)
public void handleSearchRequest(EventRequest request, EventResponse response) {
    // UP-3887 Design flaw.  Both the searchLauncher portlet instance and the search portlet
    // instance receive
    // searchRequest and searchResult events because they are in the same portlet code base (to
    // share
    // autosuggest_handler.jsp and because we have to calculate the search portlet url for the
    // ajax call)
    // and share the portlet.xml which defines the event handling behavior.
    // If this instance is the searchLauncher, ignore the searchResult. The search was submitted
    // to the search
    // portlet instance.
    final String searchLaunchFname = request.getPreferences().getValue(SEARCH_LAUNCH_FNAME, null);
    if (searchLaunchFname != null) {
        // discarding message");
        return;
    }
    final Event event = request.getEvent();
    final SearchRequest searchQuery = (SearchRequest) event.getValue();
    // Map used to track searches that have been handled, used so that one search doesn't get
    // duplicate results
    ConcurrentMap<String, Boolean> searchHandledCache;
    final PortletSession session = request.getPortletSession();
    synchronized (org.springframework.web.portlet.util.PortletUtils.getSessionMutex(session)) {
        searchHandledCache = (ConcurrentMap<String, Boolean>) session.getAttribute(SEARCH_HANDLED_CACHE_NAME, PortletSession.APPLICATION_SCOPE);
        if (searchHandledCache == null) {
            searchHandledCache = CacheBuilder.newBuilder().maximumSize(20).expireAfterAccess(5, TimeUnit.MINUTES).<String, Boolean>build().asMap();
            session.setAttribute(SEARCH_HANDLED_CACHE_NAME, searchHandledCache, PortletSession.APPLICATION_SCOPE);
        }
    }
    final String queryId = searchQuery.getQueryId();
    if (searchHandledCache.putIfAbsent(queryId, Boolean.TRUE) != null) {
        // Already handled this search request
        return;
    }
    // Create the results
    final SearchResults results = new SearchResults();
    results.setQueryId(queryId);
    results.setWindowId(request.getWindowID());
    final List<SearchResult> searchResultList = results.getSearchResult();
    // Run the search for each service appending the results
    for (IPortalSearchService searchService : searchServices) {
        try {
            logger.debug("For queryId {}, query '{}', searching search service {}", queryId, searchQuery.getSearchTerms(), searchService.getClass().toString());
            final SearchResults serviceResults = searchService.getSearchResults(request, searchQuery);
            logger.debug("For queryId {}, obtained {} results from search service {}", queryId, serviceResults.getSearchResult().size(), searchService.getClass().toString());
            searchResultList.addAll(serviceResults.getSearchResult());
        } catch (Exception e) {
            logger.warn(searchService.getClass() + " threw an exception when searching, it will be ignored. " + searchQuery, e);
        }
    }
    // Respond with a results event if results were found
    if (!searchResultList.isEmpty()) {
        response.setEvent(SearchConstants.SEARCH_RESULTS_QNAME, results);
    }
}
Also used : SearchRequest(org.apereo.portal.search.SearchRequest) PortletSession(javax.portlet.PortletSession) Event(javax.portlet.Event) SearchResult(org.apereo.portal.search.SearchResult) SearchResults(org.apereo.portal.search.SearchResults) SpelParseException(org.springframework.expression.spel.SpelParseException) SpelEvaluationException(org.springframework.expression.spel.SpelEvaluationException) IOException(java.io.IOException) EventMapping(org.springframework.web.portlet.bind.annotation.EventMapping)

Example 4 with EventMapping

use of org.springframework.web.portlet.bind.annotation.EventMapping in project uPortal by Jasig.

the class SearchPortletController method handleSearchResult.

/**
 * Handles all the SearchResults events coming back from portlets
 */
@EventMapping(SearchConstants.SEARCH_RESULTS_QNAME_STRING)
public void handleSearchResult(EventRequest request) {
    // UP-3887 Design flaw.  Both the searchLauncher portlet instance and the search portlet
    // instance receive
    // searchRequest and searchResult events because they are in the same portlet code base (to
    // share
    // autosuggest_handler.jsp and because we have to calculate the search portlet url for the
    // ajax call)
    // and share the portlet.xml which defines the event handling behavior.
    // If this instance is the searchLauncher, ignore the searchResult. The search was submitted
    // to the search
    // portlet instance.
    final String searchLaunchFname = request.getPreferences().getValue(SEARCH_LAUNCH_FNAME, null);
    if (searchLaunchFname != null) {
        // message");
        return;
    }
    final Event event = request.getEvent();
    final SearchResults portletSearchResults = (SearchResults) event.getValue();
    // get the existing portal search result from the session and append
    // the results for this event
    final String queryId = portletSearchResults.getQueryId();
    final PortalSearchResults results = this.getPortalSearchResults(request, queryId);
    if (results == null) {
        this.logger.warn("No PortalSearchResults found for queryId {}, ignoring search results from {}", queryId, getSearchResultsSource(portletSearchResults));
        return;
    }
    if (logger.isDebugEnabled()) {
        logger.debug("For queryId {}, adding {} search results from {}", queryId, portletSearchResults.getSearchResult().size(), getSearchResultsSource(portletSearchResults));
    }
    final String windowId = portletSearchResults.getWindowId();
    final HttpServletRequest httpServletRequest = this.portalRequestUtils.getPortletHttpRequest(request);
    final IPortletWindowId portletWindowId = this.portletWindowRegistry.getPortletWindowId(httpServletRequest, windowId);
    // Add the other portlet's results to the main search results object
    this.addSearchResults(portletSearchResults, results, httpServletRequest, portletWindowId);
}
Also used : HttpServletRequest(javax.servlet.http.HttpServletRequest) Event(javax.portlet.Event) SearchResults(org.apereo.portal.search.SearchResults) IPortletWindowId(org.apereo.portal.portlet.om.IPortletWindowId) EventMapping(org.springframework.web.portlet.bind.annotation.EventMapping)

Aggregations

Event (javax.portlet.Event)4 EventMapping (org.springframework.web.portlet.bind.annotation.EventMapping)4 SearchResults (org.apereo.portal.search.SearchResults)3 SearchRequest (org.apereo.portal.search.SearchRequest)2 SearchResult (org.apereo.portal.search.SearchResult)2 IOException (java.io.IOException)1 PortletSession (javax.portlet.PortletSession)1 HttpServletRequest (javax.servlet.http.HttpServletRequest)1 IPortletWindowId (org.apereo.portal.portlet.om.IPortletWindowId)1 PortletUrl (org.apereo.portal.search.PortletUrl)1 PortletUrlParameter (org.apereo.portal.search.PortletUrlParameter)1 IPersonAttributes (org.apereo.services.persondir.IPersonAttributes)1 SearchRequest (org.jasig.portal.search.SearchRequest)1 SearchResult (org.jasig.portal.search.SearchResult)1 SearchResults (org.jasig.portal.search.SearchResults)1 SpelEvaluationException (org.springframework.expression.spel.SpelEvaluationException)1 SpelParseException (org.springframework.expression.spel.SpelParseException)1