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;
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;
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);
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)) {
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);
DatabaseBaselines.initializeWorkspaceWithBaseline(baseline, workspaceLocation, baselineIndicatorFile);