X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics%2Fsrc%2Forg%2Fsimantics%2FSimanticsPlatform.java;h=2504ba62d8f9ae04f4111bfbdaafa0086409d8f1;hb=refs%2Fchanges%2F20%2F2820%2F1;hp=8b1ac1bced1659d414c17dbf6930b11500bbed2b;hpb=48bb50bb6640506d1f150ca8e4fa5a6e878464be;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics/src/org/simantics/SimanticsPlatform.java b/bundles/org.simantics/src/org/simantics/SimanticsPlatform.java index 8b1ac1bce..2504ba62d 100644 --- a/bundles/org.simantics/src/org/simantics/SimanticsPlatform.java +++ b/bundles/org.simantics/src/org/simantics/SimanticsPlatform.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2010 Association for Decentralized Information Management + * Copyright (c) 2007, 2018 Association for Decentralized Information Management * in Industry THTH ry. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 @@ -91,6 +91,7 @@ import org.simantics.graph.db.TransferableGraphs; import org.simantics.graph.diff.Diff; import org.simantics.graph.diff.TransferableGraphDelta1; import org.simantics.internal.Activator; +import org.simantics.internal.TimedSessionCache; import org.simantics.internal.startup.StartupExtensions; import org.simantics.layer0.Layer0; import org.simantics.operation.Layer0X; @@ -109,10 +110,13 @@ import org.simantics.project.management.PlatformUtil; import org.simantics.project.management.ServerManager; import org.simantics.project.management.ServerManagerFactory; import org.simantics.project.management.WorkspaceUtil; +import org.simantics.scl.compiler.module.repository.ModuleRepository; +import org.simantics.scl.osgi.SCLOsgi; import org.simantics.utils.FileUtils; import org.simantics.utils.datastructures.Pair; -import org.simantics.utils.logging.TimeLogger; import org.simantics.utils.strings.EString; +import org.simantics.utils.threads.ExecutorWorker; +import org.simantics.utils.threads.ThreadUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -149,7 +153,7 @@ public class SimanticsPlatform implements LifecycleListener { * It is applied when the ontology in the database of a workspace doesn't match * a newer ontology in the Eclipse workspace. */ - public static enum OntologyRecoveryPolicy { ThrowError, Merge, ReinstallDatabase } + public static enum OntologyRecoveryPolicy { ThrowError, Merge, ReinstallDatabase, Bypass} /** * This policy dictates how the Simantics platform startup should react if @@ -342,7 +346,7 @@ public class SimanticsPlatform implements LifecycleListener { session.getService(XSupport.class).setServiceMode(true, true); // Throw error - if (ontologyPolicy == OntologyRecoveryPolicy.ThrowError) { + if (ontologyPolicy == OntologyRecoveryPolicy.ThrowError || ontologyPolicy == OntologyRecoveryPolicy.Bypass) { StringBuilder sb = new StringBuilder("The following graphs are not installed in the database: "); if (!installTGs.isEmpty()) { int i = 0; @@ -363,8 +367,12 @@ public class SimanticsPlatform implements LifecycleListener { sb.append(" Database/Platform Bundle version mismatch.\n"); } sb.append("Hint: Use -fixErrors to install the graphs."); - throw new PlatformException(sb.toString()); + if (ontologyPolicy == OntologyRecoveryPolicy.ThrowError) + throw new PlatformException(sb.toString()); + else + log.log(new Status(IStatus.WARNING, Activator.PLUGIN_ID, sb.toString())); } + // Reinstall database if (ontologyPolicy == OntologyRecoveryPolicy.ReinstallDatabase) { log.log(new Status(IStatus.INFO, Activator.PLUGIN_ID, "Reinstalling the database.")); @@ -394,8 +402,7 @@ public class SimanticsPlatform implements LifecycleListener { sb.append("Conflict with "+problem.first+" and "+problem.second+".\n"); } throw new PlatformException(sb.toString()); - } - else if(!session.syncRequest( analyzer.queryExternalDependenciesSatisfied )) { + } else if(!session.syncRequest( analyzer.queryExternalDependenciesSatisfied )) { Collection unsatisfiedDependencies = analyzer.getUnsatisfiedDependencies(); StringBuilder sb = new StringBuilder(); for (IdentityNode dep: unsatisfiedDependencies) { @@ -407,6 +414,10 @@ public class SimanticsPlatform implements LifecycleListener { throw new PlatformException(sb.toString()); } + message = "Analyzed graph bundles"; + monitor.subTask(message); + LOGGER.info(message); + List sortedBundles = analyzer.getSortedGraphs(); if(!sortedBundles.isEmpty()) { @@ -485,6 +496,9 @@ public class SimanticsPlatform implements LifecycleListener { } session.getService(XSupport.class).setServiceMode(false, false); } + message = "Ontologies synchronized"; + monitor.subTask(message); + LOGGER.info(message); monitor.worked(100); } catch (IOException e) { throw new PlatformException(e); @@ -781,8 +795,6 @@ public class SimanticsPlatform implements LifecycleListener { { assert(!running); - TimeLogger.log("Beginning of SimanticsPlatform.startUp"); - LOGGER.info("Beginning of SimanticsPlatform.startUp"); SubMonitor monitor = SubMonitor.convert(progressMonitor, 1000); @@ -794,15 +806,19 @@ public class SimanticsPlatform implements LifecycleListener { // 0. Consult all startup extensions before doing anything with the workspace. StartupExtensions.consultStartupExtensions(); - TimeLogger.log("Consulted platform pre-startup extensions"); + LOGGER.info("Consulted platform pre-startup extensions"); // 0.1. Clear all temporary files Simantics.clearTemporaryDirectory(); - TimeLogger.log("Cleared temporary directory"); + LOGGER.info("Cleared temporary directory"); // 0.2 Clear VariableRepository.repository static map which holds references to SessionImplDb VariableRepository.clear(); + // 0.2.1 Activate org.simantics.scl.osgi to prime the SCL compiler early. + @SuppressWarnings("unused") + ModuleRepository modRepo = SCLOsgi.MODULE_REPOSITORY; + // 0.3 Handle baseline database before opening db @SuppressWarnings("unused") boolean usingBaseline = handleBaselineDatabase(); @@ -810,8 +826,8 @@ public class SimanticsPlatform implements LifecycleListener { // 1. Assert there is a database at /db SessionDescriptor sessionDescriptor = setupDatabase(databaseDriverId, monitor.newChild(200, SubMonitor.SUPPRESS_NONE), workspacePolicy, userAgent); session = sessionDescriptor.getSession(); - TimeLogger.log("Database setup complete"); - + LOGGER.info("Database setup complete"); + // 2. Delete all indexes if we cannot be certain they are up-to-date // A full index rebuild will be done later, before project activation. XSupport support = session.getService(XSupport.class); @@ -825,7 +841,6 @@ public class SimanticsPlatform implements LifecycleListener { // 3. Assert all graphs, and correct versions, are installed to the database synchronizeOntologies(monitor.newChild(400, SubMonitor.SUPPRESS_NONE), ontologyPolicy, requireSynchronize); - TimeLogger.log("Synchronized ontologies"); // 4. Assert simantics.cfg exists boolean installProject = assertConfiguration(monitor.newChild(25, SubMonitor.SUPPRESS_NONE),workspacePolicy); @@ -835,7 +850,7 @@ public class SimanticsPlatform implements LifecycleListener { // 6. Install all features into project, if in debug mode updateInstalledGroups(monitor.newChild(25), true); //installProject); - TimeLogger.log("Installed all features into project"); + LOGGER.info("Installed all features into project"); // 7. Assert L0.Session in database for this session assertSessionModel(monitor.newChild(25, SubMonitor.SUPPRESS_NONE)); @@ -843,19 +858,21 @@ public class SimanticsPlatform implements LifecycleListener { session.getService(XSupport.class).setServiceMode(false, false); try { - monitor.setTaskName("Flush query cache"); + String message = "Flush query cache"; + monitor.setTaskName(message); + LOGGER.info(message); session.syncRequest((Write) graph -> { QueryControl qc = graph.getService(QueryControl.class); qc.flush(graph); }); - TimeLogger.log("Flushed queries"); } catch (DatabaseException e) { LOGGER.error("Flushing queries failed.", e); } boolean loadProject = true; try { - - monitor.setTaskName("Open database session"); + String message = "Open database session"; + monitor.setTaskName(message); + LOGGER.info(message); sessionContext = SimanticsPlatform.INSTANCE.createSessionContext(true); // This must be before setSessionContext since some listeners might query this sessionContext.setHint(SimanticsKeys.KEY_PROJECT, SimanticsPlatform.INSTANCE.projectResource); @@ -863,6 +880,8 @@ public class SimanticsPlatform implements LifecycleListener { Simantics.setSessionContext(sessionContext); // 1. Put ResourceBinding that throws an exception to General Bindings + message = "Put ResourceBinding that throws an exception to General Bindings"; + LOGGER.info(message); simanticsBindings = new SimanticsBindings(); Bindings.classBindingFactory.addFactory( simanticsBindings ); @@ -870,11 +889,15 @@ public class SimanticsPlatform implements LifecycleListener { session.registerService(Databoard.class, Bindings.databoard); // Register datatype bindings + message = "Register datatype bindings"; + LOGGER.info(message); Bindings.defaultBindingFactory.getRepository().put(RGB.Integer.BINDING.type(), RGB.Integer.BINDING); Bindings.defaultBindingFactory.getRepository().put(Font.BINDING.type(), Font.BINDING); if (support.rolledback() || sessionDescriptor.isFreshDatabase()) { - monitor.setTaskName("Rebuilding all indexes"); + message = "Rebuilding all indexes"; + LOGGER.info(message); + monitor.setTaskName(message); try { session.getService(IndexedRelations.class).fullRebuild(monitor.newChild(100), session); } catch (IndexException e) { @@ -885,17 +908,21 @@ public class SimanticsPlatform implements LifecycleListener { } if(loadProject) { - TimeLogger.log("Load project"); - monitor.setTaskName("Load project"); + message = "Load project"; + monitor.setTaskName(message); + LOGGER.info(message); project = Projects.loadProject(sessionContext.getSession(), SimanticsPlatform.INSTANCE.projectResource); sessionContext.setHint(ProjectKeys.KEY_PROJECT, project); monitor.worked(100); - TimeLogger.log("Loading projects complete"); + message = "Loading projects complete"; + LOGGER.info(message); - monitor.setTaskName("Activate project"); + message = "Activate project"; + monitor.setTaskName(message); + LOGGER.info(message); project.activate(); monitor.worked(100); - TimeLogger.log("Project activated"); + LOGGER.info("Project activated"); } } catch (DatabaseException e) { @@ -917,7 +944,7 @@ public class SimanticsPlatform implements LifecycleListener { // the user from undoing any initialization operations performed // by the platform startup. SimanticsPlatform.INSTANCE.discardSessionUndoHistory(); - TimeLogger.log("Discarded session undo history"); + LOGGER.info("Discarded session undo history"); return sessionContext; @@ -927,10 +954,12 @@ public class SimanticsPlatform implements LifecycleListener { try { // Construct and initialize SessionContext from Session. SessionContext sessionContext = SessionContext.create(session, init); - TimeLogger.log("Session context created"); + String message = "Session context created"; + LOGGER.info(message); if (init) { sessionContext.registerServices(); - TimeLogger.log("Session services registered"); + message = "Session services registered"; + LOGGER.info(message); } return sessionContext; } catch (DatabaseException e) { @@ -973,6 +1002,14 @@ public class SimanticsPlatform implements LifecycleListener { } progress.worked(10); + // NOP at the moment + TimedSessionCache.close(); + + progress.subTask("Thread pools"); + ThreadUtils.shutdown(); + ExecutorWorker.shutdown(); + progress.worked(5); + running = false; progress.subTask("Close Database Session"); if (sessionContext != null) { @@ -999,7 +1036,7 @@ public class SimanticsPlatform implements LifecycleListener { // Make sure Simantics clipboard doesn't store unwanted session data references. Simantics.setClipboard(new SimanticsClipboardImpl()); - progress.worked(30); + progress.worked(50); session = null; projectResource = null; @@ -1021,6 +1058,15 @@ public class SimanticsPlatform implements LifecycleListener { } progress.worked(10); + progress.subTask("Clear index status"); + try { + // Everything ok, clear index dirty state. + DatabaseIndexing.clearAllDirty(); + } catch (IOException e) { + LOGGER.error("Problems encountered while refreshing database index states, see exception for details.", e); + } + progress.worked(5); + if (clearTemporaryFiles) { progress.subTask("Clearing Workspace Temporary Directory"); try {