
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);
}
}
Leave A Comment