From 753135133a448534eea2b8f8f9f55a3d4250dc2f Mon Sep 17 00:00:00 2001 From: lempinen Date: Wed, 10 Oct 2012 10:32:47 +0000 Subject: [PATCH] Enumeration issue source for checking that an enumeration is not empty (refs #3048) git-svn-id: https://www.simantics.org/svn/simantics/sysdyn/trunk@25965 ac1ea38d-2e2b-0410-8846-a27921b304fc --- org.simantics.sysdyn.ontology/graph.tg | Bin 67529 -> 68708 bytes .../graph/Validation.pgraph | 35 ++++++++-- .../org/simantics/sysdyn/SysdynResource.java | 27 +++++-- .../newActions/NewModuleTypeAction.java | 18 ----- .../handlers/imports/ImportModelHandler.java | 38 +++++++++- .../newComponents/NewModuleNodeHandler.java | 18 ----- .../simantics/sysdyn/ui/utils/ModelUtils.java | 6 ++ .../ui/validation/EnumerationFunction.java | 66 ++++++++++++++++++ .../sysdyn/ui/validation/Functions.java | 38 ++++++++++ 9 files changed, 196 insertions(+), 50 deletions(-) create mode 100644 org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/EnumerationFunction.java diff --git a/org.simantics.sysdyn.ontology/graph.tg b/org.simantics.sysdyn.ontology/graph.tg index cbaba95479de9af40b8d2f579f32b74a5948d811..0475c6b5589ce60083775c487e276ca8a6701b57 100644 GIT binary patch literal 68708 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

75&ZIqUl#F8BYsK5H%I*9h+h=( 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 diff --git a/org.simantics.sysdyn.ontology/graph/Validation.pgraph b/org.simantics.sysdyn.ontology/graph/Validation.pgraph index 72162a76..363c9d29 100644 --- a/org.simantics.sysdyn.ontology/graph/Validation.pgraph +++ b/org.simantics.sysdyn.ontology/graph/Validation.pgraph @@ -10,17 +10,21 @@ SYSDYN.SysdynIssue enumerationIssueSources = graph.syncRequest(new ObjectsWithType(modelRoot, L0.ConsistsOf, sr.Validations_Enumerations_EnumerationIssueSource)); + if(enumerationIssueSources.isEmpty()) { + GraphUtils.create2(graph, + sr.Validations_Enumerations_EnumerationIssueSource, + L0X.IsActivatedBy, modelRoot, + L0.PartOf, modelRoot + ); + } } + protected void fixHasTailAndHasHead(WriteGraph graph, Resource modelRoot) throws DatabaseException { Layer0 L0 = Layer0.getInstance(graph); SysdynResource sr = SysdynResource.getInstance(graph); @@ -214,20 +230,36 @@ public class ImportModelHandler extends AbstractHandler { } private Collection findAllConfigurations(ReadGraph graph, Resource modelRoot) throws DatabaseException { - Layer0 L0 = Layer0.getInstance(graph); SysdynResource sr = SysdynResource.getInstance(graph); StructuralResource2 SR2 = StructuralResource2.getInstance(graph); + Collection modulesAndModels = findAllModelsAndModules(graph, modelRoot); Collection configurations = new ArrayList(); - configurations.add(graph.getPossibleObject(modelRoot, SimulationResource.getInstance(graph).HasConfiguration)); - for(Resource r : graph.getObjects(modelRoot, L0.ConsistsOf)) { + 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); diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/handlers/newComponents/NewModuleNodeHandler.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/handlers/newComponents/NewModuleNodeHandler.java index 6bfc3767..3aa9e5f7 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/handlers/newComponents/NewModuleNodeHandler.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/handlers/newComponents/NewModuleNodeHandler.java @@ -99,24 +99,6 @@ public class NewModuleNodeHandler extends AbstractHandler { } } - GraphUtils.create2(g, - sr.Validations_Dependencies_MissingDependencyConnectionsIssueSource, - L0X.IsActivatedBy, model, - l0.PartOf, moduleType - ); - - GraphUtils.create2(g, - sr.Validations_Dependencies_DependencyConnectionsIssueSource, - L0X.IsActivatedBy, model, - l0.PartOf, moduleType - ); - - GraphUtils.create2(g, - sr.Validations_Expressions_ExpressionIssueSource, - L0X.IsActivatedBy, model, - l0.PartOf, moduleType - ); - Resource mapping = g.newResource(); g.claim(mapping, l0.InstanceOf, null, sr.DiagramToCompositeMapping); g.claim(diagram, L0X.HasTrigger, mapping); diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/utils/ModelUtils.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/utils/ModelUtils.java index b0d6197b..60b4280d 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/utils/ModelUtils.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/utils/ModelUtils.java @@ -90,6 +90,12 @@ public class ModelUtils { L0X.IsActivatedBy, model, l0.PartOf, model ); + + GraphUtils.create2(g, + sr.Validations_Enumerations_EnumerationIssueSource, + L0X.IsActivatedBy, model, + l0.PartOf, model + ); Resource conf = GraphUtils.create2(g, sr.Configuration, diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/EnumerationFunction.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/EnumerationFunction.java new file mode 100644 index 00000000..21e9bb95 --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/EnumerationFunction.java @@ -0,0 +1,66 @@ +/******************************************************************************* + * 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.sysdyn.ui.validation; + +import java.util.Collections; +import java.util.List; + +import org.simantics.db.Issue; +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.common.utils.OrderedSetUtils; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.variable.Variable; +import org.simantics.issues.common.StandardIssue; +import org.simantics.scl.reflection.annotations.SCLValue; +import org.simantics.sysdyn.SysdynResource; + +/** + * Functions for checking issues in Enumerations + * @author Teemu Lempinen + * + */ +public class EnumerationFunction { + + private static String NO_INDEXES = "Enumeration does not contain indexes."; + + @SCLValue(type = "ReadGraph -> Resource -> [Issue]") + public static List enumerationIndexValidator(ReadGraph graph, Resource component) throws DatabaseException { + + SysdynResource sr = SysdynResource.getInstance(graph); + + if(!graph.isInstanceOf(component, sr.Enumeration)) { + return Collections.emptyList(); + } + + boolean noIndexes = false; + + try { + Resource indexList = graph.getPossibleObject(component, sr.Enumeration_enumerationIndexes); + List indexes = OrderedSetUtils.toList(graph, indexList); + if(indexes.size() == 0) + noIndexes = true; + } catch (DatabaseException e) { + noIndexes = true; + } + + if(noIndexes) + return Collections.singletonList(new StandardIssue(sr.Validations_EmptyEnumerationIssue, component)); + else + return Collections.emptyList(); + } + + @SCLValue(type = "ReadGraph -> Resource -> Variable -> String") + public static String emptyEnumerationIssueDescription(ReadGraph graph, Resource converter, Variable property) throws DatabaseException { + return NO_INDEXES; + } +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/Functions.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/Functions.java index 78128ff2..d53a9128 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/Functions.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/Functions.java @@ -11,9 +11,16 @@ *******************************************************************************/ package org.simantics.sysdyn.ui.validation; +import java.util.List; + import org.simantics.db.ReadGraph; import org.simantics.db.Resource; +import org.simantics.db.common.utils.NameUtils; import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.variable.Variable; +import org.simantics.issues.common.IssueUtils; +import org.simantics.layer0.Layer0; +import org.simantics.project.ontology.ProjectResource; import org.simantics.scl.reflection.annotations.SCLValue; import org.simantics.simulation.ontology.SimulationResource; import org.simantics.structural.stubs.StructuralResource2; @@ -37,4 +44,35 @@ public class Functions { else return null; } + + + @SCLValue(type = "ReadGraph -> Resource -> Variable -> String") + public static String path(ReadGraph graph, Resource source, Variable property) throws DatabaseException { + List contexts = IssueUtils.getContextsForProperty(graph, property); + if (contexts.size() > 0) { + Resource component = contexts.get(0); + Layer0 L0 = Layer0.getInstance(graph); + SysdynResource sr = SysdynResource.getInstance(graph); + ProjectResource PROJECT = ProjectResource.getInstance(graph); + StringBuilder sb = new StringBuilder(""); + Resource parent = graph.getPossibleObject(component, L0.PartOf); + boolean first = true; + while(parent != null && !graph.isInstanceOf(parent, PROJECT.Project)) { + if(!graph.isInstanceOf(parent, sr.Configuration)) { + String name = NameUtils.getSafeName(graph, parent); + if(first) { + sb.append(name); + first = false; + } else { + sb.insert(0, "/"); + sb.insert(0, name); + } + } + parent = graph.getPossibleObject(parent, L0.PartOf); + } + return sb.toString(); + } else { + return ""; + } + } } -- 2.47.1