From a7f919c955f243e3cad9ab635c432367d02d0111 Mon Sep 17 00:00:00 2001 From: Antti Villberg Date: Thu, 1 Nov 2018 08:09:30 +0200 Subject: [PATCH] wip Change-Id: Icb7ed89f246349b0dbae93600ae029924a9e9610 --- .../org/simantics/db/layer0/function/All.java | 20 +-- .../db/layer0/scl/CompileValueRequest.java | 2 +- .../layer0/variable/ProxyVariableSupport.java | 10 ++ .../db/layer0/variable/ProxyVariables.java | 20 ++- .../simantics/debug/ui/VariableDebugger.java | 2 +- .../graph/Components.pgraph | 11 +- .../graph/Documentation.pgraph | 10 +- .../graph/Properties.pgraph | 2 +- .../scl/Document/All.scl | 8 + .../document/server/DocumentProperties.java | 14 ++ .../document/server/DocumentServerUtils.java | 152 +++++++++--------- .../simantics/document/server/Functions.java | 109 ++++++++----- .../document/server/request/NodeRequest.java | 60 ++----- .../simantics/structural2/ConnectionImpl.java | 87 ++++++++++ .../structural2/ConnectionImpl2.java | 48 ++++-- .../org/simantics/structural2/Functions.java | 78 ++++++++- .../scl/CompileStructuralValueRequest.java | 2 +- .../structural2/variables/Connection.java | 4 +- .../structural2/variables/Connection2.java | 26 +++ .../variables/ConnectionBrowser.java | 10 +- .../variables/FixedConnection.java | 150 +++++++++++++++++ .../StandardProceduralChildVariable.java | 107 +----------- 22 files changed, 612 insertions(+), 320 deletions(-) create mode 100644 bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/variable/ProxyVariableSupport.java create mode 100644 bundles/org.simantics.document.server/src/org/simantics/document/server/DocumentProperties.java create mode 100644 bundles/org.simantics.structural2/src/org/simantics/structural2/ConnectionImpl.java create mode 100644 bundles/org.simantics.structural2/src/org/simantics/structural2/variables/Connection2.java create mode 100644 bundles/org.simantics.structural2/src/org/simantics/structural2/variables/FixedConnection.java 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 f93023b77..6f6f9b3b8 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 @@ -1186,16 +1186,16 @@ public class All { return Functions.exec(graph, resource, graph, resource, context); } - @SCLValue(type = "ReadGraph -> Resource -> a -> b") - public static Object computeExpression(ReadGraph graph, Resource converter, Object context) throws DatabaseException { - if(context instanceof Variable) { - return CompileValueRequest.compileAndEvaluate(graph, (Variable)context); - } if (context instanceof Resource) { - return CompileResourceValueRequest.compileAndEvaluate(graph, (Resource)converter); - } else { - throw new IllegalStateException("Unknown context " + context); - } - } +// @SCLValue(type = "ReadGraph -> Resource -> a -> b") +// public static Object computeExpression(ReadGraph graph, Resource converter, Object context) throws DatabaseException { +// if(context instanceof Variable) { +// return CompileValueRequest.compileAndEvaluate(graph, (Variable)context); +// } if (context instanceof Resource) { +// return CompileResourceValueRequest.compileAndEvaluate(graph, (Resource)converter); +// } else { +// throw new IllegalStateException("Unknown context " + context); +// } +// } @SCLValue(type = "ReadGraph -> Resource -> a -> b") public static Object composedPropertyValue(ReadGraph graph, Resource converter, Object context) throws DatabaseException { diff --git a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/scl/CompileValueRequest.java b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/scl/CompileValueRequest.java index caa60900c..78998d289 100644 --- a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/scl/CompileValueRequest.java +++ b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/scl/CompileValueRequest.java @@ -52,7 +52,7 @@ public class CompileValueRequest extends AbstractExpressionCompilationRequest exp = graph.syncRequest(new CompileValueRequest(graph, context), TransientCacheListener.instance()); sclContext.put("graph", graph); diff --git a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/variable/ProxyVariableSupport.java b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/variable/ProxyVariableSupport.java new file mode 100644 index 000000000..9ae52c682 --- /dev/null +++ b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/variable/ProxyVariableSupport.java @@ -0,0 +1,10 @@ +package org.simantics.db.layer0.variable; + +import org.simantics.db.ReadGraph; + +public interface ProxyVariableSupport { + + Variable attachTo(ReadGraph graph, Variable parent); + Variable attachToRenamed(ReadGraph graph, Variable parent, String name); + +} diff --git a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/variable/ProxyVariables.java b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/variable/ProxyVariables.java index db552650b..8fa9bf426 100644 --- a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/variable/ProxyVariables.java +++ b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/variable/ProxyVariables.java @@ -4,8 +4,24 @@ import org.simantics.db.ReadGraph; import org.simantics.db.exception.DatabaseException; public class ProxyVariables { - - public static Variable inputVariable(ReadGraph graph, Variable context) throws DatabaseException { + + public static Variable tryToOwn(ReadGraph graph, Variable parent, Variable variable) { + if(variable instanceof ProxyVariableSupport) { + ProxyVariableSupport pvs = (ProxyVariableSupport)variable; + return pvs.attachTo(graph, parent); + } + return null; + } + + public static Variable tryToOwnRenamed(ReadGraph graph, Variable parent, Variable variable, String name) { + if(variable instanceof ProxyVariableSupport) { + ProxyVariableSupport pvs = (ProxyVariableSupport)variable; + return pvs.attachToRenamed(graph, parent, name); + } + return null; + } + + public static Variable inputVariable(ReadGraph graph, Variable context) throws DatabaseException { Variable session = graph.syncRequest(new ProxySessionRequest(context)); if(session == null) return null; String uri = session.getPossiblePropertyValue(graph, "inputURI"); diff --git a/bundles/org.simantics.debug.ui/src/org/simantics/debug/ui/VariableDebugger.java b/bundles/org.simantics.debug.ui/src/org/simantics/debug/ui/VariableDebugger.java index 9c02bbe2a..08342593f 100644 --- a/bundles/org.simantics.debug.ui/src/org/simantics/debug/ui/VariableDebugger.java +++ b/bundles/org.simantics.debug.ui/src/org/simantics/debug/ui/VariableDebugger.java @@ -694,7 +694,7 @@ public class VariableDebugger extends Composite { content.append("\n"); content.append("\n"); content.append("\n"); - content.append("\n"); + content.append("\n"); content.append("\n"); content.append("
URI").append(uri).append("
RVI").append(rviString).append("
Class").append(var.getClass().getCanonicalName()).append("
Class").append(var.getClass()).append("
Solver node").append(node).append("
\n"); content.append("\n"); diff --git a/bundles/org.simantics.document.base.ontology/graph/Components.pgraph b/bundles/org.simantics.document.base.ontology/graph/Components.pgraph index 099755380..3eb47b3a9 100644 --- a/bundles/org.simantics.document.base.ontology/graph/Components.pgraph +++ b/bundles/org.simantics.document.base.ontology/graph/Components.pgraph @@ -31,10 +31,6 @@ sclAttribute = COMPONENTS.sclAttribute : L0.Template L0.SCLValue.expression %command L0.default false -DOC.SCL : L0.SCLModule - L0.SCLModule.definition _ : L0.String - @L0.loadString "scl/Code.scl" - DOC.scl : L0.Template @template %subject %property %expression %valueType %subject @@ -49,7 +45,6 @@ DOC.sclValue : L0.Template L0.HasValueType %valueType DOC.SCLValue compileDocumentSCLValueExpression self""" "Variable -> String" @L0.assert L0.ConvertsToValueWith DOC.Functions.sclValue : L0.ExternalValue @@ -67,9 +62,7 @@ COMPONENTS.Component : L0.Ontology @L0.new L0.HasResourceClass "org.simantics.document.base.ontology.DocumentationResource" +Documentation.SCLMain : L0.SCLModule + L0.SCLModule.definition """ + include "Document/All" + """ + Documentation.connect : L0.Template @template %parent %relation %connection %child %parent @@ -122,13 +127,12 @@ Documentation.singleData : L0.Template Documentation.Relations : L0.Library + Documentation.Document -- Documentation.Properties.state - L0.Asserts _ : L0.Assertion - L0.HasPredicate Documentation.Properties.state - L0.HasObject FUNCTIONS.state + @L0.sclAssertion Documentation.Properties.state "stateVariable self" "Variable" >-- Documentation.Properties.session L0.Asserts _ : L0.Assertion L0.HasPredicate Documentation.Properties.session diff --git a/bundles/org.simantics.document.base.ontology/graph/Properties.pgraph b/bundles/org.simantics.document.base.ontology/graph/Properties.pgraph index d502e3d2f..e1c71fe97 100644 --- a/bundles/org.simantics.document.base.ontology/graph/Properties.pgraph +++ b/bundles/org.simantics.document.base.ontology/graph/Properties.pgraph @@ -52,7 +52,7 @@ PROPERTIES.model "Variable" PROPERTIES.primitiveProperties "String" + ==> "DocumentProperties" PROPERTIES.exists @defAttribute L0.Value diff --git a/bundles/org.simantics.document.server/scl/Document/All.scl b/bundles/org.simantics.document.server/scl/Document/All.scl index 4db639f5b..c6967b559 100644 --- a/bundles/org.simantics.document.server/scl/Document/All.scl +++ b/bundles/org.simantics.document.server/scl/Document/All.scl @@ -2,6 +2,9 @@ import "Simantics/DB" import "Simantics/Variables" import "JavaBuiltin" as Java +importJava "org.simantics.document.server.DocumentProperties" where + data DocumentProperties + importJava "org.simantics.document.server.io.IConsole" where data IConsole addMessage :: IConsole -> String -> () @@ -110,6 +113,9 @@ importJava "org.simantics.document.server.Functions" where dataDefinitions :: Variable -> [DataDefinition] + @JavaName "dataDefinitions" + computeDataDefinitions :: Variable -> [DataDefinition] + emptyOnClick :: () -> AbstractEventHandler writeEventHandler :: Variable -> (Variable -> (String -> Maybe String) -> String) -> AbstractEventHandler @@ -139,6 +145,8 @@ importJava "org.simantics.document.server.Functions" where compileDocumentSCLValueExpression :: Variable -> String + primitiveProperties :: DocumentProperties + propertyValueCached :: Serializable a => Typeable a => Variable -> String -> a propertyValueCached var prop = propertyValueCached_ var prop binding diff --git a/bundles/org.simantics.document.server/src/org/simantics/document/server/DocumentProperties.java b/bundles/org.simantics.document.server/src/org/simantics/document/server/DocumentProperties.java new file mode 100644 index 000000000..2951b9399 --- /dev/null +++ b/bundles/org.simantics.document.server/src/org/simantics/document/server/DocumentProperties.java @@ -0,0 +1,14 @@ +package org.simantics.document.server; + +import java.util.Collection; + +import org.simantics.db.ReadGraph; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.variable.Variable; + +public interface DocumentProperties { + + Collection getKeys(ReadGraph graph, Variable context) throws DatabaseException; + Object getValue(ReadGraph graph, Variable context, String key) throws DatabaseException; + +} diff --git a/bundles/org.simantics.document.server/src/org/simantics/document/server/DocumentServerUtils.java b/bundles/org.simantics.document.server/src/org/simantics/document/server/DocumentServerUtils.java index 5e1f5cc30..c87276461 100644 --- a/bundles/org.simantics.document.server/src/org/simantics/document/server/DocumentServerUtils.java +++ b/bundles/org.simantics.document.server/src/org/simantics/document/server/DocumentServerUtils.java @@ -19,12 +19,10 @@ import org.simantics.db.layer0.variable.ProxyChildVariable; import org.simantics.db.layer0.variable.Variable; import org.simantics.db.layer0.variable.Variables; import org.simantics.document.base.ontology.DocumentationResource; -import org.simantics.document.server.Functions.RootVariable; import org.simantics.document.server.request.NodeRequest; import org.simantics.document.server.request.NodeRequestUtils; import org.simantics.structural2.variables.Connection; import org.simantics.structural2.variables.VariableConnectionPointDescriptor; -import org.simantics.utils.datastructures.Pair; import org.simantics.utils.strings.AlphanumComparator; public class DocumentServerUtils { @@ -127,7 +125,7 @@ public class DocumentServerUtils { public static Variable getPossibleOtherConnectionPoint(ReadGraph graph, Variable connectionPoint, Connection conn) throws DatabaseException { - Collection descs = conn.getConnectionPointDescriptors(graph, null); + Collection descs = conn.getConnection2().getConnectionPointDescriptors(graph, connectionPoint.getParent(graph), null); if(descs.size() != 2) return null; for(VariableConnectionPointDescriptor desc : descs) { @@ -141,7 +139,7 @@ public class DocumentServerUtils { public static Variable getPossibleChildConnectionPoint(ReadGraph graph, Variable connectionPoint, Connection conn) throws DatabaseException { - Collection descs = conn.getConnectionPointDescriptors(graph, null); + Collection descs = conn.getConnection2().getConnectionPointDescriptors(graph, connectionPoint.getParent(graph), null); if(descs.size() != 2) return null; DocumentationResource DOC = DocumentationResource.getInstance(graph); @@ -174,7 +172,7 @@ public class DocumentServerUtils { public static Variable getPossibleCommandTriggerConnectionPoint(ReadGraph graph, Variable connectionPoint, Connection conn) throws DatabaseException { - Collection cpts = conn.getConnectionPoints(graph, null); + Collection cpts = conn.getConnection2().getConnectionPoints(graph, connectionPoint.getParent(graph), null); Variable result = null; @@ -192,7 +190,7 @@ public class DocumentServerUtils { public static Collection getPossibleOtherConnectionPoints(ReadGraph graph, Variable connectionPoint, Connection conn) throws DatabaseException { - Collection cpts = conn.getConnectionPoints(graph, null); + Collection cpts = conn.getConnection2().getConnectionPoints(graph, connectionPoint.getParent(graph), null); if(cpts.size() < 2) return Collections.emptyList(); @@ -208,9 +206,14 @@ public class DocumentServerUtils { if(node == null) return "root"; else { - String uri = node.getURI(graph); - int l = uri.lastIndexOf(ProxyChildVariable.CONTEXT_END); - return uri.substring(l+4); + String name = node.getName(graph); + if(ProxyChildVariable.CONTEXT_END.equals(name)) return ""; + else { + String parentId = getId(graph, node.getParent(graph)); + if(parentId.isEmpty()) return name; + else return parentId + "/" + name; + } + } } @@ -294,81 +297,72 @@ public class DocumentServerUtils { return variable.getProperties(graph, DOC.Document_AttributeRelation); } - public static class AttributesRequest extends VariableRead>> { - - public AttributesRequest(Variable variable) { - super(variable); - } - - @Override - public Pair> perform(ReadGraph graph) throws DatabaseException { - ArrayList statics = new ArrayList(); - DocumentationResource DOC = DocumentationResource.getInstance(graph); - - Variable primitives = variable.getProperty(graph, DOC.Properties_primitiveProperties); - for(Variable property : primitives.getProperties(graph)) { - statics.add(property); - // NO SUPPORT FOR DYNAMICS AT THIS STAGE - } - - JSONObject staticContent = computeStatic(graph, variable, statics); - - return new Pair>(staticContent, Collections.emptyList()); - - } - - JSONObject computeStatic(ReadGraph graph, Variable variable, ArrayList statics) throws DatabaseException { - - JSONObject base = graph.syncRequest(new org.simantics.document.server.request.DefaultFields(variable)); - JSONObject object = base.clone(); - - for(Variable attrib : statics) { - String name = attrib.getName(graph); - try { - if (name.equals(NodeRequest.PROPERTY_VALUE_EXCEPTIONS)) { - @SuppressWarnings("unchecked") - Map exceptions = (Map)DocumentServerUtils.getValue(graph, attrib); - - List errorList = object.getJSONField(NodeRequest.ERRORS); - if(errorList == null) - errorList = new ArrayList(); - - for (Map.Entry entry : exceptions.entrySet()) { - String errorMessage = NodeRequestUtils.formatErrorMessage(entry.getKey(), entry.getValue()); - errorList.add(errorMessage); - } - object.addJSONField(NodeRequest.ERRORS, errorList); - - } else { - Object value = DocumentServerUtils.getValue(graph, attrib); - object.addJSONField(name, value); - } - } catch (Throwable t) { - List errorList = object.getJSONField(NodeRequest.ERRORS); - if(errorList == null) - errorList = new ArrayList(); - - String errorMessage = NodeRequestUtils.formatErrorMessage(name, t); - - errorList.add(errorMessage); - object.addJSONField(NodeRequest.ERRORS, errorList); - } - - } - - return object; - - } - - } + public static class AttributesRequest extends VariableRead { + + public AttributesRequest(Variable variable) { + super(variable); + } + + @Override + public JSONObject perform(ReadGraph graph) throws DatabaseException { + + DocumentationResource DOC = DocumentationResource.getInstance(graph); + + DocumentProperties properties = variable.getPropertyValue(graph, DOC.Properties_primitiveProperties); + + return computeStatic(graph, variable, properties); + + } + + JSONObject computeStatic(ReadGraph graph, Variable variable, DocumentProperties statics) throws DatabaseException { + + JSONObject base = graph.syncRequest(new org.simantics.document.server.request.DefaultFields(variable)); + JSONObject object = base.clone(); + + for(String name : statics.getKeys(graph, variable)) { + try { + if (name.equals(NodeRequest.PROPERTY_VALUE_EXCEPTIONS)) { + @SuppressWarnings("unchecked") + Map exceptions = (Map)statics.getValue(graph, variable, name);//(Map)DocumentServerUtils.getValue(graph, attrib); + + List errorList = object.getJSONField(NodeRequest.ERRORS); + if(errorList == null) + errorList = new ArrayList(); + + for (Map.Entry entry : exceptions.entrySet()) { + String errorMessage = NodeRequestUtils.formatErrorMessage(entry.getKey(), entry.getValue()); + errorList.add(errorMessage); + } + object.addJSONField(NodeRequest.ERRORS, errorList); + + } else { + object.addJSONField(name, statics.getValue(graph, variable, name)); + } + } catch (Throwable t) { + List errorList = object.getJSONField(NodeRequest.ERRORS); + if(errorList == null) + errorList = new ArrayList(); + + String errorMessage = NodeRequestUtils.formatErrorMessage(name, t); + + errorList.add(errorMessage); + object.addJSONField(NodeRequest.ERRORS, errorList); + } + + } + + return object; + + } + + } public static Collection getDynamicAttributes(ReadGraph graph, final DocumentationResource DOC, Variable variable) throws DatabaseException { - Pair> attribs = graph.syncRequest(new AttributesRequest(variable)); - return attribs.second; + return Collections.emptyList(); } public static Variable getPossibleDocumentRootVariable(ReadGraph graph, Variable documentPart) throws DatabaseException { - if(documentPart instanceof RootVariable) return documentPart; + if(ProxyChildVariable.CONTEXT_END.equals(documentPart.getName(graph))) return documentPart; Variable parent = documentPart.getParent(graph); if(parent == null) return null; return getPossibleDocumentRootVariable(graph, parent); diff --git a/bundles/org.simantics.document.server/src/org/simantics/document/server/Functions.java b/bundles/org.simantics.document.server/src/org/simantics/document/server/Functions.java index aabe7b29f..13439c865 100644 --- a/bundles/org.simantics.document.server/src/org/simantics/document/server/Functions.java +++ b/bundles/org.simantics.document.server/src/org/simantics/document/server/Functions.java @@ -15,7 +15,6 @@ import org.simantics.databoard.Bindings; import org.simantics.databoard.Datatypes; import org.simantics.databoard.binding.Binding; import org.simantics.databoard.type.Datatype; -import org.simantics.db.AsyncReadGraph; import org.simantics.db.DirectStatements; import org.simantics.db.ReadGraph; import org.simantics.db.RequestProcessor; @@ -25,7 +24,7 @@ import org.simantics.db.Statement; import org.simantics.db.WriteGraph; import org.simantics.db.common.primitiverequest.Adapter; import org.simantics.db.common.procedure.adapter.TransientCacheListener; -import org.simantics.db.common.request.UnaryRead; +import org.simantics.db.common.request.BinaryRead; import org.simantics.db.common.request.UniqueRead; import org.simantics.db.common.request.WriteResultRequest; import org.simantics.db.common.utils.Logger; @@ -42,15 +41,14 @@ import org.simantics.db.layer0.scl.SCLDatabaseException; import org.simantics.db.layer0.variable.ConstantPropertyVariable; import org.simantics.db.layer0.variable.ProxyChildVariable; import org.simantics.db.layer0.variable.ProxySessionRequest; +import org.simantics.db.layer0.variable.ProxyVariableSupport; import org.simantics.db.layer0.variable.ProxyVariables; import org.simantics.db.layer0.variable.StandardAssertedGraphPropertyVariable; -import org.simantics.db.layer0.variable.StandardGraphChildVariable; import org.simantics.db.layer0.variable.StandardGraphPropertyVariable; import org.simantics.db.layer0.variable.Variable; import org.simantics.db.layer0.variable.VariableMap; import org.simantics.db.layer0.variable.VariableMapImpl; import org.simantics.db.layer0.variable.Variables; -import org.simantics.db.procedure.AsyncProcedure; import org.simantics.db.service.DirectQuerySupport; import org.simantics.document.base.ontology.DocumentationResource; import org.simantics.document.server.bean.Command; @@ -107,21 +105,6 @@ public class Functions { private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(Functions.class); - private static class PrimitivePropertyStatementsProcedure implements AsyncProcedure { - - public DirectStatements result; - - @Override - public void execute(AsyncReadGraph graph, DirectStatements result) { - this.result = result; - } - - @Override - public void exception(AsyncReadGraph graph, Throwable throwable) { - } - - } - @SCLValue(type = "VariableMap") public static VariableMap primitiveProperties = new VariableMapImpl() { private void storePropertyValueAndExceptions(ReadGraph graph, Variable parent, String name, Variable property, Map map) { @@ -229,11 +212,42 @@ public class Functions { }; + static class StandardDocumentProperties implements DocumentProperties { + + @Override + public Collection getKeys(ReadGraph graph, Variable context) throws DatabaseException { + + DocumentationResource DOC = DocumentationResource.getInstance(graph); + StandardGraphPropertyVariable asd = new StandardGraphPropertyVariable(graph, context, DOC.Properties_primitiveProperties); + Map ps = primitiveProperties.getVariables(graph, asd, null); + return ps.keySet(); + + } + + @Override + public Object getValue(ReadGraph graph, Variable context, String key) throws DatabaseException { + + DocumentationResource DOC = DocumentationResource.getInstance(graph); + StandardGraphPropertyVariable asd = new StandardGraphPropertyVariable(graph, context, DOC.Properties_primitiveProperties); + Map ps = primitiveProperties.getVariables(graph, asd, null); + return ps.get(key).getValue(graph); + + } + + } + + public static DocumentProperties primitiveProperties() throws DatabaseException { + return new StandardDocumentProperties(); + } + @SCLValue(type = "VariableMap") public static VariableMap inputSpaceChildren = new VariableMapImpl() { private Variable getProxy(ReadGraph graph, Variable context) throws DatabaseException { - Variable root = Variables.getRootVariable(graph); + System.err.println("getProxy " + context.getURI(graph)); + //System.err.println("getProxy " + context.getParent(graph).getURI(graph)); + Variable root = Variables.getVariable(graph, graph.getRootLibrary()); + //Variable parent = context.getParent(graph); return new DocumentProxyChildVariable(context, context, root, ProxyChildVariable.CONTEXT_BEGIN); } @@ -257,7 +271,7 @@ public class Functions { }; - static class DocumentProxyChildVariable extends ProxyChildVariable { + static class DocumentProxyChildVariable extends ProxyChildVariable implements ProxyVariableSupport { public DocumentProxyChildVariable(Variable base, Variable parent, Variable other, String name) { super(base, parent, other, name); @@ -269,13 +283,17 @@ public class Functions { } public Variable getPossibleChild(ReadGraph graph, String name) throws DatabaseException { + + System.err.println("possibleChild " + name + " for " + getURI(graph)); if(CONTEXT_END.equals(name)) { if(other instanceof ProxyChildVariable) { // The context is also a proxy - let it do the job return super.getPossibleChild(graph, name); } else { - return new RootVariable(this, base.getRepresents(graph)); + System.err.println("RootVariable for " + getURI(graph) + " from " + base.getURI(graph)); + return ProxyVariables.tryToOwnRenamed(graph, this, base, CONTEXT_END); + //return new RootVariable(this, base); } } @@ -283,36 +301,45 @@ public class Functions { } - public Collection getChildren(ReadGraph graph) throws DatabaseException { - - Collection result = super.getChildren(graph); - if(!(base instanceof ProxyChildVariable)) { - result.add(new RootVariable(this, base.getRepresents(graph))); - } - return result; - + @Override + public Variable attachTo(ReadGraph graph, Variable parent) { + return attachToRenamed(graph, parent, name); + } + + @Override + public Variable attachToRenamed(ReadGraph graph, Variable parent, String name) { + if(this.parent.equals(base)) + return new DocumentProxyChildVariable(parent, parent, other, name); + else + return new DocumentProxyChildVariable(base, parent, other, name); } } - static class RootVariable extends StandardGraphChildVariable { + /*static class RootVariable extends ProxyVariable { - public RootVariable(DocumentProxyChildVariable parent, Resource resource) { - super(parent, null, resource); + public RootVariable(DocumentProxyChildVariable parent, Variable proxy) { + super(parent, proxy); } @Override public String getName(ReadGraph graph) throws DatabaseException { return ProxyChildVariable.CONTEXT_END; } - - @SuppressWarnings("deprecation") + @Override - public Variable getNameVariable(ReadGraph graph) throws DatabaseException { - return new ConstantPropertyVariable(this, Variables.NAME, ProxyChildVariable.CONTEXT_END, Bindings.STRING); + public Variable getPossibleChild(ReadGraph graph, String name) throws DatabaseException { + System.err.println("Root.getPossibleChild " + name + " " + getURI(graph)); + return super.getPossibleChild(graph, name); + } + + @Override + public Collection getChildren(ReadGraph graph) throws DatabaseException { + System.err.println("Root.getChildren " + getURI(graph)); + return super.getChildren(graph); } - } + }*/ @SCLValue(type = "ReadGraph -> Resource -> Variable -> Variable") public static Variable input(ReadGraph graph, Resource converter, Variable context) throws DatabaseException { @@ -1200,6 +1227,8 @@ public class Functions { public static Object getPropertyValueCached(ReadGraph graph, Variable variable, String name, Binding binding) throws DatabaseException { Variable property = graph.syncRequest(new VariableProperty(variable, name)); + if(property == null) + System.err.println("faa"); return graph.syncRequest(new VariableValueWithBinding(property, binding)); } @@ -1252,11 +1281,11 @@ public class Functions { return true; } } else { - Variable parentCp = graph.sync(new UnaryRead(conn) { + Variable parentCp = graph.sync(new BinaryRead(widget, conn) { @Override public Variable perform(ReadGraph graph) throws DatabaseException { DocumentationResource DOC = DocumentationResource.getInstance(graph); - Collection descs = parameter.getConnectionPointDescriptors(graph, null); + Collection descs = parameter2.getConnection2().getConnectionPointDescriptors(graph, parameter, null); for(VariableConnectionPointDescriptor desc : descs) { if (DOC.Relations_partN.equals(desc.getConnectionPointResource(graph))) { diff --git a/bundles/org.simantics.document.server/src/org/simantics/document/server/request/NodeRequest.java b/bundles/org.simantics.document.server/src/org/simantics/document/server/request/NodeRequest.java index d9418db99..9367a151d 100644 --- a/bundles/org.simantics.document.server/src/org/simantics/document/server/request/NodeRequest.java +++ b/bundles/org.simantics.document.server/src/org/simantics/document/server/request/NodeRequest.java @@ -1,67 +1,28 @@ package org.simantics.document.server.request; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; - import org.simantics.db.ReadGraph; import org.simantics.db.exception.DatabaseException; import org.simantics.db.layer0.request.VariableRead; import org.simantics.db.layer0.variable.Variable; import org.simantics.document.server.DocumentServerUtils.AttributesRequest; import org.simantics.document.server.JSONObject; -import org.simantics.utils.datastructures.Pair; public class NodeRequest extends VariableRead { public static final String ERRORS = "Errors"; public static final String PROPERTY_VALUE_EXCEPTIONS = "_PropertyValueExceptions"; - - public NodeRequest(Variable node) { - super(node); - } - - @SuppressWarnings("unchecked") - @Override - public JSONObject perform(ReadGraph graph) throws DatabaseException { - - long s = System.nanoTime(); - - Pair> attribs = graph.syncRequest(new AttributesRequest(variable)); - - JSONObject staticContent = attribs.first; - if(attribs.second.isEmpty()) { - - if(DocumentRequest.PROFILE) { - long dura = System.nanoTime()-s; - if(dura > DocumentRequest.PROFILE_THRESHOLD_NODEREQUEST * 1e3) { - System.err.println("NodeRequest " + System.identityHashCode(this) + " in " + 1e-6*dura + "ms. " + variable.getURI(graph)); - } - } - - return staticContent; - } - Map dynamicContent = graph.syncRequest(new NodeRequestDynamic(variable)); - if(dynamicContent.isEmpty()) { - return staticContent; - } - - JSONObject result = staticContent.clone(); - result.add(dynamicContent); + public NodeRequest(Variable node) { + super(node); + } - if(dynamicContent.containsKey(ERRORS) || staticContent.getJSONField(ERRORS) != null) { - ArrayList errorList = new ArrayList<>(); + @SuppressWarnings("unchecked") + @Override + public JSONObject perform(ReadGraph graph) throws DatabaseException { - if(dynamicContent.containsKey(ERRORS)) - errorList.addAll((List)dynamicContent.get(ERRORS)); + long s = System.nanoTime(); - if(staticContent.getJSONField(ERRORS) != null) - errorList.addAll((List)staticContent.getJSONField(ERRORS)); - - result.addJSONField(ERRORS, errorList); - } + JSONObject staticContent = graph.syncRequest(new AttributesRequest(variable)); if(DocumentRequest.PROFILE) { long dura = System.nanoTime()-s; @@ -69,8 +30,9 @@ public class NodeRequest extends VariableRead { System.err.println("NodeRequest " + System.identityHashCode(this) + " in " + 1e-6*dura + "ms. " + variable.getURI(graph)); } } - - return result; + + + return staticContent; } diff --git a/bundles/org.simantics.structural2/src/org/simantics/structural2/ConnectionImpl.java b/bundles/org.simantics.structural2/src/org/simantics/structural2/ConnectionImpl.java new file mode 100644 index 000000000..b7f6661f7 --- /dev/null +++ b/bundles/org.simantics.structural2/src/org/simantics/structural2/ConnectionImpl.java @@ -0,0 +1,87 @@ +package org.simantics.structural2; + +import java.util.Collection; +import java.util.Set; + +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.variable.Variable; +import org.simantics.structural2.variables.Connection; +import org.simantics.structural2.variables.Connection2; +import org.simantics.structural2.variables.ConnectionBrowser; +import org.simantics.structural2.variables.VariableConnectionPointDescriptor; + +import gnu.trove.set.hash.THashSet; + +public class ConnectionImpl implements Connection { + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((component == null) ? 0 : component.hashCode()); + result = prime * result + ((predicate == null) ? 0 : predicate.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ConnectionImpl other = (ConnectionImpl) obj; + if (component == null) { + if (other.component != null) + return false; + } else if (!component.equals(other.component)) + return false; + if (predicate == null) { + if (other.predicate != null) + return false; + } else if (!predicate.equals(other.predicate)) + return false; + return true; + } + + final private Variable component; + final private Resource predicate; + + public ConnectionImpl(Variable component, Resource predicate) { + this.component = component; + this.predicate = predicate; + } + + @Override + public Collection getConnectionPoints(ReadGraph graph, Resource relationType) throws DatabaseException { + Set result = new THashSet(); + for(VariableConnectionPointDescriptor desc : ConnectionBrowser.flatten(graph, component, predicate, relationType)) { + result.add(desc.getVariable(graph)); + } + return result; + } + + @Override + public Collection getConnectionPointURIs(ReadGraph graph, Resource relationType) throws DatabaseException { + Set result = new THashSet(); + for(VariableConnectionPointDescriptor desc : ConnectionBrowser.flatten(graph, component, predicate, relationType)) { + result.add(desc.getURI(graph)); + } + return result; + } + + @Override + public Collection getConnectionPointDescriptors(ReadGraph graph, + Resource relationType) throws DatabaseException { + return ConnectionBrowser.flatten(graph, component, predicate, relationType); + } + + @Override + public Connection2 getConnection2() { + return new ConnectionImpl2(predicate); + } + +} \ No newline at end of file diff --git a/bundles/org.simantics.structural2/src/org/simantics/structural2/ConnectionImpl2.java b/bundles/org.simantics.structural2/src/org/simantics/structural2/ConnectionImpl2.java index e4b898a6b..76af826a8 100644 --- a/bundles/org.simantics.structural2/src/org/simantics/structural2/ConnectionImpl2.java +++ b/bundles/org.simantics.structural2/src/org/simantics/structural2/ConnectionImpl2.java @@ -14,23 +14,23 @@ package org.simantics.structural2; import java.util.Collection; import java.util.Set; +import org.simantics.databoard.binding.error.UnsupportedOperationException; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.exception.DatabaseException; import org.simantics.db.layer0.variable.Variable; import org.simantics.structural2.variables.Connection; +import org.simantics.structural2.variables.Connection2; import org.simantics.structural2.variables.ConnectionBrowser; import org.simantics.structural2.variables.VariableConnectionPointDescriptor; import gnu.trove.set.hash.THashSet; -public class ConnectionImpl2 implements Connection { +public class ConnectionImpl2 implements Connection, Connection2 { - private final Variable component; private final Resource predicate; - public ConnectionImpl2(Variable component, Resource predicate) { - this.component = component; + public ConnectionImpl2(Resource predicate) { this.predicate = predicate; } @@ -60,26 +60,50 @@ public class ConnectionImpl2 implements Connection { } @Override - public Collection getConnectionPoints(ReadGraph graph, Resource relationType) throws DatabaseException { - Set result = new THashSet(); + public Collection getConnectionPointURIs(ReadGraph graph, Variable component, Resource relationType) + throws DatabaseException { + Set result = new THashSet(); for(VariableConnectionPointDescriptor desc : ConnectionBrowser.flatten(graph, component, predicate, relationType)) { - result.add(desc.getVariable(graph)); + result.add(desc.getURI(graph)); } return result; } - + @Override - public Collection getConnectionPointURIs(ReadGraph graph, Resource relationType) throws DatabaseException { - Set result = new THashSet(); + public Collection getConnectionPoints(ReadGraph graph, Variable component, Resource relationType) + throws DatabaseException { + Set result = new THashSet(); for(VariableConnectionPointDescriptor desc : ConnectionBrowser.flatten(graph, component, predicate, relationType)) { - result.add(desc.getURI(graph)); + result.add(desc.getVariable(graph)); } return result; } @Override - public Collection getConnectionPointDescriptors(ReadGraph graph, Resource relationType) throws DatabaseException { + public Collection getConnectionPointDescriptors(ReadGraph graph, + Variable component, Resource relationType) throws DatabaseException { return ConnectionBrowser.flatten(graph, component, predicate, relationType); } + @Override + public Collection getConnectionPointURIs(ReadGraph graph, Resource relationType) throws DatabaseException { + throw new IllegalStateException(); + } + + @Override + public Collection getConnectionPoints(ReadGraph graph, Resource relationType) throws DatabaseException { + throw new IllegalStateException(); + } + + @Override + public Collection getConnectionPointDescriptors(ReadGraph graph, + Resource relationType) throws DatabaseException { + throw new IllegalStateException(); + } + + @Override + public Connection2 getConnection2() { + return this; + } + } \ No newline at end of file diff --git a/bundles/org.simantics.structural2/src/org/simantics/structural2/Functions.java b/bundles/org.simantics.structural2/src/org/simantics/structural2/Functions.java index d89026a79..fd4151b2e 100644 --- a/bundles/org.simantics.structural2/src/org/simantics/structural2/Functions.java +++ b/bundles/org.simantics.structural2/src/org/simantics/structural2/Functions.java @@ -180,7 +180,7 @@ public class Functions { @Override public Object getValue(ReadGraph graph, Variable context) throws DatabaseException { StandardGraphPropertyVariable variable = (StandardGraphPropertyVariable)context; - return new ConnectionImpl2(context.getParent(graph), variable.property.predicate); + return new ConnectionImpl(context.getParent(graph), variable.property.predicate); } @Override @@ -308,6 +308,82 @@ public class Functions { } + public static class StructuralChildMapOfResource extends ResourceRead> { + + public StructuralChildMapOfResource(Resource resource) { + super(resource); + } + + @Override + public Map perform(ReadGraph graph) throws DatabaseException { + StructuralResource2 STR = StructuralResource2.getInstance(graph); + Resource type = graph.getPossibleType(resource, STR.Component); + if(type != null) { + Resource definition = graph.getPossibleObject(type, STR.IsDefinedBy); + if(definition != null) { + Map map = graph.syncRequest(new UnescapedChildMapOfResource(definition)); + if (!map.isEmpty()) + return map; + } + } + Map directChildren = graph.syncRequest(new UnescapedChildMapOfResource(resource)); + return directChildren; + } + + } + + public static class StructuralChildMapOfResourceT extends ResourceRead> { + + public StructuralChildMapOfResourceT(Resource resource) { + super(resource); + } + + @Override + public Map perform(ReadGraph graph) throws DatabaseException { + StructuralResource2 STR = StructuralResource2.getInstance(graph); + Resource definition = graph.getPossibleObject(resource, STR.IsDefinedBy); + if(definition != null) { + Map map = graph.syncRequest(new UnescapedChildMapOfResource(definition)); + if (!map.isEmpty()) + return map; + } + return Collections.emptyMap(); + } + + } + + static class StructuralRunChildMapOfResource extends ResourceRead> { + + public StructuralRunChildMapOfResource(Resource resource) { + super(resource); + } + + public Map fromContext(ReadGraph graph, Resource context) throws DatabaseException { + return graph.sync(new StructuralChildMapOfResource(context)); + } + + @Override + public Map perform(ReadGraph graph) throws DatabaseException { + + Layer0 L0 = Layer0.getInstance(graph); + SimulationResource SIMU = SimulationResource.getInstance(graph); + Resource model = graph.sync(new PossibleIndexRoot(resource)); + if(graph.isInstanceOf(model, L0.RVIContext)) { + return fromContext(graph, model); + } + Resource configuration = graph.getPossibleObject(model, SIMU.HasConfiguration); + if(configuration != null) { + if(graph.isInstanceOf(configuration, L0.RVIContext)) { + return fromContext(graph, configuration); + } + } + + return Collections.emptyMap(); + + } + + } + private static class SubstructureRequest extends VariableRead> { public SubstructureRequest(Variable context) { super(context); diff --git a/bundles/org.simantics.structural2/src/org/simantics/structural2/scl/CompileStructuralValueRequest.java b/bundles/org.simantics.structural2/src/org/simantics/structural2/scl/CompileStructuralValueRequest.java index 7a8eb715f..5c0e679c5 100644 --- a/bundles/org.simantics.structural2/src/org/simantics/structural2/scl/CompileStructuralValueRequest.java +++ b/bundles/org.simantics.structural2/src/org/simantics/structural2/scl/CompileStructuralValueRequest.java @@ -48,7 +48,7 @@ public class CompileStructuralValueRequest extends AbstractCompileStructuralValu sclContext.put("graph", oldGraph); } } - + public static Function1 compile(ReadGraph graph, Resource s, Resource o, Resource p) throws DatabaseException { return graph.syncRequest(new CompileStructuralValueRequest(s, o, p), TransientCacheListener.instance()); } diff --git a/bundles/org.simantics.structural2/src/org/simantics/structural2/variables/Connection.java b/bundles/org.simantics.structural2/src/org/simantics/structural2/variables/Connection.java index b404932e7..6343be4a2 100644 --- a/bundles/org.simantics.structural2/src/org/simantics/structural2/variables/Connection.java +++ b/bundles/org.simantics.structural2/src/org/simantics/structural2/variables/Connection.java @@ -21,5 +21,7 @@ public interface Connection { Collection getConnectionPoints(ReadGraph graph, Resource relationType) throws DatabaseException; Collection getConnectionPointDescriptors(ReadGraph graph, Resource relationType) throws DatabaseException; - + + Connection2 getConnection2(); + } diff --git a/bundles/org.simantics.structural2/src/org/simantics/structural2/variables/Connection2.java b/bundles/org.simantics.structural2/src/org/simantics/structural2/variables/Connection2.java new file mode 100644 index 000000000..0751ea21a --- /dev/null +++ b/bundles/org.simantics.structural2/src/org/simantics/structural2/variables/Connection2.java @@ -0,0 +1,26 @@ +package org.simantics.structural2.variables; + +import java.util.Collection; + +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.variable.Variable; + +public interface Connection2 { + + + /** + * Return absolute URIs of the connection points. An optional (may be null) relationType may be used + * to filter the returned connection points. + */ + Collection getConnectionPointURIs(ReadGraph graph, Variable component, Resource relationType) throws DatabaseException; + /** + * Return the connection points. An optional (may be null) relationType may be used + * to filter the returned connection points. + */ + Collection getConnectionPoints(ReadGraph graph, Variable component, Resource relationType) throws DatabaseException; + + Collection getConnectionPointDescriptors(ReadGraph graph, Variable component, Resource relationType) throws DatabaseException; + +} diff --git a/bundles/org.simantics.structural2/src/org/simantics/structural2/variables/ConnectionBrowser.java b/bundles/org.simantics.structural2/src/org/simantics/structural2/variables/ConnectionBrowser.java index b2b92039f..4339049ec 100644 --- a/bundles/org.simantics.structural2/src/org/simantics/structural2/variables/ConnectionBrowser.java +++ b/bundles/org.simantics.structural2/src/org/simantics/structural2/variables/ConnectionBrowser.java @@ -36,7 +36,6 @@ import org.simantics.structural2.Functions.InterfaceResolution; import org.simantics.structural2.queries.ConnectionSet; import org.simantics.structural2.utils.StructuralUtils; import org.simantics.structural2.utils.StructuralUtils.StructuralComponentClass; -import org.simantics.structural2.variables.StandardProceduralChildVariable.FixedConnection; import org.simantics.utils.datastructures.Pair; import gnu.trove.map.hash.THashMap; @@ -338,14 +337,9 @@ public class ConnectionBrowser { Variable conn = child.getPossibleProperty(graph, cp); FixedConnection fc = (FixedConnection)conn.getValue(graph); - Set result = new THashSet(1+fc.cps.size()); + Set result = new THashSet(1+fc.size()); result.add(new ComponentConnectionDescriptor(child, cp));// (graph, STR, curConfiguration, "/" + c.name + "#" + conn.getName(graph))); - for(Pair cpzz : fc.cps) { - if(cpzz.first == null) { - throw new DatabaseException("Lifted connection was not resolved."); - } - result.add(new PairConnectionDescriptor(curConfiguration, cpzz)); - } + fc.addConnectionDescriptors(graph, curConfiguration, result); return result; } else { diff --git a/bundles/org.simantics.structural2/src/org/simantics/structural2/variables/FixedConnection.java b/bundles/org.simantics.structural2/src/org/simantics/structural2/variables/FixedConnection.java new file mode 100644 index 000000000..3f5219e61 --- /dev/null +++ b/bundles/org.simantics.structural2/src/org/simantics/structural2/variables/FixedConnection.java @@ -0,0 +1,150 @@ +package org.simantics.structural2.variables; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Set; + +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.variable.Variable; +import org.simantics.utils.datastructures.Pair; + +import gnu.trove.set.hash.THashSet; + +public class FixedConnection implements Connection, Connection2 { + + final private Variable parent; + + final private Collection> cps = new ArrayList>(); + + public FixedConnection(Variable parent) { + this.parent = parent; + } + + public void addAll(List> cps) throws DatabaseException { + for(Pair cp : cps) { + this.cps.add(cp); + } + } + + public int size() { + return cps.size(); + } + + public void addConnectionDescriptors(ReadGraph graph, Variable curConfiguration, Collection result) throws DatabaseException { + for(Pair cpzz : cps) { + // This is a connection to an interface terminal. It is handled by ConnectionBrowser in separate logic. Do not include it here. + if(cpzz.first == null) continue; + /*if(cpzz.first == null) { + String message = "Lifted connection was not resolved. Child = " + parent.getURI(graph); + throw new DatabaseException(message); + }*/ + result.add(new PairConnectionDescriptor(curConfiguration, cpzz)); + } + } + + @Override + public Collection getConnectionPoints(ReadGraph graph, Resource relationType) throws DatabaseException { + return getConnectionPoints(graph, parent, relationType); + } + + @Override + public Collection getConnectionPointURIs(ReadGraph graph, Resource relationType) throws DatabaseException { + return getConnectionPointURIs(graph, parent, relationType); + + } + + @Override + public Collection getConnectionPointDescriptors(ReadGraph graph, Resource relationType) throws DatabaseException { + return getConnectionPointDescriptors(graph, parent, relationType); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((cps == null) ? 0 : cps.hashCode()); + result = prime * result + + ((parent == null) ? 0 : parent.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + FixedConnection other = (FixedConnection) obj; + if (cps == null) { + if (other.cps != null) + return false; + } else if (!cps.equals(other.cps)) + return false; + if (parent == null) { + if (other.parent != null) + return false; + } else if (!parent.equals(other.parent)) + return false; + return true; + } + + @Override + public Collection getConnectionPointDescriptors(ReadGraph graph, + Variable parent, Resource relationType) throws DatabaseException { + Set result = new THashSet(); + for(Pair cp : cps) { + Variable component = cp.first == null ? parent : parent.getChild(graph, cp.first); + Variable cp2 = component.getPossibleProperty(graph, cp.second); + if(cp2 != null) + result.addAll(ConnectionBrowser.flatten(graph, component, cp.second, relationType)); + else + StandardProceduralChildVariable.LOGGER.warn("no cp " + cp.first + " for " + component.getURI(graph)); + } + return result; + } + + @Override + public Collection getConnectionPoints(ReadGraph graph, Variable parent, Resource relationType) + throws DatabaseException { + Set result = new THashSet(); + for(Pair cp : cps) { + Variable component = cp.first == null ? parent : parent.getChild(graph, cp.first); + Variable cp2 = component.getPossibleProperty(graph, cp.second); + if(cp2 != null) + for(VariableConnectionPointDescriptor desc : ConnectionBrowser.flatten(graph, component, cp.second, relationType)) { + result.add(desc.getVariable(graph)); + } + else + StandardProceduralChildVariable.LOGGER.warn("no cp " + cp.first + " for " + component.getURI(graph)); + } + return result; + } + + @Override + public Collection getConnectionPointURIs(ReadGraph graph, Variable parent, Resource relationType) + throws DatabaseException { + Set result = new THashSet(); + for(Pair cp : cps) { + Variable component = cp.first == null ? parent : parent.getChild(graph, cp.first); + Variable cp2 = component.getPossibleProperty(graph, cp.second); + if(cp2 != null) + for(VariableConnectionPointDescriptor desc : ConnectionBrowser.flatten(graph, component, cp.second, relationType)) { + result.add(desc.getURI(graph)); + } + else + StandardProceduralChildVariable.LOGGER.warn("no cp " + cp.first + " for " + component.getURI(graph)); + } + return result; + } + + @Override + public Connection2 getConnection2() { + return this; + } + +} \ No newline at end of file diff --git a/bundles/org.simantics.structural2/src/org/simantics/structural2/variables/StandardProceduralChildVariable.java b/bundles/org.simantics.structural2/src/org/simantics/structural2/variables/StandardProceduralChildVariable.java index f133adee0..13ef05145 100644 --- a/bundles/org.simantics.structural2/src/org/simantics/structural2/variables/StandardProceduralChildVariable.java +++ b/bundles/org.simantics.structural2/src/org/simantics/structural2/variables/StandardProceduralChildVariable.java @@ -1,8 +1,5 @@ package org.simantics.structural2.variables; -import gnu.trove.map.hash.THashMap; -import gnu.trove.set.hash.THashSet; - import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -39,9 +36,11 @@ import org.simantics.structural2.procedural.Terminal; import org.simantics.utils.datastructures.Pair; import org.slf4j.LoggerFactory; +import gnu.trove.map.hash.THashMap; + public class StandardProceduralChildVariable extends AbstractChildVariable { - private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(StandardProceduralChildVariable.class); + static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(StandardProceduralChildVariable.class); /* * Extension points * @@ -64,103 +63,7 @@ public class StandardProceduralChildVariable extends AbstractChildVariable { final private Map properties; final private List propertyIdentity; - public static class FixedConnection implements org.simantics.structural2.variables.Connection { - - final public Collection> cps = new ArrayList>(); - - final private Variable parent; - - public FixedConnection(Variable parent) { - this.parent = parent; - } - - @Override - public Collection getConnectionPoints(ReadGraph graph, Resource relationType) throws DatabaseException { - - Set result = new THashSet(); - for(Pair cp : cps) { - Variable component = cp.first == null ? parent : parent.getChild(graph, cp.first); - Variable cp2 = component.getPossibleProperty(graph, cp.second); - if(cp2 != null) - for(VariableConnectionPointDescriptor desc : ConnectionBrowser.flatten(graph, component, cp.second, relationType)) { - result.add(desc.getVariable(graph)); - } - else - LOGGER.warn("no cp " + cp.first + " for " + component.getURI(graph)); - } - return result; - - } - - @Override - public Collection getConnectionPointURIs(ReadGraph graph, Resource relationType) throws DatabaseException { - - Set result = new THashSet(); - for(Pair cp : cps) { - Variable component = cp.first == null ? parent : parent.getChild(graph, cp.first); - Variable cp2 = component.getPossibleProperty(graph, cp.second); - if(cp2 != null) - for(VariableConnectionPointDescriptor desc : ConnectionBrowser.flatten(graph, component, cp.second, relationType)) { - result.add(desc.getURI(graph)); - } - else - LOGGER.warn("no cp " + cp.first + " for " + component.getURI(graph)); - } - return result; - - } - - @Override - public Collection getConnectionPointDescriptors(ReadGraph graph, Resource relationType) throws DatabaseException { - - Set result = new THashSet(); - for(Pair cp : cps) { - Variable component = cp.first == null ? parent : parent.getChild(graph, cp.first); - Variable cp2 = component.getPossibleProperty(graph, cp.second); - if(cp2 != null) - result.addAll(ConnectionBrowser.flatten(graph, component, cp.second, relationType)); - else - LOGGER.warn("no cp " + cp.first + " for " + component.getURI(graph)); - } - return result; - - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((cps == null) ? 0 : cps.hashCode()); - result = prime * result - + ((parent == null) ? 0 : parent.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - FixedConnection other = (FixedConnection) obj; - if (cps == null) { - if (other.cps != null) - return false; - } else if (!cps.equals(other.cps)) - return false; - if (parent == null) { - if (other.parent != null) - return false; - } else if (!parent.equals(other.parent)) - return false; - return true; - } - - } - - public StandardProceduralChildVariable(ReadGraph graph, Variable parent, VariableNode node, String name, Resource type, List properties, Collection conns) throws DatabaseException { + public StandardProceduralChildVariable(ReadGraph graph, Variable parent, VariableNode node, String name, Resource type, List properties, Collection conns) throws DatabaseException { super(node); assert name != null; assert type != null; @@ -242,7 +145,7 @@ public class StandardProceduralChildVariable extends AbstractChildVariable { fc = new FixedConnection(parent); map.put(p, fc); } - fc.cps.addAll(cps); + fc.addAll(cps); } } for(Map.Entry entry : map.entrySet()) { -- 2.47.1