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);
}
}
}