/*******************************************************************************
- * Copyright (c) 2007, 2010 Association for Decentralized Information Management
+ * Copyright (c) 2007, 2018 Association for Decentralized Information Management
* in Industry THTH ry.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
import org.eclipse.osgi.service.resolver.BundleDescription;
import org.ini4j.Ini;
import org.ini4j.InvalidFileFormatException;
+import org.simantics.SimanticsPlatform.OntologyRecoveryPolicy;
+import org.simantics.SimanticsPlatform.RecoveryPolicy;
import org.simantics.databoard.Bindings;
import org.simantics.databoard.Databoard;
import org.simantics.datatypes.literal.Font;
import org.simantics.db.UndoContext;
import org.simantics.db.VirtualGraph;
import org.simantics.db.WriteGraph;
+import org.simantics.db.common.processor.MergingDelayedWriteProcessor;
+import org.simantics.db.common.processor.MergingGraphRequestProcessor;
import org.simantics.db.common.request.ObjectsWithType;
import org.simantics.db.common.request.WriteResultRequest;
import org.simantics.db.common.utils.Transaction;
import org.simantics.db.service.UndoRedoSupport;
import org.simantics.db.service.VirtualGraphSupport;
import org.simantics.db.service.XSupport;
+import org.simantics.db.services.GlobalServiceInitializer;
import org.simantics.graph.db.GraphDependencyAnalyzer;
import org.simantics.graph.db.GraphDependencyAnalyzer.IU;
import org.simantics.graph.db.GraphDependencyAnalyzer.IdentityNode;
import org.simantics.graph.diff.Diff;
import org.simantics.graph.diff.TransferableGraphDelta1;
import org.simantics.internal.Activator;
+import org.simantics.internal.TimedSessionCache;
import org.simantics.internal.startup.StartupExtensions;
import org.simantics.layer0.Layer0;
import org.simantics.operation.Layer0X;
import org.simantics.project.management.ServerManager;
import org.simantics.project.management.ServerManagerFactory;
import org.simantics.project.management.WorkspaceUtil;
+import org.simantics.scl.compiler.module.repository.ModuleRepository;
+import org.simantics.scl.osgi.SCLOsgi;
import org.simantics.utils.FileUtils;
import org.simantics.utils.datastructures.Pair;
-import org.simantics.utils.logging.TimeLogger;
import org.simantics.utils.strings.EString;
+import org.simantics.utils.threads.ExecutorWorker;
+import org.simantics.utils.threads.ThreadUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
* It is applied when the ontology in the database of a workspace doesn't match
* a newer ontology in the Eclipse workspace.
*/
- public static enum OntologyRecoveryPolicy { ThrowError, Merge, ReinstallDatabase }
+ public static enum OntologyRecoveryPolicy { ThrowError, Merge, ReinstallDatabase, Bypass}
/**
* This policy dictates how the Simantics platform startup should react if
session.getService(XSupport.class).setServiceMode(true, true);
// Throw error
- if (ontologyPolicy == OntologyRecoveryPolicy.ThrowError) {
+ if (ontologyPolicy == OntologyRecoveryPolicy.ThrowError || ontologyPolicy == OntologyRecoveryPolicy.Bypass) {
StringBuilder sb = new StringBuilder("The following graphs are not installed in the database: ");
if (!installTGs.isEmpty()) {
int i = 0;
sb.append(" Database/Platform Bundle version mismatch.\n");
}
sb.append("Hint: Use -fixErrors to install the graphs.");
- throw new PlatformException(sb.toString());
+ if (ontologyPolicy == OntologyRecoveryPolicy.ThrowError)
+ throw new PlatformException(sb.toString());
+ else
+ log.log(new Status(IStatus.WARNING, Activator.PLUGIN_ID, sb.toString()));
}
+
// Reinstall database
if (ontologyPolicy == OntologyRecoveryPolicy.ReinstallDatabase) {
log.log(new Status(IStatus.INFO, Activator.PLUGIN_ID, "Reinstalling the database."));
sb.append("Conflict with "+problem.first+" and "+problem.second+".\n");
}
throw new PlatformException(sb.toString());
- }
- else if(!session.syncRequest( analyzer.queryExternalDependenciesSatisfied )) {
+ } else if(!session.syncRequest( analyzer.queryExternalDependenciesSatisfied )) {
Collection<IdentityNode> unsatisfiedDependencies = analyzer.getUnsatisfiedDependencies();
StringBuilder sb = new StringBuilder();
for (IdentityNode dep: unsatisfiedDependencies) {
throw new PlatformException(sb.toString());
}
+ message = "Analyzed graph bundles";
+ monitor.subTask(message);
+ LOGGER.info(message);
+
List<GraphBundle> sortedBundles = analyzer.getSortedGraphs();
if(!sortedBundles.isEmpty()) {
}
session.getService(XSupport.class).setServiceMode(false, false);
}
+ message = "Ontologies synchronized";
+ monitor.subTask(message);
+ LOGGER.info(message);
monitor.worked(100);
} catch (IOException e) {
throw new PlatformException(e);
}
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;
try { // Load driver
- Driver driver = Manager.getDriver("procore");
+ Driver driver = Manager.getDriver("acorn");
Management management = driver.getManagement(dbLocation.getAbsolutePath(), null);
management.delete();
} catch (DatabaseException e) {
{
assert(!running);
- TimeLogger.log("Beginning of SimanticsPlatform.startUp");
-
LOGGER.info("Beginning of SimanticsPlatform.startUp");
SubMonitor monitor = SubMonitor.convert(progressMonitor, 1000);
// 0. Consult all startup extensions before doing anything with the workspace.
StartupExtensions.consultStartupExtensions();
- TimeLogger.log("Consulted platform pre-startup extensions");
+ LOGGER.info("Consulted platform pre-startup extensions");
// 0.1. Clear all temporary files
Simantics.clearTemporaryDirectory();
- TimeLogger.log("Cleared temporary directory");
+ LOGGER.info("Cleared temporary directory");
// 0.2 Clear VariableRepository.repository static map which holds references to SessionImplDb
VariableRepository.clear();
+ // 0.2.1 Activate org.simantics.scl.osgi to prime the SCL compiler early.
+ @SuppressWarnings("unused")
+ ModuleRepository modRepo = SCLOsgi.MODULE_REPOSITORY;
+
// 0.3 Handle baseline database before opening db
@SuppressWarnings("unused")
boolean usingBaseline = handleBaselineDatabase();
// 1. Assert there is a database at <workspace>/db
SessionDescriptor sessionDescriptor = setupDatabase(databaseDriverId, monitor.newChild(200, SubMonitor.SUPPRESS_NONE), workspacePolicy, userAgent);
session = sessionDescriptor.getSession();
- TimeLogger.log("Database setup complete");
-
+ LOGGER.info("Database setup complete");
+
// 2. Delete all indexes if we cannot be certain they are up-to-date
// A full index rebuild will be done later, before project activation.
XSupport support = session.getService(XSupport.class);
// 3. Assert all graphs, and correct versions, are installed to the database
synchronizeOntologies(monitor.newChild(400, SubMonitor.SUPPRESS_NONE), ontologyPolicy, requireSynchronize);
- TimeLogger.log("Synchronized ontologies");
// 4. Assert simantics.cfg exists
boolean installProject = assertConfiguration(monitor.newChild(25, SubMonitor.SUPPRESS_NONE),workspacePolicy);
// 6. Install all features into project, if in debug mode
updateInstalledGroups(monitor.newChild(25), true); //installProject);
- TimeLogger.log("Installed all features into project");
+ LOGGER.info("Installed all features into project");
// 7. Assert L0.Session in database for this session
assertSessionModel(monitor.newChild(25, SubMonitor.SUPPRESS_NONE));
session.getService(XSupport.class).setServiceMode(false, false);
try {
- monitor.setTaskName("Flush query cache");
+ String message = "Flush query cache";
+ monitor.setTaskName(message);
+ LOGGER.info(message);
session.syncRequest((Write) graph -> {
QueryControl qc = graph.getService(QueryControl.class);
qc.flush(graph);
});
- TimeLogger.log("Flushed queries");
} catch (DatabaseException e) {
LOGGER.error("Flushing queries failed.", e);
}
boolean loadProject = true;
try {
-
- monitor.setTaskName("Open database session");
+ String message = "Open database session";
+ monitor.setTaskName(message);
+ LOGGER.info(message);
sessionContext = SimanticsPlatform.INSTANCE.createSessionContext(true);
// This must be before setSessionContext since some listeners might query this
sessionContext.setHint(SimanticsKeys.KEY_PROJECT, SimanticsPlatform.INSTANCE.projectResource);
Simantics.setSessionContext(sessionContext);
// 1. Put ResourceBinding that throws an exception to General Bindings
+ message = "Put ResourceBinding that throws an exception to General Bindings";
+ LOGGER.info(message);
simanticsBindings = new SimanticsBindings();
Bindings.classBindingFactory.addFactory( simanticsBindings );
session.registerService(Databoard.class, Bindings.databoard);
// Register datatype bindings
+ message = "Register datatype bindings";
+ LOGGER.info(message);
Bindings.defaultBindingFactory.getRepository().put(RGB.Integer.BINDING.type(), RGB.Integer.BINDING);
Bindings.defaultBindingFactory.getRepository().put(Font.BINDING.type(), Font.BINDING);
if (support.rolledback() || sessionDescriptor.isFreshDatabase()) {
- monitor.setTaskName("Rebuilding all indexes");
+ message = "Rebuilding all indexes";
+ LOGGER.info(message);
+ monitor.setTaskName(message);
try {
session.getService(IndexedRelations.class).fullRebuild(monitor.newChild(100), session);
} catch (IndexException e) {
}
if(loadProject) {
- TimeLogger.log("Load project");
- monitor.setTaskName("Load project");
+ message = "Load project";
+ monitor.setTaskName(message);
+ LOGGER.info(message);
project = Projects.loadProject(sessionContext.getSession(), SimanticsPlatform.INSTANCE.projectResource);
sessionContext.setHint(ProjectKeys.KEY_PROJECT, project);
monitor.worked(100);
- TimeLogger.log("Loading projects complete");
+ message = "Loading projects complete";
+ LOGGER.info(message);
- monitor.setTaskName("Activate project");
+ message = "Activate project";
+ monitor.setTaskName(message);
+ LOGGER.info(message);
project.activate();
monitor.worked(100);
- TimeLogger.log("Project activated");
+ LOGGER.info("Project activated");
}
} catch (DatabaseException e) {
// the user from undoing any initialization operations performed
// by the platform startup.
SimanticsPlatform.INSTANCE.discardSessionUndoHistory();
- TimeLogger.log("Discarded session undo history");
+ LOGGER.info("Discarded session undo history");
return sessionContext;
}
+ public void registerServices(SessionContext context) {
+ new GlobalServiceInitializer().initialize(session);
+ session.registerService(MergingGraphRequestProcessor.class, new MergingGraphRequestProcessor("SessionService", session, 20));
+ session.registerService(MergingDelayedWriteProcessor.class, new MergingDelayedWriteProcessor(session, 20));
+ }
+
+
public SessionContext createSessionContext(boolean init) throws PlatformException {
try {
// Construct and initialize SessionContext from Session.
SessionContext sessionContext = SessionContext.create(session, init);
- TimeLogger.log("Session context created");
+ String message = "Session context created";
+ LOGGER.info(message);
if (init) {
- sessionContext.registerServices();
- TimeLogger.log("Session services registered");
+ registerServices(sessionContext);
+ message = "Session services registered";
+ LOGGER.info(message);
}
return sessionContext;
} catch (DatabaseException e) {
}
progress.worked(10);
+ // NOP at the moment
+ TimedSessionCache.close();
+
+ progress.subTask("Thread pools");
+ ThreadUtils.shutdown();
+ ExecutorWorker.shutdown();
+ progress.worked(5);
+
running = false;
progress.subTask("Close Database Session");
if (sessionContext != null) {
// Make sure Simantics clipboard doesn't store unwanted session data references.
Simantics.setClipboard(new SimanticsClipboardImpl());
- progress.worked(30);
+ progress.worked(50);
session = null;
projectResource = null;
}
progress.worked(10);
+ progress.subTask("Clear index status");
+ try {
+ // Everything ok, clear index dirty state.
+ DatabaseIndexing.clearAllDirty();
+ } catch (IOException e) {
+ LOGGER.error("Problems encountered while refreshing database index states, see exception for details.", e);
+ }
+ progress.worked(5);
+
if (clearTemporaryFiles) {
progress.subTask("Clearing Workspace Temporary Directory");
try {