com.evolveum.midpoint.notifications.impl.notifiers.SimpleReviewerNotifier.java Source code

Java tutorial

Introduction

Here is the source code for com.evolveum.midpoint.notifications.impl.notifiers.SimpleReviewerNotifier.java

Source

/*
 * Copyright (c) 2010-2015 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.notifications.impl.notifiers;

import com.evolveum.midpoint.model.api.expr.MidpointFunctions;
import com.evolveum.midpoint.notifications.api.events.CertCampaignEvent;
import com.evolveum.midpoint.notifications.api.events.CertReviewEvent;
import com.evolveum.midpoint.notifications.api.events.Event;
import com.evolveum.midpoint.notifications.impl.helpers.CertHelper;
import com.evolveum.midpoint.prism.xml.XmlTypeConverter;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.CertCampaignTypeUtil;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCampaignType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationStageDefinitionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationStageType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.GeneralNotifierType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SimpleCampaignNotifierType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SimpleReviewerNotifierType;
import org.apache.commons.lang.time.DurationFormatUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.Date;

/**
 * Various reviewer-level notifications.
 *
 * @author mederly
 */
@Component
public class SimpleReviewerNotifier extends GeneralNotifier {

    private static final Trace LOGGER = TraceManager.getTrace(SimpleReviewerNotifier.class);

    @Autowired
    private MidpointFunctions midpointFunctions;

    @Autowired
    private CertHelper certHelper;

    @PostConstruct
    public void init() {
        register(SimpleReviewerNotifierType.class);
    }

    @Override
    protected boolean quickCheckApplicability(Event event, GeneralNotifierType generalNotifierType,
            OperationResult result) {
        if (!(event instanceof CertReviewEvent)) {
            LOGGER.trace(
                    "SimpleReviewerNotifier is not applicable for this kind of event, continuing in the handler chain; event class = "
                            + event.getClass());
            return false;
        }
        CertReviewEvent reviewEvent = (CertReviewEvent) event;
        if (reviewEvent.isAdd()) {
            return true;
        }
        if (reviewEvent.isDelete()) {
            return false; // such events are not even created
        }
        AccessCertificationStageDefinitionType stageDef = reviewEvent.getCurrentStageDefinition();
        if (stageDef == null) {
            return false; // should not occur
        }
        if (Boolean.FALSE.equals(stageDef.isNotifyOnlyWhenNoDecision())) {
            return true;
        }
        if (reviewEvent.getCasesWithoutResponse().isEmpty()) {
            return false;
        }
        return true;
    }

    @Override
    protected String getSubject(Event event, GeneralNotifierType generalNotifierType, String transport, Task task,
            OperationResult result) {
        CertReviewEvent reviewEvent = (CertReviewEvent) event;
        String campaignName = reviewEvent.getCampaignName();
        if (reviewEvent.isAdd()) {
            return "Your review is requested in campaign " + campaignName;
        } else if (reviewEvent.isModify()) {
            return "Deadline for your review in campaign " + campaignName + " is approaching";
        } else {
            throw new IllegalStateException("Unexpected review event type: neither ADD nor MODIFY");
        }
    }

    @Override
    protected String getBody(Event event, GeneralNotifierType generalNotifierType, String transport, Task task,
            OperationResult result) {
        StringBuilder body = new StringBuilder();
        CertReviewEvent reviewEvent = (CertReviewEvent) event;
        AccessCertificationCampaignType campaign = reviewEvent.getCampaign();

        body.append("You have been requested to provide a review in a certification campaign.");
        body.append("\n\nCampaign: ").append(certHelper.getCampaignNameAndOid(reviewEvent));
        body.append("\nState: ").append(certHelper.formatState(reviewEvent));
        body.append("\n\n");
        AccessCertificationStageType stage = CertCampaignTypeUtil.getCurrentStage(campaign);
        if (stage != null) {
            body.append("Stage start time: ").append(XmlTypeConverter.toDate(stage.getStart()));
            body.append("\nStage end time: ").append(XmlTypeConverter.toDate(stage.getEnd()));
            if (stage.getEnd() != null) {
                long delta = XmlTypeConverter.toMillis(stage.getEnd()) - System.currentTimeMillis();
                if (delta > 0) {
                    if (reviewEvent.isModify()) {
                        body.append("\n\nThis is to notify you that the stage ends in ");
                    } else {
                        body.append("\n\nThe stage ends in ");
                    }
                    body.append(DurationFormatUtils.formatDurationWords(delta, true, true));
                } else if (delta < 0) {
                    body.append("\n\nThe stage ended ");
                    body.append(DurationFormatUtils.formatDurationWords(-delta, true, true));
                    body.append(" ago");
                }
            }
            body.append("\n\n");
            body.append("There are ").append(reviewEvent.getCases().size()).append(" cases assigned to you. ");
            body.append("Out of them, ").append(reviewEvent.getCasesWithoutResponse().size())
                    .append(" have no response from you yet.");
        }

        return body.toString();
    }

    @Override
    protected Trace getLogger() {
        return LOGGER;
    }

}