]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics/src/org/simantics/SimanticsPlatform.java
Platform startup performance improvements
[simantics/platform.git] / bundles / org.simantics / src / org / simantics / SimanticsPlatform.java
index e529938e278a6f781f986dd618efd58285f46035..1cedd4fcbd3dd98c0d779a9b356f4e071b94be4a 100644 (file)
@@ -22,9 +22,6 @@ import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.time.Instant;
-import java.time.ZoneId;
-import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
@@ -35,8 +32,6 @@ import java.util.Properties;
 import java.util.Set;
 import java.util.TreeMap;
 import java.util.UUID;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
 
 import org.eclipse.core.runtime.ILog;
 import org.eclipse.core.runtime.IProduct;
@@ -271,23 +266,24 @@ public class SimanticsPlatform implements LifecycleListener {
 
     public void synchronizeOntologies(IProgressMonitor progressMonitor, OntologyRecoveryPolicy ontologyPolicy, boolean requireSynchronize) throws PlatformException {
 
-        if (progressMonitor == null) progressMonitor = new NullProgressMonitor();
-
-        final DatabaseManagement mgmt = new DatabaseManagement();
+        SubMonitor monitor = SubMonitor.convert(progressMonitor, 100);
 
+        monitor.setTaskName("Compile dynamic ontologies");
         PlatformUtil.compileAllDynamicOntologies();
 
         String message = "Asserting all ontologies are installed";
         LOGGER.info(message);
-        progressMonitor.setTaskName(message);
-        final Map<GraphBundleRef, GraphBundleEx> platformTGs = new HashMap<GraphBundleRef, GraphBundleEx>();
+        monitor.setTaskName(message);
+
+        DatabaseManagement mgmt = new DatabaseManagement();
+        Map<GraphBundleRef, GraphBundleEx> platformTGs = new HashMap<>();
         try {
 
             // Get a list of bundles installed into the database
             message = "find installed bundles from database";
-            progressMonitor.subTask(message);
+            monitor.subTask(message);
             LOGGER.info(message);
-            Map<GraphBundleRef, GraphBundleEx> installedTGs = new HashMap<GraphBundleRef, GraphBundleEx>();
+            Map<GraphBundleRef, GraphBundleEx> installedTGs = new HashMap<>();
             for (GraphBundle b : session.syncRequest( mgmt.GraphBundleQuery )) {
                 installedTGs.put(GraphBundleRef.of(b), GraphBundleEx.extend(b));
             }
@@ -297,11 +293,11 @@ public class SimanticsPlatform implements LifecycleListener {
 
             // Get a list of all bundles in the platform (Bundle Context)
             message = "load all transferable graphs from platform";
-            progressMonitor.subTask(message);
+            monitor.subTask(message);
             LOGGER.info(message);
             Collection<GraphBundle> tgs = PlatformUtil.getAllGraphs();
             message = "extend bundles to compile versions";
-            progressMonitor.subTask(message);
+            monitor.subTask(message);
             LOGGER.info(message);
             for (GraphBundle b : tgs) {
                 GraphBundleEx gbe = GraphBundleEx.extend(b);
@@ -311,11 +307,11 @@ public class SimanticsPlatform implements LifecycleListener {
 
             // Compile a list of TGs that need to be installed or reinstalled in the database
             message = "check bundle reinstallation demand";
-            progressMonitor.subTask(message);
+            monitor.subTask(message);
             LOGGER.info(message);
-            List<GraphBundleEx> installTGs = new ArrayList<GraphBundleEx>();
+            List<GraphBundleEx> installTGs = new ArrayList<>();
             // Create list of TGs to update, <newTg, oldTg>
-            Map<GraphBundleEx,GraphBundleEx> reinstallTGs = new TreeMap<GraphBundleEx,GraphBundleEx>();
+            Map<GraphBundleEx,GraphBundleEx> reinstallTGs = new TreeMap<>();
             for (Entry<GraphBundleRef, GraphBundleEx> e : platformTGs.entrySet()) {
                 GraphBundleRef key = e.getKey();
                 GraphBundleEx platformBundle = e.getValue();
@@ -386,7 +382,7 @@ public class SimanticsPlatform implements LifecycleListener {
 
                 if (ontologyPolicy == OntologyRecoveryPolicy.Merge) {
                     message = "Merging ontology changes";
-                    progressMonitor.subTask(message);
+                    monitor.subTask(message);
                     LOGGER.info(message);
                     // Sort missing TGs into install order
                     GraphDependencyAnalyzer<GraphBundle> analyzer = new GraphDependencyAnalyzer<GraphBundle>();
@@ -463,11 +459,9 @@ public class SimanticsPlatform implements LifecycleListener {
                                 log.log(new Status(IStatus.INFO, Activator.PLUGIN_ID, "Merging new version of "+tg.toString()));
 
                                        startTransaction(session, true);
-                                       
+
                                        //delta.print();
                                        try {
-                                               
-                                               
                                                long[] resourceArray = TransferableGraphs.applyDelta(writeGraph(), oldResources, delta);
                                                tg.setResourceArray(resourceArray);
                                                mgmt.setGraphBundleEntry(tg);
@@ -489,13 +483,10 @@ public class SimanticsPlatform implements LifecycleListener {
                         if (mergedOntologies)
                             DatabaseIndexing.deleteAllIndexes();
                     }
-
-                    TimeLogger.log("Ontologies synchronized.");
-                    
                 }
                 session.getService(XSupport.class).setServiceMode(false, false);
             }
-            progressMonitor.worked(20);
+            monitor.worked(100);
         } catch (IOException e) {
             throw new PlatformException(e);
         } catch (DatabaseException e) {
@@ -722,58 +713,19 @@ public class SimanticsPlatform implements LifecycleListener {
         if (!Files.isRegularFile(baseline))
             throw new PlatformException("Specified database baseline archive " + baseline + " does not exist. Cannot initialize workspace database.");
 
-        validateBaselineFile(baseline);
-        validateWorkspaceForBaselineInitialization(workspaceLocation);
+        DatabaseBaselines.validateBaselineFile(baseline);
+        DatabaseBaselines.validateWorkspaceForBaselineInitialization(workspaceLocation);
 
         try {
             Files.createDirectories(workspaceLocation);
             FileUtils.extractZip(baseline.toFile(), workspaceLocation.toFile());
-            Files.write(baselineIndicatorFile, baselineIndicatorContents(baselineIndicatorFile));
+            Files.write(baselineIndicatorFile, DatabaseBaselines.baselineIndicatorContents(baselineIndicatorFile));
             return true;
         } catch (IOException e) {
             throw new PlatformException(e);
         }
     }
 
-    private static final DateTimeFormatter TIMESTAMP_FORMAT = DateTimeFormatter.ofPattern("d. MMM yyyy HH:mm:ss");
-
-    private static byte[] baselineIndicatorContents(Path path) throws IOException {
-        return String.format("%s%n%s%n",
-                path.toString(),
-                Instant.now().atZone(ZoneId.systemDefault()).format(TIMESTAMP_FORMAT))
-                .getBytes("UTF-8");
-    }
-
-    private void validateWorkspaceForBaselineInitialization(Path workspaceLocation) throws PlatformException {
-        try {
-            Path db = workspaceLocation.resolve("db");
-            if (Files.exists(db))
-                throw new PlatformException("Database location " + db + " already exists. Cannot re-initialize workspace from baseline.");
-            Path index = workspaceLocation.resolve(".metadata/.plugins/org.simantics.db.indexing");
-            if (!Files.exists(index) || !isEmptyDirectory(index))
-                throw new PlatformException("Index location " + index + " already exists. Cannot re-initialize workspace from baseline.");
-        } catch (IOException e) {
-            throw new PlatformException("Failed to validate workspace for baseline initialization", e);
-        }
-    }
-
-    private static boolean isEmptyDirectory(Path dir) throws IOException {
-        return Files.walk(dir).count() == 1;
-    }
-
-    private void validateBaselineFile(Path baseline) throws PlatformException {
-        try (ZipFile zip = new ZipFile(baseline.toFile())) {
-            ZipEntry db = zip.getEntry("db");
-            if (db == null)
-               throw new PlatformException("Baseline archive does not contain database directory 'db'");
-            ZipEntry index = zip.getEntry(".metadata/.plugins/org.simantics.db.indexing");
-            if (index == null)
-                throw new PlatformException("Baseline archive does not contain database index directory '.metadata/.plugins/org.simantics.db.indexing'");
-        } catch (IOException e) {
-            throw new PlatformException("Failed to validate baseline archive " + baseline, e);
-        }
-    }
-
     /**
      * Start-up the platform. The procedure consists of 8 steps. Once everything
      * is up and running, all fields are set property.
@@ -826,17 +778,18 @@ public class SimanticsPlatform implements LifecycleListener {
 
         // 0.2 Clear VariableRepository.repository static map which holds references to SessionImplDb
         VariableRepository.clear();
-        
+
         // 0.3 Handle baseline database before opening db
+        @SuppressWarnings("unused")
         boolean usingBaseline = handleBaselineDatabase();
-        
+
         // 1. Assert there is a database at <workspace>/db
         SessionDescriptor sessionDescriptor = setupDatabase(databaseDriverId, monitor.newChild(200, SubMonitor.SUPPRESS_NONE), workspacePolicy, userAgent);
         session = sessionDescriptor.getSession();
         TimeLogger.log("Database setup complete");
         
-        // 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.
+        // 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);
         if (support.rolledback()) {
             try {
@@ -845,12 +798,10 @@ public class SimanticsPlatform implements LifecycleListener {
                 throw new PlatformException(e);
             }
         }
-        
-        // 2. Assert all graphs, and correct versions, are installed to the database
-        if(!usingBaseline) {
-            synchronizeOntologies(monitor.newChild(400, SubMonitor.SUPPRESS_NONE), ontologyPolicy, requireSynchronize);
-            TimeLogger.log("Synchronized ontologies");
-        }
+
+        // 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);
@@ -916,16 +867,17 @@ public class SimanticsPlatform implements LifecycleListener {
             }
 
             if(loadProject) {
-                TimeLogger.log("Load projects");
+                TimeLogger.log("Load project");
+                monitor.setTaskName("Load project");
                 project = Projects.loadProject(sessionContext.getSession(), SimanticsPlatform.INSTANCE.projectResource);
-                monitor.worked(100);
-
                 sessionContext.setHint(ProjectKeys.KEY_PROJECT, project);
+                monitor.worked(100);
                 TimeLogger.log("Loading projects complete");
 
+                monitor.setTaskName("Activate project");
                 project.activate();
-                TimeLogger.log("Project activated");
                 monitor.worked(100);
+                TimeLogger.log("Project activated");
             }
 
         } catch (DatabaseException e) {