package io.monokkel.actors;
import akka.actor.Props;
import akka.actor.UntypedActor;
import io.monokkel.core.api.ResponseParser;
import io.monokkel.domain.PageData;
import io.monokkel.messages.ParseResponse;
import io.monokkel.messages.ParserDone;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
/**
* Created by tarjei on 28/05/14.
* <p/>
* This parser actor is designed to parse output and extract data
*/
public class ParserActor extends UntypedActor {
private final ResponseParser responseParser;
private Logger log = LoggerFactory.getLogger(ParserActor.class);
public ParserActor(final ResponseParser responseParser) {
this.responseParser = responseParser;
}
public static Props props(final ResponseParser responseParser) {
return Props.create(ParserActor.class, () -> new ParserActor(responseParser));
}
@Override
public void onReceive(Object message) throws Exception {
if (message instanceof ParseResponse) {
ParseResponse parseResponse = (ParseResponse) message;
final List<String> typesFromTheResponseHeader = parseResponse.getTypesFromTheResponseHeader();
final String url = parseResponse.getUrl();
final String response = parseResponse.getResponse();
final boolean shouldParse = responseParser.shouldParse(url, response, typesFromTheResponseHeader);
if (shouldParse) {
final Long timeStamp = parseResponse.getTimeStamp();
final PageData pageData = responseParser.parse(url, response, timeStamp);
getSender().tell(new ParserDone(pageData, parseResponse.getDepth(), parseResponse.getMaxDepth()), getSelf());
} else {
log.debug("The url {} was not possible to parse by {}. The headers that was returned: {}", url, responseParser.toString(), typesFromTheResponseHeader);
}
} else {
unhandled(message);
}
}
}