package engine;
import java.io.File;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import java.util.concurrent.ConcurrentHashMap;
import dao.DaoGareUIC;
import dao.HibernateUtil;
import externaldata.gareSelection.GareSelection;
import externaldata.gareSelection.GareSelectionHelper;
import externaldata.gareUIC.GareUICHelper;
import externaldata.theoricaltimefile.TheoricalTrainData;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
@WebListener
public class BackgroundTaskLauncher implements ServletContextListener {
private Thread backgroundThread = null;
private String configDirPath;
/**
* Lance un thread qui va checker r�guli�rement l'API SNCF pour obtenir nos informations
* en temps r�el
*/
public void contextInitialized(ServletContextEvent servCtxtEvent) {
System.out.println("Context initialized ...");
// Chemin d'acc�s aux fichiers de donn�es
configDirPath = servCtxtEvent.getServletContext().getRealPath("") + File.separator + "files_config" + File.separator;
// Tu ne te rechargeras point, mon enfant !!!
servCtxtEvent.getServletContext().setAttribute("reloadable", false);
// ------------ INITIALISATION DE LA BD --------------------------
HibernateUtil.getSessionFactory();
// ------------ FIN DE L'INITIALISATION BD -----------------------
// ------------ RECUPERATION DES INFOS GARES_UIC -----------------
String filepath = configDirPath + "Gare_UIC.xml";
DaoGareUIC daoGUIC= new DaoGareUIC();
daoGUIC.saveAll(GareUICHelper.getGareUicDataFromSourceFile(filepath));
// ------------ FIN DES INFOS GARES_UIC --------------------------
// ------------ RECUPERATION DES INFOS GARES_SELECTIONNEES -------
filepath = configDirPath + "Gare_selection.xml";
// On r�cup�re ici une liste de type Vector (car elle sera partag�e entre plusieurs threads)
List<GareSelection> gares_selection = new Vector<GareSelection>(GareSelectionHelper.getGareSelectionDataFromSourceFile(filepath));
// ------------ FIN DES INFOS GARES_SELECTIONNEES ----------------
// ------------ ENREGISTREMENT DES INFOS DANS LE CONTEXTE --------
servCtxtEvent.getServletContext().setAttribute("gares_selection", gares_selection);
Map<String, List<TheoricalTrainData>> paris_disponibles = new ConcurrentHashMap<String, List<TheoricalTrainData>>();
for (GareSelection tmp_gare : gares_selection) {
paris_disponibles.put(tmp_gare.UIC, new Vector<TheoricalTrainData>());
}
servCtxtEvent.getServletContext().setAttribute("paris_disponibles", paris_disponibles);
// ------------ FIN DE L'ENREGISTREMENT DANS LE CONTEXTE ---------
// ------------ LANCEMENT DU THREAD BACKGROUND -------------------
backgroundThread = new Thread(new BackgroundTaskEngine(gares_selection, servCtxtEvent.getServletContext()));
backgroundThread.start();
// ------------ FIN DU LANCEMENT DE THREAD -----------------------
System.out.println("Background task launched ...");
}
/**
* Doit faire en sorte que le thread lanc� soit bien termin�
*/
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("Context detroyed ...");
if (backgroundThread != null) {
// On tue proprement le thread lanc� au d�marrage
backgroundThread.interrupt();
// Et on attend que le thread soit r�ellement termin� avant de continuer
try {
backgroundThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Background task stopped ...");
}
// Pour regler le probl�me de pool de thread qui ne s'�teind pas quand on �teind le serveur
// Erreur dans hibernate 4.3.4 final, notre version
StandardServiceRegistryBuilder.destroy(HibernateUtil.getSR());
}
}