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;
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;
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.
package org.simantics;
+import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
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;
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 {
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.
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);
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");
}
/**
// 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);