2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.lispflowmapping.neutron;
10 import static java.util.Objects.requireNonNull;
12 import java.util.Collection;
13 import org.opendaylight.mdsal.binding.api.ClusteredDataTreeChangeListener;
14 import org.opendaylight.mdsal.binding.api.DataBroker;
15 import org.opendaylight.mdsal.binding.api.DataObjectModification;
16 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
17 import org.opendaylight.mdsal.binding.api.DataTreeModification;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.Subnet;
21 import org.opendaylight.yangtools.concepts.ListenerRegistration;
22 import org.opendaylight.yangtools.yang.binding.DataObject;
23 import org.slf4j.Logger;
24 import org.slf4j.LoggerFactory;
27 public class DelegatingDataTreeListener<T extends DataObject> implements ClusteredDataTreeChangeListener<T>,
29 private static final Logger LOG = LoggerFactory.getLogger(DelegatingDataTreeListener.class);
30 private final DataProcessor<T> dataProcessor;
31 private ListenerRegistration<ClusteredDataTreeChangeListener<T>> dataTreeChangeListenerRegistration;
33 public DelegatingDataTreeListener(DataProcessor<T> dataProcessor, DataBroker dataBroker,
34 DataTreeIdentifier<T> dataTreeIdentifier) {
35 requireNonNull(dataBroker, "Can not instantiate Listener! Broker is null!");
36 requireNonNull(dataTreeIdentifier, "DataTreeIndentifier can not be null!");
37 this.dataProcessor = dataProcessor;
38 dataTreeChangeListenerRegistration = dataBroker.registerDataTreeChangeListener(dataTreeIdentifier ,this);
41 public static <T extends DataObject> DelegatingDataTreeListener initiateListener(
42 Class<T> dataObject, ILispNeutronService lispNeutronService, DataBroker dataBroker) {
44 if (dataObject == Network.class) {
45 return new NetworkListener(new NetworkDataProcessor(lispNeutronService), dataBroker);
46 } else if (dataObject == Subnet.class) {
47 return new SubnetListener(new SubnetDataProcessor(lispNeutronService), dataBroker);
48 } else if (dataObject == Port.class) {
49 return new PortListener(new PortDataProcessor(lispNeutronService), dataBroker);
51 LOG.debug(dataObject.getName() + " listener can not be instantiated.");
56 public void onDataTreeChanged(Collection<DataTreeModification<T>> changes) {
57 for (DataTreeModification<T> change : changes) {
58 DataObjectModification<T> mod = change.getRootNode();
60 if (mod.getModificationType() == DataObjectModification.ModificationType.WRITE) {
61 T object = mod.getDataAfter();
62 dataProcessor.create(object);
63 LOG.info(object.toString() + " created.");
64 } else if (mod.getModificationType() == DataObjectModification.ModificationType.DELETE) {
65 T object = mod.getDataBefore();
66 dataProcessor.delete(object);
67 LOG.info(object.toString() + " removed.");
69 T object = mod.getDataAfter();
70 dataProcessor.update(object);
71 LOG.info(object.toString() + " updated.");
77 public void close() throws Exception {
78 if (dataTreeChangeListenerRegistration != null) {
79 dataTreeChangeListenerRegistration.close();
80 dataTreeChangeListenerRegistration = null;
82 LOG.info(this.toString() + " closed");