de.tntinteractive.portalsammler.sources.HanVBSourceV1.java Source code

Java tutorial

Introduction

Here is the source code for de.tntinteractive.portalsammler.sources.HanVBSourceV1.java

Source

/*
Copyright (C) 2013  Tobias Baum <tbaum at tntinteractive.de>
    
This file is a part of Portalsammler.
    
Portalsammler is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
    
Portalsammler is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
    
You should have received a copy of the GNU General Public License
along with Portalsammler.  If not, see <http://www.gnu.org/licenses/>.
 */
package de.tntinteractive.portalsammler.sources;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;

import org.apache.commons.lang3.tuple.Pair;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

import de.tntinteractive.portalsammler.engine.DocumentFormat;
import de.tntinteractive.portalsammler.engine.DocumentInfo;
import de.tntinteractive.portalsammler.engine.SecureStore;
import de.tntinteractive.portalsammler.engine.SettingKey;
import de.tntinteractive.portalsammler.engine.SourceSettings;
import de.tntinteractive.portalsammler.engine.UserInteraction;

public final class HanVBSourceV1 extends DocumentSource {

    static final SettingKey USER = new SettingKey("VR-Kennung");
    static final SettingKey PASSWORD = new SettingKey("Online-PIN");

    public HanVBSourceV1(final String id) {
        super(id);
    }

    @Override
    public Pair<Integer, Integer> poll(final SourceSettings settings, final UserInteraction gui,
            final SecureStore store) throws Exception {
        final WebDriver driver = this
                .createDriver("https://www.hannoversche-volksbank.de/ptlweb/WebPortal?bankid=0744");

        final WebElement userField = driver.findElement(By.id("vrkennungalias"));
        userField.sendKeys(settings.get(USER, gui));

        final WebElement passwordField = driver.findElement(By.id("pin"));
        passwordField.sendKeys(settings.get(PASSWORD, gui));

        passwordField.submit();

        waitForPresence(driver, By.linkText("Postkorb"));

        int newDocs = 0;
        int knownDocs = 0;
        try {
            clickLink(driver, "Postkorb");
            waitForPresence(driver, By.name("confirmDeleteMultiMessage"));

            final WebElement form = driver.findElement(By.name("confirmDeleteMultiMessage"));
            final WebElement tbody = form.findElement(By.tagName("tbody"));

            final List<String> links = new ArrayList<String>();
            for (final WebElement tr : tbody.findElements(By.tagName("tr"))) {
                final List<WebElement> tds = tr.findElements(By.tagName("td"));
                final WebElement link = tds.get(2).findElement(By.tagName("a"));
                links.add(link.getAttribute("href"));
            }

            for (final String link : links) {
                driver.get(link);

                final DocumentInfo info = DocumentInfo.create(this.getId(), DocumentFormat.TEXT);
                final StringBuilder content = new StringBuilder();

                driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
                final WebElement fieldset = driver.findElement(By.tagName("fieldset"));
                for (final WebElement div : fieldset.findElements(By.tagName("div"))) {
                    if (this.isLabeled(div, "Eingang")) {
                        info.setDate(this.parseTimestamp(div.findElement(By.className("gad-field-box")).getText()));
                    } else if (this.isLabeled(div, "Betreff")) {
                        final WebElement data = div.findElement(By.className("gad-field-box"));
                        info.addKeywords(data.findElement(By.tagName("span")).getAttribute("title"));
                    } else if (this.isNotLabeled(div)) {
                        content.append(div.getText());
                    }
                }
                driver.manage().timeouts().implicitlyWait(WAIT_TIME, TimeUnit.SECONDS);

                if (!store.containsDocument(info)) {
                    store.storeDocument(info, content.toString().getBytes("UTF-8"));
                    newDocs++;
                } else {
                    knownDocs++;
                }
            }

        } finally {
            clickLink(driver, "Logout");
        }
        return Pair.of(newDocs, knownDocs);
    }

    private boolean isNotLabeled(final WebElement div) {
        return !this.isLabeled(div, "");
    }

    private boolean isLabeled(final WebElement div, final String string) {
        for (final WebElement label : div.findElements(By.tagName("label"))) {
            if (label.getText().contains(string)) {
                return true;
            }
        }
        return false;
    }

    private Date parseTimestamp(final String time) throws ParseException {
        return new SimpleDateFormat("dd.MM.yyyy HH:mm").parse(time);
    }

}