/* This file is part of jTotus. jTotus 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. jTotus 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 jTotus. If not, see <http://www.gnu.org/licenses/>. * * * An example of fetcher. */ package org.jtotus.database; import java.io.IOException; import java.net.URL; import java.text.SimpleDateFormat; import java.util.Iterator; import org.jtotus.network.StockType; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.ArrayUtils; import org.jtotus.common.StockNames; import org.apache.log4j.BasicConfigurator; 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 NetworkOP implements InterfaceDataBase { public String urlName = "https://www.op.fi/op?sym="; public String urlParam = "&id=32455&srcpl=3"; public String patternString = "yyyy-MM-dd"; private final DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("yyyy-MM-dd"); private boolean debug = true; public NetworkOP() { BasicConfigurator.configure(); } @Override public BigDecimal fetchClosingPrice(String stockName, DateTime calendar) { return this.fetchData(stockName, calendar, 1); } public BigDecimal fetchAveragePrice(String stockName, DateTime calendar) { return this.fetchData(stockName, calendar, 4); } @Override public BigDecimal fetchVolume(String stockName, DateTime calendar) { return this.fetchData(stockName, calendar, 2); } private String buildRequest(DateTime calendar, String stockName) { //&from_year=2002&from_month=01&from_day=02&to_year=2010&to_month=10&to_day=01 DateTime fromDate = calendar.toDateTime().minusDays(4); SimpleDateFormat startingDate = new SimpleDateFormat("'&from_year='yyyy'&from_month='MM'&from_day='dd"); SimpleDateFormat endingDate = new SimpleDateFormat("'&to_year='yyyy'&to_month='MM'&to_day='dd"); String request = urlName + new StockNames().getHexName(stockName) + urlParam + startingDate.format(fromDate.toDate()) + endingDate.format(calendar.toDate()); if (debug) { System.out.printf("(" + calendar.toDate() + ")The full request: %s \n", request); } return request; } private String buildRequest(final DateTime fromDate, final DateTime toDate, final String stockName) { //&from_year=2002&from_month=01&from_day=02&to_year=2010&to_month=10&to_day=01 // SimpleDateFormat startingDate = new SimpleDateFormat("'&from_year='yyyy'&from_month='MM'&from_day='dd"); // SimpleDateFormat endingDate = new SimpleDateFormat("'&to_year='yyyy'&to_month='MM'&to_day='dd"); DateTimeFormatter startingDate = DateTimeFormat.forPattern("'&from_year='yyyy'&from_month='MM'&from_day='dd"); DateTimeFormatter endingDate = DateTimeFormat.forPattern("'&to_year='yyyy'&to_month='MM'&to_day='dd"); String request = urlName + new StockNames().getHexName(stockName) + urlParam + startingDate.print(fromDate) + endingDate.print(toDate); if (debug) { System.out.printf("(" + toDate.toDate() + ")The full request: %s \n", request); } return request; } public BigDecimal fetchData(String stockName, DateTime date, String type) { if (type.compareTo("CLOSE") == 0) { return this.fetchData(stockName, date, 1); } else if (type.compareTo("VOLUME") == 0) { return this.fetchData(stockName, date, 2); } else if (type.compareTo("AVRG") == 0) { return this.fetchData(stockName, date, 4); } return null; } public BigDecimal fetchData(String stockName, DateTime date, int col) { BigDecimal result = null; URL url; System.out.printf("NetworkOP fetchData(%s,hex:%s, date:%s col:%d)\n", stockName, new StockType(stockName).getHexName(), date.toString(), col); try { url = new URL(this.buildRequest(date, stockName)); 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); //String formatHttp = "<div class=\"Ensimmainen\">\n" + datePattern + "\n</div>"; if (data.indexOf(datePattern) != -1) { for (int i = 0; i < col; 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 BigDecimal.valueOf(Double.valueOf(fdata).doubleValue()); } } } catch (IOException ex) { System.out.printf("Failed in :%s\n", "NetworkOP"); //Logger.getLogger(NetworkGoogle.class.getName()).log(Level.SEVERE, null, ex); } return result; } public double[] fetchDataPeriod(String stockName, DateTime fromDate, DateTime toDate, String type) { if (type.compareTo("CLOSE") == 0) { return this.fetchDataPeriod(stockName, fromDate, toDate, 1); } else if (type.compareTo("VOLUME") == 0) { return this.fetchDataPeriod(stockName, fromDate, toDate, 2); } else if (type.compareTo("AVRG") == 0) { return this.fetchDataPeriod(stockName, fromDate, toDate, 4); } return null; } private double[] fetchDataPeriod(String stockName, DateTime fromDate, DateTime toDate, int col) { List<Double> values = new ArrayList<Double>(); URL url; System.out.printf("NetworkOP fetchData(%s,hex:%s, date:%s-%s col:%d)\n", stockName, new StockType(stockName).getHexName(), fromDate.toString(), toDate.toString(), col); try { url = new URL(this.buildRequest(fromDate, toDate, stockName)); Document doc = Jsoup.parse(url, 2 * 1000); 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(); //System.out.printf("Fetching.. :%s\n", dateFormatter.print(dateIter.getCurrentAsCalendar())); //String formatHttp = "<div class=\"Ensimmainen\">\n" + datePattern + "\n</div>"; if (data.indexOf(datePattern) != -1) { for (int i = 0; i < col; 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); } values.add(Double.valueOf(fdata)); break; } } } } catch (IOException ex) { System.out.printf("Failed in :%s\n", "NetworkOP"); //Logger.getLogger(NetworkGoogle.class.getName()).log(Level.SEVERE, null, ex); } return ArrayUtils.toPrimitive(values.toArray(new Double[0])); } public void storeClosingPrice(String stockName, DateTime date, BigDecimal value) { throw new UnsupportedOperationException("Not supported yet."); } public void storeVolume(String stockName, DateTime date, BigDecimal value) { throw new UnsupportedOperationException("Not supported yet."); } public void storeData(String stockName, DateTime date, BigDecimal value, String type) { throw new UnsupportedOperationException("Not supported yet."); } }