/* * Copyright (c) 2010-2017 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.evolveum.midpoint.certification.impl; import com.evolveum.midpoint.model.api.context.EvaluatedAssignment; import com.evolveum.midpoint.model.api.context.EvaluatedPolicyRule; import com.evolveum.midpoint.model.api.context.ModelContext; import com.evolveum.midpoint.model.api.context.ModelState; import com.evolveum.midpoint.model.api.hooks.ChangeHook; import com.evolveum.midpoint.model.api.hooks.HookOperationMode; import com.evolveum.midpoint.model.api.hooks.HookRegistry; import com.evolveum.midpoint.model.impl.lens.LensElementContext; import com.evolveum.midpoint.prism.delta.DeltaSetTriple; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.exception.CommonException; import com.evolveum.midpoint.util.exception.PolicyViolationException; import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.CertificationPolicyActionType; import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; /** * Starts ad-hoc certifications as prescribed by "certificate" policy action. * * @author mederly */ @Component public class CertificationHook implements ChangeHook { private static final Trace LOGGER = TraceManager.getTrace(CertificationHook.class); private static final String HOOK_URI = SchemaConstants.NS_MODEL + "/certification-hook-3"; @Autowired private HookRegistry hookRegistry; @Autowired private CertificationManagerImpl certificationManager; @Autowired private AccCertUpdateHelper updateHelper; @PostConstruct public void init() { hookRegistry.registerChangeHook(HOOK_URI, this); LOGGER.trace("CertificationHook registered."); } @Override public <O extends ObjectType> HookOperationMode invoke(@NotNull ModelContext<O> context, @NotNull Task task, @NotNull OperationResult result) throws PolicyViolationException { if (context.getState() != ModelState.FINAL) { return HookOperationMode.FOREGROUND; } LensElementContext<O> focusContext = (LensElementContext<O>) context.getFocusContext(); if (focusContext == null || !FocusType.class.isAssignableFrom(focusContext.getObjectTypeClass())) { return HookOperationMode.FOREGROUND; } List<CertificationPolicyActionType> actions = new ArrayList<>(); actions.addAll(getFocusCertificationActions(context)); actions.addAll(getAssignmentCertificationActions(context)); try { certificationManager.startAdHocCertifications(focusContext.getObjectAny(), actions, task, result); } catch (CommonException e) { throw new SystemException("Couldn't start ad-hoc campaign(s): " + e.getMessage(), e); } return HookOperationMode.FOREGROUND; } private Collection<CertificationPolicyActionType> getFocusCertificationActions(ModelContext<?> context) { return getCertificationActions(context.getFocusContext().getPolicyRules()); } private Collection<CertificationPolicyActionType> getAssignmentCertificationActions(ModelContext<?> context) { DeltaSetTriple<? extends EvaluatedAssignment<?>> evaluatedAssignmentTriple = context.getEvaluatedAssignmentTriple(); if (evaluatedAssignmentTriple == null) { return Collections.emptyList(); } else { return evaluatedAssignmentTriple.stream() .flatMap(ea -> getCertificationActions(ea.getAllTargetsPolicyRules()).stream()) .collect(Collectors.toList()); } } private Collection<CertificationPolicyActionType> getCertificationActions(Collection<EvaluatedPolicyRule> policyRules) { return policyRules.stream() .filter(r -> !r.getTriggers().isEmpty() && r.getActions() != null && r.getActions().getCertification() != null) .map(r -> r.getActions().getCertification()) .collect(Collectors.toList()); } @Override public void invokeOnException(@NotNull ModelContext context, @NotNull Throwable throwable, @NotNull Task task, @NotNull OperationResult result) { // Nothing to do } }