package rocks.inspectit.ui.rcp.ci.form.part.business; import java.util.Set; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.forms.IDetailsPage; import org.eclipse.ui.forms.IFormPart; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.editor.FormPage; import com.google.common.base.Objects; 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.impl.BusinessTransactionDefinition; import rocks.inspectit.ui.rcp.formatter.TextFormatter; import rocks.inspectit.ui.rcp.validation.AbstractValidationManager; import rocks.inspectit.ui.rcp.validation.ValidationState; /** * @author Alexander Wert * */ public class BusinessTransactionDetailsPage implements IDetailsPage { /** * Name of the business transaction mapping form part. */ private static final String BUSINESS_TRANSACTION_MAPPING_PART_NAME = "Business Transaction Mapping"; /** * The {@link FormPage} this details page belongs to. */ private final FormPage formPage; /** * Corresponding {@link IManagedForm}. */ private IManagedForm managedForm; /** * Part for managing the matching rules. */ private SelectiveRulesPart rulesPart; /** * Part for managing dynamic name extraction. */ private DynamicNameExtractionPart nameExtractionPart; /** * Selected business transaction. */ private BusinessTransactionDefinition selectedBusinessTransaction; /** * The upstream validation manager to delegate aggregated validation messages to. */ private final AbstractValidationManager<BusinessTransactionDefinition> upstreamValidationManager; /** * Constructor. * * @param formPage * The {@link FormPage} this details page belongs to. * @param validationManager * {@link AbstractValidationManager} instance to be notified on validation state * changes. */ public BusinessTransactionDetailsPage(FormPage formPage, AbstractValidationManager<BusinessTransactionDefinition> validationManager) { this.formPage = formPage; this.upstreamValidationManager = validationManager; } /** * {@inheritDoc} */ @Override public void createContents(Composite parent) { parent.setLayout(new GridLayout(2, true)); BusinessTransactionPartsValidationManager<AbstractExpression> rulesValidationManager = new BusinessTransactionPartsValidationManager<AbstractExpression>(upstreamValidationManager); rulesPart = new SelectiveRulesPart(BUSINESS_TRANSACTION_MAPPING_PART_NAME, parent, formPage.getManagedForm(), rulesValidationManager); BusinessTransactionPartsValidationManager<String> nameExtractionValidationManager = new BusinessTransactionPartsValidationManager<String>(upstreamValidationManager); nameExtractionPart = new DynamicNameExtractionPart(parent, formPage.getManagedForm(), nameExtractionValidationManager); } /** * {@inheritDoc} */ @Override public void initialize(IManagedForm form) { this.managedForm = form; } /** * {@inheritDoc} */ @Override public void commit(boolean onSave) { } /** * {@inheritDoc} */ @Override public void dispose() { if (null != rulesPart) { rulesPart.dispose(); } if (null != nameExtractionPart) { nameExtractionPart.dispose(); } } /** * {@inheritDoc} */ @Override public boolean isDirty() { return rulesPart.isDirty() || nameExtractionPart.isDirty(); } /** * {@inheritDoc} */ @Override public boolean setFormInput(Object input) { return rulesPart.setFormInput(input); } /** * {@inheritDoc} */ @Override public void setFocus() { rulesPart.setFocus(); } /** * {@inheritDoc} */ @Override public boolean isStale() { return rulesPart.isStale() || nameExtractionPart.isStale(); } /** * {@inheritDoc} */ @Override public void refresh() { rulesPart.refresh(); nameExtractionPart.refresh(); } /** * {@inheritDoc} */ @Override public void selectionChanged(IFormPart part, ISelection selection) { if (!selection.isEmpty()) { selectedBusinessTransaction = (BusinessTransactionDefinition) ((StructuredSelection) selection).getFirstElement(); if (null != selectedBusinessTransaction) { rulesPart.initContent(selectedBusinessTransaction); rulesPart.setDescriptionText("Define the matching rule that should be used to match the selected business transaction:"); nameExtractionPart.setEditable(selectedBusinessTransaction.getId() != BusinessTransactionDefinition.DEFAULT_ID); nameExtractionPart.init(selectedBusinessTransaction); } managedForm.getForm().layout(true, true); } } /** * Validation manager responsible for aggregating validation messages to the corresponding form * parts of the business transaction details page. * * @author Alexander Wert * * @param <K> */ private class BusinessTransactionPartsValidationManager<K> extends AbstractValidationManager<K> { /** * The upstream validation manager to provide messages to. */ private final AbstractValidationManager<BusinessTransactionDefinition> upstreamValidationManager; /** * Constructor. * * @param upstreamValidationManager * the upstream validation manager to provide messages to */ BusinessTransactionPartsValidationManager(AbstractValidationManager<BusinessTransactionDefinition> upstreamValidationManager) { this.upstreamValidationManager = upstreamValidationManager; } /** * {@inheritDoc} */ @Override protected void notifyUpstream(K key, Set<ValidationState> states) { String errorsText = TextFormatter.getValidationErrorsCountText(states, "field"); String part = getGroupName(key); String message = null != errorsText ? part + " (" + errorsText + ")" : ""; upstreamValidationManager.validationStateChanged(selectedBusinessTransaction, new ValidationState(key, null == errorsText, message)); } /** * {@inheritDoc} */ @Override protected void showMessage(K key, Set<ValidationState> states) { } /** * {@inheritDoc} */ @Override protected void hideMessage(K key) { } /** * Retrieves the group name from the given key. * * @param key * The key from which to retrieve the validation group from. * @return the string representation of the validation group */ private String getGroupName(K key) { if (key instanceof StringMatchingExpression) { return MatchingRulesEditingElementFactory.getMatchingRuleType((AbstractExpression) key).toString(); } else if (key instanceof MatchingRulesEditingElementFactory.InvalidExpression) { return BUSINESS_TRANSACTION_MAPPING_PART_NAME; } else if (Objects.equal(key, DynamicNameExtractionPart.TITLE)) { return DynamicNameExtractionPart.TITLE; } else { return ""; } } } }