/* * Copyright 2009-2011 Collaborative Research Centre SFB 632 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package annis.model; import java.io.Serializable; import java.util.HashSet; import java.util.Set; import java.util.TreeSet; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; @SuppressWarnings("serial") public class AnnisNode implements Serializable { // this class is send to the front end // node object in database private long id; private long corpus; // FIXME: Corpus object with annotations or move to // graph? private long textId; private long left; private long right; private String spannedText; private Long tokenIndex; private long leftToken; private long rightToken; private Set<Annotation> nodeAnnotations; // annotation graph private AnnotationGraph graph; // node position in annotation graph private Set<Edge> incomingEdges; private Set<Edge> outgoingEdges; private String name; private String namespace; // node constraints private boolean partOfEdge; private boolean root; private boolean token; private Set<Annotation> edgeAnnotations; private Long matchedNodeInQuery; public static class Range implements Serializable { private int min; private int max; public Range(int _min, int _max) { min = _min; max = _max; } public int getMin() { return min; } public int getMax() { return max; } @Override public int hashCode() { return new HashCodeBuilder().append(min).append(max).toHashCode(); } @Override public boolean equals(Object obj) { if (obj instanceof Range) { Range other = (Range) obj; return new EqualsBuilder().append(min, other.min).append(max, other.max). isEquals(); } return false; } }; public AnnisNode() { nodeAnnotations = new TreeSet<>(); edgeAnnotations = new TreeSet<>(); incomingEdges = new HashSet<>(); outgoingEdges = new HashSet<>(); } public AnnisNode(long id) { this(); this.id = id; } public AnnisNode(long id, long corpusRef, long textRef, long left, long right, String namespace, String name, long tokenIndex, String span, long leftToken, long rightToken) { this(id); this.corpus = corpusRef; this.textId = textRef; this.left = left; this.right = right; this.leftToken = leftToken; this.rightToken = rightToken; setNamespace(namespace); setName(name); setTokenIndex(tokenIndex); setSpannedText(span); } public static String qName(String namespace, String name) { return qName(namespace, name, ":"); } public static String qName(String namespace, String name, String seperator) { return name == null ? null : (namespace == null ? name : namespace + seperator + name); } public void setSpannedText(String spannedText) { this.spannedText = spannedText; } public void clearSpannedText() { this.spannedText = null; } @Override public String toString() { StringBuffer sb = new StringBuffer(); sb.append("node "); sb.append(id); if (name != null) { sb.append("; named '"); sb.append(qName(namespace, name)); sb.append("'"); } if (token) { sb.append("; is a token"); } if (spannedText != null) { sb.append("; spans=\""); sb.append(spannedText); sb.append("\""); } if (isRoot()) { sb.append("; root node"); } if (!nodeAnnotations.isEmpty()) { sb.append("; node labels: "); sb.append(nodeAnnotations); } if (!edgeAnnotations.isEmpty()) { sb.append("; edge labes: "); sb.append(edgeAnnotations); } return sb.toString(); } public boolean addIncomingEdge(Edge edge) { return incomingEdges.add(edge); } public boolean addOutgoingEdge(Edge edge) { return outgoingEdges.add(edge); } public boolean addEdgeAnnotation(Annotation annotation) { return edgeAnnotations.add(annotation); } public boolean addNodeAnnotation(Annotation annotation) { return nodeAnnotations.add(annotation); } public String getQualifiedName() { return qName(namespace, name); } @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final AnnisNode other = (AnnisNode) obj; if (this.id != other.id) { return false; } if (this.corpus != other.corpus) { return false; } if (this.textId != other.textId) { return false; } if (this.left != other.left) { return false; } if (this.right != other.right) { return false; } if ((this.spannedText == null) ? (other.spannedText != null) : !this.spannedText.equals(other.spannedText)) { return false; } if (this.leftToken != other.leftToken) { return false; } if (this.nodeAnnotations != other.nodeAnnotations && (this.nodeAnnotations == null || !this.nodeAnnotations.equals( other.nodeAnnotations))) { return false; } if ((this.name == null) ? (other.name != null) : !this.name.equals( other.name)) { return false; } if ((this.namespace == null) ? (other.namespace != null) : !this.namespace.equals(other.namespace)) { return false; } if (this.partOfEdge != other.partOfEdge) { return false; } if (this.root != other.root) { return false; } if (this.token != other.token) { return false; } if (this.edgeAnnotations != other.edgeAnnotations && (this.edgeAnnotations == null || !this.edgeAnnotations.equals(other.edgeAnnotations))) { return false; } return true; } @Override public int hashCode() { return (int) id; } // /// Getter / Setter public Set<Annotation> getEdgeAnnotations() { return edgeAnnotations; } public void setEdgeAnnotations(Set<Annotation> edgeAnnotations) { this.edgeAnnotations = edgeAnnotations; } public boolean isRoot() { return root; } public void setRoot(boolean root) { this.root = root; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getNamespace() { return namespace; } public void setNamespace(String namespace) { this.namespace = namespace; } public String getSpannedText() { return spannedText; } public Set<Annotation> getNodeAnnotations() { return nodeAnnotations; } public void setNodeAnnotations(Set<Annotation> nodeAnnotations) { this.nodeAnnotations = nodeAnnotations; } public long getId() { return id; } public boolean isToken() { return token; } public void setToken(boolean token) { this.token = token; } public boolean isPartOfEdge() { return partOfEdge; } public void setPartOfEdge(boolean partOfEdge) { this.partOfEdge = partOfEdge; } public long getCorpus() { return corpus; } public void setCorpus(long corpus) { this.corpus = corpus; } public long getTextId() { return textId; } public void setTextId(long textIndex) { this.textId = textIndex; } public long getLeft() { return left; } public void setLeft(long left) { this.left = left; } public long getRight() { return right; } public void setRight(long right) { this.right = right; } public Long getTokenIndex() { return tokenIndex; } public void setTokenIndex(Long tokenIndex) { this.tokenIndex = tokenIndex; // FIXME: vermengung von node und constraint semantik setToken(tokenIndex != null); } public long getLeftToken() { return leftToken; } public void setLeftToken(long leftToken) { this.leftToken = leftToken; } public long getRightToken() { return rightToken; } public void setRightToken(long rightToken) { this.rightToken = rightToken; } public Set<Edge> getIncomingEdges() { return incomingEdges; } public void setIncomingEdges(Set<Edge> incomingEdges) { this.incomingEdges = incomingEdges; } public Set<Edge> getOutgoingEdges() { return outgoingEdges; } public void setOutgoingEdges(Set<Edge> outgoingEdges) { this.outgoingEdges = outgoingEdges; } public AnnotationGraph getGraph() { return graph; } public void setGraph(AnnotationGraph graph) { this.graph = graph; } public Long getMatchedNodeInQuery() { return matchedNodeInQuery; } public void setMatchedNodeInQuery(Long matchedNodeInQuery) { this.matchedNodeInQuery = matchedNodeInQuery; } }