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 { /* * This is the parent of the component to be connected */ final private Variable procedural; final private Collection> cps = new ArrayList>(); public FixedConnection(Variable procedural) { this.procedural = procedural; } public void addAll(List> cps) throws DatabaseException { /* * For interface connections the name is null */ 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. We should never have gotten this far if(cpzz.first == null) { String message = "Lifted connection was not resolved. Child = " + procedural.getURI(graph); throw new DatabaseException(message); } result.add(new PairConnectionDescriptor(curConfiguration, cpzz)); } } @Override public Collection getConnectionPoints(ReadGraph graph, Resource relationType) throws DatabaseException { Set result = new THashSet(); for(Pair cp : cps) { Variable component = cp.first == null ? procedural : procedural.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, Resource relationType) throws DatabaseException { Set result = new THashSet(); for(Pair cp : cps) { Variable component = cp.first == null ? procedural : procedural.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 Collection getConnectionPointDescriptors(ReadGraph graph, Resource relationType) throws DatabaseException { Set result = new THashSet(); for(Pair cp : cps) { Variable component = cp.first == null ? procedural : procedural.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 int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((cps == null) ? 0 : cps.hashCode()); result = prime * result + ((procedural == null) ? 0 : procedural.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 (procedural == null) { if (other.procedural != null) return false; } else if (!procedural.equals(other.procedural)) return false; return true; } @Override public Collection getConnectionPointDescriptors(ReadGraph graph, Variable component_, Resource relationType) throws DatabaseException { Set result = new THashSet(); for(Pair cp : cps) { Variable component = cp.first == null ? component_.getParent(graph) : component_; 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 component_, Resource relationType) throws DatabaseException { Set result = new THashSet(); for(Pair cp : cps) { Variable component = cp.first == null ? component_.getParent(graph) : component_; 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 component_, Resource relationType) throws DatabaseException { Set result = new THashSet(); for(Pair cp : cps) { Variable component = cp.first == null ? component_.getParent(graph) : component_; 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; } }