package ru.decipher.proxy.impl;
import ru.decipher.extraction.Processor;
import ru.decipher.extraction.impl.GeneralProcessor;
import ru.decipher.provider.http.HttpRequest;
import ru.decipher.proxy.HttpProxyConfigLoader;
import ru.decipher.proxy.source.ProxySourceSite;
import java.lang.reflect.Constructor;
import java.util.*;
/**
* Allows to load proxies from external source such as
* Internet sites.
* <p/>
* Provides shared processor for all submissions which can
* be configured via constructor
* <p/>
* Basically, this loader submits specified loaders to shared
* processor and waits when all loaders done
* <p/>
* User: Alexander Paderin (apocarteres@gmail.com)
* Date: 3/26/14
* Time: 11:43 AM
*/
public class ExternalProxyLoader implements HttpProxyConfigLoader {
private final List<Class<? extends ProxySourceSite>> loaderClasses;
private final int workers;
public ExternalProxyLoader(List<Class<? extends ProxySourceSite>> loaderClasses, int workers) {
this.loaderClasses = loaderClasses;
this.workers = workers;
}
@Override
public Collection<HttpProxyConfig> load() throws Exception {
Processor<HttpRequest> processor = new GeneralProcessor<>(workers);
List<ProxySourceSite> sites = new ArrayList<>();
for (Class<? extends ProxySourceSite> clazz : loaderClasses) {
final Constructor<? extends ProxySourceSite> constructor = clazz.getConstructor(Processor.class);
final ProxySourceSite site = constructor.newInstance(processor);
sites.add(site);
site.init();
}
processor.shutdown();
Set<HttpProxyConfig> result = new HashSet<>();
for (ProxySourceSite site : sites) {
result.addAll(site.load());
}
return result;
}
}