-/*\r
- * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-\r
-package org.opendaylight.groupbasedpolicy.neutron.vpp.mapper.processors;\r
-\r
-import java.io.Closeable;\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.LinkedHashSet;\r
-import java.util.List;\r
-import java.util.Set;\r
-import java.util.concurrent.ExecutionException;\r
-\r
-import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener;\r
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
-import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;\r
-import org.opendaylight.controller.md.sal.binding.api.DataObjectModification.ModificationType;\r
-import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;\r
-import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;\r
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;\r
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;\r
-import org.opendaylight.yangtools.concepts.ListenerRegistration;\r
-import org.opendaylight.yangtools.yang.binding.DataObject;\r
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;\r
-import org.slf4j.Logger;\r
-import org.slf4j.LoggerFactory;\r
-\r
-import com.google.common.annotations.VisibleForTesting;\r
-import com.google.common.collect.Iterators;\r
-import com.google.common.collect.PeekingIterator;\r
-\r
-public class NeutronListener implements ClusteredDataTreeChangeListener<Neutron>, Closeable {\r
-\r
- private static final Logger LOG = LoggerFactory.getLogger(NeutronListener.class);\r
-\r
- private final Set<MappingProvider<? extends DataObject>> dataChangeProviders = new LinkedHashSet<>();\r
- protected ListenerRegistration<NeutronListener> registeredListener;\r
-\r
- public NeutronListener(DataBroker dataBroker, NodeId routingNode) {\r
- LOG.info("Routing node chosen in ODL is {}", routingNode);\r
- registerHandlersAndListeners(dataBroker, routingNode);\r
- registeredListener = dataBroker.registerDataTreeChangeListener(new DataTreeIdentifier<>(\r
- LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(Neutron.class).build()), this);\r
- }\r
-\r
- private void registerHandlersAndListeners(DataBroker dataBroker, NodeId routingNode) {\r
- PortHandler portHandler = new PortHandler(dataBroker, routingNode);\r
- dataChangeProviders.add(new PortAware(portHandler, dataBroker));\r
- dataChangeProviders.add(new NetworkAware(dataBroker));\r
- dataChangeProviders.add(new SubnetAware(dataBroker));\r
- }\r
-\r
- @Override\r
- public void onDataTreeChanged(Collection<DataTreeModification<Neutron>> changes) {\r
- for (DataTreeModification<Neutron> change : changes) {\r
- DataObjectModification<Neutron> rootNode = change.getRootNode();\r
- for (MappingProvider<? extends DataObject> provider : dataChangeProviders) {\r
- for (DataObjectModification<? extends DataObject> modDto : findModifiedData(provider, rootNode)) {\r
- try {\r
- processChangedData(modDto, modDto.getModificationType(), provider);\r
- } catch (InterruptedException | ExecutionException e) {\r
- LOG.error("Failed to process {} modification of node: {}. {}", modDto.getModificationType(),\r
- modDto.getIdentifier(), e.getStackTrace());\r
- }\r
- }\r
- }\r
- }\r
- }\r
-\r
- List<DataObjectModification<? extends DataObject>> findModifiedData(MappingProvider<? extends DataObject> provider,\r
- DataObjectModification<Neutron> rootNode) {\r
- List<DataObjectModification<? extends DataObject>> modDtos = new ArrayList<>();\r
- PeekingIterator<PathArgument> pathArgs = Iterators.peekingIterator(provider.getNeutronDtoIid()\r
- .getPathArguments()\r
- .iterator());\r
- DataObjectModification<? extends DataObject> modifDto = rootNode;\r
- while (pathArgs.hasNext()) {\r
- pathArgs.next();\r
- for (DataObjectModification<? extends DataObject> childDto : modifDto.getModifiedChildren()) {\r
- if (pathArgs.hasNext() && childDto.getDataType().equals(pathArgs.peek().getType())) {\r
- if (childDto.getDataType().equals(provider.getNeutronDtoIid().getTargetType())) {\r
- modDtos.add(childDto);\r
- } else {\r
- modifDto = childDto;\r
- break;\r
- }\r
- }\r
- }\r
- }\r
- return modDtos;\r
- }\r
-\r
- @SuppressWarnings("unchecked")\r
- <T extends DataObject> void processChangedData(DataObjectModification<?> dto, ModificationType m,\r
- MappingProvider<T> processor) throws InterruptedException, ExecutionException {\r
- switch (m) {\r
- case WRITE: {\r
- if (dto.getDataBefore() != null) {\r
- processor.processUpdatedNeutronDto((T) dto.getDataBefore(), (T) dto.getDataAfter());\r
- } else {\r
- processor.processCreatedNeutronDto((T) dto.getDataAfter());\r
- }\r
- break;\r
- }\r
- case SUBTREE_MODIFIED: {\r
- processor.processUpdatedNeutronDto((T) dto.getDataBefore(), (T) dto.getDataAfter());\r
- break;\r
- }\r
- case DELETE: {\r
- processor.processDeletedNeutronDto((T) dto.getDataBefore());\r
- break;\r
- }\r
- }\r
- }\r
-\r
- @VisibleForTesting\r
- void clearDataChangeProviders() {\r
- dataChangeProviders.clear();\r
- }\r
-\r
- @VisibleForTesting\r
- <T extends DataObject> void addDataChangeProvider(MappingProvider<T> t) {\r
- dataChangeProviders.add(t);\r
- }\r
-\r
- @Override\r
- public void close() {\r
- registeredListener.close();\r
- }\r
-}\r
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.groupbasedpolicy.neutron.vpp.mapper.processors;
+
+import java.io.Closeable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.ExecutionException;
+
+import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
+import org.opendaylight.controller.md.sal.binding.api.DataObjectModification.ModificationType;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.Iterators;
+import com.google.common.collect.PeekingIterator;
+
+public class NeutronListener implements ClusteredDataTreeChangeListener<Neutron>, Closeable {
+
+ private static final Logger LOG = LoggerFactory.getLogger(NeutronListener.class);
+
+ private final Set<MappingProvider<? extends DataObject>> dataChangeProviders = new LinkedHashSet<>();
+ protected ListenerRegistration<NeutronListener> registeredListener;
+
+ public NeutronListener(DataBroker dataBroker, NodeId routingNode) {
+ LOG.info("Routing node chosen in ODL is {}", routingNode);
+ registerHandlersAndListeners(dataBroker, routingNode);
+ registeredListener = dataBroker.registerDataTreeChangeListener(new DataTreeIdentifier<>(
+ LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(Neutron.class).build()), this);
+ }
+
+ private void registerHandlersAndListeners(DataBroker dataBroker, NodeId routingNode) {
+ PortHandler portHandler = new PortHandler(dataBroker, routingNode);
+ dataChangeProviders.add(new PortAware(portHandler, dataBroker));
+ dataChangeProviders.add(new NetworkAware(dataBroker));
+ dataChangeProviders.add(new SubnetAware(dataBroker));
+ }
+
+ @Override
+ public void onDataTreeChanged(Collection<DataTreeModification<Neutron>> changes) {
+ for (DataTreeModification<Neutron> change : changes) {
+ DataObjectModification<Neutron> rootNode = change.getRootNode();
+ for (MappingProvider<? extends DataObject> provider : dataChangeProviders) {
+ for (DataObjectModification<? extends DataObject> modDto : findModifiedData(provider, rootNode)) {
+ try {
+ processChangedData(modDto, modDto.getModificationType(), provider);
+ } catch (InterruptedException | ExecutionException e) {
+ LOG.error("Failed to process {} modification of node: {}. {}", modDto.getModificationType(),
+ modDto.getIdentifier(), e.getStackTrace());
+ }
+ }
+ }
+ }
+ }
+
+ List<DataObjectModification<? extends DataObject>> findModifiedData(MappingProvider<? extends DataObject> provider,
+ DataObjectModification<Neutron> rootNode) {
+ List<DataObjectModification<? extends DataObject>> modDtos = new ArrayList<>();
+ PeekingIterator<PathArgument> pathArgs = Iterators.peekingIterator(provider.getNeutronDtoIid()
+ .getPathArguments()
+ .iterator());
+ DataObjectModification<? extends DataObject> modifDto = rootNode;
+ while (pathArgs.hasNext()) {
+ pathArgs.next();
+ for (DataObjectModification<? extends DataObject> childDto : modifDto.getModifiedChildren()) {
+ if (pathArgs.hasNext() && childDto.getDataType().equals(pathArgs.peek().getType())) {
+ if (childDto.getDataType().equals(provider.getNeutronDtoIid().getTargetType())) {
+ modDtos.add(childDto);
+ } else {
+ modifDto = childDto;
+ break;
+ }
+ }
+ }
+ }
+ return modDtos;
+ }
+
+ @SuppressWarnings("unchecked")
+ <T extends DataObject> void processChangedData(DataObjectModification<?> dto, ModificationType m,
+ MappingProvider<T> processor) throws InterruptedException, ExecutionException {
+ switch (m) {
+ case WRITE: {
+ if (dto.getDataBefore() != null) {
+ processor.processUpdatedNeutronDto((T) dto.getDataBefore(), (T) dto.getDataAfter());
+ } else {
+ processor.processCreatedNeutronDto((T) dto.getDataAfter());
+ }
+ break;
+ }
+ case SUBTREE_MODIFIED: {
+ processor.processUpdatedNeutronDto((T) dto.getDataBefore(), (T) dto.getDataAfter());
+ break;
+ }
+ case DELETE: {
+ processor.processDeletedNeutronDto((T) dto.getDataBefore());
+ break;
+ }
+ }
+ }
+
+ @VisibleForTesting
+ void clearDataChangeProviders() {
+ dataChangeProviders.clear();
+ }
+
+ @VisibleForTesting
+ <T extends DataObject> void addDataChangeProvider(MappingProvider<T> t) {
+ dataChangeProviders.add(t);
+ }
+
+ @Override
+ public void close() {
+ registeredListener.close();
+ }
+}