protected void performUndeployment(ProcessArchive processArchive) {
    final String paName = processArchive.getName();

    ProcessArchiveContext processArchiveContext = installedProcessArchivesByName.get(paName);
    if (processArchiveContext == null) {
      return;
    }

    try {
      processArchiveContext.setUndelploying(true);
      performEngineUndeployment(processArchive);
    } catch (Exception e) {
      log.log(Level.SEVERE, "Exception while performing process engine undeployment: ", e);
    } finally {
      processArchiveContext.setUndelploying(false);
      processArchiveContext.setActive(false);

      installedProcessArchivesByName.remove(paName);

      ArrayList<ProcessArchive> processArchives =
          new ArrayList<ProcessArchive>(cachedProcessArchives);
      processArchives.remove(processArchive);
      cachedProcessArchives = Collections.unmodifiableList(processArchives);

      if (processArchiveContext.getActivitiDeployment() != null) {
        String activitiDeploymentId = processArchiveContext.getActivitiDeployment().getId();
        List<ProcessDefinition> processDefinitions =
            activitiProcessEngine
                .getRepositoryService()
                .createProcessDefinitionQuery()
                .deploymentId(activitiDeploymentId)
                .list();
        for (ProcessDefinition processDefinition : processDefinitions) {
          installedProcessArchivesByProcessDefinitionKey.remove(processDefinition.getKey());
        }
      }
    }
  }