/** * Get the qualified name of all annotations belonging to spans having a specific namespace. * * @param graph The graph. * @param namespace The namespace of the node (not the annotation) to search for. * @param type Which type of nodes to include * @return */ private static Set<String> getAnnotationLevelSet( SDocumentGraph graph, String namespace, Class<? extends SNode> type) { Set<String> result = new TreeSet<>(); if (graph != null) { List<? extends SNode> nodes; // catch most common cases directly if (SSpan.class == type) { nodes = graph.getSpans(); } else if (SToken.class == type) { nodes = graph.getTokens(); } else { nodes = graph.getNodes(); } if (nodes != null) { for (SNode n : nodes) { if (type.isAssignableFrom(n.getClass())) { for (SLayer layer : n.getLayers()) { if (namespace == null || namespace.equals(layer.getName())) { for (SAnnotation anno : n.getAnnotations()) { result.add(anno.getQName()); } // we got all annotations of this node, jump to next node break; } // end if namespace equals layer name } // end for each layer } } // end for each node } } return result; }
private static void addAnnotationsForNode( SNode node, SDocumentGraph graph, long startTokenIndex, long endTokenIndex, PDFController pdfController, PDFPageHelper pageNumberHelper, AtomicInteger eventCounter, LinkedHashMap<String, ArrayList<Row>> rowsByAnnotation, boolean addMatch, Set<String> mediaLayer, boolean replaceValueWithMediaIcon) { List<String> matchedAnnos = new ArrayList<>(); SFeature featMatchedAnnos = graph.getFeature(ANNIS_NS, FEAT_MATCHEDANNOS); if (featMatchedAnnos != null) { matchedAnnos = Splitter.on(',').trimResults().splitToList(featMatchedAnnos.getValue_STEXT()); } // check if the span is a matched node SFeature featMatched = node.getFeature(ANNIS_NS, FEAT_MATCHEDNODE); Long matchRaw = featMatched == null ? null : featMatched.getValue_SNUMERIC(); String matchedQualifiedAnnoName = ""; if (matchRaw != null && matchRaw <= matchedAnnos.size()) { matchedQualifiedAnnoName = matchedAnnos.get((int) ((long) matchRaw) - 1); } // calculate the left and right values of a span // TODO: howto get these numbers with Salt? RelannisNodeFeature feat = (RelannisNodeFeature) node.getFeature(ANNIS_NS, FEAT_RELANNIS_NODE).getValue(); long leftLong = feat.getLeftToken(); long rightLong = feat.getRightToken(); leftLong = clip(leftLong, startTokenIndex, endTokenIndex); rightLong = clip(rightLong, startTokenIndex, endTokenIndex); int left = (int) (leftLong - startTokenIndex); int right = (int) (rightLong - startTokenIndex); for (SAnnotation anno : node.getAnnotations()) { ArrayList<Row> rows = rowsByAnnotation.get(anno.getQName()); if (rows == null) { // try again with only the name rows = rowsByAnnotation.get(anno.getName()); } if (rows != null) { // only do something if the annotation was defined before // 1. give each annotation of each span an own row Row r = new Row(); String id = "event_" + eventCounter.incrementAndGet(); GridEvent event = new GridEvent(id, left, right, anno.getValue_STEXT()); event.setTooltip(Helper.getQualifiedName(anno)); if (addMatch && matchRaw != null) { long match = matchRaw; if (matchedQualifiedAnnoName.isEmpty()) { // always set the match when there is no matched annotation at all event.setMatch(match); } // check if the annotation also matches else if (matchedQualifiedAnnoName.equals(anno.getQName())) { event.setMatch(match); } } if (node instanceof SSpan) { // calculate overlapped SToken List<? extends SRelation<? extends SNode, ? extends SNode>> outEdges = graph.getOutRelations(node.getId()); if (outEdges != null) { for (SRelation<? extends SNode, ? extends SNode> e : outEdges) { if (e instanceof SSpanningRelation) { SSpanningRelation spanRel = (SSpanningRelation) e; SToken tok = spanRel.getTarget(); event.getCoveredIDs().add(tok.getId()); // get the STextualDS of this token and add it to the event String textID = getTextID(tok, graph); if (textID != null) { event.setTextID(textID); } } } } // end if span has out edges } else if (node instanceof SToken) { event.getCoveredIDs().add(node.getId()); // get the STextualDS of this token and add it to the event String textID = getTextID((SToken) node, graph); if (textID != null) { event.setTextID(textID); } } // try to get time annotations if (mediaLayer == null || mediaLayer.contains(anno.getQName())) { double[] startEndTime = TimeHelper.getOverlappedTime(node); if (startEndTime.length == 1) { if (replaceValueWithMediaIcon) { event.setValue(" "); event.setTooltip("play excerpt " + event.getStartTime()); } event.setStartTime(startEndTime[0]); } else if (startEndTime.length == 2) { event.setStartTime(startEndTime[0]); event.setEndTime(startEndTime[1]); if (replaceValueWithMediaIcon) { event.setValue(" "); event.setTooltip("play excerpt " + event.getStartTime() + "-" + event.getEndTime()); } } } r.addEvent(event); rows.add(r); if (pdfController != null && pdfController.sizeOfRegisterdPDFViewer() > 0) { String page = pageNumberHelper.getPageFromAnnotation(node); if (page != null) { event.setPage(page); } } } } // end for each annotation of span }