package io.andrewohara.tinkertime.io.crawlers; import io.andrewohara.tinkertime.io.crawlers.pageLoaders.PageLoader; import io.andrewohara.tinkertime.models.mod.Mod; import org.jsoup.nodes.Document; import com.google.gson.JsonElement; import com.google.inject.Inject; import com.google.inject.Singleton; @Singleton public class CrawlerFactory { public static final String HOST_CURSE = "curse.com", HOST_GITHUB = "github.com", HOST_MODULE_MANAGER = "ksp.sarbian.com", HOST_KERBAL_STUFF = "kerbalstuff.com"; public static final String[] ACCEPTED_MOD_HOSTS = new String[]{ HOST_KERBAL_STUFF, HOST_CURSE, HOST_GITHUB }; private final PageLoader<Document> docLoader; private final PageLoader<JsonElement> jsonLoader; @Inject CrawlerFactory(PageLoader<Document> docLoader, PageLoader<JsonElement> jsonLoader){ this.docLoader = docLoader; this.jsonLoader = jsonLoader; } public Crawler<?> getCrawler(Mod mod) throws UnsupportedHostException{ String host = mod.getUrl().getHost(); if (host.contains(HOST_CURSE)){ return new CurseCrawler(mod.getUrl(), docLoader); } else if (host.contains(HOST_GITHUB)){ return new GithubCrawler(mod.getUrl(), jsonLoader); } else if (host.contains(HOST_KERBAL_STUFF)){ return new KerbalStuffCrawler(mod.getUrl(), jsonLoader); } else if (host.equals(HOST_MODULE_MANAGER)){ return new JenkinsCrawler(mod.getUrl(), jsonLoader); } throw new UnsupportedHostException(host); } @SuppressWarnings("serial") public static class UnsupportedHostException extends Exception { private UnsupportedHostException(String host){ super(String.format("Unsupported host: %s", host)); } } }