Java tutorial
/* * 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; } }