/*
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/>.
*/
package org.jlucrum.realtime.generators;
import com.espertech.esper.client.EPRuntime;
import org.jlucrum.realtime.eventtypes.StockTick;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.joda.time.DateTime;
import org.joda.time.DateTimeConstants;
import org.joda.time.DateTimeZone;
import org.jtotus.config.ConfTickGenerator;
import org.jtotus.config.ConfigLoader;
import org.jtotus.config.GUIConfig;
import org.jtotus.network.NetworkTickConnector;
import org.jtotus.network.NordnetConnect;
/**
*
* @author Evgeni Kappinen
*/
public class TickGenerator implements EsperEventGenerator {
private EPRuntime esperEngine = null;
private NetworkTickConnector networkTicks = null;
private ConfTickGenerator config = null;
private String[] stockList = null;
public TickGenerator(EPRuntime cepRT) {
esperEngine = cepRT;
ConfigLoader<ConfTickGenerator> loader
= new ConfigLoader<ConfTickGenerator>("ConfTickGenerator");
config = loader.getConfig();
if (config == null) {
config = new ConfTickGenerator();
loader.storeConfig(config);
}
}
boolean initialize() {
if (networkTicks != null) {
return true;
}
ConfigLoader<GUIConfig> stockLoader = new ConfigLoader<GUIConfig>("GUIConfig");
stockList = stockLoader.getConfig().fetchStockNames();
networkTicks = new NordnetConnect();
return networkTicks.connect();
}
public String call() throws Exception {
StockTick tick = null;
if (!this.initialize()) {
System.err.printf("Failed to initialize..\n");
return null;
}
System.out.printf("Stargin TickGenerator..\n");
while (true) {
if (timeout()) {
continue;
}
for (String stockName : stockList) {
tick = networkTicks.getTick(stockName);
if (tick != null) {
esperEngine.sendEvent(tick);
}
}
System.out.printf("Sleeping (%d) ...\n", config.sleepBetweenTicks);
Thread.sleep(config.sleepBetweenTicks);
}
}
private boolean timeout() {
DateTimeZone timeZone = null;
DateTime time = null;
long startTickerTime = 0;
long endTickerTime = 0;
boolean toContinue = false;
timeZone = DateTimeZone.forID(config.timeZone);
startTickerTime = config.start_hour * 60 + config.start_minute;
endTickerTime = config.end_hour * 60 + config.end_minute;
try {
time = new DateTime(timeZone);
System.out.printf("Timezone:%s and week:%d - %d", timeZone.toString(), time.getDayOfWeek(), DateTimeConstants.SATURDAY);
if (DateTimeConstants.SATURDAY == time.getDayOfWeek()) {
long toSleep = 24 * 60 - time.getMinuteOfDay() + 24*60;
System.out.printf("TickGenerator sleeps until Monday, because it is Saturday\n");
Thread.sleep(toSleep * 60 * 1000);
toContinue = true;
} else if (DateTimeConstants.SUNDAY == time.getDayOfWeek()) {
long toSleep = 24 * 60 - time.getMinuteOfDay();
System.out.printf("TickGenerator sleeps until Monday, because it is Sunday\n");
Thread.sleep(toSleep * 60 * 1000);
toContinue = true;
}
if (time.getMinuteOfDay() < startTickerTime) {
long minutesToSleep = Math.abs(time.getMinuteOfDay() - startTickerTime);
System.out.printf("Sleeping (%d) minutes ... Starting 1 at:%d:%d\n", minutesToSleep, config.start_hour, config.start_minute);
Thread.sleep(minutesToSleep * 60 * 1000);
toContinue = true;
} else if (time.getMinuteOfDay() > endTickerTime) {
long minutesToSleep = 24 * 60 - time.getMinuteOfDay();
minutesToSleep += startTickerTime;
System.out.printf("Sleeping (%d) minutes ... Starting 2 at:%d:%d\n", minutesToSleep, config.start_hour, config.start_minute);
Thread.sleep(minutesToSleep * 60 * 1000);
toContinue = true;
}
} catch (InterruptedException ex) {
Logger.getLogger(TickGenerator.class.getName()).log(Level.SEVERE, null, ex);
}
return toContinue;
}
}