import akka.DistdbAgent;
import akka.KundedbAgent;
import akka.QubaAgent;
import akka.TokenCleaner;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;
import com.avaje.ebean.Ebean;
import auth.models.User;
import com.avaje.ebean.EbeanServer;
import dist.models.DistLocation;
import kundedb.models.Kunde;
import models.CustomerModel;
import org.joda.time.DateTime;
import models.ProductModel;
import org.slf4j.LoggerFactory;
import play.Application;
import play.GlobalSettings;
import play.libs.Akka;
import play.libs.Yaml;
import org.slf4j.Logger;
import java.util.*;
import com.typesafe.akka.extension.quartz.QuartzSchedulerExtension;
import quba.models.QubaStation;
import quba.models.QubaSubjective;
import service.PoseidonPropertyService;
import service.PoseidonService;
public class Global extends GlobalSettings {
private static Logger logger = LoggerFactory.getLogger(Global.class);
public void onStart(Application app) {
super.onStart(app);
String info = buildinfo.BuildInfo.toString();
String datasource = PoseidonPropertyService.getDefaultDatasource();
String dburl = PoseidonPropertyService.getProperty("db." + datasource + ".url");
//noinspection unchecked
Map<String, List<Object>> data = (Map<String, List<Object>>) Yaml.load("initialdata.yml");
Map<String, List<Object>> qubadata = (Map<String, List<Object>>) Yaml.load("qubadata.yml");
Map<String, List<Object>> kundedbdata = (Map<String, List<Object>>) Yaml.load("kundedbdata.yml");
Map<String, List<Object>> distdbdata = (Map<String, List<Object>>) Yaml.load("distdbdata.yml");
loadInitConfig(data);
if (dburl != null && dburl.contains("h2:mem")) {
loadPoseidonTestData(data);
loadQubaTestData(qubadata);
loadDistdbTestData(distdbdata);
loadKundedbTestData(kundedbdata);
} else {
logger.info(info + " is starting...");
AkkaStartUp.startup(app);
}
}
private void loadInitConfig(Map<String, List<Object>> data) {
// load initial configuration data
if (Ebean.find(User.class).findRowCount() == 0) {
Ebean.save(data.get("users"));
}
String productName = PoseidonPropertyService.getProperty("order.default_productname");
ProductModel offshoreByMetNo = ProductModel.findByName(productName);
if ( offshoreByMetNo == null){
Ebean.save(data.get("standardproducts"));
}
}
private void loadPoseidonTestData(Map<String, List<Object>> data) {
// load test data: CustomerControllerV1, Orders, Positions etc
if (Ebean.find(CustomerModel.class).findRowCount() == 0) {
Ebean.save(data.get("customers"));
Ebean.save(data.get("tags"));
Ebean.save(data.get("positions"));
Ebean.save(data.get("products"));
Ebean.save(data.get("orders"));
Ebean.save(data.get("forecasts"));
}
}
private void loadQubaTestData(Map<String, List<Object>> data) {
// load initial test data
EbeanServer quba = Ebean.getServer("quba");
if (quba.find(QubaStation.class).findRowCount() == 0) {
List<Object> stations = data.get("stations");
quba.save(stations);
List<Object> stationProfiles = data.get("stationprofiles");
quba.save(stationProfiles);
List<Object> subjectives = data.get("subjectives");
// Lage ny subjective for Gullfaks for i dag, slik at vi har noe å
// sende til produksjon i web-klienten
QubaSubjective subjective = new QubaSubjective();
DateTime now = DateTime.now(PoseidonService.getTimeZone());
DateTime noon = now.withTime(12,0,0,0);
subjective.pk.stationid = 3L;
subjective.pk.pindexid = 31;
subjective.pk.runDate = noon.toDate();
subjective.pk.validDate= subjective.pk.runDate;
subjective.pk.levelid = 0;
subjectives.add(subjective);
quba.save(subjectives);
}
}
private void loadDistdbTestData(Map<String, List<Object>> data) {
// load initial test data
EbeanServer dist = Ebean.getServer("dist");
if (dist.find(DistLocation.class).findRowCount() == 0) {
List<Object> locations = data.get("locations");
dist.save(locations);
}
}
private void loadKundedbTestData(Map<String, List<Object>> data) {
// load initial test data
EbeanServer kundedb = Ebean.getServer("kundedb");
if (kundedb.find(Kunde.class).findRowCount() == 0) {
List<Object> kunder = data.get("kunder");
List<Object> datafiler = data.get("datafiler");
List<Object> kundefiler = data.get("kundefiler");
List<Object> posisjoner = data.get("posisjoner");
List<Object> produkter = data.get("produkter");
if ( kunder !=null && kunder.size() > 0 )kundedb.save(kunder);
if ( datafiler !=null && datafiler.size() > 0 )kundedb.save(datafiler);
if ( kundefiler!=null && kundefiler.size() > 0 )kundedb.save(kundefiler);
if ( posisjoner!=null && posisjoner.size() > 0 )kundedb.save(posisjoner);
if ( produkter !=null && produkter.size() > 0 )kundedb.save(produkter);
}
}
static class AkkaStartUp {
public static void startup(Application app) {
logger.info("Starting akka...");
ActorSystem system = Akka.system();
ActorRef qbaAgent = system.actorOf(Props.create(QubaAgent.class), "qubasupervisor");
ActorRef kdbAgent = system.actorOf(Props.create(KundedbAgent.class), "kdbsupervisor");
ActorRef ddbAgent = system.actorOf(Props.create(DistdbAgent.class), "ddbsupervisor");
ActorRef tokenCleanerAgent = system.actorOf(Props.create(TokenCleaner.class), "tcbsupervisor");
try {
QuartzSchedulerExtension cronScheduler = (QuartzSchedulerExtension) QuartzSchedulerExtension.get(system);
logger.info("Schedules " + cronScheduler.schedules());
if (cronScheduler.schedules().contains("DISTAGENT")){
cronScheduler.schedule("DistAgent", ddbAgent, "CopyDistdata");
} else {
logger.warn("Schedule for 'QubaAgent' not found");
}
if (cronScheduler.schedules().contains("QUBAAGENT")){
cronScheduler.schedule("QubaAgent", qbaAgent, "CopyPositions");
} else {
logger.warn("Schedule for 'QubaAgent' not found");
}
if (cronScheduler.schedules().contains("QUBACLEANUP")){
cronScheduler.schedule("QubaCleanup", qbaAgent, "CleanupPositions");
} else {
logger.warn("Schedule for 'QubaCleanup' not found");
}
if ( cronScheduler.schedules().contains("KUNDEDBSYNC")){
cronScheduler.schedule("KundedbSync", kdbAgent, "CopyKundedata");
}
if ( cronScheduler.schedules().contains("TOKENCLEANER")){
cronScheduler.schedule("TokenCleaner", tokenCleanerAgent, "CleanTokens");
}
} catch (Exception e) {
logger.error("Error in cron-setup for 'QubaAgent' ", e);
}
}
}
}