package com.constellio.app.ui.pages.management.taxonomy;
import com.constellio.app.ui.entities.RecordVO;
import com.constellio.app.ui.entities.RecordVO.VIEW_MODE;
import com.constellio.app.ui.framework.builders.RecordToVOBuilder;
import com.constellio.app.ui.pages.base.SingleSchemaBasePresenter;
import com.constellio.app.ui.util.MessageUtils;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.Transaction;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.Schemas;
import com.vaadin.ui.UI;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.vaadin.dialogs.ConfirmDialog;
import java.io.IOException;
import java.util.List;
import static com.constellio.app.ui.i18n.i18n.$;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.fromAllSchemasIn;
@SuppressWarnings("serial")
public class AddEditTaxonomyConceptPresenter extends SingleSchemaBasePresenter<AddEditTaxonomyConceptView> {
private static final Logger LOGGER = LoggerFactory.getLogger(AddEditTaxonomyConceptPresenter.class);
public static final String EDIT = "EDIT";
public static final String ADD = "ADD";
public static final String STYLE_NAME = "window-button";
public static final String WINDOW_STYLE_NAME = STYLE_NAME + "-window";
public static final String WINDOW_CONTENT_STYLE_NAME = WINDOW_STYLE_NAME + "-content";
private String taxonomyCode;
private String conceptId;
private String operation;
private Record originalRecord;
public AddEditTaxonomyConceptPresenter(AddEditTaxonomyConceptView view) {
super(view);
init();
}
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException {
stream.defaultReadObject();
init();
}
private void init() {
}
public RecordVO getRecordVO() {
Record record;
if (operation.equals(EDIT)) {
record = recordServices().getDocumentById(conceptId);
originalRecord = record;
} else {
record = newRecord();
if (conceptId != null) {
Record parentRecord = recordServices().getDocumentById(conceptId);
for (Metadata metadata : schema().getParentReferences()) {
if (metadata.getAllowedReferences().isAllowed(schema(parentRecord.getSchemaCode()))) {
record.set(metadata, parentRecord.getId());
}
}
}
}
RecordToVOBuilder voBuilder = new RecordToVOBuilder();
return voBuilder.build(record, VIEW_MODE.FORM, view.getSessionContext());
}
public void forElementInTaxonomy(String parameters) {
String schemaCode = getSchemaCode();
String[] splitParams = splitTaxonomyCodeAndElementId(parameters);
operation = splitParams[0];
taxonomyCode = splitParams[1];
schemaCode = splitParams.length < 3 ? null : splitParams[2];
conceptId = splitParams.length < 4 ? null : splitParams[3];
setSchemaCode(schemaCode);
}
String[] splitTaxonomyCodeAndElementId(String parameters) {
if (parameters == null || parameters.equals("")) {
throw new RuntimeException("Replace with a 404 OR Invalid parameters");
} else {
return parameters.split("/", 4);
}
}
public void saveButtonClicked(RecordVO recordVO, boolean isReindexationNeeded) {
try {
Record record = toRecord(recordVO);
recordServices().recalculate(record);
if(isReindexationNeeded) {
recordServices().executeWithoutImpactHandling(new Transaction().update(record));
appLayerFactory.getSystemGlobalConfigsManager().setReindexingRequired(true);
view.navigate().to().taxonomyManagement(taxonomyCode, conceptId);
} else {
addOrUpdateWithoutUser(record);
view.navigate().to().taxonomyManagement(taxonomyCode, conceptId);
}
} catch (Exception e) {
view.showErrorMessage(MessageUtils.toMessage(e));
LOGGER.error(e.getMessage(), e);
}
}
public void cancelButtonClicked(RecordVO recordVO) {
view.navigate().to().taxonomyManagement(taxonomyCode, conceptId);
}
public String getConceptId() {
return conceptId;
}
@Override
protected boolean hasPageAccess(String params, User user) {
forElementInTaxonomy(params);
return new TaxonomyPresentersService(appLayerFactory).canManage(taxonomyCode, user);
}
public void confirmBeforeSave(final RecordVO recordVO) {
Record record = toRecord(recordVO);
recordServices().recalculate(record);
final boolean isReindexationNeeded;
if(operation.equals(EDIT) &&
(record.isModified(Schemas.PATH) || record.isModified(Schemas.CODE) || record.isModified(Schemas.TITLE))) {
Long numberOfRecordsToChange = searchServices().getResultsCount(fromAllSchemasIn(collection).where(Schemas.PATH)
.isStartingWithText(((List<String>) originalRecord.get(Schemas.PATH)).get(0)));
String confirmationMessage;
if(numberOfRecordsToChange < 10000) {
confirmationMessage = $("AddEditTaxonomyConceptPresenter.confirmLowerThan10000");
isReindexationNeeded = false;
} else {
confirmationMessage = $("AddEditTaxonomyConceptPresenter.confirmHigherOrEqualTo10000");
isReindexationNeeded = true;
}
ConfirmDialog.show(
UI.getCurrent(),
$("AddEditTaxonomyConceptPresenter.confirmTitle"),
confirmationMessage,
$("confirm"),
$("cancel"),
new ConfirmDialog.Listener() {
public void onClose(ConfirmDialog dialog) {
if (dialog.isConfirmed()) {
saveButtonClicked(recordVO, isReindexationNeeded);
}
}
});
} else {
isReindexationNeeded = false;
saveButtonClicked(recordVO, isReindexationNeeded);
}
}
}