From 24e2b34260f219f0d1644ca7a138894980e25b14 Mon Sep 17 00:00:00 2001 From: Tuukka Lehtonen Date: Thu, 29 Dec 2016 13:05:27 +0200 Subject: [PATCH] Improved error handling in shared library import wizard Previously the wizard catched all exceptions in the wrong place causing the UI to never show any errors to the user and just close the wizard as if everything was successful. The problems were only printed to the console and in selected cases also to the workspace error log. This changes the import code to not catch any exceptions and let the UI side deal with the thrown exceptions by logging them, showing them to the user as the wizard's error message and in a separate error dialog. refs #6903 [PRIVATE-12918] Change-Id: I5014c86abb61e097b610d7f62e849d1737a4a92b --- .../db/layer0/migration/MigrationUtils.java | 722 +++++++++--------- .../wizard/SharedOntologyImportWizard.java | 410 +++++----- 2 files changed, 559 insertions(+), 573 deletions(-) diff --git a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/migration/MigrationUtils.java b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/migration/MigrationUtils.java index a026f013e..052bc6e6f 100644 --- a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/migration/MigrationUtils.java +++ b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/migration/MigrationUtils.java @@ -1,360 +1,362 @@ -/******************************************************************************* - * Copyright (c) 2012 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 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * VTT Technical Research Centre of Finland - initial API and implementation - *******************************************************************************/ -package org.simantics.db.layer0.migration; - -import java.io.File; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.NullProgressMonitor; -import org.simantics.databoard.Bindings; -import org.simantics.databoard.binding.mutable.Variant; -import org.simantics.databoard.container.DataContainer; -import org.simantics.db.ReadGraph; -import org.simantics.db.Resource; -import org.simantics.db.Session; -import org.simantics.db.WriteGraph; -import org.simantics.db.WriteOnlyGraph; -import org.simantics.db.common.CommentMetadata; -import org.simantics.db.common.request.BinaryRead; -import org.simantics.db.common.request.FreshEscapedName; -import org.simantics.db.common.request.UnaryRead; -import org.simantics.db.common.request.WriteRequest; -import org.simantics.db.common.utils.VersionMap; -import org.simantics.db.common.utils.VersionMapRequest; -import org.simantics.db.common.utils.Versions; -import org.simantics.db.exception.DatabaseException; -import org.simantics.db.layer0.adapter.Instances; -import org.simantics.db.layer0.adapter.impl.DefaultPasteHandler; -import org.simantics.db.layer0.adapter.impl.SharedOntologyImportAdvisor; -import org.simantics.db.layer0.adapter.impl.TrashBinRemover; -import org.simantics.db.layer0.internal.SimanticsInternal; -import org.simantics.db.layer0.util.Layer0Utils; -import org.simantics.db.layer0.util.TGTransferableGraphSource; -import org.simantics.db.service.XSupport; -import org.simantics.graph.db.IImportAdvisor; -import org.simantics.graph.db.MissingDependencyException; -import org.simantics.graph.db.TransferableGraphException; -import org.simantics.graph.representation.Identity; -import org.simantics.graph.representation.Root; -import org.simantics.graph.representation.TransferableGraph1; -import org.simantics.graph.representation.TransferableGraphUtils; -import org.simantics.layer0.Layer0; -import org.simantics.utils.datastructures.Pair; -import org.simantics.utils.datastructures.collections.CollectionUtils; - -public class MigrationUtils { - - public static final boolean DEBUG = false; - - public static MigrationState newState() { - return new MigrationStateImpl(); - } - - public static MigrationStep getStep(Session session, String uri) throws DatabaseException { - return session.sync(new UnaryRead(uri) { - - @Override - public MigrationStep perform(ReadGraph graph) throws DatabaseException { - Resource r = graph.getResource(parameter); - return graph.adapt(r, MigrationStep.class); - } - - }); - } - -// public static TransferableGraph1 getTG(Session session, MigrationState state) { -// return getTG(session, state, true, false); -// } - - public static void clearTempResource(Session session, final Resource resource) { - session.asyncRequest(new WriteRequest() { - - @Override - public void perform(WriteGraph graph) throws DatabaseException { - graph.deny(resource, Layer0.getInstance(graph).PartOf); - } - }); - } - - public static Collection importTo(IProgressMonitor monitor, Session session, MigrationState state, final Resource parent, final IImportAdvisor advisor) throws DatabaseException, TransferableGraphException { - final Resource resource = getResource(monitor, session, state); - final ArrayList result = new ArrayList(); - if(resource != null) { - session.syncRequest(new WriteRequest() { - - @Override - public void perform(WriteGraph graph) throws DatabaseException { - - Layer0 L0 = Layer0.getInstance(graph); - - for(Resource root : graph.getObjects(resource, L0.ConsistsOf)) { - - String baseName = Versions.getBaseName(graph, root); - String version = Versions.getVersion(graph, root); - if(version != null) { - VersionMap map = graph.syncRequest(new VersionMapRequest(parent)); - if(map.contains(baseName, version)) { - String newName = graph.syncRequest(new FreshEscapedName(parent, Layer0.getInstance(graph).ConsistsOf, baseName)); - graph.claimLiteral(root, L0.HasName, newName + "@1", Bindings.STRING); - } - } else { - String newName = graph.syncRequest(new FreshEscapedName(parent, Layer0.getInstance(graph).ConsistsOf, baseName)); - if(!newName.equals(baseName)) { - graph.claimLiteral(root, L0.HasName, newName, Bindings.STRING); - } - } - - graph.deny(root, L0.PartOf); - graph.claim(root, L0.PartOf, parent); - - CommentMetadata cm = graph.getMetadata(CommentMetadata.class); - graph.addMetadata(cm.add("Imported " + graph.getURI(root) + ", resource " + root)); - - result.add(root); - - } - - graph.deny(resource, L0.PartOf); - - } - }); - } else { - TransferableGraph1 tg = getTG(session, state); - if(tg != null) { - DefaultPasteHandler.defaultExecute(tg, parent, new IImportAdvisor() { - - @Override - public Resource createRoot(WriteOnlyGraph graph, Root root) throws DatabaseException { - Resource r = advisor.createRoot(graph, root); - result.add(r); - return r; - } - - @Override - public Resource analyzeRoot(ReadGraph graph, Root root) throws DatabaseException { - return advisor.analyzeRoot(graph, root); - } - }); - } - } - return result; - } - - - @SuppressWarnings("deprecation") - public static Collection getMigrationSteps(DataContainer header) throws DatabaseException { - - return SimanticsInternal.sync(new BinaryRead>(header.format, header.version) { - - @Override - public Collection perform(ReadGraph graph) throws DatabaseException { - - Layer0 L0 = Layer0.getInstance(graph); - ArrayList> steps = new ArrayList>(); - Instances query = graph.adapt(L0.Migration, Instances.class); - Set migrations = new HashSet(); - for(Resource ontology : Layer0Utils.listOntologies(graph)) { - migrations.addAll(Layer0Utils.sortByCluster(graph, query.find(graph, ontology))); - } - for(Resource migration : migrations) { - if(DEBUG) - System.err.println("getMigrationSteps: " + graph.getURI(migration)); - String format = graph.getRelatedValue(migration, L0.Migration_format); - if(DEBUG) - System.err.println("-format=" + format); - if(parameter.equals(format)) { - Integer from = graph.getRelatedValue(migration, L0.Migration_from); - if(DEBUG) - System.err.println("-from=" + from); - Resource step = graph.getSingleObject(migration, L0.Migration_step); - if(parameter2.equals(from)) { - Double priority = graph.getRelatedValue(migration, L0.Migration_priority); - steps.add(Pair.make(-priority, graph.adapt(step, MigrationStep.class))); - if(DEBUG) - System.err.println("=> ACCEPT"); - } else { - if(DEBUG) - System.err.println("=> REJECT"); - } - } - } - /* - Resource base = graph.getResource(baseURI); - if(DEBUG) - System.err.println("getMigrationSteps format=" + parameter + ", version=" + parameter2); - for(Resource migration : graph.sync(new ObjectsWithType(base, L0.ConsistsOf, L0.Migration))) { - }*/ - return CollectionUtils.sortByFirst(steps); - } - - }); - } - - public static Resource importMigrated(IProgressMonitor monitor, Session session, File modelFile, MigrationState state, IImportAdvisor advisor, Resource target) throws Exception { - Collection roots = importMigratedMany(monitor, session, modelFile, state, advisor, target); - if(roots.size() == 1) { - return roots.iterator().next(); - } else { - return null; - } - } - - public static Collection importMigratedMany(IProgressMonitor monitor, Session session, File modelFile, MigrationState state, IImportAdvisor advisor, Resource target) throws Exception { - - //assert(target != null); - assert(advisor != null); - - if(monitor == null) monitor = new NullProgressMonitor(); - - if(DEBUG) - System.err.println("importMigrated: file=" + (modelFile != null ? modelFile.getAbsolutePath() : null)); - - //String baseURI = state.getProperty(MigrationStateKeys.BASE_URI); -// if(DEBUG) -// System.err.println("importMigrated: baseURI=" + baseURI); - - state.setProperty(MigrationStateKeys.MODEL_FILE, modelFile); - state.setProperty(MigrationStateKeys.SESSION, session); - state.setProperty(MigrationStateKeys.PROGRESS_MONITOR, monitor); - state.setProperty(MigrationStateKeys.IMPORT_ADVISOR, advisor); - - DataContainer dc = state.getProperty(MigrationStateKeys.CURRENT_DATA_CONTAINER); - Collection migration = getMigrationSteps(dc); - -// TransferableGraph1 tg = state.getProperty(MigrationStateKeys.CURRENT_TG); -// state.setProperty(MigrationStateKeys.TG_EXTENSIONS, tg.extensions); - - for(MigrationStep step : migration) { - step.applyTo(monitor, session, state); - if (monitor.isCanceled()) - break; - } - - if (monitor.isCanceled()) { - // Move possibly created material into TrashBin and quit. - final Resource root = state.probeProperty(MigrationStateKeys.CURRENT_RESOURCE); - if (root != null) { - session.syncRequest(new WriteRequest() { - @Override - public void perform(WriteGraph graph) throws DatabaseException { - new TrashBinRemover(root).remove(graph); - } - }); - } - return Collections.emptyList(); - } - - // Absolute path imports end up here - if(target == null) { - Collection roots = state.getProperty(MigrationStateKeys.CURRENT_ROOT_RESOURCES); - return roots; - } - - // Finally import model into final destination - return importTo(monitor, session, state, target, advisor); - - } - - public static TransferableGraph1 getTG(Session session, MigrationState state) throws DatabaseException { - return state.getProperty(MigrationStateKeys.CURRENT_TG); - } - - public static Resource getResource(IProgressMonitor monitor, Session session, MigrationState state) throws DatabaseException { - return state.getProperty(MigrationStateKeys.CURRENT_RESOURCE); - } - - public static Collection getRootResources(IProgressMonitor monitor, Session session, MigrationState state) throws DatabaseException { - return state.getProperty(MigrationStateKeys.CURRENT_ROOT_RESOURCES); - } - - /** - * Get a property from the specified MigrationState and return specified - * default value if the property value is null. - * - * @param state the state to get the property from - * @param key the property to get - * @param defaultValue - * the default value to return if the property value is - * null - * @return the property value - * @throws DatabaseException - * if fetching the property fails for some reason - */ - public static T getProperty(MigrationState state, String key, T defaultValue) throws DatabaseException { - T t = state.getProperty(key); - return t != null ? t : defaultValue; - } - - public static Resource importSharedOntology(Session session, TransferableGraph1 tg, boolean published) throws DatabaseException { - return importSharedOntology(null, session, tg, published); - } - - public static Resource importSharedOntology(IProgressMonitor monitor, Session session, TransferableGraph1 tg, boolean published) throws DatabaseException { - - if(monitor == null) monitor = new NullProgressMonitor(); - - Collection roots = TransferableGraphUtils.getRoots(tg); - if(roots.size() == 1) { -// Identity id = roots.iterator().next(); -// final Root root = (Root)id.definition; -// Resource rootResource = session.syncRequest(new WriteResultRequest() { -// @Override -// public Resource perform(WriteGraph graph) throws DatabaseException { -// Resource type = graph.getResource(root.type); -// Resource existing = graph.getPossibleResource(root.name); -// if(existing != null) throw new DatabaseException("Shared library " + root.name + " exists already."); -// return Layer0Utils.applySCL("Simantics/SharedOntologies", "createSharedOntology", graph, root.name, type); -// } -// }); - try { - - TGTransferableGraphSource tgSource = new TGTransferableGraphSource(tg); - SharedOntologyImportAdvisor advisor = new SharedOntologyImportAdvisor(published); -// TransferableGraphs.importGraph1(session, tgSource, advisor); - -// if (advisor.getRoots().size() == 1) { -// return advisor.getRoots().iterator().next(); -// } - //TransferableGraphs.importGraph1(session, tg, new SharedOntologyImportAdvisor(), null); - - MigrationState state = newState(); - //state.setProperty(MigrationStateKeys.BASE_URI, AprosBuiltins.URIs.Migration); - state.setProperty(MigrationStateKeys.UPDATE_DEPENDENCIES, false); - state.setProperty(MigrationStateKeys.CURRENT_TGS, tgSource); - state.setProperty(MigrationStateKeys.SESSION, session); - state.setProperty(MigrationStateKeys.PROGRESS_MONITOR, monitor); - state.setProperty(MigrationStateKeys.CURRENT_DATA_CONTAINER, new DataContainer("sharedLibrary", 1, new Variant(TransferableGraph1.BINDING, tg))); - - return MigrationUtils.importMigrated(monitor, session, null, state, advisor, null); - - } catch (TransferableGraphException e) { - throw new DatabaseException(e); - } catch (MissingDependencyException e) { - throw e; - } catch (Exception e) { - throw new DatabaseException(e); - } finally { - session.getService(XSupport.class).setServiceMode(false, false); - } - - } - - return null; - - } - -} +/******************************************************************************* + * Copyright (c) 2012 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 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ +package org.simantics.db.layer0.migration; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.simantics.databoard.Bindings; +import org.simantics.databoard.binding.mutable.Variant; +import org.simantics.databoard.container.DataContainer; +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.Session; +import org.simantics.db.WriteGraph; +import org.simantics.db.WriteOnlyGraph; +import org.simantics.db.common.CommentMetadata; +import org.simantics.db.common.request.BinaryRead; +import org.simantics.db.common.request.FreshEscapedName; +import org.simantics.db.common.request.UnaryRead; +import org.simantics.db.common.request.WriteRequest; +import org.simantics.db.common.utils.VersionMap; +import org.simantics.db.common.utils.VersionMapRequest; +import org.simantics.db.common.utils.Versions; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.adapter.Instances; +import org.simantics.db.layer0.adapter.impl.DefaultPasteHandler; +import org.simantics.db.layer0.adapter.impl.SharedOntologyImportAdvisor; +import org.simantics.db.layer0.adapter.impl.TrashBinRemover; +import org.simantics.db.layer0.internal.SimanticsInternal; +import org.simantics.db.layer0.util.Layer0Utils; +import org.simantics.db.layer0.util.TGTransferableGraphSource; +import org.simantics.db.service.XSupport; +import org.simantics.graph.db.IImportAdvisor; +import org.simantics.graph.db.MissingDependencyException; +import org.simantics.graph.db.TransferableGraphException; +import org.simantics.graph.representation.Identity; +import org.simantics.graph.representation.Root; +import org.simantics.graph.representation.TransferableGraph1; +import org.simantics.graph.representation.TransferableGraphUtils; +import org.simantics.layer0.Layer0; +import org.simantics.utils.datastructures.Pair; +import org.simantics.utils.datastructures.collections.CollectionUtils; + +public class MigrationUtils { + + public static final boolean DEBUG = false; + + public static MigrationState newState() { + return new MigrationStateImpl(); + } + + public static MigrationStep getStep(Session session, String uri) throws DatabaseException { + return session.sync(new UnaryRead(uri) { + + @Override + public MigrationStep perform(ReadGraph graph) throws DatabaseException { + Resource r = graph.getResource(parameter); + return graph.adapt(r, MigrationStep.class); + } + + }); + } + +// public static TransferableGraph1 getTG(Session session, MigrationState state) { +// return getTG(session, state, true, false); +// } + + public static void clearTempResource(Session session, final Resource resource) { + session.asyncRequest(new WriteRequest() { + + @Override + public void perform(WriteGraph graph) throws DatabaseException { + graph.deny(resource, Layer0.getInstance(graph).PartOf); + } + }); + } + + public static Collection importTo(IProgressMonitor monitor, Session session, MigrationState state, final Resource parent, final IImportAdvisor advisor) throws DatabaseException, TransferableGraphException { + final Resource resource = getResource(monitor, session, state); + final ArrayList result = new ArrayList(); + if(resource != null) { + session.syncRequest(new WriteRequest() { + + @Override + public void perform(WriteGraph graph) throws DatabaseException { + + Layer0 L0 = Layer0.getInstance(graph); + + for(Resource root : graph.getObjects(resource, L0.ConsistsOf)) { + + String baseName = Versions.getBaseName(graph, root); + String version = Versions.getVersion(graph, root); + if(version != null) { + VersionMap map = graph.syncRequest(new VersionMapRequest(parent)); + if(map.contains(baseName, version)) { + String newName = graph.syncRequest(new FreshEscapedName(parent, Layer0.getInstance(graph).ConsistsOf, baseName)); + graph.claimLiteral(root, L0.HasName, newName + "@1", Bindings.STRING); + } + } else { + String newName = graph.syncRequest(new FreshEscapedName(parent, Layer0.getInstance(graph).ConsistsOf, baseName)); + if(!newName.equals(baseName)) { + graph.claimLiteral(root, L0.HasName, newName, Bindings.STRING); + } + } + + graph.deny(root, L0.PartOf); + graph.claim(root, L0.PartOf, parent); + + CommentMetadata cm = graph.getMetadata(CommentMetadata.class); + graph.addMetadata(cm.add("Imported " + graph.getURI(root) + ", resource " + root)); + + result.add(root); + + } + + graph.deny(resource, L0.PartOf); + + } + }); + } else { + TransferableGraph1 tg = getTG(session, state); + if(tg != null) { + DefaultPasteHandler.defaultExecute(tg, parent, new IImportAdvisor() { + + @Override + public Resource createRoot(WriteOnlyGraph graph, Root root) throws DatabaseException { + Resource r = advisor.createRoot(graph, root); + result.add(r); + return r; + } + + @Override + public Resource analyzeRoot(ReadGraph graph, Root root) throws DatabaseException { + return advisor.analyzeRoot(graph, root); + } + }); + } + } + return result; + } + + + @SuppressWarnings("deprecation") + public static Collection getMigrationSteps(DataContainer header) throws DatabaseException { + + return SimanticsInternal.sync(new BinaryRead>(header.format, header.version) { + + @Override + public Collection perform(ReadGraph graph) throws DatabaseException { + + Layer0 L0 = Layer0.getInstance(graph); + ArrayList> steps = new ArrayList>(); + Instances query = graph.adapt(L0.Migration, Instances.class); + Set migrations = new HashSet(); + for(Resource ontology : Layer0Utils.listOntologies(graph)) { + migrations.addAll(Layer0Utils.sortByCluster(graph, query.find(graph, ontology))); + } + for(Resource migration : migrations) { + if(DEBUG) + System.err.println("getMigrationSteps: " + graph.getURI(migration)); + String format = graph.getRelatedValue(migration, L0.Migration_format); + if(DEBUG) + System.err.println("-format=" + format); + if(parameter.equals(format)) { + Integer from = graph.getRelatedValue(migration, L0.Migration_from); + if(DEBUG) + System.err.println("-from=" + from); + Resource step = graph.getSingleObject(migration, L0.Migration_step); + if(parameter2.equals(from)) { + Double priority = graph.getRelatedValue(migration, L0.Migration_priority); + steps.add(Pair.make(-priority, graph.adapt(step, MigrationStep.class))); + if(DEBUG) + System.err.println("=> ACCEPT"); + } else { + if(DEBUG) + System.err.println("=> REJECT"); + } + } + } + /* + Resource base = graph.getResource(baseURI); + if(DEBUG) + System.err.println("getMigrationSteps format=" + parameter + ", version=" + parameter2); + for(Resource migration : graph.sync(new ObjectsWithType(base, L0.ConsistsOf, L0.Migration))) { + }*/ + return CollectionUtils.sortByFirst(steps); + } + + }); + } + + public static Resource importMigrated(IProgressMonitor monitor, Session session, File modelFile, MigrationState state, IImportAdvisor advisor, Resource target) throws Exception { + Collection roots = importMigratedMany(monitor, session, modelFile, state, advisor, target); + if(roots.size() == 1) { + return roots.iterator().next(); + } else { + return null; + } + } + + public static Collection importMigratedMany(IProgressMonitor monitor, Session session, File modelFile, MigrationState state, IImportAdvisor advisor, Resource target) throws Exception { + + //assert(target != null); + assert(advisor != null); + + if(monitor == null) monitor = new NullProgressMonitor(); + + if(DEBUG) + System.err.println("importMigrated: file=" + (modelFile != null ? modelFile.getAbsolutePath() : null)); + + //String baseURI = state.getProperty(MigrationStateKeys.BASE_URI); +// if(DEBUG) +// System.err.println("importMigrated: baseURI=" + baseURI); + + state.setProperty(MigrationStateKeys.MODEL_FILE, modelFile); + state.setProperty(MigrationStateKeys.SESSION, session); + state.setProperty(MigrationStateKeys.PROGRESS_MONITOR, monitor); + state.setProperty(MigrationStateKeys.IMPORT_ADVISOR, advisor); + + DataContainer dc = state.getProperty(MigrationStateKeys.CURRENT_DATA_CONTAINER); + Collection migration = getMigrationSteps(dc); + +// TransferableGraph1 tg = state.getProperty(MigrationStateKeys.CURRENT_TG); +// state.setProperty(MigrationStateKeys.TG_EXTENSIONS, tg.extensions); + + for(MigrationStep step : migration) { + step.applyTo(monitor, session, state); + if (monitor.isCanceled()) + break; + } + + if (monitor.isCanceled()) { + // Move possibly created material into TrashBin and quit. + final Resource root = state.probeProperty(MigrationStateKeys.CURRENT_RESOURCE); + if (root != null) { + session.syncRequest(new WriteRequest() { + @Override + public void perform(WriteGraph graph) throws DatabaseException { + new TrashBinRemover(root).remove(graph); + } + }); + } + return Collections.emptyList(); + } + + // Absolute path imports end up here + if(target == null) { + Collection roots = state.getProperty(MigrationStateKeys.CURRENT_ROOT_RESOURCES); + return roots; + } + + // Finally import model into final destination + return importTo(monitor, session, state, target, advisor); + + } + + public static TransferableGraph1 getTG(Session session, MigrationState state) throws DatabaseException { + return state.getProperty(MigrationStateKeys.CURRENT_TG); + } + + public static Resource getResource(IProgressMonitor monitor, Session session, MigrationState state) throws DatabaseException { + return state.getProperty(MigrationStateKeys.CURRENT_RESOURCE); + } + + public static Collection getRootResources(IProgressMonitor monitor, Session session, MigrationState state) throws DatabaseException { + return state.getProperty(MigrationStateKeys.CURRENT_ROOT_RESOURCES); + } + + /** + * Get a property from the specified MigrationState and return specified + * default value if the property value is null. + * + * @param state the state to get the property from + * @param key the property to get + * @param defaultValue + * the default value to return if the property value is + * null + * @return the property value + * @throws DatabaseException + * if fetching the property fails for some reason + */ + public static T getProperty(MigrationState state, String key, T defaultValue) throws DatabaseException { + T t = state.getProperty(key); + return t != null ? t : defaultValue; + } + + public static Resource importSharedOntology(Session session, TransferableGraph1 tg, boolean published) throws DatabaseException { + return importSharedOntology(null, session, tg, published); + } + + public static Resource importSharedOntology(IProgressMonitor monitor, Session session, TransferableGraph1 tg, boolean published) throws DatabaseException { + + if(monitor == null) monitor = new NullProgressMonitor(); + + Collection roots = TransferableGraphUtils.getRoots(tg); + if(roots.size() == 1) { +// Identity id = roots.iterator().next(); +// final Root root = (Root)id.definition; +// Resource rootResource = session.syncRequest(new WriteResultRequest() { +// @Override +// public Resource perform(WriteGraph graph) throws DatabaseException { +// Resource type = graph.getResource(root.type); +// Resource existing = graph.getPossibleResource(root.name); +// if(existing != null) throw new DatabaseException("Shared library " + root.name + " exists already."); +// return Layer0Utils.applySCL("Simantics/SharedOntologies", "createSharedOntology", graph, root.name, type); +// } +// }); + try { + + TGTransferableGraphSource tgSource = new TGTransferableGraphSource(tg); + SharedOntologyImportAdvisor advisor = new SharedOntologyImportAdvisor(published); +// TransferableGraphs.importGraph1(session, tgSource, advisor); + +// if (advisor.getRoots().size() == 1) { +// return advisor.getRoots().iterator().next(); +// } + //TransferableGraphs.importGraph1(session, tg, new SharedOntologyImportAdvisor(), null); + + MigrationState state = newState(); + //state.setProperty(MigrationStateKeys.BASE_URI, AprosBuiltins.URIs.Migration); + state.setProperty(MigrationStateKeys.UPDATE_DEPENDENCIES, false); + state.setProperty(MigrationStateKeys.CURRENT_TGS, tgSource); + state.setProperty(MigrationStateKeys.SESSION, session); + state.setProperty(MigrationStateKeys.PROGRESS_MONITOR, monitor); + state.setProperty(MigrationStateKeys.CURRENT_DATA_CONTAINER, new DataContainer("sharedLibrary", 1, new Variant(TransferableGraph1.BINDING, tg))); + + return MigrationUtils.importMigrated(monitor, session, null, state, advisor, null); + + } catch (TransferableGraphException e) { + throw new DatabaseException(e); + } catch (MissingDependencyException e) { + throw e; + } catch (DatabaseException e) { + throw e; + } catch (Exception e) { + throw new DatabaseException(e); + } finally { + session.getService(XSupport.class).setServiceMode(false, false); + } + + } + + return null; + + } + +} diff --git a/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/sharedontology/wizard/SharedOntologyImportWizard.java b/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/sharedontology/wizard/SharedOntologyImportWizard.java index a0ca44f64..95beaad38 100644 --- a/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/sharedontology/wizard/SharedOntologyImportWizard.java +++ b/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/sharedontology/wizard/SharedOntologyImportWizard.java @@ -1,213 +1,197 @@ -/******************************************************************************* - * Copyright (c) 2012 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 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * VTT Technical Research Centre of Finland - initial API and implementation - *******************************************************************************/ -package org.simantics.modeling.ui.sharedontology.wizard; - -import java.io.File; -import java.io.IOException; -import java.lang.reflect.InvocationTargetException; -import java.util.Deque; -import java.util.HashMap; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.preferences.InstanceScope; -import org.eclipse.jface.operation.IRunnableWithProgress; -import org.eclipse.jface.preference.IPersistentPreferenceStore; -import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.wizard.Wizard; -import org.eclipse.jface.wizard.WizardPage; -import org.eclipse.ui.IImportWizard; -import org.eclipse.ui.IWorkbench; -import org.eclipse.ui.preferences.ScopedPreferenceStore; -import org.simantics.Simantics; -import org.simantics.databoard.binding.Binding; -import org.simantics.databoard.binding.mutable.Variant; -import org.simantics.databoard.container.DataContainer; -import org.simantics.databoard.container.DataContainers; -import org.simantics.databoard.container.DataFormatException; -import org.simantics.databoard.container.FormatHandler; -import org.simantics.databoard.serialization.SerializationException; -import org.simantics.db.Resource; -import org.simantics.db.Session; -import org.simantics.db.exception.DatabaseException; -import org.simantics.db.layer0.migration.MigrationUtils; -import org.simantics.db.layer0.util.DraftStatusBean; -import org.simantics.db.management.ISessionContext; -import org.simantics.graph.db.MissingDependencyException; -import org.simantics.graph.representation.TransferableGraph1; -import org.simantics.modeling.ui.Activator; -import org.simantics.modeling.ui.utils.NoProjectPage; -import org.simantics.project.IProject; -import org.simantics.project.ProjectKeys; -import org.simantics.ui.SimanticsUI; -import org.simantics.ui.utils.ResourceAdaptionUtils; -import org.simantics.utils.ui.ErrorLogger; -import org.simantics.utils.ui.ExceptionUtils; - -/** - * @author Tuukka Lehtonen - */ -public class SharedOntologyImportWizard extends Wizard implements IImportWizard { - - private static final int MAX_RECENT_IMPORT_PATHS = 10; - - ImportPlan importModel; - - private boolean readPreferences(IStructuredSelection selection) { - IPreferenceStore store = new ScopedPreferenceStore(InstanceScope.INSTANCE, Activator.PLUGIN_ID); - - String recentPathsPref = store.getString(Preferences.RECENT_SHARED_LIBRARY_IMPORT_LOCATIONS); - Deque recentImportPaths = Preferences.decodePaths(recentPathsPref); - - ISessionContext ctx = SimanticsUI.getSessionContext(); - if (ctx == null) - return false; - IProject project = ctx.getHint(ProjectKeys.KEY_PROJECT); - if (project == null) - return false; - - importModel = new ImportPlan(ctx, recentImportPaths); - importModel.project = project; - importModel.selection = selection.getFirstElement(); - - return true; - } - - private void writePreferences() throws IOException { - IPersistentPreferenceStore store = new ScopedPreferenceStore(InstanceScope.INSTANCE, Activator.PLUGIN_ID); - - store.putValue(Preferences.RECENT_SHARED_LIBRARY_IMPORT_LOCATIONS, Preferences.encodePaths(importModel.recentLocations)); - - if (store.needsSaving()) - store.save(); - } - - public SharedOntologyImportWizard() { - setWindowTitle("Import Shared Library"); - setNeedsProgressMonitor(true); - } - - @Override - public void init(IWorkbench workbench, IStructuredSelection selection) { - readPreferences(selection); - } - - @Override - public void addPages() { - super.addPages(); - if (importModel != null) { - addPage(new SharedOntologyImportPage(importModel)); - } else { - addPage(new NoProjectPage("Import Shared Library")); - } - } - - @Override - public boolean performFinish() { - try { - importModel.recentLocations.addFirst(importModel.importLocation.getAbsolutePath()); - Preferences.removeDuplicates(importModel.recentLocations); - if (importModel.recentLocations.size() > MAX_RECENT_IMPORT_PATHS) - importModel.recentLocations.pollLast(); - - writePreferences(); - } catch (IOException e) { - ErrorLogger.defaultLogError("Failed to write preferences", e); - } - - try { - getContainer().run(true, true, new IRunnableWithProgress() { - @Override - public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { - try { - Resource target = ResourceAdaptionUtils.toSingleResource(importModel.selection); - importModel.sessionContext.getSession().markUndoPoint(); - doImport(monitor, importModel.importLocation, importModel.sessionContext.getSession(), target); - } catch (Exception e) { - throw new InvocationTargetException(e); - } - } - }); - } catch (InvocationTargetException e) { - Throwable t = e.getTargetException(); - WizardPage cp = (WizardPage) getContainer().getCurrentPage(); - if (t instanceof IOException) { - cp.setErrorMessage("An I/O problem occurred while importing shared library.\n\nMessage: " + e.getMessage()); - } - ErrorLogger.defaultLogError(t); - return false; - } catch (InterruptedException e) { - ExceptionUtils.logAndShowError(e); - return false; - } - - return true; - } - - public static void doImport(final IProgressMonitor monitor, File modelFile, final Session session, final Resource target) - throws IOException, SerializationException, DatabaseException { - - try { - - monitor.beginTask("Loading shared library from disk", 1000); - try { - FormatHandler handler1 = new FormatHandler() { - @Override - public Binding getBinding() { - return TransferableGraph1.BINDING; - } - - @Override - public Object process(DataContainer container) throws Exception { - monitor.worked(100); - monitor.setTaskName("Importing shared library into database"); - Variant draftStatus = container.metadata.get(DraftStatusBean.EXTENSION_KEY); - TransferableGraph1 tg = (TransferableGraph1)container.content.getValue(); - MigrationUtils.importSharedOntology(session, tg, draftStatus == null); - monitor.worked(850); - return null; - } - - }; - - HashMap> handlers = new HashMap>(); - handlers.put(Constants.SHARED_LIBRARY_FORMAT_V1, handler1); - - try { - DataContainers.readFile(modelFile, handlers); - } catch(DataFormatException e) { - throw new IOException(e); - } catch(IOException e) { - throw e; - } catch (MissingDependencyException e) { - ExceptionUtils.logAndShowError(e.getShortExplanation(), e.getMessage() + "\n\n", e); - ErrorLogger.defaultLogError("Shared Library import failed, see exception for details", e); - } catch(Exception e) { - if(e instanceof RuntimeException) - throw (RuntimeException)e; - else - throw new RuntimeException(e); - } - } catch(IOException e) { - } - - monitor.setTaskName("Postprocessing"); - monitor.worked(50); - - } catch (Throwable t) { - t.printStackTrace(); - } finally { - monitor.done(); - } - } - -} +/******************************************************************************* + * Copyright (c) 2012 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 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ +package org.simantics.modeling.ui.sharedontology.wizard; + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.Deque; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.SubMonitor; +import org.eclipse.core.runtime.preferences.InstanceScope; +import org.eclipse.jface.operation.IRunnableWithProgress; +import org.eclipse.jface.preference.IPersistentPreferenceStore; +import org.eclipse.jface.preference.IPreferenceStore; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.wizard.Wizard; +import org.eclipse.jface.wizard.WizardPage; +import org.eclipse.ui.IImportWizard; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.preferences.ScopedPreferenceStore; +import org.simantics.databoard.binding.Binding; +import org.simantics.databoard.binding.mutable.Variant; +import org.simantics.databoard.container.DataContainer; +import org.simantics.databoard.container.DataContainers; +import org.simantics.databoard.container.FormatHandler; +import org.simantics.db.Resource; +import org.simantics.db.Session; +import org.simantics.db.layer0.migration.MigrationUtils; +import org.simantics.db.layer0.util.DraftStatusBean; +import org.simantics.db.management.ISessionContext; +import org.simantics.graph.db.MissingDependencyException; +import org.simantics.graph.representation.TransferableGraph1; +import org.simantics.modeling.ui.Activator; +import org.simantics.modeling.ui.utils.NoProjectPage; +import org.simantics.project.IProject; +import org.simantics.project.ProjectKeys; +import org.simantics.ui.SimanticsUI; +import org.simantics.ui.utils.ResourceAdaptionUtils; +import org.simantics.utils.ui.ErrorLogger; +import org.simantics.utils.ui.ExceptionUtils; + +/** + * @author Tuukka Lehtonen + */ +public class SharedOntologyImportWizard extends Wizard implements IImportWizard { + + private static final int MAX_RECENT_IMPORT_PATHS = 10; + + ImportPlan importModel; + + private boolean readPreferences(IStructuredSelection selection) { + IPreferenceStore store = new ScopedPreferenceStore(InstanceScope.INSTANCE, Activator.PLUGIN_ID); + + String recentPathsPref = store.getString(Preferences.RECENT_SHARED_LIBRARY_IMPORT_LOCATIONS); + Deque recentImportPaths = Preferences.decodePaths(recentPathsPref); + + ISessionContext ctx = SimanticsUI.getSessionContext(); + if (ctx == null) + return false; + IProject project = ctx.getHint(ProjectKeys.KEY_PROJECT); + if (project == null) + return false; + + importModel = new ImportPlan(ctx, recentImportPaths); + importModel.project = project; + importModel.selection = selection.getFirstElement(); + + return true; + } + + private void writePreferences() throws IOException { + IPersistentPreferenceStore store = new ScopedPreferenceStore(InstanceScope.INSTANCE, Activator.PLUGIN_ID); + + store.putValue(Preferences.RECENT_SHARED_LIBRARY_IMPORT_LOCATIONS, Preferences.encodePaths(importModel.recentLocations)); + + if (store.needsSaving()) + store.save(); + } + + public SharedOntologyImportWizard() { + setWindowTitle("Import Shared Library"); + setNeedsProgressMonitor(true); + } + + @Override + public void init(IWorkbench workbench, IStructuredSelection selection) { + readPreferences(selection); + } + + @Override + public void addPages() { + super.addPages(); + if (importModel != null) { + addPage(new SharedOntologyImportPage(importModel)); + } else { + addPage(new NoProjectPage("Import Shared Library")); + } + } + + @Override + public boolean performFinish() { + try { + importModel.recentLocations.addFirst(importModel.importLocation.getAbsolutePath()); + Preferences.removeDuplicates(importModel.recentLocations); + if (importModel.recentLocations.size() > MAX_RECENT_IMPORT_PATHS) + importModel.recentLocations.pollLast(); + + writePreferences(); + } catch (IOException e) { + ErrorLogger.defaultLogError("Failed to write preferences", e); + } + + try { + getContainer().run(true, true, new IRunnableWithProgress() { + @Override + public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { + try { + Resource target = ResourceAdaptionUtils.toSingleResource(importModel.selection); + importModel.sessionContext.getSession().markUndoPoint(); + doImport(monitor, importModel.importLocation, importModel.sessionContext.getSession(), target); + } catch (Exception e) { + throw new InvocationTargetException(e); + } finally { + monitor.done(); + } + } + }); + } catch (InvocationTargetException e) { + Throwable cause = e.getCause(); + WizardPage cp = (WizardPage) getContainer().getCurrentPage(); + if (cause instanceof MissingDependencyException) { + cp.setErrorMessage("Failed to import shared library due to missing dependencies.\n" + cause.getMessage()); + ErrorLogger.defaultLogError("Shared Library " + importModel.importLocation + " import failed due to missing database dependencies. See exception for details.", cause); + ExceptionUtils.showError("Failed to import shared library due to missing dependencies.\n\n" + cause.getMessage(), null); + } else { + cp.setErrorMessage("Unexpected problem importing shared library.\nMessage: " + cause.getMessage()); + ErrorLogger.defaultLogError("Shared Library " + importModel.importLocation + " import failed unexpectedly. See exception for details.", cause); + ExceptionUtils.showError("Unexpected problem importing shared library.\n\n" + cause.getMessage(), cause); + } + return false; + } catch (InterruptedException e) { + WizardPage cp = (WizardPage) getContainer().getCurrentPage(); + cp.setErrorMessage("Import interrupted.\nMessage: " + e.getMessage()); + ErrorLogger.defaultLogError("Shared Library " + importModel.importLocation + " import interrupted.", e); + ExceptionUtils.showError("Shared library import was interrupted.", e); + return false; + } + + return true; + } + + public static void doImport(IProgressMonitor monitor, File modelFile, Session session, Resource target) + throws Exception + { + SubMonitor mon = SubMonitor.convert(monitor); + mon.beginTask("Loading shared library from disk", 1000); + + FormatHandler handler1 = new FormatHandler() { + @Override + public Binding getBinding() { + return TransferableGraph1.BINDING; + } + + @Override + public Object process(DataContainer container) throws Exception { + mon.worked(100); + mon.setTaskName("Importing shared library into database"); + Variant draftStatus = container.metadata.get(DraftStatusBean.EXTENSION_KEY); + TransferableGraph1 tg = (TransferableGraph1) container.content.getValue(); + MigrationUtils.importSharedOntology(mon.newChild(850, SubMonitor.SUPPRESS_NONE), session, tg, draftStatus == null); + return null; + } + }; + + Map> handlers = new HashMap<>(); + handlers.put(Constants.SHARED_LIBRARY_FORMAT_V1, handler1); + + DataContainers.readFile(modelFile, handlers); + + mon.setTaskName("Postprocessing"); + mon.subTask(""); + mon.newChild(50).done(); + } + +} -- 2.43.2