package control; import java.util.*; import java.util.concurrent.atomic.*; import model.*; import model.persistance.*; import org.apache.log4j.*; import org.jsoup.*; import org.jsoup.nodes.*; import org.jsoup.select.*; import utils.*; import view.*; public class IliasScraper { public AtomicInteger threadCount; public AtomicInteger fileCounter; private List<IliasFolder> iliasTree; private final Dashboard dashboard; public IliasScraper(Dashboard dashboard) { this.dashboard = dashboard; threadCount = new AtomicInteger(0); fileCounter = new AtomicInteger(0); } public void run(String dashboardHtml) { this.iliasTree = getCourses(dashboardHtml); startThread(iliasTree); } private void startThread(List<IliasFolder> iliasTree) { if (Settings.getInstance().getFlags().updateCanceled()) { return; } threadCount.incrementAndGet(); new Thread(new IliasScraperThread(this, iliasTree)).start(); } public List<IliasFolder> getIliasTree() { return iliasTree; } private List<IliasFolder> getCourses(String dashboardHtml) { List<IliasFolder> courses = new ArrayList<IliasFolder>(); String s = null; Document doc = Jsoup.parse(dashboardHtml); List<Element> temp = doc.select("h4"); for (Element x : temp) { s = s + x.toString(); } doc = Jsoup.parse(s); temp = doc.select("a[href]"); String BASE_URI = IliasManager.getInstance().getBaseUri(); for (Element aTag : temp) { aTag.setBaseUri(BASE_URI); String url = aTag.attr("abs:href"); if (url.contains("baseClass=ilrepositorygui")) { String name = IliasCourseFormatter.formatCourseName(aTag.text()); courses.add(new IliasFolder(name, url, null)); } } return courses; } private class IliasScraperThread implements Runnable { String BASE_URI = IliasManager.getInstance().getBaseUri(); private final IliasScraper iliasScraper; private final List<IliasFolder> courses; private IliasScraperThread(IliasScraper iliasScraper, List<IliasFolder> courses) { this.iliasScraper = iliasScraper; this.courses = courses; } @Override public void run() { for (IliasFolder parent : courses) { if (Settings.getInstance().getFlags().updateCanceled()) { break; } List<Element> directory = openFolder(parent); for (Element dir : directory) { if (Settings.getInstance().getFlags().updateCanceled()) { break; } dir.setBaseUri(BASE_URI); // TODO check group folder final boolean linkToFolder = dir.attr("href").contains("cmd=view"); final boolean linkToFile = dir.attr("href").contains("download"); final boolean linkToForum = dir.attr("href").contains("cmd=showThreads"); final boolean linkToHyperlink = false; if (linkToFile) { fileCounter.incrementAndGet(); updateStatusText(); createFile(parent, dir); } else if (linkToForum) { createForum(parent, dir); } else if (linkToFolder) { List<IliasFolder> tempo = new ArrayList<IliasFolder>(); IliasFolder newFolder = createFolder(parent, dir); tempo.add(newFolder); iliasScraper.startThread(tempo); } else if (linkToHyperlink) { // TODO implement } } } iliasScraper.threadCount.decrementAndGet(); } private void updateStatusText() { dashboard.setStatusText(fileCounter.toString() + " Dateien wurden bereits überprüft."); } private IliasForum createForum(IliasFolder parent, Element dir) { final String name = dir.text(); final String link = dir.attr("abs:href"); final IliasForum forum = new IliasForum(name, link, parent); return forum; } private IliasFolder createFolder(IliasFolder kurs, Element dir) { final String name = dir.text(); final String link = dir.attr("abs:href"); final IliasFolder folder = new IliasFolder(name, link, kurs); return folder; } private IliasFile createFile(IliasFolder parentFolder, Element dir) { final String name = dir.text(); final String link = dir.attr("abs:href"); final int fileSize = new IliasConnector().getFileSize(link); final IliasFileMetaInformation metaInf = suggestMetaInformation(dir); final IliasFile iliasFile = new IliasFile(name, link, parentFolder, fileSize, metaInf.getSizeLabel(), metaInf.getFileExtension()); return iliasFile; } private List<Element> openFolder(IliasTreeNode kurs) { List<Element> directory; final String newHtmlContent = new IliasConnector().requestGet(kurs.getUrl()); Document doc = Jsoup.parse(newHtmlContent); directory = doc.select("h4").select("a"); return directory; } private IliasFileMetaInformation suggestMetaInformation(Element dir) { String sizeLabel = "unknown"; String fileExtension = "unknown"; Elements siblingElements = dir.parent().parent().siblingElements(); for (Element element : siblingElements) { if (element.attr("class").contains("il_ItemProperties")) { Elements children = element.children(); for (int i = 0; i < children.size(); i++) { String text = children.get(i).text().replace("\u00a0", "").trim(); if (text.matches("(\\d)(.*)(B|b)(.*)")) { sizeLabel = text; fileExtension = children.get(i - 1).text().replace("\u00a0", "").trim(); } } return new IliasFileMetaInformation(sizeLabel, fileExtension); } } Logger.getLogger(getClass()).warn("ERROR: File Extension could not be found[2]"); return new IliasFileMetaInformation(sizeLabel, fileExtension); } } }