org.jtotus.database.NetworkGoogle.java Source code

Java tutorial

Introduction

Here is the source code for org.jtotus.database.NetworkGoogle.java

Source

/*
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.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.util.HashMap;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.jtotus.common.StockNames;

/**
 *
 * @author Evgeni Kappinen
 */

public class NetworkGoogle implements InterfaceDataBase {
    private static final String url = "http://www.google.com/finance/historical";
    private static final String timePatternForWrite = "MMMM+d'%2C'+Y";
    private static final String timePatternForRead = "dd-MMMM-yy";

    private static final StockNames names = new StockNames();
    private static final DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MM-yyyy");

    private static final int dateInd = 0;
    private static final int openInd = 1;
    private static final int highInd = 2;
    private static final int lowhInd = 3;
    private static final int closehInd = 4;
    private static final int volumeInd = 5;

    public NetworkGoogle() {
        //        BasicConfigurator.configure();
    }

    public BigDecimal fetchClosingPrice(String stockName, DateTime calendar) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public BigDecimal fetchAveragePrice(String stockName, DateTime time) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public BigDecimal fetchVolume(String stockName, DateTime date) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    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 HashMap<String, Double> fetchPeriodAsMap(String stockName, DateTime startDate, DateTime endDate) {
        HashMap<String, Double> retMap = new HashMap<String, Double>(500);
        DefaultHttpClient client = new DefaultHttpClient();
        HttpGet httpGet = null;
        try {
            DateTimeFormatter formatterOUT = DateTimeFormat.forPattern(timePatternForWrite);
            DateTimeFormatter formatterIN = DateTimeFormat.forPattern(timePatternForRead);

            String query = url + "?q=" + names.getHexName(stockName) + "&" + "startdate="
                    + formatterOUT.print(startDate) + "&" + "enddate=" + formatterOUT.print(endDate) + "&"
                    + "&num=30&output=csv";

            System.out.printf("HttpGet:%s : date:%s\n", query, formatterOUT.print(startDate));
            httpGet = new HttpGet(query);

            HttpResponse response = client.execute(httpGet);
            StatusLine status = response.getStatusLine();
            if (status.getStatusCode() != 200) {
                throw new IOException("Invalid response from server: " + status.toString());
            }

            HttpEntity entity = response.getEntity();

            BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent()));

            //            Date, Open,High,Low,Close,Volume
            String line = reader.readLine(); //Header
            while ((line = reader.readLine()) != null) {
                String[] values = line.split(",");
                DateTime date = formatterIN.parseDateTime(values[0]);
                double value = Double.parseDouble(values[4]);
                retMap.put(formatter.print(date), value);
            }

        } catch (IOException ex) {
            System.err.printf("Unable to find market data for: %s - %s\n", names.getHexName(stockName), stockName);
        } catch (IllegalArgumentException ex) {
            System.err.printf("Unable to find market data for: %s - %s\n", names.getHexName(stockName), stockName);
        } finally {
            if (httpGet != null) {

            }
        }

        System.out.printf("NetworkGoogle fetched : %d values\n", retMap.size());
        return retMap;
    }

    public BigDecimal fetchDataInternal(String stockName, DateTime endDate, int type) {
        DefaultHttpClient client = new DefaultHttpClient();
        HttpGet httpGet = null;
        DateTime startDate = endDate.minusDays(5);
        BigDecimal retValue = null;
        try {
            DateTimeFormatter formatterOUT = DateTimeFormat.forPattern(timePatternForWrite);
            DateTimeFormatter formatterIN = DateTimeFormat.forPattern(timePatternForRead);

            String query = url + "?q=" + names.getHexName(stockName) + "&" + "startdate="
                    + formatterOUT.print(startDate) + "&" + "enddate=" + formatterOUT.print(endDate) + "&"
                    + "&num=30&output=csv";

            System.out.printf("HttpGet:%s : date:%s\n", query, formatterOUT.print(startDate));
            httpGet = new HttpGet(query);

            HttpResponse response = client.execute(httpGet);
            StatusLine status = response.getStatusLine();
            if (status.getStatusCode() != 200) {
                throw new IOException("Invalid response from server: " + status.toString());
            }

            HttpEntity entity = response.getEntity();

            BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent()));

            //            Date, Open,High,Low,Close,Volume
            String line = reader.readLine(); //Header
            while ((line = reader.readLine()) != null) {
                String[] values = line.split(",");
                double value = Double.parseDouble(values[type]);
                retValue = BigDecimal.valueOf(value);
            }

        } catch (IOException ex) {
            System.err.printf("Unable to find market data for: %s - %s\n", names.getHexName(stockName), stockName);
        } catch (IllegalArgumentException ex) {
            System.err.printf("Unable to find market data for: %s - %s\n", names.getHexName(stockName), stockName);
        } finally {
            if (httpGet != null) {
                //FIXME: what to do ?
            }
        }

        return retValue;
    }

    //FIXME: impliment

    public BigDecimal fetchData(String stockName, DateTime date, String type) {

        if (type.compareTo("OPEN") == 0) {
            return this.fetchDataInternal(stockName, date, openInd);
        } else if (type.compareTo("HIGH") == 0) {
            return this.fetchDataInternal(stockName, date, highInd);
        } else if (type.compareTo("LOW") == 0) {
            return this.fetchDataInternal(stockName, date, lowhInd);
        } else if (type.compareTo("CLOSE") == 0) {
            return this.fetchDataInternal(stockName, date, closehInd);
        } else if (type.compareTo("VOLUME") == 0) {
            return this.fetchDataInternal(stockName, date, volumeInd);
        }
        return null;
    }

    public void storeData(String stockName, DateTime date, BigDecimal value, String type) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public double[] fetchDataPeriod(String stockName, DateTime fromDate, DateTime toDate, String type) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

}