Add logger (#131)
This commit is contained in:
@ -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"
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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")) {
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
Reference in New Issue
Block a user