]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.structural2/src/org/simantics/structural2/variables/ActualConnectionDescriptor.java
Added null check after getPossibleType(STR.Component)
[simantics/platform.git] / bundles / org.simantics.structural2 / src / org / simantics / structural2 / variables / ActualConnectionDescriptor.java
index d066ad2d63bd9d52aa7da4f4f1ad879166107c58..f79bdb0b59187f7509a4b59c228cf0f53a12934d 100644 (file)
-package org.simantics.structural2.variables;\r
-\r
-import java.util.Collection;\r
-\r
-import org.simantics.databoard.Bindings;\r
-import org.simantics.databoard.util.URIStringUtils;\r
-import org.simantics.db.ReadGraph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.common.procedure.adapter.TransientCacheAsyncListener;\r
-import org.simantics.db.common.request.UnaryRead;\r
-import org.simantics.db.common.utils.NameUtils;\r
-import org.simantics.db.exception.DatabaseException;\r
-import org.simantics.db.layer0.variable.Variable;\r
-import org.simantics.layer0.Layer0;\r
-import org.simantics.modeling.ModelingResources;\r
-import org.simantics.structural.stubs.StructuralResource2;\r
-import org.simantics.structural2.Functions;\r
-import org.simantics.structural2.Functions.InterfaceResolution;\r
-import org.simantics.structural2.variables.ConnectionBrowser.IsLeafType;\r
-\r
-/*\r
- * This connection descriptor variable \r
- * -has not been lifted into interface\r
- * -has a structural configuration defined as resources\r
- * -has not been drilled\r
- */\r
-class ActualConnectionDescriptor extends AbstractVariableConnectionPointDescriptor {\r
-       \r
-       final private Variable root;\r
-       final private Resource component;\r
-       final private Resource cp;\r
-       \r
-       public ActualConnectionDescriptor(Variable root, Resource component, Resource cp) {\r
-               this.root = root;\r
-               this.component = component;\r
-               this.cp = cp;\r
-       }\r
-       \r
-       static class ComputeInterfaceDescription extends UnaryRead<ActualConnectionDescriptor, Collection<InterfaceResolution>> {\r
-\r
-               public ComputeInterfaceDescription(ActualConnectionDescriptor desc) {\r
-                       super(desc);\r
-               }\r
-\r
-               @Override\r
-               public Collection<InterfaceResolution> perform(ReadGraph graph) throws DatabaseException {\r
-                       \r
-               StructuralResource2 STR = StructuralResource2.getInstance(graph);\r
-               Resource type = graph.getPossibleType(parameter.component, STR.Component);\r
-               if(graph.syncRequest(new IsLeafType(type))) return null;\r
-\r
-                       return Functions.computeInterfacePaths(graph, parameter.getVariable(graph).getParent(graph));\r
-                       \r
-               }\r
-               \r
-       }\r
-       \r
-       @Override\r
-       public Collection<InterfaceResolution> getInterfaceDescription(ReadGraph graph) throws DatabaseException {\r
-               return graph.syncRequest(new ComputeInterfaceDescription(this), TransientCacheAsyncListener.<Collection<InterfaceResolution>>instance());\r
-       }\r
-       \r
-       public Resource getConnectionPointResource(ReadGraph graph) throws DatabaseException {\r
-               return cp;\r
-       }\r
-       \r
-       static class ComputeVariable extends UnaryRead<ActualConnectionDescriptor, Variable> {\r
-\r
-               public ComputeVariable(ActualConnectionDescriptor desc) {\r
-                       super(desc);\r
-               }\r
-\r
-               @Override\r
-               public Variable perform(ReadGraph graph) throws DatabaseException {\r
-                       \r
-               Variable c = ConnectionBrowser.resolve(graph, parameter.root, parameter.component);\r
-               if(c != null) {\r
-                       Variable cnp = c.getPossibleProperty(graph, parameter.cp);\r
-                       if(cnp != null) {\r
-                               return cnp;\r
-                       }\r
-               }\r
-               \r
-               throw new DatabaseException("Unresolved connection point (root=" + parameter.root.getURI(graph) + ", component=" + NameUtils.getURIOrSafeNameInternal(graph, parameter.component) + ", cp=" + NameUtils.getURIOrSafeNameInternal(graph, parameter.cp) + ")");\r
-                       \r
-               }\r
-               \r
-       }\r
-       \r
-       @Override\r
-       public Variable getVariable(ReadGraph graph) throws DatabaseException {\r
-               return graph.syncRequest(new ComputeVariable(this), TransientCacheAsyncListener.<Variable>instance());\r
-       }\r
-\r
-       @Override\r
-       public String getURI(ReadGraph graph) throws DatabaseException {\r
-               \r
-               Variable var = getVariable(graph);\r
-               return var.getURI(graph);\r
-               \r
-       }\r
-\r
-       @Override\r
-       public boolean isFlattenedFrom(ReadGraph graph, Variable possiblyStructuralCp) throws DatabaseException {\r
-\r
-               // This is a top-level configured connection point - we return true if possiblyStructuralCp is actually this connection point\r
-               \r
-               Resource otherCp = possiblyStructuralCp.getPossiblePredicateResource(graph);\r
-               if(!cp.equals(otherCp)) return false;\r
-\r
-               Variable otherComponentVariable = possiblyStructuralCp.getParent(graph);\r
-               \r
-               Resource otherComponent = otherComponentVariable.getPossibleRepresents(graph);\r
-               if(!component.equals(otherComponent)) return false;\r
-\r
-               Variable otherContainer = otherComponentVariable.getParent(graph);\r
-               if(otherContainer.equals(root)) return true;\r
-               \r
-               return getVariable(graph).equals(possiblyStructuralCp);\r
-               \r
-       }\r
-       \r
-       @Override\r
-       public String getRelativeRVI(ReadGraph graph, Variable base) throws DatabaseException {\r
-\r
-        Layer0 L0 = Layer0.getInstance(graph);\r
-        String cpName = graph.getRelatedValue(cp, L0.HasName, Bindings.STRING);\r
-               \r
-        if(cpName.startsWith("/")) {\r
-            ModelingResources MOD = ModelingResources.getInstance(graph);\r
-            if(graph.isInstanceOf(component, MOD.ReferenceElement)) {\r
-                return "#" + cpName;\r
-            }\r
-           }\r
-           \r
-               if(root.equals(base.getParent(graph))) {\r
-                       \r
-                       StringBuilder b = new StringBuilder();\r
-                       b.append("./");\r
-                       String cName = graph.getRelatedValue(component, L0.HasName, Bindings.STRING);\r
-                       b.append(URIStringUtils.escape(cName));\r
-                       b.append("#");\r
-                       b.append(cpName);\r
-                       \r
-                       return b.toString();\r
-                       \r
-               }\r
-\r
-               return super.getRelativeRVI(graph, base);\r
-\r
-       }\r
-       \r
+package org.simantics.structural2.variables;
+
+import java.util.Collection;
+
+import org.simantics.databoard.Bindings;
+import org.simantics.databoard.util.URIStringUtils;
+import org.simantics.db.ReadGraph;
+import org.simantics.db.Resource;
+import org.simantics.db.common.procedure.adapter.TransientCacheAsyncListener;
+import org.simantics.db.common.request.UnaryRead;
+import org.simantics.db.common.utils.NameUtils;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.layer0.variable.Variable;
+import org.simantics.layer0.Layer0;
+import org.simantics.modeling.ModelingResources;
+import org.simantics.structural.stubs.StructuralResource2;
+import org.simantics.structural2.DefinedUCInterfaceMap;
+import org.simantics.structural2.Functions;
+import org.simantics.structural2.Functions.InterfaceResolution;
+import org.simantics.structural2.utils.StructuralUtils.StructuralComponentClass;
+import org.simantics.structural2.variables.ConnectionBrowser.IsLeafType;
+
+/*
+ * This connection descriptor
+ * 
+ * -has not been lifted into interface
+ * -has a structural configuration defined as resources
+ * -might not be drilled
+ * 
+ * Note: these are constructed after climb (before drill) phase of the connection browser. This means that
+ * the component can still contain sub structure during connection browsing. This means that some descriptors
+ * are not final and are replaced by correct descriptors during drill phase.
+ * 
+ */
+class ActualConnectionDescriptor extends AbstractVariableConnectionPointDescriptor {
+       
+       /*
+        * This is the nearest known ancestor variable
+        */
+       final Variable root;
+       /*
+        * A component on variable path under the root variable.
+        */
+       final Resource component;
+       /*
+        * TODO
+        */
+       final Resource componentType;
+       /*
+        * The connection point that has type of the component as its domain
+        */
+       final Resource cp;
+       
+       public ActualConnectionDescriptor(Variable root, Resource component, Resource componentType, Resource cp) {
+               this.root = root;
+               this.component = component;
+               this.componentType = componentType;
+               this.cp = cp;
+       }
+       
+       static class ActualConnectionDescriptorInterfaceDescription extends UnaryRead<ActualConnectionDescriptor, Collection<InterfaceResolution>> {
+
+               public ActualConnectionDescriptorInterfaceDescription(ActualConnectionDescriptor desc) {
+                       super(desc);
+               }
+
+               @Override
+               public Collection<InterfaceResolution> perform(ReadGraph graph) throws DatabaseException {
+                       
+//                     ConnectionBrowser.reportDescriptor(graph, parameter);
+               
+               /*
+                * The componentType is the possibly replaced (STR.ReplaceableDefinedComponentType) type
+                */
+               StructuralComponentClass clazz = StructuralComponentClass.get(graph, parameter.componentType);
+               if(StructuralComponentClass.PRIMITIVE.equals(clazz)) {
+                       return null;
+               } else if(StructuralComponentClass.DEFINED.equals(clazz)) {
+                       final Collection<InterfaceResolution> interfaces = graph.syncRequest(new DefinedUCInterfaceMap(parameter.componentType));
+                       if(interfaces != null) return interfaces;
+                       else return Functions.BUILTIN_STRUCTURAL_CPS;
+               } else if(StructuralComponentClass.REPLACEABLE.equals(clazz)) {
+                       throw new DatabaseException("ConnectionBrowser does not support nested replaceable defined structural types.");
+               } else {
+                       return Functions.computeInterfacePaths(graph, parameter.getVariable(graph).getParent(graph));   
+               }
+                       
+               }
+               
+       }
+       
+       @Override
+       public boolean isLeaf(ReadGraph graph) throws DatabaseException {
+               
+               StructuralResource2 STR = StructuralResource2.getInstance(graph);
+               Resource type = graph.getPossibleType(component, STR.Component);
+               return type != null ? graph.syncRequest(new IsLeafType(type)) : false;
+               
+       }
+       
+       @Override
+       public Collection<InterfaceResolution> getInterfaceDescription(ReadGraph graph) throws DatabaseException {
+               return graph.syncRequest(new ActualConnectionDescriptorInterfaceDescription(this), TransientCacheAsyncListener.<Collection<InterfaceResolution>>instance());
+       }
+       
+       public Resource getConnectionPointResource(ReadGraph graph) throws DatabaseException {
+               return cp;
+       }
+       
+       static class ComputeVariable extends UnaryRead<ActualConnectionDescriptor, Variable> {
+
+               public ComputeVariable(ActualConnectionDescriptor desc) {
+                       super(desc);
+               }
+
+               @Override
+               public Variable perform(ReadGraph graph) throws DatabaseException {
+                       
+               Variable c = ConnectionBrowser.resolve(graph, parameter.root, parameter.component);
+               if(c != null) {
+                       Variable cnp = c.getPossibleProperty(graph, parameter.cp);
+                       if(cnp != null) {
+                               return cnp;
+                       }
+               }
+               
+               throw new DatabaseException("Unresolved connection point (root=" + parameter.root.getURI(graph) + ", component=" + NameUtils.getURIOrSafeNameInternal(graph, parameter.component) + ", cp=" + NameUtils.getURIOrSafeNameInternal(graph, parameter.cp) + ")");
+                       
+               }
+               
+       }
+       
+       @Override
+       public Variable getVariable(ReadGraph graph) throws DatabaseException {
+               return graph.syncRequest(new ComputeVariable(this), TransientCacheAsyncListener.<Variable>instance());
+       }
+
+       @Override
+       public String getURI(ReadGraph graph) throws DatabaseException {
+               
+               Variable var = getVariable(graph);
+               return var.getURI(graph);
+               
+       }
+
+       @Override
+       public boolean isFlattenedFrom(ReadGraph graph, Variable possiblyStructuralCp) throws DatabaseException {
+
+               // This is a top-level configured connection point - we return true if possiblyStructuralCp is actually this connection point
+               
+               Resource otherCp = possiblyStructuralCp.getPossiblePredicateResource(graph);
+               if(!cp.equals(otherCp)) return false;
+
+               Variable otherComponentVariable = possiblyStructuralCp.getParent(graph);
+               
+               Resource otherComponent = otherComponentVariable.getPossibleRepresents(graph);
+               if(!component.equals(otherComponent)) return false;
+
+               Variable otherContainer = otherComponentVariable.getParent(graph);
+               if(otherContainer.equals(root)) return true;
+               
+               return getVariable(graph).equals(possiblyStructuralCp);
+               
+       }
+       
+       @Override
+       public String getRelativeRVI(ReadGraph graph, Variable base) throws DatabaseException {
+
+        Layer0 L0 = Layer0.getInstance(graph);
+        String cpName = graph.getRelatedValue(cp, L0.HasName, Bindings.STRING);
+               
+        if(cpName.startsWith("/")) {
+            ModelingResources MOD = ModelingResources.getInstance(graph);
+            if(graph.isInstanceOf(component, MOD.ReferenceElement)) {
+                return "#" + cpName;
+            }
+           }
+           
+               if(root.equals(base.getParent(graph))) {
+                       
+                       StringBuilder b = new StringBuilder();
+                       b.append("./");
+                       String cName = graph.getRelatedValue(component, L0.HasName, Bindings.STRING);
+                       b.append(URIStringUtils.escape(cName));
+                       b.append("#");
+                       b.append(cpName);
+                       
+                       return b.toString();
+                       
+               }
+
+               return super.getRelativeRVI(graph, base);
+
+       }
+       
 }
\ No newline at end of file