package com.constellio.app.ui.pages.management.schemas.schema; import static com.constellio.app.ui.i18n.i18n.$; import java.util.Map; import com.constellio.app.entities.schemasDisplay.SchemaTypeDisplayConfig; import com.constellio.app.services.schemasDisplay.SchemasDisplayManager; import org.apache.commons.lang.StringUtils; import com.constellio.app.services.metadata.AppSchemasServices; import com.constellio.app.ui.application.NavigatorConfigurationService; import com.constellio.app.ui.entities.FormMetadataSchemaVO; import com.constellio.app.ui.framework.builders.MetadataSchemaToFormVOBuilder; import com.constellio.app.ui.framework.builders.MetadataToVOBuilder; import com.constellio.app.ui.framework.data.MetadataVODataProvider; import com.constellio.app.ui.pages.base.SessionContext; import com.constellio.app.ui.pages.base.SingleSchemaBasePresenter; import com.constellio.app.ui.params.ParamUtils; import com.constellio.model.entities.CorePermissions; import com.constellio.model.entities.Language; import com.constellio.model.entities.records.wrappers.User; import com.constellio.model.entities.schemas.MetadataSchema; import com.constellio.model.entities.schemas.MetadataSchemaTypes; import com.constellio.model.services.schemas.MetadataSchemasManager; import com.constellio.model.services.schemas.MetadataSchemasManagerException.OptimisticLocking; import com.constellio.model.services.schemas.builders.MetadataSchemaBuilder; import com.constellio.model.services.schemas.builders.MetadataSchemaTypeBuilder; import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder; public class AddEditSchemaPresenter extends SingleSchemaBasePresenter<AddEditSchemaView> { private Map<String, String> parameters; private String initialSchemaCode; private FormMetadataSchemaVO schemaVO; private boolean editMode; public AddEditSchemaPresenter(AddEditSchemaView view) { super(view); } @Override protected boolean hasPageAccess(String params, User user) { return user.has(CorePermissions.MANAGE_METADATASCHEMAS).globally(); } public void setParameters(Map<String, String> params) { this.parameters = params; String schemaCode = params.get("schemaCode"); editMode = StringUtils.isNotBlank(schemaCode); MetadataSchemaTypes types = types(); MetadataSchema schema; SessionContext sessionContext = view.getSessionContext(); String schemaTypeCode = params.get("schemaTypeCode"); if (editMode) { schema = types.getSchema(schemaCode); } else { schema = types.getSchema(schemaTypeCode + "_default"); } initialSchemaCode = schema.getCode(); SchemasDisplayManager metadataSchemasDisplayManager = appLayerFactory.getMetadataSchemasDisplayManager(); SchemaTypeDisplayConfig schemaTypeDisplayConfig = metadataSchemasDisplayManager.getType(collection, schemaTypeCode); FormMetadataSchemaVO schemaVO = new MetadataSchemaToFormVOBuilder().build(schema, sessionContext, schemaTypeDisplayConfig); setSchemaVO(schemaVO); } public MetadataVODataProvider getDataProvider() { String schemaCode = schemaVO.getCode(); return new MetadataVODataProvider(new MetadataToVOBuilder(), modelLayerFactory, collection, schemaCode); } public void saveButtonClicked() { MetadataSchemasManager schemasManager = modelLayerFactory.getMetadataSchemasManager(); MetadataSchemaTypesBuilder types = schemasManager.modify(collection); boolean modifyExistingSchemaCode; String schemaTypeCode = parameters.get("schemaTypeCode"); String code; if (isCodeEditable()) { String localCode = schemaVO.getLocalCode(); if (StringUtils.startsWithAny(localCode,new String[]{"0","1","2","3","4","5","6","7","8","9"})) { code = null; modifyExistingSchemaCode = false; view.showErrorMessage($("AddEditSchemaView.schemaCodeStartsWithNumber")); } else if(StringUtils.contains(localCode," ")) { code = null; modifyExistingSchemaCode = false; view.showErrorMessage($("AddEditSchemaView.schemaCodeContainsSpace")); } else { if (isEditMode()) { code = schemaTypeCode + "_" + localCode; modifyExistingSchemaCode = !code.equals(initialSchemaCode); } else { modifyExistingSchemaCode = false; code = "USR" + localCode; types.getSchemaType(schemaTypeCode).createCustomSchema(code, schemaVO.getLabels()); } } } else { code = schemaVO.getCode(); modifyExistingSchemaCode = false; } if (code != null) { if (editMode){ MetadataSchemaBuilder builder = types.getSchema(initialSchemaCode); Map<Language, String> newLabels = MetadataSchemaTypeBuilder.configureLabels(schemaVO.getLabels()); builder.setLabels(newLabels); } try { schemasManager.saveUpdateSchemaTypes(types); } catch (OptimisticLocking optimistickLocking) { throw new RuntimeException(optimistickLocking); } if (modifyExistingSchemaCode) { AppSchemasServices appSchemasServices = new AppSchemasServices(appLayerFactory); appSchemasServices.modifySchemaCode(collection, initialSchemaCode, code); } String params = ParamUtils.addParams(NavigatorConfigurationService.DISPLAY_SCHEMA, parameters); view.navigate().to().listSchema(params); } if (schemaVO.getAdvancedSearch() != null) { boolean advancedSearch = schemaVO.getAdvancedSearch(); SchemasDisplayManager metadataSchemasDisplayManager = appLayerFactory.getMetadataSchemasDisplayManager(); SchemaTypeDisplayConfig schemaTypeDisplayConfig = metadataSchemasDisplayManager.getType(collection, schemaTypeCode).withAdvancedSearchStatus(advancedSearch); metadataSchemasDisplayManager.saveType(schemaTypeDisplayConfig); } } public void cancelButtonClicked() { String params = ParamUtils.addParams(NavigatorConfigurationService.DISPLAY_SCHEMA, parameters); view.navigate().to().listSchema(params); } public boolean isEditMode() { return editMode; } public boolean isCodeEditable() { String schemaLocalCode = schemaVO.getLocalCode(); return !isEditMode() || !"default".equals(schemaLocalCode); } // Test methods void setSchemaVO(FormMetadataSchemaVO schemaVO) { this.schemaVO = schemaVO; view.setSchemaVO(schemaVO); } }