/**
* Mad-Advertisement
* Copyright (C) 2011 Thorsten Marx <thmarx@gmx.net>
*
* This program 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.
*
* This program 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
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package net.mad.ads.server.utils.filter;
import java.util.Calendar;
import java.util.Locale;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Predicate;
import net.mad.ads.base.api.exception.ServiceException;
import net.mad.ads.base.api.track.Criterion;
import net.mad.ads.base.api.track.events.EventType;
import net.mad.ads.db.definition.BannerDefinition;
import net.mad.ads.db.definition.condition.ViewExpirationConditionDefinition;
import net.mad.ads.db.enums.ConditionDefinitions;
import net.mad.ads.db.enums.ExpirationResolution;
import net.mad.ads.server.utils.RuntimeContext;
/**
* Filter zum entfernen von Bannern, die die konfigurierte Anzeigehäufigkeit
* für einen bestimmten Zeitraum schon erreicht oder überschritten haben
*
* @author tmarx
*
*/
public class ViewExpirationFilter implements Predicate<BannerDefinition> {
private static final Logger logger = LoggerFactory.getLogger(ViewExpirationFilter.class);
// private static final ViewExpirationFilter FILTER = new ViewExpirationFilter();
//
// public static final Predicate<BannerDefinition> getFilter () {
// return FILTER;
// }
@Override
public boolean apply(BannerDefinition banner) {
// Banner enth�lt keine View-Beschr�nkung
if (!banner.hasConditionDefinition(ConditionDefinitions.VIEW_EXPIRATION)){
return true;
} else if (RuntimeContext.getTrackService() == null) {
return true;
}
/*
* 1. Prüfen, ob die Impressions f�r diesen Monat schon erreicht wurden
* 2. Prüfen, ob die Impressions f�r diese Woche schon erreicht wurden
* 3. Prüfen, ob die Impressions f�r diesen Tag schon erreicht wurden
*/
ViewExpirationConditionDefinition def = (ViewExpirationConditionDefinition) banner.getConditionDefinition(ConditionDefinitions.VIEW_EXPIRATION);
try {
if (def.getViewExpirations().containsKey(ExpirationResolution.MONTH)) {
Calendar from = Calendar.getInstance(Locale.GERMANY);
from.set(Calendar.HOUR_OF_DAY, 0);
from.set(Calendar.MINUTE, 0);
from.set(Calendar.SECOND, 0);
from.set(Calendar.MILLISECOND, 0);
Calendar to = Calendar.getInstance(Locale.GERMANY);
to.set(Calendar.HOUR_OF_DAY, 23);
to.set(Calendar.MINUTE, 59);
to.set(Calendar.SECOND, 59);
to.set(Calendar.MILLISECOND, 999);
int maxviews = def.getViewExpirations().get(ExpirationResolution.MONTH);
long impressions = RuntimeContext.getTrackService().count(new Criterion(Criterion.Criteria.Banner, banner.getId()), EventType.IMPRESSION, from.getTime(), to.getTime());
if (impressions <= maxviews) {
return true;
}
}
if (def.getViewExpirations().containsKey(ExpirationResolution.WEEK)) {
Calendar from = Calendar.getInstance(Locale.GERMANY);
from.set(Calendar.HOUR_OF_DAY, 0);
from.set(Calendar.MINUTE, 0);
from.set(Calendar.SECOND, 0);
from.set(Calendar.MILLISECOND, 0);
from.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
Calendar to = Calendar.getInstance(Locale.GERMANY);
to.set(Calendar.HOUR_OF_DAY, 23);
to.set(Calendar.MINUTE, 59);
to.set(Calendar.SECOND, 59);
to.set(Calendar.MILLISECOND, 999);
to.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
int maxviews = def.getViewExpirations().get(ExpirationResolution.MONTH);
long impressions = RuntimeContext.getTrackService().count(new Criterion(Criterion.Criteria.Banner, banner.getId()), EventType.IMPRESSION, from.getTime(), to.getTime());
if (impressions <= maxviews) {
return true;
}
}
if (def.getViewExpirations().containsKey(ExpirationResolution.DAY)) {
Calendar from = Calendar.getInstance(Locale.GERMANY);
from.set(Calendar.HOUR_OF_DAY, 0);
from.set(Calendar.MINUTE, 0);
from.set(Calendar.SECOND, 0);
from.set(Calendar.MILLISECOND, 0);
from.set(Calendar.DAY_OF_MONTH, 1);
Calendar to = Calendar.getInstance(Locale.GERMANY);
int lastDate = to.getActualMaximum(Calendar.DATE);
to.set(Calendar.DATE, lastDate);
to.set(Calendar.HOUR_OF_DAY, 23);
to.set(Calendar.MINUTE, 59);
to.set(Calendar.SECOND, 59);
to.set(Calendar.MILLISECOND, 999);
int maxviews = def.getViewExpirations().get(ExpirationResolution.MONTH);
long impressions = RuntimeContext.getTrackService().count(new Criterion(Criterion.Criteria.Banner, banner.getId()), EventType.IMPRESSION, from.getTime(), to.getTime());
if (impressions <= maxviews) {
return true;
}
}
} catch (ServiceException e) {
logger.error("", e);
}
return false;
}
}