Easier baselines 57/3857/1
authorAntti Villberg <antti.villberg@semantum.fi>
Fri, 7 Feb 2020 10:33:32 +0000 (12:33 +0200)
committerAntti Villberg <antti.villberg@semantum.fi>
Fri, 7 Feb 2020 10:33:32 +0000 (12:33 +0200)
gitlab #462

Change-Id: Id79b6070fded8224045f2f044e3dc70c6059363e

bundles/org.simantics.workbench/src/org/simantics/workbench/internal/SimanticsWorkbenchAdvisor.java
bundles/org.simantics/src/org/simantics/DatabaseBaselines.java
bundles/org.simantics/src/org/simantics/SimanticsPlatform.java

index f5bda18b0a137816c209b12972bfeb346605eb2e..8a8b493753e3be04b14156483ba9f4df63dba9a8 100644 (file)
@@ -88,6 +88,7 @@ import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
 import org.osgi.framework.Version;
 import org.simantics.CancelStartupException;
+import org.simantics.DatabaseBaselines;
 import org.simantics.PlatformException;
 import org.simantics.Simantics;
 import org.simantics.SimanticsPlatform;
@@ -105,7 +106,6 @@ import org.simantics.ui.SimanticsUI;
 import org.simantics.ui.jobs.SessionGarbageCollectorJob;
 import org.simantics.ui.workbench.PerspectiveBarsActivator;
 import org.simantics.ui.workbench.PerspectiveContextActivator;
-import org.simantics.ui.workbench.WorkbenchShutdownService;
 import org.simantics.utils.logging.TimeLogger;
 import org.simantics.utils.ui.dialogs.ShowError;
 import org.simantics.utils.ui.dialogs.ShowMessage;
@@ -432,6 +432,11 @@ public class SimanticsWorkbenchAdvisor extends WorkbenchAdvisor {
             if (PROFILE_PLATFORM_STARTUP)
                 mon = new TimingProgressMonitor();
             SimanticsPlatform.INSTANCE.startUp(databaseDriverId, mon, workspacePolicy, ontologyPolicy, requireSynchronize, new JFaceUserAgent());
+            if(DatabaseBaselines.shouldCreateAutomaticBaseline(SimanticsPlatform.INSTANCE.databaseExists() != null)) {
+                SimanticsPlatform.INSTANCE.shutdown(null);
+                DatabaseBaselines.createAutomaticBaseline(SimanticsPlatform.INSTANCE.dbLocation());
+                SimanticsPlatform.INSTANCE.reconnect(Simantics.getDefaultDatabaseDriver());
+            }
 
             // Make sure that the default perspective comes from the project if
             // the project has set ProjectKeys#DEFAULT_PERSPECTIVE.
index fe3393a2c0afd6f7abb7eb522eb22086b9ed4d51..c58cb508623026fbf5f054cc67645e6d87d1db1a 100644 (file)
@@ -1,5 +1,6 @@
 package org.simantics;
 
+import java.io.File;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -13,6 +14,7 @@ import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
 import java.util.zip.ZipOutputStream;
 
+import org.eclipse.core.runtime.Platform;
 import org.simantics.utils.FileUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -32,8 +34,114 @@ public class DatabaseBaselines {
 
        private static final DateTimeFormatter TIMESTAMP_FORMAT = DateTimeFormatter.ofPattern("d. MMM yyyy HH:mm:ss");
 
-       public static Path packageBaseline(Path fromWorkspace, Path packageFile) throws IOException {
-               return compressZip(fromWorkspace, collectBaselinePaths(fromWorkspace), packageFile);
+    public static boolean handleBaselineDatabase(Path installLocation, boolean databaseExists) throws PlatformException {
+        Path workspaceLocation = Platform.getLocation().toFile().toPath();
+        Path baselineIndicatorFile = workspaceLocation.resolve(".baselined");
+        if (Files.isRegularFile(baselineIndicatorFile)) {
+            // This means that the workspace has already been initialized from
+            // a database baseline and further initialization is not necessary.
+            return true;
+        }
+
+        Path baseline = resolveBaselineFile(installLocation);
+        if (baseline == null) {
+            baseline = getAutomaticBaselinePath();
+            if(baseline == null)
+                return false;
+            if(databaseExists)
+                return false;
+            if(!existsAutomaticBaseline())
+                return false;
+        }
+        
+        DatabaseBaselines.validateBaselineFile(baseline);
+        DatabaseBaselines.validateWorkspaceForBaselineInitialization(workspaceLocation);
+        DatabaseBaselines.initializeWorkspaceWithBaseline(baseline, workspaceLocation, baselineIndicatorFile);
+        return true;
+        
+    }
+
+    private static Path resolveBaselineFile(Path installLocation) throws PlatformException {
+        String dbBaselineArchive = System.getProperty("org.simantics.db.baseline", null);
+        if (dbBaselineArchive == null)
+            return null;
+
+        Path baseline = Paths.get(dbBaselineArchive);
+        if (baseline.isAbsolute()) {
+            if (!Files.isRegularFile(baseline))
+                throw new PlatformException("Specified database baseline archive " + baseline
+                        + " does not exist. Cannot initialize workspace database from baseline.");
+            return baseline;
+        }
+
+        // Relative path resolution order:
+        // 1. from the platform "install location"
+        // 2. from working directory
+        //Path installLocation = tryGetInstallLocation();
+        if (installLocation != null) {
+            Path installedBaseline = installLocation.resolve(dbBaselineArchive);
+            if (Files.isRegularFile(installedBaseline))
+                return installedBaseline;
+        }
+        if (!Files.isRegularFile(baseline))
+            throw new PlatformException("Specified database baseline archive " + baseline
+                    + " does not exist in either the install location (" + installLocation
+                    + ") or the working directory (" + Paths.get(".").toAbsolutePath()
+                    + "). Cannot initialize workspace database.");
+        return null;
+    }
+
+    private static boolean useAutomaticBaseline() {
+        return getAutomaticBaselinePath() != null;
+    }
+
+    private static Path getAutomaticBaselinePath() {
+        if("true".equals(System.getProperty("org.simantics.db.baseline.automatic")))
+            return Paths.get("automatic_baseline", "baseline.zip");
+        else
+            return null;
+    }
+    
+    private static boolean existsAutomaticBaseline() {
+        Path baselineFile = getAutomaticBaselinePath();
+        if(baselineFile == null)
+            return false;
+        return Files.exists(baselineFile);
+    }
+
+    public static boolean shouldCreateAutomaticBaseline(boolean existsDatabase) throws PlatformException {
+        if(!useAutomaticBaseline()) {
+            // Are we using this feature? 
+            return false;
+        }
+        if(existsDatabase) {
+            // Baseline can only be created after db initialization
+            return false;
+        }
+        if(existsAutomaticBaseline()) {
+            // Existing baselines should not be automatically overridden
+            return false;
+        }
+        return true;
+    }
+
+    public static void createAutomaticBaseline(Path dbLocation) throws PlatformException {
+
+        if(existsAutomaticBaseline())
+            return;
+
+        try {
+            DatabaseBaselines.packageBaseline(dbLocation.getParent(), getAutomaticBaselinePath());
+        } catch (IOException e) {
+            LOGGER.error("Error while creating automatic baseline", e);
+        }
+
+    }
+
+    public static Path packageBaseline(Path fromWorkspace, Path packageFilePath) throws IOException {
+           File packageFile = packageFilePath.toFile();
+           packageFile.getParentFile().mkdirs();
+               return compressZip(fromWorkspace, collectBaselinePaths(fromWorkspace), packageFilePath);
        }
 
        private static List<Path> collectBaselinePaths(Path workspace) throws IOException {
index c0a85cd1ac1c06343b7a9bfb516b2efb84eb80fc..730e4e8877470439c8fd88cc8b47050db3bcfb66 100644 (file)
@@ -239,7 +239,7 @@ public class SimanticsPlatform implements LifecycleListener {
         if (progressMonitor == null)
             progressMonitor = new NullProgressMonitor();
         Path workspaceLocation = Platform.getLocation().toFile().toPath();
-        Path dbLocation = workspaceLocation.resolve("db");
+        Path dbLocation = dbLocation();
         Path dbIniPath = workspaceLocation.resolve("db.ini");
         // The driver file overrides any command line arguments to prevent
         // using the wrong driver for an existing database directory.
@@ -679,8 +679,9 @@ public class SimanticsPlatform implements LifecycleListener {
 
     public void resetDatabase(IProgressMonitor monitor) throws PlatformException {
         // TODO: fix this to use Path APIs
-        File dbLocation = Platform.getLocation().append("db").toFile();
-        if(!dbLocation.exists()) return;
+        File dbLocation = dbLocation().toFile();
+        if(!dbLocation.exists())
+            return;
         try { // Load driver
             Driver driver = Manager.getDriver("acorn");
             Management management = driver.getManagement(dbLocation.getAbsolutePath(), null);
@@ -721,53 +722,16 @@ public class SimanticsPlatform implements LifecycleListener {
         return l == null ? null : new File(l.getURL().getPath()).toPath();
     }
 
-    private Path resolveBaselineFile() throws PlatformException {
-        String dbBaselineArchive = System.getProperty("org.simantics.db.baseline", null);
-        if (dbBaselineArchive == null)
-            return null;
-
-        Path baseline = Paths.get(dbBaselineArchive);
-        if (baseline.isAbsolute()) {
-            if (!Files.isRegularFile(baseline))
-                throw new PlatformException("Specified database baseline archive " + baseline
-                        + " does not exist. Cannot initialize workspace database from baseline.");
-            return baseline;
-        }
-
-        // Relative path resolution order:
-        // 1. from the platform "install location"
-        // 2. from working directory
-        Path installLocation = tryGetInstallLocation();
-        if (installLocation != null) {
-            Path installedBaseline = installLocation.resolve(dbBaselineArchive);
-            if (Files.isRegularFile(installedBaseline))
-                return installedBaseline;
-        }
-        if (!Files.isRegularFile(baseline))
-            throw new PlatformException("Specified database baseline archive " + baseline
-                    + " does not exist in either the install location (" + installLocation
-                    + ") or the working directory (" + Paths.get(".").toAbsolutePath()
-                    + "). Cannot initialize workspace database.");
+    public Path databaseExists() {
+        Path dbLocation = dbLocation();
+        if(Files.exists(dbLocation))
+            return dbLocation;
         return null;
     }
-
-    private boolean handleBaselineDatabase() throws PlatformException {
+    
+    public Path dbLocation() {
         Path workspaceLocation = Platform.getLocation().toFile().toPath();
-        Path baselineIndicatorFile = workspaceLocation.resolve(".baselined");
-        if (Files.isRegularFile(baselineIndicatorFile)) {
-            // This means that the workspace has already been initialized from
-            // a database baseline and further initialization is not necessary.
-            return true;
-        }
-
-        Path baseline = resolveBaselineFile();
-        if (baseline == null)
-            return false;
-
-        DatabaseBaselines.validateBaselineFile(baseline);
-        DatabaseBaselines.validateWorkspaceForBaselineInitialization(workspaceLocation);
-        DatabaseBaselines.initializeWorkspaceWithBaseline(baseline, workspaceLocation, baselineIndicatorFile);
-        return true;
+        return workspaceLocation.resolve("db");
     }
 
     /**
@@ -827,7 +791,7 @@ public class SimanticsPlatform implements LifecycleListener {
 
         // 0.3 Handle baseline database before opening db
         @SuppressWarnings("unused")
-        boolean usingBaseline = handleBaselineDatabase();
+        boolean usingBaseline = DatabaseBaselines.handleBaselineDatabase(tryGetInstallLocation(), databaseExists() != null);
 
         // 1. Assert there is a database at <workspace>/db
         SessionDescriptor sessionDescriptor = setupDatabase(databaseDriverId, monitor.newChild(200, SubMonitor.SUPPRESS_NONE), workspacePolicy, userAgent);