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;
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;
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<GraphBundleRef, GraphBundleEx> platformTGs = new HashMap<GraphBundleRef, GraphBundleEx>();
+ monitor.setTaskName(message);
+
+ DatabaseManagement mgmt = new DatabaseManagement();
+ Map<GraphBundleRef, GraphBundleEx> 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<GraphBundleRef, GraphBundleEx> installedTGs = new HashMap<GraphBundleRef, GraphBundleEx>();
+ Map<GraphBundleRef, GraphBundleEx> installedTGs = new HashMap<>();
for (GraphBundle b : session.syncRequest( mgmt.GraphBundleQuery )) {
installedTGs.put(GraphBundleRef.of(b), GraphBundleEx.extend(b));
}
// 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<GraphBundle> 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);
// 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<GraphBundleEx> installTGs = new ArrayList<GraphBundleEx>();
+ List<GraphBundleEx> installTGs = new ArrayList<>();
// Create list of TGs to update, <newTg, oldTg>
- Map<GraphBundleEx,GraphBundleEx> reinstallTGs = new TreeMap<GraphBundleEx,GraphBundleEx>();
+ Map<GraphBundleEx,GraphBundleEx> reinstallTGs = new TreeMap<>();
for (Entry<GraphBundleRef, GraphBundleEx> e : platformTGs.entrySet()) {
GraphBundleRef key = e.getKey();
GraphBundleEx platformBundle = e.getValue();
if (ontologyPolicy == OntologyRecoveryPolicy.Merge) {
message = "Merging ontology changes";
- progressMonitor.subTask(message);
+ monitor.subTask(message);
LOGGER.info(message);
// Sort missing TGs into install order
GraphDependencyAnalyzer<GraphBundle> analyzer = new GraphDependencyAnalyzer<GraphBundle>();
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);
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) {
if (!Files.isRegularFile(baseline))
throw new PlatformException("Specified database baseline archive " + baseline + " does not exist. Cannot initialize workspace database.");
- validateBaselineFile(baseline);
- validateWorkspaceForBaselineInitialization(workspaceLocation);
-
- try {
- Files.createDirectories(workspaceLocation);
- FileUtils.extractZip(baseline.toFile(), workspaceLocation.toFile());
- Files.write(baselineIndicatorFile, 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);
- }
+ DatabaseBaselines.validateBaselineFile(baseline);
+ DatabaseBaselines.validateWorkspaceForBaselineInitialization(workspaceLocation);
+ DatabaseBaselines.initializeWorkspaceWithBaseline(baseline, workspaceLocation, baselineIndicatorFile);
+ return true;
}
/**
// 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 <workspace>/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 {
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);
}
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) {