2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
\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
8 package org.opendaylight.groupbasedpolicy.neutron.mapper.mapping;
\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
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
32 import com.google.common.collect.Iterators;
\r
33 import com.google.common.collect.PeekingIterator;
\r
35 public class NeutronListener implements DataTreeChangeListener<Neutron>, Closeable {
\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
41 public NeutronListener(DataBroker dataProvider) {
\r
42 registerDataTreeChangeListener = dataProvider.registerDataTreeChangeListener(new DataTreeIdentifier<>(
\r
43 LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(Neutron.class).build()), this);
\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
59 * Finds all modified subnodes of given type in {@link Neutron} node.
\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
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
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
77 modifDto = childDto;
\r
86 static Neutron getNeutronDataBefore() {
\r
87 return neutron.getDataBefore();
\r
90 static Neutron getNeutronDataAfter() {
\r
91 return neutron.getDataAfter();
\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
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
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
115 X neutronObjectBefore = d.convertToNeutron((T) dto.getDataBefore());
\r
116 if (StatusCode.OK == d.canDelete(neutronObjectBefore)) {
\r
117 d.deleted(neutronObjectBefore);
\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
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
136 public void close() throws IOException {
\r
137 registerDataTreeChangeListener.close();
\r