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;
13 import com.google.common.collect.Maps;
14 import java.util.Collection;
16 import java.util.NoSuchElementException;
17 import javax.annotation.Nonnull;
18 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
19 import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener;
20 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
21 import org.opendaylight.controller.packetcable.provider.validation.DataValidator;
22 import org.opendaylight.controller.packetcable.provider.validation.ValidationException;
23 import org.opendaylight.controller.packetcable.provider.validation.Validator;
24 import org.opendaylight.yangtools.yang.binding.DataObject;
25 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
33 public abstract class AbstractDataTreeChangeListener<T extends DataObject> implements DataTreeChangeListener<T> {
35 protected final Logger logger = LoggerFactory.getLogger(getClass());
37 private final Class<T> tClass;
39 private final DataValidator dataValidator;
41 public AbstractDataTreeChangeListener(Class<T> tClass,DataValidator dataValidator) {
42 this.tClass = checkNotNull(tClass);
43 this.dataValidator = checkNotNull(dataValidator);
46 private ValidationException validateData(final DataTreeModification<T> change){
47 InstanceIdentifier iid = change.getRootPath().getRootIdentifier();
50 // getDataAfter should only remove null if the data was removed, but we don't validate on remove.
51 dataValidator.validate(iid, change.getRootNode().getDataAfter(), Validator.Extent.NODE_AND_SUBTREE);
53 catch (ValidationException e) {
54 logger.debug("invalid data: {}", change.getRootNode().getDataAfter(), e);
61 public void onDataTreeChanged(@Nonnull Collection<DataTreeModification<T>> changes)
63 Map<DataTreeModification<T>, ValidationException> exceptionMap = Maps.newHashMap();
64 for (final DataTreeModification<T> change : changes) {
65 final DataObjectModification<T> root = change.getRootNode();
66 switch (root.getModificationType()) {
67 case SUBTREE_MODIFIED:
69 ValidationException validationException = validateData(change);
70 if(validationException != null){
71 handleInvalidData(change,validationException);
74 handleUpdatedData(change);
76 }catch (NoSuchElementException e) {
77 logger.error("Unable to find validator for data: {}", change.getRootNode().getDataAfter(), e);
82 ValidationException validationException = validateData(change);
83 if(validationException != null){
84 handleInvalidData(change,validationException);
87 // Treat an overwrite as an update
88 boolean update = change.getRootNode().getDataBefore() != null;
90 handleUpdatedData(change);
92 handleCreatedData(change);
95 }catch (NoSuchElementException e) {
96 logger.error("Unable to find validator for data: {}", change.getRootNode().getDataAfter(), e);
100 handleRemovedData(change);
107 protected abstract void handleCreatedData(final DataTreeModification<T> change);
109 protected abstract void handleUpdatedData(final DataTreeModification<T> change);
111 protected abstract void handleRemovedData(final DataTreeModification<T> change);
113 protected abstract void handleInvalidData(final DataTreeModification<T> change, ValidationException validationException);