package org.podcastpedia.web.startpage;
import org.podcastpedia.common.domain.Podcast;
import org.podcastpedia.common.types.LanguageCode;
import org.podcastpedia.common.util.config.ConfigService;
import org.podcastpedia.core.startpage.StartPageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.MessageSourceAware;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.context.request.WebRequest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
/**
* Controller class that maps to feeds service generation, for both the start page feeds, and search results generated
* feeds.
*
* @author amasia
*
*/
@Controller
@RequestMapping("/feeds")
public class StartPageFeedsController implements MessageSourceAware {
private static String[] preferredLanguages = {"en", "fr", "de" };
private MessageSource messageSource;
@Autowired
private ConfigService configService;
public void setMessageSource(MessageSource messageSource) {
this.messageSource = messageSource;
}
private static final Integer NUMBER_OF_PODCASTS_IN_CHART = 5;
@Autowired
private StartPageService startPageService;// this has to be changed in the interface
/**
* Returns top rated list of podcasts to be generated as an atom feed.
* Request comes from start page.
*
* @param request
* @param model
* @return
*/
@RequestMapping("most_popular.atom")
public String getTopRatedPodcastsAtomFeed(WebRequest request, Model model) {
Locale locale = LocaleContextHolder.getLocale();
model.addAttribute("list_of_podcasts", getTopRatedPodcastsForLocale(locale));
model.addAttribute("feed_id", "tags:podcastpedia.org,2013-04-30:most_popular");
model.addAttribute("feed_title", messageSource.getMessage("podcasts.most_popular.feed_title", null, locale));
model.addAttribute("feed_description", messageSource.getMessage("podcasts.most_popular.feed_description", null, locale));
model.addAttribute("feed_link", configService.getValue("HOST_AND_PORT_URL"));
model.addAttribute("HOST_AND_PORT_URL", configService.getValue("HOST_AND_PORT_URL"));
return "topRatedPodcastsAtomFeedView";
}
/**
* Returns a list of top rated podcasts to be generated as an rss feed.
* Request comes from start page.
*
* @param model
* @return
*/
@RequestMapping("most_popular.rss")
public String getTopRatedPodcastsRssFeed(Model model) {
Locale locale = LocaleContextHolder.getLocale();
model.addAttribute("list_of_podcasts", getTopRatedPodcastsForLocale(locale));
model.addAttribute("feed_title", messageSource.getMessage("podcasts.most_popular.feed_title", null, locale));
model.addAttribute("feed_description", messageSource.getMessage("podcasts.most_popular.feed_description", null, locale));
model.addAttribute("feed_link", configService.getValue("HOST_AND_PORT_URL"));
model.addAttribute("HOST_AND_PORT_URL", configService.getValue("HOST_AND_PORT_URL"));
return "topRatedPodcastsRssFeedView";
}
private List<Podcast> getTopRatedPodcastsForLocale(Locale locale){
String language = locale.getLanguage();
List<String> preferredLanguagesList = Arrays.asList(preferredLanguages);
List<Podcast> topRatedPodcasts;
if(preferredLanguagesList.contains(language)){
topRatedPodcasts = startPageService.getTopRatedPodcastsWithLanguage(LanguageCode.get(language), NUMBER_OF_PODCASTS_IN_CHART);
} else {
topRatedPodcasts = startPageService.getTopRatedPodcasts(NUMBER_OF_PODCASTS_IN_CHART);
}
return topRatedPodcasts;
}
/**
* Returns list of recommended podcasts to be generated as a rss feed.
* Request comes from start page.
*
* @param request
* @param model
* @return
*/
@RequestMapping("recommended.atom")
public String getRecommendedPodcastsAtomFeed(WebRequest request, Model model) {
List<Podcast> recommendedList = new ArrayList<Podcast>();
recommendedList = startPageService.getRecommendedPodcasts();
model.addAttribute("list_of_podcasts", recommendedList);
model.addAttribute("feed_id", "tags:podcastpedia.org,2013-04-30:recommended");
model.addAttribute("feed_title", messageSource.getMessage("podcasts.recommended.feed_title", null, LocaleContextHolder.getLocale()));
model.addAttribute("feed_description", messageSource.getMessage("podcasts.recommended.feed_description", null, LocaleContextHolder.getLocale()));
model.addAttribute("feed_link", configService.getValue("HOST_AND_PORT_URL"));
model.addAttribute("HOST_AND_PORT_URL", configService.getValue("HOST_AND_PORT_URL"));
return "recommendedPodcastsAtomFeedView";
}
/**
* Returns list of recommended podcasts to be generated as a rss feed.
* Request comes from start page.
*
* @param request
* @param model
* @return
*/
@RequestMapping("recommended.rss")
public String getRecommendedPodcastsRssFeed(Model model) {
List<Podcast> recommendedList = new ArrayList<Podcast>();
recommendedList = startPageService.getRecommendedPodcasts();
model.addAttribute("list_of_podcasts", recommendedList);
model.addAttribute("feed_title", messageSource.getMessage("podcasts.recommended.feed_title", null, LocaleContextHolder.getLocale()));
model.addAttribute("feed_description", messageSource.getMessage("podcasts.recommended.feed_description", null, LocaleContextHolder.getLocale()));
model.addAttribute("feed_link", configService.getValue("HOST_AND_PORT_URL"));
model.addAttribute("HOST_AND_PORT_URL", configService.getValue("HOST_AND_PORT_URL"));
return "recommendedPodcastsRssFeedView";
}
/**
* Returns list of newest podcasts to be generated as a atom feed.
* Request comes from start page.
*
* @param request
* @param model
* @return
*/
@RequestMapping("newest.atom")
public String getNewestPodcastsAtomFeed(WebRequest request, Model model) {
Locale locale = LocaleContextHolder.getLocale();
model.addAttribute("list_of_podcasts", getNewestPodcastsForLocale(locale));
model.addAttribute("feed_id", "tags:podcastpedia.org,2013-04-30:last_updated");
model.addAttribute("feed_title", messageSource.getMessage("podcasts.newest.feed_title", null, locale));
model.addAttribute("feed_description", messageSource.getMessage("podcasts.newest.feed_description", null, locale));
model.addAttribute("feed_link", configService.getValue("HOST_AND_PORT_URL"));
model.addAttribute("HOST_AND_PORT_URL", configService.getValue("HOST_AND_PORT_URL"));
return "newestPodcastsAtomFeedView";
}
/**
* Returns list of newest podcasts to be generated as a rss feed.
* Request comes from start page.
*
* @param model
* @return
*/
@RequestMapping("newest.rss")
public String getNewestPodcastsRssFeed(Model model) {
Locale locale = LocaleContextHolder.getLocale();
model.addAttribute("list_of_podcasts", getNewestPodcastsForLocale(locale));
model.addAttribute("feed_title", messageSource.getMessage("podcasts.newest.feed_title", null, LocaleContextHolder.getLocale()));
model.addAttribute("feed_description", messageSource.getMessage("podcasts.newest.feed_description", null, LocaleContextHolder.getLocale()));
model.addAttribute("feed_link", configService.getValue("HOST_AND_PORT_URL"));
model.addAttribute("HOST_AND_PORT_URL", configService.getValue("HOST_AND_PORT_URL"));
return "newestPodcastsRssFeedView";
}
private List<Podcast> getNewestPodcastsForLocale(Locale locale){
String language = locale.getLanguage();
List<String> preferredLanguagesList = Arrays.asList(preferredLanguages);
List<Podcast> lastUpdatedPodcasts;
if(preferredLanguagesList.contains(language)){
lastUpdatedPodcasts = startPageService.getLastUpdatedPodcasts(LanguageCode.get(language));
} else {
lastUpdatedPodcasts = startPageService.getLastUpdatedPodcasts();
}
return lastUpdatedPodcasts;
}
/**
* Returns list of random podcasts to be generated as a atom feed.
* Request comes from start page.
*
* @param request
* @param model
* @return
*/
@RequestMapping("random.atom")
public String getRandomPodcastsAtomFeed(WebRequest request, Model model) {
List<Podcast> randomPodcasts = new ArrayList<Podcast>();
randomPodcasts = startPageService.getRandomPodcasts(NUMBER_OF_PODCASTS_IN_CHART);
model.addAttribute("list_of_podcasts", randomPodcasts);
model.addAttribute("feed_id", "tags:podcastpedia.org,2013-04-30:random_podcasts");
model.addAttribute("feed_title", messageSource.getMessage("podcasts.random.feed_title", null, LocaleContextHolder.getLocale()));
model.addAttribute("feed_description", messageSource.getMessage("podcasts.random.feed_description", null, LocaleContextHolder.getLocale()));
model.addAttribute("feed_link", configService.getValue("HOST_AND_PORT_URL"));
model.addAttribute("HOST_AND_PORT_URL", configService.getValue("HOST_AND_PORT_URL"));
return "randomPodcastsAtomFeedView";
}
/**
* Returns list of random podcasts to be generated as a rss feed.
* Request comes from start page.
*
* @param model
* @return
*/
@RequestMapping("random.rss")
public String getRandomPodcastsRssFeed(Model model) {
List<Podcast> randomPodcasts = new ArrayList<Podcast>();
randomPodcasts = startPageService.getRandomPodcasts(NUMBER_OF_PODCASTS_IN_CHART);
model.addAttribute("list_of_podcasts", randomPodcasts);
model.addAttribute("feed_title", messageSource.getMessage("podcasts.random.feed_title", null, LocaleContextHolder.getLocale()));
model.addAttribute("feed_description", messageSource.getMessage("podcasts.random.feed_description", null, LocaleContextHolder.getLocale()));
model.addAttribute("feed_link", configService.getValue("HOST_AND_PORT_URL"));
model.addAttribute("HOST_AND_PORT_URL", configService.getValue("HOST_AND_PORT_URL"));
return "randomPodcastsRssFeedView";
}
/**
* Returns list of newest podcasts to be generated as a atom feed.
* Request comes from start page.
*
* @param request
* @param model
* @return
*/
@RequestMapping("new-entries.atom")
public String getNewEntriesAtomFeed(WebRequest request, Model model) {
Locale locale = LocaleContextHolder.getLocale();
model.addAttribute("list_of_podcasts", startPageService.getNewEntries());
model.addAttribute("feed_id", "tags:podcastpedia.org,2013-04-30:last_updated");
model.addAttribute("feed_title", messageSource.getMessage("podcasts.new_entries.feed_title", null, locale));
model.addAttribute("feed_description", messageSource.getMessage("podcasts.new_entries.feed_description", null, locale));
model.addAttribute("feed_link", configService.getValue("HOST_AND_PORT_URL"));
model.addAttribute("HOST_AND_PORT_URL", configService.getValue("HOST_AND_PORT_URL"));
return "newEntriesPodcastsAtomFeedView";
}
/**
* Returns list of newest podcasts to be generated as a rss feed.
* Request comes from start page.
*
* @param model
* @return
*/
@RequestMapping("new-entries.rss")
public String getNewEntriesRssFeed(Model model) {
Locale locale = LocaleContextHolder.getLocale();
model.addAttribute("list_of_podcasts", startPageService.getNewEntries());
model.addAttribute("feed_title", messageSource.getMessage("podcasts.new_entries.feed_title", null, locale));
model.addAttribute("feed_description", messageSource.getMessage("podcasts.new_entries.feed_description", null, locale));
model.addAttribute("feed_link", configService.getValue("HOST_AND_PORT_URL"));
model.addAttribute("HOST_AND_PORT_URL", configService.getValue("HOST_AND_PORT_URL"));
return "newEntriesPodcastsRssFeedView";
}
public void setConfigService(ConfigService configService) {
this.configService = configService;
}
public void setStartPageService(StartPageService startPageService) {
this.startPageService = startPageService;
}
}