DefaultHtmlFetcherService.java
package com.wilzwert.myjobs.core.domain.shared.ports.driven.fetcher.impl;
import com.wilzwert.myjobs.core.domain.shared.exception.NoHtmlFetcherException;
import com.wilzwert.myjobs.core.domain.shared.ports.driven.fetcher.HtmlFetcher;
import com.wilzwert.myjobs.core.domain.shared.ports.driven.fetcher.HtmlFetcherService;
import java.util.*;
/**
* @author Wilhelm Zwertvaegher
*/
public class DefaultHtmlFetcherService implements HtmlFetcherService {
protected List<HtmlFetcher> fetchers;
private boolean isDefault;
/**
* The default fetchers list is empty because HtmlFetchers MUST be implemented in infra
*/
public DefaultHtmlFetcherService() {
fetchers = new ArrayList<>();
isDefault = true;
}
/**
* Allows custom configuration
* The first call to with resets the default HtmlFetcher list
* @param fetcher a fetcher to add to the current list
*/
public DefaultHtmlFetcherService with(HtmlFetcher fetcher) {
if(isDefault) {
fetchers = new ArrayList<>();
}
fetchers.add(fetcher);
isDefault = false;
return this;
}
@Override
public Optional<String> fetchHtml(String domain, String url) {
if(fetchers.isEmpty()) {
throw new NoHtmlFetcherException();
}
return fetchers.stream()
.filter(f -> f.isCompatible(domain))
.map(fetcher -> fetcher.fetchHtml(url))
.filter(Optional::isPresent)
.findFirst()
.orElse(Optional.empty());
}
}