X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-binding-broker%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fmd%2Fsal%2Fbinding%2Fimpl%2FLazyDataObjectModification.java;h=c3aff15e7a600f4fe83743e1ee77688273dc46db;hb=466078ab1dc8a8cc2981b161051f6edecd6af85a;hp=d12ec53c831b9f9f2921fe103148b18b92bb7684;hpb=03c13bd8a8bb89a729d739eb2fcd501a4dfa5439;p=controller.git diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/LazyDataObjectModification.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/LazyDataObjectModification.java index d12ec53c83..c3aff15e7a 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/LazyDataObjectModification.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/LazyDataObjectModification.java @@ -13,15 +13,19 @@ import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.opendaylight.controller.md.sal.binding.api.DataObjectModification; import org.opendaylight.mdsal.binding.dom.adapter.BindingStructuralType; import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode; import org.opendaylight.yangtools.yang.binding.Augmentation; import org.opendaylight.yangtools.yang.binding.ChildOf; +import org.opendaylight.yangtools.yang.binding.ChoiceIn; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.Identifiable; import org.opendaylight.yangtools.yang.binding.Identifier; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.IdentifiableItem; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.Item; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; @@ -46,7 +50,7 @@ final class LazyDataObjectModification implements DataObje private final DataTreeCandidateNode domData; private final PathArgument identifier; - private volatile Collection> childNodesCache; + private volatile Collection> childNodesCache; private volatile ModificationType modificationType; private LazyDataObjectModification(final BindingCodecTreeNode codec, final DataTreeCandidateNode domData) { @@ -55,19 +59,19 @@ final class LazyDataObjectModification implements DataObje this.identifier = codec.deserializePathArgument(domData.getIdentifier()); } - static DataObjectModification create(final BindingCodecTreeNode codec, + static LazyDataObjectModification create(final BindingCodecTreeNode codec, final DataTreeCandidateNode domData) { return new LazyDataObjectModification<>(codec,domData); } - private static Collection> from( + private static Collection> from( final BindingCodecTreeNode parentCodec, final Collection domChildNodes) { - final List> result = new ArrayList<>(domChildNodes.size()); + final List> result = new ArrayList<>(domChildNodes.size()); populateList(result, parentCodec, domChildNodes); return result; } - private static void populateList(final List> result, + private static void populateList(final List> result, final BindingCodecTreeNode parentCodec, final Collection domChildNodes) { for (final DataTreeCandidateNode domChildNode : domChildNodes) { final BindingStructuralType type = BindingStructuralType.from(domChildNode); @@ -92,7 +96,7 @@ final class LazyDataObjectModification implements DataObje } } - private static void populateList(final List> result, + private static void populateList(final List> result, final BindingStructuralType type, final BindingCodecTreeNode childCodec, final DataTreeCandidateNode domChildNode) { switch (type) { @@ -112,7 +116,7 @@ final class LazyDataObjectModification implements DataObje } } - private static void populateListWithSingleCodec(final List> result, + private static void populateListWithSingleCodec(final List> result, final BindingCodecTreeNode codec, final Collection childNodes) { for (final DataTreeCandidateNode child : childNodes) { result.add(create(codec, child)); @@ -196,14 +200,31 @@ final class LazyDataObjectModification implements DataObje } @Override - public Collection> getModifiedChildren() { - Collection> local = childNodesCache; + public Collection> getModifiedChildren() { + Collection> local = childNodesCache; if (local == null) { childNodesCache = local = from(codec, domData.getChildNodes()); } return local; } + @Override + public & DataObject, C extends ChildOf> + Collection> getModifiedChildren(final Class caseType, + final Class childType) { + return streamModifiedChildren(childType) + .filter(child -> caseType.equals(child.identifier.getCaseType().orElse(null))) + .collect(Collectors.toList()); + } + + @SuppressWarnings("unchecked") + private Stream> streamModifiedChildren( + final Class childType) { + return getModifiedChildren().stream() + .filter(child -> childType.isAssignableFrom(child.getDataType())) + .map(child -> (LazyDataObjectModification) child); + } + @Override public DataObjectModification getModifiedChild(final PathArgument arg) { final List domArgumentList = new ArrayList<>(); @@ -223,28 +244,39 @@ final class LazyDataObjectModification implements DataObje @SuppressWarnings("unchecked") public & ChildOf, K extends Identifier> DataObjectModification getModifiedChildListItem(final Class listItem, final K listKey) { - return (DataObjectModification) getModifiedChild(new InstanceIdentifier.IdentifiableItem<>( - listItem, listKey)); + return (DataObjectModification) getModifiedChild(IdentifiableItem.of(listItem, listKey)); + } + + @Override + @SuppressWarnings("unchecked") + public & DataObject, C extends Identifiable & ChildOf, + K extends Identifier> DataObjectModification getModifiedChildListItem(final Class caseType, + final Class listItem, final K listKey) { + return (DataObjectModification) getModifiedChild(IdentifiableItem.of(caseType, listItem, listKey)); + } + + @Override + @SuppressWarnings("unchecked") + public > DataObjectModification getModifiedChildContainer(final Class child) { + return (DataObjectModification) getModifiedChild(Item.of(child)); } @Override @SuppressWarnings("unchecked") - public > DataObjectModification getModifiedChildContainer(final Class arg) { - return (DataObjectModification) getModifiedChild(new InstanceIdentifier.Item<>(arg)); + public & DataObject, C extends ChildOf> DataObjectModification + getModifiedChildContainer(final Class caseType, final Class child) { + return (DataObjectModification) getModifiedChild(Item.of(caseType, child)); } @Override @SuppressWarnings("unchecked") public & DataObject> DataObjectModification getModifiedAugmentation( final Class augmentation) { - return (DataObjectModification) getModifiedChild(new InstanceIdentifier.Item<>(augmentation)); + return (DataObjectModification) getModifiedChild(Item.of(augmentation)); } private T deserialize(final Optional> dataAfter) { - if (dataAfter.isPresent()) { - return codec.deserialize(dataAfter.get()); - } - return null; + return dataAfter.map(codec::deserialize).orElse(null); } @Override