package info.mangolia.support.ui.form.field; import info.magnolia.cms.i18n.I18nContentSupport; import info.magnolia.objectfactory.ComponentProvider; import info.magnolia.ui.form.field.CompositeField; import info.magnolia.ui.form.field.factory.FieldFactoryFactory; import info.mangolia.support.ui.form.definition.CrossFieldsValidatingCompositeFieldDefinition; import info.mangolia.support.ui.form.field.comparator.CrossFieldsComparator; import java.util.List; import com.vaadin.data.Item; import com.vaadin.data.util.PropertysetItem; import com.vaadin.ui.AbstractField; import com.vaadin.ui.Field; /** * Generic Composite Field.
* This generic Composite Field extends the {@link CompositeField} and allows to validate its sub fields: cross field validation within the composite field.
> */ public class CrossFieldsValidatingCompositeField extends CompositeField { // Ugly hack, CompositeField should let define the definition by generics, then no new member variable would have to be defined. The super definition would have the right type. private CrossFieldsValidatingCompositeFieldDefinition definition; public CrossFieldsValidatingCompositeField(CrossFieldsValidatingCompositeFieldDefinition definition, FieldFactoryFactory fieldFactoryFactory, I18nContentSupport i18nContentSupport, ComponentProvider componentProvider, Item relatedFieldItem) { super(definition, fieldFactoryFactory, i18nContentSupport, componentProvider, relatedFieldItem); this.definition = definition; } @Override public boolean isValid() { boolean isValid = super.isValid(); if (this.isRequired()) { // If required is set on the composite itself then it checks if one of the sub-fields is empty -> all must have a value if (isEmpty()) { isValid = false; } } if (definition.isEnabledCrossFieldsValidation()) { Class>> crossFieldsComparatorClazz = definition.getCrossFieldsComparator(); CrossFieldsComparator> crossFieldsComparator = componentProvider.newInstance(crossFieldsComparatorClazz); List> fields = getFields(this, false); Field[] fieldsArray = fields.toArray(new Field[fields.size()]); if (!crossFieldsComparator.passCrossComparison(fieldsArray)) { isValid = false; } } return isValid; } }