package rocks.inspectit.ui.rcp.ci.form.part.business.rules.impl; import java.util.HashSet; import java.util.Set; import org.apache.commons.lang.StringUtils; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.forms.widgets.FormToolkit; import rocks.inspectit.shared.cs.ci.business.expression.AbstractExpression; import rocks.inspectit.shared.cs.ci.business.expression.impl.StringMatchingExpression; import rocks.inspectit.shared.cs.ci.business.valuesource.impl.HttpParameterValueSource; import rocks.inspectit.ui.rcp.InspectIT; import rocks.inspectit.ui.rcp.InspectITImages; import rocks.inspectit.ui.rcp.ci.form.part.business.MatchingRulesEditingElementFactory.MatchingRuleType; import rocks.inspectit.ui.rcp.ci.form.part.business.rules.AbstractStringMatchingRuleEditingElement; import rocks.inspectit.ui.rcp.validation.AbstractValidationManager; import rocks.inspectit.ui.rcp.validation.ValidationControlDecoration; import rocks.inspectit.ui.rcp.validation.ValidationState; /** * Editing element for a HTTP parameter matching expression. * * @author Alexander Wert * */ public class HttpParameterRuleEditingElement extends AbstractStringMatchingRuleEditingElement<HttpParameterValueSource> { /** * The name of the string source. */ private static final String SOURCE_NAME = "Value"; /** * Error message for the parameter name validator. */ private static final String PARAMETER_NAME_VALIDATION_ERROR_MESSAGE = "Parameter name must not be empty!"; /** * Description text for the parameter row. */ private static final String PARAMETER_DESCRIPTION = "Specify the HTTP parameter name. \n\nNo wildcards are allowed here!"; /** * Description for the HTTP parameter matching rule. */ private static final String DESCRIPTION = "This rule applies if the value of the specified HTTP parameter of the corresponding request\n" + "matches (equals, starts with, etc.) the specified String value."; /** * Identifier of the parameter name validator. */ private static final String PARAMETER_NAME_VALIDATOR_ID = "PARAMETER_NAME_VALIDATOR_ID"; /** * Text editing field for the {@link #parameterName} property. */ private Text parameterNameText; /** * Constructor. * * @param expression * The {@link AbstractExpression} instance to modify. * @param editable * indicates whether this editing element should be editable or read-only. If false, * this element will be read only. * @param upstreamValidationManager * {@link AbstractValidationManager} instance to be notified on validation state * changes. */ public HttpParameterRuleEditingElement(StringMatchingExpression expression, boolean editable, AbstractValidationManager<AbstractExpression> upstreamValidationManager) { super(expression, MatchingRuleType.HTTP_PARAMETER, DESCRIPTION, SOURCE_NAME, true, editable, upstreamValidationManager); } /** * Validates the contents of the passed {@link StringMatchingExpression} without the need to * create corresponding editing controls. * * @param expression * {@link StringMatchingExpression} to validate * @return a set of {@link ValidationState} instances. */ public static Set<ValidationState> validate(StringMatchingExpression expression) { Set<ValidationState> resultSet = new HashSet<>(); HttpParameterValueSource httpParameterValueSource = (HttpParameterValueSource) expression.getStringValueSource(); if (StringUtils.isBlank(httpParameterValueSource.getParameterName())) { resultSet.add(new ValidationState(PARAMETER_NAME_VALIDATOR_ID, false, PARAMETER_NAME_VALIDATION_ERROR_MESSAGE)); } resultSet.addAll(AbstractStringMatchingRuleEditingElement.validate(expression, SOURCE_NAME)); return resultSet; } /** * * {@inheritDoc} */ @Override protected void createSpecificElements(final Composite parent, FormToolkit toolkit) { Label fillLabel = toolkit.createLabel(parent, ""); fillLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1)); addControl(fillLabel); Label parameterLabel = toolkit.createLabel(parent, "Parameter name:"); parameterLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1)); addControl(parameterLabel); parameterNameText = new Text(parent, SWT.BORDER); parameterNameText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 4, 1)); parameterNameText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { getStringValueSource().setParameterName(parameterNameText.getText()); notifyModifyListeners(); } }); addControl(parameterNameText); Label infoLabel = toolkit.createLabel(parent, ""); infoLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1)); infoLabel.setImage(InspectIT.getDefault().getImage(InspectITImages.IMG_INFORMATION)); infoLabel.setToolTipText(PARAMETER_DESCRIPTION); addControl(infoLabel); super.createSpecificElements(parent, toolkit); } /** * * {@inheritDoc} */ @Override protected void executeSpecificInitialization(StringMatchingExpression expression) { if (isValidExpression(expression)) { super.executeSpecificInitialization(expression); parameterNameText.setText(getStringValueSource().getParameterName()); } } /** * * {@inheritDoc} */ @Override protected boolean isValidExpression(StringMatchingExpression expression) { return expression.getStringValueSource() instanceof HttpParameterValueSource; } /** * {@inheritDoc} */ @Override public void createControlValidators() { super.createControlValidators(); ValidationControlDecoration<Text> parameterNameTextValidation = new ValidationControlDecoration<Text>(parameterNameText, getValidationManager()) { @Override protected boolean validate(Text control) { return StringUtils.isNotBlank(control.getText()); } }; parameterNameTextValidation.setDescriptionText(PARAMETER_NAME_VALIDATION_ERROR_MESSAGE); parameterNameTextValidation.registerListener(SWT.Modify); getValidationManager().addValidator(parameterNameTextValidation, PARAMETER_NAME_VALIDATOR_ID); } }