All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.ow2.bonita.facade.impl.ManagementAPIImpl Maven / Gradle / Ivy

/**
 * Copyright (C) 2007  Bull S. A. S.
 * Bull, Rue Jean Jaures, B.P.68, 78340, Les Clayes-sous-Bois
 * This library is free software; you can redistribute it and/or modify it under the terms
 * of the GNU Lesser General Public License as published by the Free Software Foundation
 * version 2.1 of the License.
 * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Lesser General Public License for more details.
 * You should have received a copy of the GNU Lesser General Public License along with this
 * program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
 * Floor, Boston, MA  02110-1301, USA.
 * 
 * Modified by Matthieu Chaffotte, Anthony Birembaut, Nicolas Chabanoles, Elias Ricken de Medeiros - BonitaSoft S.A.
 **/
package org.ow2.bonita.facade.impl;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.ow2.bonita.deployment.Deployer;
import org.ow2.bonita.deployment.DeploymentRuntimeException;
import org.ow2.bonita.facade.IdentityAPI;
import org.ow2.bonita.facade.ManagementAPI;
import org.ow2.bonita.facade.def.InternalProcessDefinition;
import org.ow2.bonita.facade.def.element.BusinessArchive;
import org.ow2.bonita.facade.def.majorElement.ProcessDefinition;
import org.ow2.bonita.facade.def.majorElement.ProcessDefinition.ProcessState;
import org.ow2.bonita.facade.exception.DeploymentException;
import org.ow2.bonita.facade.exception.InstanceNotFoundException;
import org.ow2.bonita.facade.exception.PrivilegeNotFoundException;
import org.ow2.bonita.facade.exception.ProcessNotFoundException;
import org.ow2.bonita.facade.exception.RuleAlreadyExistsException;
import org.ow2.bonita.facade.exception.RuleNotFoundException;
import org.ow2.bonita.facade.exception.UndeletableInstanceException;
import org.ow2.bonita.facade.exception.UndeletableProcessException;
import org.ow2.bonita.facade.exception.UserNotFoundException;
import org.ow2.bonita.facade.identity.Group;
import org.ow2.bonita.facade.identity.impl.GroupImpl;
import org.ow2.bonita.facade.identity.impl.MembershipImpl;
import org.ow2.bonita.facade.identity.impl.RoleImpl;
import org.ow2.bonita.facade.identity.impl.UserImpl;
import org.ow2.bonita.facade.privilege.PrivilegePolicy;
import org.ow2.bonita.facade.privilege.Rule;
import org.ow2.bonita.facade.privilege.Rule.RuleType;
import org.ow2.bonita.facade.privilege.RuleTypePolicy;
import org.ow2.bonita.facade.privilege.impl.ActivityRuleImpl;
import org.ow2.bonita.facade.privilege.impl.CategoryRuleImpl;
import org.ow2.bonita.facade.privilege.impl.CustomRuleImpl;
import org.ow2.bonita.facade.privilege.impl.ProcessRuleImpl;
import org.ow2.bonita.facade.privilege.impl.RuleImpl;
import org.ow2.bonita.facade.privilege.impl.RuleTypePolicyImpl;
import org.ow2.bonita.facade.privilege.impl.SimpleRuleImpl;
import org.ow2.bonita.facade.runtime.InstanceState;
import org.ow2.bonita.facade.runtime.impl.InternalProcessInstance;
import org.ow2.bonita.facade.uuid.AbstractUUID;
import org.ow2.bonita.facade.uuid.ActivityDefinitionUUID;
import org.ow2.bonita.facade.uuid.CategoryUUID;
import org.ow2.bonita.facade.uuid.ProcessDefinitionUUID;
import org.ow2.bonita.facade.uuid.ProcessInstanceUUID;
import org.ow2.bonita.facade.uuid.RuleExceptionUUID;
import org.ow2.bonita.services.Archiver;
import org.ow2.bonita.services.AuthenticationService;
import org.ow2.bonita.services.IdentityService;
import org.ow2.bonita.services.LargeDataRepository;
import org.ow2.bonita.services.PrivilegeService;
import org.ow2.bonita.services.Querier;
import org.ow2.bonita.services.Recorder;
import org.ow2.bonita.util.BonitaException;
import org.ow2.bonita.util.BonitaRuntimeException;
import org.ow2.bonita.util.EnvTool;
import org.ow2.bonita.util.ExceptionManager;
import org.ow2.bonita.util.Misc;

/**
 * @author Marc Blachon, Guillaume Porcher, Charles Souillard, Miguel Valdes, Pierre Vigneras, Rodrigue Le Gall
 */
public class ManagementAPIImpl implements ManagementAPI {

  private static final String DEFAULT_USERS_CREATED = "DEFAULT_USERS_CREATED";

  private final String queryList;

  protected ManagementAPIImpl(final String queryList) {
    this.queryList = queryList;
  }

  private String getQueryList() {
    return this.queryList;
  }

  @Override
  public ProcessDefinition deploy(final BusinessArchive businessArchive) throws DeploymentException {
    FacadeUtil.checkArgsNotNull(businessArchive);
    try {
      return Deployer.deploy(businessArchive);
    } catch (final Exception e) {
      throw new DeploymentException(e.getMessage(), e);
    }
  }

  @Override
  public void deployJar(final String jarName, final byte[] jar) throws DeploymentException {
    FacadeUtil.checkArgsNotNull(jarName, jar);
    if (!jarName.endsWith(".jar")) {
      throw new DeploymentException("Invalid jar name: " + jarName + ". A jar file name must ends with .jar extension.");
    }
    final LargeDataRepository ldr = EnvTool.getLargeDataRepository();
    if (ldr.getData(byte[].class, Misc.getGlobalClassDataCategories(), jarName) != null) {
      throw new DeploymentException("A jar with name: " + jarName + " already exists in repository.");
    }
    ldr.storeData(Misc.getGlobalClassDataCategories(), jarName, jar, true);
    EnvTool.getClassDataLoader().resetCommonClassloader();
  }

  @Override
  public void removeJar(final String jarName) throws DeploymentException {
    FacadeUtil.checkArgsNotNull(jarName);
    if (!jarName.endsWith(".jar")) {
      throw new DeploymentException("Invalid jar name: " + jarName + ". A jar file name must ends with .jar extension.");
    }
    final LargeDataRepository ldr = EnvTool.getLargeDataRepository();
    final boolean found = ldr.deleteData(Misc.getGlobalClassDataCategories(), jarName);
    if (!found) {
      final String message = ExceptionManager.getInstance().getFullMessage("bai_MAPII_6");
      throw new DeploymentException(message, jarName);
    }
    EnvTool.getClassDataLoader().resetCommonClassloader();
  }

  @Override
  public Set getAvailableJars() {
    final LargeDataRepository ldr = EnvTool.getLargeDataRepository();
    return ldr.getKeys(Misc.getGlobalClassDataCategories());
  }

  @Override
  public void delete(final Collection processUUIDs) throws ProcessNotFoundException,
      UndeletableProcessException, UndeletableInstanceException {
    FacadeUtil.checkArgsNotNull(processUUIDs);
    for (final ProcessDefinitionUUID processUUID : processUUIDs) {
      deleteProcess(processUUID);
    }
  }

  @Override
  public void deleteProcess(final ProcessDefinitionUUID processUUID) throws ProcessNotFoundException,
      UndeletableProcessException, UndeletableInstanceException {
    FacadeUtil.checkArgsNotNull(processUUID);
    deleteProcess(true, processUUID);
  }

  private void deleteProcess(final boolean deleteAll, final ProcessDefinitionUUID processUUID)
      throws ProcessNotFoundException, UndeletableProcessException, UndeletableInstanceException {
    FacadeUtil.checkArgsNotNull(processUUID);
    final boolean access = EnvTool.isRestrictedApplicationAcces();
    if (access) {
      try {
        final Set itemsToRemove = new HashSet();
        itemsToRemove.add(processUUID);
        removeProcessDefinitionUUIDFromAllRules(itemsToRemove, RuleType.PROCESS_READ, RuleType.PROCESS_START);
      } catch (final Exception e) {
        throw new ProcessNotFoundException("Unknown process", processUUID);
      }
    }

    final Querier journal = EnvTool.getJournalQueriers();
    final Querier history = EnvTool.getHistoryQueriers();

    InternalProcessDefinition processDef = journal.getProcess(processUUID);
    final boolean inJournal = processDef != null;
    if (processDef == null) {
      processDef = history.getProcess(processUUID);
    } else {
      processDef.setState(ProcessState.DISABLED);
    }

    if (processDef == null) {
      throw new ProcessNotFoundException("bai_MAPII_9", processUUID);
    }

    Deployer.removeStartEvents(processDef);
    if (deleteAll) {
      final RuntimeAPIImpl runtimeAPI = new RuntimeAPIImpl(getQueryList());
      try {
        runtimeAPI.deleteAllProcessInstances(processUUID);
      } catch (final ProcessNotFoundException e) {
        throw new BonitaRuntimeException(e);
      }
    }

    if (inJournal) {
      final Set instances = EnvTool.getJournalQueriers().getProcessInstances(processUUID,
          InstanceState.STARTED);
      if (!instances.isEmpty()) {
        final ProcessInstanceUUID instanceUUID = instances.iterator().next().getUUID();
        throw new UndeletableProcessException("bai_MAPII_10", processUUID, instanceUUID);
      }
      removeProcessDependencies(processDef);
      final Recorder recorder = EnvTool.getRecorder();
      recorder.remove(processDef);
    }

    if (!inJournal) {
      final Archiver archiver = EnvTool.getArchiver();
      archiver.remove(processDef);
    }
    EnvTool.getClassDataLoader().removeProcessClassLoader(processDef.getUUID());
    EnvTool.getUUIDService().archiveOrDeleteProcess(processUUID);
    final LargeDataRepository ldr = EnvTool.getLargeDataRepository();
    ldr.deleteData(Misc.getBusinessArchiveCategories(processUUID));
    ldr.deleteData(Misc.getAttachmentCategories(processUUID));
  }

  private void removeProcessDefinitionUUIDFromAllRules(final Set itemsToRemove,
      final RuleType... ruleTypes) throws RuleNotFoundException, PrivilegeNotFoundException {
    FacadeUtil.checkArgsNotNull(itemsToRemove, ruleTypes);
    final PrivilegeService privilegeService = EnvTool.getPrivilegeService();
    final Set rules = privilegeService.getRulesByType(ruleTypes);
    for (final Rule rule : rules) {
      removeExceptionsFromRuleByUUID(rule.getUUID(), itemsToRemove);
    }
  }

  private void removeProcessDependencies(final ProcessDefinition processDef) {
    final Set instances = EnvTool.getJournalQueriers().getProcessInstances(
        processDef.getUUID(), InstanceState.STARTED);
    Deployer.removeStartEvents(processDef);
    if (instances != null && !instances.isEmpty()) {
      final String message = ExceptionManager.getInstance().getFullMessage("bd_D_9");
      throw new DeploymentRuntimeException(message);
    }
    EnvTool.getClassDataLoader().removeProcessClassLoader(processDef.getUUID());
  }

  @Override
  public void deleteAllProcesses() throws UndeletableInstanceException, UndeletableProcessException {
    final Querier querier = EnvTool.getAllQueriers();
    Set processes = new HashSet();
    Collection parentInstances = new HashSet();
    final boolean access = EnvTool.isRestrictedApplicationAcces();
    if (access) {
      final String applicationName = EnvTool.getApplicationAccessName();
      if (applicationName != null) {
        final Set readyToRemove = FacadeUtil.getAllowedProcessUUIDsFor(applicationName,
            RuleType.PROCESS_READ);
        if (!readyToRemove.isEmpty()) {
          processes = querier.getProcesses(readyToRemove);
          parentInstances = querier.getProcessInstances(readyToRemove);
        }
      }

    } else {
      parentInstances = querier.getParentInstances();
      processes = querier.getProcesses();
    }
    final RuntimeAPIImpl runtimeAPI = new RuntimeAPIImpl(getQueryList());
    for (final InternalProcessInstance internalProcessInstance : parentInstances) {
      try {
        runtimeAPI.deleteProcessInstance(internalProcessInstance.getUUID());
      } catch (final InstanceNotFoundException e) {
        throw new BonitaRuntimeException("Unable to delete process instance: " + internalProcessInstance.getUUID());
      }
    }

    for (final InternalProcessDefinition process : processes) {
      try {
        deleteProcess(false, process.getUUID());
      } catch (final ProcessNotFoundException e) {
        throw new BonitaRuntimeException("Unable to delete process: " + process.getUUID());
      }
    }
  }

  @Override
  public String getLoggedUser() {
    return EnvTool.getUserId();
  }

  @Override
  public void addMetaData(final String key, final String value) {
    EnvTool.getJournal().storeMetaData(key, value);
  }

  @Override
  public void deleteMetaData(final String key) {
    EnvTool.getJournal().deleteMetaData(key);
  }

  @Override
  public String getMetaData(final String key) {
    return EnvTool.getJournal().getMetaData(key);
  }

  @Override
  public void archive(final ProcessDefinitionUUID processUUID) throws DeploymentException {
    FacadeUtil.checkArgsNotNull(processUUID);
    try {
      Deployer.archiveProcess(processUUID, EnvTool.getUserId());
    } catch (final DeploymentRuntimeException e) {
      throw new DeploymentException(e.getMessage(), e);
    }
  }

  @Override
  public void archive(final Collection processUUIDs) throws DeploymentException {
    FacadeUtil.checkArgsNotNull(processUUIDs);
    for (final ProcessDefinitionUUID processUUID : processUUIDs) {
      try {
        Deployer.archiveProcess(processUUID, EnvTool.getUserId());
      } catch (final DeploymentRuntimeException e) {
        throw new DeploymentException(e.getMessage(), e);
      }
    }
  }

  @Override
  public void disable(final ProcessDefinitionUUID processUUID) throws DeploymentException {
    FacadeUtil.checkArgsNotNull(processUUID);
    try {
      Deployer.disableProcess(processUUID);
    } catch (final DeploymentRuntimeException e) {
      throw new DeploymentException(e.getMessage(), e);
    }
  }

  @Override
  public void disable(final Collection processUUIDs) throws DeploymentException {
    FacadeUtil.checkArgsNotNull(processUUIDs);
    for (final ProcessDefinitionUUID processUUID : processUUIDs) {
      try {
        Deployer.disableProcess(processUUID);
      } catch (final DeploymentRuntimeException e) {
        throw new DeploymentException(e.getMessage(), e, processUUID);
      }
    }
  }

  @Override
  public void enable(final ProcessDefinitionUUID processUUID) throws DeploymentException {
    FacadeUtil.checkArgsNotNull(processUUID);
    try {
      Deployer.enableProcess(processUUID);
    } catch (final DeploymentRuntimeException e) {
      throw new DeploymentException(e.getMessage(), e);
    }
  }

  @Override
  public void enable(final Collection processUUIDs) throws DeploymentException {
    FacadeUtil.checkArgsNotNull(processUUIDs);
    for (final ProcessDefinitionUUID processUUID : processUUIDs) {
      enable(processUUID);
    }
  }

  @Override
  public boolean isUserAdmin(final String username) throws UserNotFoundException {
    final AuthenticationService adminService = EnvTool.getAuthenticationService();
    return adminService.isUserAdmin(username);
  }

  @Override
  public boolean checkUserCredentials(final String username, final String password) {
    createDefaultUsers();
    return checkUserCredentials(username, password, false);
  }

  private boolean checkUserCredentials(final String username, final String password, final boolean isPasswordHash) {
    boolean allowed = false;
    final AuthenticationService authenticationService = EnvTool.getAuthenticationService();
    if (!isPasswordHash) {
      allowed = authenticationService.checkUserCredentials(username, password);
    } else {
      allowed = authenticationService.checkUserCredentialsWithPasswordHash(username, password);
    }
    return allowed;
  }

  private void createDefaultUsers() {
    final String defaultUsersCreated = EnvTool.getJournal().getMetaData(DEFAULT_USERS_CREATED);
    if (defaultUsersCreated == null) {
      final IdentityService identityService = EnvTool.getIdentityService();
      final RoleImpl memberRole = createDefaultRole(identityService, IdentityAPI.USER_ROLE_NAME,
          IdentityAPI.USER_ROLE_LABEL, IdentityAPI.USER_ROLE_DESCRIPTION);
      final RoleImpl adminRole = createDefaultRole(identityService, IdentityAPI.ADMIN_ROLE_NAME,
          IdentityAPI.ADMIN_ROLE_LABEL, IdentityAPI.ADMIN_ROLE_DESCRIPTION);

      final GroupImpl defaultGroup = createDefaultGroup(identityService, IdentityAPI.DEFAULT_GROUP_NAME,
          IdentityAPI.DEFAULT_GROUP_LABEL, IdentityAPI.DEFAULT_GROUP_DESCRIPTION, null);

      final MembershipImpl memberMembership = createDefaultMembership(identityService, defaultGroup, memberRole);
      final MembershipImpl adminMembership = createDefaultMembership(identityService, defaultGroup, adminRole);

      final UserImpl adminUser = addDefaultUser(identityService, "admin", null, null, "bpm", null, null);
      identityService.addMembershipToUser(adminUser, adminMembership);
      final UserImpl user1 = addDefaultUser(identityService, "john", "John", "Doe", "bpm", null, null);
      identityService.addMembershipToUser(user1, memberMembership);
      final UserImpl user2 = addDefaultUser(identityService, "jack", "Jack", "Doe", "bpm", user1.getUUID(),
          user1.getUUID());
      identityService.addMembershipToUser(user2, memberMembership);
      final UserImpl user3 = addDefaultUser(identityService, "james", "James", "Doe", "bpm", user1.getUUID(),
          user2.getUUID());
      identityService.addMembershipToUser(user3, memberMembership);

      EnvTool.getJournal().storeMetaData(DEFAULT_USERS_CREATED, "true");
    }
  }

  @Override
  public boolean checkUserCredentialsWithPasswordHash(final String username, final String passwordHash) {
    createDefaultUsers();
    return checkUserCredentials(username, passwordHash, true);
  }

  private MembershipImpl createDefaultMembership(final IdentityService identityService, final GroupImpl group,
      final RoleImpl role) {
    MembershipImpl membership = identityService.findMembershipByRoleAndGroup(role.getUUID(), group.getUUID());
    if (membership == null) {
      membership = new MembershipImpl();
      membership.setGroup(group);
      membership.setRole(role);
      identityService.addMembership(membership);
    }
    return membership;
  }

  private RoleImpl createDefaultRole(final IdentityService identityService, final String name, final String label,
      final String description) {
    RoleImpl role = identityService.findRoleByName(name);
    if (role == null) {
      role = new RoleImpl(name);
      role.setLabel(label);
      role.setDescription(description);
      identityService.addRole(role);
    }
    return role;
  }

  private GroupImpl createDefaultGroup(final IdentityService identityService, final String name, final String label,
      final String description, final Group parentGroup) {
    final Set groups = identityService.findGroupsByName(name);
    GroupImpl group = null;
    if (groups == null || groups.isEmpty()) {
      group = new GroupImpl(name);
      group.setLabel(label);
      group.setDescription(description);
      group.setParentGroup(parentGroup);
      identityService.addGroup(group);
    } else {
      group = groups.iterator().next();
    }
    return group;
  }

  private UserImpl addDefaultUser(final IdentityService identityService, final String username, final String firstName,
      final String lastName, final String password, final String manager, final String delegee) {
    UserImpl user = identityService.findUserByUsername(username);
    if (user == null) {
      user = new UserImpl(username, password);
      user.setFirstName(firstName);
      user.setLastName(lastName);
      user.setManagerUUID(manager);
      user.setDelegeeUUID(delegee);
      identityService.addUser(user);
    }
    return user;
  }

  public void grantAccessAuthorisation(final String applicationName, final ProcessDefinitionUUID definitionUUID) {
    FacadeUtil.checkArgsNotNull(applicationName, definitionUUID);

    final PrivilegeService privilegeService = EnvTool.getPrivilegeService();
    RuleImpl rule = (RuleImpl) privilegeService.findRuleByName(applicationName);

    try {
      final HashSet processes = new HashSet();
      processes.add(definitionUUID);
      if (rule != null) {
        addExceptionsToRuleByUUID(rule.getUUID(), processes);
      } else {
        rule = (RuleImpl) createRule(applicationName, applicationName, applicationName, RuleType.PROCESS_READ);
        addExceptionsToRuleByUUID(rule.getUUID(), processes);
      }
    } catch (final BonitaException e) {
      e.printStackTrace();
      throw new RuntimeException(e);
    }
  }

  public void grantAccessAuthorisation(final String applicationName, final Set definitionUUIDs) {
    FacadeUtil.checkArgsNotNull(applicationName, definitionUUIDs);
    for (final ProcessDefinitionUUID definitionUUID : definitionUUIDs) {
      grantAccessAuthorisation(applicationName, definitionUUID);
    }
  }

  @Override
  public Rule createRule(final String name, final String label, final String description, final RuleType type)
      throws RuleAlreadyExistsException {
    FacadeUtil.checkArgsNotNull(name, type);

    final PrivilegeService privilegeService = EnvTool.getPrivilegeService();
    Rule rule = privilegeService.findRuleByName(name);
    if (rule != null) {
      throw new RuleAlreadyExistsException("bai_MAPII_13", name);
    }
    switch (type) {
    case PROCESS_START:
    case PROCESS_READ:
    case PROCESS_ADD_COMMENT:
    case PROCESS_INSTANTIATION_DETAILS_VIEW:
    case PROCESS_MANAGE:
    case PROCESS_PDF_EXPORT:
      rule = new ProcessRuleImpl(name, label, description, type, null);
      privilegeService.addRule(rule);
      break;
    case ACTIVITY_READ:
    case ACTIVITY_DETAILS_READ:
    case ASSIGN_TO_ME_STEP:
    case ASSIGN_TO_STEP:
    case UNASSIGN_STEP:
    case CHANGE_PRIORITY_STEP:
    case RESUME_STEP:
    case SUSPEND_STEP:
    case SKIP_STEP:
      rule = new ActivityRuleImpl(name, label, description, type, null);
      privilegeService.addRule(rule);
      break;
    case CATEGORY_READ:
      rule = new CategoryRuleImpl(name, label, description, type, null);
      privilegeService.addRule(rule);
      break;
    case REPORT_MANAGE:
    case REPORT_VIEW:
      rule = new CustomRuleImpl(name, label, description, type, null);
      privilegeService.addRule(rule);
      break;
    case LOGOUT:
    case PASSWORD_UPDATE:
    case DELEGEE_UPDATE:
    case PROCESS_INSTALL:
    case REPORT_INSTALL:
      rule = new SimpleRuleImpl(name, label, description, type);
      privilegeService.addRule(rule);
      break;
    default:
      throw new IllegalArgumentException("ManagementAPI.createRule(): RuleType not yet supported: " + type.name());
    }
    return rule;
  }

  private List buildRulesResultList(final List rules) {
    final List rulesResult = new ArrayList();
    for (final Rule rule : rules) {
      rulesResult.add(RuleImpl.createRule(rule));
    }
    return rulesResult;
  }

  @Override
  public List getRules(final RuleType ruleType, final int fromIndex, final int pageSige) {
    final PrivilegeService privilegeService = EnvTool.getPrivilegeService();
    final List rules = privilegeService.getRules(ruleType, fromIndex, pageSige);
    if (rules == null || rules.isEmpty()) {
      return Collections.emptyList();
    }
    return buildRulesResultList(rules);
  }

  @Override
  public long getNumberOfRules(final RuleType ruleType) {
    final PrivilegeService privilegeService = EnvTool.getPrivilegeService();
    return privilegeService.getNumberOfRules(ruleType);
  }

  @Override
  public PrivilegePolicy getRuleTypePolicy(final RuleType ruleType) {
    final PrivilegeService privilegeService = EnvTool.getPrivilegeService();
    final RuleTypePolicy ruleTypePolicy = privilegeService.getRuleTypePolicy(ruleType);
    return ruleTypePolicy.getPolicy();
  }

  @Override
  public void setRuleTypePolicy(final RuleType ruleType, final PrivilegePolicy newPolicy) {
    final PrivilegeService privilegeService = EnvTool.getPrivilegeService();
    final RuleTypePolicyImpl ruleTypePolicy = (RuleTypePolicyImpl) privilegeService.getRuleTypePolicy(ruleType);
    if (newPolicy != ruleTypePolicy.getPolicy()) {
      ruleTypePolicy.setPolicy(newPolicy);
      privilegeService.updateRuleTypePolicy(ruleTypePolicy);
    }
  }

  @Override
  @SuppressWarnings("unchecked")
  public  void addExceptionsToRuleByUUID(final String ruleUUID, final Set exceptions)
      throws RuleNotFoundException {
    FacadeUtil.checkArgsNotNull(ruleUUID, exceptions);
    if (exceptions.size() > 0) {
      final PrivilegeService privilegeService = EnvTool.getPrivilegeService();
      final RuleImpl rule = (RuleImpl) privilegeService.getRule(ruleUUID);
      if (rule == null) {
        throw new RuleNotFoundException("bai_MAPII_12", ruleUUID);
      }
      if (rule instanceof ProcessRuleImpl) {
        ((ProcessRuleImpl) rule).addProcesses((Set) exceptions);
      } else if (rule instanceof CategoryRuleImpl) {
        ((CategoryRuleImpl) rule).addCategories((Set) exceptions);
      } else if (rule instanceof CustomRuleImpl) {
        ((CustomRuleImpl) rule).addCustomExceptions((Set) exceptions);
      } else if (rule instanceof ActivityRuleImpl) {
        ((ActivityRuleImpl) rule).addActivities((Set) exceptions);
      } else {
        throw new IllegalArgumentException("Un-managed rule type: " + rule.getType());
      }
      privilegeService.updateRule(rule);
    }
  }

  @Override
  public void applyRuleToEntities(final String ruleUUID, final Collection userUUIDs,
      final Collection roleUUIDs, final Collection groupUUIDs,
      final Collection membershipUUIDs, final Collection entityIDs) throws RuleNotFoundException {
    FacadeUtil.checkArgsNotNull(ruleUUID);
    final PrivilegeService privilegeService = EnvTool.getPrivilegeService();
    final Rule rule = privilegeService.getRule(ruleUUID);
    if (rule == null) {
      throw new RuleNotFoundException("bai_MAPII_12", ruleUUID);
    }
    if (userUUIDs != null) {
      ((RuleImpl) rule).addUsers(userUUIDs);
    }
    if (groupUUIDs != null) {
      ((RuleImpl) rule).addGroups(groupUUIDs);
    }
    if (roleUUIDs != null) {
      ((RuleImpl) rule).addRoles(roleUUIDs);
    }
    if (membershipUUIDs != null) {
      ((RuleImpl) rule).addMemberships(membershipUUIDs);
    }
    if (entityIDs != null) {
      ((RuleImpl) rule).addEntities(entityIDs);
    }
    privilegeService.updateRule(rule);
  }

  @Override
  public void deleteRuleByUUID(final String ruleUUID) throws RuleNotFoundException {
    FacadeUtil.checkArgsNotNull(ruleUUID);
    final PrivilegeService privilegeService = EnvTool.getPrivilegeService();
    final Rule rule = privilegeService.getRule(ruleUUID);
    if (rule == null) {
      throw new RuleNotFoundException("bai_MAPII_12", ruleUUID);
    }
    privilegeService.deleteRule(rule);
  }

  @Override
  public List getAllApplicableRules(final String userUUID, final Collection roleUUIDs,
      final Collection groupUUIDs, final Collection membershipUUIDs, final String entityID) {
    final PrivilegeService privilegeService = EnvTool.getPrivilegeService();
    final List rules = privilegeService.getAllApplicableRules(userUUID, roleUUIDs, groupUUIDs, membershipUUIDs,
        entityID);

    return buildRulesResultList(rules);
  }

  @Override
  public List getApplicableRules(final RuleType ruleType, final String userUUID,
      final Collection roleUUIDs, final Collection groupUUIDs,
      final Collection membershipUUIDs, final String entityID) {
    FacadeUtil.checkArgsNotNull(ruleType);
    final PrivilegeService privilegeService = EnvTool.getPrivilegeService();
    final List rules = privilegeService.getApplicableRules(ruleType, userUUID, roleUUIDs, groupUUIDs,
        membershipUUIDs, entityID);

    return buildRulesResultList(rules);
  }

  @Override
  public List getAllRules() {
    final PrivilegeService privilegeService = EnvTool.getPrivilegeService();
    final List rules = privilegeService.getAllRules();
    if (rules == null || rules.isEmpty()) {
      return Collections.emptyList();
    }
    return buildRulesResultList(rules);
  }

  @Override
  public Rule getRuleByUUID(final String ruleUUID) throws RuleNotFoundException {
    FacadeUtil.checkArgsNotNull(ruleUUID);
    final PrivilegeService privilegeService = EnvTool.getPrivilegeService();
    final Rule rule = privilegeService.getRule(ruleUUID);
    if (rule == null) {
      throw new RuleNotFoundException("bai_MAPII_12", ruleUUID);
    }
    return RuleImpl.createRule(rule);
  }

  @Override
  public List getRulesByUUIDs(final Collection ruleUUIDs) throws RuleNotFoundException {
    final PrivilegeService privilegeService = EnvTool.getPrivilegeService();
    if (ruleUUIDs.size() > 0) {
      final List rules = privilegeService.getRules(ruleUUIDs);
      if (ruleUUIDs.size() != rules.size()) {
        // The request tries to get an unknown rule.
        final Set storedRuleUUID = new HashSet();
        for (final Rule rule : rules) {
          storedRuleUUID.add(rule.getUUID());
        }
        for (final String ruleUUID : ruleUUIDs) {
          if (!storedRuleUUID.contains(ruleUUID)) {
            throw new RuleNotFoundException("bai_MAPII_12", ruleUUID);
          }
        }
      }
      return buildRulesResultList(rules);
    } else {
      return Collections.emptyList();
    }
  }

  @Override
  @SuppressWarnings("unchecked")
  public  void removeExceptionsFromRuleByUUID(final String ruleUUID, final Set exceptions)
      throws RuleNotFoundException {
    FacadeUtil.checkArgsNotNull(ruleUUID, exceptions);
    if (exceptions.size() > 0) {
      final PrivilegeService privilegeService = EnvTool.getPrivilegeService();
      final RuleImpl rule = (RuleImpl) privilegeService.getRule(ruleUUID);
      if (rule == null) {
        throw new RuleNotFoundException("bai_MAPII_12", ruleUUID);
      }
      if (rule instanceof ProcessRuleImpl) {
        ((ProcessRuleImpl) rule).removeProcesses((Set) exceptions);
      } else if (rule instanceof CategoryRuleImpl) {
        ((CategoryRuleImpl) rule).removeCategories((Set) exceptions);
      } else if (rule instanceof CustomRuleImpl) {
        ((CustomRuleImpl) rule).removeCustomExceptions((Set) exceptions);
      } else if (rule instanceof ActivityRuleImpl) {
        ((ActivityRuleImpl) rule).removeActivities((Set) exceptions);
      } else {
        throw new IllegalArgumentException("Un-managed rule type: " + rule.getType());
      }
      privilegeService.updateRule(rule);
    }
  }

  @Override
  public void removeRuleFromEntities(final String ruleUUID, final Collection userUUIDs,
      final Collection roleUUIDs, final Collection groupUUIDs,
      final Collection membershipUUIDs, final Collection entityIDs) throws RuleNotFoundException {
    FacadeUtil.checkArgsNotNull(ruleUUID);
    final PrivilegeService privilegeService = EnvTool.getPrivilegeService();
    final Rule rule = privilegeService.getRule(ruleUUID);
    if (rule == null) {
      throw new RuleNotFoundException("bai_MAPII_12", ruleUUID);
    }
    if (userUUIDs != null) {
      ((RuleImpl) rule).removeUsers(userUUIDs);
    }
    if (groupUUIDs != null) {
      ((RuleImpl) rule).removeGroups(groupUUIDs);
    }
    if (roleUUIDs != null) {
      ((RuleImpl) rule).removeRoles(roleUUIDs);
    }
    if (membershipUUIDs != null) {
      ((RuleImpl) rule).removeMemberships(membershipUUIDs);
    }
    if (entityIDs != null) {
      ((RuleImpl) rule).removeEntities(entityIDs);
    }
    privilegeService.updateRule(rule);
  }

  @Override
  public Rule updateRuleByUUID(final String ruleUUID, final String name, final String label, final String description)
      throws RuleNotFoundException, RuleAlreadyExistsException {
    FacadeUtil.checkArgsNotNull(ruleUUID);
    final PrivilegeService privilegeService = EnvTool.getPrivilegeService();
    final RuleImpl rule = (RuleImpl) privilegeService.getRule(ruleUUID);
    if (rule == null) {
      throw new RuleNotFoundException("bai_MAPII_12", ruleUUID);
    }
    final Rule ruleWithSameName = privilegeService.findRuleByName(name);
    if (ruleWithSameName != null && !ruleWithSameName.getUUID().equals(ruleUUID)) {
      throw new RuleAlreadyExistsException("bai_MAPII_13", name);
    }
    rule.setName(name);
    rule.setLabel(label);
    rule.setDescription(description);
    privilegeService.updateRule(rule);
    return RuleImpl.createRule(rule);
  }

  @Override
  public void updateMigrationDate(final ProcessDefinitionUUID processUUID, final Date migrationDate)
      throws ProcessNotFoundException {
    Misc.checkArgsNotNull(processUUID);
    final InternalProcessDefinition process = EnvTool.getAllQueriers().getProcess(processUUID);
    if (process == null) {
      throw new ProcessNotFoundException("bai_QDAPII_5", processUUID);
    }
    process.setMigrationDate(migrationDate);
  }

  @Override
  public void setResource(final ProcessDefinitionUUID processUUID, final String resourcePath, final byte[] content)
      throws ProcessNotFoundException {
    Misc.checkArgsNotNull(processUUID, resourcePath, content);
    final InternalProcessDefinition process = EnvTool.getAllQueriers(getQueryList()).getProcess(processUUID);
    if (process == null) {
      throw new ProcessNotFoundException("bai_QDAPII_5", processUUID);
    }
    final LargeDataRepository ldr = EnvTool.getLargeDataRepository();
    ldr.storeData(Misc.getBusinessArchiveCategories(processUUID), resourcePath, content, true);
    // otherwise the Classloader will take the old content of the resource
    EnvTool.getClassDataLoader().removeProcessClassLoader(processUUID);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy