+ private final void ensureParentsByMerge(final LogicalDatastoreType store,
+ final YangInstanceIdentifier normalizedPath, final DOMDataReadWriteTransaction rwTx,
+ final DataNormalizationOperation<?> root) {
+ final List<PathArgument> currentArguments = new ArrayList<>();
+ final Iterator<PathArgument> iterator = normalizedPath.getPathArguments().iterator();
+ DataNormalizationOperation<?> currentOp = root;
+ while (iterator.hasNext()) {
+ final PathArgument currentArg = iterator.next();
+ try {
+ currentOp = currentOp.getChild(currentArg);
+ } catch (final DataNormalizationException e) {
+ rwTx.cancel();
+ throw new IllegalArgumentException(
+ String.format("Invalid child encountered in path %s", normalizedPath), e);
+ }
+ currentArguments.add(currentArg);
+ final YangInstanceIdentifier currentPath = YangInstanceIdentifier.create(currentArguments);
+
+ final Boolean exists;
+
+ try {
+
+ final CheckedFuture<Boolean, ReadFailedException> future = rwTx.exists(store, currentPath);
+ exists = future.checkedGet();
+ } catch (final ReadFailedException e) {
+ LOG.error("Failed to read pre-existing data from store {} path {}", store, currentPath, e);
+ rwTx.cancel();
+ throw new IllegalStateException("Failed to read pre-existing data", e);
+ }
+
+ if (!exists && iterator.hasNext()) {
+ rwTx.merge(store, currentPath, currentOp.createDefault(currentArg));
+ }