package eu.robertboloc.holaurv.helpers;
import java.util.List;
import com.gistlabs.mechanize.MechanizeAgent;
import com.gistlabs.mechanize.document.Document;
import com.gistlabs.mechanize.document.html.HtmlDocument;
import com.gistlabs.mechanize.document.html.HtmlElement;
import com.gistlabs.mechanize.document.html.HtmlElements;
import com.gistlabs.mechanize.document.html.form.Form;
import com.gistlabs.mechanize.document.html.query.HtmlQueryBuilder;
import eu.robertboloc.holaurv.models.Day;
import eu.robertboloc.holaurv.models.Entry;
import eu.robertboloc.holaurv.models.Week;
public class Evalos {
/**
* Evalos public base url.
*/
static final String WEB_APP_BASE_URL = "http://gestiodelapresencia.urv.cat/evalos/login.html";
/**
* Title of the error of login page.
*/
static final String LOGIN_ERROR = "Error de Login";
/**
* While testing replace PLACEHOLDER with value.
*/
static final String PLACEHOLDER = "";
/**
* If the login was OK this will be true.
*/
boolean loginSuccess = false;
/**
* If the connection fails this will be true.
*/
private boolean connectionProblem = false;
/**
* Stores the week activity.
*/
final Week week = new Week();
/**
* Username.
*/
final String username;
/**
* Password.
*/
final String password;
public Evalos(String username, String password) {
this.username = username;
this.password = password;
}
/**
* Obtains the raw html of the data.
*
* @return Evalos
*/
public Evalos login() {
try {
final MechanizeAgent agent = new MechanizeAgent();
final Document page = agent.get(WEB_APP_BASE_URL);
Form form = page.form("form1");
form.get("username").set(username);
form.get("password").set(password);
HtmlDocument document = form.submit();
parseRawHtmlResponse(document);
} catch (Exception e) {
connectionProblem = true;
}
return this;
}
/**
* Returns true if login was successful.
*
* @return boolean
*/
public boolean loginSuccessful() {
return loginSuccess;
}
/**
* Returns true if there was a connection problem.
*
* @return boolean
*/
public boolean connectionProblem() {
return connectionProblem;
}
/**
* Obtains the username.
*
* @return String
*/
public String getUsername() {
return this.username;
}
/**
* Returns the requested day object. All days will exist (and be empty if
* the case does not proceed).
*
* @param day
* int
* @return Day
*/
public Day getDay(int day) {
return week.getDay(day);
}
/**
* Does the html parsing heavy-lifting.
*
* @param document
* HtmlDocument
* @return boolean
*/
private boolean parseRawHtmlResponse(HtmlDocument document) {
// Check if the response was OK.
if (!document.getTitle().equals(LOGIN_ERROR)) {
loginSuccess = true;
} else {
// Do nothing else.
return false;
}
// We have a correct response, parse it.
HtmlElements response = document.htmlElements();
List<HtmlElement> weekHtmlElements = response.getAll(HtmlQueryBuilder
.byTag("table").and.byWidth("680").and.byHeight("41").and.by(
"cellspacing", "0").and.by("cellpadding", "0"));
// Parse the week html and store it as Day objects in the week attribute
if (!weekHtmlElements.isEmpty()) {
Day dayPrototype = new Day();
int dayOfWeek = 0;
// Iterate over the days until the current day.
for (HtmlElement dayHtmlElement : weekHtmlElements) {
// If today is greater than the current iteration do nothing
// but store an empty day in the week.
if (dayOfWeek <= Day.today()) {
dayPrototype = new Day();
// Parse shift data
dayPrototype.setShiftRaw(dayHtmlElement
.get(HtmlQueryBuilder.byClass("verdana12").and
.byWidth("75").and.byHeight("40"))
.get(HtmlQueryBuilder.byTag("div")).getInnerHtml());
// Parse entries data
String rawActivity = dayHtmlElement
.get(HtmlQueryBuilder.byClass("verdana10").and
.byWidth("149").and.byHeight("40"))
.get(HtmlQueryBuilder.byTag("div")).getInnerHtml();
String[] fragments = rawActivity.split(" ");
Entry entryPrototype = new Entry();
// Iterate over the entries and add them to the day
for (int i = 0; i <= (fragments.length - 2); i = i + 2) {
entryPrototype = new Entry();
String[] entryTimeList = fragments[i].split(":");
entryPrototype.setHourRaw(entryTimeList[0]);
entryPrototype.setMinuteRaw(entryTimeList[1]);
entryPrototype.setCode(fragments[i + 1]);
dayPrototype.addEntry(entryPrototype);
}
}
week.setDay(dayOfWeek, dayPrototype);
dayOfWeek++;
}
}
return true;
}
public long computeBalance(String theorical, String real) {
String[] theoricalTimeList = theorical.split(":");
// Convert hours and minutes to milis
int theoricalMilis = (Integer.parseInt(theoricalTimeList[0]) * 3600000)
+ (Integer.parseInt(theoricalTimeList[1]) * 60000);
String[] realTimeList = real.split(":");
// Convert hours and minutes to milis
int realMilis = (Integer.parseInt(realTimeList[0]) * 3600000)
+ (Integer.parseInt(realTimeList[1]) * 60000);
return (realMilis - theoricalMilis);
}
}