2 * Copyright (c) 2015 CableLabs 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
9 package org.opendaylight.controller.packetcable.provider;
11 import static com.google.common.base.Preconditions.checkNotNull;
12 import static org.opendaylight.controller.packetcable.provider.DataChangeUtils.collectTypeFromMap;
13 import static org.opendaylight.controller.packetcable.provider.DataChangeUtils.collectTypeFromSet;
14 import static org.opendaylight.controller.packetcable.provider.DataChangeUtils.logChange;
15 import static org.opendaylight.controller.packetcable.provider.DataChangeUtils.relativeComplement;
17 import com.google.common.collect.Maps;
19 import java.util.NoSuchElementException;
21 import java.util.Collection;
23 import org.eclipse.jdt.annotation.NonNull;
24 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
25 import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener;
26 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
27 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
28 import org.opendaylight.controller.packetcable.provider.validation.DataValidator;
29 import org.opendaylight.controller.packetcable.provider.validation.ValidationException;
30 import org.opendaylight.controller.packetcable.provider.validation.Validator;
31 import org.opendaylight.controller.packetcable.provider.validation.ValidatorProvider;
32 import org.opendaylight.yangtools.yang.binding.DataObject;
33 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
37 import javax.annotation.Nonnull;
43 public abstract class AbstractDataTreeChangeListener<T extends DataObject> implements DataTreeChangeListener<T> {
45 protected final Logger logger = LoggerFactory.getLogger(getClass());
47 private final Class<T> tClass;
49 private final DataValidator dataValidator;
51 public AbstractDataTreeChangeListener(Class<T> tClass,DataValidator dataValidator) {
52 this.tClass = checkNotNull(tClass);
53 this.dataValidator = checkNotNull(dataValidator);
56 private ValidationException validateData(final DataTreeModification<T> change){
57 InstanceIdentifier iid = change.getRootPath().getRootIdentifier();
60 // getDataAfter should only remove null if the data was removed, but we don't validate on remove.
61 dataValidator.validate(iid, change.getRootNode().getDataAfter(), Validator.Extent.NODE_AND_SUBTREE);
63 catch (ValidationException e) {
64 logger.debug("invalid data: {}", change.getRootNode().getDataAfter(), e);
71 public void onDataTreeChanged(@Nonnull Collection<DataTreeModification<T>> changes)
73 Map<DataTreeModification<T>, ValidationException> exceptionMap = Maps.newHashMap();
74 for (final DataTreeModification<T> change : changes) {
75 final DataObjectModification<T> root = change.getRootNode();
76 switch (root.getModificationType()) {
77 case SUBTREE_MODIFIED:
79 ValidationException validationException = validateData(change);
80 if(validationException != null){
81 handleInvalidData(change,validationException);
84 handleUpdatedData(change);
86 }catch (NoSuchElementException e) {
87 logger.error("Unable to find validator for data: {}", change.getRootNode().getDataAfter(), e);
92 ValidationException validationException = validateData(change);
93 if(validationException != null){
94 handleInvalidData(change,validationException);
97 // Treat an overwrite as an update
98 boolean update = change.getRootNode().getDataBefore() != null;
100 handleUpdatedData(change);
102 handleCreatedData(change);
105 }catch (NoSuchElementException e) {
106 logger.error("Unable to find validator for data: {}", change.getRootNode().getDataAfter(), e);
110 handleRemovedData(change);
117 protected abstract void handleCreatedData(final DataTreeModification<T> change);
119 protected abstract void handleUpdatedData(final DataTreeModification<T> change);
121 protected abstract void handleRemovedData(final DataTreeModification<T> change);
123 protected abstract void handleInvalidData(final DataTreeModification<T> change, ValidationException validationException);