/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * 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. */ package org.drools.workbench.screens.guided.rule.client.editor.validator; import java.util.ArrayList; import java.util.List; import org.drools.workbench.models.datamodel.oracle.DataType; import org.drools.workbench.models.datamodel.rule.BaseSingleFieldConstraint; import org.drools.workbench.models.datamodel.rule.CompositeFactPattern; import org.drools.workbench.models.datamodel.rule.FactPattern; import org.drools.workbench.models.datamodel.rule.FieldConstraint; import org.drools.workbench.models.datamodel.rule.FromAccumulateCompositeFactPattern; import org.drools.workbench.models.datamodel.rule.FromCollectCompositeFactPattern; import org.drools.workbench.models.datamodel.rule.FromCompositeFactPattern; import org.drools.workbench.models.datamodel.rule.FromEntryPointFactPattern; import org.drools.workbench.models.datamodel.rule.IPattern; import org.drools.workbench.models.datamodel.rule.RuleModel; import org.drools.workbench.models.datamodel.rule.SingleFieldConstraint; import org.drools.workbench.models.datamodel.util.PortablePreconditions; import org.drools.workbench.screens.guided.rule.client.resources.i18n.Constants; public class GuidedRuleEditorValidator { private final List<String> errors = new ArrayList<String>(); private final RuleModel model; private final Constants constants; public GuidedRuleEditorValidator(final RuleModel model, final Constants constants) { this.model = PortablePreconditions.checkNotNull("model", model); this.constants = PortablePreconditions.checkNotNull("constants", constants); } public boolean isValid() { if (model.lhs.length == 0) { return true; } else { validateIPatterns(model.lhs); } return errors.isEmpty(); } private void validateIPatterns(final IPattern[] patterns) { if (patterns == null) { return; } for (IPattern iPattern : patterns) { validateIPattern(iPattern); } } private void validateIPattern(final IPattern iPattern) { if (iPattern instanceof FromEntryPointFactPattern) { validateFromEntryPointFactPattern((FromEntryPointFactPattern) iPattern); } else if (iPattern instanceof FromAccumulateCompositeFactPattern) { validateFromAccumulateCompositeFactPattern((FromAccumulateCompositeFactPattern) iPattern); } else if (iPattern instanceof FromCollectCompositeFactPattern) { validateFromCollectCompositeFactPattern((FromCollectCompositeFactPattern) iPattern); } else if (iPattern instanceof FromCompositeFactPattern) { validateFromCompositeFactPattern((FromCompositeFactPattern) iPattern); } else if (iPattern instanceof CompositeFactPattern) { validateCompositeFactPattern((CompositeFactPattern) iPattern); } else if (iPattern instanceof FactPattern) { validateFactPattern((FactPattern) iPattern); } } private void validateFromEntryPointFactPattern(final FromEntryPointFactPattern fromEntryPointFactPattern) { hasFactPatternSet(fromEntryPointFactPattern); hasEntryPoint(fromEntryPointFactPattern); } private void hasEntryPoint(final FromEntryPointFactPattern fromEntryPointFactPattern) { if (isStringNullOrEmpty(fromEntryPointFactPattern.getEntryPointName())) { errors.add(constants.PleaseSetTheEntryPoint()); } } private void validateCompositeFactPattern(final CompositeFactPattern compositeFactPattern) { hasPatterns(compositeFactPattern); validateIPatterns(compositeFactPattern.getPatterns()); } private void validateFromCompositeFactPattern(final FromCompositeFactPattern fromCompositeFactPattern) { hasFactPatternSet(fromCompositeFactPattern); hasExpressionBinding(fromCompositeFactPattern); validateFactPattern(fromCompositeFactPattern.getFactPattern()); } private void hasFactPatternSet(final FromCompositeFactPattern fromCompositeFactPattern) { if (fromCompositeFactPattern.getFactPattern() == null) { reportMandatoryFieldsError(); } } private void validateFromAccumulateCompositeFactPattern(final FromAccumulateCompositeFactPattern fromAccumulateCompositeFactPattern) { validateIPattern(fromAccumulateCompositeFactPattern.getSourcePattern()); validateIPattern(fromAccumulateCompositeFactPattern.getFactPattern()); if (isExpressionBindingMissing(fromAccumulateCompositeFactPattern) && isStringNullOrEmpty(fromAccumulateCompositeFactPattern.getFunction()) && isAccumulateMissing(fromAccumulateCompositeFactPattern)) { reportMissingSource(); } } private void validateFromCollectCompositeFactPattern(final FromCollectCompositeFactPattern fromCollectCompositeFactPattern) { if (fromCollectCompositeFactPattern.getRightPattern() == null) { reportMandatoryFieldsError(); } else if (fromCollectCompositeFactPattern.getFactPattern() == null){ reportMandatoryFieldsError(); } else { validateIPattern(fromCollectCompositeFactPattern.getRightPattern()); } validateIPattern(fromCollectCompositeFactPattern.getFactPattern()); } private boolean isAccumulateMissing(final FromAccumulateCompositeFactPattern fromAccumulateCompositeFactPattern) { return isStringNullOrEmpty(fromAccumulateCompositeFactPattern.getActionCode()) && isStringNullOrEmpty(fromAccumulateCompositeFactPattern.getResultCode()) && isStringNullOrEmpty(fromAccumulateCompositeFactPattern.getResultCode()) && isStringNullOrEmpty(fromAccumulateCompositeFactPattern.getInitCode()); } private boolean isStringNullOrEmpty(final String actionCode) { return actionCode == null || actionCode.isEmpty(); } private void hasExpressionBinding(final FromCompositeFactPattern fromCompositeFactPattern) { if (isExpressionBindingMissing(fromCompositeFactPattern)) { reportMissingSource(); } } private void reportMissingSource() { errors.add(constants.WhenUsingFromTheSourceNeedsToBeSet()); } private boolean isExpressionBindingMissing(final FromCompositeFactPattern fromCompositeFactPattern) { return fromCompositeFactPattern.getExpression().getBinding() == null && fromCompositeFactPattern.getExpression().getParts().isEmpty(); } private void hasPatterns(final CompositeFactPattern iPattern) { if (iPattern.getPatterns() == null) { reportMandatoryFieldsError(); } else if (iPattern.getPatterns().length == 0) { reportMandatoryFieldsError(); } } private void validateFactPattern(final FactPattern factPattern) { if (factPattern == null || factPattern.getConstraintList() == null || factPattern.getConstraintList().getConstraints() == null) { return; } for (FieldConstraint constraint : factPattern.getConstraintList().getConstraints()) { if (constraint instanceof SingleFieldConstraint) { SingleFieldConstraint singleFieldConstraint = (SingleFieldConstraint) constraint; if (areOperatorAndValueInvalid(singleFieldConstraint)) { errors.add(constants.FactType0HasAField1ThatHasAnOperatorSetButNoValuePleaseAddAValueOrRemoveTheOperator( factPattern.getFactType(), singleFieldConstraint.getFieldName())); } } } } private boolean areOperatorAndValueInvalid(final SingleFieldConstraint singleFieldConstraint) { if (singleFieldConstraint.getConstraintValueType() == BaseSingleFieldConstraint.TYPE_LITERAL) { if (DataType.TYPE_STRING.equals(singleFieldConstraint.getFieldType())) { return false; } } return singleFieldConstraint.getOperator() != null && !singleFieldConstraint.getOperator().equals("== null") && !singleFieldConstraint.getOperator().equals("!= null") && singleFieldConstraint.getValue() == null && singleFieldConstraint.getExpressionValue().isEmpty(); } private void reportMandatoryFieldsError() { errors.add(constants.AreasMarkedWithRedAreMandatoryPleaseSetAValueBeforeSaving()); } public List<String> getErrors() { return errors; } }