package org.sakaiproject.web.tool.entityproviders;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.apachecommons.CommonsLog;
import org.apache.commons.lang.StringUtils;
import org.sakaiproject.entitybroker.EntityView;
import org.sakaiproject.entitybroker.entityprovider.EntityProvider;
import org.sakaiproject.entitybroker.entityprovider.annotations.EntityCustomAction;
import org.sakaiproject.entitybroker.entityprovider.capabilities.ActionsExecutable;
import org.sakaiproject.entitybroker.entityprovider.capabilities.AutoRegisterEntityProvider;
import org.sakaiproject.entitybroker.entityprovider.capabilities.Describeable;
import org.sakaiproject.entitybroker.entityprovider.capabilities.Outputable;
import org.sakaiproject.entitybroker.entityprovider.extension.Formats;
import org.sakaiproject.entitybroker.exception.EntityNotFoundException;
import org.sakaiproject.entitybroker.util.AbstractEntityProvider;
import org.sakaiproject.exception.IdUnusedException;
import org.sakaiproject.exception.PermissionException;
import org.sakaiproject.site.api.Site;
import org.sakaiproject.site.api.SiteService;
import org.sakaiproject.site.api.ToolConfiguration;
/**
* Entity provider for the Web Content tool
*/
@CommonsLog
public class WebContentEntityProvider extends AbstractEntityProvider implements EntityProvider, AutoRegisterEntityProvider, ActionsExecutable, Outputable, Describeable
{
//there may be multiple tool registrations that need to be served by this provider, list them here
private static final String[] WEB_CONTENT_TOOL_IDS = {"sakai.iframe"};
private static final String WEB_CONTENT_URL_PROP = "source";
public final static String ENTITY_PREFIX = "webcontent";
@Override
public String getEntityPrefix() {
return ENTITY_PREFIX;
}
/**
* site/siteId
*/
@EntityCustomAction(action = "site", viewKey = EntityView.VIEW_LIST)
public List<WebContentToolItem> getWebContentItemsForSite(EntityView view) {
// get siteId
String siteId = view.getPathSegment(2);
if(log.isDebugEnabled()) {
log.debug("Web content for site " + siteId);
}
// check siteId supplied
if (StringUtils.isBlank(siteId)) {
throw new IllegalArgumentException(
"siteId must be set in order to get the web content items for a site, via the URL /webcontent/site/siteId");
}
//user being logged in and having access to the site is handled in the API
Site site;
try {
site = siteService.getSiteVisit(siteId);
} catch (IdUnusedException e) {
throw new EntityNotFoundException("Invalid siteId: " + siteId, siteId);
} catch (PermissionException e) {
throw new EntityNotFoundException("No access to site: " + siteId, siteId);
}
Collection<ToolConfiguration> webContentTools = site.getTools(WEB_CONTENT_TOOL_IDS);
List<WebContentToolItem> result = new ArrayList<WebContentToolItem>();
for (ToolConfiguration t : webContentTools) {
WebContentToolItem item = new WebContentToolItem(t.getTitle(), t.getConfig().getProperty(WEB_CONTENT_URL_PROP));
result.add(item);
}
return result;
}
@Override
public String[] getHandledOutputFormats() {
return new String[] { Formats.XML, Formats.JSON};
}
@Setter
private SiteService siteService;
@AllArgsConstructor
public static class WebContentToolItem {
@Getter
private String title;
@Getter
private String url;
}
}