package com.constellio.app.modules.rm.ui.components.tree;
import static com.constellio.app.ui.i18n.i18n.$;
import java.io.Serializable;
import java.util.List;
import org.apache.log4j.Logger;
import com.constellio.app.modules.rm.services.RMSchemasRecordsServices;
import com.constellio.app.modules.rm.services.decommissioning.DecommissioningService;
import com.constellio.app.modules.rm.wrappers.AdministrativeUnit;
import com.constellio.app.modules.rm.wrappers.Category;
import com.constellio.app.modules.rm.wrappers.Document;
import com.constellio.app.modules.rm.wrappers.Folder;
import com.constellio.app.services.factories.AppLayerFactory;
import com.constellio.app.services.factories.ConstellioFactories;
import com.constellio.app.ui.entities.UserVO;
import com.constellio.app.ui.pages.base.SessionContext;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.records.RecordServicesException;
import com.constellio.model.services.schemas.SchemaUtils;
import com.constellio.model.services.search.StatusFilter;
import com.constellio.model.services.users.UserServices;
public class RMTreeDropPresenter implements Serializable {
private static final Logger LOGGER = Logger.getLogger(RMTreeDropPresenter.class);
private RMTreeDropHander dropHandler;
public RMTreeDropPresenter(RMTreeDropHander dropHandler) {
this.dropHandler = dropHandler;
}
String recordDropped(String sourceRecordId, String targetRecordId) {
String newParentId;
SessionContext sessionContext = dropHandler.getSessionContext();
String collection = sessionContext.getCurrentCollection();
ConstellioFactories constellioFactories = dropHandler.getConstellioFactories();
AppLayerFactory appLayerFactory = constellioFactories.getAppLayerFactory();
ModelLayerFactory modelLayerFactory = constellioFactories.getModelLayerFactory();
RecordServices recordServices = modelLayerFactory.newRecordServices();
UserServices userServices = modelLayerFactory.newUserServices();
RMSchemasRecordsServices rm = new RMSchemasRecordsServices(collection, appLayerFactory);
DecommissioningService decommissioningService = new DecommissioningService(collection, appLayerFactory);
Record sourceRecord = rm.get(sourceRecordId);
Record targetRecord = rm.get(targetRecordId);
SchemaUtils schemaUtils = new SchemaUtils();
String sourceSchemaTypeCode = schemaUtils.getSchemaTypeCode(sourceRecord.getSchemaCode());
String targetSchemaTypeCode = schemaUtils.getSchemaTypeCode(targetRecord.getSchemaCode());
UserVO userVO = sessionContext.getCurrentUser();
User user = userServices.getUserInCollection(userVO.getUsername(), collection);
if (Folder.SCHEMA_TYPE.equals(sourceSchemaTypeCode)) {
Folder sourceFolder = rm.wrapFolder(sourceRecord);
if (Folder.SCHEMA_TYPE.equals(targetSchemaTypeCode)) {
Folder targetFolder = rm.wrapFolder(targetRecord);
sourceFolder.setParentFolder(targetFolder);
try {
recordServices.update(sourceFolder, user);
newParentId = targetRecordId;
} catch (RecordServicesException e) {
dropHandler.showErrorMessage(e.getMessage());
LOGGER.error("Error while dropping folder on folder", e);
newParentId = null;
}
} else if (Category.SCHEMA_TYPE.equals(targetSchemaTypeCode)) {
Category category = rm.wrapCategory(targetRecord);
String categoryId = category.getId();
List<String> retentionRules = decommissioningService.getRetentionRulesForCategory(
categoryId, null, StatusFilter.ACTIVES);
if (retentionRules.isEmpty()) {
dropHandler.showErrorMessage($("RMTreeDropHandler.noRetentionRulesForCategory"));
newParentId = null;
} else if (retentionRules.size() > 1 && !retentionRules.contains(sourceFolder.getRetentionRule())) {
dropHandler.showErrorMessage($("RMTreeDropHandler.moreThanOneRetentionRuleForCategory"));
newParentId = null;
} else {
String retentionRule = retentionRules.get(0);
sourceFolder.setCategoryEntered(category);
sourceFolder.setRetentionRuleEntered(retentionRule);
if (decommissioningService.isCopyStatusInputPossible(sourceFolder, user) && sourceFolder.getCopyStatusEntered() == null) {
dropHandler.showErrorMessage($("RMTreeDropHandler.copyStatusInputRequired"));
newParentId = null;
} else {
try {
recordServices.update(sourceFolder, user);
newParentId = targetRecordId;
} catch (RecordServicesException e) {
dropHandler.showErrorMessage(e.getMessage());
LOGGER.error("Error while dropping folder on category", e);
newParentId = null;
}
}
}
} else if (AdministrativeUnit.SCHEMA_TYPE.equals(targetSchemaTypeCode)) {
AdministrativeUnit targetAdministrativeUnit = rm.wrapAdministrativeUnit(targetRecord);
sourceFolder.setAdministrativeUnitEntered(targetAdministrativeUnit);
if (decommissioningService.isCopyStatusInputPossible(sourceFolder, user) && sourceFolder.getCopyStatusEntered() == null) {
dropHandler.showErrorMessage($("RMTreeDropHandler.copyStatusInputRequired"));
newParentId = null;
} else {
try {
recordServices.update(sourceFolder, user);
newParentId = targetRecordId;
} catch (RecordServicesException e) {
dropHandler.showErrorMessage(e.getMessage());
LOGGER.error("Error while dropping folder on administrative unit", e);
newParentId = null;
}
}
} else {
newParentId = null;
}
} else if (Document.SCHEMA_TYPE.equals(sourceSchemaTypeCode) && Folder.SCHEMA_TYPE.equals(targetSchemaTypeCode)) {
Document sourceDocument = rm.wrapDocument(sourceRecord);
Folder targetFolder = rm.wrapFolder(targetRecord);
sourceDocument.setFolder(targetFolder);
try {
recordServices.update(sourceDocument, user);
newParentId = targetRecordId;
} catch (RecordServicesException e) {
dropHandler.showErrorMessage(e.getMessage());
LOGGER.error("Error while dropping document on folder", e);
newParentId = null;
}
} else if (Document.SCHEMA_TYPE.equals(sourceSchemaTypeCode) && Document.SCHEMA_TYPE.equals(targetSchemaTypeCode)) {
Document sourceDocument = rm.wrapDocument(sourceRecord);
Document targetDocument = rm.wrapDocument(targetRecord);
Folder targetFolder = rm.getFolder(targetDocument.getFolder());
sourceDocument.setFolder(targetFolder);
try {
recordServices.update(sourceDocument, user);
newParentId = targetFolder.getId();
} catch (RecordServicesException e) {
dropHandler.showErrorMessage(e.getMessage());
LOGGER.error("Error while dropping document on document", e);
newParentId = null;
}
} else {
newParentId = null;
}
return newParentId;
}
}