]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics/src/org/simantics/SimanticsPlatform.java
Initial support for concurrency in databoard, bindings and serializers
[simantics/platform.git] / bundles / org.simantics / src / org / simantics / SimanticsPlatform.java
index 1cedd4fcbd3dd98c0d779a9b356f4e071b94be4a..8b1ac1bced1659d414c17dbf6930b11500bbed2b 100644 (file)
@@ -41,6 +41,7 @@ import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.osgi.service.datalocation.Location;
 import org.eclipse.osgi.service.resolver.BundleDescription;
 import org.ini4j.Ini;
 import org.ini4j.InvalidFileFormatException;
@@ -59,16 +60,15 @@ import org.simantics.db.UndoContext;
 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.WriteResultRequest;
 import org.simantics.db.common.utils.Transaction;
 import org.simantics.db.exception.ClusterSetExistException;
 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.request.PossibleResource;
 import org.simantics.db.layer0.util.SimanticsClipboardImpl;
 import org.simantics.db.layer0.util.SimanticsKeys;
 import org.simantics.db.layer0.util.TGTransferableGraphSource;
@@ -186,7 +186,6 @@ public class SimanticsPlatform implements LifecycleListener {
 
     /** Session specific bindings */
     public SimanticsBindings simanticsBindings;
-    public SimanticsBindings simanticsBindings2;
 
     public Thread mainThread;
 
@@ -537,30 +536,31 @@ public class SimanticsPlatform implements LifecycleListener {
 
         monitor.setTaskName("Asserting project resource exists in the database");
         try {
-            projectResource = session.syncRequest( Queries.resource( projectURI ) );
-        } catch (ResourceNotFoundException nfe) {
-            // Project was not found
-            if (workspacePolicy == RecoveryPolicy.ThrowError)
-                throw new PlatformException("Project Resource "+projectURI+" is not found in the database.");
-            // Create empty project with no features
-            try {
-                Transaction.startTransaction(session, true);
+            projectResource = session.syncRequest(new PossibleResource(projectURI));
+            if (projectResource == null) {
+                // Project was not found
+                if (workspacePolicy == RecoveryPolicy.ThrowError)
+                    throw new PlatformException("Project Resource "+projectURI+" is not found in the database.");
+                // Create empty project with no features
                 try {
-                    // The project needs to be created mutable.
-                    session.getService(XSupport.class).setServiceMode(true, false);
+                    Transaction.startTransaction(session, true);
+                    try {
+                        // The project needs to be created mutable.
+                        session.getService(XSupport.class).setServiceMode(true, false);
 
-                    ArrayList<String> empty = new ArrayList<String>();
-                    projectResource = mgmt.createProject(projectName, empty);
-                    installProject |= true;
+                        ArrayList<String> empty = new ArrayList<String>();
+                        projectResource = mgmt.createProject(projectName, empty);
+                        installProject |= true;
 
-                    session.getService(XSupport.class).setServiceMode(false, false);
-                    Transaction.commit();
-                } finally {
-                    Transaction.endTransaction();
+                        session.getService(XSupport.class).setServiceMode(false, false);
+                        Transaction.commit();
+                    } finally {
+                        Transaction.endTransaction();
+                    }
+                    //session.getService( LifecycleSupport.class ).save();
+                } catch (DatabaseException e) {
+                    throw new PlatformException("Failed to create "+projectURI, e);
                 }
-                //session.getService( LifecycleSupport.class ).save();
-            } catch (DatabaseException e) {
-                throw new PlatformException("Failed to create "+projectURI, e);
             }
         } catch (DatabaseException e) {
             throw new PlatformException("Failed to create "+projectURI, e);
@@ -696,7 +696,42 @@ public class SimanticsPlatform implements LifecycleListener {
         resetDatabase(monitor);
     }
 
-    public boolean handleBaselineDatabase() throws PlatformException {
+    private static Path tryGetInstallLocation() {
+        Location l = Platform.getInstallLocation();
+        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.");
+        return null;
+    }
+
+    private boolean handleBaselineDatabase() throws PlatformException {
         Path workspaceLocation = Platform.getLocation().toFile().toPath();
         Path baselineIndicatorFile = workspaceLocation.resolve(".baselined");
         if (Files.isRegularFile(baselineIndicatorFile)) {
@@ -705,25 +740,14 @@ public class SimanticsPlatform implements LifecycleListener {
             return true;
         }
 
-        String dbBaselineArchive = System.getProperty("org.simantics.db.baseline", null);
-        if (dbBaselineArchive == null)
+        Path baseline = resolveBaselineFile();
+        if (baseline == null)
             return false;
 
-        Path baseline = Paths.get(dbBaselineArchive);
-        if (!Files.isRegularFile(baseline))
-            throw new PlatformException("Specified database baseline archive " + baseline + " does not exist. Cannot initialize workspace database.");
-
         DatabaseBaselines.validateBaselineFile(baseline);
         DatabaseBaselines.validateWorkspaceForBaselineInitialization(workspaceLocation);
-
-        try {
-            Files.createDirectories(workspaceLocation);
-            FileUtils.extractZip(baseline.toFile(), workspaceLocation.toFile());
-            Files.write(baselineIndicatorFile, DatabaseBaselines.baselineIndicatorContents(baselineIndicatorFile));
-            return true;
-        } catch (IOException e) {
-            throw new PlatformException(e);
-        }
+        DatabaseBaselines.initializeWorkspaceWithBaseline(baseline, workspaceLocation, baselineIndicatorFile);
+        return true;
     }
 
     /**
@@ -839,17 +863,11 @@ public class SimanticsPlatform implements LifecycleListener {
             Simantics.setSessionContext(sessionContext);
 
             // 1. Put ResourceBinding that throws an exception to General Bindings
-            simanticsBindings = new SimanticsBindings( null );
+            simanticsBindings = new SimanticsBindings();
             Bindings.classBindingFactory.addFactory( simanticsBindings );
 
-
-            // 2. Create session-specific second Binding context (Databoard) and
-            //    put that to Session as a service
             Session session = sessionContext.getSession();
-            Databoard sessionDataboard = new Databoard();
-            session.registerService(Databoard.class, sessionDataboard);
-            simanticsBindings2 = new SimanticsBindings( session );
-            sessionDataboard.classBindingFactory.addFactory( simanticsBindings2 );
+            session.registerService(Databoard.class, Bindings.databoard);
 
             // Register datatype bindings
             Bindings.defaultBindingFactory.getRepository().put(RGB.Integer.BINDING.type(), RGB.Integer.BINDING);
@@ -957,12 +975,9 @@ public class SimanticsPlatform implements LifecycleListener {
 
             running = false;
             progress.subTask("Close Database Session");
-            Databoard databoard = null;
             if (sessionContext != null) {
                 Session s = sessionContext.peekSession();
                 if (s != null) {
-                    databoard = s.peekService(Databoard.class);
-
                     progress.subTask("Flushing Index Caches");
                     try {
                         Simantics.flushIndexCaches(progress.newChild(20), s);
@@ -980,13 +995,6 @@ public class SimanticsPlatform implements LifecycleListener {
                 Bindings.classBindingFactory.removeFactory( simanticsBindings );
                 simanticsBindings = null;
             }
-            if (databoard != null) {
-               if (simanticsBindings2 != null) {
-                       databoard.classBindingFactory.removeFactory( simanticsBindings2 );
-                       simanticsBindings2 = null;
-               }
-               databoard.clear();
-            }
 
             // Make sure Simantics clipboard doesn't store unwanted session data references.
             Simantics.setClipboard(new SimanticsClipboardImpl());