package com.skripko.freelance;
import com.codeborne.selenide.SelenideElement;
import com.skripko.common.ExcelIO;
import com.skripko.common.SelenideUtils;
import com.skripko.freelance.platform.FlProcessor;
import com.skripko.freelance.platform.Guru;
import com.skripko.freelance.platform.SearchQuery;
import org.reflections.Reflections;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import static com.codeborne.selenide.Selenide.open;
import static com.skripko.common.ExcelIO.Mode.WRITE;
import static com.skripko.common.SelenideUtils.BrowserType.CHROME;
public class MainFreelanceComp {
public static final int JOBS_OF_PERIOD = 30;
public static final String OUTPUT_XLSX = "currentJob.xlsx";
private static String passk = "psprt";
private static final Class<? extends FlProcessor> CURRENT_SITE_CLASS = Guru.class;
public static void main(String[] args) throws Exception {
SelenideUtils.configureBrowser(CHROME);
long startTime = System.currentTimeMillis();
Reflections reflections = new Reflections(FlProcessor.class.getPackage().getName());
Set<Class<? extends FlProcessor>> sites = reflections.getSubTypesOf(FlProcessor.class);
Set<Job> jobs = new LinkedHashSet<>();
for (Class<? extends FlProcessor> siteProcessorClass : sites) {
try {
if (siteProcessorClass == CURRENT_SITE_CLASS) {
jobs.addAll(grabSiteJobs(siteProcessorClass));
}
} catch (Exception | Error e) {
e.printStackTrace();
System.out.printf("duration=%s\n", System.currentTimeMillis() - startTime);
return;
}
}
ExcelIO excelIO = new ExcelIO(OUTPUT_XLSX, WRITE);
Job instance = jobs.iterator().next();
excelIO.createSheet(instance.getSite());
List<String> columnNames = Arrays.asList(instance.getClass().getDeclaredFields()).stream()
.map(Field::getName).collect(Collectors.toList());
excelIO.printRow(false, columnNames.toArray(new String[columnNames.size()]));
for (Job job : jobs) {
excelIO.printRow(false, job.getSite(), job.getQueryName(), job.getUrl(), job.getProposalCount(), job.getLifeDuration());
}
excelIO.close();
System.out.printf("Program execution finished, duration=%s\n", System.currentTimeMillis() - startTime);
// System.exit(0);
}
public static Set<Job> grabSiteJobs(Class<? extends FlProcessor> siteProcessorClass) throws NoSuchFieldException, IllegalAccessException {
FlProcessor siteProcessor = (FlProcessor) siteProcessorClass.getField("instance").get(null);
Set<Job> jobs = new LinkedHashSet<>();
for (SearchQuery queryObj : siteProcessor.getSearchQueries()) {
String siteName = siteProcessorClass.getSimpleName();
for (String url : queryObj.getQueryUrls()) {
String queryName = queryObj.getName();
open(url);
int pageNumber = 1;
outer:
do {
System.out.printf("site=%s query=[%s] pageNumber=%s\n", siteName, queryName, pageNumber++);
List<SelenideElement> jobElements = siteProcessor.getJobElements();
if (jobElements == null || jobElements.size() == 0) {
break; //necessarily
}
for (SelenideElement jobElement : jobElements) {
Job job = siteProcessor.parseElement(queryName, jobElement);
if (job.getLifeDuration() > MainFreelanceComp.JOBS_OF_PERIOD) {
break outer;
}
jobs.add(job);
}
} while (siteProcessor.clickNextPage());
}
}
return jobs;
}
}