package com.epam.wilma.sequence.evaluator; /*========================================================================== Copyright 2013-2017 EPAM Systems This file is part of Wilma. Wilma is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Wilma is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Wilma. If not, see <http://www.gnu.org/licenses/>. ===========================================================================*/ import java.util.Iterator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.epam.wilma.domain.http.WilmaHttpRequest; import com.epam.wilma.domain.stubconfig.dialog.DialogDescriptor; import com.epam.wilma.domain.stubconfig.dialog.condition.Condition; import com.epam.wilma.domain.stubconfig.dialog.condition.ConditionDescriptor; import com.epam.wilma.domain.stubconfig.sequence.SequenceDescriptor; import com.epam.wilma.router.evaluation.ConditionEvaluator; import com.epam.wilma.router.evaluation.helper.DialogDescriptorService; import com.epam.wilma.router.helper.WilmaHttpRequestCloner; import com.epam.wilma.sequence.helper.SequenceDescriptorKeyUtil; /** * This class decides if a Request belongs to a SequenceDescriptor or not. * @author Tibor_Kovacs * */ @Component public class SequenceDescriptorEvaluator { private final Logger logger = LoggerFactory.getLogger(SequenceDescriptorEvaluator.class); @Autowired private ConditionEvaluator conditionEvaluator; @Autowired private WilmaHttpRequestCloner requestCloner; @Autowired private DialogDescriptorService dialogDescriptorService; @Autowired private SequenceDescriptorKeyUtil sequenceDescriptorKeyUtil; /** * This method checks whether the given SequenceDescriptor has a rule which is matched with the given Request or not. * @param request is the checked request * @param sequenceDescriptor contains conditions and dialog descriptors. * @return with true if there is any condition which has matched with the given Request, otherwise return with false */ public boolean evaluate(final WilmaHttpRequest request, final SequenceDescriptor sequenceDescriptor) { boolean result = false; result = checkConditions(request, sequenceDescriptor, result); if (!result) { result = checkDialogDescriptors(request, sequenceDescriptor, result); } return result; } private boolean checkConditions(final WilmaHttpRequest request, final SequenceDescriptor sequenceDescriptor, final boolean state) { boolean result = state; Iterator<ConditionDescriptor> cdIterator = sequenceDescriptor.getConditionDescriptors().iterator(); while (cdIterator.hasNext() && !result) { ConditionDescriptor conditionDescriptor = cdIterator.next(); Condition condition = conditionDescriptor.getCondition(); try { result = conditionEvaluator.evaluate(condition, requestCloner.cloneRequest(request)); } catch (Exception e) { String descriptorKey = sequenceDescriptorKeyUtil.createDescriptorKey(sequenceDescriptor.getGroupName(), sequenceDescriptor.getName()); logger.error("Error during condition evaluation in the " + descriptorKey + " sequence!", e); } } return result; } private boolean checkDialogDescriptors(final WilmaHttpRequest request, final SequenceDescriptor sequenceDescriptor, final boolean state) { boolean result = state; Iterator<DialogDescriptor> ddIterator = sequenceDescriptor.getDialogDescriptors().iterator(); while (ddIterator.hasNext() && !result) { DialogDescriptor dialogDescriptor = ddIterator.next(); if (dialogDescriptorService.isEnabled(dialogDescriptor)) { ConditionDescriptor conditionDescriptor = dialogDescriptor.getConditionDescriptor(); Condition condition = conditionDescriptor.getCondition(); result = conditionEvaluator.evaluate(condition, requestCloner.cloneRequest(request)); request.pushEvaluationResult(dialogDescriptor, result); } } return result; } }