com.webbfontaine.valuewebb.irms.factory.risk.RiskActionProcessor.java Source code

Java tutorial

Introduction

Here is the source code for com.webbfontaine.valuewebb.irms.factory.risk.RiskActionProcessor.java

Source

/*
 * Copyrights 2002-2013 Webb Fontaine
 * Developer: Sargis Harutyunyan
 * Date: 10 avr. 2013
 * This software is the proprietary information of Webb Fontaine.
 * Its use is subject to License terms.
 */
package com.webbfontaine.valuewebb.irms.factory.risk;

import com.google.common.base.Stopwatch;
import com.google.common.util.concurrent.ListeningExecutorService;
import com.webbfontaine.valuewebb.action.tt.TtGenHome;
import com.webbfontaine.valuewebb.irms.core.FluentRuleContextBuilder;
import com.webbfontaine.valuewebb.irms.core.RuleCallable;
import com.webbfontaine.valuewebb.irms.core.RuleContextBuilder;
import com.webbfontaine.valuewebb.irms.core.SourceBeanBuilder;
import com.webbfontaine.valuewebb.irms.factory.ActionProcessorAdapter;
import com.webbfontaine.valuewebb.irms.impl.risk.bean.RiskSourceBeanBuilder;
import com.webbfontaine.valuewebb.irms.impl.risk.data.RiskResult;
import com.webbfontaine.valuewebb.irms.impl.risk.data.RiskResultCollector;
import com.webbfontaine.valuewebb.irms.impl.risk.repository.RiskRuleRepository;
import com.webbfontaine.valuewebb.irms.repo.CriteriaRepository;
import com.webbfontaine.valuewebb.model.TtGen;
import com.webbfontaine.valuewebb.model.irms.Criteria;
import org.jboss.seam.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;

import java.lang.annotation.Annotation;
import java.util.List;

import static com.webbfontaine.valuewebb.irms.utils.Utils.getTTGenHomeInstance;

class RiskActionProcessor extends ActionProcessorAdapter {

    private static final Logger LOGGER = LoggerFactory.getLogger(RiskActionProcessor.class);

    private static final String MDC_IRMS = "irms";

    private final int criteriaType;

    private final ListeningExecutorService executor;

    private RiskRuleRepository riskRuleRepository;

    private CriteriaRepository criteriaRepository;

    RiskActionProcessor(int criteriaType, ListeningExecutorService executor) {
        this.criteriaType = criteriaType;
        this.executor = executor;
    }

    @Override
    public void apply(Component component, List<Annotation> annotations) {
        long timestamp = System.nanoTime();

        try {
            MDC.put(MDC_IRMS, String.valueOf(timestamp));
            doApply();
        } finally {
            MDC.remove(MDC_IRMS);
        }
    }

    private void doApply() {
        Stopwatch stopwatch = Stopwatch.createStarted();

        TtGenHome ttGenHome = getTtGenHome();

        List<Criteria> criteria = criteriaRepository.loadRules(criteriaType);

        LOGGER.trace("Loaded Risk Criteria: {}", criteria);

        RiskResultCollector riskResultCollector = new RiskResultCollector();

        for (Criteria criterion : criteria) {
            RuleCallable<List<RiskResult>> runnable = createCallable(ttGenHome, criterion);
            runnable.setRuleRepository(riskRuleRepository);

            riskResultCollector.add(executor.submit(runnable));
        }

        riskResultCollector.calculateResults();

        getRiskResultMerger().merge(ttGenHome.getInstance(), riskResultCollector);

        stopwatch.stop();
        LOGGER.info("IRMS Risk for TT with id {} took: {}", ttGenHome.getId(), stopwatch);
    }

    private RiskResultMerger getRiskResultMerger() {
        return (RiskResultMerger) Component.getInstance("riskResultMerger", true);
    }

    private RuleCallable<List<RiskResult>> createCallable(TtGenHome ttGenHome, Criteria criterion) {
        RuleContextBuilder ruleContext = createRuleContext(criterion, ttGenHome);
        SourceBeanBuilder sourceBeanBuilder = new RiskSourceBeanBuilder(ttGenHome);

        RuleCallable<List<RiskResult>> ruleCallable = new RuleCallable<>(criterion, ruleContext, sourceBeanBuilder);
        ruleCallable.setRuleRepository(riskRuleRepository);

        return ruleCallable;
    }

    private static RuleContextBuilder createRuleContext(Criteria criterion, TtGenHome ttGenHome) {
        TtGen ttGen = ttGenHome.getInstance();

        return new FluentRuleContextBuilder().setRuleId(criterion.getId()).setRuleCode(criterion.getCode())
                .setRuleName(criterion.getName()).setDocumentId(ttGen.getId())
                .setOperation(ttGenHome.getRequestedOperation());
    }

    private static TtGenHome getTtGenHome() {
        return getTTGenHomeInstance();
    }

    public void setRiskRuleRepository(RiskRuleRepository riskRuleRepository) {
        this.riskRuleRepository = riskRuleRepository;
    }

    public void setCriteriaRepository(CriteriaRepository criteriaRepository) {
        this.criteriaRepository = criteriaRepository;
    }

}