/**
* Copyright (C) 2013 Johannes Schnatterer
*
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*
* This file is part of nusic.
*
* nusic is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* nusic is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with nusic. If not, see <http://www.gnu.org/licenses/>.
*/
package info.schnatterer.nusic.core.impl;
import static info.schnatterer.nusic.util.DateUtil.todayMidnightUtc;
import static info.schnatterer.nusic.util.DateUtil.tomorrowMidnightUtc;
import info.schnatterer.nusic.core.PreferencesService;
import info.schnatterer.nusic.core.ReleaseService;
import info.schnatterer.nusic.core.ServiceException;
import info.schnatterer.nusic.core.i18n.CoreMessageKey;
import info.schnatterer.nusic.data.DatabaseException;
import info.schnatterer.nusic.data.dao.ArtistDao;
import info.schnatterer.nusic.data.dao.ReleaseDao;
import info.schnatterer.nusic.data.model.Release;
import java.util.Calendar;
import java.util.List;
import javax.inject.Inject;
/**
* Default implementation of {@link ReleaseService}.
*
* @author schnatterer
*
*/
public class ReleaseServiceImpl implements ReleaseService {
@Inject
private ReleaseDao releaseDao;
@Inject
private ArtistDao artistDao;
@Inject
private PreferencesService preferencesService;
@Override
public int update(Release release) throws ServiceException {
try {
return releaseDao.update(release);
} catch (DatabaseException e) {
throw new AndroidServiceException(
CoreMessageKey.ERROR_WRITING_TO_DB, e);
}
}
@Override
public void saveOrUpdate(List<Release> releases) throws ServiceException {
saveOrUpdate(releases, true);
}
@Override
public void saveOrUpdate(List<Release> releases, boolean saveArtist)
throws ServiceException {
if (releases.size() == 0) {
return;
}
for (Release release : releases) {
try {
/* Get existing artist */
if (release.getArtist() == null && saveArtist) {
if (release.getArtist().getId() == null) {
Long existingArtist = artistDao
.findIdByAndroidId(release.getArtist()
.getAndroidAudioArtistId());
if (existingArtist == null) {
artistDao.save(release.getArtist());
}
}
}
saveOrUpdate(release);
} catch (Exception e) {
throw new AndroidServiceException(
CoreMessageKey.ERROR_WRITING_TO_DB, e);
}
}
}
@Override
public long saveOrUpdate(Release release) throws ServiceException {
// Does release exist?
try {
if (release.getId() == null) {
Release existingRelease = releaseDao
.findByMusicBrainzId(release.getMusicBrainzId());
if (existingRelease != null) {
release.setId(existingRelease.getId());
// Never overwrite date created!
release.setDateCreated(existingRelease.getDateCreated());
}
}
if (release.getId() == null) {
releaseDao.save(release);
} else {
releaseDao.update(release);
}
return release.getId();
} catch (DatabaseException e) {
throw new AndroidServiceException(
CoreMessageKey.ERROR_WRITING_TO_DB, e);
}
}
@Override
public List<Release> findJustCreated() throws ServiceException {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_MONTH,
-preferencesService.getJustAddedTimePeriod());
return findByDateCreatedGreaterThan(cal.getTimeInMillis());
}
@Override
public List<Release> findByDateCreatedGreaterThan(long gtDateCreated)
throws ServiceException {
try {
return releaseDao
.findByDateCreatedGreaterThanAndIsHiddenNotTrue(gtDateCreated);
} catch (DatabaseException e) {
throw new AndroidServiceException(
CoreMessageKey.ERROR_READING_FROM_DB, e);
}
}
@Override
public List<Release> findReleasedToday() throws ServiceException {
try {
/*
* Find all releases that are released between today 00:00:00h and
* before tomorrow 00:00:00h. As the dates are strored as UTC
* values, find out the dates in UTC first.
*/
// Don't care about the order
return releaseDao
.findByReleaseDateGreaterThanEqualsAndReleaseDateLessThanAndIsHiddenNotTrue(
todayMidnightUtc(), tomorrowMidnightUtc());
} catch (DatabaseException e) {
throw new AndroidServiceException(
CoreMessageKey.ERROR_READING_FROM_DB, e);
}
}
@Override
public List<Release> findAvailableToday(boolean isAvailable)
throws ServiceException {
try {
if (isAvailable) {
return releaseDao
.findByReleaseDateGreaterThanEqualsAndReleaseDateLessThanAndIsHiddenNotTrue(
createReleaseDateLowerLimit(),
tomorrowMidnightUtc());
} else {
// Announced
return releaseDao
.findByReleaseDateGreaterThanEqualsAndIsHiddenNotTrueSortByReleaseDateAsc(tomorrowMidnightUtc());
}
} catch (DatabaseException e) {
throw new AndroidServiceException(
CoreMessageKey.ERROR_READING_FROM_DB, e);
}
}
@Override
public List<Release> findAllNotHidden() throws ServiceException {
try {
return releaseDao
.findByReleaseDateGreaterThanEqualsAndIsHiddenNotTrueSortByReleaseDateDesc(createReleaseDateLowerLimit());
} catch (DatabaseException e) {
throw new AndroidServiceException(
CoreMessageKey.ERROR_READING_FROM_DB, e);
}
}
@Override
public void showAll() throws ServiceException {
try {
releaseDao.setIsHiddenFalse();
artistDao.setIsHiddenFalse();
} catch (DatabaseException e) {
throw new AndroidServiceException(
CoreMessageKey.ERROR_WRITING_TO_DB, e);
}
}
/**
* Calculates the date where the release time period begins.<br/>
*
* Releases tha were released in the past are only downloaded and displayed
* if there were release within a certain time period. This
* {@link PreferencesService#getDownloadReleasesTimePeriod()} is relative to
* the current date and shows how many months of the past are downloaded and
* displayed. So there is a lower limit for the release date.<br/>
* All releases that were release before this limit are not displayed.
*
* @return all releases that were released before this date are not
* displayed.
*/
private long createReleaseDateLowerLimit() {
int months = preferencesService.getDownloadReleasesTimePeriod();
if (months <= 0) {
return Long.MIN_VALUE;
}
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, -months);
return cal.getTimeInMillis();
}
}