class ProcessCompensationRefProvider implements SelectorDataProvider {

    @Override
    @SuppressWarnings("unchecked")
    public SelectorData getSelectorData(FormRenderingContext context) {
        final Diagram diagram = sessionManager.getCurrentSession().getCanvasHandler().getDiagram();
        final String rootUUID = diagram.getMetadata().getCanvasRootUUID();
        final Node<?, ? extends Edge> selectedNode = getSelectedNode(diagram, sessionManager.getCurrentSession());
        final Map<Object, String> values = new TreeMap<>(SafeComparator.TO_STRING_COMPARATOR);
        if (selectedNode != null) {
            Node<?, ? extends Edge> currentNode = selectedNode;
            final List<Node> compensableNodes = new ArrayList<>();
            Node<?, ? extends Edge> parentNode;
            int levels = 0;
            do {
                parentNode = GraphUtils.getParent(currentNode).asNode();
                compensableNodes.addAll(getCompensableNodes(parentNode));

                if (rootUUID.equals(parentNode.getUUID())) {
                    levels = 2;
                } else if (isSubProcess(parentNode)) {
                    currentNode = parentNode;
                    levels++;
                } else if (isLane(parentNode)) {
                    currentNode = parentNode;
                }
            } while (levels < 2);

            compensableNodes.stream()
                    .map(node -> buildPair(node.getUUID(), (BPMNDefinition) (((View) node.getContent()).getDefinition())))
                    .forEach(pair -> values.put(pair.getK1(), pair.getK2()));

            ActivityRef currentActivityRef = null;
            if (isEndCompensationEvent(selectedNode)) {
                currentActivityRef = ((EndCompensationEvent) ((View) selectedNode.getContent()).getDefinition()).getExecutionSet().getActivityRef();
            } else if (isIntermediateCompensationEventThrowing(selectedNode)) {
                currentActivityRef = ((IntermediateCompensationEventThrowing) ((View) selectedNode.getContent()).getDefinition()).getExecutionSet().getActivityRef();
            }
            if (currentActivityRef != null && !isEmpty(currentActivityRef.getValue()) && !values.containsKey(currentActivityRef.getValue())) {
                Node configured = diagram.getGraph().getNode(currentActivityRef.getValue());
                if (configured != null) {
                    Pair<Object, String> pair = buildPair(configured.getUUID(), (BPMNDefinition) ((View) configured.getContent()).getDefinition());
                    values.put(pair.getK1(), pair.getK2());
                }
            }
        }
        return new SelectorData(values,
                                null);
    }

    @Inject public  ProcessCompensationRefProvider(final SessionManager sessionManager);

}