Switch to Objects.requireNonNull
[mdsal.git] / binding2 / mdsal-binding2-dom-codec / src / main / java / org / opendaylight / mdsal / binding / javav2 / dom / codec / modification / LazyDataTreeModification.java
1 /*
2  * Copyright (c) 2017 Pantheon Technologies s.r.o. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.mdsal.binding.javav2.dom.codec.modification;
9
10 import static java.util.Objects.requireNonNull;
11
12 import com.google.common.annotations.Beta;
13 import java.util.ArrayList;
14 import java.util.Collection;
15 import java.util.List;
16 import java.util.Map.Entry;
17 import javax.annotation.Nonnull;
18 import org.opendaylight.mdsal.binding.javav2.api.DataTreeIdentifier;
19 import org.opendaylight.mdsal.binding.javav2.api.DataTreeModification;
20 import org.opendaylight.mdsal.binding.javav2.api.TreeNodeModification;
21 import org.opendaylight.mdsal.binding.javav2.dom.codec.api.BindingTreeNodeCodec;
22 import org.opendaylight.mdsal.binding.javav2.dom.codec.impl.BindingToNormalizedNodeCodec;
23 import org.opendaylight.mdsal.binding.javav2.spec.base.InstanceIdentifier;
24 import org.opendaylight.mdsal.binding.javav2.spec.base.TreeNode;
25 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
26 import org.opendaylight.mdsal.dom.api.DOMDataTreeCandidate;
27 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
28
29 /**
30  * Lazily translated {@link DataTreeModification} based on {@link DataTreeCandidate}.
31  *
32  * <p>
33  * {@link DataTreeModification} represents Data tree change event, but whole tree is not translated or
34  * resolved eagerly, but only child nodes which are directly accessed by user of tree node modification.
35  *
36  */
37 @Beta
38 public final class LazyDataTreeModification<T extends TreeNode> implements DataTreeModification<T> {
39
40     private final DataTreeIdentifier<T> path;
41     private final TreeNodeModification<T> rootNode;
42
43     private LazyDataTreeModification(final DataTreeIdentifier<T> path, final TreeNodeModification<T> modification) {
44         this.path = requireNonNull(path);
45         this.rootNode = requireNonNull(modification);
46     }
47
48     @Nonnull
49     @Override
50     public TreeNodeModification<T> getRootNode() {
51         return rootNode;
52     }
53
54     @Nonnull
55     @Override
56     public DataTreeIdentifier<T> getRootPath() {
57         return path;
58     }
59
60     @SuppressWarnings({ "unchecked", "rawtypes" })
61     private static <T extends TreeNode> DataTreeModification<T> create(final BindingToNormalizedNodeCodec codec,
62             final DataTreeCandidate domChange, final LogicalDatastoreType datastoreType) {
63         final Entry<InstanceIdentifier<?>, BindingTreeNodeCodec<?>> codecCtx =
64                 codec.getSubtreeCodec(domChange.getRootPath());
65         final DataTreeIdentifier<?> path = DataTreeIdentifier.create(datastoreType, codecCtx.getKey());
66         final TreeNodeModification<?> modification =
67                 LazyTreeNodeModification.create(codecCtx.getValue(), domChange.getRootNode());
68         return new LazyDataTreeModification(path, modification);
69     }
70
71     /**
72      * Create instance of Binding date tree modification according to DOM candidate of changes.
73      *
74      * @param codec
75      *            - codec for modificated data
76      * @param candidate
77      *            - changted DOM data
78      * @return modificated data tree
79      */
80     @SuppressWarnings({ "unchecked", "rawtypes" })
81     public static <T extends TreeNode> DataTreeModification<T> create(final BindingToNormalizedNodeCodec codec,
82             final DOMDataTreeCandidate candidate) {
83         final Entry<InstanceIdentifier<?>, BindingTreeNodeCodec<?>> codecCtx =
84                 codec.getSubtreeCodec(candidate.getRootPath().getRootIdentifier());
85         final DataTreeIdentifier<?> path =
86                 DataTreeIdentifier.create(candidate.getRootPath().getDatastoreType(), codecCtx.getKey());
87         final TreeNodeModification<?> modification =
88                 LazyTreeNodeModification.create(codecCtx.getValue(), candidate.getRootNode());
89         return new LazyDataTreeModification(path, modification);
90     }
91
92     /**
93      * DOM data changes to new Binding data.
94      *
95      * @param codec
96      *            - Binding to DOM codec
97      * @param domChanges
98      *            - DOM data changes
99      * @param datastoreType
100      *            - datastore type
101      * @return collection of new Binding data according to DOM data changes
102      */
103     public static <T extends TreeNode> Collection<DataTreeModification<T>> from(
104             final BindingToNormalizedNodeCodec codec, final Collection<DataTreeCandidate> domChanges,
105             final LogicalDatastoreType datastoreType) {
106         final List<DataTreeModification<T>> result = new ArrayList<>(domChanges.size());
107         for (final DataTreeCandidate domChange : domChanges) {
108             result.add(LazyDataTreeModification.create(codec, domChange, datastoreType));
109         }
110         return result;
111     }
112
113 }
114