package org.sakaiproject.tool.podcasts.entityproviders; import java.util.ArrayList; import java.util.List; import lombok.Getter; import lombok.Setter; import lombok.extern.apachecommons.CommonsLog; import org.apache.commons.lang.StringUtils; import org.sakaiproject.api.app.podcasts.PodcastService; import org.sakaiproject.content.api.ContentResource; import org.sakaiproject.entity.api.ResourceProperties; 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; import org.sakaiproject.tool.api.ToolManager; /** * Entity provider for the Podcast tool */ @CommonsLog public class PodcastEntityProvider extends AbstractEntityProvider implements EntityProvider, AutoRegisterEntityProvider, ActionsExecutable, Outputable, Describeable { public final static String ENTITY_PREFIX = "podcast"; @Override public String getEntityPrefix() { return ENTITY_PREFIX; } /** * site/siteId */ @EntityCustomAction(action = "site", viewKey = EntityView.VIEW_LIST) public List<PodcastItem> getPodcastsForSite(EntityView view) { // get siteId String siteId = view.getPathSegment(2); if(log.isDebugEnabled()) { log.debug("Podcast for site " + siteId); } // check siteId supplied if (StringUtils.isBlank(siteId)) { throw new IllegalArgumentException( "siteId must be set in order to get the podcast for a site, via the URL /podcast/site/siteId"); } //check user can access this site 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); } //check user can access the tool, it might be hidden ToolConfiguration toolConfig = site.getToolForCommonId("sakai.podcasts"); if(toolConfig == null || !toolManager.isVisible(site, toolConfig)) { throw new EntityNotFoundException("No access to tool in site: " + siteId, siteId); } //get entire list of podcasts List allPodcasts; try { allPodcasts = podcastService.getPodcasts(siteId); } catch (Exception e) { throw new EntityNotFoundException("Error retrieving podcasts for site: " + siteId, siteId); } if (allPodcasts == null || allPodcasts.isEmpty()) { throw new EntityNotFoundException("No podcasts for site: " + siteId, siteId); } //filter the list of podcasts to the visible set //must pass in siteId since we are external to the tool //this also filters out the ones we cant see depending on the user permissions. It's taken care of in the impl. List<ContentResource> podcastResources = podcastService.filterPodcasts(allPodcasts, siteId); List<PodcastItem> podcastItems = new ArrayList<PodcastItem>(); for(ContentResource resource: podcastResources) { //convert to our simplified object PodcastItem item = new PodcastItem(); ResourceProperties props = resource.getProperties(); item.setTitle(props.getProperty(ResourceProperties.PROP_DISPLAY_NAME)); item.setDescription(props.getProperty(ResourceProperties.PROP_DESCRIPTION)); item.setType(props.getProperty(ResourceProperties.PROP_CONTENT_TYPE)); item.setSize(Long.parseLong(props.getProperty(ResourceProperties.PROP_CONTENT_LENGTH))); item.setUrl(resource.getUrl()); item.setReleaseDate(resource.getReleaseDate().getTime()); podcastItems.add(item); } return podcastItems; } @Override public String[] getHandledOutputFormats() { return new String[] { Formats.XML, Formats.JSON}; } @Setter private PodcastService podcastService; @Setter private SiteService siteService; @Setter private ToolManager toolManager; /** * Simplified helper class to represent an individual podcast item in a site */ public static class PodcastItem { @Getter @Setter private String title; @Getter @Setter private String description; @Getter @Setter private String url; @Getter @Setter private String type; @Getter @Setter private long size; /* note that EB turns these into millis anyway, so we might as well return them as millis */ @Getter @Setter private long releaseDate; } }