package org.podcastpedia.web.podcasts; import org.apache.log4j.Logger; import org.podcastpedia.common.domain.Episode; import org.podcastpedia.common.domain.Podcast; import org.podcastpedia.common.exception.BusinessException; import org.podcastpedia.common.types.ErrorCodeType; import org.podcastpedia.core.podcasts.PodcastService; import org.podcastpedia.core.searching.SearchData; import org.podcastpedia.core.user.UserService; import org.springframework.beans.ConversionNotSupportedException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.security.authentication.AnonymousAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException; import javax.servlet.http.HttpServletRequest; import java.util.List; /** * Annotation-driven controller that handles requests to display podcasts in * different forms. * * @author Ama * */ @Controller public class PodcastIdentifierController { protected static Logger LOG = Logger .getLogger(PodcastIdentifierController.class); @Autowired private PodcastService podcastService; @Autowired private UserService userService; /** * Add an empty searchData object to the model */ @ModelAttribute public void addDataToModel(ModelMap model) { SearchData dataForSearchBar = new SearchData(); dataForSearchBar.setSearchMode("natural"); dataForSearchBar.setCurrentPage(1); dataForSearchBar.setQueryText(null); dataForSearchBar.setNumberResultsPerPage(10); model.put("advancedSearchData", dataForSearchBar); } /** * Custom handler for displaying a podcast. * * @param identifier * @return * @throws BusinessException */ @RequestMapping(value = "{podcastShortUrl}", method = RequestMethod.GET) public String getPodcastDetails( @PathVariable("podcastShortUrl") String identifier, ModelMap model, HttpServletRequest httpRequest) throws BusinessException { LOG.debug("------ getPodcastDetails : Received request to show details for podcast id " + identifier + " ------"); int podcastId; podcastId = podcastService.getPodcastIdForIdentifier(identifier); Podcast podcast = podcastService.getPodcastById(podcastId); // add the last episodes to be displayed under the podcast metadata List<Episode> lastEpisodes = null; if (podcast.getEpisodes().size() > 5) { lastEpisodes = podcast.getEpisodes().subList(0, 5); } else { lastEpisodes = podcast.getEpisodes(); } model.addAttribute("episodes", lastEpisodes); model.addAttribute("nr_divs_with_ratings", lastEpisodes.size()); if (podcast.getRating() == null) podcast.setRating(10f); model.addAttribute("roundedRatingScore", Math.round(podcast.getRating())); model.addAttribute("podcast", podcast); boolean userAuthenticated = SecurityContextHolder.getContext().getAuthentication() != null && SecurityContextHolder.getContext().getAuthentication().isAuthenticated() && //when Anonymous Authentication is enabled !(SecurityContextHolder.getContext().getAuthentication() instanceof AnonymousAuthenticationToken); //load in model subscription categories if user is signed in, so that she can add current podcast //to one of the categories if(userAuthenticated){ UserDetails userDetails = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); List<String> subscriptionCategories = userService.getSubscriptionCategoryNames(userDetails.getUsername()); model.addAttribute("subscriptionCategories", subscriptionCategories); } //set og_url String og_url; if(podcast.getIdentifier()!=null){ og_url = "https://www.podcastpedia.org/" + podcast.getIdentifier(); } else { og_url = "https://www.podcastpedia.org/" + podcast.getPodcastId() + "/" + podcast.getTitleInUrl(); } model.addAttribute("og_url", og_url); return "m_podcastDetails"; } @ExceptionHandler({ NoSuchRequestHandlingMethodException.class, ConversionNotSupportedException.class }) @ResponseStatus(value = HttpStatus.NOT_FOUND) public String handleResourceNotFound() { return "resourceNotFound"; } @ExceptionHandler(BusinessException.class) @ResponseStatus(value = HttpStatus.NOT_FOUND) public String handleBusinessException(BusinessException ex, HttpServletRequest request) { if (ex.getErrorCode() == ErrorCodeType.PODCAST_NOT_FOUND) { return "error_podcast_not_found_in_DB"; } else { return "resourceNotFound"; } } }