]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics/src/org/simantics/SimanticsPlatform.java
Merge commit 'a2a4242'
[simantics/platform.git] / bundles / org.simantics / src / org / simantics / SimanticsPlatform.java
index d59fff9c2fa85de2ef1afb2eab3e18bbd8a16f12..cf4928fe793e1088d2c28da8587b9ad538d3f370 100644 (file)
@@ -19,6 +19,8 @@ import static org.simantics.db.common.utils.Transaction.writeGraph;
 
 import java.io.File;
 import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
@@ -39,6 +41,8 @@ import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.SubMonitor;
 import org.eclipse.osgi.service.resolver.BundleDescription;
+import org.ini4j.Ini;
+import org.ini4j.InvalidFileFormatException;
 import org.simantics.databoard.Bindings;
 import org.simantics.databoard.Databoard;
 import org.simantics.datatypes.literal.Font;
@@ -103,6 +107,7 @@ import org.simantics.project.management.WorkspaceUtil;
 import org.simantics.utils.FileUtils;
 import org.simantics.utils.datastructures.Pair;
 import org.simantics.utils.logging.TimeLogger;
+import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
@@ -131,7 +136,7 @@ import org.slf4j.LoggerFactory;
  */
 public class SimanticsPlatform implements LifecycleListener {
 
-    private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(SimanticsPlatform.class);
+    private static final Logger LOGGER = LoggerFactory.getLogger(SimanticsPlatform.class);
     
     /**
      * The policy is relevant when developing Simantics from Eclipse IDE.
@@ -154,6 +159,9 @@ public class SimanticsPlatform implements LifecycleListener {
     /** Set to true when the Simantics Platform is in good-and-go condition */
     public boolean running;
 
+    /** ID of the database driver that the platform is currently using */
+    private String currentDatabaseDriver;
+
     /** Database Session */
     public Session session;
     private Management databasebManagement;
@@ -203,24 +211,31 @@ public class SimanticsPlatform implements LifecycleListener {
     private Session setupDatabase(String databaseDriverId, IProgressMonitor progressMonitor, RecoveryPolicy workspacePolicy, PlatformUserAgent userAgent) throws PlatformException {
         if (progressMonitor == null)
             progressMonitor = new NullProgressMonitor();
-        File dbLocation = Platform.getLocation().append("db").toFile();
+        Path workspaceLocation = Platform.getLocation().toFile().toPath();
+        Path dbLocation = workspaceLocation.resolve("db");
+        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.
         ServerManager serverManager;
         try {
-            serverManager = ServerManagerFactory.create(databaseDriverId, dbLocation.getAbsolutePath());
+            Ini dbIni = loadOrCreateDatabaseIni(dbIniPath, databaseDriverId);
+            databaseDriverId = dbIni.get("driver", "id");
+            serverManager = ServerManagerFactory.create(databaseDriverId, dbLocation.toAbsolutePath().toString());
         } catch (DatabaseException | IOException e) {
-            throw new PlatformException("Failed to initialize Server Manager", e);
+            throw new PlatformException("Failed to initialize database ServerManager with driver " + databaseDriverId, e);
         }
         progressMonitor.beginTask("Setting up Simantics Database", 100);
         progressMonitor.setTaskName("Asserting Database is installed.");
         String msg = "Failed to initialize Simantics database.";
         try {
             // Create database
-            log.log(new Status(IStatus.INFO, Activator.PLUGIN_ID, "Creating database at " + dbLocation));
+            log.log(new Status(IStatus.INFO, Activator.PLUGIN_ID, "Initializing database at " + dbLocation + " with driver " + databaseDriverId));
             progressMonitor.setTaskName("Creating database at " + dbLocation);
-            databasebManagement = serverManager.getManagement(dbLocation);
+            databasebManagement = serverManager.getManagement(dbLocation.toFile());
             databasebManagement.create();
+            currentDatabaseDriver = databaseDriverId;
             // Create layer0.
-            return serverManager.createDatabase(dbLocation);
+            return serverManager.createDatabase(dbLocation.toFile());
         } catch (DatabaseException e) {
             throw new PlatformException(msg, e);
         } catch (Throwable e) {
@@ -736,7 +751,17 @@ public class SimanticsPlatform implements LifecycleListener {
         // 1. Assert there is a database at <workspace>/db
         session = setupDatabase(databaseDriverId, progressMonitor, workspacePolicy, userAgent);
         TimeLogger.log("Database setup complete");
-
+        
+        // 1.1 
+        XSupport support = session.getService(XSupport.class);
+        if (support.rolledback()) {
+            try {
+                DatabaseIndexing.deleteAllIndexes();
+            } catch (IOException e) {
+                throw new PlatformException(e);
+            }
+        }
+        
         // 2. Assert all graphs, and correct versions, are installed to the database
         synchronizeOntologies(progressMonitor, ontologyPolicy, requireSynchronize);
         TimeLogger.log("Synchronized ontologies");
@@ -768,7 +793,7 @@ public class SimanticsPlatform implements LifecycleListener {
             });
             TimeLogger.log("Flushed queries");
         } catch (DatabaseException e) {
-            Logger.defaultLogError(e);
+            LOGGER.error("Flushing queries failed.", e);
         }
         boolean loadProject = true;
         try {
@@ -809,7 +834,7 @@ public class SimanticsPlatform implements LifecycleListener {
             }
 
         } catch (DatabaseException e) {
-            Logger.defaultLogError(e);
+            LOGGER.error("Platform startup failed.", e);
             throw new PlatformException(e);
         } catch (ProjectException e) {
             boolean hasStackTrace = e.getStackTrace().length > 0;
@@ -931,7 +956,7 @@ public class SimanticsPlatform implements LifecycleListener {
                     try {
                         Simantics.flushIndexCaches(progress.newChild(20), s);
                     } catch (Throwable t) {
-                        Logger.defaultLogError(t);
+                        LOGGER.error("Failed to flush index caches.", t);
                     }
                 }
 
@@ -959,6 +984,7 @@ public class SimanticsPlatform implements LifecycleListener {
 
             session = null;
             projectResource = null;
+            currentDatabaseDriver = null;
 
             DependenciesRelation.assertFinishedTracking();
 
@@ -972,7 +998,7 @@ public class SimanticsPlatform implements LifecycleListener {
             if (null != databasebManagement)
                 databasebManagement.shutdown();
         } catch (Throwable t) {
-            Logger.defaultLogError(t);
+            LOGGER.error("Database shutdown failed.", t);
         }
         progress.worked(10);
 
@@ -980,7 +1006,7 @@ public class SimanticsPlatform implements LifecycleListener {
         try {
             Simantics.clearTemporaryDirectory();
         } catch (Throwable t) {
-            Logger.defaultLogError(t);
+            LOGGER.error("Failed to clear the temporary directory.", t);
         }
         progress.worked(10);
         if (null != platformException)
@@ -1021,6 +1047,8 @@ public class SimanticsPlatform implements LifecycleListener {
 
     public void reconnect(String databaseDriverId) throws Exception {
         // Starts database server.
+        if (currentDatabaseDriver != null)
+            databaseDriverId = currentDatabaseDriver;
         SimanticsPlatform.INSTANCE.startUp(databaseDriverId, null, RecoveryPolicy.ThrowError, OntologyRecoveryPolicy.ThrowError, true, null);
     }
 
@@ -1032,5 +1060,17 @@ public class SimanticsPlatform implements LifecycleListener {
         }
     }
 
-}
+    private Ini loadOrCreateDatabaseIni(Path path, String databaseDriverId)
+            throws InvalidFileFormatException, IOException
+    {
+        File f = path.toFile();
+        Ini dbIni = Files.isRegularFile(path) ? new Ini(f) : new Ini();
+        String iniId = dbIni != null ? dbIni.get("driver", "id") : null;
+        if (iniId == null) {
+            dbIni.put("driver", "id", databaseDriverId);
+            dbIni.store(f);
+        }
+        return dbIni;
+    }
 
+}