package io.monokkel.actors; import akka.actor.Props; import akka.actor.UntypedActor; import com.google.common.collect.Sets; import io.monokkel.messages.AddUrlsToVisitedSet; import io.monokkel.messages.IsUrlVisitedBefore; import io.monokkel.messages.UrlAdded; import io.monokkel.messages.UrlIsNotVisitedBefore; import org.slf4j.LoggerFactory; import java.util.Collections; import java.util.List; import java.util.Set; import java.util.stream.Collectors; /** * Created by tarjei on 28/05/14. */ public class UrlVisitedActor extends UntypedActor { private static final Integer DISABLED_MAX_DEPTH = -1; private org.slf4j.Logger log = LoggerFactory.getLogger(UrlVisitedActor.class); public static Props props() { return Props.create(UrlVisitedActor.class, UrlVisitedActor::new); } private Set<String> urlVisitedRepo = Collections.synchronizedSet(Sets.newHashSet()); @Override public void onReceive(Object message) throws Exception { if (message instanceof IsUrlVisitedBefore) { IsUrlVisitedBefore isUrlVisitedBefore = (IsUrlVisitedBefore) message; final List<String> urls = isUrlVisitedBefore.getUrls(); log.debug("Urls are tested {}", urls); final boolean disabled = isUrlVisitedBefore.getMaxDepth().equals(DISABLED_MAX_DEPTH); if (isUrlVisitedBefore.getDepth() < isUrlVisitedBefore.getMaxDepth() || disabled) { final List<String> urlsToVisit = urls.parallelStream().filter(url -> !urlVisitedRepo.contains(url)).collect(Collectors.toList()); log.debug("Urls to visit {}", urlsToVisit); getSender().tell(new UrlIsNotVisitedBefore(urlsToVisit, isUrlVisitedBefore.getDepth(), isUrlVisitedBefore.getMaxDepth()), getSelf()); } else { log.debug("Url hit max depth settings at depth {}",isUrlVisitedBefore.getDepth()); } } else if (message instanceof AddUrlsToVisitedSet) { AddUrlsToVisitedSet addUrlsToVisitedSet = (AddUrlsToVisitedSet) message; final List<String> urls = addUrlsToVisitedSet.getUrls(); urlVisitedRepo.addAll(urls); getSender().tell(new UrlAdded(), getSender()); } else { unhandled(message); } } }