package uk.ac.cam.cstibhotel.otcanalyser.networklayer;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Calendar;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import uk.ac.cam.cstibhotel.otcanalyser.database.Database;
import uk.ac.cam.cstibhotel.otcanalyser.gui.StatusBar;
import uk.ac.cam.cstibhotel.otcanalyser.trade.Trade;
public class InitialUpdateWorker extends Thread {
private boolean running;
@Override
public void run() {
System.out.println("NetworkLayer: initial update requested");
running = true;
synchronized(NetworkLayer.targetUpdateDate) {
initialUpdate();
if (running) sliceUpdate();
}
}
private void initialUpdate() {
System.out.println("NetworkLayer: initial update started");
Date now = new Date();
Calendar target = Calendar.getInstance();
target.setTime(now);
target.add(Calendar.DATE, -1);
NetworkLayer.targetUpdateDate = target.getTime();
Calendar lastUpdate = Calendar.getInstance();
lastUpdate.setTime(Database.getDB().getLastUpdateTime());
lastUpdate.add(Calendar.DATE, -1);
while ((target.get(Calendar.YEAR) != lastUpdate.get(Calendar.YEAR) ||
target.get(Calendar.MONTH) + 1 != lastUpdate.get(Calendar.MONTH) + 1 ||
target.get(Calendar.DAY_OF_MONTH) != lastUpdate.get(Calendar.DAY_OF_MONTH))
&& running) {
lastUpdate.add(Calendar.DATE, 1);
String formatDate = lastUpdate.get(Calendar.YEAR) + "_" +
((lastUpdate.get(Calendar.MONTH) + 1) < 10 ? "0" : "") +
(lastUpdate.get(Calendar.MONTH) + 1) + "_" +
(lastUpdate.get(Calendar.DAY_OF_MONTH) < 10 ? "0" : "") +
lastUpdate.get(Calendar.DAY_OF_MONTH);
List<String> zipURLString = new LinkedList<String>();
zipURLString.add(NetworkLayer.repo + "/slices/CUMULATIVE_COMMODITIES_" + formatDate + ".zip");
zipURLString.add(NetworkLayer.repo + "/slices/CUMULATIVE_CREDITS_" + formatDate + ".zip");
zipURLString.add(NetworkLayer.repo + "/slices/CUMULATIVE_EQUITIES_" + formatDate + ".zip");
zipURLString.add(NetworkLayer.repo + "/slices/CUMULATIVE_FOREX_" + formatDate + ".zip");
zipURLString.add(NetworkLayer.repo + "/slices/CUMULATIVE_RATES_" + formatDate + ".zip");
for (String s : zipURLString) {
boolean done = false;
while (!done) {
try {
List<Trade> newTrades = ParseZIP.downloadData(s, NetworkLayer.splitter, NetworkLayer.secondarySplitter);
Database.getDB().addTrade(newTrades);
done = true;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
if (e.getMessage().startsWith("Server returned HTTP response code: 403")) {
done = true; //could log that server doesn't have data
} else {
StatusBar.setMessage("Error: Could not download data for " + formatDate +
". Check your internet connection.", 0);
try {
Thread.sleep(10000);
}
catch (InterruptedException ie) {
}
}
e.printStackTrace();
}
}
}
System.out.println("NetworkLayer: current version is " + lastUpdate.get(Calendar.YEAR) + " "+
(lastUpdate.get(Calendar.MONTH) + 1) + " " + lastUpdate.get(Calendar.DAY_OF_MONTH));
StatusBar.setMessage("NetworkLayer: current version is " + lastUpdate.get(Calendar.YEAR) + " "+
(lastUpdate.get(Calendar.MONTH) + 1) + " " + lastUpdate.get(Calendar.DAY_OF_MONTH), 0);
}
System.out.println("NetworkLayer: initial update completed");
}
private void sliceUpdate() {
System.out.println("NetworkLayer: slice update started");
for (;;) {
Calendar today = Calendar.getInstance();
String formatDate = today.get(Calendar.YEAR) + "_" +
((today.get(Calendar.MONTH) + 1) < 10 ? "0" : "") +
(today.get(Calendar.MONTH) + 1) + "_" +
(today.get(Calendar.DAY_OF_MONTH) < 10 ? "0" : "") +
today.get(Calendar.DAY_OF_MONTH);
int slice[] = new int[]{1, 1, 1, 1, 1};
int todayct = 0;
while (Calendar.getInstance().get(Calendar.DAY_OF_MONTH) == today.get(Calendar.DAY_OF_MONTH)) {
String[] zipURLString = new String[5];
zipURLString[0] = NetworkLayer.repo + "/slices/SLICE_COMMODITIES_" + formatDate + "_" + slice[0] + ".zip";
zipURLString[1] = NetworkLayer.repo + "/slices/SLICE_CREDITS_" + formatDate + "_" + slice[1] + ".zip";
zipURLString[2] = NetworkLayer.repo + "/slices/SLICE_EQUITIES_" + formatDate + "_" + slice[2] + ".zip";
zipURLString[3] = NetworkLayer.repo + "/slices/SLICE_FOREX_" + formatDate + "_" + slice[3] + ".zip";
zipURLString[4] = NetworkLayer.repo + "/slices/SLICE_RATES_" + formatDate + "_" + slice[4] + ".zip";
boolean gotAnything = false;
for (int i = 0; i<5; i++) {
boolean done = false;
while (!done) {
try {
List<Trade> newTrades = ParseZIP.downloadData(zipURLString[i], NetworkLayer.splitter, NetworkLayer.secondarySplitter);
Database.getDB().addTrade(newTrades);
slice[i]++;
gotAnything = true;
StatusBar.setMessage(++todayct + " slices received today.", 0);
done = true;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
if (e.getMessage().startsWith("Server returned HTTP response code: 403")) {
done = true;
} else {
StatusBar.setMessage("Error: Could not download slice for " + formatDate +
". Check your internet connection.", 0);
try {
Thread.sleep(10000);
}
catch (InterruptedException ie) {
}
e.printStackTrace();
}
}
}
}
if (!gotAnything)
try {
Thread.sleep(1000);
}
catch (InterruptedException ie) {
}
if (!running) {
return;
}
}
}
}
public boolean isRunning() {
return running;
}
public void setRunning(boolean running) {
this.running = running;
}
}