Снимок экрана 2017-04-05 в 13.20.48

package com.javarush.test.level28.lesson15.big01.model;

import com.javarush.test.level28.lesson15.big01.vo.Vacancy;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by promoscow on 30.03.17.
 */
public class HHStrategy implements Strategy {
    private static final String URL_FORMAT = "http://hh.ua/search/vacancy?text=java+%s&page=%d";
    private static final String USER_AGENT = "Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6";
    private static final String REFERRER = "none";

    @Override
    public List<Vacancy> getVacancies(String searchString) {
        ArrayList<Vacancy> vacancies = new ArrayList<>();
        try {
            for (int i = 0; true; i++) {
                Document document = getDocument(searchString, i);
                List<Element> list = document.getElementsByAttributeValue("data-qa", "vacancy-serp__vacancy");

                if (list.isEmpty()) break;
                for (Element element : list) {
                    Vacancy vacancy = new Vacancy();
                    vacancy.setTitle(element.getElementsByAttributeValue
                            ("data-qa", "vacancy-serp__vacancy-title").text());
                    vacancy.setCompanyName(element.getElementsByAttributeValue
                            ("data-qa", "vacancy-serp__vacancy-employer").text());
                    vacancy.setCity(element.getElementsByAttributeValue
                            ("data-qa", "vacancy-serp__vacancy-address").text());
                    if (element.getElementsByAttributeValue
                            ("data-qa", "vacancy-serp__vacancy-compensation").text() != null) {
                        vacancy.setSalary(element.getElementsByAttributeValue
                                ("data-qa", "vacancy-serp__vacancy-compensation").text());
                    } else vacancy.setSalary("");
                    vacancy.setUrl(element.getElementsByAttributeValue
                            ("data-qa", "vacancy-serp__vacancy-title").attr("href"));
                    vacancy.setSiteName(document.title());
                    vacancies.add(vacancy);
//                    System.out.println(vacancy);
//                    System.out.println();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return vacancies;
    }

    protected Document getDocument(String searchString, int page) throws IOException {
        return Jsoup.connect(String.format(URL_FORMAT, searchString, page)).userAgent(USER_AGENT).referrer(REFERRER).get();
    }
}

 

package com.javarush.test.level28.lesson15.big01.model;

import com.javarush.test.level28.lesson15.big01.view.View;
import com.javarush.test.level28.lesson15.big01.vo.Vacancy;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by promoscow on 03.04.17.
 */
public class Model {
    private View view;
    private Provider[] providers;

    public Model(View view, Provider... providers) {
        if (view == null || providers == null || providers.length == 0) throw new IllegalArgumentException();
        this.view = view;
        this.providers = providers;
    }

    public void selectCity(String city) {
        List<Vacancy> list = new ArrayList<>();
        for (Provider provider : providers) {
            list.addAll(provider.getJavaVacancies(city));
        }
        view.update(list);
    }
}

 

package com.javarush.test.level28.lesson15.big01.model;

import com.javarush.test.level28.lesson15.big01.vo.Vacancy;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by promoscow on 05.04.17.
 */
public class MoikrugStrategy implements Strategy {
    private static final String URL_FORMAT = "https://moikrug.ru/vacancies?page=%d&q=java+%s";
    private static final String USER_AGENT = "Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6";
    private static final String REFERRER = "none";

    @Override
    public List<Vacancy> getVacancies(String searchString) {
        List<Vacancy> vacancies = new ArrayList<>();
        try {
            for (int i = 0; true; i++) {

                Document document = getDocument(searchString, i);
                List<Element> list = document.getElementsByAttributeValue("class", "job  ");
                List<Element> listMarket = document.getElementsByAttributeValue("class", "job marked");

                if (list.isEmpty() && listMarket.isEmpty()) break;

                for (Element element : list) {
                    Vacancy vacancy = new Vacancy();
                    vacancy.setTitle(element.getElementsByAttributeValue("class", "title").text());

                    Elements salary = element.getElementsByAttributeValue("class", "salary");
                    vacancy.setSalary(salary.text());

                    Elements city = element.getElementsByAttributeValue("class", "location");
                    vacancy.setCity(city.text());
                    vacancy.setCompanyName(element.getElementsByAttributeValue("class", "company_name").text());
                    vacancy.setSiteName(document.title());
                    Elements s = element.getElementsByAttributeValue("class", "title");
                    Elements tag = s.select("*");
                    vacancy.setUrl("https://moikrug.ru" + tag.attr("href"));
                    vacancies.add(vacancy);

                }

                for (Element element : listMarket) {
                    Vacancy vacancy = new Vacancy();
                    vacancy.setTitle(element.getElementsByAttributeValue("class", "title").text());

                    Elements salary = element.getElementsByAttributeValue("class", "salary");
                    vacancy.setSalary(salary.text());

                    Elements city = element.getElementsByAttributeValue("class", "location");
                    vacancy.setCity(city.text());
                    vacancy.setCompanyName(element.getElementsByAttributeValue("class", "company_name").text());
                    vacancy.setSiteName(document.title());
                    Elements s = element.getElementsByAttributeValue("class", "title");
                    Elements tag = s.select("*");
                    vacancy.setUrl("https://moikrug.ru" + tag.attr("href"));
                    vacancies.add(vacancy);
                }

            }
        } catch (IOException e) {
        }

        return vacancies;
    }

    protected Document getDocument(String searchString, int page) throws IOException {
        return Jsoup.connect(String.format(URL_FORMAT, page, searchString)).userAgent(USER_AGENT).referrer(REFERRER).get();
    }
}

 

package com.javarush.test.level28.lesson15.big01.model;

import com.javarush.test.level28.lesson15.big01.vo.Vacancy;

import java.util.List;

/**
 * Created by promoscow on 23.02.17.
 */
public class Provider {
    private Strategy strategy;

    public Provider(Strategy strategy) {
        this.strategy = strategy;
    }

    public Provider() {

    }

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public List<Vacancy> getJavaVacancies(String searchString) {
        return strategy.getVacancies(searchString);
    }
}

 

package com.javarush.test.level28.lesson15.big01.model;

import com.javarush.test.level28.lesson15.big01.vo.Vacancy;

import java.util.List;

/**
 * Created by promoscow on 23.02.17.
 */
public interface Strategy {
    public List<Vacancy> getVacancies(String searchString);
}

 

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="utf-8">
    <title>Вакансии</title>
</head>
<body>
<table>
    <tr>
        <th>Title</th>
        <th>City</th>
        <th>Company Name</th>
        <th>Salary</th>
    </tr>
    <tr class="vacancy">
        <td class="title"><a href="http://javarush.ru">Junior Java Developer</a></td>
        <td class="city">Entire World</td>
        <td class="companyName">JavaRush</td>
        <td class="salary">1mmm</td>
    </tr>

    <tr class="vacancy template" style="display: none">
        <td class="title"><a href="url"></a></td>
        <td class="city"></td>
        <td class="companyName"></td>
        <td class="salary"></td>
    </tr>
</table>
</body>
</html>

 

package com.javarush.test.level28.lesson15.big01.view;

import com.javarush.test.level28.lesson15.big01.Controller;
import com.javarush.test.level28.lesson15.big01.vo.Vacancy;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;

/**
 * Created by promoscow on 03.04.17.
 */
public class HtmlView implements View {
    private Controller controller;
    private final String filePath = "./src/" + String.valueOf(this
            .getClass()
            .getPackage()
            .getName()
            .replace(".", "/") + "/vacancies.html");

    @Override
    public void update(List<Vacancy> vacancies) {
        try {
            updateFile(getUpdatedFileContent(vacancies));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void setController(Controller controller) {
        this.controller = controller;
    }

    public void userCitySelectEmulationMethod() {
        controller.onCitySelect("Odessa");
    }

    private String getUpdatedFileContent(List<Vacancy> list) throws IOException {
        String result = null;
        try {
            Document document = getDocument();
            Elements clone = document.getElementsByAttributeValue("class", "vacancy template");
            Elements template = clone.clone();
            Elements elements = clone.clone();
            clone.removeAttr("style");
            clone.removeClass("template");
            elements.removeAttr("style");
            elements.removeClass("template");
            Elements sh = elements.clone();
            for (Element element : document.select("*")) if (element.attr("class").equals("vacancy")) element.remove();

            Element out = document.select("tbody").last();
            for (Vacancy vacancy : list) {
                Elements cloneVacancy = sh.clone();

                Element city = cloneVacancy.select("td").get(1);
                city.text(vacancy.getCity());

                Element companyName = cloneVacancy.select("td").get(2);
                companyName.text(vacancy.getCompanyName());

                Element salary = cloneVacancy.select("td").get(3);
                salary.text(vacancy.getSalary());

                Element title = cloneVacancy.select("a").get(0);
                title.text(vacancy.getTitle());
                title.attr("href", vacancy.getUrl());

                out.append(cloneVacancy.outerHtml());
            }
            out.append(template.outerHtml());

            result = document.html();
        } catch (Exception e) {
            e.printStackTrace();
            result = "Some exception occurred";
        }


        return result;
    }

    private void updateFile(String s) {
        try {
            BufferedWriter writer = new BufferedWriter(new FileWriter(filePath));
            writer.write(s);
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    protected Document getDocument() throws IOException {
        return Jsoup.parse(new File(filePath), "UTF-8");
    }
}

 

package com.javarush.test.level28.lesson15.big01.view;

import com.javarush.test.level28.lesson15.big01.Controller;
import com.javarush.test.level28.lesson15.big01.vo.Vacancy;

import java.util.List;

/**
 * Created by promoscow on 03.04.17.
 */
public interface View {

    void update(List<Vacancy> vacancies);

    void setController(Controller controller);
}

 

package com.javarush.test.level28.lesson15.big01.vo;

/**
 * Created by promoscow on 30.03.17.
 */
public class Vacancy {
    private String title, salary, city, companyName, siteName, url;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getSalary() {
        return salary;
    }

    public void setSalary(String salary) {
        this.salary = salary;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }

    public String getSiteName() {
        return siteName;
    }

    public void setSiteName(String siteName) {
        this.siteName = siteName;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Vacancy vacancy = (Vacancy) o;

        if (title != null ? !title.equals(vacancy.title) : vacancy.title != null) return false;
        if (salary != null ? !salary.equals(vacancy.salary) : vacancy.salary != null) return false;
        if (city != null ? !city.equals(vacancy.city) : vacancy.city != null) return false;
        if (companyName != null ? !companyName.equals(vacancy.companyName) : vacancy.companyName != null) return false;
        if (siteName != null ? !siteName.equals(vacancy.siteName) : vacancy.siteName != null) return false;
        return url != null ? url.equals(vacancy.url) : vacancy.url == null;

    }

    @Override
    public int hashCode() {
        int result = title != null ? title.hashCode() : 0;
        result = 31 * result + (salary != null ? salary.hashCode() : 0);
        result = 31 * result + (city != null ? city.hashCode() : 0);
        result = 31 * result + (companyName != null ? companyName.hashCode() : 0);
        result = 31 * result + (siteName != null ? siteName.hashCode() : 0);
        result = 31 * result + (url != null ? url.hashCode() : 0);
        return result;
    }

    @Override
    public String toString() {
        return "Vacancy{" +
                "title='" + title + '\'' +
                ", salary='" + salary + '\'' +
                ", city='" + city + '\'' +
                ", companyName='" + companyName + '\'' +
                ", siteName='" + siteName + '\'' +
                ", url='" + url + '\'' +
                '}';
    }
}

 

package com.javarush.test.level28.lesson15.big01;

import com.javarush.test.level28.lesson15.big01.model.HHStrategy;
import com.javarush.test.level28.lesson15.big01.model.Model;
import com.javarush.test.level28.lesson15.big01.model.MoikrugStrategy;
import com.javarush.test.level28.lesson15.big01.model.Provider;
import com.javarush.test.level28.lesson15.big01.view.HtmlView;

/**
 * Created by promoscow on 23.02.17.
 */
public class Aggregator {
    public static void main(String[] args) {
        HtmlView view = new HtmlView();

        Provider moiKrugProvider = new Provider(new MoikrugStrategy());
        Provider provider = new Provider(new HHStrategy());

        Model model = new Model(view, provider, moiKrugProvider);
        Controller controller = new Controller(model);
        view.setController(controller);
        view.userCitySelectEmulationMethod();
    }
}

 

package com.javarush.test.level28.lesson15.big01;

import com.javarush.test.level28.lesson15.big01.model.Model;
import com.javarush.test.level28.lesson15.big01.model.Provider;
import com.javarush.test.level28.lesson15.big01.vo.Vacancy;

import java.util.Arrays;
import java.util.List;

/**
 * Created by promoscow on 23.02.17.
 */
public class Controller {
    private Model model;

    public Controller(Model model) {
        if (model == null) throw new IllegalArgumentException();
        this.model = model;
    }

    public void onCitySelect(String cityName) {
        model.selectCity(cityName);
    }
}