From 8ec310714002ecf514ee520448bb4c7595241455 Mon Sep 17 00:00:00 2001 From: Tuukka Lehtonen Date: Fri, 20 Jan 2017 01:06:09 +0200 Subject: [PATCH] Issues-view menu improvements & Variable-based issue context resolution This adds a new [Resource] valued property for Issue instances that is by default defined to just read the old Issue.HasContexts L0.List property. The property allows for more specific domains to override the issue context resource calculations. To support this calculation a noteworthy change needed to be made to org.simantics.db.layer0.function.All.getStandardChildDomainPropertyVariable. It now performs a new final fallback step that resembles how the standard procedural variables work. If the parent variable has a solver variable node defined, it will use NodeManager.getClassifications as an attempt to read the type Resource of the variable. If this is successful, the asserted properties of the type are searched to find a property matching name of the the requested property. To support this a new request was added: UnescapedAssertedPropertyMapOfResource. This request is also used to optimize the implementation of All.standardGetValue[12]. These changes also add a Help action for Issues view context menu that looks for the "contextHelpId" String property from the Variable describing the issue. refs #6948 Change-Id: I9655ea3647851fa04fb2420686cb13dd0c6719b6 --- .../META-INF/MANIFEST.MF | 3 +- .../org/simantics/db/layer0/function/All.java | 75 +++++++++++++++--- ...nescapedAssertedPropertyMapOfResource.java | 65 +++++++++++++++ .../src/org/simantics/issues/common/All.java | 7 +- .../org.simantics.issues.ontology/graph.tg | Bin 14830 -> 15208 bytes .../graph/Issue.pgraph | 4 + .../issues/ontology/IssueResource.java | 9 +++ .../org.simantics.issues.ui.ontology/graph.tg | Bin 15919 -> 16249 bytes .../graph/IssueUI.pgraph | 6 +- .../issues/ui/ontology/IssueUIResource.java | 3 + bundles/org.simantics.issues.ui/adapters.xml | 4 +- bundles/org.simantics.issues.ui/plugin.xml | 9 --- .../org/simantics/issues/ui/IssueView2.java | 30 +++++++ .../org/simantics/issues/ui/handler/Help.java | 64 +++++++++++++++ .../issues/ui/handler/MenuActions.java | 10 +-- .../diagramEditor/OpenDiagramFromIssue.java | 2 - 16 files changed, 255 insertions(+), 36 deletions(-) create mode 100644 bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/request/UnescapedAssertedPropertyMapOfResource.java create mode 100644 bundles/org.simantics.issues.ui/src/org/simantics/issues/ui/handler/Help.java diff --git a/bundles/org.simantics.db.layer0/META-INF/MANIFEST.MF b/bundles/org.simantics.db.layer0/META-INF/MANIFEST.MF index d6a2b6365..7bf579b69 100644 --- a/bundles/org.simantics.db.layer0/META-INF/MANIFEST.MF +++ b/bundles/org.simantics.db.layer0/META-INF/MANIFEST.MF @@ -32,7 +32,8 @@ Require-Bundle: gnu.trove3;bundle-version="3.0.3", org.simantics.issues.ontology;bundle-version="1.2.0", org.simantics.simulator.variable;bundle-version="1.0.0", org.simantics.scl.osgi;bundle-version="1.0.4", - org.simantics.scl.compiler;bundle-version="0.4.0" + org.simantics.scl.compiler;bundle-version="0.4.0", + org.slf4j.api Export-Package: org.simantics.db.layer0, org.simantics.db.layer0.adapter, org.simantics.db.layer0.adapter.impl, diff --git a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/function/All.java b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/function/All.java index 1c9331069..6a1441652 100644 --- a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/function/All.java +++ b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/function/All.java @@ -27,10 +27,10 @@ import org.simantics.db.Statement; import org.simantics.db.WriteGraph; import org.simantics.db.common.issue.StandardIssue; import org.simantics.db.common.primitiverequest.PossibleRelatedValueImplied2; +import org.simantics.db.common.primitiverequest.PossibleResource; import org.simantics.db.common.procedure.adapter.TransientCacheAsyncListener; import org.simantics.db.common.procedure.adapter.TransientCacheListener; import org.simantics.db.common.request.IsEnumeratedValue; -import org.simantics.db.common.request.ObjectsWithType; import org.simantics.db.common.uri.UnescapedChildMapOfResource; import org.simantics.db.common.utils.CommonDBUtils; import org.simantics.db.common.utils.Functions; @@ -47,6 +47,7 @@ import org.simantics.db.layer0.exception.VariableException; import org.simantics.db.layer0.request.PossibleURI; import org.simantics.db.layer0.request.PropertyInfo; import org.simantics.db.layer0.request.PropertyInfoRequest; +import org.simantics.db.layer0.request.UnescapedAssertedPropertyMapOfResource; import org.simantics.db.layer0.request.UnescapedPropertyMapOfResource; import org.simantics.db.layer0.scl.CompileResourceValueRequest; import org.simantics.db.layer0.scl.CompileValueRequest; @@ -56,6 +57,7 @@ import org.simantics.db.layer0.variable.AbstractVariable; import org.simantics.db.layer0.variable.ChildVariableMapRequest; import org.simantics.db.layer0.variable.ExternalSetValue; import org.simantics.db.layer0.variable.PropertyVariableMapRequest; +import org.simantics.db.layer0.variable.StandardAssertedGraphPropertyVariable; import org.simantics.db.layer0.variable.StandardComposedProperty; import org.simantics.db.layer0.variable.StandardGraphChildVariable; import org.simantics.db.layer0.variable.StandardGraphPropertyVariable; @@ -118,10 +120,20 @@ public class All { if (variable.isAsserted()) { if (variable.parentResource != null) { - Layer0 L0 = Layer0.getInstance(graph); - for(Resource assertion : graph.syncRequest(new ObjectsWithType(variable.parentResource, L0.Asserts, L0.Assertion))) { - if(variable.property.predicate.equals(graph.getSingleObject(assertion, L0.HasPredicate))) { - return graph.getRelatedValue2(assertion, L0.HasObject, variable); + Map> assertions = graph.syncRequest( + new UnescapedAssertedPropertyMapOfResource(variable.parentResource), + TransientCacheAsyncListener.instance()); + + // NOTE: This optimization assumes the property + // variable's representation is the asserted object. + Resource object = variable.getPossibleRepresents(graph); + if (object != null) { + return graph.getValue2(object, variable); + } else { + for (Pair assertion : assertions.values()) { + if (assertion.first.predicate.equals(variable.property.predicate)) { + return graph.getValue2(assertion.second, variable); + } } } } @@ -156,13 +168,12 @@ public class All { try { - Layer0 L0 = Layer0.getInstance(graph); - if(variable.property.hasEnumerationRange) { Resource object = variable.getRepresents(graph); if(graph.sync(new IsEnumeratedValue(object))) { + Layer0 L0 = Layer0.getInstance(graph); if(graph.isInstanceOf(object, L0.Literal)) { - return graph.getValue(object); + return graph.getValue(object, binding); } else { return graph.getRelatedValue2(variable.getRepresents(graph), L0.HasLabel, binding); } @@ -171,11 +182,22 @@ public class All { if (variable.isAsserted()) { if (variable.parentResource != null) { - for(Resource assertion : graph.syncRequest(new ObjectsWithType(variable.parentResource, L0.Asserts, L0.Assertion))) { - if(variable.property.predicate.equals(graph.getSingleObject(assertion, L0.HasPredicate))) { - return graph.getRelatedValue2(assertion, L0.HasObject, context); - } - } + Map> assertions = graph.syncRequest( + new UnescapedAssertedPropertyMapOfResource(variable.parentResource), + TransientCacheAsyncListener.instance()); + + // NOTE: This optimization assumes the property + // variable's representation is the asserted object. + Resource object = variable.getPossibleRepresents(graph); + if (object != null) { + return graph.getValue2(object, variable, binding); + } else { + for (Pair assertion : assertions.values()) { + if (assertion.first.predicate.equals(variable.property.predicate)) { + return graph.getValue2(assertion.second, variable, binding); + } + } + } } } @@ -450,6 +472,33 @@ public class All { // Fallback: try to ask property resource uri from NodeManager return createStandardGraphPropertyVariable(graph, variable, propertyNode); } + // Final fallback: check types corresponding to + // node classification(s) and look for asserted + // properties from the URIs specified. + if (variable.node != null) { + try { + @SuppressWarnings("unchecked") + Set classifications = variable.node.support.manager.getClassifications(variable.node.node); + if (!classifications.isEmpty()) { + for (String uri : classifications) { + Resource type = graph.syncRequest( + new PossibleResource(uri), + TransientCacheAsyncListener.instance()); + if (type == null) + continue; + Map> pm = graph.syncRequest( + new UnescapedAssertedPropertyMapOfResource(type), + TransientCacheAsyncListener.instance()); + Pair pi = pm.get(name); + if (pi != null) { + return new StandardAssertedGraphPropertyVariable(graph, context, null, type, pi.first.predicate, pi.second); + } + } + } + } catch(NodeManagerException e) { + throw new DatabaseException(e); + } + } return null; } diff --git a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/request/UnescapedAssertedPropertyMapOfResource.java b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/request/UnescapedAssertedPropertyMapOfResource.java new file mode 100644 index 000000000..63413635c --- /dev/null +++ b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/request/UnescapedAssertedPropertyMapOfResource.java @@ -0,0 +1,65 @@ +/******************************************************************************* + * Copyright (c) 2017 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: + * Semantum Oy - initial API and implementation + *******************************************************************************/ +package org.simantics.db.layer0.request; + + import gnu.trove.map.hash.THashMap; + +import java.util.Collection; +import java.util.Map; + +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.Statement; +import org.simantics.db.common.procedure.adapter.TransientCacheAsyncListener; +import org.simantics.db.common.request.ResourceRead; +import org.simantics.db.exception.DatabaseException; +import org.simantics.layer0.Layer0; +import org.simantics.utils.datastructures.Pair; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Tuukka Lehtonen + * @since 1.27.0 + */ +public class UnescapedAssertedPropertyMapOfResource extends ResourceRead>> { + + private static final Logger LOGGER = LoggerFactory.getLogger(UnescapedAssertedPropertyMapOfResource.class); + + public UnescapedAssertedPropertyMapOfResource(Resource resource) { + super(resource); + } + + @Override + public Map> perform(ReadGraph graph) throws DatabaseException { + Layer0 L0 = Layer0.getInstance(graph); + Collection assertions = graph.getAssertedStatements(resource, L0.HasProperty); + THashMap> result = new THashMap<>(assertions.size()); + for (Statement stm : assertions) { + PropertyInfo info = graph.syncRequest(new PropertyInfoRequest(stm.getPredicate()), TransientCacheAsyncListener.instance()); + if (info != null && info.isHasProperty) { + String name = info.name; + // Use putIfAbsent because we want to prefer the results that are first, + // i.e. the ones deeper in the type inheritance chain. + if (result.putIfAbsent(name, Pair.make(info, stm.getObject())) != null) { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug(this + ": The database resource $" + resource.getResourceId() + + " asserts the multiple properties with the same name " + name + " (resource=$" + + info.predicate.getResourceId() + ")."); + } + } + } + } + return result; + } + +} diff --git a/bundles/org.simantics.issues.common/src/org/simantics/issues/common/All.java b/bundles/org.simantics.issues.common/src/org/simantics/issues/common/All.java index 6ff625c0b..9173101ee 100644 --- a/bundles/org.simantics.issues.common/src/org/simantics/issues/common/All.java +++ b/bundles/org.simantics.issues.common/src/org/simantics/issues/common/All.java @@ -76,5 +76,10 @@ public class All { return IssueUtils.pathString(uri, modelURI.length()+1); } } - + + @SCLValue(type = "ReadGraph -> Resource -> Variable -> [Resource]") + public static List standardIssueContexts(ReadGraph graph, Resource converter, Variable property) throws DatabaseException { + return IssueUtils.getContextsForProperty(graph, property); + } + } diff --git a/bundles/org.simantics.issues.ontology/graph.tg b/bundles/org.simantics.issues.ontology/graph.tg index d0ad31bf4c0463847af4658c7484b4f053f0fcaf..7ed3dc9244b9666e3f4ee14fddb9d004c6178f4a 100644 GIT binary patch literal 15208 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 Jj-;=U{|(6t!HEC> literal 14830 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 H6>u! diff --git a/bundles/org.simantics.issues.ontology/graph/Issue.pgraph b/bundles/org.simantics.issues.ontology/graph/Issue.pgraph index 3d428ed59..47a8160b5 100644 --- a/bundles/org.simantics.issues.ontology/graph/Issue.pgraph +++ b/bundles/org.simantics.issues.ontology/graph/Issue.pgraph @@ -33,6 +33,7 @@ ISSUE.Issue -- ISSUE.Issue.HasSeverity --> ISSUE.Severity -- ISSUE.Issue.HasContexts --> L0.List -- ISSUE.Issue.contexts ==> "[Resource]" -- ISSUE.Issue.severity ==> "String" -- ISSUE.Issue.resource ==> "String" -- ISSUE.Issue.path ==> "String" yn$ywNYE-P`OT|hnxrzU@^PhA+ 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 NUBrLa=lG5}`yUc*us8q! literal 15919 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%0DiJux(GjZT~m0wm%zn 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 EAB`_q7XSbN diff --git a/bundles/org.simantics.issues.ui.ontology/graph/IssueUI.pgraph b/bundles/org.simantics.issues.ui.ontology/graph/IssueUI.pgraph index abc2da18b..281bec912 100644 --- a/bundles/org.simantics.issues.ui.ontology/graph/IssueUI.pgraph +++ b/bundles/org.simantics.issues.ui.ontology/graph/IssueUI.pgraph @@ -14,7 +14,7 @@ UI = : L0.Ontology L0.HasResourceClass "org.simantics.issues.ui.ontology.IssueUIResource" //-------------------------------------------------------------------------- -// Functions +// Libraries UI.Functions : L0.Library @@ -43,6 +43,7 @@ ACTIONS.SeverityActionCategory : VP.ActionCategory ACTIONS.SetSeverityAction -- ACTIONS.SetSeverityAction.HasSeverity --> ISSUE.Severity - + + diff --git a/bundles/org.simantics.issues.ui/plugin.xml b/bundles/org.simantics.issues.ui/plugin.xml index e67d2e12b..584bd41ae 100644 --- a/bundles/org.simantics.issues.ui/plugin.xml +++ b/bundles/org.simantics.issues.ui/plugin.xml @@ -19,15 +19,6 @@ id="org.simantics.issues.category" name="Issues"> - T getAdapter(Class adapter) { + if (GraphExplorer.class == adapter) + return (T) tryGetExplorer(container); + if (BrowseContext.class == adapter) + return (T) tryGetBrowseContext(container); + return super.getAdapter(adapter); + } + + private BrowseContext tryGetBrowseContext(Control control) { + return SWTUtils.tryGetObject(control, c -> { + return c instanceof IAdaptable + ? (BrowseContext) ((IAdaptable) c).getAdapter(BrowseContext.class) + : null; + }); + } + + private GraphExplorer tryGetExplorer(Control control) { + return SWTUtils.tryGetObject(control, c -> { + return c.isDisposed() ? null + : (GraphExplorer) c.getData(GraphExplorer.KEY_GRAPH_EXPLORER); + }); + } + } diff --git a/bundles/org.simantics.issues.ui/src/org/simantics/issues/ui/handler/Help.java b/bundles/org.simantics.issues.ui/src/org/simantics/issues/ui/handler/Help.java new file mode 100644 index 000000000..ebdb5a4b2 --- /dev/null +++ b/bundles/org.simantics.issues.ui/src/org/simantics/issues/ui/handler/Help.java @@ -0,0 +1,64 @@ +/******************************************************************************* + * Copyright (c) 2017 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: + * Semantum Oy - initial API and implementation + *******************************************************************************/ +package org.simantics.issues.ui.handler; + +import org.eclipse.ui.PlatformUI; +import org.simantics.Simantics; +import org.simantics.databoard.Bindings; +import org.simantics.databoard.binding.Binding; +import org.simantics.db.ReadGraph; +import org.simantics.db.common.request.TernaryRead; +import org.simantics.db.common.utils.Logger; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.adapter.ActionFactory; +import org.simantics.db.layer0.variable.Variable; + +/** + * @author Tuukka Lehtonen + * @since 1.27.0 + */ +public class Help implements ActionFactory { + + @Override + public Runnable create(Object target) { + if (target instanceof Variable) { + return () -> { + try { + String id = Simantics.sync(new PossibleVariablePropertyValue((Variable) target, "contextualHelpId", Bindings.STRING)); + if (id == null) { + PlatformUI.getWorkbench().getHelpSystem().displayDynamicHelp(); + return; + } + PlatformUI.getWorkbench().getHelpSystem().displayHelp(id); + } catch (DatabaseException e) { + Logger.defaultLogError(e); + } + }; + } + + return null; + } + + static class PossibleVariablePropertyValue extends TernaryRead { + + public PossibleVariablePropertyValue(Variable variable, String property, Binding binding) { + super(variable, property, binding); + } + + @Override + public T perform(ReadGraph graph) throws DatabaseException { + return parameter.getPossiblePropertyValue(graph, parameter2, parameter3); + } + + } + +} diff --git a/bundles/org.simantics.issues.ui/src/org/simantics/issues/ui/handler/MenuActions.java b/bundles/org.simantics.issues.ui/src/org/simantics/issues/ui/handler/MenuActions.java index 032359731..b607eb7e1 100644 --- a/bundles/org.simantics.issues.ui/src/org/simantics/issues/ui/handler/MenuActions.java +++ b/bundles/org.simantics.issues.ui/src/org/simantics/issues/ui/handler/MenuActions.java @@ -39,7 +39,6 @@ import org.simantics.issues.common.IssueUtils; import org.simantics.issues.ontology.IssueResource; import org.simantics.issues.ui.internal.Activator; import org.simantics.ui.contribution.DynamicMenuContribution; -import org.simantics.utils.datastructures.Callback; import org.simantics.utils.ui.ErrorLogger; import org.simantics.utils.ui.ISelectionUtils; @@ -181,12 +180,9 @@ public class MenuActions extends DynamicMenuContribution { graph.deny(issue, ISSUE.Issue_HasSeverity); } } - }, new Callback() { - @Override - public void run(DatabaseException e) { - if (e != null) - ErrorLogger.defaultLogError(e); - } + }, e -> { + if (e != null) + ErrorLogger.defaultLogError(e); }); } diff --git a/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/OpenDiagramFromIssue.java b/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/OpenDiagramFromIssue.java index 8595d7374..6af1ff84b 100644 --- a/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/OpenDiagramFromIssue.java +++ b/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/OpenDiagramFromIssue.java @@ -27,10 +27,8 @@ import org.simantics.issues.ontology.IssueResource; import org.simantics.layer0.Layer0; import org.simantics.modeling.ModelingResources; import org.simantics.modeling.ui.Activator; -import org.simantics.structural.stubs.StructuralResource2; import org.simantics.ui.SimanticsUI; import org.simantics.ui.workbench.editor.AbstractResourceEditorAdapter; -import org.simantics.utils.datastructures.Pair; /** * @author Tuukka Lehtonen -- 2.47.1