Merge "Rework IOVisor model and validate IovisorModuleInstance on Endpoint created...
[groupbasedpolicy.git] / groupbasedpolicy / src / main / java / org / opendaylight / groupbasedpolicy / resolver / validator / PolicyValidator.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. 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.groupbasedpolicy.resolver.validator;
10
11 import java.util.HashMap;
12 import java.util.Map;
13 import javax.annotation.Nullable;
14 import org.opendaylight.groupbasedpolicy.resolver.PolicyResolver;
15 import org.opendaylight.groupbasedpolicy.resolver.validator.validators.ActionInstanceValidator;
16 import org.opendaylight.groupbasedpolicy.resolver.validator.validators.SubjectFeatureInstancesValidator;
17 import org.opendaylight.groupbasedpolicy.resolver.validator.validators.TenantValidator;
18 import org.opendaylight.yangtools.yang.binding.DataContainer;
19
20 /**
21  *
22  * Factory to create concrete {@link Validator} class for object to validate.
23  *
24  */
25 public class PolicyValidator {
26
27     /**
28      * Map of Objects and their corresponding validators.
29      */
30     private static final Map<Class<? extends DataContainer>, AbstractValidator<? extends DataContainer>> VALIDATORS;
31
32     static {
33         VALIDATORS = new HashMap<>();
34         TenantValidator tenantValidator = new TenantValidator();
35         VALIDATORS.put(tenantValidator.getType(), tenantValidator);
36         SubjectFeatureInstancesValidator subjectFeatureInstancesValidator = new SubjectFeatureInstancesValidator();
37         VALIDATORS.put(subjectFeatureInstancesValidator.getType(), subjectFeatureInstancesValidator);
38         ActionInstanceValidator actionInstanceValidator = new ActionInstanceValidator();
39         VALIDATORS.put(actionInstanceValidator.getType(), actionInstanceValidator);
40     }
41
42     /**
43      * Validator Returns {@link Validator} for given object.
44      *
45      * @param <T>
46      * @param object Object, for which validator should be created.
47      * @param policyResolver Instance of {@link PolicyResolver} that contains
48      * additional data required for individual validation process
49      * @return Concrete {@link Validator} for given object
50      */
51     @SuppressWarnings({"unchecked", "rawtypes"})
52     static <T extends DataContainer> Validator<T> createValidator(T object, PolicyResolver policyResolver) {
53         AbstractValidator validator = VALIDATORS.get(object.getImplementedInterface());
54         if (validator == null) {
55             return null;
56         }
57         validator.setPolicyResolver(policyResolver);
58         return (Validator<T>) validator;
59     }
60
61     /**
62      * @param <T>
63      * @param object Object to validate
64      * @param policyResolver Instance of {@link PolicyResolver} that contains
65      * additional data required for individual validation process
66      * @return {@code null} if validator for the object does not exist;
67      * {@link ValidationResult} otherwise
68      */
69     public static @Nullable
70     <T extends DataContainer> ValidationResult validate(T object, PolicyResolver policyResolver) {
71         Validator<T> validator = createValidator(object, policyResolver);
72         return validator.validate(object);
73     }
74
75 }