data.DataGetterActGoogle.java Source code

Java tutorial

Introduction

Here is the source code for data.DataGetterActGoogle.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package data;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.stream.JsonReader;
import communication.IBroker;
import java.time.LocalDate;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.logging.Logger;

/**
 *
 * @author Muhe
 */
public class DataGetterActGoogle implements IDataGetterAct {

    private final static Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);

    private class DataGSON {

        private String t;
        private String l;
    }

    @Override
    public String getName() {
        return "Google";
    }

    @Override
    public double readActualData(String tickerSymbol) {
        try {
            StringBuilder urlBuilder = new StringBuilder();

            urlBuilder.append("http://finance.google.com/finance/info?client=ig&q=");

            urlBuilder.append(tickerSymbol);

            URL urlGoogle = new URL(urlBuilder.toString());
            DataGSON[] entryArray;
            try (BufferedReader in = new BufferedReader(new InputStreamReader(urlGoogle.openStream()))) {
                in.skip(3);
                Gson gson = new GsonBuilder().create();
                JsonReader reader = new JsonReader(in);
                reader.setLenient(true);
                entryArray = gson.fromJson(reader, DataGSON[].class);
            }

            return Double.parseDouble(entryArray[0].l.replaceAll(",", ""));

        } catch (IOException | NumberFormatException ex) {
            logger.warning("Failed to load actual data from google at once. Exception: " + ex.getMessage());
            return 0;
        }
    }

    @Override
    public Map<String, Double> readActualData(String[] tickerSymbols) {
        try {
            StringBuilder urlBuilder = new StringBuilder();

            urlBuilder.append("http://finance.google.com/finance/info?client=ig&q=");

            for (String tickerSymbol : tickerSymbols) {
                urlBuilder.append(tickerSymbol);
                urlBuilder.append(",");
            }
            urlBuilder.deleteCharAt(urlBuilder.length() - 1); //remove last ,

            URL urlGoogle = new URL(urlBuilder.toString());
            DataGSON[] dataFromGSON;
            try (BufferedReader in = new BufferedReader(new InputStreamReader(urlGoogle.openStream()))) {
                in.skip(3);
                Gson gson = new GsonBuilder().create();
                JsonReader reader = new JsonReader(in);
                reader.setLenient(true);
                dataFromGSON = gson.fromJson(reader, DataGSON[].class);
            }

            Map<String, Double> valuesMap = new HashMap<>(dataFromGSON.length);

            for (DataGSON entryGSON : dataFromGSON) {
                String tickerSymbol = entryGSON.t;
                String strValue = entryGSON.l.replaceAll(",", "");
                valuesMap.put(tickerSymbol, Double.parseDouble(strValue));
            }

            return valuesMap;

        } catch (IOException | NumberFormatException ex) {
            logger.warning("Failed to load actual data from google at once. Exception: " + ex.getMessage());
            return null;
        }
    }
}