diff options
author | Steve Smokowski <ss835w@att.com> | 2019-01-12 13:14:52 +0000 |
---|---|---|
committer | Gerrit Code Review <gerrit@onap.org> | 2019-01-12 13:14:52 +0000 |
commit | 7963ba28bc1fbd7fb27e3553eefda8ad8ce76f0c (patch) | |
tree | 08294ee1fbf458a9b89c899f4eaae70f2ae0b890 /bpmn/MSOCommonBPMN/src/main | |
parent | 9ed35e29b33510622b0fca1b8e3c21f2d44844d4 (diff) | |
parent | 45986141965394d115f41e1b404834f386cb5fa2 (diff) |
Merge changes I49db843f,I6c6d7a50
* changes:
descriptive messages now returned by validator
refactored validator to be more generic
Diffstat (limited to 'bpmn/MSOCommonBPMN/src/main')
10 files changed, 203 insertions, 258 deletions
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<String> 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<PreBuildingBlockValidator> preBuildingBlockValidators; - private List<PostBuildingBlockValidator> postBuildingBlockValidators; - +public class BuildingBlockValidatorRunner extends FlowValidatorRunner<PreBuildingBlockValidator, PostBuildingBlockValidator> { @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<? extends BuildingBlockValidator> validators, String bbName, BuildingBlockExecution execution) { - List<Pair<String, Boolean>> 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<Pair<String, Boolean>> runValidations(List<? extends BuildingBlockValidator> validators, String bbName, BuildingBlockExecution execution) { - - List<BuildingBlockValidator> filtered = filterValidators(validators, bbName); - - List<Pair<String,Boolean>> 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<BuildingBlockValidator> filterValidators(List<? extends BuildingBlockValidator> 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<? extends Annotation> annotationType() { - return Priority.class; - } - }); - return p.value(); - })).collect(Collectors.toList()); - } - - protected <T> List<T> buildalidatorList(Reflections reflections, Class<T> clazz) { - List<T> result = new ArrayList<>(); - try { - for (Class<? extends T> 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<PreBuildingBlockValidator> getPreBuildingBlockValidators() { - return this.preBuildingBlockValidators; + protected List<PreBuildingBlockValidator> getPreFlowValidators() { + return this.preFlowValidators; } - protected List<PostBuildingBlockValidator> getPostBuildingBlockValidators() { - return this.postBuildingBlockValidators; + protected List<PostBuildingBlockValidator> 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..96322c3c88 --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/FlowValidator.java @@ -0,0 +1,25 @@ +package org.onap.so.bpmn.common.validation; + +import java.util.Optional; +import java.util.Set; + +import org.onap.so.bpmn.common.BuildingBlockExecution; + +public interface FlowValidator { + + /** + * Names of items to be validated + * @return + */ + public Set<String> forItems(); + + /** + * Determines whether or not the workflow should be executed + + * + * @param execution + * @return + */ + public Optional<String> 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..9e6ea53a47 --- /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<S extends FlowValidator, E extends FlowValidator> { + + private static Logger logger = LoggerFactory.getLogger(FlowValidatorRunner.class); + @Autowired + protected ApplicationContext context; + + @Autowired + protected ExceptionBuilder exceptionBuilder; + + protected List<S> preFlowValidators; + protected List<E> 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<? extends FlowValidator> 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<? extends FlowValidator> validators, String bbName, BuildingBlockExecution execution) { + List<Pair<String, Optional<String>>> results = runValidations(validators, bbName, execution); + + if (!results.isEmpty()) { + exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, + "Failed Validations:\n" + results.stream().map(item -> String.format("%s: %s", item.getValue0(), item.getValue1().get())).collect(Collectors.joining("\n"))); + } + + return true; + + } + protected List<Pair<String, Optional<String>>> runValidations(List<? extends FlowValidator> validators, String bbName, BuildingBlockExecution execution) { + + List<FlowValidator> filtered = filterValidators(validators, bbName); + + List<Pair<String,Optional<String>>> results = new ArrayList<>(); + filtered.forEach(item -> results.add(new Pair<>(item.getClass().getName(), item.validate(execution)))); + + return results.stream().filter(item -> item.getValue1().isPresent()).collect(Collectors.toList()); + } + + protected List<FlowValidator> filterValidators(List<? extends FlowValidator> 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<? extends Annotation> annotationType() { + return Priority.class; + } + }); + return p.value(); + })).collect(Collectors.toList()); + } + + protected <T> List<T> buildalidatorList(Reflections reflections, Class<T> clazz) { + List<T> result = new ArrayList<>(); + try { + for (Class<? extends T> 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<S> getPreFlowValidators(); + + protected abstract List<E> 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<String> 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<PreWorkflowValidator, PostWorkflowValidator> { - private static Logger logger = LoggerFactory.getLogger(WorkflowValidatorRunner.class); - @Autowired - private ApplicationContext context; - - @Autowired - private ExceptionBuilder exceptionBuilder; - - private List<PreWorkflowValidator> preWorkflowValidators; - private List<PostWorkflowValidator> 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<? extends WorkflowValidator> validators, String workflow, DelegateExecution execution) { - List<Pair<String, Boolean>> 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<Pair<String, Boolean>> runValidations(List<? extends WorkflowValidator> validators, String workflow, DelegateExecution execution) { - - List<WorkflowValidator> filtered = filterValidators(validators, workflow); - - List<Pair<String,Boolean>> 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<WorkflowValidator> filterValidators(List<? extends WorkflowValidator> 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<? extends Annotation> annotationType() { - return Priority.class; - } - }); - return p.value(); - })).collect(Collectors.toList()); - } - - protected <T> List<T> buildalidatorList(Reflections reflections, Class<T> clazz) { - List<T> result = new ArrayList<>(); - try { - for (Class<? extends T> 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<PreWorkflowValidator> getPreWorkflowValidators() { - return this.preWorkflowValidators; + protected List<PreWorkflowValidator> getPreFlowValidators() { + return this.preFlowValidators; } - protected List<PostWorkflowValidator> getPostWorkflowValidators() { - return this.postWorkflowValidators; + protected List<PostWorkflowValidator> getPostFlowValidators() { + return this.postFlowValidators; } } |