/** * 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.bdb; import java.util.Date; import java.util.LinkedList; import java.util.List; import java.util.SortedMap; import net.mad.ads.base.api.BaseContext; import net.mad.ads.base.api.EmbeddedBaseContext; 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.bdb.db.TrackDB; import net.mad.ads.base.api.track.impl.local.bdb.db.TrackView; import net.mad.ads.base.api.track.impl.local.helper.TrackKey; import net.mad.ads.base.api.utils.DateHelper; public class BDBTrackingService implements TrackingService { private String envDir = "./tmp"; private TrackDB trackdb = null; private TrackView trackView = null; @Override public void open(BaseContext context) throws ServiceException { envDir = context.get(EmbeddedBaseContext.EMBEDDED_DB_DIR, String.class, null); trackdb = new TrackDB (envDir); trackdb.open (); trackView = new TrackView (trackdb); } @Override public void close() throws ServiceException { if (trackdb != null) { trackdb.close (); } } @Override public void track(TrackEvent event) throws ServiceException { try { // TrackKey key = new TrackKey(java.util.UUID.randomUUID().toString(), DateHelper.parse(event.get(EventAttribute.TIME)).getTime()); TrackKey key = new TrackKey(java.util.UUID.randomUUID().toString(), event.getTime()); // bannerEvents.get(event.get(EventAttribute.BANNER_ID)).put(key, event); // siteEvents.get(event.get(EventAttribute.SITE)).put(key, event); this.trackView.getTrackEventsMap ().put(key, event); } catch (Exception e) { e.printStackTrace(); throw new ServiceException(e.getMessage()); } } @Override public List<TrackEvent> list(Criterion criterion, EventType type, Date from, Date to) throws ServiceException { TrackKey key1 = new TrackKey(java.util.UUID.randomUUID().toString(), from.getTime()); TrackKey key2 = new TrackKey(java.util.UUID.randomUUID().toString(), to.getTime()); SortedMap<TrackKey, TrackEvent> matchMap = this.trackView.getTrackEventsMap ().subMap(key1, true, key2, true); List<TrackEvent> matches = new LinkedList<TrackEvent>(); matches.addAll (matchMap.values ()); return matches; } @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); } TrackKey key1 = new TrackKey(java.util.UUID.randomUUID().toString(), from.getTime()); TrackKey key2 = new TrackKey(java.util.UUID.randomUUID().toString(), to.getTime()); SortedMap<TrackKey, TrackEvent> matchMap = this.trackView.getTrackEventsMap ().subMap(key1, true, key2, true); return matchMap.size(); } @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 { // TODO Auto-generated method stub } private long countClicks(Criterion criterion, Date from, Date to) throws ServiceException { String key_from = criterion.value + "_" + EventType.CLICK.getName () + "_" + from.getTime (); String key_to = criterion.value + "_" + EventType.CLICK.getName () + "_" + to.getTime (); return trackView.getTrackEventsByBanneridMap ().subMap (key_from, true, key_to, true).size (); } private long countImpressions(Criterion criterion, Date from, Date to) throws ServiceException { String key_from = criterion.value + "_" + EventType.IMPRESSION.getName () + "_" + from.getTime (); String key_to = criterion.value + "_" + EventType.IMPRESSION.getName () + "_" + to.getTime (); return trackView.getTrackEventsByBanneridMap ().subMap (key_from, true, key_to, true).size (); } }