package org.podcastpedia.web.podcasts; import java.util.HashMap; import java.util.List; import java.util.Map; 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.common.util.config.ConfigService; import org.podcastpedia.web.episodes.EpisodeDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; /** * This class implements the PodcastService interface to offer the database functionality when adding podcasts * */ public class PodcastServiceImpl implements PodcastService { private static Logger LOG = Logger.getLogger(PodcastServiceImpl.class); private PodcastDao podcastDao; private EpisodeDao episodeDao; private ConfigService configService; /** ============================== implementation methods start from here on ============================== * @throws BusinessException */ @Cacheable(value="podcasts") public Podcast getPodcastById(int podcastId) throws BusinessException{ LOG.debug("executing getPodcastById"); Podcast response = null; Integer numberEpisodes = this.getNumberEpisodesForPodcast(podcastId); if(numberEpisodes == 0) { BusinessException ex = new BusinessException(ErrorCodeType.PODCAST_NOT_FOUND, "Podcast was not found in the database"); LOG.error("Podcast with id " + podcastId + " was requested but has no episodes or availability is not 200 anymore "); throw ex; } //limit is 20. If more than 20 episodes then we take separate episodes Integer nrEpLimit = Integer.valueOf(configService.getValue("LIMIT_GET_PODCAST_WITH_EPISODES")); if(numberEpisodes < nrEpLimit){ response = podcastDao.getPodcastWithEpisodesById(podcastId); } else { response = podcastDao.getPodcastById(podcastId); Map<String, Object> params = new HashMap<String, Object>(); params.put("podcastId", podcastId); params.put("count", nrEpLimit); List<Episode> lastEpisodes = episodeDao.getEpisodesForPodcastId(params); response.setEpisodes(lastEpisodes); } if(response == null){ BusinessException ex = new BusinessException(ErrorCodeType.PODCAST_NOT_FOUND, "Podcast was not found in the database"); LOG.error("Podcast with id " + podcastId + " was requested but not available anymore"); throw ex; } return response; } /** ============================== implementation methods start from here on ============================== * * @throws BusinessException */ @Cacheable(value="podcasts") public Podcast getPodcastForIdentifier(String name) throws BusinessException{ LOG.debug("executing getPodcastById"); Podcast response = null; Integer numberEpisodes = this.getNumberEpisodesForPodcastIdentifier(name); if(numberEpisodes == 0) { BusinessException ex = new BusinessException(ErrorCodeType.PODCAST_NOT_FOUND, "Podcast was not found in the database"); LOG.error("Podcast with the identifier id " + name + " was requested but has no episodes or availability is not 200 anymore "); throw ex; } //limit is 20. If more than 20 episodes then we take separate episodes Integer nrEpLimit = Integer.valueOf(configService.getValue("LIMIT_GET_PODCAST_WITH_EPISODES")); if(numberEpisodes < nrEpLimit){ response = podcastDao.getPodcastWithEpisodesByIdentifier(name); } else { response = podcastDao.getPodcastByIdentifier(name); Map<String, Object> params = new HashMap<String, Object>(); params.put("name", name); params.put("count", nrEpLimit); List<Episode> lastEpisodes = episodeDao.getEpisodesForPodcastName(params); response.setEpisodes(lastEpisodes); } if(response == null){ BusinessException ex = new BusinessException(ErrorCodeType.PODCAST_NOT_FOUND, "Podcast was not found in the database"); LOG.error("Podcast with identifier " + name + " was requested but not available anymore"); throw ex; } return response; // Integer podcastIdForShortUrl = podcastDao.getPodcastIdForIdentifier(podcastShortUrl); // if(podcastIdForShortUrl == null) { // BusinessException ex = new BusinessException(ErrorCodeType.PODCAST_NOT_FOUND, "Podcast was not found in the database"); // LOG.error("Podcast with identifier " + podcastShortUrl + " was requested but has no episodes or availability is not 200 anymore "); // throw ex; // } else { // return getPodcastById(podcastIdForShortUrl); // } } //we can't use podcast id as key in podcasts, as it is used by getPodcastDetails @Cacheable(value="podcasts", key="T(java.lang.String).valueOf(#podcastId).concat('-').concat(#root.method.name)") public Integer getNumberEpisodesForPodcast(Integer podcastId){ return podcastDao.getNumberEpisodesForPodcast(podcastId); } @Cacheable(value="podcasts", key="T(java.lang.String).valueOf(#identifier).concat('-').concat(#root.method.name)") public Integer getNumberEpisodesForPodcastIdentifier(String identifier){ return podcastDao.getNumberEpisodesForPodcastIdentifier(identifier); } public List<Podcast> getPodcastAttributesByFeedUrl(String feedUrl) { return podcastDao.getPodcastAttributesByFeedUrl(feedUrl); } public void setPodcastDao(PodcastDao podcastDao) { this.podcastDao = podcastDao; } public void setEpisodeDao(EpisodeDao episodeDao) { this.episodeDao = episodeDao; } public void setConfigService(ConfigService configService) { this.configService = configService; } }