package org.lodder.subtools.multisubdownloader;
import java.util.Calendar;
import org.apache.commons.lang3.time.DateUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.lodder.subtools.multisubdownloader.settings.model.UpdateCheckPeriod;
import org.lodder.subtools.sublibrary.ConfigProperties;
import org.lodder.subtools.sublibrary.Manager;
import org.lodder.subtools.sublibrary.ManagerException;
import org.lodder.subtools.sublibrary.ManagerSetupException;
import org.lodder.subtools.sublibrary.util.http.HttpClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class UpdateAvailableDropbox {
private final String url;
private String updatedUrl;
private Manager manager;
private static final Logger LOGGER = LoggerFactory.getLogger(UpdateAvailableDropbox.class);
private final static String programName = ConfigProperties.getInstance().getProperty(
"updateProgramName");
private final static String extension = ConfigProperties.getInstance().getProperty(
"updateProgramExtension");
public UpdateAvailableDropbox(Manager manager) {
url = ConfigProperties.getInstance().getProperty("updateUrlDropbox");
this.manager = manager;
updatedUrl = "";
}
public boolean checkProgram(UpdateCheckPeriod updateCheckPeriod) {
try {
Calendar date = Calendar.getInstance();
switch (updateCheckPeriod) {
case DAILY:
return check(programName, extension);
case MANUAL:
break;
case MONTHLY:
date.set(Calendar.DAY_OF_MONTH, 1);
if (DateUtils.isSameDay(date, Calendar.getInstance())) {
LOGGER.info(Messages.getString("UpdateAvailableDropbox.CheckingForUpdate"));
return check(programName, extension);
}
break;
case WEEKLY:
date.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
if (DateUtils.isSameDay(date, Calendar.getInstance())) {
LOGGER.info(Messages.getString("UpdateAvailableDropbox.CheckingForUpdate"));
return check(programName, extension);
}
break;
default:
break;
}
} catch (Exception e) {
LOGGER.error("checkProgram", e);
}
return false;
}
public boolean checkMapping() {
try {
return check("Mapping", "xml");
} catch (Exception e) {
LOGGER.error("checkMapping", e);
}
return false;
}
public String getUpdateUrl() {
return updatedUrl;
}
private boolean check(String baseName, String extension) {
try {
String newFoundVersion =
ConfigProperties.getInstance().getProperty("version").replace("-SNAPSHOT", "");
String source = manager.getContent(url, null, false);
Document sourceDoc = Jsoup.parse(source);
Elements results = sourceDoc.getElementsByClass("filename-link");
for (Element result : results) {
String href = result.attr("href");
if (href.contains(baseName)) {
String foundVersion =
href.substring(href.lastIndexOf("/") + 1, href.length()).replace(baseName, "")
.replace("-v", "").replace("-r", "").replace("." + extension, "").trim()
.replace("?dl=0", "");
int compare =
compareVersions(
ConfigProperties.getInstance().getProperty("version").replace("-SNAPSHOT", ""),
foundVersion);
if (compare < 0) {
if (compareVersions(newFoundVersion, foundVersion) <= 0) {
newFoundVersion = foundVersion;
updatedUrl = href;
}
}
}
}
if (HttpClient.isUrl(updatedUrl)) {
return true;
}
} catch (ManagerSetupException | ManagerException e) {
LOGGER.error("", e);
}
return false;
}
private int compareVersions(String str1, String str2) {
String[] vals1 = str1.split("\\.");
String[] vals2 = str2.split("\\.");
int i = 0;
while (i < vals1.length && i < vals2.length && vals1[i].equals(vals2[i])) {
i++;
}
if (i < vals1.length && i < vals2.length) {
int diff = Integer.valueOf(vals1[i]).compareTo(Integer.valueOf(vals2[i]));
return Integer.signum(diff);
}
return Integer.signum(vals1.length - vals2.length);
}
}