/** * 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.servlet; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.UUID; import java.util.regex.Pattern; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.mad.ads.base.api.track.events.ClickTrackEvent; import net.mad.ads.base.api.track.events.ImpressionTrackEvent; import net.mad.ads.base.api.track.events.TrackEvent; import net.mad.ads.db.db.request.AdRequest; import net.mad.ads.db.definition.BannerDefinition; import net.mad.ads.db.definition.impl.banner.image.ImageBannerDefinition; import net.mad.ads.db.enums.BannerFormat; import net.mad.ads.db.enums.BannerType; import net.mad.ads.server.utils.RuntimeContext; import net.mad.ads.server.utils.context.AdContext; import net.mad.ads.server.utils.filter.ClickExpirationFilter; import net.mad.ads.server.utils.filter.DuplicatBannerFilter; import net.mad.ads.server.utils.filter.ViewExpirationFilter; import net.mad.ads.server.utils.helper.TrackingHelper; import net.mad.ads.server.utils.http.listener.AdContextListener; import net.mad.ads.server.utils.renderer.impl.ExternBannerDefinitionRenderer; import net.mad.ads.server.utils.renderer.impl.FlashBannerDefinitionRenderer; import net.mad.ads.server.utils.renderer.impl.ExpandableImageBannerDefinitionRenderer; import net.mad.ads.server.utils.renderer.impl.ImageBannerDefinitionRenderer; import net.mad.ads.server.utils.request.RequestHelper; import net.mad.ads.server.utils.selection.BannerProvider; import net.mad.ads.server.utils.selection.BannerSelector; import net.mad.ads.server.utils.selection.impl.RandomSingleBannerSelector; /** * Servlet implementation class AdSelect */ public class AdSelect extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } private void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/javascript;charset=UTF-8"); try { AdContext context = AdContextListener.ADCONTEXT.get(); // Type // String type = (String)request.getParameter(RequestHelper.type); // if (type == null || type.equals("")) { // type = "1"; // } /* * Aus den restlichen Bannern eins auswählen * * Aktuell wird dies zufällig gemacht! */ BannerDefinition banner = BannerProvider.getInstance().getBanner(context, request); StringBuilder sb = new StringBuilder(); if (banner != null) { /* * Hier wird der Type des Banners verwendet und nicht der Typ der im * Request Übergeben wird, da bei der Auswahl des Banners evtl. ein * Fallback auf einen anderen BannerType erfolgen kann. * z.B. Flashbanner auf Imagebanner * */ if (banner.getType().equals(BannerType.EXTERN)) { sb.append(ExternBannerDefinitionRenderer.getInstance().render(banner, request)); } else if (banner.getType().equals(BannerType.IMAGE)) { sb.append(ImageBannerDefinitionRenderer.getInstance().render(banner, request)); } else if (banner.getType().equals(BannerType.FLASH)) { sb.append(FlashBannerDefinitionRenderer.getInstance().render(banner, request)); } else if (banner.getType().equals(BannerType.EXPANDABLEIMAGE)) { sb.append(ExpandableImageBannerDefinitionRenderer.getInstance().render(banner, request)); } TrackEvent trackEvent = new ImpressionTrackEvent(); trackEvent.setBannerId(banner.getId()); trackEvent.setCampaign(""); trackEvent.setUser(context.getUserid()); trackEvent.setId(UUID.randomUUID().toString()); trackEvent.setTime(System.currentTimeMillis()); trackEvent.setIp(context.getIp()); if (context.getSlot() != null) { trackEvent.setSite(context.getSlot().getSite()); } else { trackEvent.setSite("NONE_PAGE"); } TrackingHelper.trackEvent(context, trackEvent); TrackingHelper.trackImpression(context, trackEvent); /* * Hier merken wir uns das Banner für diesen Request um später * im DuplicateBannerFilter die Information verwenden zu können * * Als Request gelten alle Aufrufe, die durch den selben Pageview erzeugt werden */ RuntimeContext.getRequestBanners().put("pv" + context.getRequestid() + "_" + banner.getId(), Boolean.TRUE); /* * Hier merken wir uns, dass ein Benutzer das Banner schon gesehen hat. * Auf diese Art kann später z.B. geregelt werden, dass ein USER ein Banner maximal 5 mal sehen soll * * TODO: hier muss noch die TimeToLife für das Cacheobjekte gesetzt werden */ RuntimeContext.getRequestBanners().put("u" + context.getUserid() + "_" + banner.getId(), Boolean.TRUE); /* * Damit wir später die passenden Banner für die Produkte anzeigen können, merken wir uns auch das Produkt */ if (banner.isProduct()) { RuntimeContext.getRequestBanners().put("prod" + context.getRequestid() + "_" + banner.getProduct(), Boolean.TRUE); } } response.getWriter().write(sb.toString()); } catch (Exception e) { e.printStackTrace(); } } }