package sk.stuba.fiit.perconik.core.java.dom.difference; import java.util.Objects; import javax.annotation.Nullable; import org.eclipse.jdt.core.dom.ASTNode; import sk.stuba.fiit.perconik.core.java.dom.Nodes; import sk.stuba.fiit.perconik.eclipse.jdt.core.dom.NodeType; import sk.stuba.fiit.perconik.utilities.SmartStringBuilder; import static com.google.common.base.Objects.equal; public abstract class NodeDelta<N extends ASTNode> { NodeDelta() {} @Override public final boolean equals(@Nullable Object o) { if (this == o) { return true; } if (!(o instanceof NodeDelta)) { return false; } NodeDelta<?> other = (NodeDelta<?>) o; return equal(this.getOriginalNode(), other.getOriginalNode()) && equal(this.getRevisedNode(), other.getRevisedNode()); } @Override public final int hashCode() { return Objects.hashCode(this.getOriginalNode()) ^ Objects.hashCode(this.getRevisedNode()); } @Override public final String toString() { return this.toString(0); } public abstract String toString(int indent); final SmartStringBuilder toStringBuilder(final int indent) { String type = this.getType().toString().toLowerCase(); return new SmartStringBuilder().indent(indent).append(type).appendln(':').tab(); } public final boolean hasOriginalNode() { return this.getOriginalNode() != null; } public abstract N getOriginalNode(); public final ASTNode getOriginalNodeRoot() { return Nodes.root(this.getOriginalNode()); } public final ASTNode getOriginalNodeParent() { return Nodes.parent(this.getOriginalNode()); } public final NodeType getOriginalNodeType() { return Nodes.toType(this.getOriginalNode()); } public final boolean hasRevisedNode() { return this.getRevisedNode() != null; } public abstract N getRevisedNode(); public final ASTNode getRevisedNodeRoot() { return Nodes.root(this.getRevisedNode()); } public final ASTNode getRevisedNodeParent() { return Nodes.parent(this.getRevisedNode()); } public final NodeType getRevisedNodeType() { return Nodes.toType(this.getRevisedNode()); } public abstract NodeDeltaType getType(); }