From c286ac0022ccef0ea4f7d74f8626fba6e3060b86 Mon Sep 17 00:00:00 2001 From: "Benjamin, Max (mb388a)" Date: Fri, 11 Jan 2019 21:35:13 -0500 Subject: refactored validator to be more generic removed overloaded method from class for JUEL changed test back to DelegateExecution added methods to allow validations with DelegateExecution refactored validator to be more generic Change-Id: I6c6d7a50e8b5470ffa5619cc83966f5ad68e66fe Issue-ID: SO-1383 Signed-off-by: Benjamin, Max (mb388a) --- .../common/validation/BuildingBlockValidator.java | 44 ------ .../validation/BuildingBlockValidatorRunner.java | 90 +----------- .../so/bpmn/common/validation/FlowValidator.java | 23 +++ .../common/validation/FlowValidatorRunner.java | 160 +++++++++++++++++++++ .../validation/PostBuildingBlockValidator.java | 2 +- .../common/validation/PostWorkflowValidator.java | 2 +- .../validation/PreBuildingBlockValidator.java | 2 +- .../common/validation/PreWorkflowValidator.java | 2 +- .../bpmn/common/validation/WorkflowValidator.java | 44 ------ .../common/validation/WorkflowValidatorRunner.java | 90 +----------- 10 files changed, 201 insertions(+), 258 deletions(-) delete mode 100644 bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/BuildingBlockValidator.java create mode 100644 bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/FlowValidator.java create mode 100644 bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/FlowValidatorRunner.java delete mode 100644 bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/WorkflowValidator.java (limited to 'bpmn/MSOCommonBPMN/src/main/java/org/onap') diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/BuildingBlockValidator.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/BuildingBlockValidator.java deleted file mode 100644 index d4467b8270..0000000000 --- a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/BuildingBlockValidator.java +++ /dev/null @@ -1,44 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP - SO - * ================================================================================ - * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.so.bpmn.common.validation; - -import java.util.Set; - -import org.onap.so.bpmn.common.BuildingBlockExecution; - -public interface BuildingBlockValidator { - - - /** - * Name of the building block to be validated - * @return - */ - public Set forBuildingBlock(); - - /** - * Determines whether or not the building block should be executed - * - * @param execution - * @return - */ - public boolean validate(BuildingBlockExecution execution); - -} diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/BuildingBlockValidatorRunner.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/BuildingBlockValidatorRunner.java index d26ae7b92b..a5d871eeef 100644 --- a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/BuildingBlockValidatorRunner.java +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/BuildingBlockValidatorRunner.java @@ -52,99 +52,23 @@ import org.springframework.stereotype.Component; * */ @Component -public class BuildingBlockValidatorRunner { - - private static Logger logger = LoggerFactory.getLogger(BuildingBlockValidatorRunner.class); - @Autowired - private ApplicationContext context; - - @Autowired - private ExceptionBuilder exceptionBuilder; - - private List preBuildingBlockValidators; - private List postBuildingBlockValidators; - +public class BuildingBlockValidatorRunner extends FlowValidatorRunner { @PostConstruct protected void init() { - preBuildingBlockValidators = new ArrayList<>( + preFlowValidators = new ArrayList<>( Optional.ofNullable(context.getBeansOfType(PreBuildingBlockValidator.class)).orElse(new HashMap<>()).values()); - postBuildingBlockValidators = new ArrayList<>( + postFlowValidators = new ArrayList<>( Optional.ofNullable(context.getBeansOfType(PostBuildingBlockValidator.class)).orElse(new HashMap<>()).values()); } - public boolean preValidate(String bbName, BuildingBlockExecution execution) { - return validate(preBuildingBlockValidators, bbName, execution); - } - - - public boolean postValidate(String bbName, BuildingBlockExecution execution) { - return validate(postBuildingBlockValidators, bbName, execution); - } - - - protected boolean validate(List validators, String bbName, BuildingBlockExecution execution) { - List> results = runValidations(validators, bbName, execution); - - if (!results.isEmpty()) { - exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, - "Failed Validations:\n" + results.stream().map(item -> item.getValue0()).collect(Collectors.joining("\n"))); - } - - return true; - - } - protected List> runValidations(List validators, String bbName, BuildingBlockExecution execution) { - - List filtered = filterValidators(validators, bbName); - - List> results = new ArrayList<>(); - filtered.forEach(item -> results.add(new Pair<>(item.getClass().getName(), item.validate(execution)))); - - return results.stream().filter(item -> item.getValue1().equals(false)).collect(Collectors.toList()); - } - - protected List filterValidators(List validators, String bbName) { - return validators.stream() - .filter(item -> { - return item.forBuildingBlock().contains(bbName); - }) - .sorted(Comparator.comparing(item -> { - Priority p = Optional.ofNullable(item.getClass().getAnnotation(Priority.class)).orElse(new Priority() { - public int value() { - return 1000; - } - - @Override - public Class annotationType() { - return Priority.class; - } - }); - return p.value(); - })).collect(Collectors.toList()); - } - - protected List buildalidatorList(Reflections reflections, Class clazz) { - List result = new ArrayList<>(); - try { - for (Class klass : reflections.getSubTypesOf(clazz)) { - result.add(klass.newInstance()); - } - } catch (InstantiationException | IllegalAccessException e) { - logger.error("failed to build validator list for " + clazz.getName(), e); - throw new RuntimeException(e); - } - - return result; - } - - protected List getPreBuildingBlockValidators() { - return this.preBuildingBlockValidators; + protected List getPreFlowValidators() { + return this.preFlowValidators; } - protected List getPostBuildingBlockValidators() { - return this.postBuildingBlockValidators; + protected List getPostFlowValidators() { + return this.postFlowValidators; } } diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/FlowValidator.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/FlowValidator.java new file mode 100644 index 0000000000..9995b95c50 --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/FlowValidator.java @@ -0,0 +1,23 @@ +package org.onap.so.bpmn.common.validation; + +import java.util.Set; + +import org.onap.so.bpmn.common.BuildingBlockExecution; + +public interface FlowValidator { + + /** + * Names of items to be validated + * @return + */ + public Set forItems(); + + /** + * Determines whether or not the workflow should be executed + * + * @param execution + * @return + */ + public boolean validate(BuildingBlockExecution execution); + +} diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/FlowValidatorRunner.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/FlowValidatorRunner.java new file mode 100644 index 0000000000..c2e7d1f4d9 --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/FlowValidatorRunner.java @@ -0,0 +1,160 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.so.bpmn.common.validation; + +import java.lang.annotation.Annotation; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import javax.annotation.Priority; + +import org.camunda.bpm.engine.delegate.DelegateExecution; +import org.javatuples.Pair; +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.common.DelegateExecutionImpl; +import org.onap.so.client.exception.ExceptionBuilder; +import org.reflections.Reflections; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; + + +/** + * Controls running all pre and post validation for flows. + * + * To define a validation you must make it a spring bean and implement either {@link org.onap.so.bpmn.common.validation.PreFlowValidator} or + * {@link org.onap.so.bpmn.common.validation.PostFlowValidator} your validation will automatically be + * run by this class. + * + */ +@Component +public abstract class FlowValidatorRunner { + + private static Logger logger = LoggerFactory.getLogger(FlowValidatorRunner.class); + @Autowired + protected ApplicationContext context; + + @Autowired + protected ExceptionBuilder exceptionBuilder; + + protected List preFlowValidators; + protected List postFlowValidators; + + + + /** + * Changed to object because JUEL does not support overloaded methods + * + * @param bbName + * @param execution + * @return + */ + public boolean preValidate(String bbName, Object execution) { + return validateHelper(bbName, preFlowValidators, execution); + } + + /** + * Changed to object because JUEL does not support overloaded methods + * + * @param bbName + * @param execution + * @return + */ + public boolean postValidate(String bbName, Object execution) { + return validateHelper(bbName, postFlowValidators, execution); + } + + protected boolean validateHelper(String bbName, List validators, Object obj) { + + if (obj instanceof DelegateExecution) { + return validate(validators, bbName, new DelegateExecutionImpl((DelegateExecution)obj)); + } else if (obj instanceof BuildingBlockExecution) { + return validate(validators, bbName, (BuildingBlockExecution)obj); + } else { + return false; + } + } + + protected boolean validate(List validators, String bbName, BuildingBlockExecution execution) { + List> results = runValidations(validators, bbName, execution); + + if (!results.isEmpty()) { + exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, + "Failed Validations:\n" + results.stream().map(item -> item.getValue0()).collect(Collectors.joining("\n"))); + } + + return true; + + } + protected List> runValidations(List validators, String bbName, BuildingBlockExecution execution) { + + List filtered = filterValidators(validators, bbName); + + List> results = new ArrayList<>(); + filtered.forEach(item -> results.add(new Pair<>(item.getClass().getName(), item.validate(execution)))); + + return results.stream().filter(item -> item.getValue1().equals(false)).collect(Collectors.toList()); + } + + protected List filterValidators(List validators, String bbName) { + return validators.stream() + .filter(item -> { + return item.forItems().contains(bbName); + }) + .sorted(Comparator.comparing(item -> { + Priority p = Optional.ofNullable(item.getClass().getAnnotation(Priority.class)).orElse(new Priority() { + public int value() { + return 1000; + } + + @Override + public Class annotationType() { + return Priority.class; + } + }); + return p.value(); + })).collect(Collectors.toList()); + } + + protected List buildalidatorList(Reflections reflections, Class clazz) { + List result = new ArrayList<>(); + try { + for (Class klass : reflections.getSubTypesOf(clazz)) { + result.add(klass.newInstance()); + } + } catch (InstantiationException | IllegalAccessException e) { + logger.error("failed to build validator list for " + clazz.getName(), e); + throw new RuntimeException(e); + } + + return result; + } + + protected abstract List getPreFlowValidators(); + + protected abstract List getPostFlowValidators(); + +} diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/PostBuildingBlockValidator.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/PostBuildingBlockValidator.java index 0b1ef5c6e1..f26a2ee479 100644 --- a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/PostBuildingBlockValidator.java +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/PostBuildingBlockValidator.java @@ -21,6 +21,6 @@ package org.onap.so.bpmn.common.validation; -public interface PostBuildingBlockValidator extends BuildingBlockValidator { +public interface PostBuildingBlockValidator extends FlowValidator { } diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/PostWorkflowValidator.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/PostWorkflowValidator.java index 46b3c571d5..9070615a7a 100644 --- a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/PostWorkflowValidator.java +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/PostWorkflowValidator.java @@ -20,6 +20,6 @@ package org.onap.so.bpmn.common.validation; -public interface PostWorkflowValidator extends WorkflowValidator { +public interface PostWorkflowValidator extends FlowValidator { } diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/PreBuildingBlockValidator.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/PreBuildingBlockValidator.java index 489ac483d0..fda687e072 100644 --- a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/PreBuildingBlockValidator.java +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/PreBuildingBlockValidator.java @@ -20,6 +20,6 @@ package org.onap.so.bpmn.common.validation; -public interface PreBuildingBlockValidator extends BuildingBlockValidator { +public interface PreBuildingBlockValidator extends FlowValidator { } diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/PreWorkflowValidator.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/PreWorkflowValidator.java index 4dad1eafc4..0bfbf5602f 100644 --- a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/PreWorkflowValidator.java +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/PreWorkflowValidator.java @@ -20,6 +20,6 @@ package org.onap.so.bpmn.common.validation; -public interface PreWorkflowValidator extends WorkflowValidator { +public interface PreWorkflowValidator extends FlowValidator { } diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/WorkflowValidator.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/WorkflowValidator.java deleted file mode 100644 index 348f91321c..0000000000 --- a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/WorkflowValidator.java +++ /dev/null @@ -1,44 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP - SO - * ================================================================================ - * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.so.bpmn.common.validation; - -import java.util.Set; - -import org.camunda.bpm.engine.delegate.DelegateExecution; - -public interface WorkflowValidator { - - - /** - * Name of the workflow action to be validated - * @return - */ - public Set forWorkflowAction(); - - /** - * Determines whether or not the workflow should be executed - * - * @param execution - * @return - */ - public boolean validate(DelegateExecution execution); - -} diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/WorkflowValidatorRunner.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/WorkflowValidatorRunner.java index 44fbc6d629..d8c8601865 100644 --- a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/WorkflowValidatorRunner.java +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/WorkflowValidatorRunner.java @@ -51,99 +51,23 @@ import org.springframework.stereotype.Component; * */ @Component -public class WorkflowValidatorRunner { +public class WorkflowValidatorRunner extends FlowValidatorRunner { - private static Logger logger = LoggerFactory.getLogger(WorkflowValidatorRunner.class); - @Autowired - private ApplicationContext context; - - @Autowired - private ExceptionBuilder exceptionBuilder; - - private List preWorkflowValidators; - private List postWorkflowValidators; - - @PostConstruct protected void init() { - preWorkflowValidators = new ArrayList<>( + preFlowValidators = new ArrayList<>( Optional.ofNullable(context.getBeansOfType(PreWorkflowValidator.class)).orElse(new HashMap<>()).values()); - postWorkflowValidators = new ArrayList<>( + postFlowValidators = new ArrayList<>( Optional.ofNullable(context.getBeansOfType(PostWorkflowValidator.class)).orElse(new HashMap<>()).values()); } - - public boolean preValidate(String workflow, DelegateExecution execution) { - return validate(preWorkflowValidators, workflow, execution); - } - - - public boolean postValidate(String workflow, DelegateExecution execution) { - return validate(postWorkflowValidators, workflow, execution); - } - - - protected boolean validate(List validators, String workflow, DelegateExecution execution) { - List> results = runValidations(validators, workflow, execution); - - if (!results.isEmpty()) { - exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, - "Failed Validations:\n" + results.stream().map(item -> item.getValue0()).collect(Collectors.joining("\n"))); - } - - return true; - - } - protected List> runValidations(List validators, String workflow, DelegateExecution execution) { - - List filtered = filterValidators(validators, workflow); - - List> results = new ArrayList<>(); - filtered.forEach(item -> results.add(new Pair<>(item.getClass().getName(), item.validate(execution)))); - - return results.stream().filter(item -> item.getValue1().equals(false)).collect(Collectors.toList()); - } - - protected List filterValidators(List validators, String workflow) { - return validators.stream() - .filter(item -> { - return item.forWorkflowAction().contains(workflow); - }) - .sorted(Comparator.comparing(item -> { - Priority p = Optional.ofNullable(item.getClass().getAnnotation(Priority.class)).orElse(new Priority() { - public int value() { - return 1000; - } - @Override - public Class annotationType() { - return Priority.class; - } - }); - return p.value(); - })).collect(Collectors.toList()); - } - - protected List buildalidatorList(Reflections reflections, Class clazz) { - List result = new ArrayList<>(); - try { - for (Class klass : reflections.getSubTypesOf(clazz)) { - result.add(klass.newInstance()); - } - } catch (InstantiationException | IllegalAccessException e) { - logger.error("failed to build validator list for " + clazz.getName(), e); - throw new RuntimeException(e); - } - - return result; - } - - protected List getPreWorkflowValidators() { - return this.preWorkflowValidators; + protected List getPreFlowValidators() { + return this.preFlowValidators; } - protected List getPostWorkflowValidators() { - return this.postWorkflowValidators; + protected List getPostFlowValidators() { + return this.postFlowValidators; } } -- cgit 1.2.3-korg