Added response data to operational datastore, refactored data validation
[packetcable.git] / packetcable-policy-server / src / main / java / org / opendaylight / controller / packetcable / provider / validation / DataValidator.java
1 /*
2  * Copyright (c) 2015 CableLabs and others.  All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.controller.packetcable.provider.validation;
10
11 import static com.google.common.base.Preconditions.checkNotNull;
12
13 import com.google.common.collect.Maps;
14 import java.util.Map;
15 import java.util.NoSuchElementException;
16 import javax.annotation.Nonnull;
17 import org.opendaylight.yangtools.yang.binding.DataObject;
18 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
19 import org.slf4j.Logger;
20 import org.slf4j.LoggerFactory;
21
22 /**
23  * Validates restconf data that is supplied by users
24  *
25  * @author rvail
26  */
27 public class DataValidator {
28     private static final Logger logger = LoggerFactory.getLogger(DataValidator.class);
29
30     private final ValidatorProvider validatorProvider;
31
32     public DataValidator(@Nonnull final ValidatorProvider validatorProvider) {
33         this.validatorProvider = checkNotNull(validatorProvider);
34     }
35
36     public Map<InstanceIdentifier<?>, ValidationException> validate(
37             @Nonnull final Map<InstanceIdentifier<?>, DataObject> dataObjectMap,
38             @Nonnull final Validator.Extent extent) {
39         checkNotNull(dataObjectMap);
40
41         Map<InstanceIdentifier<?>, ValidationException> exceptionMap = Maps.newHashMap();
42
43         for (Map.Entry<InstanceIdentifier<?>, DataObject> entry : dataObjectMap.entrySet()) {
44             final InstanceIdentifier<?> iid = entry.getKey();
45             final DataObject data = entry.getValue();
46
47             try {
48                 validate(iid, data, extent);
49             } catch (ValidationException e) {
50                 exceptionMap.put(iid, e);
51                 logger.debug("invalid data: {}", data, e);
52             } catch (NoSuchElementException e) {
53                 logger.error("Unable to find validator for data: {}", data, e);
54             }
55         }
56
57         return exceptionMap;
58     }
59
60     public void validate(@Nonnull InstanceIdentifier<?> iid, @Nonnull final DataObject dataObject,
61             @Nonnull final Validator.Extent extent) throws ValidationException {
62         checkNotNull(iid);
63         checkNotNull(dataObject);
64         validatorProvider.validate(iid.getTargetType(), dataObject, extent);
65     }
66
67     public <T extends DataObject> Map<InstanceIdentifier<T>, ValidationException> validateOneType(
68             @Nonnull final Map<InstanceIdentifier<T>, T> dataObjectMap, @Nonnull final Validator.Extent extent) {
69         checkNotNull(dataObjectMap);
70
71         Map<InstanceIdentifier<T>, ValidationException> exceptionMap = Maps.newHashMap();
72
73         for (Map.Entry<InstanceIdentifier<T>, T> entry : dataObjectMap.entrySet()) {
74             final InstanceIdentifier<T> iid = entry.getKey();
75             final T data = entry.getValue();
76
77             try {
78                 validate(iid, data, extent);
79             } catch (ValidationException e) {
80                 exceptionMap.put(iid, e);
81                 logger.debug("invalid data: {}", data, e);
82             } catch (NoSuchElementException e) {
83                 logger.error("Unable to find validator for data: {}", data, e);
84             }
85         }
86
87         return exceptionMap;
88     }
89
90
91 }