package org.simantics.interop.mapping.data; import org.simantics.utils.datastructures.hints.HintContext; public class Link extends HintContext { private GraphNode from; private GraphNode to; private String name; private Link inverseLink; private Link mainLink; Link(GraphNode from, String name, GraphNode to) { this.from = from; this.to = to; this.name = name; } public GraphNode from() { return from; } public GraphNode to() { return to; } public String getName() { return name; } void setInverseLink(Link inverseLink) { this.inverseLink = inverseLink; } void setMainLink(Link mainLink) { this.mainLink = mainLink; } public String getInverseName() { if (inverseLink != null) return inverseLink.getName(); if (mainLink != null) return mainLink.getName(); return null; } public boolean hasInverse() { return inverseLink != null || mainLink != null; } public Link getInverse() { if (inverseLink != null) return inverseLink; if (mainLink != null) return mainLink; return null; } public boolean isInverse() { return mainLink != null; } public boolean isMain() { return inverseLink != null; } @Override public boolean equals(Object obj) { if (!obj.getClass().equals(getClass())) return false; Link other = (Link)obj; if (!from.equals(other.from)) return false; if (!to.equals(other.to)) return false; if (!GraphNode.equals(name,other.name)) return false; return true; } @Override public int hashCode() { return from.hashCode() * to.hashCode() + name.hashCode(); } @Override public void setHint(Key key, Object value) { if (value == null) return; super.setHint(key, value); } public String toString() { return name + "/" + getInverseName() + " -> " + to.toString(); } }