/**
* Licensed to Apereo under one or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information regarding copyright ownership. Apereo
* licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use
* this file except in compliance with the License. You may obtain a copy of the License at the
* following location:
*
* <p>http://www.apache.org/licenses/LICENSE-2.0
*
* <p>Unless required by applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apereo.portal.portlet.marketplace;
import java.util.List;
import javax.portlet.PortletRequest;
import javax.servlet.http.HttpServletRequest;
import org.apereo.portal.portlet.PortletUtils;
import org.apereo.portal.portlet.om.IPortletDefinition;
import org.apereo.portal.portlet.om.IPortletWindow;
import org.apereo.portal.portlet.om.IPortletWindowId;
import org.apereo.portal.portlet.registry.IPortletCategoryRegistry;
import org.apereo.portal.portlet.registry.IPortletDefinitionRegistry;
import org.apereo.portal.portlet.registry.IPortletWindowRegistry;
import org.apereo.portal.portlets.groupselector.EntityEnum;
import org.apereo.portal.portlets.search.IPortalSearchService;
import org.apereo.portal.search.PortletUrl;
import org.apereo.portal.search.PortletUrlParameter;
import org.apereo.portal.search.PortletUrlType;
import org.apereo.portal.search.SearchRequest;
import org.apereo.portal.search.SearchResult;
import org.apereo.portal.search.SearchResults;
import org.apereo.portal.security.IAuthorizationService;
import org.apereo.portal.url.IPortalRequestUtils;
import org.apereo.portal.url.IPortalUrlBuilder;
import org.apereo.portal.url.IPortalUrlProvider;
import org.apereo.portal.url.IPortletUrlBuilder;
import org.apereo.portal.url.UrlType;
import org.springframework.beans.factory.annotation.Autowired;
/**
* The search service that captures marketplace entries.
*
*/
public class MarketplaceSearchService implements IPortalSearchService {
private IPortletDefinitionRegistry portletDefinitionRegistry;
private IPortalUrlProvider portalUrlProvider;
private IPortletWindowRegistry portletWindowRegistry;
private IPortalRequestUtils portalRequestUtils;
private IMarketplaceService marketplaceService;
private IPortletCategoryRegistry portletCategoryRegistry;
private IAuthorizationService authorizationService;
@Autowired
public void setPortletDefinitionRegistry(IPortletDefinitionRegistry portletDefinitionRegistry) {
this.portletDefinitionRegistry = portletDefinitionRegistry;
}
@Autowired
public void setPortalUrlProvider(IPortalUrlProvider urlProvider) {
this.portalUrlProvider = urlProvider;
}
@Autowired
public void setPortletWindowRegistry(IPortletWindowRegistry portletWindowRegistry) {
this.portletWindowRegistry = portletWindowRegistry;
}
@Autowired
public void setPortalRequestUtils(IPortalRequestUtils portalRequestUtils) {
this.portalRequestUtils = portalRequestUtils;
}
@Autowired
public void setPortletCategoryRegistry(IPortletCategoryRegistry portletCategoryRegistry) {
this.portletCategoryRegistry = portletCategoryRegistry;
}
@Autowired
public void setMarketplaceService(final IMarketplaceService marketplaceService) {
this.marketplaceService = marketplaceService;
}
@Autowired
public void setAuthorizationService(IAuthorizationService authorizationService) {
this.authorizationService = authorizationService;
}
/**
* Returns a list of search results that pertain to the marketplace query is the query to search
* will search name, title, description, fname, and captions
*/
@Override
public SearchResults getSearchResults(PortletRequest request, SearchRequest query) {
final String queryString = query.getSearchTerms().toLowerCase();
final List<IPortletDefinition> portlets =
portletDefinitionRegistry.getAllPortletDefinitions();
final HttpServletRequest httpServletRequest =
this.portalRequestUtils.getPortletHttpRequest(request);
final SearchResults results = new SearchResults();
for (IPortletDefinition portlet : portlets) {
if (this.matches(
queryString,
new MarketplacePortletDefinition(
portlet, this.marketplaceService, this.portletCategoryRegistry))) {
final SearchResult result = new SearchResult();
result.setTitle(portlet.getTitle());
result.setSummary(portlet.getDescription());
result.getType().add("marketplace");
final IPortletWindow portletWindow =
this.portletWindowRegistry.getOrCreateDefaultPortletWindowByFname(
httpServletRequest, portlet.getFName());
// portletWindow is null if user does not have access to portlet.
// If user does not have browse permission, exclude the portlet.
if (portletWindow != null
&& authorizationService.canPrincipalBrowse(
authorizationService.newPrincipal(
request.getRemoteUser(), EntityEnum.PERSON.getClazz()),
portlet)) {
final IPortletWindowId portletWindowId = portletWindow.getPortletWindowId();
final IPortalUrlBuilder portalUrlBuilder =
this.portalUrlProvider.getPortalUrlBuilderByPortletFName(
httpServletRequest, portlet.getFName(), UrlType.RENDER);
final IPortletUrlBuilder portletUrlBuilder =
portalUrlBuilder.getPortletUrlBuilder(portletWindowId);
portletUrlBuilder.setWindowState(PortletUtils.getWindowState("maximized"));
result.setExternalUrl(portalUrlBuilder.getUrlString());
PortletUrl url = new PortletUrl();
url.setType(PortletUrlType.RENDER);
url.setPortletMode("VIEW");
url.setWindowState("maximized");
PortletUrlParameter actionParam = new PortletUrlParameter();
actionParam.setName("action");
actionParam.getValue().add("view");
url.getParam().add(actionParam);
PortletUrlParameter fNameParam = new PortletUrlParameter();
fNameParam.setName("fName");
fNameParam.getValue().add(portlet.getFName());
url.getParam().add(fNameParam);
result.setPortletUrl(url);
//Add the result to list to return
results.getSearchResult().add(result);
}
}
}
return results;
}
/**
* @param query
* @param portlet
* @return boolean whether query matched criteria in the marketplace portlet definition
*/
protected boolean matches(String query, MarketplacePortletDefinition portlet) {
final String lcQuery = query.toLowerCase();
return portlet.getTitle().toLowerCase().contains(lcQuery)
|| portlet.getName().toLowerCase().contains(lcQuery)
|| (portlet.getDescription() != null
&& portlet.getDescription().toLowerCase().contains(lcQuery))
|| portlet.getFName().toLowerCase().contains(lcQuery)
|| this.captionMatches(lcQuery, portlet.getScreenShots())
|| this.releaseNotesMatches(lcQuery, portlet.getPortletReleaseNotes());
}
/**
* @param query
* @param screenShots
* @return boolean whether caption matches. Used by matches method
*/
protected boolean captionMatches(String query, List<ScreenShot> screenShots) {
for (ScreenShot screenShot : screenShots) {
for (String caption : screenShot.getCaptions()) {
if (caption.toLowerCase().contains(query)) {
return true;
}
}
}
return false;
}
/**
* @param query
* @param portletReleaseNotes
* @return boolean whether releaseNotes notes matches. Used by matches method
*/
protected boolean releaseNotesMatches(String query, PortletReleaseNotes portletReleaseNotes) {
if (portletReleaseNotes.getReleaseNotes() != null) {
for (String notes : portletReleaseNotes.getReleaseNotes()) {
if (notes.toLowerCase().contains(query)) {
return true;
}
}
}
return false;
}
}