package org.chartsy.main.managers; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Properties; import org.chartsy.main.data.DataItem; import org.chartsy.main.data.Dataset; import org.chartsy.main.data.Stock; import org.chartsy.main.utils.FileUtils; /** * * @author Viorel */ public class CacheManager { private static CacheManager instance; public static CacheManager getInstance() { if (instance == null) instance = new CacheManager(); return instance; } private CacheManager() { } public int getLastChartFrameId() throws IOException { String folder = FileUtils.cacheFolder(); File file = FileUtils.hashedCacheFile(folder, "charts"); if (file.exists()) { Properties properties = new Properties(); FileInputStream fileInputStream = new FileInputStream(file); properties.load(fileInputStream); int id = Integer.parseInt(properties.getProperty("last_id", "0")); return id; } else return 0; } public void cacheLastChartFrameId(int id) throws IOException { String folder = FileUtils.cacheFolder(); File file = FileUtils.hashedCacheFile(folder, "charts"); if (!file.exists()) file.createNewFile(); Properties properties = new Properties(); properties.setProperty("last_id", Integer.toString(id)); FileOutputStream fileOutputStream = new FileOutputStream(file); properties.store(fileOutputStream, ""); fileOutputStream.flush(); fileOutputStream.close(); } public boolean stockCacheExists(String fileName) { String folder = FileUtils.cacheStocksFolder(); File file = FileUtils.hashedCacheFile(folder, fileName); return file.exists(); } public void cacheStock(Stock stock, String fileName) throws IOException { String folder = FileUtils.cacheStocksFolder(); File file = FileUtils.hashedCacheFile(folder, fileName); if (!file.exists()) { file.createNewFile(); file.deleteOnExit(); } Properties properties = new Properties(); properties.setProperty("symbol", stock.getSymbol()); properties.setProperty("exchange", stock.getExchange()); properties.setProperty("companyName", stock.getCompanyName()); FileOutputStream fileOutputStream = new FileOutputStream(file); properties.store(fileOutputStream, ""); fileOutputStream.flush(); fileOutputStream.close(); } public Stock fetchStockFromCache(String fileName) throws IOException { String folder = FileUtils.cacheStocksFolder(); File file = FileUtils.hashedCacheFile(folder, fileName); FileInputStream fileInputStream = new FileInputStream(file); Properties properties = new Properties(); properties.load(fileInputStream); Stock stock = new Stock(); stock.setSymbol(properties.getProperty("symbol")); stock.setExchange(properties.getProperty("exchange", "")); stock.setCompanyName(properties.getProperty("companyName", "")); fileInputStream.close(); return stock; } public boolean datasetCacheExists(String fileName) { String folder = FileUtils.cacheDatasetsFolder(); File file = FileUtils.hashedCacheFile(folder, fileName); return file.exists(); } public void cacheDataset(Dataset dataset, String fileName) throws IOException { String folder = FileUtils.cacheDatasetsFolder(); File file = FileUtils.hashedCacheFile(folder, fileName); if (!file.exists()) { file.createNewFile(); file.deleteOnExit(); } Properties properties = new Properties(); int size = dataset.getItemsCount(); for (int i = 0; i < size; i++) { DataItem item = dataset.getDataItem(i); if (item != null) properties.setProperty(Integer.toString(i), dataset.getDataItem(i).toString()); else properties.setProperty(Integer.toString(i), "null"); } FileOutputStream fileOutputStream = new FileOutputStream(file); properties.store(fileOutputStream, ""); fileOutputStream.flush(); fileOutputStream.close(); } public void fetchDatasetFromCache(String fileName) throws IOException { String folder = FileUtils.cacheDatasetsFolder(); File file = FileUtils.hashedCacheFile(folder, fileName); Properties properties = new Properties(); FileInputStream fileInputStream = new FileInputStream(file); properties.load(fileInputStream); int size = properties.size(); List<DataItem> items = new ArrayList<DataItem>(); for (int i = 0; i < size; i++) { String key = Integer.toString(i); String property = properties.getProperty(key); if (property.equals("null")) { items.add(null); } else { String[] values = property.split(","); DataItem item = new DataItem( Long.parseLong(values[0]), Double.parseDouble(values[1]), Double.parseDouble(values[2]), Double.parseDouble(values[3]), Double.parseDouble(values[4]), Double.parseDouble(values[5])); items.add(item); } } Dataset dataset = new Dataset(items); DatasetUsage.getInstance().addDataset(fileName, dataset); fileInputStream.close(); } public Dataset getDatasetFromCache(String fileName) throws IOException { String folder = FileUtils.cacheDatasetsFolder(); File file = FileUtils.hashedCacheFile(folder, fileName); Properties properties = new Properties(); FileInputStream fileInputStream = new FileInputStream(file); properties.load(fileInputStream); int size = properties.size(); List<DataItem> items = new ArrayList<DataItem>(); for (int i = 0; i < size; i++) { String key = Integer.toString(i); String property = properties.getProperty(key); if (property.equals("null")) { items.add(null); } else { String[] values = property.split(","); DataItem item = new DataItem( Long.parseLong(values[0]), Double.parseDouble(values[1]), Double.parseDouble(values[2]), Double.parseDouble(values[3]), Double.parseDouble(values[4]), Double.parseDouble(values[5])); items.add(item); } } Dataset dataset = new Dataset(items); fileInputStream.close(); return dataset; } public int fetchDatasetSize(String fileName) throws IOException { String folder = FileUtils.cacheDatasetsFolder(); File file = FileUtils.hashedCacheFile(folder, fileName); Properties properties = new Properties(); FileInputStream fileInputStream = new FileInputStream(file); properties.load(fileInputStream); int size = properties.size(); fileInputStream.close(); return size; } public Dataset fetchVisibleDatasetFromCache(String fileName, int period, int end) throws IOException { String folder = FileUtils.cacheDatasetsFolder(); File file = FileUtils.hashedCacheFile(folder, fileName); Properties properties = new Properties(); FileInputStream fileInputStream = new FileInputStream(file); properties.load(fileInputStream); List<DataItem> items = new ArrayList<DataItem>(); int size = properties.size(); for (int i = 0; i < period; i++) { int j = end - period + i; if (j < size && j >= 0) { String key = Integer.toString(j); String property = properties.getProperty(key); if (property.equals("null")) { items.add(null); } else { String[] values = property.split(","); DataItem item = new DataItem( Long.parseLong(values[0]), Double.parseDouble(values[1]), Double.parseDouble(values[2]), Double.parseDouble(values[3]), Double.parseDouble(values[4]), Double.parseDouble(values[5])); items.add(item); } } } fileInputStream.close(); Dataset dataset = new Dataset(items); return dataset; } }