class MapSyncRpcHandler extends AbstractRpcInvocationHandler {

    @Override
    protected Optional<Runnable> handleNode(StateNode node,
            JsonObject invocationJson) {
        assert invocationJson.hasKey(JsonConstants.RPC_FEATURE);
        assert invocationJson.hasKey(JsonConstants.RPC_PROPERTY);
        assert invocationJson.hasKey(JsonConstants.RPC_PROPERTY_VALUE);

        int featureId = (int) invocationJson
                .getNumber(JsonConstants.RPC_FEATURE);
        Class<? extends NodeFeature> feature = NodeFeatureRegistry
                .getFeature(featureId);
        assert NodeMap.class.isAssignableFrom(feature);
        assert ElementPropertyMap.class.equals(feature);

        boolean isEnabled = node.isEnabled();

        List<DisabledUpdateMode> seenUpdateModes = new ArrayList<>();

        String property = invocationJson.getString(JsonConstants.RPC_PROPERTY);

        if (node.hasFeature(ElementListenerMap.class)) {
            DisabledUpdateMode eventMode = node
                    .getFeature(ElementListenerMap.class)
                    .getPropertySynchronizationMode(property);

            if (eventMode != null) {
                seenUpdateModes.add(eventMode);
            }
        }

        DisabledUpdateMode updateMode = seenUpdateModes.stream()
                .reduce(DisabledUpdateMode::mostPermissive).orElse(null);

        if (isEnabled) {
            return enqueuePropertyUpdate(node, invocationJson, feature,
                    property);
        } else if (DisabledUpdateMode.ALWAYS.equals(updateMode)) {
            LoggerFactory.getLogger(MapSyncRpcHandler.class).trace(
                    "Property update request for disabled element is received from the client side. "
                            + "Change will be applied since the property '{}' always allows its update.",
                    property);
            return enqueuePropertyUpdate(node, invocationJson, feature,
                    property);
        } else {
            LoggerFactory.getLogger(MapSyncRpcHandler.class).warn(
                    "Property update request for disabled element is received from the client side. "
                            + "The property is '{}'. Request is ignored.",
                    property);
        }
        return Optional.empty();
    }

}