package com.constellio.app.ui.framework.builders;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from;
import static java.util.Arrays.asList;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import com.constellio.app.services.factories.ConstellioFactories;
import com.constellio.app.ui.entities.AuthorizationVO;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.security.Authorization;
import com.constellio.model.entities.security.Role;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.records.SchemasRecordsServices;
import com.constellio.model.services.search.SearchServices;
import com.constellio.model.services.search.query.logical.LogicalSearchQuery;
import com.constellio.model.services.security.roles.RolesManager;
public class AuthorizationToVOBuilder implements Serializable {
transient ModelLayerFactory modelLayerFactory;
public AuthorizationToVOBuilder(ModelLayerFactory modelLayerFactory) {
this.modelLayerFactory = modelLayerFactory;
}
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException {
stream.defaultReadObject();
init();
}
private void init() {
modelLayerFactory = ConstellioFactories.getInstance().getModelLayerFactory();
}
public AuthorizationVO build(Authorization authorization) {
List<String> principals = authorization.getGrantedToPrincipals();
List<String> records = asList(authorization.getGrantedOnRecord());
List<String> roles = authorization.getDetail().getRoles();
List<String> users = new ArrayList<>();
List<String> groups = new ArrayList<>();
List<String> userRoles = new ArrayList<>();
List<String> userRolesTitles = new ArrayList<>();
List<String> accessRoles = new ArrayList<>();
for (String roleCode : roles) {
RolesManager rolesManager = modelLayerFactory.getRolesManager();
Role role = rolesManager.getRole(authorization.getDetail().getCollection(), roleCode);
if (role.isContentPermissionRole()) {
accessRoles.add(roleCode);
} else {
userRoles.add(roleCode);
userRolesTitles.add(role.getTitle());
}
}
SearchServices searchServices = modelLayerFactory.newSearchServices();
SchemasRecordsServices schemas = new SchemasRecordsServices(authorization.getDetail().getCollection(), modelLayerFactory);
List<Record> allUsers = searchServices.cachedSearch(new LogicalSearchQuery(from(schemas.userSchemaType()).returnAll()));
List<Record> allGroups = searchServices.cachedSearch(new LogicalSearchQuery(from(schemas.groupSchemaType()).returnAll()));
if (principals != null) {
for (Record user : allUsers) {
if (user != null && principals.contains(user.getId())) {
users.add(user.getId());
}
}
for (Record group : allGroups) {
if (group != null && principals.contains(group.getId())) {
groups.add(group.getId());
}
}
}
AuthorizationVO authorizationVO = new AuthorizationVO(users, groups, records, accessRoles, userRoles, userRolesTitles,
authorization.getDetail().getId(), authorization.getDetail().getStartDate(),
authorization.getDetail().getEndDate(), authorization.getDetail().isSynced());
return authorizationVO;
}
}