Leaving deprecated API in Neutron-Mapper
[groupbasedpolicy.git] / neutron-mapper / src / main / java / org / opendaylight / groupbasedpolicy / neutron / mapper / mapping / NeutronListener.java
1 /*\r
2  * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.\r
3  *\r
4  * This program and the accompanying materials are made available under the\r
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
6  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
7  */\r
8 package org.opendaylight.groupbasedpolicy.neutron.mapper.mapping;\r
9 \r
10 import java.io.Closeable;\r
11 import java.io.IOException;\r
12 import java.util.ArrayList;\r
13 import java.util.Collection;\r
14 import java.util.LinkedHashMap;\r
15 import java.util.List;\r
16 import java.util.Map;\r
17 \r
18 import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
19 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;\r
20 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification.ModificationType;\r
21 import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener;\r
22 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;\r
23 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;\r
24 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
25 import org.opendaylight.neutron.spi.NeutronObject;\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;\r
27 import org.opendaylight.yangtools.concepts.ListenerRegistration;\r
28 import org.opendaylight.yangtools.yang.binding.DataObject;\r
29 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
30 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;\r
31 \r
32 import com.google.common.collect.Iterators;\r
33 import com.google.common.collect.PeekingIterator;\r
34 \r
35 public class NeutronListener implements DataTreeChangeListener<Neutron>, Closeable {\r
36 \r
37     private final ListenerRegistration<NeutronListener> registerDataTreeChangeListener;\r
38     private final Map<InstanceIdentifier<? extends DataObject>, MappingProcessor<? extends DataObject, ? extends NeutronObject>> dataChangeProviders = new LinkedHashMap<>();\r
39     private static DataObjectModification<Neutron> neutron;\r
40 \r
41     public NeutronListener(DataBroker dataProvider) {\r
42         registerDataTreeChangeListener = dataProvider.registerDataTreeChangeListener(new DataTreeIdentifier<>(\r
43                 LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(Neutron.class).build()), this);\r
44     }\r
45 \r
46     @Override\r
47     public void onDataTreeChanged(Collection<DataTreeModification<Neutron>> changes) {\r
48         for (DataTreeModification<Neutron> change : changes) {\r
49             neutron = change.getRootNode();\r
50             for (InstanceIdentifier<? extends DataObject> iid : dataChangeProviders.keySet()) {\r
51                 for (DataObjectModification<? extends DataObject> modifDto : findModifiedData(iid, change.getRootNode())) {\r
52                     processChangedData(modifDto, modifDto.getModificationType(), getMappingProvider(iid));\r
53                 }\r
54             }\r
55         }\r
56     }\r
57 \r
58     /**\r
59      * Finds all modified subnodes of given type in {@link Neutron} node.\r
60      *\r
61      * @param iid path to data in root node\r
62      * @param rootNode modified data of {@link Neutron} node\r
63      * @return {@link List} of modified subnodes\r
64      */\r
65     private List<DataObjectModification<? extends DataObject>> findModifiedData(\r
66             InstanceIdentifier<? extends DataObject> iid, DataObjectModification<Neutron> rootNode) {\r
67         List<DataObjectModification<? extends DataObject>> modDtos = new ArrayList<>();\r
68         PeekingIterator<PathArgument> pathArgs = Iterators.peekingIterator(iid.getPathArguments().iterator());\r
69         DataObjectModification<? extends DataObject> modifDto = rootNode;\r
70         while (pathArgs.hasNext()) {\r
71             pathArgs.next();\r
72             for (DataObjectModification<? extends DataObject> childDto : modifDto.getModifiedChildren()) {\r
73                 if (pathArgs.hasNext() && childDto.getDataType().equals(pathArgs.peek().getType())) {\r
74                     if (childDto.getDataType().equals(iid.getTargetType())) {\r
75                         modDtos.add(childDto);\r
76                     } else {\r
77                         modifDto = childDto;\r
78                         break;\r
79                     }\r
80                 }\r
81             }\r
82         }\r
83         return modDtos;\r
84     }\r
85 \r
86     static Neutron getNeutronDataBefore() {\r
87         return neutron.getDataBefore();\r
88     }\r
89 \r
90     static Neutron getNeutronDataAfter() {\r
91         return neutron.getDataAfter();\r
92     }\r
93 \r
94     @SuppressWarnings("unchecked")\r
95     <T extends DataObject, X extends NeutronObject> void processChangedData(DataObjectModification<?> dto,\r
96             ModificationType m, MappingProcessor<T, X> d) {\r
97         switch (m) {\r
98             case WRITE: {\r
99                 T dataAfter = (T) dto.getDataAfter();\r
100                 X neutronObject = d.convertToNeutron(dataAfter);\r
101                 if (StatusCode.OK == d.canCreate(neutronObject)) {\r
102                     d.created(neutronObject);\r
103                 }\r
104                 break;\r
105             }\r
106             case SUBTREE_MODIFIED: {\r
107                 X neutronObjectBefore = d.convertToNeutron((T) dto.getDataBefore());\r
108                 X neutronObjectAfter = d.convertToNeutron((T) dto.getDataAfter());\r
109                 if (StatusCode.OK == d.canUpdate(neutronObjectAfter, neutronObjectBefore)) {\r
110                     d.updated(neutronObjectAfter);\r
111                 }\r
112                 break;\r
113             }\r
114             case DELETE: {\r
115                 X neutronObjectBefore = d.convertToNeutron((T) dto.getDataBefore());\r
116                 if (StatusCode.OK == d.canDelete(neutronObjectBefore)) {\r
117                     d.deleted(neutronObjectBefore);\r
118                 }\r
119                 break;\r
120             }\r
121         }\r
122     }\r
123 \r
124     public <D extends DataObject, N extends NeutronObject> void registerMappingProviders(\r
125             InstanceIdentifier<D> iid, MappingProcessor<D, N> np) {\r
126         dataChangeProviders.put(iid, np);\r
127     }\r
128 \r
129     @SuppressWarnings("unchecked")\r
130     <D extends DataObject, N extends NeutronObject> MappingProcessor<D, N> getMappingProvider(\r
131             InstanceIdentifier<D> iid) {\r
132         return (MappingProcessor<D, N>) dataChangeProviders.get(iid);\r
133     }\r
134 \r
135     @Override\r
136     public void close() throws IOException {\r
137         registerDataTreeChangeListener.close();\r
138     }\r
139 \r
140 }\r
141 \r