package com.constellio.app.ui.pages.globalGroup;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.constellio.app.ui.entities.GlobalGroupVO;
import com.constellio.app.ui.framework.builders.GlobalGroupToVOBuilder;
import com.constellio.app.ui.pages.base.BasePresenter;
import com.constellio.app.ui.params.ParamUtils;
import com.constellio.model.entities.CorePermissions;
import com.constellio.model.entities.records.wrappers.Group;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.security.global.GlobalGroup;
import com.constellio.model.services.collections.CollectionsListManager;
import com.constellio.model.services.logging.LoggingServices;
import com.constellio.model.services.users.UserServices;
import com.constellio.model.services.users.UserServicesRuntimeException.UserServicesRuntimeException_NoSuchGroup;
public class AddEditGlobalGroupPresenter extends BasePresenter<AddEditGlobalGroupView> {
private static final Logger LOGGER = LoggerFactory.getLogger(AddEditGlobalGroupPresenter.class);
transient UserServices userServices;
private transient CollectionsListManager collectionsListManager;
private transient LoggingServices loggingServices;
private boolean editMode = false;
private Map<String, String> paramsMap;
private String code;
private String breadCrumb;
private Set<String> collections;
public AddEditGlobalGroupPresenter(AddEditGlobalGroupView view) {
super(view);
init();
}
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException {
stream.defaultReadObject();
init();
}
private void init() {
userServices = modelLayerFactory.newUserServices();
collectionsListManager = modelLayerFactory.getCollectionsListManager();
loggingServices = modelLayerFactory.newLoggingServices();
}
public GlobalGroupVO getGlobalGroupVO(String code) {
GlobalGroup globalGroup = null;
if (StringUtils.isNotBlank(code)) {
editMode = true;
this.code = code;
globalGroup = userServices.getGroup(code);
}
GlobalGroupToVOBuilder voBuilder = new GlobalGroupToVOBuilder();
GlobalGroupVO globalGroupVO = globalGroup != null ? voBuilder.build(globalGroup) : new GlobalGroupVO();
collections = globalGroupVO.getCollections();
return globalGroupVO;
}
public void saveButtonClicked(GlobalGroupVO entity) {
String code = entity.getCode();
if (isEditMode()) {
if (!getCode().equals(code)) {
view.showErrorMessage("Cannot change code");
return;
}
} else {
try {
userServices.getGroup(code);
view.showErrorMessage("Global Group already exists!");
return;
} catch (UserServicesRuntimeException_NoSuchGroup e) {
//Ok
LOGGER.info(e.getMessage(), e);
}
}
GlobalGroup globalGroup = toGlobalGroup(entity);
userServices.addUpdateGlobalGroup(globalGroup);
if (!isEditMode()) {
for (String collection : globalGroup.getUsersAutomaticallyAddedToCollections()) {
Group group = userServices.getGroupInCollection(entity.getCode(), collection);
loggingServices.addUserOrGroup(group.getWrappedRecord(), getCurrentUser(), collection);
}
} else {
for (String collection : globalGroup.getUsersAutomaticallyAddedToCollections()) {
Group group = userServices.getGroupInCollection(entity.getCode(), collection);
if (entity.getCollections().contains(collection) && !collections.contains(collection)) {
loggingServices.addUserOrGroup(group.getWrappedRecord(), getCurrentUser(), collection);
}
}
}
navigateToBackPage();
}
GlobalGroup toGlobalGroup(GlobalGroupVO globalGroupVO) {
List<String> collections = new ArrayList<>();
if (globalGroupVO.getCollections() != null) {
collections.addAll(globalGroupVO.getCollections());
}
GlobalGroup newGlobalGroup = userServices.createGlobalGroup(globalGroupVO.getCode(), globalGroupVO.getName(),
collections, globalGroupVO.getParent(), globalGroupVO.getStatus(), globalGroupVO.isLocallyCreated());
return newGlobalGroup;
}
public void cancelButtonClicked() {
navigateToBackPage();
}
public boolean isEditMode() {
return editMode;
}
public String getCode() {
return code;
}
public List<String> getAllCollections() {
return collectionsListManager.getCollectionsExcludingSystem();
}
public void setParamsMap(Map<String, String> paramsMap) {
this.paramsMap = paramsMap;
}
public void setBreadCrumb(String breadCrumb) {
this.breadCrumb = breadCrumb;
}
public Map<String, String> getParamsMap() {
return paramsMap;
}
private void navigateToBackPage() {
String viewNames[] = breadCrumb.split("/");
String backPage = viewNames[viewNames.length - 1];
breadCrumb = breadCrumb.replace(backPage, "");
if (breadCrumb.endsWith("/")) {
breadCrumb = breadCrumb.substring(0, breadCrumb.length() - 1);
}
if (paramsMap.containsKey("parentGlobalGroupCode")) {
paramsMap.put("globalGroupCode", paramsMap.get("parentGlobalGroupCode"));
paramsMap.remove("parentGlobalGroupCode");
}
Map<String, Object> newParamsMap = new HashMap<>();
newParamsMap.putAll(paramsMap);
String parameters = ParamUtils.addParams(breadCrumb, newParamsMap);
parameters = cleanParameters(parameters);
backPage = correctUrlSlash(backPage, parameters);
view.navigate().to().url(backPage + parameters);
}
private String correctUrlSlash(String backPage, String parameters) {
if (!backPage.endsWith("/") && !parameters.startsWith("/")) {
backPage += "/";
}
return backPage;
}
private String cleanParameters(String parameters) {
while (parameters.contains("//")) {
parameters = parameters.replace("//", "/");
}
return parameters;
}
public boolean canAddOrModify() {
return userServices.canAddOrModifyUserAndGroup();
}
@Override
protected boolean hasPageAccess(String params, User user) {
return userServices.has(user).globalPermissionInAnyCollection(CorePermissions.MANAGE_SYSTEM_GROUPS);
}
}