package org.limewire.promotion.impressions; import java.util.Date; import java.util.HashSet; import java.util.Hashtable; import java.util.Map; import java.util.Set; import org.limewire.promotion.containers.PromotionMessageContainer; import com.google.inject.Singleton; @Singleton public final class ImpressionsCollectorImpl implements ImpressionsCollector { private Map<String, UserQueryEvent> queries = new Hashtable<String, UserQueryEvent>(); public Set<UserQueryEvent> getCollectedImpressions() { synchronized (queries) { return new HashSet<UserQueryEvent>(queries.values()); } } /* * We store the impression into a query event, and store that event in our * queries map. If the event doesn't yet exist, create it. */ public void recordImpression(final String originalQuery, final Date timeQueried, final Date timeShown, final PromotionMessageContainer promo, final String binderUniqueName) { UserQueryEvent event = queries.get(getMapKey(originalQuery, timeQueried)); synchronized (queries) { if (event == null) { event = new UserQueryEvent(originalQuery, timeQueried); queries.put(getMapKey(originalQuery, timeQueried), event); } event.addImpression(new Impression(promo, binderUniqueName, timeShown)); } } /** The key we use to store/retrieve. */ private String getMapKey(final String originalQuery, final Date timeQueried) { return originalQuery + ":" + timeQueried.getTime(); } public void removeImpressions(final Set<UserQueryEvent> events) { synchronized (queries) { for (UserQueryEvent event : events) queries.remove(getMapKey(event.getOriginalQuery(), event.getOriginalQueryTime())); } } }