From 5c0f0af201a5c669fbf5277da8faa230ef473363 Mon Sep 17 00:00:00 2001 From: Michael Simon <simon@kit.edu> Date: Fri, 31 Aug 2018 09:54:44 +0200 Subject: [PATCH] Add an autoapproval executor Adds the possibility to autoapprove a pending registration according to a business rule --- .../impl/KnowledgeSessionServiceImpl.java | 4 + .../webreg/event/AutoApprovalExecutor.java | 101 ++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 bwreg-service/src/main/java/edu/kit/scc/webreg/event/AutoApprovalExecutor.java diff --git a/bwreg-service/src/main/java/edu/kit/scc/webreg/drools/impl/KnowledgeSessionServiceImpl.java b/bwreg-service/src/main/java/edu/kit/scc/webreg/drools/impl/KnowledgeSessionServiceImpl.java index 7b794cc39..b7a962238 100644 --- a/bwreg-service/src/main/java/edu/kit/scc/webreg/drools/impl/KnowledgeSessionServiceImpl.java +++ b/bwreg-service/src/main/java/edu/kit/scc/webreg/drools/impl/KnowledgeSessionServiceImpl.java @@ -279,6 +279,10 @@ public class KnowledgeSessionServiceImpl implements KnowledgeSessionService { service.getShortName(), registry.getId(), registry.getRegistryStatus()}); } } + else if (RegistryStatus.PENDING.equals(registry.getRegistryStatus())) { + logger.debug("{} {} {}: stays in status {}", new Object[] {user.getEppn(), + service.getShortName(), registry.getId(), registry.getRegistryStatus()}); + } else { if (! hasAccess(objectList)) { logger.debug("{} {} {}: registry status changed from {} to LOST_ACCESS", new Object[] {user.getEppn(), diff --git a/bwreg-service/src/main/java/edu/kit/scc/webreg/event/AutoApprovalExecutor.java b/bwreg-service/src/main/java/edu/kit/scc/webreg/event/AutoApprovalExecutor.java new file mode 100644 index 000000000..353994cc1 --- /dev/null +++ b/bwreg-service/src/main/java/edu/kit/scc/webreg/event/AutoApprovalExecutor.java @@ -0,0 +1,101 @@ +/******************************************************************************* + * Copyright (c) 2014 Michael Simon. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Public License v3.0 + * which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/gpl.html + * + * Contributors: + * Michael Simon - initial + ******************************************************************************/ +package edu.kit.scc.webreg.event; + +import java.util.ArrayList; +import java.util.List; + +import javax.naming.InitialContext; +import javax.naming.NamingException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import edu.kit.scc.webreg.drools.KnowledgeSessionService; +import edu.kit.scc.webreg.drools.OverrideAccess; +import edu.kit.scc.webreg.drools.UnauthorizedUser; +import edu.kit.scc.webreg.entity.RegistryEntity; +import edu.kit.scc.webreg.exc.RegisterException; +import edu.kit.scc.webreg.service.reg.ApprovalService; + +public class AutoApprovalExecutor extends + AbstractEventExecutor<ServiceRegisterEvent, RegistryEntity> { + + private static final long serialVersionUID = 1L; + + public AutoApprovalExecutor() { + super(); + } + + @Override + public void execute() { + Logger logger = LoggerFactory.getLogger(AutoApprovalExecutor.class); + logger.debug("Executing"); + + String ruleName = getJobStore().get("rule_name"); + + if (ruleName == null) { + logger.warn("No rule_name configured for AutoApprovalExecutor"); + return; + } + + String[] ruleNames = ruleName.split(":"); + + if (ruleNames.length != 3) { + logger.warn("rule_name must contain two :"); + return; + } + + try { + InitialContext ic = new InitialContext(); + + RegistryEntity registry = getEvent().getEntity(); + + logger.info("Checking autoapproval for user {}", registry.getUser().getEppn()); + + KnowledgeSessionService knowledgeSessionService = (KnowledgeSessionService) ic.lookup("global/bwreg/bwreg-service/KnowledgeSessionServiceImpl!edu.kit.scc.webreg.drools.KnowledgeSessionService"); + + List<Object> objectList = knowledgeSessionService.checkRule(ruleNames[0], ruleNames[1], ruleNames[2], + registry.getUser(), registry.getService(), registry, "autoapproval", false); + + List<String> requirementsList = new ArrayList<String>(); + for (Object o : objectList) { + if (o instanceof OverrideAccess) { + requirementsList.clear(); + logger.debug("Removing requirements due to OverrideAccess"); + break; + } + else if (o instanceof UnauthorizedUser) { + String s = ((UnauthorizedUser) o).getMessage(); + requirementsList.add(s); + } + } + + if (requirementsList.size() == 0) { + ApprovalService approvalService = (ApprovalService) ic.lookup("global/bwreg/bwreg-service/ApprovalServiceImpl!edu.kit.scc.webreg.service.reg.ApprovalService"); + + try { + approvalService.approve(registry, "autoappoval", null); + } catch (RegisterException e) { + logger.warn("Could not complete autoapproval", e); + } + } + else { + logger.info("User {} must be manually approved", registry.getUser().getEppn()); + } + + } catch (NamingException e) { + logger.warn("Could not autoapprove: {}", e); + } + + } + +} -- GitLab