X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.structural2%2Fsrc%2Forg%2Fsimantics%2Fstructural2%2Fvariables%2FConnectionBrowser.java;h=60fee19b20b9298aebe90b086d4788f445ad9b8a;hb=69d61f8a5c49c5b6044f6e0cbc0723fa2e6ef164;hp=ac1dceceb3ddfce6739ece5c01909ebc7c618c7a;hpb=0ae2b770234dfc3cbb18bd38f324125cf0faca07;p=simantics%2Fplatform.git 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 ac1dceceb..60fee19b2 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 @@ -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; @@ -20,8 +17,8 @@ import org.simantics.db.common.procedure.adapter.TransientCacheAsyncListener; import org.simantics.db.common.request.BinaryRead; import org.simantics.db.common.request.ResourceRead; import org.simantics.db.common.request.TransientUnaryRead; -import org.simantics.db.common.utils.CommonDBUtils; import org.simantics.db.common.utils.NameUtils; +import org.simantics.db.common.utils.NearestOwnerFinder; import org.simantics.db.exception.DatabaseException; import org.simantics.db.exception.NoSingleResultException; import org.simantics.db.layer0.exception.MissingVariableException; @@ -36,8 +33,11 @@ import org.simantics.structural.stubs.StructuralResource2; import org.simantics.structural2.Functions; import org.simantics.structural2.Functions.InterfaceResolution; import org.simantics.structural2.queries.ConnectionSet; -import org.simantics.structural2.variables.StandardProceduralChildVariable.FixedConnection; -import org.simantics.utils.datastructures.Pair; +import org.simantics.structural2.utils.StructuralUtils; +import org.simantics.structural2.utils.StructuralUtils.StructuralComponentClass; + +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.hash.THashSet; public class ConnectionBrowser { @@ -79,7 +79,7 @@ public class ConnectionBrowser { Resource relation = graph.getInverse(stat.getPredicate()); //System.out.println(NameUtils.getSafeName(graph, component) + "." + NameUtils.getSafeName(graph, relation)); Resource boundConnection = graph.getPossibleObject(relation, STR.IsBoundBy); - Resource type = graph.getPossibleObject(component, L0.InstanceOf); + Resource type = StructuralUtils.getPossibleComponentType(graph, configuration, component); Resource def = type != null ? graph.getPossibleObject(type, STR.IsDefinedBy) : null; if(boundConnection != null && def != null) { // The connection point is bound in component type @@ -274,7 +274,7 @@ public class ConnectionBrowser { for (Resource composite : graph.getObjects(join, STR.JoinsComposite)) ancestorGenerators.add(composite); } - Resource ancestor = ancestorGenerators.size() == 1 ? ancestorGenerators.iterator().next() : CommonDBUtils.getNearestOwner(graph, ancestorGenerators); + Resource ancestor = ancestorGenerators.size() == 1 ? ancestorGenerators.iterator().next() : NearestOwnerFinder.getNearestOwnerFromDirectOwners(graph, ancestorGenerators); List result = colls.createList(); result.add(ancestor); @@ -335,14 +335,9 @@ public class ConnectionBrowser { Variable conn = child.getPossibleProperty(graph, cp); FixedConnection fc = (FixedConnection)conn.getValue(graph); - Set result = new THashSet(1+fc.cps.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)); - } + Set result = new THashSet(1+fc.size()); + result.add(new ComponentConnectionDescriptor(child, cp)); + fc.addConnectionDescriptors(graph, curConfiguration, result); return result; } else { @@ -383,6 +378,21 @@ public class ConnectionBrowser { } + public static void reportDescriptor(ReadGraph graph, VariableConnectionPointDescriptor d) throws DatabaseException { + + if(d instanceof ActualConnectionDescriptor) { + ActualConnectionDescriptor d2 = (ActualConnectionDescriptor)d; + + System.err.println("--ActualConnectionPointDescriptor2"); + System.err.println("---root: " + d2.root.getURI(graph)); + System.err.println("---component: " + graph.getPossibleURI(d2.component)); + System.err.println("---type: " + graph.getPossibleURI(d2.componentType)); + System.err.println("---cp: " + graph.getPossibleURI(d2.cp)); + System.err.println("---var: " + d2.getVariable(graph).getURI(graph)); + } + + } + public static class ConnectionVariables extends BinaryRead, Collection> { private ConnectionVariables(Variable parameter1, List parameter2) { @@ -427,6 +437,7 @@ public class ConnectionBrowser { @Override public Collection perform(ReadGraph graph) throws DatabaseException { if(parameter == null) return Collections.emptyList(); + Layer0 L0 = Layer0.getInstance(graph); StructuralResource2 STR = StructuralResource2.getInstance(graph); ArrayList result = null; for(int i=1;i(); - result.add(new ActualConnectionDescriptor(parameter, component, connectionPoint)); + String componentName = graph.getRelatedValue(component, L0.HasName, Bindings.STRING); + Variable possibleChild = parameter.getPossibleChild(graph, componentName); + if(possibleChild != null) { + Resource type = possibleChild.getPossibleType(graph, STR.Component); + if(type != null) { + result.add(new ActualConnectionDescriptor(parameter, component, possibleChild.getType(graph), connectionPoint)); + } else { + throw new DatabaseException("Child does not have a structural type: " + possibleChild.getURI(graph)); + } + } else { + Resource type = graph.getPossibleType(component, STR.Component); + if(type != null) { + result.add(new ActualConnectionDescriptor(parameter, component, type, connectionPoint)); + } else { + throw new DatabaseException("Child with name " + componentName + " does not have a structural type: " + parameter.getURI(graph)); + } + } } } if(result == null) return Collections.emptyList(); @@ -453,12 +480,8 @@ public class ConnectionBrowser { @Override public Boolean perform(ReadGraph graph) throws DatabaseException { - StructuralResource2 STR = StructuralResource2.getInstance(graph); - - if(graph.isInstanceOf(resource, STR.ProceduralComponentType)) return false; - if(graph.hasStatement(resource, STR.IsDefinedBy)) return false; - - return true; + StructuralComponentClass clazz = StructuralComponentClass.get(graph, resource); + return StructuralComponentClass.PRIMITIVE.equals(clazz); } @@ -591,28 +614,42 @@ public class ConnectionBrowser { public static Collection doFlatten(ReadGraph graph, Variable child, Resource cp, Resource relationType) throws DatabaseException { - Collection climbed = climb(graph, child, cp, null); - boolean needDrill = false; + Set result = null; + Set needDrill = null; + + Collection climbed = climb(graph, child, cp, null); for(VariableConnectionPointDescriptor desc : climbed) { if(!desc.isLeaf(graph)) { - needDrill = true; - break; + if(needDrill == null) + needDrill = new THashSet(climbed.size()); + needDrill.add(desc); + } else { + if(result == null) + result = new THashSet(climbed.size()); + result.add(desc); } } - if(!needDrill) { + if(needDrill == null) { + /* + * All descriptors were already flat - just take case of filtering + */ if(relationType != null) { ArrayList filtered = new ArrayList(climbed.size()); for(VariableConnectionPointDescriptor desc : climbed) if(filterByRelationType(graph, desc, relationType)) filtered.add(desc); return filtered; + } else { + return climbed; } - return climbed; } - THashSet result = new THashSet(climbed.size()); - for(VariableConnectionPointDescriptor top : climbed) { + + /* + * There were some descriptors that require drill + */ + for(VariableConnectionPointDescriptor top : needDrill) { Collection drilled = drill(graph, top); if(drilled != null) { for(VariableConnectionPointDescriptor drill : drilled) { @@ -620,6 +657,8 @@ public class ConnectionBrowser { if(!filterByRelationType(graph, drill, relationType)) continue; } + if(result == null) + result = new THashSet(climbed.size()); result.add(drill); } }