package org.chartsy.main.data; import java.io.IOException; import java.io.Serializable; import java.text.ParseException; import java.util.ArrayList; import java.util.List; import java.util.ResourceBundle; import org.chartsy.main.exceptions.InvalidStockException; import org.chartsy.main.exceptions.RegistrationException; import org.chartsy.main.exceptions.StockNotFoundException; import org.chartsy.main.intervals.DailyInterval; import org.chartsy.main.intervals.FifteenMinuteInterval; import org.chartsy.main.intervals.FiveMinuteInterval; import org.chartsy.main.intervals.Interval; import org.chartsy.main.intervals.MonthlyInterval; import org.chartsy.main.intervals.OneMinuteInterval; import org.chartsy.main.intervals.SixtyMinuteInterval; import org.chartsy.main.intervals.ThirtyMinuteInterval; import org.chartsy.main.intervals.WeeklyInterval; import org.chartsy.main.managers.CacheManager; import org.chartsy.main.managers.DatasetUsage; import org.chartsy.main.utils.SerialVersion; import org.openide.util.NbBundle; /** * * @author viorel.gheba */ public abstract class DataProvider implements Serializable { private static final long serialVersionUID = SerialVersion.APPVERSION; public DataProvider(ResourceBundle bundle) { this(bundle, false, false); } public DataProvider(ResourceBundle bundle, boolean supportsIntraDay) { this(bundle, supportsIntraDay, false); } public DataProvider( ResourceBundle bundle, boolean supportsIntraDay, boolean supportsCustomIntervals) { this.name = bundle.getString("DataProvider_NAME"); String[] exgs = bundle.getString("DataProvider_EXG").split(":"); exchanges = new Exchange[exgs.length]; for (int i = 0; i < exgs.length; i++) { String exchange = exgs[i]; String resName = exgs[i].replace(" ", "") + "_PRE"; String sufix = bundle.getString(resName); if (sufix.equals("null")) { sufix = ""; } exchanges[i] = new Exchange(exchange, sufix); } this.supportsIntraDay = supportsIntraDay; this.supportsCustomInterval = supportsCustomIntervals; } public void initialize() { } public String getName() { return this.name; } public Exchange[] getExchanges() { return this.exchanges; } public Interval[] getIntraDayIntervals() { return INTRA_DAY_INTERVALS; } public Interval[] getIntervals() { return INTERVALS; } public Interval[] getSupportedIntervals() { return new Interval[] {}; } public Interval getIntervalFromKey(String key) { for (Interval i : INTERVALS) { if (key.endsWith(i.getTimeParam())) { return i; } } for (Interval i : INTRA_DAY_INTERVALS) { if (key.endsWith(i.getTimeParam())) { return i; } } return null; } public static Interval getInterval(int intervalHash) { for (Interval interval : INTERVALS) { if (interval.hashCode() == intervalHash) { return interval; } } for (Interval interval : INTRA_DAY_INTERVALS) { if (interval.hashCode() == intervalHash) { return interval; } } return null; } public boolean supportsIntraday() { return supportsIntraDay; } public boolean supportsCustomInterval() { return supportsCustomInterval; } public boolean supportsAnyInterval() { return false; } public void fetchStock(String symbol) throws InvalidStockException, StockNotFoundException, RegistrationException, IOException { String symb = ""; String exchange = ""; String company = ""; symbol.trim(); String delimiter = "."; if (symbol.contains(delimiter)) { int index = symbol.indexOf(delimiter); symb = symbol.substring(0, index); exchange = symbol.substring(index - 1, symbol.length() - 1); } else { symb = symbol; } company = fetchCompanyName(symbol); Stock stock = new Stock(symb, exchange); stock.setCompanyName(company); cacheStock(stock); } protected abstract String fetchCompanyName(String symbol) throws InvalidStockException, StockNotFoundException, RegistrationException, IOException; protected void cacheStock(Stock stock) throws IOException { String fileName = getStockKey(stock); CacheManager.getInstance().cacheStock(stock, fileName); } public boolean stockExists(String symbol) { String fileName = getStockKey(symbol); return CacheManager.getInstance().stockCacheExists(fileName); } public Stock fetchStockFromCache(String symbol) { Stock stock = null; String fileName = getStockKey(symbol); try { stock = CacheManager.getInstance().fetchStockFromCache(fileName); } catch (Exception ex) { System.err.println(ex.getMessage()); stock = null; } return stock; } public void fetchDatasetForFavorites(Stock stock) throws IOException, ParseException { Dataset dataset = fetchDataForFavorites(stock); if (dataset != null) { String key = getDatasetKey(stock, DAILY); DatasetUsage.getInstance().addDataset(key, dataset); } else throw new IOException(); } protected abstract Dataset fetchDataForFavorites(Stock stock) throws IOException, ParseException; public void fetchDataset(Stock stock, Interval interval) throws IOException, ParseException { Dataset dataset = fetchData(stock, interval); if (dataset != null) { String key = getDatasetKey(stock, interval); DatasetUsage.getInstance().addDataset(key, dataset); //cacheDataset(key, dataset); } else throw new IOException(); } protected abstract Dataset fetchData(Stock stock, Interval interval) throws IOException, ParseException; public DataItem getLastDataItem(Stock stock, Interval interval) { try { return fetchLastDataItem(stock, interval); } catch (Exception ex) { return null; } } protected abstract DataItem fetchLastDataItem(Stock stock, Interval interval) throws IOException, ParseException; public List<DataItem> getLastDataItems(Stock stock, Interval interval) { return new ArrayList<DataItem>(); } public boolean updateIntraDay(String key, List<DataItem> dataItems) { return false; } protected void cacheDataset(String key, Dataset dataset) throws IOException { CacheManager.getInstance().cacheDataset(dataset, key); } public boolean datasetExists(Stock stock, Interval interval) { String fileName = getDatasetKey(stock, interval); return CacheManager.getInstance().datasetCacheExists(fileName); } public void fetchDatasetFromCache(Stock stock, Interval interval) throws IOException { String fileName = getDatasetKey(stock, interval); CacheManager.getInstance().fetchDatasetFromCache(fileName); } public abstract StockSet fetchAutocomplete(String text) throws IOException; /* * Return the refresh interval in seconds */ public abstract int getRefreshInterval(); public String getStockKey(Stock stock) { return getStockKey(stock.getKey()); } public String getStockKey(String symbol) { return NbBundle.getMessage( DataProvider.class, "Stock_KEY", getName(), symbol); } public String getDatasetKey(Stock stock, Interval interval) { return getDatasetKey(stock.getKey(), interval); } public String getDatasetKey(String symbol, Interval interval) { return NbBundle.getMessage( DataProvider.class, "Dataset_KEY", getName(), symbol, interval.getTimeParam()); } public boolean needsRegistration() { return needsRegistration; } public boolean isRegistred() { return isRegistered; } public String getRegistrationMessage() { return ""; } public String getRegistrationURL() { return ""; } public static final Interval ONE_MINUTE = new OneMinuteInterval(); public static final Interval FIVE_MINUTE = new FiveMinuteInterval(); public static final Interval FIFTEEN_MINUTE = new FifteenMinuteInterval(); public static final Interval THIRTY_MINUTE = new ThirtyMinuteInterval(); public static final Interval SIXTY_MINUTE = new SixtyMinuteInterval(); public static final Interval DAILY = new DailyInterval(); public static final Interval WEEKLY = new WeeklyInterval(); public static final Interval MONTHLY = new MonthlyInterval(); public static final Interval[] INTRA_DAY_INTERVALS = { ONE_MINUTE, FIVE_MINUTE, FIFTEEN_MINUTE, THIRTY_MINUTE, SIXTY_MINUTE }; public static final Interval[] INTERVALS = { DAILY, WEEKLY, MONTHLY }; protected String name; protected Exchange[] exchanges; protected boolean supportsIntraDay = false; protected boolean supportsCustomInterval = false; protected String stocksPath; protected String datasetsPath; protected boolean initializeFlag = true; protected boolean needsRegistration = false; protected boolean isRegistered = false; }