X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.district.network%2Fsrc%2Forg%2Fsimantics%2Fdistrict%2Fnetwork%2Fprofile%2FVertexSymbolStyle.java;h=913ba201222bf705978d8abae418976475c7d935;hb=4ad7f53b7ed5bcd782ca39020e5e662d8d4c67a1;hp=98078f82f0ada9ebc70149801f2e6051109e9d4d;hpb=8958c9b265fc6a842c76714b60f0d99740434243;p=simantics%2Fdistrict.git 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..913ba201 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,58 @@ 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.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; +@Deprecated public class VertexSymbolStyle extends ThrottledStyleBase { - @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); - if (symbolFunction == null) - return null; - - return (String) symbolFunction.apply(graph, entry); + private static final Logger LOGGER = LoggerFactory.getLogger(VertexSymbolStyle.class); + + @Override + public String calculateThrottledStyle(ReadGraph graph, Resource runtimeDiagram, Resource entry, Resource groupItem) throws DatabaseException { + return calculateStyle(graph, entry, groupItem); + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public static String calculateStyle(ReadGraph graph, Resource entry, Resource groupItem) throws DatabaseException { + // Prevent PendingVariableExceptions from coming through + boolean wasSynchronous = graph.setSynchronous(true); + try { + Function symbolFunction = getSymbolFunction(graph, entry); + if (symbolFunction == null) + return null; + + try { + return (String) Simantics.applySCLRead(graph, symbolFunction, groupItem); + } catch (Exception e) { + LOGGER.error("Getting dynamic symbol for " + groupItem + " (" + + graph.getPossibleRelatedValue(groupItem, Layer0.getInstance(graph).HasName) + ") failed", e); + return null; + } + } finally { + graph.setSynchronous(wasSynchronous); + } + } + + @SuppressWarnings("rawtypes") + public 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 +70,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; + } + } + }