From b2b5ea5074786e5f0944e0fde466df33a9aede42 Mon Sep 17 00:00:00 2001 From: lempinen Date: Mon, 26 Nov 2012 12:11:17 +0000 Subject: [PATCH] Version migration support to sysdyn. Changes paths in .tg files to enable importing to a newer database. (fixes #3037) git-svn-id: https://www.simantics.org/svn/simantics/sysdyn/trunk@26446 ac1ea38d-2e2b-0410-8846-a27921b304fc --- org.simantics.sysdyn.ontology/graph.tg | Bin 70629 -> 81100 bytes .../graph/Migration.pgraph | 100 ++++ .../graph/Sysdyn.pgraph | 3 - .../org/simantics/sysdyn/SysdynResource.java | 24 +- .../ui/actions/SysdynVariableRemover.java | 22 +- .../handlers/imports/ImportModelHandler.java | 525 ++++++++++-------- .../newComponents/NewModelHandler.java | 5 +- 7 files changed, 412 insertions(+), 267 deletions(-) create mode 100644 org.simantics.sysdyn.ontology/graph/Migration.pgraph diff --git a/org.simantics.sysdyn.ontology/graph.tg b/org.simantics.sysdyn.ontology/graph.tg index 94ba196f587199812ae146e85c8e41ed5af25ddd..2299b42f6efc4bb2fef7d935010a59965c78321c 100644 GIT binary patch literal 81100 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 F`ak3dirWAH diff --git a/org.simantics.sysdyn.ontology/graph/Migration.pgraph b/org.simantics.sysdyn.ontology/graph/Migration.pgraph new file mode 100644 index 00000000..a1d6d1ff --- /dev/null +++ b/org.simantics.sysdyn.ontology/graph/Migration.pgraph @@ -0,0 +1,100 @@ +L0 = +SYSDYN = + +move : L0.Template + @template %subject %base %from %to + %subject : L0.NamespaceMigrationStep.Prefix + L0.NamespaceMigrationStep.Prefix.base %base + L0.NamespaceMigrationStep.Prefix.from %from + L0.NamespaceMigrationStep.Prefix.to %to + +MIGRATION = SYSDYN."from1.6to1.7" : L0.MigrationSequence + @L0.list + MIGRATION.Ontologies + MIGRATION.Spreadsheets + MIGRATION.SysdynChanges + +MIGRATION.Ontologies : L0.NamespaceMigrationStep + @L0.list + _ + @move "http://www.simantics.org/Layer0-" "1.0" "1.1" + _ + @move "http://www.simantics.org/Layer0X-" "1.0" "1.1" + _ + @move"http://www.simantics.org/G2D-" "1.0" "1.1" + _ + @move"http://www.simantics.org/Structural-" "1.0" "1.2" + _ + @move"http://www.simantics.org/Structural-" "1.1" "1.2" + _ + @move"http://www.simantics.org/Diagram-" "2.1" "2.2" + _ + @move"http://www.simantics.org/Simulation-" "1.0" "1.1" + _ + @move"http://www.simantics.org/Diagram-" "1.0" "1.1" + _ + @move"http://www.simantics.org/Modeling-" "1.1" "1.2" + _ + @move"http://www.simantics.org/Project-" "1.1" "1.2" + _ + @move"http://www.simantics.org/Spreadsheet-" "1.1" "1.2" + _ + @move"http://www.simantics.org/Viewpoint-" "1.1" "1.2" + _ + @move"http://www.simantics.org/Image2-" "1.1" "1.2" + _ + @move"http://www.simantics.org/Color-" "1.0" "1.1" + _ + @move"http://www.simantics.org/Action-" "1.0" "1.1" + _ + @move"http://www.simantics.org/Silk-" "1.0" "1.1" + _ + @move"http://www.simantics.org/Issue-" "1.1" "1.2" + _ + @move"http://www.simantics.org/User-" "1.0" "1.1" + _ + @move"http://www.simantics.org/Documentation-" "1.0" "1.1" + _ + @move"http://www.simantics.org/Document-" "1.1" "1.2" + _ + @move"http://www.simantics.org/SelectionView-" "1.1" "1.2" + +MIGRATION.Spreadsheets : L0.NamespaceMigrationStep + @L0.list + _ + @move "http://www.simantics.org/Spreadsheet-1.2/" "HasContent" "Cell/content" + _ + @move "http://www.simantics.org/Spreadsheet-1.2/" "FitRows" "Dimensions/fitRows" + _ + @move "http://www.simantics.org/Spreadsheet-1.2/" "FitColumns" "Dimensions/fitColumns" + _ + @move "http://www.simantics.org/Spreadsheet-1.2/" "ColumnCount" "Dimensions/columnCount" + _ + @move "http://www.simantics.org/Spreadsheet-1.2/" "ColumnLabels" "Headers/columnLabels" + _ + @move "http://www.simantics.org/Spreadsheet-1.2/" "RowCount" "Dimensions/rowCount" + _ + @move "http://www.simantics.org/Spreadsheet-1.2/" "ColumnWidths" "Headers/columnWidths" + _ + @move "http://www.simantics.org/Spreadsheet-1.2/" "ContentOf" "Cell/content/Inverse" + _ + @move "http://www.simantics.org/Spreadsheet-1.2/" "FitRowsOf" "Dimensions/fitRows/Inverse" + _ + @move "http://www.simantics.org/Spreadsheet-1.2/" "FitColumnsOf" "Dimensions/fitColumns/Inverse" + _ + @move "http://www.simantics.org/Spreadsheet-1.2/" "ColumnCountOf" "Dimensions/columnCount/Inverse" + _ + @move "http://www.simantics.org/Spreadsheet-1.2/" "ColumnLabelsOf" "Headers/columnLabels/Inverse" + _ + @move "http://www.simantics.org/Spreadsheet-1.2/" "RowCountOf" "Dimensions/rowCount/Inverse" + _ + @move "http://www.simantics.org/Spreadsheet-1.2/" "ColumnWidthsOf" "Headers/columnWidths/Inverse" + +MIGRATION.SysdynChanges : L0.NamespaceMigrationStep + @L0.list + _ + @move "http://www.simantics.org/Sysdyn-1.1/" "HasTail" "Variable/HasTail" + _ + @move "http://www.simantics.org/Sysdyn-1.1/" "HasHead" "Variable/HasHead" + _ + @move "http://www.simantics.org/Sysdyn-1.1/" "SharedModuleOntolofgy" "SharedModuleOntology" diff --git a/org.simantics.sysdyn.ontology/graph/Sysdyn.pgraph b/org.simantics.sysdyn.ontology/graph/Sysdyn.pgraph index 4c743105..9790d620 100644 --- a/org.simantics.sysdyn.ontology/graph/Sysdyn.pgraph +++ b/org.simantics.sysdyn.ontology/graph/Sysdyn.pgraph @@ -208,9 +208,6 @@ SYSDYN.SysdynModuleLibrary -- SYSDYN.Dependency.angle --> L0.Double -- SYSDYN.Dependency.refersTo --> SYSDYN.Variable > handlers = new HashMap>(); - handlers.put("sysdynModel:1", new FormatHandler() { - @Override - public Binding getBinding() { - return TransferableGraph1.BINDING; - } - - @Override - public Object process(DataContainer container) throws DataFormatException { - DefaultPasteImportAdvisor ia = new DefaultPasteImportAdvisor(project); - try { - DefaultPasteHandler.defaultExecute((TransferableGraph1)container.content.getValue(), project, ia); - return ia.getRoot(); - - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - }); - - Object result = null; - try { - File file = new File(selected); - if(!file.isFile()) { - displayErrorMessage(shell, "File " + selected + " not found"); - return null; - } else { - result = DataContainers.readFile(file, handlers); - } - } catch(DataFormatException e) { - e.printStackTrace(); - } catch(IOException e) { - e.printStackTrace(); - } catch(Exception e) { - if(e instanceof RuntimeException) - throw (RuntimeException)e; - else - throw new RuntimeException(e); - } - - if(result == null || !(result instanceof Resource)) { - displayErrorMessage(shell, "Model could not be imported."); - } else { - try { - final Resource ModelRoot = (Resource) result; - SimanticsUI.getSession().syncRequest(new WriteRequest() { - - @Override - public void perform(WriteGraph graph) throws DatabaseException { - if(!graph.isInstanceOf(ModelRoot, SysdynResource.getInstance(graph).SysdynModel)) { - // Imported model was not a SysdynModel, display error message. - Resource instanceOf = graph.getPossibleObject(ModelRoot, Layer0.getInstance(graph).InstanceOf); - String type = "..."; - if(instanceOf != null) - type = NameUtils.getSafeName(graph, instanceOf); - else { - Resource inheritedFrom = graph.getPossibleObject(ModelRoot, Layer0.getInstance(graph).Inherits); - if(inheritedFrom != null) - type = NameUtils.getSafeName(graph, inheritedFrom); - } - final String ft = type; - graph.deny(ModelRoot, Layer0.getInstance(graph).PartOf); - - shell.getDisplay().asyncExec(new Runnable() { - - @Override - public void run() { - displayErrorMessage(shell, "The imported file is not of type: System Dynamics Model (" + ft +")"); - } - }); - - } else { - fixHasTailAndHasHead(graph, ModelRoot); - addDependencies(graph, ModelRoot); - removeIssueSourcesFromModules(graph, ModelRoot); - addEnumerationIssueSource(graph, ModelRoot); - - activateModel(graph, ModelRoot); - } - } - - }); - - - Collection confs = SimanticsUI.getSession().syncRequest(new Read>() { + public static String IMPORTMODELTPATH = "IMPORT_MODEL_PATH"; + + @Override + public Object execute(ExecutionEvent event) throws ExecutionException { + + // Get imported transferable graph file using FileDialog + final Shell shell = HandlerUtil.getActiveShellChecked(event); + FileDialog fd = new FileDialog(shell, SWT.OPEN); + fd.setText("Import Model"); + + String path = Activator.getDefault().getPreferenceStore().getString(IMPORTMODELTPATH); + if(path.isEmpty() || !(new File(path).exists())) + path = Platform.getLocation().toOSString(); + fd.setFilterPath(path); + String[] filterExt = {"*.tg"}; + fd.setFilterExtensions(filterExt); + final String selected = fd.open(); + if(selected == null) return null; + + Job job = new DatabaseJob("Import model") { + + @Override + protected IStatus run(IProgressMonitor monitor) { + IStatus status = importFile(selected, shell, monitor); + return status; + } + }; + job.setUser(true); + job.schedule(); + + return null; + + } + + private IStatus importFile(String path, final Shell shell, final IProgressMonitor monitor) { + final Resource project = SimanticsUI.getProject().get(); + if(project == null) return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Import model: project not found", null); + + monitor.beginTask("Import model", 7); + + Activator.getDefault().getPreferenceStore().setValue(IMPORTMODELTPATH, (new File(path)).getParent()); + + + + HashMap> handlers = new HashMap>(); + handlers.put("sysdynModel:1", new FormatHandler() { + @Override + public Binding getBinding() { + return TransferableGraph1.BINDING; + } + + @Override + public Object process(DataContainer container) throws DataFormatException { + DefaultPasteImportAdvisor ia = new DefaultPasteImportAdvisor(project); + + try { + monitor.subTask("Migrate"); + Session session = Simantics.getSession(); + TransferableGraph1 tg = (TransferableGraph1)container.content.getValue(); + + MigrationStep step = MigrationUtils.getStep(session, SysdynResource.URIs.from1$6to1$7); + MigrationState state = MigrationUtils.newState(); + state.setProperty(MigrationStateKeys.CURRENT_TG, tg); + step.applyTo(session, state); + tg = state.getProperty(MigrationStateKeys.CURRENT_TG); + + monitor.worked(1); + monitor.subTask("Import"); + DefaultPasteHandler.defaultExecute(tg, project, ia); + monitor.worked(1); + return ia.getRoot(); + + } catch (DatabaseException e) { + e.printStackTrace(); + return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Import model failed", e); + } catch (Exception e) { + e.printStackTrace(); + return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Import model failed", e); + } + } + }); + + Object result = null; + try { + File file = new File(path); + if(!file.isFile()) { +// displayErrorMessage(shell, "File " + path + " not found"); + return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Import model failed: File " + path + " not found", null); + } else { + result = DataContainers.readFile(file, handlers); + } + } catch(DataFormatException e) { + e.printStackTrace(); + return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Import model failed: Model could not be imported.", e); + } catch(IOException e) { + e.printStackTrace(); + return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Import model failed: Model could not be imported.", e); + } catch(Exception e) { + if(e instanceof RuntimeException) { + return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Import model failed: Model could not be imported.", e); +// throw (RuntimeException)e; + } else { + return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Import model failed: Model could not be imported.", e); +// throw new RuntimeException(e); + } + } + + if(result == null || !(result instanceof Resource)) { +// displayErrorMessage(shell, "Model could not be imported."); + return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Import model failed: Model could not be imported.", null); + } else { + try { + final Resource ModelRoot = (Resource) result; + IStatus status = SimanticsUI.getSession().syncRequest(new WriteResultRequest() { + + @Override + public IStatus perform(WriteGraph graph) throws DatabaseException { + if(!graph.isInstanceOf(ModelRoot, SysdynResource.getInstance(graph).SysdynModel)) { + // Imported model was not a SysdynModel, display error message. + Resource instanceOf = graph.getPossibleObject(ModelRoot, Layer0.getInstance(graph).InstanceOf); + String type = "..."; + if(instanceOf != null) + type = NameUtils.getSafeName(graph, instanceOf); + else { + Resource inheritedFrom = graph.getPossibleObject(ModelRoot, Layer0.getInstance(graph).Inherits); + if(inheritedFrom != null) + type = NameUtils.getSafeName(graph, inheritedFrom); + } + final String ft = type; + graph.deny(ModelRoot, Layer0.getInstance(graph).PartOf); + +// shell.getDisplay().asyncExec(new Runnable() { +// +// @Override +// public void run() { +// displayErrorMessage(shell, "The imported file is not of type: System Dynamics Model (" + ft +")"); + return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "The imported file is not of type: System Dynamics Model (" + ft +")", null); +// } +// }); + + } else { + monitor.subTask("Add required dependencies"); + addDependencies(graph, ModelRoot); + monitor.worked(1); + monitor.subTask("Remove unnecessary issue sources"); + removeIssueSourcesFromModules(graph, ModelRoot); + monitor.worked(1); + monitor.subTask("Add enumeration issue source"); + addEnumerationIssueSource(graph, ModelRoot); + monitor.worked(1); + monitor.subTask("Activate model"); + activateModel(graph, ModelRoot); + monitor.worked(1); + } + return null; + + } + + }); + + if(status != null) + return status; + + monitor.subTask("Validate model"); + Collection confs = SimanticsUI.getSession().syncRequest(new Read>() { @Override public Collection perform(ReadGraph graph) throws DatabaseException { return findAllConfigurations(graph, ModelRoot); } - }); - - - // Batch validate all issue sources after import - try { - for(Resource conf : confs) { - /* - * This section is copied from BatchValidations.runAll. runAll did - * not find module types to validate. - */ -// BatchValidations.runAll(null, mod); - - final Session session = Simantics.getSession(); - final Collection validations = session.sync( new AllBatchIssueSources(ModelRoot) ); - SubMonitor progress = SubMonitor.convert(null, "Validate Model", 100); - Collection contexts = Collections.singletonList(conf); - for(BatchIssueSource bis : validations) { - Map> is = BatchValidations.validate(progress.newChild(90, SubMonitor.SUPPRESS_NONE), bis, contexts); - BatchValidations.store(progress.newChild(10, SubMonitor.SUPPRESS_NONE), bis.getResource(), is); - } - } - } catch(Throwable t) { - t.printStackTrace(); - } - - - - } catch (DatabaseException e) { - e.printStackTrace(); - } - } - - return null; - - } - - protected void removeIssueSourcesFromModules(WriteGraph graph, Resource modelRoot) throws DatabaseException { + }); + + + // Batch validate all issue sources after import + try { + for(Resource conf : confs) { + /* + * This section is copied from BatchValidations.runAll. runAll did + * not find module types to validate. + */ +// BatchValidations.runAll(null, mod); + + final Session session = Simantics.getSession(); + final Collection validations = session.sync( new AllBatchIssueSources(ModelRoot) ); + SubMonitor progress = SubMonitor.convert(monitor, "Validate Model", 100); + Collection contexts = Collections.singletonList(conf); + for(BatchIssueSource bis : validations) { + Map> is = BatchValidations.validate(progress.newChild(90, SubMonitor.SUPPRESS_NONE), bis, contexts); + BatchValidations.store(progress.newChild(10, SubMonitor.SUPPRESS_NONE), bis.getResource(), is); + } + } + } catch(Throwable t) { + return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Import model failed: Model could not be imported.", t); + } + + monitor.worked(1); + + } catch (DatabaseException e) { + e.printStackTrace(); + return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Import model failed: Model could not be imported.", e); + } + + return Status.OK_STATUS; + } + } + + protected void removeIssueSourcesFromModules(WriteGraph graph, Resource modelRoot) throws DatabaseException { Layer0 L0 = Layer0.getInstance(graph); IssueResource ISSUE = IssueResource.getInstance(graph); - + for(Resource m : findAllModelsAndModules(graph, modelRoot)) { if(m.equals(modelRoot)) continue; - + // Module may contain issue sources due to legacy reasons. Remove these. for(Resource issueSource : graph.syncRequest(new ObjectsWithType(m, L0.ConsistsOf, ISSUE.IssueSource))) { // Issues are created to virtual graphs, so they should not need to be removed. Just in case they are created, remove them first for(Resource issue : graph.getObjects(issueSource, ISSUE.IssueSource_Manages)) { RemoverUtil.remove(graph, issue); } - + // finally remove the issue source RemoverUtil.remove(graph, issueSource); } } - + } protected void activateModel(WriteGraph graph, Resource modelRoot) throws DatabaseException { @@ -259,31 +320,37 @@ public class ImportModelHandler extends AbstractHandler { } protected void addDependencies(WriteGraph graph, Resource modelRoot) throws DatabaseException { - Layer0 L0 = Layer0.getInstance(graph); - - ArrayList links = new ArrayList(); - for(Resource link : graph.getObjects(modelRoot, L0.IsLinkedTo)) - links.add(graph.getURI(link)); - - - if(!links.contains("http://www.simantics.org/Documentation-1.0")) { - Resource documentation = graph.getPossibleResource("http://www.simantics.org/Documentation-1.0"); - if(documentation != null) - graph.claim(modelRoot, L0.IsLinkedTo, documentation); - } - - if(!links.contains("http://www.simantics.org/SelectionView-1.1")) { - Resource selectionView = graph.getPossibleResource("http://www.simantics.org/SelectionView-1.1"); - if(selectionView != null) - graph.claim(modelRoot, L0.IsLinkedTo, selectionView); - } - } - - protected void addEnumerationIssueSource(WriteGraph graph, Resource modelRoot) throws DatabaseException { - Layer0 L0 = Layer0.getInstance(graph); - Layer0X L0X = Layer0X.getInstance(graph); - SysdynResource sr = SysdynResource.getInstance(graph); - Collection enumerationIssueSources = graph.syncRequest(new ObjectsWithType(modelRoot, L0.ConsistsOf, sr.Validations_Enumerations_EnumerationIssueSource)); + Layer0 L0 = Layer0.getInstance(graph); + + ArrayList links = new ArrayList(); + for(Resource link : graph.getObjects(modelRoot, L0.IsLinkedTo)) + links.add(graph.getURI(link)); + + + if(!links.contains("http://www.simantics.org/Documentation-1.1")) { + Resource documentation = graph.getPossibleResource("http://www.simantics.org/Documentation-1.1"); + if(documentation != null) + graph.claim(modelRoot, L0.IsLinkedTo, documentation); + } + + if(!links.contains("http://www.simantics.org/SelectionView-1.2")) { + Resource selectionView = graph.getPossibleResource("http://www.simantics.org/SelectionView-1.2"); + if(selectionView != null) + graph.claim(modelRoot, L0.IsLinkedTo, selectionView); + } + + if(!links.contains("http://www.simantics.org/DocumentWorkbench-1.0")) { + Resource documentWb = graph.getPossibleResource("http://www.simantics.org/DocumentWorkbench-1.0"); + if(documentWb != null) + graph.claim(modelRoot, L0.IsLinkedTo, documentWb); + } + } + + protected void addEnumerationIssueSource(WriteGraph graph, Resource modelRoot) throws DatabaseException { + Layer0 L0 = Layer0.getInstance(graph); + Layer0X L0X = Layer0X.getInstance(graph); + SysdynResource sr = SysdynResource.getInstance(graph); + Collection enumerationIssueSources = graph.syncRequest(new ObjectsWithType(modelRoot, L0.ConsistsOf, sr.Validations_Enumerations_EnumerationIssueSource)); if(enumerationIssueSources.isEmpty()) { GraphUtils.create2(graph, sr.Validations_Enumerations_EnumerationIssueSource, @@ -292,64 +359,42 @@ public class ImportModelHandler extends AbstractHandler { ); } } - protected void fixHasTailAndHasHead(WriteGraph graph, Resource modelRoot) throws DatabaseException { - Layer0 L0 = Layer0.getInstance(graph); - SysdynResource sr = SysdynResource.getInstance(graph); - for(Resource configuration : findAllConfigurations(graph, modelRoot)) { - Collection connections = graph.syncRequest(new ObjectsWithType(configuration, L0.ConsistsOf, sr.Dependency)); - connections.addAll(graph.syncRequest(new ObjectsWithType(configuration, L0.ConsistsOf, sr.Flow))); - - for(Resource connection : connections) { - Resource head = graph.getPossibleObject(connection, sr.HasHead); - Resource tail = graph.getPossibleObject(connection, sr.HasTail); - - if(head != null && tail != null) { - graph.deny(connection, sr.HasHead, head); - graph.deny(connection, sr.HasTail, tail); - - graph.claim(connection, sr.Variable_HasHead, head); - graph.claim(connection, sr.Variable_HasTail, tail); - } - } - } - } - - private Collection findAllConfigurations(ReadGraph graph, Resource modelRoot) throws DatabaseException { - SysdynResource sr = SysdynResource.getInstance(graph); - StructuralResource2 SR2 = StructuralResource2.getInstance(graph); - Collection modulesAndModels = findAllModelsAndModules(graph, modelRoot); - Collection configurations = new ArrayList(); - - for(Resource r : modulesAndModels) { - if(graph.isInheritedFrom(r, sr.Module)) { - configurations.add(graph.getPossibleObject(r, SR2.IsDefinedBy)); - } else if(graph.isInstanceOf(r, sr.SysdynModel)) { - configurations.add(graph.getPossibleObject(modelRoot, SimulationResource.getInstance(graph).HasConfiguration)); - } - } - - return configurations; - } - - private Collection findAllModelsAndModules(ReadGraph graph, Resource modelRoot) throws DatabaseException { - Layer0 L0 = Layer0.getInstance(graph); - SysdynResource sr = SysdynResource.getInstance(graph); - Collection modelsAndModules = new ArrayList(); - modelsAndModules.add(modelRoot); - - for(Resource r : graph.getObjects(modelRoot, L0.ConsistsOf)) { - if(graph.isInheritedFrom(r, sr.Module)) { - modelsAndModules.add(r); - } - } - - return modelsAndModules; - } - - private void displayErrorMessage(Shell shell, String message) { - MessageBox mb = new MessageBox(shell, SWT.OK | SWT.ERROR); - mb.setText("Error"); - mb.setMessage("The imported file is not of type: Model"); - mb.open(); - } + private Collection findAllConfigurations(ReadGraph graph, Resource modelRoot) throws DatabaseException { + SysdynResource sr = SysdynResource.getInstance(graph); + StructuralResource2 SR2 = StructuralResource2.getInstance(graph); + Collection modulesAndModels = findAllModelsAndModules(graph, modelRoot); + Collection configurations = new ArrayList(); + + for(Resource r : modulesAndModels) { + if(graph.isInheritedFrom(r, sr.Module)) { + configurations.add(graph.getPossibleObject(r, SR2.IsDefinedBy)); + } else if(graph.isInstanceOf(r, sr.SysdynModel)) { + configurations.add(graph.getPossibleObject(modelRoot, SimulationResource.getInstance(graph).HasConfiguration)); + } + } + + return configurations; + } + + private Collection findAllModelsAndModules(ReadGraph graph, Resource modelRoot) throws DatabaseException { + Layer0 L0 = Layer0.getInstance(graph); + SysdynResource sr = SysdynResource.getInstance(graph); + Collection modelsAndModules = new ArrayList(); + modelsAndModules.add(modelRoot); + + for(Resource r : graph.getObjects(modelRoot, L0.ConsistsOf)) { + if(graph.isInheritedFrom(r, sr.Module)) { + modelsAndModules.add(r); + } + } + + return modelsAndModules; + } + +// private void displayErrorMessage(Shell shell, String message) { +// MessageBox mb = new MessageBox(shell, SWT.OK | SWT.ERROR); +// mb.setText("Error"); +// mb.setMessage("The imported file is not of type: Model"); +// mb.open(); +// } } diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/handlers/newComponents/NewModelHandler.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/handlers/newComponents/NewModelHandler.java index 393d5ae8..d60a1854 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/handlers/newComponents/NewModelHandler.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/handlers/newComponents/NewModelHandler.java @@ -18,6 +18,7 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; +import org.simantics.DatabaseJob; import org.simantics.db.WriteGraph; import org.simantics.db.common.request.WriteRequest; import org.simantics.db.exception.DatabaseException; @@ -37,7 +38,7 @@ public class NewModelHandler extends AbstractHandler { public Object execute(ExecutionEvent event) throws ExecutionException { - Job job = new Job("Creating System Dynamics Model") { + Job job = new DatabaseJob("Creating System Dynamics Model") { @Override protected IStatus run(IProgressMonitor monitor) { try { @@ -54,7 +55,7 @@ public class NewModelHandler extends AbstractHandler { } } }; - job.setUser(true); +// job.setUser(true); job.schedule(); return null; -- 2.47.1