package com.constellio.app.ui.pages.management.extractors;
import static com.constellio.model.entities.schemas.MetadataValueType.CONTENT;
import static com.constellio.model.entities.schemas.MetadataValueType.STRING;
import static com.constellio.model.entities.schemas.MetadataValueType.TEXT;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils;
import com.constellio.app.ui.entities.MetadataExtractorVO;
import com.constellio.app.ui.entities.MetadataSchemaTypeVO;
import com.constellio.app.ui.entities.MetadataSchemaVO;
import com.constellio.app.ui.entities.MetadataVO;
import com.constellio.app.ui.entities.RecordVO.VIEW_MODE;
import com.constellio.app.ui.framework.builders.MetadataSchemaToVOBuilder;
import com.constellio.app.ui.framework.builders.MetadataSchemaTypeToVOBuilder;
import com.constellio.app.ui.framework.builders.MetadataToVOBuilder;
import com.constellio.app.ui.pages.base.BasePresenter;
import com.constellio.app.ui.pages.base.SessionContext;
import com.constellio.app.ui.pages.management.extractors.entities.RegexConfigVO;
import com.constellio.model.entities.CorePermissions;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.MetadataPopulateConfigs;
import com.constellio.model.entities.schemas.MetadataSchema;
import com.constellio.model.entities.schemas.MetadataSchemaType;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.entities.schemas.RegexConfig;
import com.constellio.model.services.schemas.MetadataListFilter;
import com.constellio.model.services.schemas.MetadataSchemaTypesAlteration;
import com.constellio.model.services.schemas.MetadataSchemasManager;
import com.constellio.model.services.schemas.builders.MetadataBuilder;
import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder;
public class AddEditMetadataExtractorPresenter extends BasePresenter<AddEditMetadataExtractorView> {
private MetadataExtractorVO metadataExtractorVO;
private boolean addView;
private MetadataToVOBuilder metadataToVOBuilder;
private MetadataSchemaToVOBuilder metadataSchemaToVOBuilder;
private MetadataSchemaTypeToVOBuilder metadataSchemaTypeToVOBuilder;
private String schemaCode;
private MetadataVO metadataVO;
public AddEditMetadataExtractorPresenter(AddEditMetadataExtractorView view) {
super(view);
metadataToVOBuilder = new MetadataToVOBuilder();
metadataSchemaToVOBuilder = new MetadataSchemaToVOBuilder();
metadataSchemaTypeToVOBuilder = new MetadataSchemaTypeToVOBuilder();
}
@Override
protected boolean hasPageAccess(String params, User user) {
return user.has(CorePermissions.MANAGE_METADATAEXTRACTOR).globally();
}
public void forParams(String parameters) {
SessionContext sessionContext = view.getSessionContext();
MetadataSchemaTypes types = types();
addView = StringUtils.isBlank(parameters);
if (addView) {
metadataExtractorVO = new MetadataExtractorVO(null, new MetadataPopulateConfigs());
view.setSchemaTypeFieldVisible(true);
view.setSchemaFieldVisible(true);
view.setMetadataFieldEnabled(true);
List<MetadataSchemaTypeVO> metadataSchemaTypeVOs = new ArrayList<>();
List<MetadataSchemaType> schemaTypes = types.getSchemaTypes();
MetadataListFilter filterSearchable = new MetadataListFilter() {
@Override
public boolean isReturned(Metadata metadata) {
return metadata.isSearchable();
}
};
for (MetadataSchemaType metadataSchemaType : schemaTypes) {
if (!metadataSchemaType.getAllMetadatas().only(filterSearchable).onlyEnabled().isEmpty()) {
metadataSchemaTypeVOs.add(metadataSchemaTypeToVOBuilder.build(metadataSchemaType, sessionContext));
}
}
view.setSchemaTypeOptions(metadataSchemaTypeVOs);
} else {
view.setSchemaTypeFieldVisible(false);
view.setSchemaFieldVisible(false);
view.setMetadataFieldEnabled(false);
Metadata metadata = types.getMetadata(parameters);
schemaCode = metadata.getSchemaCode();
metadataVO = metadataToVOBuilder.build(metadata, sessionContext);
metadataExtractorVO = new MetadataExtractorVO(metadataVO, metadata.getPopulateConfigs());
}
view.setMetadataExtractorVO(metadataExtractorVO);
}
public void saveButtonClicked() {
MetadataVO metadataVO = metadataExtractorVO.getMetadataVO();
final List<RegexConfig> regexConfigs = voToRegexConfigs();
final String metadataCode = metadataVO.getCode();
MetadataSchemasManager metadataSchemasManager = modelLayerFactory.getMetadataSchemasManager();
metadataSchemasManager.modify(collection, new MetadataSchemaTypesAlteration() {
@Override
public void alter(MetadataSchemaTypesBuilder types) {
MetadataBuilder metadataBuilder = types.getMetadata(metadataCode);
metadataBuilder.getPopulateConfigsBuilder().setStyles(metadataExtractorVO.getStyles());
metadataBuilder.getPopulateConfigsBuilder().setProperties(metadataExtractorVO.getProperties());
metadataBuilder.getPopulateConfigsBuilder().setRegexes(regexConfigs);
}
});
view.navigate().to().listMetadataExtractors();
}
private List<RegexConfig> voToRegexConfigs() {
final List<RegexConfig> regexConfigs = new ArrayList<>();
for (RegexConfigVO regexConfigVO : metadataExtractorVO.getRegexes()) {
RegexConfig regexConfig = new RegexConfig();
regexConfig.setInputMetadata(regexConfigVO.getInputMetadata());
regexConfig.setRegex(Pattern.compile(regexConfigVO.getRegex()));
regexConfig.setValue(regexConfigVO.getValue());
regexConfig.setRegexConfigType(regexConfigVO.getRegexConfigType());
regexConfigs.add(regexConfig);
}
return regexConfigs;
}
public void cancelButtonClicked() {
view.navigate().to().listMetadataExtractors();
}
public void backButtonClicked() {
view.navigate().to().listMetadataExtractors();
}
public void schemaTypeSelected(MetadataSchemaTypeVO schemaTypeVO) {
List<MetadataSchemaVO> schemaOptions = new ArrayList<>();
if (schemaTypeVO != null) {
SessionContext sessionContext = view.getSessionContext();
String schemaTypeCode = schemaTypeVO.getCode();
MetadataSchemaTypes types = types();
MetadataSchemaType schemaType = types.getSchemaType(schemaTypeCode);
for (MetadataSchema schema : schemaType.getAllSchemas()) {
schemaOptions.add(metadataSchemaToVOBuilder.build(schema, VIEW_MODE.TABLE, sessionContext));
}
} else {
view.setMetadataOptions(new ArrayList<MetadataVO>());
}
view.setSchemaOptions(schemaOptions);
}
public void schemaSelected(MetadataSchemaVO schemaVO) {
if (schemaVO != null) {
List<MetadataVO> metadataOptions = getMetadataVOs(schemaVO.getCode());
schemaCode = schemaVO.getCode();
view.setMetadataOptions(metadataOptions);
}
}
private List<MetadataVO> getMetadataVOs(String schemaCode) {
List<MetadataVO> metadataOptions = new ArrayList<>();
if (schemaCode != null) {
SessionContext sessionContext = view.getSessionContext();
MetadataSchemaTypes types = types();
MetadataSchema schema = types.getSchema(schemaCode);
for (Metadata metadata : schema.getMetadatas().onlyWithType(TEXT, STRING).onlyManuals().onlyNotSystemReserved()
.onlyEnabled()) {
metadataOptions.add(metadataToVOBuilder.build(metadata, sessionContext));
}
}
return metadataOptions;
}
protected List<MetadataVO> getMetadataVOsForRegexes(String schemaCode, MetadataVO excludeMetadataVO) {
List<MetadataVO> metadataOptionsForRegexes = new ArrayList<>();
if (schemaCode != null) {
SessionContext sessionContext = view.getSessionContext();
MetadataSchemaTypes types = types();
MetadataSchema schema = types.getSchema(schemaCode);
for (Metadata metadata : schema.getMetadatas().onlyWithType(TEXT, STRING, CONTENT).onlyManuals()
.onlyNotSystemReserved()
.onlyEnabled()) {
if (excludeMetadataVO.getCode() != metadata.getCode()) {
metadataOptionsForRegexes.add(metadataToVOBuilder.build(metadata, sessionContext));
}
}
}
return metadataOptionsForRegexes;
}
public void afterViewAssembled() {
setMetadataVOsForRegexes(schemaCode, metadataVO);
}
public void setMetadataVOsForRegexes(String schemaCode, MetadataVO metadataVO) {
List<MetadataVO> metadataVOsForRegexes = getMetadataVOsForRegexes(schemaCode, metadataVO);
view.setRegexMetadataOptions(metadataVOsForRegexes);
}
protected MetadataExtractorVO getMetadataExtractorVO() {
return metadataExtractorVO;
}
protected MetadataVO getMetadataVO() {
return metadataVO;
}
}