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); } } } }