package com.constellio.app.ui.pages.management.extractors.fields;
import static com.constellio.app.ui.i18n.i18n.$;
import java.util.List;
import java.util.regex.Pattern;
import com.constellio.app.ui.entities.MetadataVO;
import com.constellio.app.ui.pages.management.extractors.entities.RegexConfigVO;
import com.constellio.model.entities.schemas.RegexConfig.RegexConfigType;
import com.vaadin.data.Validator.InvalidValueException;
import com.vaadin.data.fieldgroup.FieldGroup;
import com.vaadin.data.fieldgroup.FieldGroup.CommitException;
import com.vaadin.data.fieldgroup.PropertyId;
import com.vaadin.data.util.AbstractProperty;
import com.vaadin.data.util.BeanItem;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.Component;
import com.vaadin.ui.CustomField;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
public class RegexConfigFieldImpl extends CustomField<RegexConfigVO> implements RegexConfigField {
private RegexConfigVO regexConfigVO;
private BeanItem<RegexConfigVO> regexConfigItem;
private FieldGroup fieldGroup;
@PropertyId("inputMetadata")
private ComboBox inputMetadataComboboxField;
@PropertyId("regex")
private TextField regexTextField;
@PropertyId("value")
private TextField valueTextField;
@PropertyId("regexConfigType")
private ComboBox regexConfigTypeComboboxField;
@Override
protected Component initContent() {
if (regexConfigVO == null) {
regexConfigVO = new RegexConfigVO();
}
regexConfigItem = new BeanItem<>(regexConfigVO);
fieldGroup = new FieldGroup(regexConfigItem);
setPropertyDataSource(new AbstractProperty<RegexConfigVO>() {
@Override
public RegexConfigVO getValue() {
boolean submittedMetadataValid = regexConfigVO.getInputMetadata() != null;
return submittedMetadataValid ? regexConfigVO : null;
}
@Override
public void setValue(RegexConfigVO newValue)
throws ReadOnlyException {
setInternalValue(newValue);
regexConfigVO = newValue != null ? newValue : new RegexConfigVO();
if (fieldGroup != null) {
regexConfigItem = new BeanItem<>(regexConfigVO);
fieldGroup.setItemDataSource(regexConfigItem);
}
}
@Override
public Class<? extends RegexConfigVO> getType() {
return RegexConfigVO.class;
}
});
VerticalLayout mainLayout = new VerticalLayout();
mainLayout.setWidth("99%");
mainLayout.setHeightUndefined();
mainLayout.setSpacing(true);
inputMetadataComboboxField = new ComboBox();
inputMetadataComboboxField.setCaption($("RegexConfigField.inputMetadata"));
inputMetadataComboboxField.setId("inputMetadata");
inputMetadataComboboxField.addItem("test");
inputMetadataComboboxField.setNullSelectionAllowed(false);
regexTextField = new TextField();
regexTextField.setCaption($("RegexConfigField.regex"));
regexTextField.setId("regex");
regexTextField.setNullRepresentation("");
valueTextField = new TextField();
valueTextField.setCaption($("RegexConfigField.value"));
valueTextField.setId("value");
valueTextField.setNullRepresentation("");
regexConfigTypeComboboxField = new ComboBox();
regexConfigTypeComboboxField.setCaption($("RegexConfigField.regexConfigType"));
regexConfigTypeComboboxField.setId("regexConfigType");
regexConfigTypeComboboxField.addItem(RegexConfigType.SUBSTITUTION);
regexConfigTypeComboboxField
.setItemCaption(RegexConfigType.SUBSTITUTION, $("RegexConfigField.RegexConfigType.SUBSTITUTION"));
regexConfigTypeComboboxField.addItem(RegexConfigType.TRANSFORMATION);
regexConfigTypeComboboxField
.setItemCaption(RegexConfigType.TRANSFORMATION, $("RegexConfigField.RegexConfigType.TRANSFORMATION"));
HorizontalLayout horizontalLayout = new HorizontalLayout();
horizontalLayout.setSpacing(true);
horizontalLayout.setWidth("100%");
horizontalLayout.addComponents(inputMetadataComboboxField, regexTextField, regexConfigTypeComboboxField, valueTextField);
mainLayout.addComponents(horizontalLayout);
mainLayout.setExpandRatio(horizontalLayout, 1);
fieldGroup.bindMemberFields(this);
return mainLayout;
}
public void setMetadataOptions(List<MetadataVO> metadataVOs) {
inputMetadataComboboxField.removeAllItems();
for (MetadataVO metadataVO : metadataVOs) {
inputMetadataComboboxField.addItem(metadataVO.getCode());
inputMetadataComboboxField.setItemCaption(metadataVO.getCode(), metadataVO.getLabel());
}
}
@Override
public Class<? extends RegexConfigVO> getType() {
return RegexConfigVO.class;
}
@Override
public void commit()
throws SourceException, InvalidValueException {
if (isValidField()) {
try {
fieldGroup.commit();
} catch (CommitException e) {
throw new InvalidValueException(e.getMessage());
}
super.commit();
}
}
private boolean isValidField() {
boolean valid = true;
if (inputMetadataComboboxField.getValue() == null
|| regexTextField.getValue() == null
|| valueTextField.getValue() == null
|| regexConfigTypeComboboxField.getValue() == null) {
valid = false;
} else {
try {
Pattern.compile(regexTextField.getValue());
} catch (Exception e) {
valid = false;
}
}
return valid;
}
}