diff options
Diffstat (limited to 'v3po/impl/src/main/java/io/fd/honeycomb/v3po/impl/data')
3 files changed, 34 insertions, 16 deletions
diff --git a/v3po/impl/src/main/java/io/fd/honeycomb/v3po/impl/data/VppConfigDataTree.java b/v3po/impl/src/main/java/io/fd/honeycomb/v3po/impl/data/VppConfigDataTree.java index 9f34fcbd1..1982bc707 100644 --- a/v3po/impl/src/main/java/io/fd/honeycomb/v3po/impl/data/VppConfigDataTree.java +++ b/v3po/impl/src/main/java/io/fd/honeycomb/v3po/impl/data/VppConfigDataTree.java @@ -107,9 +107,7 @@ public final class VppConfigDataTree implements VppDataTree { final DOMDataReadOnlyTransaction beforeTx = new VppReadOnlyTransaction(EMPTY_OPERATIONAL, takeSnapshot()); final ConfigSnapshot modificationSnapshot = new ConfigSnapshot(modification); final DOMDataReadOnlyTransaction afterTx = new VppReadOnlyTransaction(EMPTY_OPERATIONAL, modificationSnapshot); - final WriteContext ctx = new TransactionWriteContext(serializer, beforeTx, afterTx); - - try { + try(final WriteContext ctx = new TransactionWriteContext(serializer, beforeTx, afterTx)) { writer.update(nodesBefore, nodesAfter, ctx); } catch (WriterRegistry.BulkUpdateException e) { LOG.warn("Failed to apply all changes", e); diff --git a/v3po/impl/src/main/java/io/fd/honeycomb/v3po/impl/data/VppOperationalDataTree.java b/v3po/impl/src/main/java/io/fd/honeycomb/v3po/impl/data/VppOperationalDataTree.java index d0acd05a8..d73c22a6d 100644 --- a/v3po/impl/src/main/java/io/fd/honeycomb/v3po/impl/data/VppOperationalDataTree.java +++ b/v3po/impl/src/main/java/io/fd/honeycomb/v3po/impl/data/VppOperationalDataTree.java @@ -27,7 +27,9 @@ import com.google.common.collect.Multimap; import com.google.common.util.concurrent.CheckedFuture; import com.google.common.util.concurrent.Futures; import io.fd.honeycomb.v3po.impl.trans.ReadFailedException; +import io.fd.honeycomb.v3po.impl.trans.r.ReadContext; import io.fd.honeycomb.v3po.impl.trans.r.ReaderRegistry; +import io.fd.honeycomb.v3po.impl.trans.util.Context; import java.util.Collection; import java.util.Map; import javax.annotation.Nonnull; @@ -82,11 +84,11 @@ public final class VppOperationalDataTree implements ReadableVppDataTree { org.opendaylight.controller.md.sal.common.api.data.ReadFailedException> read( @Nonnull final YangInstanceIdentifier yangInstanceIdentifier) { - try { + try(ReadContext ctx = new ReadContextImpl()) { if (checkNotNull(yangInstanceIdentifier).equals(YangInstanceIdentifier.EMPTY)) { - return Futures.immediateCheckedFuture(readRoot()); + return Futures.immediateCheckedFuture(readRoot(ctx)); } else { - return Futures.immediateCheckedFuture(readNode(yangInstanceIdentifier)); + return Futures.immediateCheckedFuture(readNode(yangInstanceIdentifier, ctx)); } } catch (ReadFailedException e) { return Futures.immediateFailedCheckedFuture( @@ -95,7 +97,8 @@ public final class VppOperationalDataTree implements ReadableVppDataTree { } } - private Optional<NormalizedNode<?, ?>> readNode(final YangInstanceIdentifier yangInstanceIdentifier) + private Optional<NormalizedNode<?, ?>> readNode(final YangInstanceIdentifier yangInstanceIdentifier, + final ReadContext ctx) throws ReadFailedException { LOG.debug("VppOperationalDataTree.readNode(), yangInstanceIdentifier={}", yangInstanceIdentifier); final InstanceIdentifier<?> path = serializer.fromYangInstanceIdentifier(yangInstanceIdentifier); @@ -104,7 +107,7 @@ public final class VppOperationalDataTree implements ReadableVppDataTree { final Optional<? extends DataObject> dataObject; - dataObject = readerRegistry.read(path); + dataObject = readerRegistry.read(path, ctx); if (dataObject.isPresent()) { final NormalizedNode<?, ?> value = toNormalizedNodeFunction(path).apply(dataObject.get()); return Optional.<NormalizedNode<?, ?>>fromNullable(value); @@ -113,7 +116,7 @@ public final class VppOperationalDataTree implements ReadableVppDataTree { } } - private Optional<NormalizedNode<?, ?>> readRoot() throws ReadFailedException { + private Optional<NormalizedNode<?, ?>> readRoot(final ReadContext ctx) throws ReadFailedException { LOG.debug("VppOperationalDataTree.readRoot()"); final DataContainerNodeAttrBuilder<YangInstanceIdentifier.NodeIdentifier, ContainerNode> dataNodeBuilder = @@ -121,7 +124,7 @@ public final class VppOperationalDataTree implements ReadableVppDataTree { .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(SchemaContext.NAME)); final Multimap<InstanceIdentifier<? extends DataObject>, ? extends DataObject> dataObjects = - readerRegistry.readAll(); + readerRegistry.readAll(ctx); for (final InstanceIdentifier<? extends DataObject> instanceIdentifier : dataObjects.keySet()) { final YangInstanceIdentifier rootElementId = serializer.toYangInstanceIdentifier(instanceIdentifier); @@ -187,4 +190,20 @@ public final class VppOperationalDataTree implements ReadableVppDataTree { } }; } + + private static final class ReadContextImpl implements ReadContext { + public final Context ctx = new Context(); + + @Nonnull + @Override + public Context getContext() { + return ctx; + } + + @Override + public void close() { + // Make sure to clear the storage in case some customizer stored it to prevent memory leaks + ctx.close(); + } + } } diff --git a/v3po/impl/src/main/java/io/fd/honeycomb/v3po/impl/data/VppReaderRegistry.java b/v3po/impl/src/main/java/io/fd/honeycomb/v3po/impl/data/VppReaderRegistry.java index 72d17b7e2..fc6a51add 100644 --- a/v3po/impl/src/main/java/io/fd/honeycomb/v3po/impl/data/VppReaderRegistry.java +++ b/v3po/impl/src/main/java/io/fd/honeycomb/v3po/impl/data/VppReaderRegistry.java @@ -20,6 +20,7 @@ import com.google.common.base.Optional; import com.google.common.collect.Multimap; import io.fd.honeycomb.v3po.impl.trans.ReadFailedException; import io.fd.honeycomb.v3po.impl.trans.r.ChildVppReader; +import io.fd.honeycomb.v3po.impl.trans.r.ReadContext; import io.fd.honeycomb.v3po.impl.trans.r.ReaderRegistry; import io.fd.honeycomb.v3po.impl.trans.r.VppReader; import io.fd.honeycomb.v3po.impl.trans.r.impl.CompositeChildVppReader; @@ -96,16 +97,16 @@ public class VppReaderRegistry implements ReaderRegistry { @Nonnull @Override - public Multimap<InstanceIdentifier<? extends DataObject>, ? extends DataObject> readAll() - throws io.fd.honeycomb.v3po.impl.trans.ReadFailedException { - return reader.readAll(); + public Multimap<InstanceIdentifier<? extends DataObject>, ? extends DataObject> readAll( + @Nonnull final ReadContext ctx) throws io.fd.honeycomb.v3po.impl.trans.ReadFailedException { + return reader.readAll(ctx); } @Nonnull @Override - public Optional<? extends DataObject> read(@Nonnull final InstanceIdentifier<? extends DataObject> id) - throws ReadFailedException { - return reader.read(id); + public Optional<? extends DataObject> read(@Nonnull final InstanceIdentifier<? extends DataObject> id, + @Nonnull final ReadContext ctx) throws ReadFailedException { + return reader.read(id, ctx); } @Nonnull |