org.jlucrum.datafetcher.FetcherOsuusPankki.java Source code

Java tutorial

Introduction

Here is the source code for org.jlucrum.datafetcher.FetcherOsuusPankki.java

Source

/*
This file is part of JLucrum.
    
 JLucrum 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.
    
 JLucrum 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  JLucrum.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.jlucrum.datafetcher;

import java.io.IOException;
import java.net.URL;
import java.util.Iterator;
import java.util.HashMap;
import java.util.Map;

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.jtotus.common.DateIterator;

/**
 *
 * @author Evgeni Kappinen
 */
public class FetcherOsuusPankki implements MarketFetcher {

    public static final String urlName = "https://www.op.fi/op?sym=";
    public static final String patternString = "yyyy-MM-dd";
    private static final String startDateFormat = "'&from_year='yyyy'&from_month='MM'&from_day='dd";
    private static final String endDateFormat = "'&to_year='yyyy'&to_month='MM'&to_day='dd";

    public String urlParam = "&id=32455&srcpl=3";
    private final DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("yyyy-MM-dd");
    private boolean debug = false;
    private static int dataMap[] = { 1, 2, -1, 4 };
    private final Map<String, String> stockMap = new HashMap<String, String>();
    private SourceCache cache = SourceCache.getInstance(100);

    public FetcherOsuusPankki() {
        //http://en.wikipedia.org/wiki/OMX_Helsinki_25
        stockMap.put("Cargotec Oyj", "CGCBV.HSE");
        stockMap.put("Elisa Oyj", "ELI1V.HSE");
        stockMap.put("Fortum Oyj", "FUM1V.HE");
        stockMap.put("Kemira Oyj", "KRA1V.HSE");
        stockMap.put("KONE Oyj", "KNEBV.HSE");
        stockMap.put("Konecranes Oyj", "KCR1V.HSE");
        stockMap.put("Metso Oyj", "MEO1V.HSE");
        stockMap.put("Neste Oil", "NES1V.HSE");
        stockMap.put("Nokia Oyj", "NOK1V.HSE");
        stockMap.put("Nokian Renkaat Oyj", "NRE1V.HSE");
        stockMap.put("Nordea Bank AB", "NDA1V.HSE");
        stockMap.put("Outokumpu Oyj", "OUT1V.HSE");
        stockMap.put("Outotec Oyj", "OTE1V.HSE");
        stockMap.put("Pohjola Bank A", "POH1S.HSE");
        stockMap.put("Rautaruukki Oyj", "RTRKS.HSE");
        stockMap.put("Sampo Oyj A", "SAMAS.HSE");
        stockMap.put("Sanoma Oyj", "SAA1V.HSE");
        //FIXME:!! Stora Enso Oyj A -> Stora Enso Oyj R stock!
        stockMap.put("Stora Enso Oyj A", "STEAV.HSE");
        stockMap.put("TeliaSonera AB", "TLS1V.HSE");
        stockMap.put("Tieto Oyj", "TIE1V.HSE");
        stockMap.put("UPM-Kymmene Oyj", "UPM1V.HSE");
        stockMap.put("Wrtsil Corporation", "WRT1V.HSE");
        stockMap.put("YIT Oyj", "YTY1V.HSE");
    }

    private String buildRequest(final DateTime fromDate, final DateTime toDate, final String stockName) {
        DateTimeFormatter startingDate = DateTimeFormat.forPattern(this.startDateFormat);
        DateTimeFormatter endingDate = DateTimeFormat.forPattern(this.endDateFormat);

        return this.urlName + stockName + this.urlParam + startingDate.print(fromDate) + endingDate.print(toDate);
    }

    public Double fetchData(String stockName, DateTime date, int type) {
        URL url;

        int intType = dataMap[type];

        String name = stockMap.get(stockName);
        if (name == null) {
            return null;
        }

        try {
            url = new URL(this.buildRequest(date, date, name));

            Document doc = Jsoup.parse(url, 2 * 1000);

            Elements elems = doc.select("td");

            Iterator<Element> iter = elems.iterator();
            while (iter.hasNext()) {
                Element elem = iter.next();
                String data = elem.html();

                String datePattern = dateFormatter.print(date);

                if (data.indexOf(datePattern) != -1) {

                    for (int i = 0; i < intType; i++) {
                        elem = iter.next();
                    }

                    data = elem.text();
                    String fdata = data.replace(',', '.');

                    if (debug) {
                        System.out.printf("Fetched value from OP bank ->:%s for date:%s\n", fdata, datePattern);
                    }

                    return Double.valueOf(fdata).doubleValue();
                }
            }

        } catch (IOException ex) {
            System.out.printf("Failure in :%s message:%s\n", FetcherOsuusPankki.class.getCanonicalName(),
                    ex.getMessage());
            return null;
        }

        return null;
    }

    @Override
    public Map<String, Double> fetchDataPeriod(String stockName, DateTime fromDate, DateTime toDate, int type) {
        HashMap<String, Double> retMap = new HashMap<String, Double>();
        URL url = null;

        int intType = dataMap[type];

        String name = stockMap.get(stockName);
        if (name == null) {
            return null;
        }

        try {
            Document doc = (Document) cache.getData(stockName, fromDate.toString(), toDate.toString());

            if (doc == null) {
                url = new URL(this.buildRequest(fromDate, toDate, name));
                doc = Jsoup.parse(url, 2 * 1000);

                cache.putData(stockName, fromDate.toString(), toDate.toString(), doc.clone());
                System.out.printf("Fetched from network:%s\n", name);
            }

            Elements elems = doc.select("td");

            DateIterator dateIter = new DateIterator(fromDate, toDate);
            while (dateIter.hasNext()) {
                Iterator<Element> iter = elems.iterator();
                String datePattern = dateFormatter.print(dateIter.nextInCalendar());

                while (iter.hasNext()) {
                    Element elem = iter.next();
                    String data = elem.html();

                    if (data.indexOf(datePattern) != -1) {

                        for (int i = 0; i < intType; i++) {
                            elem = iter.next();
                        }

                        data = elem.text();
                        String fdata = data.replace(',', '.');

                        retMap.put(datePattern, Double.valueOf(fdata));
                        break;
                    }
                }
            }

        } catch (IOException ex) {
            System.out.printf("Failure in :%s message:%s\n", FetcherOsuusPankki.class.getCanonicalName(),
                    ex.getMessage());
            return null;
        }

        System.out.printf("Fetched %s from OsuusPankki:%d\n", stockName, retMap.size());
        return retMap;
    }

    public static void main(String[] av) {
        String patternString = "yyyy-MM-dd";
        DateTimeFormatter formatter = DateTimeFormat.forPattern(patternString);
        String name = "Metso Oyj";

        DateTime fromDate = formatter.parseDateTime("2009-05-01");
        DateTime toDate = formatter.parseDateTime("2011-05-05");
        ;
        int type = 0;
        FetcherOsuusPankki instance = new FetcherOsuusPankki();

        Map<String, Double> result = instance.fetchDataPeriod(name, fromDate, toDate, type);
        //        
        //        for (Entry<String,Double> entry:result.entrySet()) {
        //            System.out.printf("%s, %f\n", entry.getKey(), entry.getValue());
        //        }
    }
}