X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics%2Fsrc%2Forg%2Fsimantics%2FSimanticsPlatform.java;h=1cedd4fcbd3dd98c0d779a9b356f4e071b94be4a;hb=refs%2Fchanges%2F49%2F1549%2F6;hp=e529938e278a6f781f986dd618efd58285f46035;hpb=a8d030f7db1f59a5b51cdc34f18de7c0a0ee8549;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics/src/org/simantics/SimanticsPlatform.java b/bundles/org.simantics/src/org/simantics/SimanticsPlatform.java index e529938e2..1cedd4fcb 100644 --- a/bundles/org.simantics/src/org/simantics/SimanticsPlatform.java +++ b/bundles/org.simantics/src/org/simantics/SimanticsPlatform.java @@ -22,9 +22,6 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.time.Instant; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -35,8 +32,6 @@ import java.util.Properties; import java.util.Set; import java.util.TreeMap; import java.util.UUID; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; import org.eclipse.core.runtime.ILog; import org.eclipse.core.runtime.IProduct; @@ -271,23 +266,24 @@ public class SimanticsPlatform implements LifecycleListener { public void synchronizeOntologies(IProgressMonitor progressMonitor, OntologyRecoveryPolicy ontologyPolicy, boolean requireSynchronize) throws PlatformException { - if (progressMonitor == null) progressMonitor = new NullProgressMonitor(); - - final DatabaseManagement mgmt = new DatabaseManagement(); + SubMonitor monitor = SubMonitor.convert(progressMonitor, 100); + monitor.setTaskName("Compile dynamic ontologies"); PlatformUtil.compileAllDynamicOntologies(); String message = "Asserting all ontologies are installed"; LOGGER.info(message); - progressMonitor.setTaskName(message); - final Map platformTGs = new HashMap(); + monitor.setTaskName(message); + + DatabaseManagement mgmt = new DatabaseManagement(); + Map platformTGs = new HashMap<>(); try { // Get a list of bundles installed into the database message = "find installed bundles from database"; - progressMonitor.subTask(message); + monitor.subTask(message); LOGGER.info(message); - Map installedTGs = new HashMap(); + Map installedTGs = new HashMap<>(); for (GraphBundle b : session.syncRequest( mgmt.GraphBundleQuery )) { installedTGs.put(GraphBundleRef.of(b), GraphBundleEx.extend(b)); } @@ -297,11 +293,11 @@ public class SimanticsPlatform implements LifecycleListener { // Get a list of all bundles in the platform (Bundle Context) message = "load all transferable graphs from platform"; - progressMonitor.subTask(message); + monitor.subTask(message); LOGGER.info(message); Collection tgs = PlatformUtil.getAllGraphs(); message = "extend bundles to compile versions"; - progressMonitor.subTask(message); + monitor.subTask(message); LOGGER.info(message); for (GraphBundle b : tgs) { GraphBundleEx gbe = GraphBundleEx.extend(b); @@ -311,11 +307,11 @@ public class SimanticsPlatform implements LifecycleListener { // Compile a list of TGs that need to be installed or reinstalled in the database message = "check bundle reinstallation demand"; - progressMonitor.subTask(message); + monitor.subTask(message); LOGGER.info(message); - List installTGs = new ArrayList(); + List installTGs = new ArrayList<>(); // Create list of TGs to update, - Map reinstallTGs = new TreeMap(); + Map reinstallTGs = new TreeMap<>(); for (Entry e : platformTGs.entrySet()) { GraphBundleRef key = e.getKey(); GraphBundleEx platformBundle = e.getValue(); @@ -386,7 +382,7 @@ public class SimanticsPlatform implements LifecycleListener { if (ontologyPolicy == OntologyRecoveryPolicy.Merge) { message = "Merging ontology changes"; - progressMonitor.subTask(message); + monitor.subTask(message); LOGGER.info(message); // Sort missing TGs into install order GraphDependencyAnalyzer analyzer = new GraphDependencyAnalyzer(); @@ -463,11 +459,9 @@ public class SimanticsPlatform implements LifecycleListener { log.log(new Status(IStatus.INFO, Activator.PLUGIN_ID, "Merging new version of "+tg.toString())); startTransaction(session, true); - + //delta.print(); try { - - long[] resourceArray = TransferableGraphs.applyDelta(writeGraph(), oldResources, delta); tg.setResourceArray(resourceArray); mgmt.setGraphBundleEntry(tg); @@ -489,13 +483,10 @@ public class SimanticsPlatform implements LifecycleListener { if (mergedOntologies) DatabaseIndexing.deleteAllIndexes(); } - - TimeLogger.log("Ontologies synchronized."); - } session.getService(XSupport.class).setServiceMode(false, false); } - progressMonitor.worked(20); + monitor.worked(100); } catch (IOException e) { throw new PlatformException(e); } catch (DatabaseException e) { @@ -722,58 +713,19 @@ public class SimanticsPlatform implements LifecycleListener { if (!Files.isRegularFile(baseline)) throw new PlatformException("Specified database baseline archive " + baseline + " does not exist. Cannot initialize workspace database."); - validateBaselineFile(baseline); - validateWorkspaceForBaselineInitialization(workspaceLocation); + DatabaseBaselines.validateBaselineFile(baseline); + DatabaseBaselines.validateWorkspaceForBaselineInitialization(workspaceLocation); try { Files.createDirectories(workspaceLocation); FileUtils.extractZip(baseline.toFile(), workspaceLocation.toFile()); - Files.write(baselineIndicatorFile, baselineIndicatorContents(baselineIndicatorFile)); + Files.write(baselineIndicatorFile, DatabaseBaselines.baselineIndicatorContents(baselineIndicatorFile)); return true; } catch (IOException e) { throw new PlatformException(e); } } - private static final DateTimeFormatter TIMESTAMP_FORMAT = DateTimeFormatter.ofPattern("d. MMM yyyy HH:mm:ss"); - - private static byte[] baselineIndicatorContents(Path path) throws IOException { - return String.format("%s%n%s%n", - path.toString(), - Instant.now().atZone(ZoneId.systemDefault()).format(TIMESTAMP_FORMAT)) - .getBytes("UTF-8"); - } - - private void validateWorkspaceForBaselineInitialization(Path workspaceLocation) throws PlatformException { - try { - Path db = workspaceLocation.resolve("db"); - if (Files.exists(db)) - throw new PlatformException("Database location " + db + " already exists. Cannot re-initialize workspace from baseline."); - Path index = workspaceLocation.resolve(".metadata/.plugins/org.simantics.db.indexing"); - if (!Files.exists(index) || !isEmptyDirectory(index)) - throw new PlatformException("Index location " + index + " already exists. Cannot re-initialize workspace from baseline."); - } catch (IOException e) { - throw new PlatformException("Failed to validate workspace for baseline initialization", e); - } - } - - private static boolean isEmptyDirectory(Path dir) throws IOException { - return Files.walk(dir).count() == 1; - } - - private void validateBaselineFile(Path baseline) throws PlatformException { - try (ZipFile zip = new ZipFile(baseline.toFile())) { - ZipEntry db = zip.getEntry("db"); - if (db == null) - throw new PlatformException("Baseline archive does not contain database directory 'db'"); - ZipEntry index = zip.getEntry(".metadata/.plugins/org.simantics.db.indexing"); - if (index == null) - throw new PlatformException("Baseline archive does not contain database index directory '.metadata/.plugins/org.simantics.db.indexing'"); - } catch (IOException e) { - throw new PlatformException("Failed to validate baseline archive " + baseline, e); - } - } - /** * Start-up the platform. The procedure consists of 8 steps. Once everything * is up and running, all fields are set property. @@ -826,17 +778,18 @@ public class SimanticsPlatform implements LifecycleListener { // 0.2 Clear VariableRepository.repository static map which holds references to SessionImplDb VariableRepository.clear(); - + // 0.3 Handle baseline database before opening db + @SuppressWarnings("unused") boolean usingBaseline = handleBaselineDatabase(); - + // 1. Assert there is a database at /db SessionDescriptor sessionDescriptor = setupDatabase(databaseDriverId, monitor.newChild(200, SubMonitor.SUPPRESS_NONE), workspacePolicy, userAgent); session = sessionDescriptor.getSession(); TimeLogger.log("Database setup complete"); - // 1.1 Delete all indexes if we cannot be certain they are up-to-date - // A full index rebuild will be done later, before project activation. + // 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); if (support.rolledback()) { try { @@ -845,12 +798,10 @@ public class SimanticsPlatform implements LifecycleListener { throw new PlatformException(e); } } - - // 2. Assert all graphs, and correct versions, are installed to the database - if(!usingBaseline) { - synchronizeOntologies(monitor.newChild(400, SubMonitor.SUPPRESS_NONE), ontologyPolicy, requireSynchronize); - TimeLogger.log("Synchronized ontologies"); - } + + // 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); @@ -916,16 +867,17 @@ public class SimanticsPlatform implements LifecycleListener { } if(loadProject) { - TimeLogger.log("Load projects"); + TimeLogger.log("Load project"); + monitor.setTaskName("Load project"); project = Projects.loadProject(sessionContext.getSession(), SimanticsPlatform.INSTANCE.projectResource); - monitor.worked(100); - sessionContext.setHint(ProjectKeys.KEY_PROJECT, project); + monitor.worked(100); TimeLogger.log("Loading projects complete"); + monitor.setTaskName("Activate project"); project.activate(); - TimeLogger.log("Project activated"); monitor.worked(100); + TimeLogger.log("Project activated"); } } catch (DatabaseException e) {