package com.constellio.model.services.security.roles;
import java.util.List;
import org.jdom2.Document;
import com.constellio.data.dao.managers.StatefulService;
import com.constellio.data.dao.managers.config.ConfigManager;
import com.constellio.data.dao.managers.config.DocumentAlteration;
import com.constellio.model.entities.security.Role;
import com.constellio.model.frameworks.validation.ValidationErrors;
import com.constellio.model.services.collections.CollectionsListManager;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.records.SchemasRecordsServices;
import com.constellio.model.services.security.RoleValidator;
import com.constellio.model.services.security.roles.RolesManagerRuntimeException.RolesManagerRuntimeException_Validation;
import com.constellio.model.utils.OneXMLConfigPerCollectionManager;
import com.constellio.model.utils.OneXMLConfigPerCollectionManagerListener;
import com.constellio.model.utils.XMLConfigReader;
public class RolesManager implements StatefulService, OneXMLConfigPerCollectionManagerListener<List<Role>> {
private static String ROLES_CONFIG = "/roles.xml";
private OneXMLConfigPerCollectionManager<List<Role>> oneXMLConfigPerCollectionManager;
private ConfigManager configManager;
private CollectionsListManager collectionsListManager;
private ModelLayerFactory modelLayerFactory;
public RolesManager(ModelLayerFactory modelLayerFactory) {
this.configManager = modelLayerFactory.getDataLayerFactory().getConfigManager();
this.modelLayerFactory = modelLayerFactory;
this.collectionsListManager = modelLayerFactory.getCollectionsListManager();
}
@Override
public void initialize() {
this.oneXMLConfigPerCollectionManager = new OneXMLConfigPerCollectionManager<>(configManager, collectionsListManager,
ROLES_CONFIG, xmlConfigReader(), this);
}
public void createCollectionRole(String collection) {
DocumentAlteration createConfigAlteration = new DocumentAlteration() {
@Override
public void alter(Document document) {
RolesManagerWriter writer = newRoleWriter(document);
writer.createEmptyRoles();
}
};
oneXMLConfigPerCollectionManager.createCollectionFile(collection, createConfigAlteration);
}
public Role addRole(final Role role) {
validate(role.getCollection(), false, role);
DocumentAlteration alteration = new DocumentAlteration() {
@Override
public void alter(Document document) {
RolesManagerWriter writer = newRoleWriter(document);
writer.addRole(role);
}
};
String collection = role.getCollection();
oneXMLConfigPerCollectionManager.updateXML(collection, alteration);
return role;
}
public void deleteRole(final Role role)
throws RolesManagerRuntimeException {
validate(role.getCollection(), true, role);
DocumentAlteration alteration = new DocumentAlteration() {
@Override
public void alter(Document document) {
RolesManagerWriter writer = newRoleWriter(document);
writer.deleteRole(role);
}
};
String collection = role.getCollection();
oneXMLConfigPerCollectionManager.updateXML(collection, alteration);
}
public void updateRole(final Role role)
throws RolesManagerRuntimeException {
validate(role.getCollection(), true, role.getCode());
DocumentAlteration alteration = new DocumentAlteration() {
@Override
public void alter(Document document) {
RolesManagerWriter writer = newRoleWriter(document);
writer.updateRole(role);
}
};
oneXMLConfigPerCollectionManager.updateXML(role.getCollection(), alteration);
}
public List<Role> getAllRoles(String collection) {
return oneXMLConfigPerCollectionManager.get(collection);
}
public Roles getCollectionRoles(String collection) {
return new Roles(getAllRoles(collection), new SchemasRecordsServices(collection, modelLayerFactory));
}
public Role getRole(String collection, String code)
throws RolesManagerRuntimeException {
// TODO quick fix for roles
if (Role.READ.equals(code)) {
return Role.READ_ROLE;
}
if (Role.WRITE.equals(code)) {
return Role.WRITE_ROLE;
}
if (Role.DELETE.equals(code)) {
return Role.DELETE_ROLE;
}
validate(collection, true, code);
for (Role role : getAllRoles(collection)) {
if (role.getCode().equals(code)) {
return role;
}
}
return null;
}
private void validate(String collection, boolean updateValidation, String code)
throws RolesManagerRuntimeException {
ValidationErrors validationErrors = new ValidationErrors();
new RoleValidator(getAllRoles(collection), true).validate(code, validationErrors);
if (!validationErrors.getValidationErrors().isEmpty()) {
throw new RolesManagerRuntimeException_Validation(validationErrors);
}
}
private void validate(String collection, boolean updateValidation, Role role)
throws RolesManagerRuntimeException_Validation {
ValidationErrors validationErrors = new ValidationErrors();
new RoleValidator(getAllRoles(collection), updateValidation).validate(role, validationErrors);
if (!validationErrors.getValidationErrors().isEmpty()) {
throw new RolesManagerRuntimeException_Validation(validationErrors);
}
}
private RolesManagerWriter newRoleWriter(Document document) {
return new RolesManagerWriter(document);
}
private RolesManagerReader newRoleReader(Document document) {
return new RolesManagerReader(document);
}
private XMLConfigReader<List<Role>> xmlConfigReader() {
return new XMLConfigReader<List<Role>>() {
@Override
public List<Role> read(String collection, Document document) {
return newRoleReader(document).getAllRoles();
}
};
}
public boolean hasPermission(String collection, String roleCode, String operationPermission) {
try {
Role role = getRole(collection, roleCode);
return role.hasOperationPermission(operationPermission);
} catch (RolesManagerRuntimeException rme) {
return false;
}
}
@Override
public void onValueModified(String collection, List<Role> newValue) {
}
@Override
public void close() {
}
}