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;
/** Session specific bindings */
public SimanticsBindings simanticsBindings;
- public SimanticsBindings simanticsBindings2;
public Thread mainThread;
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);
-
- 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;
}
/**
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);
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);
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());