package com.constellio.app.ui.framework.data; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import com.constellio.app.services.factories.ConstellioFactories; import com.constellio.app.ui.entities.GlobalGroupVO; import com.constellio.app.ui.framework.builders.GlobalGroupToVOBuilder; import com.constellio.model.entities.security.global.GlobalGroup; import com.constellio.model.entities.security.global.GlobalGroupStatus; import com.constellio.model.entities.security.global.UserCredential; import com.constellio.model.services.factories.ModelLayerFactory; import com.constellio.model.services.users.GlobalGroupsManager; import com.constellio.model.services.users.UserServices; @SuppressWarnings("serial") public class GlobalGroupVODataProvider extends AbstractDataProvider { private transient UserServices userServices; private transient GlobalGroupsManager globalGroupsManager; private transient Integer size = null; private transient List<GlobalGroupVO> filteredGlobalGroupVOs; private transient List<GlobalGroupVO> globalGroupVOs; private GlobalGroupToVOBuilder voBuilder; private String filter; private boolean hierarchical; public GlobalGroupVODataProvider(GlobalGroupToVOBuilder voBuilder, ModelLayerFactory modelLayerFactory, boolean hierarchical) { this.voBuilder = voBuilder; this.hierarchical = hierarchical; init(modelLayerFactory); } private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); ConstellioFactories constellioFactories = ConstellioFactories.getInstance(); init(constellioFactories.getModelLayerFactory()); } void init(ModelLayerFactory modelLayerFactory) { globalGroupsManager = modelLayerFactory.getGlobalGroupsManager(); userServices = modelLayerFactory.newUserServices(); loadGlobalGroupsVOs(); } public String getFilter() { return filter; } public void setFilter(String filter) { filteredGlobalGroupVOs = new ArrayList<>(); if (filter != null) { this.filter = filter.toLowerCase(); for (GlobalGroupVO globalGroupVO : globalGroupVOs) { if (globalGroupVO.getCode().toLowerCase().contains(this.filter) || (globalGroupVO.getName() != null && globalGroupVO.getName().toLowerCase().contains(this.filter))) { filteredGlobalGroupVOs.add(globalGroupVO); } } } else { this.filter = null; filteredGlobalGroupVOs.addAll(globalGroupVOs); } } public List<GlobalGroupVO> getGlobalGroupVOs() { return filteredGlobalGroupVOs; } public void setGlobalGroupVOs(List<GlobalGroupVO> globalGroupVOs) { this.globalGroupVOs = globalGroupVOs; setFilter(null); } public GlobalGroupVO getGlobalGroupVO(String code) { GlobalGroupVO globalGroupVO = null; for (GlobalGroupVO newGlobalGroupVO : filteredGlobalGroupVOs) { if (newGlobalGroupVO.getCode().equals(code)) { globalGroupVO = newGlobalGroupVO; } } return globalGroupVO != null ? globalGroupVO : null; } public GlobalGroupVO getGlobalGroupVO(Integer index) { GlobalGroupVO globalGroupVO = filteredGlobalGroupVOs.get(index); return globalGroupVO != null ? globalGroupVO : null; } public int size() { return filteredGlobalGroupVOs.size(); } public List<Integer> list() { List<Integer> indexes = new ArrayList<>(); for (int i = 0; i < filteredGlobalGroupVOs.size(); i++) { GlobalGroupVO globalGroupVO = filteredGlobalGroupVOs.get(i); if (globalGroupVO != null) { indexes.add(i); } } return indexes; } public List<String> listCodes(List<GlobalGroupVO> globalGroupVOs) { List<String> codes = new ArrayList<>(); for (GlobalGroupVO globalGroupVO : globalGroupVOs) { codes.add(globalGroupVO.getCode()); } return codes; } private void loadGlobalGroupsVOs() { List<GlobalGroupVO> newGlobalGroupVOs = new ArrayList<>(); List<GlobalGroup> globalGroups = globalGroupsManager.getAllGroups(); for (GlobalGroup globalGroup : globalGroups) { GlobalGroupVO globalGroupVO = voBuilder.build(globalGroup); newGlobalGroupVOs.add(globalGroupVO); } sort(newGlobalGroupVOs); setGlobalGroupVOs(newGlobalGroupVOs); } public List<GlobalGroupVO> listGlobalGroupVOs() { return filteredGlobalGroupVOs; } public List<GlobalGroupVO> listGlobalGroupVOs(int startIndex, int count) { int toIndex = startIndex + count; List subList = new ArrayList(); if (startIndex > filteredGlobalGroupVOs.size()) { return subList; } else if (toIndex > filteredGlobalGroupVOs.size()) { toIndex = filteredGlobalGroupVOs.size(); } return filteredGlobalGroupVOs.subList(startIndex, toIndex); } public List<GlobalGroupVO> listActiveGlobalGroupVOsFromUser(String username) { List<GlobalGroupVO> newGlobalGroupVOs = new ArrayList<>(); for (GlobalGroupVO globalGroupVO : filteredGlobalGroupVOs) { List<UserCredential> userCredentials = userServices.getGlobalGroupActifUsers(globalGroupVO.getCode()); for (UserCredential userCredential : userCredentials) { if (userCredential.getUsername().equals(username)) { newGlobalGroupVOs.add(globalGroupVO); } } } sort(newGlobalGroupVOs); return newGlobalGroupVOs; } public List<GlobalGroupVO> listGlobalGroupVOsNotContainingUser(String username) { List<GlobalGroupVO> newGlobalGroupVOs = new ArrayList<>(); List<GlobalGroupVO> userGlobalGroupVOs = listActiveGlobalGroupVOsFromUser(username); List<String> userCodes = listCodes(userGlobalGroupVOs); for (GlobalGroupVO globalGroupVO : listGlobalGroupVOs()) { if (!userCodes.contains(globalGroupVO.getCode())) { newGlobalGroupVOs.add(globalGroupVO); } } sort(newGlobalGroupVOs); return newGlobalGroupVOs; } public List<GlobalGroupVO> listGlobalGroupVOsWithUsersInCollection(String collection) { List<GlobalGroupVO> newGlobalGroupVOsInWithUsersInCollection = new ArrayList<>(); for (GlobalGroupVO globalGroupVO : filteredGlobalGroupVOs) { if (globalGroupVO.getCollections().contains(collection)) { newGlobalGroupVOsInWithUsersInCollection.add(globalGroupVO); } } sort(newGlobalGroupVOsInWithUsersInCollection); return newGlobalGroupVOsInWithUsersInCollection; } public List<GlobalGroupVO> listActiveGlobalGroupVOsWithUsersInCollection(String collection) { List<GlobalGroupVO> newGlobalGroupVOsInWithUsersInCollection = new ArrayList<>(); for (GlobalGroupVO globalGroupVO : filteredGlobalGroupVOs) { GlobalGroupStatus status = globalGroupVO.getStatus(); if ((status == null || status == GlobalGroupStatus.ACTIVE) && (globalGroupVO.getCollections().contains(collection))) { newGlobalGroupVOsInWithUsersInCollection.add(globalGroupVO); } } sort(newGlobalGroupVOsInWithUsersInCollection); return newGlobalGroupVOsInWithUsersInCollection; } private void sort(List<GlobalGroupVO> globalGroupVOs) { Collections.sort(globalGroupVOs, new Comparator<GlobalGroupVO>() { @Override public int compare(GlobalGroupVO o1, GlobalGroupVO o2) { return o1.getCode().toLowerCase().compareTo(o2.getCode().toLowerCase()); } }); } public List<GlobalGroupVO> listActiveSubGlobalGroupsVOsFromGroup(String code) { List<GlobalGroupVO> newGlobalGroupVOs = new ArrayList<>(); for (GlobalGroupVO globalGroupVO : filteredGlobalGroupVOs) { if (globalGroupVO.getParent() != null && globalGroupVO.getParent().equals(code) && globalGroupVO.getStatus() == GlobalGroupStatus.ACTIVE) { newGlobalGroupVOs.add(globalGroupVO); } } sort(newGlobalGroupVOs); return newGlobalGroupVOs; } public List<GlobalGroupVO> listBaseGlobalGroupsVOs() { List<GlobalGroupVO> newGlobalGroupVOs = new ArrayList<>(); for (GlobalGroupVO globalGroupVO : filteredGlobalGroupVOs) { if (!hierarchical || globalGroupVO.getParent() == null) { newGlobalGroupVOs.add(globalGroupVO); } } sort(newGlobalGroupVOs); return newGlobalGroupVOs; } public List<GlobalGroupVO> listBaseGlobalGroupsVOsWithStatus(GlobalGroupStatus status) { List<GlobalGroupVO> globalGroupVOsWithStatus = new ArrayList<>(); for (GlobalGroupVO globalGroupVO : listBaseGlobalGroupsVOs()) { if (status == globalGroupVO.getStatus()) { globalGroupVOsWithStatus.add(globalGroupVO); } } return globalGroupVOsWithStatus; } }