/** * 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.base.api.track.impl.local; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import net.mad.ads.base.api.BaseContext; import net.mad.ads.base.api.exception.ServiceException; import net.mad.ads.base.api.track.Criterion; import net.mad.ads.base.api.track.TrackingService; import net.mad.ads.base.api.track.events.EventAttribute; import net.mad.ads.base.api.track.events.EventType; import net.mad.ads.base.api.track.events.TrackEvent; import net.mad.ads.base.api.track.impl.local.helper.TrackKey; import net.mad.ads.base.api.track.impl.local.helper.TrackTree; import net.mad.ads.base.api.track.impl.local.helper.UUIDHelper; import net.mad.ads.common.util.CollectionUtils; import net.mad.ads.base.api.utils.DateHelper; /** * Eine lokale Implementierung zum tracken von Events, es wird keine Datenbank benötigt * Diese Implementierung eignet sich für die Entwicklung oder ganz ganz kleine Installationen mit wenig traffic * * @author tmarx * */ public class LocalTrackService implements TrackingService { private static final Logger logger = LoggerFactory.getLogger(LocalTrackService.class); private Map<String, TrackTree<TrackEvent>> siteEvents = new HashMap<String, TrackTree<TrackEvent>>(); private Map<String, TrackTree<TrackEvent>> bannerEvents = new HashMap<String, TrackTree<TrackEvent>>(); // public static final SimpleDateFormat dformat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.GERMANY); @Override public void open(BaseContext context) throws ServiceException { } @Override public void close() throws ServiceException { } @Override public void track(TrackEvent event) throws ServiceException { if (!bannerEvents.containsKey(event.get(EventAttribute.BANNER_ID))) { bannerEvents.put(event.get(EventAttribute.BANNER_ID), new TrackTree<TrackEvent>(1000)); } if (!siteEvents.containsKey(event.get(EventAttribute.SITE))) { siteEvents.put(event.get(EventAttribute.SITE), new TrackTree<TrackEvent>(1000)); } try { TrackKey key = new TrackKey(java.util.UUID.randomUUID().toString(), DateHelper.parse(event.get(EventAttribute.TIME)).getTime()); bannerEvents.get(event.get(EventAttribute.BANNER_ID)).put(key, event); siteEvents.get(event.get(EventAttribute.SITE)).put(key, event); } catch (Exception e) { logger.error("", e); throw new ServiceException(e.getMessage()); } } @Override public List<TrackEvent> list(Criterion criterion, EventType type, Date from, Date to) throws ServiceException { if (siteEvents.containsKey(criterion.value)) { TrackKey key1 = new TrackKey(java.util.UUID.randomUUID().toString(), from.getTime()); TrackKey key2 = new TrackKey(java.util.UUID.randomUUID().toString(), to.getTime()); return siteEvents.get(criterion.value).list(key1, key2); } return null; } @Override public long count(Criterion criterion, EventType type, Date from, Date to) throws ServiceException { if (type.equals(EventType.CLICK)) { return countClicks(criterion, from, to); } else if (type.equals(EventType.IMPRESSION)) { return countImpressions(criterion, from, to); } if (siteEvents.containsKey(criterion.value)) { TrackKey key1 = new TrackKey(java.util.UUID.randomUUID().toString(), from.getTime()); TrackKey key2 = new TrackKey(java.util.UUID.randomUUID().toString(), to.getTime()); return siteEvents.get(criterion.value).count(key1, key2); } return 0; } @Override public void delete(Criterion criterion, Date from, Date to) throws ServiceException { // TODO Auto-generated method stub } @Override public void clear(Criterion criterion) throws ServiceException { if (siteEvents.containsKey(criterion.value)) { siteEvents.get(criterion.value).clear(); } } private long countClicks(Criterion criterion, Date from, Date to) throws ServiceException { if (bannerEvents.containsKey(criterion.value)) { TrackKey key1 = new TrackKey(java.util.UUID.randomUUID().toString(), from.getTime()); TrackKey key2 = new TrackKey(java.util.UUID.randomUUID().toString(), to.getTime()); List<TrackEvent> result = bannerEvents.get(criterion.value).list(key1, key2); result = (List<TrackEvent>) CollectionUtils.filter(result, new CollectionUtils.Predicate<TrackEvent>() { @Override public boolean apply(TrackEvent event) { if (event.getType().equals(EventType.CLICK)) { return true; } return false; } }); return result.size(); } return 0; } private long countImpressions(Criterion criterion, Date from, Date to) throws ServiceException { if (bannerEvents.containsKey(criterion.value)) { TrackKey key1 = new TrackKey(java.util.UUID.randomUUID().toString(), from.getTime()); TrackKey key2 = new TrackKey(java.util.UUID.randomUUID().toString(), to.getTime()); List<TrackEvent> result = bannerEvents.get(criterion.value).list(key1, key2); result = (List<TrackEvent>) CollectionUtils.filter(result, new CollectionUtils.Predicate<TrackEvent>() { @Override public boolean apply(TrackEvent event) { if (event.getType().equals(EventType.IMPRESSION)) { return true; } return false; } }); return result.size(); } return 0; } }