class ShardDataTree extends ShardDataTreeTransactionParent {

    void applyRecoverySnapshot(final @NonNull ShardSnapshotState snapshot) throws DataValidationFailedException {
        // TODO: we should be able to reuse the pruner, provided we are not reentrant
        final ReusableNormalizedNodePruner pruner = ReusableNormalizedNodePruner.forDataSchemaContext(
            dataSchemaContext);
        if (snapshot.needsMigration()) {
            final ReusableNormalizedNodePruner uintPruner = pruner.withUintAdaption();
            applySnapshot(snapshot.getSnapshot(),
                delegate -> new PruningDataTreeModification.Proactive(delegate, dataTree, uintPruner));
        } else {
            applySnapshot(snapshot.getSnapshot(),
                delegate -> new PruningDataTreeModification.Reactive(delegate, dataTree, pruner));
        }
    }

      ShardDataTree(final Shard shard, final EffectiveModelContext schemaContext, final DataTree dataTree,
            final ShardDataTreeChangeListenerPublisher treeChangeListenerPublisher,
            final String logContext,
            final ShardDataTreeMetadata<?>... metadata);
      ShardDataTree(final Shard shard, final EffectiveModelContext schemaContext, final TreeType treeType,
            final YangInstanceIdentifier root,
            final ShardDataTreeChangeListenerPublisher treeChangeListenerPublisher,
            final String logContext,
            final ShardDataTreeMetadata<?>... metadata);
    @VisibleForTesting public  ShardDataTree(final Shard shard, final EffectiveModelContext schemaContext, final TreeType treeType);

}