54a09f272c989dd7cefe88c34b347f77085be75c
[hc2vpp.git] /
1 /*
2  * Copyright (c) 2016 Cisco and/or its affiliates.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at:
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package io.fd.honeycomb.v3po.translate.impl.write;
18
19 import com.google.common.base.Optional;
20 import io.fd.honeycomb.v3po.translate.impl.TraversalType;
21 import io.fd.honeycomb.v3po.translate.write.ChildWriter;
22 import io.fd.honeycomb.v3po.translate.write.WriteContext;
23 import io.fd.honeycomb.v3po.translate.util.RWUtils;
24 import io.fd.honeycomb.v3po.translate.spi.write.ChildWriterCustomizer;
25 import io.fd.honeycomb.v3po.translate.write.WriteFailedException;
26 import java.util.List;
27 import javax.annotation.Nonnull;
28 import org.opendaylight.yangtools.yang.binding.Augmentation;
29 import org.opendaylight.yangtools.yang.binding.ChildOf;
30 import org.opendaylight.yangtools.yang.binding.DataObject;
31 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
32
33 public class CompositeChildWriter<D extends DataObject> extends AbstractCompositeWriter<D>
34     implements ChildWriter<D> {
35
36     private final ChildWriterCustomizer<D> customizer;
37
38     public CompositeChildWriter(@Nonnull final Class<D> type,
39                                 @Nonnull final List<ChildWriter<? extends ChildOf<D>>> childWriters,
40                                 @Nonnull final List<ChildWriter<? extends Augmentation<D>>> augWriters,
41                                 @Nonnull final ChildWriterCustomizer<D> customizer) {
42         this(type, childWriters, augWriters, customizer, TraversalType.PREORDER);
43     }
44
45
46     public CompositeChildWriter(@Nonnull final Class<D> type,
47                                 @Nonnull final List<ChildWriter<? extends ChildOf<D>>> childWriters,
48                                 @Nonnull final List<ChildWriter<? extends Augmentation<D>>> augWriters,
49                                 @Nonnull final ChildWriterCustomizer<D> customizer,
50                                 @Nonnull final TraversalType traversalType) {
51         super(type, childWriters, augWriters, traversalType);
52         this.customizer = customizer;
53     }
54
55     public CompositeChildWriter(@Nonnull final Class<D> type,
56                                 @Nonnull final List<ChildWriter<? extends ChildOf<D>>> childWriters,
57                                 @Nonnull final ChildWriterCustomizer<D> customizer) {
58         this(type, childWriters, RWUtils.<D>emptyAugWriterList(), customizer);
59     }
60
61     public CompositeChildWriter(@Nonnull final Class<D> type,
62                                 @Nonnull final ChildWriterCustomizer<D> customizer) {
63         this(type, RWUtils.<D>emptyChildWriterList(), RWUtils.<D>emptyAugWriterList(), customizer);
64     }
65
66     @Override
67     protected void writeCurrentAttributes(@Nonnull final InstanceIdentifier<D> id, @Nonnull final D data,
68                                           @Nonnull final WriteContext ctx) throws WriteFailedException {
69         customizer.writeCurrentAttributes(id, data, ctx.getContext());
70     }
71
72     @Override
73     protected void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<D> id, @Nonnull final D dataBefore,
74                                            @Nonnull WriteContext ctx) throws WriteFailedException {
75         customizer.deleteCurrentAttributes(id, dataBefore, ctx.getContext());
76     }
77
78     @Override
79     protected void updateCurrentAttributes(@Nonnull final InstanceIdentifier<D> id, @Nonnull final D dataBefore,
80                                            @Nonnull final D dataAfter, @Nonnull WriteContext ctx)
81         throws WriteFailedException {
82         customizer.updateCurrentAttributes(id, dataBefore, dataAfter, ctx.getContext());
83     }
84
85     @Override
86     public void writeChild(@Nonnull final InstanceIdentifier<? extends DataObject> parentId,
87                            @Nonnull final DataObject parentData, @Nonnull WriteContext ctx)
88         throws WriteFailedException {
89         final InstanceIdentifier<D> currentId = RWUtils.appendTypeToId(parentId, getManagedDataObjectType());
90         final Optional<D> currentData = customizer.extract(currentId, parentData);
91         if(currentData.isPresent()) {
92             writeCurrent(currentId, currentData.get(), ctx);
93         }
94     }
95
96     @Override
97     public void deleteChild(@Nonnull final InstanceIdentifier<? extends DataObject> parentId,
98                             @Nonnull final DataObject parentDataBefore,
99                             @Nonnull final WriteContext ctx) throws WriteFailedException {
100         final InstanceIdentifier<D> currentId = RWUtils.appendTypeToId(parentId, getManagedDataObjectType());
101         final Optional<D> dataBefore = customizer.extract(currentId, parentDataBefore);
102         if(dataBefore.isPresent()) {
103             deleteCurrent(currentId, dataBefore.get(), ctx);
104         }
105     }
106
107     @Override
108     public void updateChild(@Nonnull final InstanceIdentifier<? extends DataObject> parentId,
109                             @Nonnull final DataObject parentDataBefore, @Nonnull final DataObject parentDataAfter,
110                             @Nonnull final WriteContext ctx) throws WriteFailedException {
111         final InstanceIdentifier<D> currentId = RWUtils.appendTypeToId(parentId, getManagedDataObjectType());
112         final Optional<D> before = customizer.extract(currentId, parentDataBefore);
113         final Optional<D> after = customizer.extract(currentId, parentDataAfter);
114
115         if(before.isPresent()) {
116             if(after.isPresent()) {
117                 updateCurrent(currentId, before.get(), after.get(), ctx);
118             } else {
119                 deleteCurrent(currentId, before.get(), ctx);
120             }
121         } else if (after.isPresent()){
122             writeCurrent(currentId, after.get(), ctx);
123         }
124     }
125 }