From: Reino Ruusu Date: Wed, 20 Feb 2019 17:38:20 +0000 (+0200) Subject: Value type of dynamic symbol function to Maybe String X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F62%2F2662%2F4;p=simantics%2Fdistrict.git Value type of dynamic symbol function to Maybe String Also add caching for symbol functions. gitlab #27 Change-Id: I34ae22e6e1deae57bbf03ced6ba830c52ec74335 --- diff --git a/org.simantics.district.network.ontology/graph/DistrictNetworkProfiles.pgraph b/org.simantics.district.network.ontology/graph/DistrictNetworkProfiles.pgraph index d3734e63..a5c5cee5 100644 --- a/org.simantics.district.network.ontology/graph/DistrictNetworkProfiles.pgraph +++ b/org.simantics.district.network.ontology/graph/DistrictNetworkProfiles.pgraph @@ -31,4 +31,4 @@ DN.VertexSymbolStyle : DIA.Style DN.HasSymbolFunction L0.Value - ==> "Resource -> String" + ==> "Resource -> Maybe String" diff --git a/org.simantics.district.network/src/org/simantics/district/network/profile/VertexSymbolStyle.java b/org.simantics.district.network/src/org/simantics/district/network/profile/VertexSymbolStyle.java index 98078f82..96ff4392 100644 --- a/org.simantics.district.network/src/org/simantics/district/network/profile/VertexSymbolStyle.java +++ b/org.simantics.district.network/src/org/simantics/district/network/profile/VertexSymbolStyle.java @@ -1,31 +1,50 @@ package org.simantics.district.network.profile; +import org.simantics.Simantics; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; +import org.simantics.db.common.procedure.adapter.TransientCacheListener; +import org.simantics.db.common.request.ResourceRead; import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.exception.PendingVariableException; import org.simantics.district.network.ontology.DistrictNetworkResource; +import org.simantics.layer0.Layer0; import org.simantics.scenegraph.INode; import org.simantics.scenegraph.g2d.G2DSceneGraph; import org.simantics.scenegraph.g2d.nodes.SingleElementNode; import org.simantics.scenegraph.profile.EvaluationContext; import org.simantics.scenegraph.profile.common.ProfileVariables; import org.simantics.scl.runtime.function.Function; +import org.simantics.scl.runtime.function.FunctionImpl1; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class VertexSymbolStyle extends ThrottledStyleBase { + private static final Logger LOGGER = LoggerFactory.getLogger(VertexSymbolStyle.class); + @SuppressWarnings({ "rawtypes", "unchecked" }) @Override public String calculateThrottledStyle(ReadGraph graph, Resource runtimeDiagram, Resource entry, Resource groupItem) throws DatabaseException { - DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); - Resource symbolFunctionResource = graph.getPossibleObject(entry, DN.HasSymbolFunction); - if (symbolFunctionResource == null) - return null; - - Function symbolFunction = (Function) graph.getPossibleValue2(symbolFunctionResource, null); + + Function symbolFunction = getSymbolFunction(graph, entry); if (symbolFunction == null) return null; - return (String) symbolFunction.apply(graph, entry); + try { + return (String) Simantics.applySCLRead(graph, symbolFunction, groupItem); + } catch (PendingVariableException e) { + throw e; + } catch (Exception e) { + LOGGER.error("Getting dynamic symbol for " + groupItem + " (" + graph.getPossibleRelatedValue(groupItem, Layer0.getInstance(graph).HasName) + ") failed", e); + return null; + } + } + + @SuppressWarnings("rawtypes") + protected static Function getSymbolFunction(ReadGraph graph, Resource entry) throws DatabaseException { + // Cache function read for profile entry + return graph.syncRequest(new SymbolFunctionRequest(entry), TransientCacheListener.instance()); } @Override @@ -43,4 +62,29 @@ public class VertexSymbolStyle extends ThrottledStyleBase { ProfileVariables.claimNodeProperty(nn, "SVG", null, evaluationContext); } + @SuppressWarnings("rawtypes") + protected static final class SymbolFunctionRequest extends ResourceRead { + protected static final Function CONST_NULL = new FunctionImpl1() { + @Override + public String apply(Resource p0) { + return null; + } + }; + + public SymbolFunctionRequest(Resource entry) { + super(entry); + } + + @Override + public Function perform(ReadGraph graph) throws DatabaseException { + DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); + + Function symbolFunction = (Function) graph.getPossibleRelatedValue2(resource, DN.HasSymbolFunction, resource); + if (symbolFunction == null) + symbolFunction = CONST_NULL; + + return symbolFunction; + } + } + }