use of de.tudarmstadt.ukp.clarin.webanno.api.annotation.adapter.RelationLayerBehavior in project webanno by webanno.
the class RelationRenderer method render.
@Override
public void render(final CAS aCas, List<AnnotationFeature> aFeatures, VDocument aResponse, int aWindowBegin, int aWindowEnd) {
RelationAdapter typeAdapter = getTypeAdapter();
Type type;
Type spanType;
try {
type = getType(aCas, typeAdapter.getAnnotationTypeName());
spanType = getType(aCas, typeAdapter.getAttachTypeName());
} catch (IllegalArgumentException e) {
// CAS does not contain any instances of them
return;
}
List<AnnotationFeature> visibleFeatures = aFeatures.stream().filter(f -> f.isVisible() && f.isEnabled()).collect(Collectors.toList());
Feature dependentFeature = type.getFeatureByBaseName(typeAdapter.getTargetFeatureName());
Feature governorFeature = type.getFeatureByBaseName(typeAdapter.getSourceFeatureName());
Feature arcSpanFeature = spanType.getFeatureByBaseName(typeAdapter.getAttachFeatureName());
FeatureStructure dependentFs;
FeatureStructure governorFs;
Map<Integer, Set<Integer>> relationLinks = getRelationLinks(aCas, aWindowBegin, aWindowEnd, type, dependentFeature, governorFeature, arcSpanFeature);
// if this is a governor for more than one dependent, avoid duplicate yield
List<Integer> yieldDeps = new ArrayList<>();
// Index mapping annotations to the corresponding rendered arcs
Map<AnnotationFS, VArc> annoToArcIdx = new HashMap<>();
for (AnnotationFS fs : selectCovered(aCas, type, aWindowBegin, aWindowEnd)) {
if (typeAdapter.getAttachFeatureName() != null) {
dependentFs = fs.getFeatureValue(dependentFeature).getFeatureValue(arcSpanFeature);
governorFs = fs.getFeatureValue(governorFeature).getFeatureValue(arcSpanFeature);
} else {
dependentFs = fs.getFeatureValue(dependentFeature);
governorFs = fs.getFeatureValue(governorFeature);
}
String bratTypeName = typeAdapter.getEncodedTypeName();
Map<String, String> features = renderLabelFeatureValues(typeAdapter, fs, visibleFeatures);
if (dependentFs == null || governorFs == null) {
StringBuilder message = new StringBuilder();
message.append("Relation [" + typeAdapter.getLayer().getName() + "] with id [" + getAddr(fs) + "] has loose ends - cannot render.");
if (typeAdapter.getAttachFeatureName() != null) {
message.append("\nRelation [" + typeAdapter.getLayer().getName() + "] attached to feature [" + typeAdapter.getAttachFeatureName() + "].");
}
message.append("\nDependent: " + dependentFs);
message.append("\nGovernor: " + governorFs);
RequestCycle requestCycle = RequestCycle.get();
IPageRequestHandler handler = PageRequestHandlerTracker.getLastHandler(requestCycle);
Page page = (Page) handler.getPage();
page.warn(message.toString());
continue;
}
VArc arc = new VArc(typeAdapter.getLayer(), fs, bratTypeName, governorFs, dependentFs, features);
arc.addLazyDetails(getLazyDetails(typeAdapter, fs, aFeatures));
annoToArcIdx.put(fs, arc);
aResponse.add(arc);
// Render errors if required features are missing
renderRequiredFeatureErrors(visibleFeatures, fs, aResponse);
if (relationLinks.keySet().contains(getAddr(governorFs)) && !yieldDeps.contains(getAddr(governorFs))) {
yieldDeps.add(getAddr(governorFs));
// sort the annotations (begin, end)
List<Integer> sortedDepFs = new ArrayList<>(relationLinks.get(getAddr(governorFs)));
sortedDepFs.sort(comparingInt(arg0 -> selectAnnotationByAddr(aCas, arg0).getBegin()));
String cm = getYieldMessage(aCas, sortedDepFs);
aResponse.add(new VComment(governorFs, VCommentType.YIELD, cm));
}
}
for (RelationLayerBehavior behavior : behaviors) {
behavior.onRender(typeAdapter, aResponse, annoToArcIdx);
}
}
Aggregations