X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics%2Fsrc%2Forg%2Fsimantics%2FSimanticsPlatform.java;h=e529938e278a6f781f986dd618efd58285f46035;hp=91c34f0c788f59f4a35984aa764d184ad2d95f9f;hb=3d96e3fa94898d90d6892c081ebed7cb9e773a4a;hpb=ce7ffc15e6ebcdb21089ac862aa5af01da89d454 diff --git a/bundles/org.simantics/src/org/simantics/SimanticsPlatform.java b/bundles/org.simantics/src/org/simantics/SimanticsPlatform.java index 91c34f0c7..e529938e2 100644 --- a/bundles/org.simantics/src/org/simantics/SimanticsPlatform.java +++ b/bundles/org.simantics/src/org/simantics/SimanticsPlatform.java @@ -65,7 +65,6 @@ import org.simantics.db.VirtualGraph; import org.simantics.db.WriteGraph; import org.simantics.db.common.request.ObjectsWithType; import org.simantics.db.common.request.Queries; -import org.simantics.db.common.request.WriteRequest; import org.simantics.db.common.request.WriteResultRequest; import org.simantics.db.common.utils.Transaction; import org.simantics.db.exception.ClusterSetExistException; @@ -73,12 +72,15 @@ import org.simantics.db.exception.DatabaseException; import org.simantics.db.exception.ResourceNotFoundException; import org.simantics.db.indexing.DatabaseIndexing; import org.simantics.db.layer0.genericrelation.DependenciesRelation; +import org.simantics.db.layer0.genericrelation.IndexException; +import org.simantics.db.layer0.genericrelation.IndexedRelations; import org.simantics.db.layer0.util.SimanticsClipboardImpl; import org.simantics.db.layer0.util.SimanticsKeys; import org.simantics.db.layer0.util.TGTransferableGraphSource; import org.simantics.db.layer0.variable.VariableRepository; import org.simantics.db.management.SessionContext; import org.simantics.db.request.Read; +import org.simantics.db.request.Write; import org.simantics.db.service.LifecycleSupport.LifecycleListener; import org.simantics.db.service.LifecycleSupport.LifecycleState; import org.simantics.db.service.QueryControl; @@ -101,6 +103,7 @@ import org.simantics.project.IProject; import org.simantics.project.ProjectFeatures; import org.simantics.project.ProjectKeys; import org.simantics.project.Projects; +import org.simantics.project.SessionDescriptor; import org.simantics.project.exception.ProjectException; import org.simantics.project.features.registry.GroupReference; import org.simantics.project.management.DatabaseManagement; @@ -229,7 +232,7 @@ public class SimanticsPlatform implements LifecycleListener { return application != null ? application : UUID.randomUUID().toString(); } - private Session setupDatabase(String databaseDriverId, IProgressMonitor progressMonitor, RecoveryPolicy workspacePolicy, PlatformUserAgent userAgent) throws PlatformException { + private SessionDescriptor setupDatabase(String databaseDriverId, IProgressMonitor progressMonitor, RecoveryPolicy workspacePolicy, PlatformUserAgent userAgent) throws PlatformException { if (progressMonitor == null) progressMonitor = new NullProgressMonitor(); Path workspaceLocation = Platform.getLocation().toFile().toPath(); @@ -274,12 +277,16 @@ public class SimanticsPlatform implements LifecycleListener { PlatformUtil.compileAllDynamicOntologies(); - progressMonitor.setTaskName("Asserting all ontologies are installed"); + String message = "Asserting all ontologies are installed"; + LOGGER.info(message); + progressMonitor.setTaskName(message); final Map platformTGs = new HashMap(); try { // Get a list of bundles installed into the database - progressMonitor.subTask("find installed bundles from database"); + message = "find installed bundles from database"; + progressMonitor.subTask(message); + LOGGER.info(message); Map installedTGs = new HashMap(); for (GraphBundle b : session.syncRequest( mgmt.GraphBundleQuery )) { installedTGs.put(GraphBundleRef.of(b), GraphBundleEx.extend(b)); @@ -289,10 +296,13 @@ public class SimanticsPlatform implements LifecycleListener { // if(installedTGs.size() > 1) return; // Get a list of all bundles in the platform (Bundle Context) - List tgs = new ArrayList(); - progressMonitor.subTask("load all transferable graphs from platform"); - PlatformUtil.getAllGraphs(tgs); - progressMonitor.subTask("extend bundles to compile versions"); + message = "load all transferable graphs from platform"; + progressMonitor.subTask(message); + LOGGER.info(message); + Collection tgs = PlatformUtil.getAllGraphs(); + message = "extend bundles to compile versions"; + progressMonitor.subTask(message); + LOGGER.info(message); for (GraphBundle b : tgs) { GraphBundleEx gbe = GraphBundleEx.extend(b); gbe.build(); @@ -300,7 +310,9 @@ public class SimanticsPlatform implements LifecycleListener { } // Compile a list of TGs that need to be installed or reinstalled in the database - progressMonitor.subTask("check bundle reinstallation demand"); + message = "check bundle reinstallation demand"; + progressMonitor.subTask(message); + LOGGER.info(message); List installTGs = new ArrayList(); // Create list of TGs to update, Map reinstallTGs = new TreeMap(); @@ -373,7 +385,9 @@ public class SimanticsPlatform implements LifecycleListener { } if (ontologyPolicy == OntologyRecoveryPolicy.Merge) { - progressMonitor.subTask("Merging ontology changes"); + message = "Merging ontology changes"; + progressMonitor.subTask(message); + LOGGER.info(message); // Sort missing TGs into install order GraphDependencyAnalyzer analyzer = new GraphDependencyAnalyzer(); for(GraphBundle tg : installTGs) analyzer.addGraph(tg, tg.getGraph()); @@ -397,21 +411,18 @@ public class SimanticsPlatform implements LifecycleListener { } throw new PlatformException(sb.toString()); } - + List sortedBundles = analyzer.getSortedGraphs(); if(!sortedBundles.isEmpty()) { - - session.syncRequest(new WriteRequest() { - @Override - public void perform(WriteGraph graph) throws DatabaseException { - try { - graph.newClusterSet(graph.getRootLibrary()); - } catch (ClusterSetExistException e) { - // Cluster set exist already, no problem. - } - graph.setClusterSet4NewResource(graph.getRootLibrary()); - graph.flushCluster(); + + session.syncRequest((Write) graph -> { + try { + graph.newClusterSet(graph.getRootLibrary()); + } catch (ClusterSetExistException e) { + // Cluster set exist already, no problem. } + graph.setClusterSet4NewResource(graph.getRootLibrary()); + graph.flushCluster(); }); boolean mergedOntologies = false; @@ -469,13 +480,10 @@ public class SimanticsPlatform implements LifecycleListener { } } } - - session.syncRequest(new WriteRequest() { - @Override - public void perform(WriteGraph graph) throws DatabaseException { - graph.setClusterSet4NewResource(graph.getRootLibrary()); - graph.flushCluster(); - } + + session.syncRequest((Write) graph -> { + graph.setClusterSet4NewResource(graph.getRootLibrary()); + graph.flushCluster(); }); if (mergedOntologies) @@ -532,11 +540,11 @@ public class SimanticsPlatform implements LifecycleListener { public boolean assertProject(IProgressMonitor progressMonitor, RecoveryPolicy workspacePolicy, boolean installProject) throws PlatformException { - if (progressMonitor == null) progressMonitor = new NullProgressMonitor(); + SubMonitor monitor = SubMonitor.convert(progressMonitor, 10); final DatabaseManagement mgmt = new DatabaseManagement(); - progressMonitor.setTaskName("Asserting project resource exists in the database"); + monitor.setTaskName("Asserting project resource exists in the database"); try { projectResource = session.syncRequest( Queries.resource( projectURI ) ); } catch (ResourceNotFoundException nfe) { @@ -566,7 +574,7 @@ public class SimanticsPlatform implements LifecycleListener { } catch (DatabaseException e) { throw new PlatformException("Failed to create "+projectURI, e); } - progressMonitor.worked(10); + monitor.worked(10); return installProject; @@ -582,15 +590,10 @@ public class SimanticsPlatform implements LifecycleListener { Collection groupsWithoutVersion = GroupReference.stripVersions(publishedFeatureGroups); try { - Transaction.startTransaction(session, true); - try { - Projects.setProjectInstalledGroups(writeGraph(), projectResource, groupsWithoutVersion); - Transaction.commit(); - } finally { - Transaction.endTransaction(); - } - //session.getService( LifecycleSupport.class ).save(); - } catch(DatabaseException ae) { + session.syncRequest( + (Write) graph -> + Projects.setProjectInstalledGroups(graph, projectResource, groupsWithoutVersion)); + } catch (DatabaseException ae) { throw new PlatformException("Failed to install features", ae); } progressMonitor.worked(10); @@ -805,8 +808,8 @@ public class SimanticsPlatform implements LifecycleListener { TimeLogger.log("Beginning of SimanticsPlatform.startUp"); LOGGER.info("Beginning of SimanticsPlatform.startUp"); - - if (progressMonitor == null) progressMonitor = new NullProgressMonitor(); + + SubMonitor monitor = SubMonitor.convert(progressMonitor, 1000); // For debugging on what kind of platform automatic tests are running in // case there are problems. @@ -828,10 +831,12 @@ public class SimanticsPlatform implements LifecycleListener { boolean usingBaseline = handleBaselineDatabase(); // 1. Assert there is a database at /db - session = setupDatabase(databaseDriverId, progressMonitor, workspacePolicy, userAgent); + SessionDescriptor sessionDescriptor = setupDatabase(databaseDriverId, monitor.newChild(200, SubMonitor.SUPPRESS_NONE), workspacePolicy, userAgent); + session = sessionDescriptor.getSession(); TimeLogger.log("Database setup complete"); - // 1.1 + // 1.1 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); if (support.rolledback()) { try { @@ -843,34 +848,30 @@ public class SimanticsPlatform implements LifecycleListener { // 2. Assert all graphs, and correct versions, are installed to the database if(!usingBaseline) { - synchronizeOntologies(progressMonitor, ontologyPolicy, requireSynchronize); + synchronizeOntologies(monitor.newChild(400, SubMonitor.SUPPRESS_NONE), ontologyPolicy, requireSynchronize); TimeLogger.log("Synchronized ontologies"); } // 4. Assert simantics.cfg exists - boolean installProject = assertConfiguration(progressMonitor,workspacePolicy); + boolean installProject = assertConfiguration(monitor.newChild(25, SubMonitor.SUPPRESS_NONE),workspacePolicy); // 5. Assert Project Resource is installed in the database - installProject = assertProject(progressMonitor, workspacePolicy, installProject); + installProject = assertProject(monitor.newChild(25, SubMonitor.SUPPRESS_NONE), workspacePolicy, installProject); // 6. Install all features into project, if in debug mode - updateInstalledGroups(progressMonitor, installProject); + updateInstalledGroups(monitor.newChild(25), true); //installProject); TimeLogger.log("Installed all features into project"); // 7. Assert L0.Session in database for this session - assertSessionModel(progressMonitor); + assertSessionModel(monitor.newChild(25, SubMonitor.SUPPRESS_NONE)); session.getService(XSupport.class).setServiceMode(false, false); try { - session.sync(new WriteRequest() { - - @Override - public void perform(WriteGraph graph) throws DatabaseException { - QueryControl qc = graph.getService(QueryControl.class); - qc.flush(graph); - } - + monitor.setTaskName("Flush query cache"); + session.syncRequest((Write) graph -> { + QueryControl qc = graph.getService(QueryControl.class); + qc.flush(graph); }); TimeLogger.log("Flushed queries"); } catch (DatabaseException e) { @@ -879,6 +880,7 @@ public class SimanticsPlatform implements LifecycleListener { boolean loadProject = true; try { + monitor.setTaskName("Open database session"); sessionContext = SimanticsPlatform.INSTANCE.createSessionContext(true); // This must be before setSessionContext since some listeners might query this sessionContext.setHint(SimanticsKeys.KEY_PROJECT, SimanticsPlatform.INSTANCE.projectResource); @@ -902,16 +904,28 @@ public class SimanticsPlatform implements LifecycleListener { Bindings.defaultBindingFactory.getRepository().put(RGB.Integer.BINDING.type(), RGB.Integer.BINDING); Bindings.defaultBindingFactory.getRepository().put(Font.BINDING.type(), Font.BINDING); - if(loadProject) { + if (support.rolledback() || sessionDescriptor.isFreshDatabase()) { + monitor.setTaskName("Rebuilding all indexes"); + try { + session.getService(IndexedRelations.class).fullRebuild(monitor.newChild(100), session); + } catch (IndexException e) { + LOGGER.error("Failed to re-build all indexes", e); + } + } else { + monitor.worked(100); + } + if(loadProject) { TimeLogger.log("Load projects"); project = Projects.loadProject(sessionContext.getSession(), SimanticsPlatform.INSTANCE.projectResource); + monitor.worked(100); sessionContext.setHint(ProjectKeys.KEY_PROJECT, project); TimeLogger.log("Loading projects complete"); project.activate(); TimeLogger.log("Project activated"); + monitor.worked(100); } } catch (DatabaseException e) { @@ -929,6 +943,12 @@ public class SimanticsPlatform implements LifecycleListener { // #7650: improve shutdown robustness in all applications that use the platform Runtime.getRuntime().addShutdownHook(shutdownHook); + // Discard database session undo history at this point to prevent + // the user from undoing any initialization operations performed + // by the platform startup. + SimanticsPlatform.INSTANCE.discardSessionUndoHistory(); + TimeLogger.log("Discarded session undo history"); + return sessionContext; }