/**
* 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 com.google.common.collect.ImmutableSet;
import java.util.Set;
import org.apereo.portal.portlet.om.IPortletDefinition;
import org.apereo.portal.portlet.om.PortletCategory;
import org.apereo.portal.rest.layout.MarketplaceEntry;
import org.apereo.portal.security.IAuthorizationPrincipal;
import org.apereo.portal.security.IPerson;
/**
* Marketplace service layer responsible for gathering and applying policy about what Marketplace
* entries and categories ought to be available to a given user.
*
* @since 4.1
*/
public interface IMarketplaceService {
/**
* Return the Marketplace entries visible to the user. Marketplace entries are visible to the
* user when the user enjoys permission for the UP_PORTLET_SUBSCRIBE.BROWSE or
* UP_PORTLET_PUBLISH.MANAGE activity on the portlet entity.
*
* @param user The non-null user
* @param categories Restricts the output to entries within the specified categories if
* non-empty
* @throws IllegalArgumentException when passed in user is null
* @since 4.2
*/
ImmutableSet<MarketplaceEntry> browseableMarketplaceEntriesFor(
IPerson user, final Set<PortletCategory> categories);
/**
* Return the potentially empty Set of portlet categories such that 1. the user has BROWSE (or
* MANAGE implying BROWSE) permission on the **category**, and 2. the user has BROWSE (or MANAGE
* implying BROWSE) permission on at least one portlet in that category. (That is, the category
* is not "empty" from the perspective of this user browsing).
*
* @param user non-null user
* @param categories Restricts the output to entries within the specified categories if
* non-empty
* @return potentially empty non-null Set of browseable categories
* @since 4.1
*/
Set<PortletCategory> browseableNonEmptyPortletCategoriesFor(
IPerson user, final Set<PortletCategory> categories);
/**
* Answers whether the given user may browse the portlet marketplace entry for the given portlet
* definition.
*
* @param principal A non-null IPerson who might be permitted to browse the entry
* @param portletDefinition A non-null portlet definition the Marketplace entry of which the
* user might browse
* @return true if permitted, false otherwise
* @throws IllegalArgumentException If user is null
* @throws IllegalArgumentException If portletDefinition is null
* @since 4.1
*/
boolean mayBrowsePortlet(
IAuthorizationPrincipal principal, IPortletDefinition portletDefinition);
/**
* Provides the potentially empty non-null Set of featured Marketplace entries for the user.
*
* <p>The user MUST have BROWSE permission on all members of the Set.
*
* @param user the non-null user for whom featured portlets are desired.
* @param categories Restricts the output to entries within the specified categories if
* non-empty
* @return non-null potentially empty Set of featured portlet MarketplaceEntries.
* @since 4.2
*/
Set<MarketplaceEntry> featuredEntriesForUser(
IPerson user, final Set<PortletCategory> categories);
/**
* Provides a {@link MarketplacePortletDefinition} object that corresponds to the specified
* portlet definition. Implementations of IMarketplaceService may cache these objects to-taste.
*
* @param portletDefinition A valid {@link IPortletDefinition}
* @return A {@link MarketplacePortletDefinition} wrapping the specified portlet definition.
*/
MarketplacePortletDefinition getOrCreateMarketplacePortletDefinition(
IPortletDefinition portletDefinition);
/**
* Provides a {@link MarketplacePortletDefinition} object that corresponds to the specified
* portlet definition. Implementations of IMarketplaceService may cache these objects to-taste.
*
* @param fname a valid fname of a portlet
* @return A {@link MarketplacePortletDefinition} wrapping the specified portlet definition.
*/
MarketplacePortletDefinition getOrCreateMarketplacePortletDefinitionIfTheFnameExists(
String fname);
/**
* Answers whether the given user may add the portlet to their layout
*
* @param user a non-null IPerson who might be permitted to add
* @param portletDefinition a non-null portlet definition
* @return true if permitted, false otherwise
* @throws IllegalArgumentException if user is null
* @throws IllegalArgumentException if portletDefinition is null
* @since 4.2
*/
boolean mayAddPortlet(final IPerson user, final IPortletDefinition portletDefinition);
}