org.jtotus.database.FileSystemFromHex.java Source code

Java tutorial

Introduction

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

Source

/*
 * JStock - Free Stock Market Software
 * Copyright (C) 2009 Yan Cheng CHEOK <yccheok@yahoo.com>
 *
 * This program 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 2 of the License, or
 * (at your option) any later version.
 *
 * This program 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 this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

package org.jtotus.database;

import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.math.BigDecimal;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

/**
 *
 * @author Evgeni Kappinen
 */
public class FileSystemFromHex implements InterfaceDataBase {

    String pathToDataBaseDir = "OMXNordic/";
    String filePattern = "yyyy-MM-dd";
    private final DateTimeFormatter dateFormatter = DateTimeFormat.forPattern(filePattern);

    private int columnHighestPrice = 1;
    private int columnLowestPrice = 2;
    private int columnClosingPrice = 3;
    private int columnAvrPrice = 4;
    private int columnTotalVolume = 5;
    private int columnTurnOver = 6;
    private int columnTrades = 7;

    //TODO:find column* values by reading first line in file,
    // if contains string which indicates value type change value.

    private FileFilter filterForDir() {
        FileFilter fileFilter = new FileFilter() {
            public boolean accept(File file) {
                if (!file.isFile() || !file.canRead()) {
                    return false;
                }

                String name = file.getName();
                if (!name.endsWith(".xls")) {
                    return false;
                }
                return true;
            }
        };
        return fileFilter;
    }

    public BigDecimal fetchHighestPrice(String stockName, DateTime calendar) {
        return this.fetchValue(stockName, calendar, columnHighestPrice);
    }

    public BigDecimal fetchLowestPrice(String stockName, DateTime calendar) {
        return this.fetchValue(stockName, calendar, columnLowestPrice);
    }

    public BigDecimal fetchClosingPrice(String stockName, DateTime calendar) {
        return this.fetchValue(stockName, calendar, columnClosingPrice);
    }

    public BigDecimal fetchAveragePrice(String stockName, DateTime calendar) {
        return this.fetchValue(stockName, calendar, columnAvrPrice);
    }

    public BigDecimal fetchTurnOver(String stockName, DateTime calendar) {
        return this.fetchValue(stockName, calendar, columnTurnOver);
    }

    public BigDecimal fetchTrades(String stockName, DateTime calendar) {
        return this.fetchValue(stockName, calendar, columnTrades);
    }

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

        if (type.compareTo("HIGH") == 0) {
            return this.fetchValue(stockName, date, columnHighestPrice);
        } else if (type.compareTo("LOW") == 0) {
            return this.fetchValue(stockName, date, columnLowestPrice);
        } else if (type.compareTo("CLOSE") == 0) {
            return this.fetchValue(stockName, date, columnClosingPrice);
        } else if (type.compareTo("VOLUME") == 0) {
            return this.fetchValue(stockName, date, columnTotalVolume);
        } else if (type.compareTo("AVRG") == 0) {
            return this.fetchValue(stockName, date, columnAvrPrice);
        } else if (type.compareTo("TRADES") == 0) {
            return this.fetchValue(stockName, date, columnTrades);
        } else if (type.compareTo("TURNOVER") == 0) {
            return this.fetchValue(stockName, date, columnTurnOver);
        }
        return null;
    }

    private BigDecimal fetchValue(String stockName, DateTime date, int row) {
        BigDecimal result = null;

        //    System.out.printf("Reading file system !:%d time:%s\n", row, date.getTime().toString());

        File dir = new File("./" + pathToDataBaseDir);
        FileFilter filter = filterForDir();

        File[] listOfFiles = dir.listFiles(filter);

        if (listOfFiles == null) {
            return null;
        }

        for (int i = 0; i < listOfFiles.length; i++) {
            String nameOfFile = listOfFiles[i].getName();

            if (nameOfFile.indexOf(stockName) != -1) {
                System.out.printf("FileSystemFromHex", "Found File:%s\n", nameOfFile);
                result = this.omxNordicFile(nameOfFile, date, row);
                if (result != null) {
                    return result;
                }
            }
        }

        System.out.printf("FileSystemFromHex", "Not found value for:%s\n", stockName);

        return result;
    }

    public BigDecimal omxNordicFile(String fileName, DateTime calendar, int row) {
        BigDecimal result = null;

        try {

            POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(pathToDataBaseDir + fileName));

            HSSFWorkbook workbook = new HSSFWorkbook(fs);

            HSSFSheet worksheet = workbook.getSheetAt(0);
            //HSSFRow row1 = worksheet.getRow(0);

            String correctTime = dateFormatter.print(calendar);
            Iterator rowIter = worksheet.rowIterator();

            while (rowIter.hasNext()) {
                HSSFRow rows = (HSSFRow) rowIter.next();
                HSSFCell cell = rows.getCell(0);
                String dateString = null;
                if (cell.getCellType() == Cell.CELL_TYPE_STRING) {
                    dateString = cell.getStringCellValue();
                } else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
                    Date date = cell.getDateCellValue();
                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
                    dateString = format.format(date);

                    //                    System.err.printf("File (%s) is corrucped ? type:%s\n", fileName, dateString);

                } else {
                    System.err.printf("File (%s) is corrucped ? type:%d formula:%d\n", fileName, cell.getCellType(),
                            Cell.CELL_TYPE_FORMULA);
                    return null;
                }

                //  help.debug("FileSystemFromHex","Searching:%s from:%s\n", correctTime, temp);
                if (correctTime.compareTo(dateString) == 0) {
                    HSSFCell closingPrice = rows.getCell(row);
                    if (closingPrice == null)
                        return null;

                    float floatTemp = (float) closingPrice.getNumericCellValue();
                    System.out.printf("FileSystemFromHex", "Closing price at:%d f:%.4f Time:%s\n",
                            cell.getRowIndex(), floatTemp, correctTime);

                    return new BigDecimal(floatTemp);
                }
            }

        } catch (IOException ex) {
            Logger.getLogger(FileSystemFromHex.class.getName()).log(Level.SEVERE, null, ex);
        }

        return result;
    }

    public BigDecimal fetchVolume(String stockName, DateTime calendar) {
        return this.fetchValue(stockName, calendar, columnTotalVolume);
    }

    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.");
    }

    @Override
    public double[] fetchDataPeriod(String stockName, DateTime fromDate, DateTime toDate, String type) {
        return null;
    }
}