1
0

Add logger (#131)

This commit is contained in:
Mikołaj Pich
2018-06-06 19:38:54 +02:00
committed by Rafał
parent 0e16519baf
commit a06d114127
31 changed files with 201 additions and 128 deletions

View File

@ -32,6 +32,7 @@ dependencies {
implementation "org.jsoup:jsoup:$jsoup"
implementation "org.apache.commons:commons-lang3:$apacheLang"
implementation "com.google.code.gson:gson:$gson"
implementation "org.slf4j:slf4j-api:$slf4jApi"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"

View File

@ -3,6 +3,8 @@ package io.github.wulkanowy.api;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.Date;
@ -27,6 +29,8 @@ public class Client {
private Cookies cookies = new Cookies();
private static final Logger logger = LoggerFactory.getLogger(Client.class);
Client(String email, String password, String symbol) {
this.email = email;
this.password = password;
@ -59,9 +63,13 @@ public class Client {
}
this.symbol = new Login(this).login(email, password, symbol);
logger.info("Login successful on {} at {}", getHost(), new Date());
}
private boolean isLoggedIn() {
logger.debug("Last success request: {}", lastSuccessRequest);
logger.debug("Cookies: {}", getCookies().size());
return getCookies().size() > 0 && lastSuccessRequest != null &&
5 > TimeUnit.MILLISECONDS.toMinutes(new Date().getTime() - lastSuccessRequest.getTime());
@ -75,10 +83,6 @@ public class Client {
this.symbol = symbol;
}
public void addCookies(Map<String, String> items) {
cookies.addItems(items);
}
private Map<String, String> getCookies() {
return cookies.getItems();
}
@ -111,7 +115,11 @@ public class Client {
this.cookies.addItems(cookies);
}
Connection.Response response = Jsoup.connect(getFilledUrl(url))
url = getFilledUrl(url);
logger.debug("GET {}", url);
Connection.Response response = Jsoup.connect(url)
.followRedirects(true)
.cookies(getCookies())
.execute();
@ -128,7 +136,11 @@ public class Client {
}
public synchronized Document postPageByUrl(String url, String[][] params) throws IOException, VulcanException {
Connection connection = Jsoup.connect(getFilledUrl(url));
url = getFilledUrl(url);
logger.debug("POST {}", url);
Connection connection = Jsoup.connect(url);
for (String[] data : params) {
connection.data(data[0], data[1]);
@ -150,7 +162,11 @@ public class Client {
public String getJsonStringByUrl(String url) throws IOException, VulcanException {
login();
Connection.Response response = Jsoup.connect(getFilledUrl(url))
url = getFilledUrl(url);
logger.debug("GET {}", url);
Connection.Response response = Jsoup.connect(url)
.followRedirects(true)
.ignoreContentType(true)
.cookies(getCookies())
@ -164,7 +180,11 @@ public class Client {
public String postJsonStringByUrl(String url, String[][] params) throws IOException, VulcanException {
login();
Connection connection = Jsoup.connect(getFilledUrl(url));
url = getFilledUrl(url);
logger.debug("POST {}", url);
Connection connection = Jsoup.connect(url);
for (String[] data : params) {
connection.data(data[0], data[1]);
@ -196,7 +216,7 @@ public class Client {
}
if ("Błąd strony".equals(title)) {
throw new NotLoggedInErrorException(title + " " + doc.selectFirst("p, body") + ", status: " + code);
throw new NotLoggedInErrorException(title + " " + doc.selectFirst("body") + ", status: " + code);
}
return doc;

View File

@ -14,9 +14,13 @@ fun getFormattedDate(date: String): String {
}
fun getFormattedDate(date: String, format: String): String {
val sdf = SimpleDateFormat(LOG_DATE_PATTERN, Locale.ROOT)
return getFormattedDate(date, LOG_DATE_PATTERN, format)
}
fun getFormattedDate(date: String, fromFormat: String, toFormat: String): String {
val sdf = SimpleDateFormat(fromFormat, Locale.ROOT)
val d = sdf.parse(date)
sdf.applyPattern(format)
sdf.applyPattern(toFormat)
return sdf.format(d)
}

View File

@ -3,6 +3,8 @@ package io.github.wulkanowy.api;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.net.URL;
@ -32,6 +34,8 @@ public class StudentAndParent implements SnP {
private String diaryID;
private static final Logger logger = LoggerFactory.getLogger(StudentAndParent.class);
StudentAndParent(Client client, String schoolID, String studentID, String diaryID) {
this.client = client;
this.schoolID = schoolID;
@ -43,6 +47,11 @@ public class StudentAndParent implements SnP {
if (null == getStudentID() || "".equals(getStudentID())) {
Document doc = client.getPageByUrl(getSnpHomePageUrl());
if (doc.select("#idSection").isEmpty()) {
logger.error("Expected SnP page, got page with title: {} {}", doc.title(), doc.selectFirst("body"));
throw new VulcanException("Nieznany błąd podczas pobierania danych. Strona: " + doc.title());
}
Student student = getCurrent(getStudents(doc));
studentID = student.getId();
@ -72,24 +81,27 @@ public class StudentAndParent implements SnP {
// get url to uonetplus-opiekun.fakelog.cf
Document startPage = client.getPageByUrl(START_PAGE_URL);
Element studentTileLink = startPage.select(".panel.linkownia.pracownik.klient > a").first();
Elements studentTileLink = startPage.select(".panel.linkownia.pracownik.klient > a");
if (null == studentTileLink) {
logger.debug("studentTileLink: {}", studentTileLink.size());
if (studentTileLink.isEmpty()) {
throw new VulcanException("Na pewno używasz konta z dostępem do Witryny ucznia i rodzica?");
}
String snpPageUrl = studentTileLink.attr("href");
String snpPageUrl = studentTileLink.last().attr("href");
this.schoolID = getExtractedIdFromUrl(snpPageUrl);
return snpPageUrl;
}
String getExtractedIdFromUrl(String snpPageUrl) throws NotLoggedInErrorException {
String getExtractedIdFromUrl(String snpPageUrl) throws VulcanException {
String[] path = snpPageUrl.split(client.getHost())[1].split("/");
if (5 != path.length) {
throw new NotLoggedInErrorException("You are probably not logged in " + snpPageUrl);
logger.error("Expected snp url, got {}", snpPageUrl);
throw new VulcanException("Na pewno używasz konta z dostępem do Witryny ucznia i rodzica?");
}
return path[2];
@ -107,12 +119,12 @@ public class StudentAndParent implements SnP {
Map<String, String> cookies = new HashMap<>();
cookies.put("idBiezacyDziennik", diaryID);
cookies.put("idBiezacyUczen", studentID);
client.addCookies(cookies);
Document doc = client.getPageByUrl(getBaseUrl() + url, true, cookies);
if (!doc.title().startsWith("Witryna ucznia i rodzica")) {
throw new VulcanException("Expected SnP page, got page with title: " + doc.title());
logger.error("Expected SnP page, got page with title: {} {}", doc.title(), doc.selectFirst("body"));
throw new VulcanException("Nieznany błąd podczas pobierania danych. Strona: " + doc.title());
}
if (doc.title().endsWith("Strona główna")) {

View File

@ -1,5 +1,8 @@
package io.github.wulkanowy.api;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import io.github.wulkanowy.api.attendance.AttendanceStatistics;
@ -30,17 +33,21 @@ public class Vulcan {
private String diaryId;
private static final Logger logger = LoggerFactory.getLogger(Vulcan.class);
public void setCredentials(String email, String password, String symbol, String schoolId, String studentId, String diaryId) {
this.schoolId = schoolId;
this.studentId = studentId;
this.diaryId = diaryId;
client = new Client(email, password, symbol);
logger.debug("Client created with symbol " + symbol);
}
public Client getClient() throws NotLoggedInErrorException {
if (null == client) {
throw new NotLoggedInErrorException("Use setCredentials() method first");
throw new NotLoggedInErrorException("Vulcan must be initialized by calling setCredentials() prior to fetch data");
}
return client;

View File

@ -1,8 +1,7 @@
package io.github.wulkanowy.api.mobile
import io.github.wulkanowy.api.SnP
import java.text.SimpleDateFormat
import java.util.*
import io.github.wulkanowy.api.getFormattedDate
class RegisteredDevices(private val snp: SnP) {
@ -28,7 +27,7 @@ class RegisteredDevices(private val snp: SnP) {
devices.add(Device(
cells[0].text().replace(" ($system)", ""),
system,
formatDate(cells[1].text()),
getFormattedDate(cells[1].text(), "dd.MM.yyyy 'godz:' HH:mm:ss", "yyyy-MM-dd HH:mm:ss"),
cells[2].select("a").attr("href")
.split("/").last().toInt()
))
@ -36,13 +35,4 @@ class RegisteredDevices(private val snp: SnP) {
return devices
}
// TODO: Move to date utils
private fun formatDate(date: String): String {
val sdf = SimpleDateFormat("dd.MM.yyyy 'godz:' HH:mm:ss", Locale.ROOT)
val d = sdf.parse(date)
sdf.applyPattern("yyyy-MM-dd HH:mm:ss")
return sdf.format(d)
}
}

View File

@ -83,7 +83,7 @@ public class StudentAndParentTest {
snp.getExtractedIdFromUrl("https://uonetplus-opiekun.vulcan.net.pl/demoupowiat/demo12345/Start/Index/"));
}
@Test(expected = NotLoggedInErrorException.class)
@Test(expected = VulcanException.class)
public void getExtractedIDNotLoggedTest() throws Exception {
Mockito.when(client.getHost()).thenReturn("vulcan.net.pl");
StudentAndParent snp = new StudentAndParent(client, "symbol", null, null);
@ -131,8 +131,8 @@ public class StudentAndParentTest {
@Test
public void getDiariesAndStudentTest() throws IOException, VulcanException {
Document snpHome = Jsoup.parse(FixtureHelper.getAsString(
getClass().getResourceAsStream("StudentAndParent.html")));
String input = FixtureHelper.getAsString(getClass().getResourceAsStream("WitrynaUczniaIRodzica.html"));
Document snpHome = Jsoup.parse(input);
client = Mockito.mock(Client.class);
Mockito.when(client.getPageByUrl(Mockito.anyString())).thenReturn(snpHome);