package engine;
import dao.DaoTheoricalTrainData;
import externaldata.gareSelection.GareSelection;
import externaldata.theoricaltimefile.TheoricalTimeTrainFileHelper;
import externaldata.theoricaltimefile.TheoricalTrainData;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import javax.servlet.ServletContext;
import com.sun.xml.internal.bind.CycleRecoverable.Context;
public class WeeklyDatabaseUpdater implements Runnable {
private Object sharedBarrier;
private List<GareSelection> gares;
private int dayNumberForDataFileUpdate = 6; // Correspond � vendredi sur le Calendar java
private ServletContext context;
public WeeklyDatabaseUpdater(List<GareSelection> gares, Object sharedBarrier, ServletContext context) {
this.sharedBarrier = sharedBarrier;
this.gares = gares;
this.context = context;
}
@Override
public void run() {
// Premi�re maj
updateSchedule();
synchronized (sharedBarrier) {
// La premi�re maj est termin�e
sharedBarrier.notify();
}
while (true) {
try {
int currentDayNumber = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
int daysToWaitForNextUpdate = (currentDayNumber < dayNumberForDataFileUpdate) ? (dayNumberForDataFileUpdate - currentDayNumber) : ((dayNumberForDataFileUpdate + 7) - currentDayNumber);
System.out.println("Nombre de jours d'attente avant prochain DL fichier : " + daysToWaitForNextUpdate);
// Le thread s'endort jusqu'au prochain vendredi (==> fichier mis � jour le jeudi soir � la SNCF)
Thread.sleep(daysToWaitForNextUpdate*24*60*60*1000);
updateSchedule();
} catch (InterruptedException e) {
// Thread interrompu par la m�thode 'interrupt'
// On termine l'ex�cution en sortant de la boucle infinie
break;
}
}
}
private void updateSchedule() {
// R�cup�ration des nouvelles donn�es
List<TheoricalTrainData> newTheoricalTrainData = TheoricalTimeTrainFileHelper.extractStopTimes(gares, context.getRealPath(""));
List<TheoricalTrainData> theoricalTrainDataToSave = new ArrayList<TheoricalTrainData>(newTheoricalTrainData);
// R�cup�ration des anciennes donn�es stock�es en BDD
DaoTheoricalTrainData dao = new DaoTheoricalTrainData();
List<TheoricalTrainData> oldTheoricalTrainData = dao.getAll();
List<TheoricalTrainData> theoricalTrainDataToDelete = new ArrayList<TheoricalTrainData>(oldTheoricalTrainData);
// Parcours des listes et comparaisons
for (TheoricalTrainData tmp_old_data : oldTheoricalTrainData) {
for (TheoricalTrainData tmp_new_data : newTheoricalTrainData) {
// Si on a les m�mes data dans la BD et dans le nouveau fichiers,
// alors on peut garder la data en BD sans y toucher
if (tmp_old_data.equals(tmp_new_data)) {
theoricalTrainDataToSave.remove(tmp_new_data);
theoricalTrainDataToDelete.remove(tmp_old_data);
break;
}
}
}
// Les datas qui sont rest�es dans la liste theoricalTrainDataToSave
// sont les nouvelles donn�es � stocker dans la BD
dao.saveAll(theoricalTrainDataToSave);
// Les datas qui sont rest�es dans la liste theoricalTrainDataToDelete
// sont les anciennes donn�es � supprimer de la BD
dao.deleteList(theoricalTrainDataToDelete);
}
}