Simplifying validators 25/30225/7
authorTomas Cechvala <tcechval@cisco.com>
Thu, 19 Nov 2015 11:53:33 +0000 (12:53 +0100)
committerTomas Cechvala <tcechval@cisco.com>
Mon, 30 Nov 2015 13:25:54 +0000 (14:25 +0100)
Complicated validation code made simpler.
Added methods for registering classif instance validator.

Change-Id: I428f5d13b07bd1d0d40dff02c29334e329e7fb04
Signed-off-by: Tomas Cechvala <tcechval@cisco.com>
24 files changed:
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/ActionInstanceValidator.java [deleted file]
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/PolicyResolver.java
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/AbstractValidator.java [deleted file]
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/PolicyValidator.java [deleted file]
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/SimpleResult.java [deleted file]
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/ValidationResult.java
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/ValidationResultBuilder.java [new file with mode: 0644]
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/Validator.java
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/ActionInstanceValidator.java [deleted file]
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/SubjectFeatureInstancesValidator.java [deleted file]
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/TenantValidator.java [deleted file]
groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/PolicyValidatorTest.java [deleted file]
groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/SimpleResultTest.java [deleted file]
groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/ValidationResultTest.java [new file with mode: 0644]
groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/ValidatorResultTest.java [deleted file]
groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/ActionInstanceValidatorTest.java [deleted file]
groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/SubjectFeatureInstancesValidatorTest.java [deleted file]
groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/TenantValidatorTest.java [deleted file]
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/PolicyManager.java
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/Action.java
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/AllowAction.java
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/ChainAction.java
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/PolicyManagerTest.java
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/ChainActionTest.java

diff --git a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/ActionInstanceValidator.java b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/ActionInstanceValidator.java
deleted file mode 100644 (file)
index 155d677..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.groupbasedpolicy.resolver;
-
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.subject.feature.instances.ActionInstance;
-
-
-public interface ActionInstanceValidator {
-
-    boolean isValid(ActionInstance actionInstance);
-}
index 723645fc2eb2fe6c21221defb280d2050711dddf..0123fba6e3fad7cc82642aeda315617eaf2fec49 100755 (executable)
@@ -24,17 +24,22 @@ import javax.annotation.concurrent.Immutable;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.binding.api.ReadTransaction;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.groupbasedpolicy.resolver.validator.ValidationResult;
+import org.opendaylight.groupbasedpolicy.resolver.validator.Validator;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ActionDefinitionId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierDefinitionId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.Tenant;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.ResolvedPolicies;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.ResolvedPoliciesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.SubjectFeatureInstances;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.subject.feature.instances.ActionInstance;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.subject.feature.instances.ClassifierInstance;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -43,6 +48,9 @@ import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Optional;
 import com.google.common.base.Predicate;
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.Multimaps;
+import com.google.common.collect.SetMultimap;
 import com.google.common.collect.Sets;
 import com.google.common.collect.Table;
 import com.google.common.collect.Table.Cell;
@@ -50,8 +58,6 @@ import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 
-import org.opendaylight.groupbasedpolicy.resolver.validator.PolicyValidator;
-import org.opendaylight.groupbasedpolicy.resolver.validator.ValidationResult;
 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
 
 /**
@@ -97,7 +103,8 @@ public class PolicyResolver implements AutoCloseable {
      * Store validators for ActionDefinitions from Renderers
      *
      */
-    protected ConcurrentMap<ActionDefinitionId, ActionInstanceValidator> registeredActions = new ConcurrentHashMap<>();
+    protected SetMultimap<ActionDefinitionId, Validator<ActionInstance>> actionInstanceValidatorsByDefinition = Multimaps.synchronizedSetMultimap(HashMultimap.<ActionDefinitionId, Validator<ActionInstance>>create());
+    protected SetMultimap<ClassifierDefinitionId, Validator<ClassifierInstance>> classifierInstanceValidatorsByDefinition = Multimaps.synchronizedSetMultimap(HashMultimap.<ClassifierDefinitionId, Validator<ClassifierInstance>>create());
 
     public PolicyResolver(DataBroker dataProvider,
             ScheduledExecutorService executor) {
@@ -148,8 +155,24 @@ public class PolicyResolver implements AutoCloseable {
         return tc.tenant.get();
     }
 
-    public void registerActionDefinitions(ActionDefinitionId actionDefinitionId, ActionInstanceValidator validator) {
-        registeredActions.putIfAbsent(actionDefinitionId, validator);
+    public void registerActionInstanceValidators(ActionDefinitionId actionDefinitionId,
+            Validator<ActionInstance> validator) {
+        actionInstanceValidatorsByDefinition.put(actionDefinitionId, validator);
+    }
+
+    public void unregisterActionInstanceValidators(ActionDefinitionId actionDefinitionId,
+            Validator<ActionInstance> validator) {
+        actionInstanceValidatorsByDefinition.remove(actionDefinitionId, validator);
+    }
+
+    public void registerClassifierInstanceValidators(ClassifierDefinitionId classifierDefinitionId,
+            Validator<ClassifierInstance> validator) {
+        classifierInstanceValidatorsByDefinition.put(classifierDefinitionId, validator);
+    }
+
+    public void unregisterClassifierInstanceValidators(ClassifierDefinitionId classifierDefinitionId,
+            Validator<ClassifierInstance> validator) {
+        classifierInstanceValidatorsByDefinition.remove(classifierDefinitionId, validator);
     }
 
     /**
@@ -310,7 +333,11 @@ public class PolicyResolver implements AutoCloseable {
                 }
 
                 Tenant t = InheritanceUtils.resolveTenant(result.get());
-                if (isValidTenant(t)) {
+                SubjectFeatureInstances subjectFeatureInstances = t.getSubjectFeatureInstances();
+                if (subjectFeatureInstances != null) {
+                    // TODO log and remove invalid action instances
+                    if (actionInstancesAreValid(subjectFeatureInstances.getActionInstance())
+                            && classifierInstancesAreValid(subjectFeatureInstances.getClassifierInstance())) {
                     IndexedTenant it = new IndexedTenant(t);
                     if (!tenantRef.compareAndSet(ot, it)) {
                         // concurrent update of tenant policy. Retry
@@ -324,6 +351,7 @@ public class PolicyResolver implements AutoCloseable {
                     }
                 }
             }
+        }
 
             @Override
             public void onFailure(Throwable t) {
@@ -399,6 +427,56 @@ public class PolicyResolver implements AutoCloseable {
         return result;
     }
 
+    /**
+     * Validation of action instances.
+     *
+     * @param actionInstances list of instances to validate
+     * @return true if instances are valid or if <code>actionInstances</code>
+     * is <code>null</code>, Otherwise returns false.
+     *
+     */
+    private boolean actionInstancesAreValid(List<ActionInstance> actionInstances) {
+        if (actionInstances == null) {
+            return true;
+        }
+        for (ActionInstance actionInstance : actionInstances) {
+            Set<Validator<ActionInstance>> actionInstanceValidators = actionInstanceValidatorsByDefinition.get(actionInstance.getActionDefinitionId());
+            for (Validator<ActionInstance> actionInstanceValidator : actionInstanceValidators) {
+                ValidationResult validationResult = actionInstanceValidator.validate(actionInstance);
+                if (!validationResult.isValid()) {
+                    LOG.error("ActionInstance {} is not valid!", actionInstance.getName());
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Validation of classifier instances.
+     *
+     * @param classifierInstances list of instances to validate
+     * @return true if instances are valid or if <code>classifierInstances</code>
+     * is <code>null</code>, Otherwise returns false.
+     *
+     */
+    private boolean classifierInstancesAreValid(List<ClassifierInstance> classifierInstances) {
+        if (classifierInstances == null) {
+            return true;
+        }
+        for (ClassifierInstance classifierInstance : classifierInstances) {
+            Set<Validator<ClassifierInstance>> classifierInstanceValidators = classifierInstanceValidatorsByDefinition.get(classifierInstance.getClassifierDefinitionId());
+            for (Validator<ClassifierInstance> classifierInstanceValidator : classifierInstanceValidators) {
+                ValidationResult validationResult = classifierInstanceValidator.validate(classifierInstance);
+                if (!validationResult.isValid()) {
+                    LOG.error("ClassifierInstance {} is not valid!", classifierInstance.getName());
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
     protected static class TenantContext {
 
         ListenerRegistration<DataChangeListener> registration;
@@ -428,20 +506,4 @@ public class PolicyResolver implements AutoCloseable {
 
     }
 
-    private boolean isValidTenant(Tenant t) {
-        ValidationResult validationResult = PolicyValidator.validate(t, this);
-        if (validationResult == null) {
-            return true;
-        }
-        return validationResult.getResult().getValue();
-    }
-
-    public ActionInstanceValidator getActionInstanceValidator(ActionDefinitionId actionDefinitionId) {
-        if (registeredActions == null) {
-            return null;
-        }
-        return registeredActions.get(actionDefinitionId);
-
-    }
-
 }
diff --git a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/AbstractValidator.java b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/AbstractValidator.java
deleted file mode 100644 (file)
index 79f77ca..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.groupbasedpolicy.resolver.validator;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.opendaylight.groupbasedpolicy.resolver.PolicyResolver;
-import org.opendaylight.yangtools.yang.binding.ChildOf;
-import org.opendaylight.yangtools.yang.binding.DataContainer;
-
-/**
- * Abstract class for all Validators, that will be used to validate concrete
- * Policy objects. Contains basic functions needed for validation.
- *
- * @param <U>
- */
-public abstract class AbstractValidator<U extends DataContainer> implements Validator<U> {
-
-    /**
-     * Instance of {@link PolicyResolver} that contains additional data required
-     * for individual validation process
-     */
-    private PolicyResolver policyResolver;
-
-    /**
-     *
-     * @return Instance of {@link PolicyResolver}
-     */
-    protected final PolicyResolver getPolicyResolver() {
-        return policyResolver;
-    }
-
-    /**
-     * {@link PolicyResolver} contains additional data required for individual
-     * validation process
-     *
-     * @param policyResolver Istance of {@link PolicyResolver}
-     */
-    public final void setPolicyResolver(PolicyResolver policyResolver) {
-        this.policyResolver = policyResolver;
-    }
-
-    @Override
-    public ValidationResult validate(U objectToValidate) {
-        ValidationResult result = new ValidationResult(this.getClass());
-
-        SimpleResult selfValidationResult = validateSelf(objectToValidate);
-
-        if (selfValidationResult.isFailure()) {
-            result.setResult(ValidationResult.Result.FAIL_BASE);
-        }
-
-        result.setDescription(selfValidationResult.getDescription());
-
-        List<? extends DataContainer> childObjects = getChildObjects(objectToValidate);
-        this.validateChildren(childObjects, result);
-
-        return result;
-    }
-
-    /**
-     * This function is supposed to do base validation of given object (e.g.
-     * metadata check).
-     *
-     * Individual validators can override this method, to provide their own
-     * validation function.
-     *
-     * @param objectToValidate Object to validate by validator
-     * @return {@link SimpleResult} object
-     */
-    protected SimpleResult validateSelf(U objectToValidate) {
-
-        return new SimpleResult(true, "Default validation");
-    }
-
-    /**
-     * Function to validate all children in list. Result of all validations is
-     * saved to its parent {@link ValidationResult}.
-     *
-     * @param childObjects List of objects to validate
-     * @param parentResult Result of base validation.
-     */
-    private void validateChildren(List<? extends DataContainer> childObjects, ValidationResult parentResult) {
-        if (childObjects == null) {
-            return;
-        }
-
-        for (DataContainer child : childObjects) {
-            Validator<DataContainer> validator = PolicyValidator.createValidator(child, getPolicyResolver());
-            if (validator != null) {
-                parentResult.addChildResult(validator.validate(child));
-            }
-        }
-    }
-
-    /**
-     * Return list of all children objects of given object, that should be
-     * validated.
-     *
-     * Individual validators must override this method, if they want to execute
-     * validation on their children.
-     *
-     * @param objectToValidate Object that is validated by this validator
-     * @return List of child objects associated to {@code objectToValidate}. If
-     * there is not any child, return empty list or {@code null}.
-     */
-    protected <T extends DataContainer & ChildOf<U>> List<T> getChildObjects(U objectToValidate) {
-        return Collections.emptyList();
-    }
-
-    @Override
-    public abstract Class<U> getType();
-}
diff --git a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/PolicyValidator.java b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/PolicyValidator.java
deleted file mode 100644 (file)
index c0abbf0..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.groupbasedpolicy.resolver.validator;
-
-import java.util.HashMap;
-import java.util.Map;
-import javax.annotation.Nullable;
-import org.opendaylight.groupbasedpolicy.resolver.PolicyResolver;
-import org.opendaylight.groupbasedpolicy.resolver.validator.validators.ActionInstanceValidator;
-import org.opendaylight.groupbasedpolicy.resolver.validator.validators.SubjectFeatureInstancesValidator;
-import org.opendaylight.groupbasedpolicy.resolver.validator.validators.TenantValidator;
-import org.opendaylight.yangtools.yang.binding.DataContainer;
-
-/**
- *
- * Factory to create concrete {@link Validator} class for object to validate.
- *
- */
-public class PolicyValidator {
-
-    /**
-     * Map of Objects and their corresponding validators.
-     */
-    private static final Map<Class<? extends DataContainer>, AbstractValidator<? extends DataContainer>> VALIDATORS;
-
-    static {
-        VALIDATORS = new HashMap<>();
-        TenantValidator tenantValidator = new TenantValidator();
-        VALIDATORS.put(tenantValidator.getType(), tenantValidator);
-        SubjectFeatureInstancesValidator subjectFeatureInstancesValidator = new SubjectFeatureInstancesValidator();
-        VALIDATORS.put(subjectFeatureInstancesValidator.getType(), subjectFeatureInstancesValidator);
-        ActionInstanceValidator actionInstanceValidator = new ActionInstanceValidator();
-        VALIDATORS.put(actionInstanceValidator.getType(), actionInstanceValidator);
-    }
-
-    /**
-     * Validator Returns {@link Validator} for given object.
-     *
-     * @param <T>
-     * @param object Object, for which validator should be created.
-     * @param policyResolver Instance of {@link PolicyResolver} that contains
-     * additional data required for individual validation process
-     * @return Concrete {@link Validator} for given object
-     */
-    @SuppressWarnings({"unchecked", "rawtypes"})
-    static <T extends DataContainer> Validator<T> createValidator(T object, PolicyResolver policyResolver) {
-        AbstractValidator validator = VALIDATORS.get(object.getImplementedInterface());
-        if (validator == null) {
-            return null;
-        }
-        validator.setPolicyResolver(policyResolver);
-        return (Validator<T>) validator;
-    }
-
-    /**
-     * @param <T>
-     * @param object Object to validate
-     * @param policyResolver Instance of {@link PolicyResolver} that contains
-     * additional data required for individual validation process
-     * @return {@code null} if validator for the object does not exist;
-     * {@link ValidationResult} otherwise
-     */
-    public static @Nullable
-    <T extends DataContainer> ValidationResult validate(T object, PolicyResolver policyResolver) {
-        Validator<T> validator = createValidator(object, policyResolver);
-        return validator.validate(object);
-    }
-
-}
diff --git a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/SimpleResult.java b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/SimpleResult.java
deleted file mode 100644 (file)
index 27e4f63..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.groupbasedpolicy.resolver.validator;
-
-/**
- * Class that represents simple result (e.g. SUCCESS/FAILURE and description of
- * that result). Provide option to save custom result (state/code), which can be
- * evaluated by other processes.
- *
- * @see SimpleResult#code
- *
- */
-public class SimpleResult {
-
-    /**
-     * Code of result.
-     */
-    private final int code;
-    /**
-     * Description of result.
-     */
-    private final String description;
-
-    /**
-     * Construct new {@link SimpleResult}.
-     *
-     * @param result State of result ({@code true} on success and {@code false}
-     * on failure).
-     * @param description Description of result.
-     */
-    public SimpleResult(boolean result, String description) {
-        this.code = result ? 0 : 1;
-        this.description = description;
-    }
-
-    /**
-     * Construct new {@link SimpleResult} with empty description.
-     *
-     * @param result State of result ({@code true} on SUCCESS and {@code false}
-     * on FAILURE).
-     */
-    public SimpleResult(boolean result) {
-        this(result, null);
-    }
-
-    /**
-     * Construct new {@link SimpleResult}.
-     *
-     * @param code Code of result, where 0 is expected as SUCCESS and everything
-     * else as FAILURE.
-     * @param description Description of result.
-     */
-    public SimpleResult(int code, String description) {
-        this.code = code;
-        this.description = description;
-    }
-
-    /**
-     * Construct new {@link SimpleResult} with empty description.
-     *
-     * @param code Code of result, where 0 is expected as SUCCESS and everything
-     * else as FAILURE.
-     */
-    public SimpleResult(int code) {
-        this(code, null);
-    }
-
-    /**
-     * Returns code of result.
-     *
-     * @return Code of result
-     */
-    public int getCode() {
-        return code;
-    }
-
-    /**
-     * Returns {@code true} if code of result IS {@code 0}, otherwise returns
-     * {@code false}.
-     *
-     * @return {@code true} or {@code false} based on value of {@code code}
-     */
-    public boolean isSuccess() {
-        return getCode() == 0;
-    }
-
-    /**
-     * Returns {@code true} if code of result IS NOT {@code 0}, otherwise
-     * returns {@code false}.
-     *
-     * @return {@code true} or {@code false} based on value of {@code code}
-     */
-    public boolean isFailure() {
-        return !isSuccess();
-    }
-
-    /**
-     * Returns saved description of result or empty string.
-     *
-     * @return Description of result.
-     */
-    public String getDescription() {
-        if (description == null) {
-            return "";
-        } else {
-            return description;
-        }
-    }
-
-}
index dd533883e8831999a54e36702318ec18a0e95d4e..9e0ec63d22deee004675e4478043efe3d2d15da6 100644 (file)
 
 package org.opendaylight.groupbasedpolicy.resolver.validator;
 
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Class to hold validation results of object and his children.
- *
- */
-public class ValidationResult {
-
-    /**
-     * Enumeration of possible results.
-     */
-    public enum Result {
-
-        /**
-         * Everything is OK
-         */
-        SUCCESS(true),
-        /**
-         * Base validation failed
-         */
-        FAIL_BASE(false),
-        /**
-         * Validation of (any) child failed
-         */
-        FAIL_CHILD(false),
-        /**
-         * Base validation and validation of (any) child failed
-         */
-        FAIL_BASE_AND_CHILD(false);
-
-        private boolean value;
-
-        Result(boolean value) {
-            this.value = value;
-        }
-
-        public boolean getValue() {
-            return this.value;
-        }
-    }
-
-    /**
-     * Variable to store result of validation. The final result is based on base
-     * status and status of all children.
-     */
-    private Result result = Result.SUCCESS;
-
-    /**
-     * Class of {@link Validator}, which returns result.
-     */
-    private final Class<? extends Validator> validatorClass;
-
-    /**
-     * List of all children validations.
-     */
-    private List<ValidationResult> childResults = new ArrayList<>();
-
-    /**
-     * Human-readable description of current status.
-     */
-    private String description;
-
-    /**
-     * Create new {@link ValidationResult} to store result of validation.
-     *
-     * @param validatorClass Creator of {@link ValidationResult}
-     */
-    public ValidationResult(Class<? extends Validator> validatorClass) {
-        this.validatorClass = validatorClass;
-    }
+public interface ValidationResult {
 
     /**
+     * Returns whether or not validation was successful.
      *
-     * @return Current result
+     * @return true if validation was successful, false otherwise.
      */
-    public Result getResult() {
-        return result;
-    }
+    public boolean isValid();
 
     /**
+     * Returns saved description of result or empty string.
      *
-     * @param result Result to set
+     * @return Result message.
      */
-    public void setResult(Result result) {
-        this.result = result;
-    }
-
-    /**
-     *
-     * @return List of result child objects
-     */
-    public List<ValidationResult> getChildResults() {
-        return childResults;
-    }
-
-    /**
-     * Add new child result. Result of his parent is based on status of base and
-     * all children.
-     *
-     * @param childResult
-     */
-    public void addChildResult(ValidationResult childResult) {
-        if (!childResult.getResult().getValue()) {
-
-            //if validation already failed for base or child
-            if (this.getResult().equals(ValidationResult.Result.FAIL_BASE)
-                    || this.getResult().equals(ValidationResult.Result.FAIL_BASE_AND_CHILD)) {
-                this.setResult(ValidationResult.Result.FAIL_BASE_AND_CHILD);
-
-                //if validation failed only for child
-            } else {
-                this.setResult(ValidationResult.Result.FAIL_CHILD);
-            }
-        }
-
-        this.childResults.add(childResult);
-    }
-
-    /**
-     * Returns {@link Validator} class in which the result arises.
-     *
-     * @return {@link Validator} class
-     */
-    public Class<? extends Validator> getValidatorClass() {
-        return validatorClass;
-    }
-
-    /**
-     *
-     * @return Current result description
-     */
-    public String getDescription() {
-        return description;
-    }
-
-    /**
-     * Set human-readable description of result.
-     *
-     * @param description Result description to set
-     */
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-}
+    public String getMessage();
+}
\ No newline at end of file
diff --git a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/ValidationResultBuilder.java b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/ValidationResultBuilder.java
new file mode 100644 (file)
index 0000000..aad69a0
--- /dev/null
@@ -0,0 +1,72 @@
+/*\r
+ * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+package org.opendaylight.groupbasedpolicy.resolver.validator;\r
+\r
+\r
+import javax.annotation.Nonnull;\r
+import org.opendaylight.yangtools.concepts.Builder;\r
+\r
+public final class ValidationResultBuilder implements Builder<ValidationResult> {\r
+\r
+    private static final class ValidationResultImpl implements ValidationResult {\r
+\r
+        private final boolean success;\r
+        private final String message;\r
+\r
+        private ValidationResultImpl(final boolean success, final String message) {\r
+            this.success = success;\r
+            this.message = message;\r
+        }\r
+\r
+        @Override\r
+        public boolean isValid() {\r
+            return success;\r
+        }\r
+\r
+        @Override\r
+        public String getMessage() {\r
+            return message;\r
+        }\r
+    }\r
+\r
+    private boolean success;\r
+    private String message = "";\r
+\r
+    public ValidationResultBuilder success() {\r
+        this.success = true;\r
+        return this;\r
+    }\r
+\r
+    /**\r
+     * Returns a builder for a failed result.\r
+     */\r
+    public ValidationResultBuilder failed() {\r
+        this.success = false;\r
+        return this;\r
+    }\r
+\r
+    /**\r
+     * Returns a builder for a failed result.\r
+     *\r
+     * @param message brief explanation\r
+     * @throws IllegalArgumentException when message is null\r
+     */\r
+    public ValidationResultBuilder setMessage(@Nonnull String message) {\r
+        if (message == null) {\r
+            throw new IllegalArgumentException("Result message cannot be set to NULL!");\r
+        }\r
+        this.message = message;\r
+        return this;\r
+    }\r
+\r
+    @Override\r
+    public ValidationResult build() {\r
+        return new ValidationResultImpl(success, message);\r
+    }\r
+\r
+}\r
index 98d581f8c0e106c5f18efa3b16814afb3a4b17bc..d860aaf72831e842b4dcf2720d044f5302e84c78 100644 (file)
@@ -8,15 +8,10 @@
 
 package org.opendaylight.groupbasedpolicy.resolver.validator;
 
-/**
- * Interface for Validators used to validate Policy objects
- *
- * @param <T>
- */
 public interface Validator<T> {
 
     /**
-     * Validate given object and his children. The result of all validations is
+     * Validate given object. The result of all validations is
      * stored in {@link ValidationResult} object.
      *
      * @param objectToValidate Object that should be validated by
@@ -24,12 +19,4 @@ public interface Validator<T> {
      * @return Result of performed validation
      */
     ValidationResult validate(T objectToValidate);
-
-    /**
-     * Returns the Policy object type for which it is intended validator.
-     *
-     * @return Class of Policy object;
-     */
-    Class<T> getType();
-
 }
diff --git a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/ActionInstanceValidator.java b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/ActionInstanceValidator.java
deleted file mode 100644 (file)
index 0e0ebf0..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.groupbasedpolicy.resolver.validator.validators;
-
-import org.opendaylight.groupbasedpolicy.resolver.validator.AbstractValidator;
-import org.opendaylight.groupbasedpolicy.resolver.validator.SimpleResult;
-
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.subject.feature.instances.ActionInstance;
-
-/**
- * Validator for {@link ActionInstance}
- */
-public class ActionInstanceValidator extends AbstractValidator<ActionInstance> {
-
-    @Override
-    protected SimpleResult validateSelf(ActionInstance objectToValidate) {
-        org.opendaylight.groupbasedpolicy.resolver.ActionInstanceValidator action = getPolicyResolver().getActionInstanceValidator(objectToValidate.getActionDefinitionId());
-        if (action == null) {
-            return new SimpleResult(false, "Action not registered in PolicyResolver.");
-        }
-
-        boolean isValid = action.isValid(objectToValidate);
-
-        return new SimpleResult(isValid, "Validation result of " + action.getClass().getName() + " class.");
-    }
-
-    @Override
-    public Class<ActionInstance> getType() {
-        return ActionInstance.class;
-    }
-
-}
diff --git a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/SubjectFeatureInstancesValidator.java b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/SubjectFeatureInstancesValidator.java
deleted file mode 100644 (file)
index 13ab55e..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.groupbasedpolicy.resolver.validator.validators;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.opendaylight.groupbasedpolicy.resolver.validator.AbstractValidator;
-
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.SubjectFeatureInstances;
-import org.opendaylight.yangtools.yang.binding.ChildOf;
-
-/**
- * Validator for {@link SubjectFeatureInstances}
- */
-public class SubjectFeatureInstancesValidator extends AbstractValidator<SubjectFeatureInstances> {
-
-    @Override
-    protected List<ChildOf<SubjectFeatureInstances>> getChildObjects(SubjectFeatureInstances objectToValidate) {
-        List<ChildOf<SubjectFeatureInstances>> childObjects = new ArrayList<>();
-
-        childObjects.addAll(objectToValidate.getActionInstance());
-        childObjects.addAll(objectToValidate.getClassifierInstance());
-
-        return childObjects;
-    }
-
-    @Override
-    public Class<SubjectFeatureInstances> getType() {
-        return SubjectFeatureInstances.class;
-    }
-
-}
diff --git a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/TenantValidator.java b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/TenantValidator.java
deleted file mode 100644 (file)
index bae3e74..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.groupbasedpolicy.resolver.validator.validators;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.opendaylight.groupbasedpolicy.resolver.validator.AbstractValidator;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.Tenant;
-import org.opendaylight.yangtools.yang.binding.ChildOf;
-
-/**
- * Validator for {@link Tenant}
- */
-public class TenantValidator extends AbstractValidator<Tenant> {
-
-    @Override
-    protected List<ChildOf<Tenant>> getChildObjects(Tenant objectToValidate) {
-        List<ChildOf<Tenant>> childObjects = new ArrayList<>();
-
-        childObjects.add(objectToValidate.getSubjectFeatureInstances());
-
-        return childObjects;
-    }
-
-    @Override
-    public Class<Tenant> getType() {
-        return Tenant.class;
-    }
-
-}
diff --git a/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/PolicyValidatorTest.java b/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/PolicyValidatorTest.java
deleted file mode 100644 (file)
index 818281e..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.groupbasedpolicy.resolver.validator;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.opendaylight.groupbasedpolicy.resolver.PolicyResolver;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.Tenant;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.SubjectFeatureInstances;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.subject.feature.instances.ActionInstance;
-import org.opendaylight.yangtools.yang.binding.DataContainer;
-
-public class PolicyValidatorTest {
-
-    DataContainer dataContainer;
-    PolicyResolver policyResolver;
-
-    @Before
-    public void initialise() {
-        dataContainer = mock(DataContainer.class);
-        policyResolver = mock(PolicyResolver.class);
-
-    }
-
-    @SuppressWarnings({"rawtypes", "unchecked"})
-    @Test
-    public void createValidatorTest() {
-        Validator validator;
-        validator = PolicyValidator.createValidator(dataContainer, policyResolver);
-        Assert.assertNull(validator);
-
-        when(dataContainer.getImplementedInterface()).thenReturn((Class) Tenant.class);
-        validator = PolicyValidator.createValidator(dataContainer, policyResolver);
-        Assert.assertNotNull(validator);
-        Assert.assertEquals(policyResolver, ((AbstractValidator) validator).getPolicyResolver());
-
-        when(dataContainer.getImplementedInterface()).thenReturn((Class) SubjectFeatureInstances.class);
-        validator = PolicyValidator.createValidator(dataContainer, policyResolver);
-        Assert.assertNotNull(validator);
-        Assert.assertEquals(policyResolver, ((AbstractValidator) validator).getPolicyResolver());
-
-        when(dataContainer.getImplementedInterface()).thenReturn((Class) ActionInstance.class);
-        validator = PolicyValidator.createValidator(dataContainer, policyResolver);
-        Assert.assertNotNull(validator);
-        Assert.assertEquals(policyResolver, ((AbstractValidator) validator).getPolicyResolver());
-    }
-
-    @SuppressWarnings({"unchecked", "rawtypes"})
-    @Test
-    public void validateTest() {
-        Tenant tenant = mock(Tenant.class);
-        when(tenant.getImplementedInterface()).thenReturn((Class) Tenant.class);
-        SubjectFeatureInstances subjectFeatureInstances = mock(SubjectFeatureInstances.class);
-        when(tenant.getSubjectFeatureInstances()).thenReturn(subjectFeatureInstances);
-        PolicyValidator.validate(tenant, policyResolver);
-
-        when(subjectFeatureInstances.getImplementedInterface()).thenReturn((Class) SubjectFeatureInstances.class);
-        PolicyValidator.validate(subjectFeatureInstances, policyResolver);
-
-        ActionInstance actionInstance = mock(ActionInstance.class);
-        when(actionInstance.getImplementedInterface()).thenReturn((Class) ActionInstance.class);
-        PolicyValidator.validate(actionInstance, policyResolver);
-    }
-
-}
diff --git a/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/SimpleResultTest.java b/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/SimpleResultTest.java
deleted file mode 100644 (file)
index 1374bdf..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.groupbasedpolicy.resolver.validator;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-public class SimpleResultTest {
-
-    private SimpleResult simpleResult;
-
-    @Test
-    public void constructorTest() {
-        simpleResult = new SimpleResult(true);
-        Assert.assertEquals(0, simpleResult.getCode());
-        Assert.assertTrue(simpleResult.getDescription().isEmpty());
-        Assert.assertTrue(simpleResult.isSuccess());
-        Assert.assertFalse(simpleResult.isFailure());
-
-        simpleResult = new SimpleResult(false);
-        Assert.assertEquals(1, simpleResult.getCode());
-        Assert.assertTrue(simpleResult.getDescription().isEmpty());
-        Assert.assertFalse(simpleResult.isSuccess());
-        Assert.assertTrue(simpleResult.isFailure());
-
-        simpleResult = new SimpleResult(2);
-        Assert.assertEquals(2, simpleResult.getCode());
-        Assert.assertTrue(simpleResult.getDescription().isEmpty());
-        Assert.assertFalse(simpleResult.isSuccess());
-        Assert.assertTrue(simpleResult.isFailure());
-
-        simpleResult = new SimpleResult(2, "description");
-        Assert.assertEquals(2, simpleResult.getCode());
-        Assert.assertEquals("description", simpleResult.getDescription());
-        Assert.assertFalse(simpleResult.isSuccess());
-        Assert.assertTrue(simpleResult.isFailure());
-    }
-
-}
diff --git a/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/ValidationResultTest.java b/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/ValidationResultTest.java
new file mode 100644 (file)
index 0000000..0539eba
--- /dev/null
@@ -0,0 +1,53 @@
+/*\r
+ * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.groupbasedpolicy.resolver.validator;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Before;\r
+import org.junit.Rule;\r
+import org.junit.Test;\r
+import org.junit.rules.ExpectedException;\r
+\r
+public class ValidationResultTest {\r
+\r
+    @Rule\r
+    public ExpectedException thrown = ExpectedException.none();\r
+\r
+    ValidationResultBuilder resultBuilder;\r
+    ValidationResult result;\r
+\r
+    @Before\r
+    public void initialisation() {\r
+        resultBuilder = new ValidationResultBuilder();\r
+    }\r
+\r
+    @Test\r
+    public void successValidationTest() {\r
+        result = resultBuilder.success().build();\r
+        Assert.assertTrue(result.isValid());\r
+        Assert.assertTrue(result.getMessage().equals(""));\r
+    }\r
+\r
+    @Test\r
+    public void unsuccessValidationTest() {\r
+        result = resultBuilder.failed().build();\r
+        Assert.assertFalse(result.isValid());\r
+        Assert.assertTrue(result.getMessage().equals(""));\r
+    }\r
+\r
+    @Test\r
+    public void messageTest() {\r
+        result = resultBuilder.setMessage("Validated.").build();\r
+        Assert.assertTrue(result.getMessage().equals("Validated."));\r
+        thrown.expect(IllegalArgumentException.class);\r
+        thrown.expectMessage("Result message cannot be set to NULL!");\r
+        resultBuilder.setMessage(null);\r
+    }\r
+\r
+}\r
diff --git a/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/ValidatorResultTest.java b/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/ValidatorResultTest.java
deleted file mode 100644 (file)
index 2d09b86..0000000
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.groupbasedpolicy.resolver.validator;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.opendaylight.groupbasedpolicy.resolver.validator.ValidationResult.Result;
-
-public class ValidatorResultTest {
-
-    private ValidationResult validationResult;
-    private ValidationResult childResult;
-
-    @Before
-    public void initialise() {
-        validationResult = new ValidationResult(Validator.class);
-        childResult = new ValidationResult(Validator.class);
-    }
-
-    @Test
-    public void constructorTest() {
-        Assert.assertEquals(Validator.class, validationResult.getValidatorClass());
-    }
-
-    @Test
-    public void descriptionTest() {
-        String description = "description";
-        validationResult.setDescription(description);
-        Assert.assertEquals(description, validationResult.getDescription());
-    }
-
-    @Test
-    public void resultTest() {
-        validationResult.setResult(Result.SUCCESS);
-        Assert.assertEquals(Result.SUCCESS, validationResult.getResult());
-        Assert.assertTrue(validationResult.getResult().getValue());
-        validationResult.setResult(Result.FAIL_BASE);
-        Assert.assertEquals(Result.FAIL_BASE, validationResult.getResult());
-        Assert.assertFalse(validationResult.getResult().getValue());
-        validationResult.setResult(Result.FAIL_CHILD);
-        Assert.assertEquals(Result.FAIL_CHILD, validationResult.getResult());
-        Assert.assertFalse(validationResult.getResult().getValue());
-        validationResult.setResult(Result.FAIL_BASE_AND_CHILD);
-        Assert.assertEquals(Result.FAIL_BASE_AND_CHILD, validationResult.getResult());
-        Assert.assertFalse(validationResult.getResult().getValue());
-    }
-
-    @Test
-    public void childResultTestSuccessSuccess() {
-        validationResult.setResult(Result.SUCCESS);
-        childResult.setResult(Result.SUCCESS);
-        validationResult.addChildResult(childResult);
-        Assert.assertEquals(Result.SUCCESS, validationResult.getResult());
-        Assert.assertTrue(validationResult.getChildResults().contains(childResult));
-    }
-
-    @Test
-    public void childResultTestSuccessFailBase() {
-        validationResult.setResult(Result.SUCCESS);
-        childResult.setResult(Result.FAIL_BASE);
-        validationResult.addChildResult(childResult);
-        validationResult.setResult(Result.FAIL_CHILD);
-        Assert.assertTrue(validationResult.getChildResults().contains(childResult));
-    }
-
-    @Test
-    public void childResultTestSuccessFailChild() {
-        validationResult.setResult(Result.SUCCESS);
-        childResult.setResult(Result.FAIL_CHILD);
-        validationResult.addChildResult(childResult);
-        validationResult.setResult(Result.FAIL_CHILD);
-        Assert.assertTrue(validationResult.getChildResults().contains(childResult));
-    }
-
-    @Test
-    public void childResultTestSuccessFailBaseAndChild() {
-        validationResult.setResult(Result.SUCCESS);
-        childResult.setResult(Result.FAIL_BASE_AND_CHILD);
-        validationResult.addChildResult(childResult);
-        validationResult.setResult(Result.FAIL_CHILD);
-        Assert.assertTrue(validationResult.getChildResults().contains(childResult));
-    }
-
-    @Test
-    public void childResultTestFailBaseSuccess() {
-        validationResult.setResult(Result.FAIL_BASE);
-        childResult.setResult(Result.SUCCESS);
-        validationResult.addChildResult(childResult);
-        Assert.assertEquals(Result.FAIL_BASE, validationResult.getResult());
-        Assert.assertTrue(validationResult.getChildResults().contains(childResult));
-    }
-
-    @Test
-    public void childResultTestFailBaseFailBase() {
-        validationResult.setResult(Result.FAIL_BASE);
-        childResult.setResult(Result.FAIL_BASE);
-        validationResult.addChildResult(childResult);
-        validationResult.setResult(Result.FAIL_CHILD);
-        Assert.assertTrue(validationResult.getChildResults().contains(childResult));
-    }
-
-    @Test
-    public void childResultTestFailBaseFailChild() {
-        validationResult.setResult(Result.FAIL_BASE);
-        childResult.setResult(Result.FAIL_CHILD);
-        validationResult.addChildResult(childResult);
-        validationResult.setResult(Result.FAIL_CHILD);
-        Assert.assertTrue(validationResult.getChildResults().contains(childResult));
-    }
-
-    @Test
-    public void childResultTestFailBaseFailBaseAndChild() {
-        validationResult.setResult(Result.FAIL_BASE);
-        childResult.setResult(Result.FAIL_BASE_AND_CHILD);
-        validationResult.addChildResult(childResult);
-        validationResult.setResult(Result.FAIL_CHILD);
-        Assert.assertTrue(validationResult.getChildResults().contains(childResult));
-    }
-
-    @Test
-    public void childResultTestFailChildSuccess() {
-        validationResult.setResult(Result.FAIL_CHILD);
-        childResult.setResult(Result.SUCCESS);
-        validationResult.addChildResult(childResult);
-        Assert.assertEquals(Result.FAIL_CHILD, validationResult.getResult());
-        Assert.assertTrue(validationResult.getChildResults().contains(childResult));
-    }
-
-    @Test
-    public void childResultTestFailChildFailBase() {
-        validationResult.setResult(Result.FAIL_CHILD);
-        childResult.setResult(Result.FAIL_BASE);
-        validationResult.addChildResult(childResult);
-        validationResult.setResult(Result.FAIL_CHILD);
-        Assert.assertTrue(validationResult.getChildResults().contains(childResult));
-    }
-
-    @Test
-    public void childResultTestFailChildFailChild() {
-        validationResult.setResult(Result.FAIL_CHILD);
-        childResult.setResult(Result.FAIL_CHILD);
-        validationResult.addChildResult(childResult);
-        validationResult.setResult(Result.FAIL_CHILD);
-        Assert.assertTrue(validationResult.getChildResults().contains(childResult));
-    }
-
-    @Test
-    public void childResultTestFailChildFailBaseAndChild() {
-        validationResult.setResult(Result.FAIL_CHILD);
-        childResult.setResult(Result.FAIL_BASE_AND_CHILD);
-        validationResult.addChildResult(childResult);
-        validationResult.setResult(Result.FAIL_CHILD);
-        Assert.assertTrue(validationResult.getChildResults().contains(childResult));
-    }
-
-    @Test
-    public void childResultTestFailBaseAndChildSuccess() {
-        validationResult.setResult(Result.FAIL_BASE);
-        childResult.setResult(Result.SUCCESS);
-        validationResult.addChildResult(childResult);
-        Assert.assertEquals(Result.FAIL_BASE, validationResult.getResult());
-        Assert.assertTrue(validationResult.getChildResults().contains(childResult));
-    }
-
-    @Test
-    public void childResultTestFailBaseAndChildFailBase() {
-        validationResult.setResult(Result.FAIL_BASE_AND_CHILD);
-        childResult.setResult(Result.FAIL_BASE);
-        validationResult.addChildResult(childResult);
-        validationResult.setResult(Result.FAIL_CHILD);
-        Assert.assertTrue(validationResult.getChildResults().contains(childResult));
-    }
-
-    @Test
-    public void childResultTestFailBaseAndChildFailChild() {
-        validationResult.setResult(Result.FAIL_BASE_AND_CHILD);
-        childResult.setResult(Result.FAIL_CHILD);
-        validationResult.addChildResult(childResult);
-        validationResult.setResult(Result.FAIL_CHILD);
-        Assert.assertTrue(validationResult.getChildResults().contains(childResult));
-    }
-
-    @Test
-    public void childResultTestFailBaseAndChildFailBaseAndChild() {
-        validationResult.setResult(Result.FAIL_BASE_AND_CHILD);
-        childResult.setResult(Result.FAIL_BASE_AND_CHILD);
-        validationResult.addChildResult(childResult);
-        validationResult.setResult(Result.FAIL_CHILD);
-        Assert.assertTrue(validationResult.getChildResults().contains(childResult));
-    }
-}
diff --git a/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/ActionInstanceValidatorTest.java b/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/ActionInstanceValidatorTest.java
deleted file mode 100644 (file)
index 003b9d7..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
- *s
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.groupbasedpolicy.resolver.validator.validators;
-
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.opendaylight.groupbasedpolicy.resolver.PolicyResolver;
-import org.opendaylight.groupbasedpolicy.resolver.validator.SimpleResult;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ActionDefinitionId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.subject.feature.instances.ActionInstance;
-
-public class ActionInstanceValidatorTest {
-
-    private ActionInstanceValidator validator;
-    private PolicyResolver policyResolver;
-    private org.opendaylight.groupbasedpolicy.resolver.ActionInstanceValidator action;
-
-    @Before
-    public void initialise() {
-        validator = new ActionInstanceValidator();
-        policyResolver = mock(PolicyResolver.class);
-        action = mock(org.opendaylight.groupbasedpolicy.resolver.ActionInstanceValidator.class);
-        when(policyResolver.getActionInstanceValidator(any(ActionDefinitionId.class))).thenReturn(action);
-        validator.setPolicyResolver(policyResolver);
-    }
-
-    @Test
-    public void validateSelfTestValidFalse() {
-        ActionInstance objectToValidate = mock(ActionInstance.class);
-        when(action.isValid(objectToValidate)).thenReturn(false);
-
-        SimpleResult simpleResult = validator.validateSelf(objectToValidate);
-        Assert.assertNotNull(simpleResult);
-        Assert.assertTrue(simpleResult.isFailure());
-        Assert.assertTrue(simpleResult.getDescription().contains("ActionInstance"));
-    }
-
-    @Test
-    public void validateSelfTestValidTrue() {
-        ActionInstance objectToValidate = mock(ActionInstance.class);
-        when(action.isValid(objectToValidate)).thenReturn(true);
-
-        SimpleResult simpleResult = validator.validateSelf(objectToValidate);
-        Assert.assertNotNull(simpleResult);
-        Assert.assertTrue(simpleResult.isSuccess());
-        Assert.assertTrue(simpleResult.getDescription().contains("ActionInstance"));
-    }
-
-    @Test
-    public void validateSelfTestValidActionNull() {
-        ActionInstance objectToValidate = mock(ActionInstance.class);
-        when(policyResolver.getActionInstanceValidator(any(ActionDefinitionId.class))).thenReturn(null);
-
-        SimpleResult simpleResult = validator.validateSelf(objectToValidate);
-        Assert.assertNotNull(simpleResult);
-        Assert.assertTrue(simpleResult.isFailure());
-    }
-
-    @Test
-    public void getTypeTest() {
-        Assert.assertEquals(ActionInstance.class, validator.getType());
-    }
-}
diff --git a/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/SubjectFeatureInstancesValidatorTest.java b/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/SubjectFeatureInstancesValidatorTest.java
deleted file mode 100644 (file)
index 6ef233b..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.groupbasedpolicy.resolver.validator.validators;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.SubjectFeatureInstances;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.subject.feature.instances.ActionInstance;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.subject.feature.instances.ClassifierInstance;
-import org.opendaylight.yangtools.yang.binding.ChildOf;
-
-public class SubjectFeatureInstancesValidatorTest {
-
-    private SubjectFeatureInstancesValidator validator;
-
-    @Before
-    public void initialise() {
-        validator = new SubjectFeatureInstancesValidator();
-    }
-
-    @Test
-    public void getChildObjectsTest() {
-        SubjectFeatureInstances objectToValidate = mock(SubjectFeatureInstances.class);
-        ActionInstance actionInstance = mock(ActionInstance.class);
-        when(objectToValidate.getActionInstance()).thenReturn(Arrays.asList(actionInstance));
-        ClassifierInstance classifierInstance = mock(ClassifierInstance.class);
-        when(objectToValidate.getClassifierInstance()).thenReturn(Arrays.asList(classifierInstance));
-
-        List<ChildOf<SubjectFeatureInstances>> childObjects = validator.getChildObjects(objectToValidate);
-        Assert.assertTrue(childObjects.contains(actionInstance));
-        Assert.assertTrue(childObjects.contains(classifierInstance));
-    }
-
-    @Test
-    public void getTypeTest() {
-        Assert.assertEquals(SubjectFeatureInstances.class, validator.getType());
-    }
-
-}
diff --git a/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/TenantValidatorTest.java b/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/TenantValidatorTest.java
deleted file mode 100644 (file)
index e210b8e..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.groupbasedpolicy.resolver.validator.validators;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import java.util.List;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.Tenant;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.SubjectFeatureInstances;
-import org.opendaylight.yangtools.yang.binding.ChildOf;
-
-public class TenantValidatorTest {
-
-    private TenantValidator validator;
-
-    @Before
-    public void initialise() {
-        validator = new TenantValidator();
-    }
-
-    @Test
-    public void getChildObjectsTest() {
-        Tenant objectToValidate = mock(Tenant.class);
-        SubjectFeatureInstances subjectFeatureInstances = mock(SubjectFeatureInstances.class);
-        when(objectToValidate.getSubjectFeatureInstances()).thenReturn(subjectFeatureInstances);
-        List<ChildOf<Tenant>> childObjects = validator.getChildObjects(objectToValidate);
-        Assert.assertTrue(childObjects.contains(subjectFeatureInstances));
-    }
-
-    @Test
-    public void getTypeTest() {
-        Assert.assertEquals(Tenant.class, validator.getType());
-    }
-}
index 2b8169b995186a738ab37d9c440c1daff39f8bce..901210372728fd5dd2a7f9eecaa1a0c8f9be7f0d 100755 (executable)
@@ -121,7 +121,7 @@ public class PolicyManager
         }
 
         for(Entry<ActionDefinitionId, Action> entry : SubjectFeatures.getActions().entrySet()) {
-            policyResolver.registerActionDefinitions(entry.getKey(), entry.getValue());
+            policyResolver.registerActionInstanceValidators(entry.getKey(), entry.getValue());
         }
 
         ofCtx = new OfContext(dataBroker, rpcRegistry,
index c78f5c36f97fc45a25d267d9e9844d9cae031677..5d49751d341fdcb6853a872c749e0db246d99503 100755 (executable)
@@ -15,19 +15,20 @@ import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.OfContext;
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.OfWriter;
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.PolicyEnforcer.NetworkElements;
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.PolicyEnforcer.PolicyPair;
-import org.opendaylight.groupbasedpolicy.resolver.ActionInstanceValidator;
+import org.opendaylight.groupbasedpolicy.resolver.validator.Validator;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ActionDefinitionId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.HasDirection.Direction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.definitions.ActionDefinition;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.supported.action.definition.SupportedParameterValues;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.subject.feature.instances.ActionInstance;
 
 /**
  * Represent an action definition, and provide tools for generating
  * flow instructions based on the action
  * @author tbachman
  */
-public abstract class Action implements ActionInstanceValidator{
+public abstract class Action implements Validator<ActionInstance> {
     /**
      * Get the action definition for this action
      * @return the {@link ActionDefinition} for this action
index 4d3196f4b5b4684f6a405d335c3e9cd82f25e9df..deaa5dabd95df6aadd629ec3af10b9253c93134c 100755 (executable)
@@ -19,6 +19,8 @@ import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.OfContext;
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.OfWriter;
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.PolicyEnforcer.NetworkElements;
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.PolicyEnforcer.PolicyPair;
+import org.opendaylight.groupbasedpolicy.resolver.validator.ValidationResult;
+import org.opendaylight.groupbasedpolicy.resolver.validator.ValidationResultBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ActionDefinitionId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.HasDirection.Direction;
@@ -66,8 +68,8 @@ public class AllowAction extends Action {
     }
 
     @Override
-    public boolean isValid(ActionInstance actionInstance) {
-        return true;
+    public ValidationResult validate(ActionInstance actionInstance) {
+        return new ValidationResultBuilder().success().build();
     }
 
     @Override
index 8e423638e29fb4a45a712f5c65c8ebe3474ddbe0..3b249562bc67e7eaee79ca9dfe275b8a3683515d 100755 (executable)
@@ -26,6 +26,13 @@ import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sfcutils.SfcNshHeade
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sfcutils.SfcNshHeader.SfcNshHeaderBuilder;
 import org.opendaylight.groupbasedpolicy.sf.actions.ChainActionDefinition;
 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
+import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.PolicyEnforcer.PolicyPair;
+import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sfcutils.SfcIidFactory;
+import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sfcutils.SfcNshHeader;
+import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sfcutils.SfcNshHeader.SfcNshHeaderBuilder;
+import org.opendaylight.groupbasedpolicy.resolver.validator.ValidationResult;
+import org.opendaylight.groupbasedpolicy.resolver.validator.ValidationResultBuilder;
+import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
 import org.opendaylight.sfc.provider.api.SfcProviderRenderedPathAPI;
 import org.opendaylight.sfc.provider.api.SfcProviderServiceChainAPI;
 import org.opendaylight.sfc.provider.api.SfcProviderServicePathAPI;
@@ -87,7 +94,6 @@ public class ChainAction extends Action {
         if (params != null) {
             LOG.debug("updateAction: Searching for named chain");
             for (String name : params.keySet()) {
-                if (name instanceof String) {
                     if (name.equals(ChainActionDefinition.SFC_CHAIN_NAME)) {
                         chainName = (String) params.get(name);
                         if (chainName == null) {
@@ -95,7 +101,6 @@ public class ChainAction extends Action {
                             return null;
                         }
                     }
-                }
             }
         } else {
             LOG.error("updateAction: Parameters null for chain action");
@@ -249,19 +254,25 @@ public class ChainAction extends Action {
     }
 
     @Override
-    public boolean isValid(ActionInstance actionInstance) {
+    public ValidationResult validate(ActionInstance actionInstance) {
         return isValidGbpChain(actionInstance.getParameterValue());
     }
 
-    private boolean isValidGbpChain(List<ParameterValue> paramValue) {
+    private ValidationResult isValidGbpChain(List<ParameterValue> paramValue) {
         ParameterValue pv = getChainNameParameter(paramValue);
         if (pv == null) {
-            return false;
+            return new ValidationResultBuilder().failed().setMessage(
+                    "Chain parameter {" + paramValue + "} not found!").build();
         }
         SfcName sfcName = new SfcName(pv.getStringValue());
         LOG.trace("isValidGbpChain: Invoking RPC for chain {}", pv.getStringValue());
         ServiceFunctionChain chain = SfcProviderServiceChainAPI.readServiceFunctionChain(sfcName);
-        return (chain != null);
+        if (chain != null){
+            return new ValidationResultBuilder().success().build();
+        } else {
+            return new ValidationResultBuilder().failed().setMessage(
+                    "Chain named {" + pv.getStringValue() + "} not found in config DS.").build();
+        }
     }
 
     public ServiceFunctionPath getSfcPath(SfcName chainName) {
index 0d87587503569526bdc5ca573ba0933bb363f146..ec9534e6fc5d2dd0c1c75c29c45efd4b0532b188 100644 (file)
@@ -35,10 +35,10 @@ import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
 import org.opendaylight.groupbasedpolicy.endpoint.EpKey;
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.endpoint.EndpointManager;
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.node.SwitchManager;
-import org.opendaylight.groupbasedpolicy.resolver.ActionInstanceValidator;
 import org.opendaylight.groupbasedpolicy.resolver.EgKey;
 import org.opendaylight.groupbasedpolicy.resolver.PolicyResolver;
 import org.opendaylight.groupbasedpolicy.resolver.PolicyScope;
+import org.opendaylight.groupbasedpolicy.resolver.validator.Validator;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
@@ -119,8 +119,8 @@ public class PolicyManagerTest {
         PolicyResolver ctorPolicyResolver = mock(PolicyResolver.class);
         PolicyManager ctorPolicyManager = new PolicyManager(dataBroker, ctorPolicyResolver,
                 switchManager, endpointManager, rpcRegistry, executor, tableOffset);
-        verify(ctorPolicyResolver, atLeastOnce()).registerActionDefinitions(any(ActionDefinitionId.class),
-                any(ActionInstanceValidator.class));
+        verify(ctorPolicyResolver, atLeastOnce()).registerActionInstanceValidators(any(ActionDefinitionId.class),
+                any(Validator.class));
     }
 
     @SuppressWarnings("unchecked")
index 7d316647e57fa427a8e9bf7d612ce5a7083c1764..8d98c285fc2c923a164c8a0e16e5c92e931286a8 100755 (executable)
@@ -181,7 +181,7 @@ public class ChainActionTest {
 
     @Test
     public void isValidTestParameterValueNull() {
-        ActionInstance actionInstance = mock(ActionInstance.class);
-        Assert.assertFalse(chainAction.isValid(actionInstance));
+         ActionInstance actionInstance = mock(ActionInstance.class);
+         Assert.assertFalse(chainAction.validate(actionInstance).isValid());
     }
 }