From d5b372cc6101de30599a626f10601508fddd1cad Mon Sep 17 00:00:00 2001 From: lempinen Date: Wed, 30 Nov 2011 12:20:23 +0000 Subject: [PATCH] new basefunction to support issues in modules git-svn-id: https://www.simantics.org/svn/simantics/sysdyn/trunk@23377 ac1ea38d-2e2b-0410-8846-a27921b304fc --- org.simantics.sysdyn.ontology/graph.tg | Bin 78031 -> 78303 bytes .../graph/Validation.pgraph | 36 ++++-- .../org/simantics/sysdyn/SysdynResource.java | 18 +-- org.simantics.sysdyn.ui/plugin.xml | 7 ++ .../newComponents/NewModuleNodeHandler.java | 6 + .../simantics/sysdyn/ui/trend/ChartPanel.java | 17 ++- .../sysdyn/ui/trend/ChartPanelHeader.java | 49 ++++++-- .../ui/validation/DependencyFunction.java | 113 +++++++----------- .../sysdyn/ui/validation/Functions.java | 40 +++++++ .../ui/validation/NoSuchVariableIssue.java | 73 ----------- 10 files changed, 179 insertions(+), 180 deletions(-) create mode 100644 org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/Functions.java delete mode 100644 org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/NoSuchVariableIssue.java diff --git a/org.simantics.sysdyn.ontology/graph.tg b/org.simantics.sysdyn.ontology/graph.tg index bea7e85b23ba70a194317ca208d322ceaf8b6004..dd36a3eebc0a8815c90b58498ea98ffb3427afa0 100644 GIT binary patch literal 78303 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 literal 78031 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

ggUFeRfjSOhXPyy^)2n>Mus4A{_;PWc)V2&s zw%_g*ZdOsm64-BgPc%vut=`e&Q;yHPFKzV)J9vHCikaSnrGn2{n4UdYKe%h=d@Ga5 z%heLTR}*P7XH$ddrxR~6ikvb1lu>S5as4|P#<62?j%?tSINzPcld`xnizjCB_zcGF zz%hlcMzt4L{QSaHw$c$WtWEqi0ji)fp?MyTQGvoWS#9l`tiR$PxOSZb@dUrDaRyZLM2%#Lk` ztu3-%*pFHx-xv8JPmK;qq=l3CM>-r$*|cfX+$R zgqG>jJQmH}W(X&W#E#1=cwIJxxip%V{EOOg+w#(ua%~=JnFpaMjLWrl)a&IMZ*M`{ zOVc=LFTs_`>W`7ewoZ9D(_3EE567v}HXe?vafgiW1{yq=QB(y@hRKTQT|cct-3Ae?DjbIqYbPkTMt9Rp0 zp~5-SQZJv+f!s2#uUzk~Rff$`O0KovIL(0TG;EV2=Lv$k3FrQ_C>zT*`SV|GaXxHnt9XFOznw02mDcw_CnqMf#;+lPw)=BKM}^m#sl4I?X>yKiRw=T zE_`g$iN+&KR{g1#b)r$<{*mA8ZVyPt)<@(#E7TiX2FisEwd%+)ny%OZL#;G8XMrq`W~R+Nj)ixz5BNz; zKW^lg;&C1i-jPha!uX)IP1c1L95V@opP7Yh5f!xP@o2NhV;tHz{{D&T9}iyH?4RVF z*x?1kTw(GX@oS-cqf{9v;9Esrx|6FgryqpFF4%U$HsSwi?rMAEI;yafh1LzhO+r+f zCP=rNma5?0o%a_fP95^rASfYq8Y%(8*juOI>{_--LWNMpHxNR6=Of~O^r!JWXYNg| zub0IFp>n0WzUSPTGc#wNbI#1%nFM=X%PTll#0;bb7v((hS#o{i=+MEdDNXchxL-9>X5yv{^(1rc2|k#2$)M@78bXe8Z6 zJLxuhX#wr@q#LwTHtA;6M&#F5?=N`x7wE;(>Iu4N7RCE(Gtv9X5%kV+mL-aDvV%P` zlkM7F7JvNG4>xvq#Sw@f?zq$vv}7P(!b6E!WYBG*db38{uAo@Htu6hU;hYH>>_dF?!V;eYngk_oCmxn0rbeUPF%}U zYx+71$&B*UKJk3W~cXu|{#$IH83@~r)Atwt*}J&bY8~P6`?z0Sl0|_E zTYj6}R^j z@Gf2CEK0WX%BtvhFwNS+TmxHD4lu9mQA6*1d)D^jyWD*{I-Hz`T3`Cd-(SD_-m}L$ z6&7i@KEB$=x>_F}9X6+1Xx?i7!TRk%>T{#dWNTvwXJc0TlWG6GYggaA`J)@_AK$xG z?LXPB?mhV45ANQm`h(Hvp}jF0-CVy}efZIx3JZp#(X9{qRlkMur0^KtPiC~%De_#% z$~i|~_9-W?!L%+r?ZfiG4s|rjCJUy)W6&rE@1yY{8ZcE--ug(UPevnK1wp7sawrFt z3qBZ^!HglJCa94eW@A!NOc_*+I_l+tqa+X!Oy_m5N|+j3(38jn!#HZf4K-Se<|C!{ z(2hmv(3I9HgQ#kcakUbR4o8Z%uIE>F6Egpu^E3qeF^dq62eKM8VKx7X5*DiO*Z>cGMuQ%$E5eqtZcYQD z;5F$SYLqRy1iYZVk-W}2LJ?)52Q8aL^(XXRk(UkZhw@Zb+KWK#U;vhiLKk}neK0A| zZGjwcRfP745y;YLyP*QL@<0&bR134zmvEyJv1mkO4XB_&9HLiX6265Qst7;X9ZtFzvib_Eu6l(*_1odIl#0eNh=o2VPg(R|_MzfOS1WLR}gPp+wrO#mI zR(i)3FIY;eKF~*5@h>oy*9O@Zz(6HM(|nw2d1+ z{u*N2j}hC-IYf&m9+-J{05*2uEL>TUgPXT`%%ur_asco}qz`Hlr%eC= diff --git a/org.simantics.sysdyn.ontology/graph/Validation.pgraph b/org.simantics.sysdyn.ontology/graph/Validation.pgraph index e53a173d..c9932211 100644 --- a/org.simantics.sysdyn.ontology/graph/Validation.pgraph +++ b/org.simantics.sysdyn.ontology/graph/Validation.pgraph @@ -7,36 +7,40 @@ VALIDATIONS = SYSDYN.Validations : L0.Library SYSDYN.SysdynIssue -- VALIDATIONS.NoSuchVariableIssue.variableName --> L0.String + + + + + + + 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 441bef3c..9c2e98e4 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,6 +99,12 @@ 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, diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/trend/ChartPanel.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/trend/ChartPanel.java index 0b074d4b..af8781d9 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/trend/ChartPanel.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/trend/ChartPanel.java @@ -253,6 +253,20 @@ public class ChartPanel extends ViewPart { e.printStackTrace(); } } + + /** + * Return true if element with chart resource is minimized, false if expanded + * or there is no element with that resource + * + * @param chart Chart resource + * @return true if element with chart resource is minimized, false if expanded + */ + public boolean isMinimized(Resource chart) { + if(minimizedCharts.contains(chart)) + return true; + else + return false; + } /** * Expand or minimize chart depending on the current status of that chart. @@ -260,10 +274,9 @@ public class ChartPanel extends ViewPart { * @param chart The name of the chart to be expanded or minimized */ public void expandChart(Resource chart) { - boolean expand = false; + boolean expand = isMinimized(chart); if(minimizedCharts.contains(chart)) { minimizedCharts.remove(chart); - expand = true; } if(expandedCharts.contains(chart)) diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/trend/ChartPanelHeader.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/trend/ChartPanelHeader.java index 25c143d3..f0334fc6 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/trend/ChartPanelHeader.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/trend/ChartPanelHeader.java @@ -42,7 +42,7 @@ public class ChartPanelHeader extends Composite { public static int HEADER_MINIMUM_WIDTH = 250; private ChartPanel panel; private Resource resource; - private Label name; + private Label name, minimize, remove; /** * Chart panel header with minimize and close buttons. @@ -109,20 +109,37 @@ public class ChartPanelHeader extends Composite { GridDataFactory.fillDefaults().grab(true, false).applyTo(name); name.addMouseListener(new MinimizeListener(name)); name.setCursor(new Cursor(name.getDisplay(), SWT.CURSOR_HAND)); + if(isMinimized()) + name.setToolTipText("Expand"); + else + name.setToolTipText("Minimize"); // Label for minimizing/expanding chart - Label label = new Label(this, SWT.NONE); - label.setText("^"); - GridDataFactory.fillDefaults().applyTo(label); - label.addMouseListener(new MinimizeListener(label)); - label.setCursor(new Cursor(label.getDisplay(), SWT.CURSOR_HAND)); + minimize = new Label(this, SWT.NONE); + minimize.setText("^"); + GridDataFactory.fillDefaults().applyTo(minimize); + minimize.addMouseListener(new MinimizeListener(minimize)); + minimize.setCursor(new Cursor(minimize.getDisplay(), SWT.CURSOR_HAND)); + if(isMinimized()) + minimize.setToolTipText("Expand"); + else + minimize.setToolTipText("Minimize"); // Label for closing/removing the chart - label = new Label(this, SWT.NONE); - label.setText("x"); - GridDataFactory.fillDefaults().applyTo(label); - label.addMouseListener(new RemoveChartListener(label)); - label.setCursor(new Cursor(label.getDisplay(), SWT.CURSOR_HAND)); + remove = new Label(this, SWT.NONE); + remove.setText("x"); + GridDataFactory.fillDefaults().applyTo(remove); + remove.addMouseListener(new RemoveChartListener(remove)); + remove.setCursor(new Cursor(remove.getDisplay(), SWT.CURSOR_HAND)); + remove.setToolTipText("Remove"); + } + + /** + * Return true if this element is minimized, false if expanded + * @return true if this element is minimized, false if expanded + */ + private boolean isMinimized() { + return panel.isMinimized(resource); } /** @@ -159,6 +176,16 @@ public class ChartPanelHeader extends Composite { bounds.y = 0; if(bounds.contains(e.x, e.y)) panel.expandChart(resource); + + if(!name.isDisposed() && !minimize.isDisposed()) { + if(isMinimized()) { + name.setToolTipText("Expand"); + minimize.setToolTipText("Expand"); + } else { + name.setToolTipText("Minimize"); + minimize.setToolTipText("Minimize"); + } + } } } diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/DependencyFunction.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/DependencyFunction.java index 9828a94e..8ad6013b 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/DependencyFunction.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/DependencyFunction.java @@ -34,20 +34,17 @@ import org.simantics.sysdyn.SysdynResource; * Evaluates issues related to Dependencies (arrows) * * @author Teemu Lempinen - * + * */ public class DependencyFunction { /** - * Evaluates dependency-related issues for a component. + * Evaluates dependency-related issues for a component. * - * Issues include: - * Missing link - * No such variable - * Unused dependency + * Issues include: Unused dependency * * @param graph ReadGraph - * @param component Evaluated component (Variable) + * @param component Evaluated component (Variable) * @return list of issues related to component * @throws DatabaseException */ @@ -56,11 +53,11 @@ public class DependencyFunction { SysdynResource sr = SysdynResource.getInstance(graph); Layer0 l0 = Layer0.getInstance(graph); - if(!graph.isInstanceOf(component, sr.IndependentVariable)) + if (!graph.isInstanceOf(component, sr.IndependentVariable)) return Collections.emptyList(); - if(!graph.hasStatement(component) || !graph.hasStatement(component, l0.PartOf)) - return Collections.emptyList(); + if (!graph.hasStatement(component) || !graph.hasStatement(component, l0.PartOf)) + return Collections.emptyList(); // Find all variables that are linked to component with arrows Set dependencies = ValidationUtils.getDependencies(graph, component); @@ -76,29 +73,10 @@ public class DependencyFunction { ArrayList result = new ArrayList(); - -// StandardIssue noSuchVariableIssue = null; -// // Check that all references have corresponding arrows -// if(references != null && dependencies != null) { -// for(String reference : references) { -// if(!dependencies.contains(reference)) { -// Resource variable = null; -// if((variable = ValidationUtils.reach(graph, component, reference)) != null) { -// result.add(new StandardIssue(sr.Validations_MissingLinkIssue, component, variable)); -// } else { -// if(noSuchVariableIssue == null) { -// noSuchVariableIssue = new StandardIssue(sr.Validations_NoSuchVariableIssue, component); -// result.add(noSuchVariableIssue); -// } -// } -// } -// } -// } - // Check that all arrow dependencies are used in equations - if(dependencies != null) { - for(String dependency : dependencies) { - if(references == null || !references.contains(dependency)) { + if (dependencies != null) { + for (String dependency : dependencies) { + if (references == null || !references.contains(dependency)) { Resource variable = ValidationUtils.reach(graph, component, dependency); result.add(new StandardIssue(sr.Validations_UnusedDependencyIssue, component, variable)); } @@ -109,15 +87,12 @@ public class DependencyFunction { } /** - * Evaluates dependency-related issues for a component. + * Evaluates dependency-related issues for a component. * - * Issues include: - * Missing link - * No such variable - * Unused dependency + * Issues include: Missing link No such variable * * @param graph ReadGraph - * @param component Evaluated component (Variable) + * @param component Evaluated component (Variable) * @return list of issues related to component * @throws DatabaseException */ @@ -126,11 +101,11 @@ public class DependencyFunction { SysdynResource sr = SysdynResource.getInstance(graph); Layer0 l0 = Layer0.getInstance(graph); - if(!graph.isInstanceOf(component, sr.IndependentVariable)) + if (!graph.isInstanceOf(component, sr.IndependentVariable)) return Collections.emptyList(); - if(!graph.hasStatement(component) || !graph.hasStatement(component, l0.PartOf)) - return Collections.emptyList(); + if (!graph.hasStatement(component) || !graph.hasStatement(component, l0.PartOf)) + return Collections.emptyList(); // Find all variables that are linked to component with arrows Set dependencies = ValidationUtils.getDependencies(graph, component); @@ -148,27 +123,25 @@ public class DependencyFunction { StandardIssue noSuchVariableIssue = null; // Check that all references have corresponding arrows - if(references != null && dependencies != null) { - for(String reference : references) { - if(!dependencies.contains(reference)) { + if (references != null && dependencies != null) { + for (String reference : references) { + if (!dependencies.contains(reference)) { Resource variable = null; - if((variable = ValidationUtils.reach(graph, component, reference)) != null) { + if ((variable = ValidationUtils.reach(graph, component, reference)) != null) { result.add(new StandardIssue(sr.Validations_MissingLinkIssue, component, variable)); } else { - if(noSuchVariableIssue == null) { + if (noSuchVariableIssue == null) { noSuchVariableIssue = new StandardIssue(sr.Validations_NoSuchVariableIssue, component); result.add(noSuchVariableIssue); } } - } + } } } return result; - - } - + } /** * Missing link description @@ -180,13 +153,14 @@ public class DependencyFunction { * @throws DatabaseException */ @SCLValue(type = "ReadGraph -> Resource -> Variable -> String") - public static String missingLinkIssueDescription(ReadGraph graph, Resource converter, Variable issue) throws DatabaseException { + public static String missingLinkIssueDescription(ReadGraph graph, Resource converter, Variable issue) + throws DatabaseException { IssueResource ISSUE = IssueResource.getInstance(graph); Resource issueResource = issue.getRepresents(graph); Resource list = graph.getSingleObject(issueResource, ISSUE.Sources_DependencyTracker_Issue_HasContexts); List contexts = ListUtils.toList(graph, list); String result = "Missing a link to "; - if(contexts.size() > 0) { + if (contexts.size() > 0) { Resource component = contexts.get(1); String name = NameUtils.getSafeName(graph, component); result = result + name; @@ -196,7 +170,7 @@ public class DependencyFunction { /** * Unused dependency description - * + * * @param graph ReadGraph * @param converter * @param issue Issue @@ -204,13 +178,14 @@ public class DependencyFunction { * @throws DatabaseException */ @SCLValue(type = "ReadGraph -> Resource -> Variable -> String") - public static String unusedDependencyIssueDescription(ReadGraph graph, Resource converter, Variable issue) throws DatabaseException { + public static String unusedDependencyIssueDescription(ReadGraph graph, Resource converter, Variable issue) + throws DatabaseException { IssueResource ISSUE = IssueResource.getInstance(graph); Resource issueResource = issue.getRepresents(graph); Resource list = graph.getSingleObject(issueResource, ISSUE.Sources_DependencyTracker_Issue_HasContexts); List contexts = ListUtils.toList(graph, list); String result = "Unused dependency: "; - if(contexts.size() > 0) { + if (contexts.size() > 0) { Resource component = contexts.get(1); String name = NameUtils.getSafeName(graph, component); result = result + name; @@ -219,8 +194,8 @@ public class DependencyFunction { } /** - * No such variable description. Finds all variables that the component refers to and adds - * their names to the issue description. + * No such variable description. Finds all variables that the component + * refers to and adds their names to the issue description. * * @param graph ReadGraph * @param converter @@ -229,7 +204,8 @@ public class DependencyFunction { * @throws DatabaseException */ @SCLValue(type = "ReadGraph -> Resource -> Variable -> String") - public static String noSuchVariableIssueDescription(ReadGraph graph, Resource converter, Variable issue) throws DatabaseException { + public static String noSuchVariableIssueDescription(ReadGraph graph, Resource converter, Variable issue) + throws DatabaseException { IssueResource ISSUE = IssueResource.getInstance(graph); Resource issueResource = issue.getRepresents(graph); Resource list = graph.getSingleObject(issueResource, ISSUE.Sources_DependencyTracker_Issue_HasContexts); @@ -248,31 +224,30 @@ public class DependencyFunction { } catch (UndefinedExpressionException e) { } - ArrayList result = new ArrayList(); // Loop all references - if(references != null && dependencies != null) { - for(String reference : references) { - // If dependencies does not contain reference and the reference is not reachable from component, add the name - if(!dependencies.contains(reference) && - ValidationUtils.reach(graph, component, reference) == null) { + if (references != null && dependencies != null) { + for (String reference : references) { + // If dependencies does not contain reference and the reference +// is not reachable from component, add the name + if (!dependencies.contains(reference) && ValidationUtils.reach(graph, component, reference) == null) { result.add(reference); - } + } } } - if(result.size() == 0) { + if (result.size() == 0) { return "Missing link"; - } else if(result.size() == 1) { + } else if (result.size() == 1) { return "Refers to unexisting variable " + result.get(0); } else { StringBuilder sb = new StringBuilder(); sb.append("Refers to unexisting variables "); Iterator iterator = result.iterator(); String reference; - while(iterator.hasNext()) { + while (iterator.hasNext()) { reference = iterator.next(); sb.append(reference); - if(iterator.hasNext()) + if (iterator.hasNext()) sb.append(", "); } return sb.toString(); 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 new file mode 100644 index 00000000..78128ff2 --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/Functions.java @@ -0,0 +1,40 @@ +/******************************************************************************* + * Copyright (c) 2007, 2011 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 org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.exception.DatabaseException; +import org.simantics.scl.reflection.annotations.SCLValue; +import org.simantics.simulation.ontology.SimulationResource; +import org.simantics.structural.stubs.StructuralResource2; +import org.simantics.sysdyn.SysdynResource; + +/** + * Generic functions for validations + * + * @author Teemu Lempinen + * + */ +public class Functions { + + @SCLValue(type = "ReadGraph -> Resource -> Resource") + public static Resource baseRealizationFunction(ReadGraph graph, Resource model) throws DatabaseException { + SysdynResource sr = SysdynResource.getInstance(graph); + if(graph.isInstanceOf(model, sr.SysdynModel)) + return graph.getSingleObject(model, SimulationResource.getInstance(graph).HasConfiguration); + else if (graph.isInheritedFrom(model, sr.Module)) + return graph.getSingleObject(model, StructuralResource2.getInstance(graph).IsDefinedBy); + else return null; + + } +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/NoSuchVariableIssue.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/NoSuchVariableIssue.java deleted file mode 100644 index 3e2eba45..00000000 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/NoSuchVariableIssue.java +++ /dev/null @@ -1,73 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2011 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.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.Arrays; -import java.util.Calendar; -import java.util.UUID; - -import org.simantics.databoard.Bindings; -import org.simantics.db.Resource; -import org.simantics.db.WriteGraph; -import org.simantics.db.common.utils.ListUtils; -import org.simantics.db.exception.DatabaseException; -import org.simantics.issues.common.StandardIssue; -import org.simantics.issues.ontology.IssueResource; -import org.simantics.layer0.Layer0; -import org.simantics.sysdyn.SysdynResource; - -/** - * Issue class for NoSuchVariableIssues. Extended from StandardIssue to allow - * a string parameter containing the name of the variable in an equation that - * does not correspond to any existing and reachable variable. - * - * @author Teemu Lempinen - * - */ -public class NoSuchVariableIssue extends StandardIssue { - - public String missingVariable; - - public NoSuchVariableIssue(Resource type, String missingVariable, Resource ... contexts) { - super(type, contexts); - this.missingVariable = missingVariable; - } - - /** - * Same as in StandardIssue. Added Validations_NoSuchVariableIssue_variableName. - */ - @Override - public void write(WriteGraph graph, Resource model, Resource source) throws DatabaseException { - Layer0 L0 = Layer0.getInstance(graph); - IssueResource IR = IssueResource.getInstance(graph); - Resource issue = graph.newResource(); - graph.claim(issue, L0.InstanceOf, null, type); - graph.claimLiteral(issue, L0.HasName, UUID.randomUUID().toString(), Bindings.STRING); - graph.claim(issue, IR.Sources_DependencyTracker_Issue_HasContexts, ListUtils.create(graph, L0.List, contexts)); - DateFormat format = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); - String created = format.format(Calendar.getInstance().getTime()); - graph.claimLiteral(issue, IR.HasCreationTime, created, Bindings.STRING); - graph.claim(source, IR.IssueSource_Manages, issue); - graph.claim(model, L0.ConsistsOf, issue); - - // Modification to standard issue: - graph.claimLiteral(issue, SysdynResource.getInstance(graph).Validations_NoSuchVariableIssue_variableName, this.missingVariable, Bindings.STRING); - } - - @Override - public String toString() { - return Arrays.toString(contexts) + " + missing: " + missingVariable; - } - -} -- 2.47.1