private static <Match extends IPatternMatch> Set<Job<Match>> getObservableCollectionJobs( IObservablePatternMatchCollectionUpdate<Match> observableCollectionUpdate) { Set<Job<Match>> jobs = new HashSet<>(); Job<Match> insertJob = Jobs.newErrorLoggingJob(Jobs.newStatelessJob(CRUDActivationStateEnum.CREATED, new ObservableCollectionProcessor<Match>(Direction.INSERT, observableCollectionUpdate))); jobs.add(insertJob); Job<Match> deleteJob = Jobs.newErrorLoggingJob(Jobs.newStatelessJob(CRUDActivationStateEnum.DELETED, new ObservableCollectionProcessor<Match>(Direction.DELETE, observableCollectionUpdate))); jobs.add(deleteJob); return jobs; }
/** * @since 2.0 */ public EventDrivenTransformationRule(String name, IQuerySpecification<Matcher> precondition, Map<CRUDActivationStateEnum, ? extends Consumer<Match>> stateActions, ActivationLifeCycle lifeCycle, EventFilter<? super Match> filter) { this.name = name; Set<Job<Match>> jobs = new HashSet<>(); boolean createdJobAdded = false; for (Entry<CRUDActivationStateEnum, ? extends Consumer<Match>> stateAction : stateActions.entrySet()) { CRUDActivationStateEnum state = stateAction.getKey(); Consumer<Match> action = stateAction.getValue(); jobs.add(Jobs.newStatelessJob(state, action)); if (state == CRUDActivationStateEnum.CREATED) { createdJobAdded = true; } } if (!createdJobAdded) { jobs.add(Jobs.newNopJob(CRUDActivationStateEnum.CREATED)); } this.precondition = precondition; ruleSpecification = Rules.newMatcherRuleSpecification(precondition, lifeCycle, jobs, name); this.filter = filter; }
/** * Returns a RuleSpecification that can be added to a rule engine. */ @Override public RuleSpecification<MATCH> getRuleSpecification() { if (ruleSpec == null) { final Job<MATCH> job = Jobs.newStatelessJob(CRUDActivationStateEnum.CREATED, action); ruleSpec = Rules.newMatcherRuleSpecification(precondition, lifecycle, Collections.singleton(job), getName()); } return ruleSpec; }
/** * Creates the default EVM Jobs which are executed as a new match appears, disappears or is updated. Can be * overridden to specify domain specific functionality * * @return */ protected Set<Job<IPatternMatch>> createDefaultProcessorJobs() { // Define default MatchProcessors Consumer<IPatternMatch> appearProcessor = this::registerAppear; Consumer<IPatternMatch> disappearProcessor = this::registerDisappear; Consumer<IPatternMatch> updateProcessor = this::registerUpdate; // Create Jobs Set<Job<IPatternMatch>> jobs = new HashSet<>(); Job<IPatternMatch> appear = new StatelessJob<IPatternMatch>(CRUDActivationStateEnum.CREATED, appearProcessor); Job<IPatternMatch> disappear = new StatelessJob<IPatternMatch>(CRUDActivationStateEnum.DELETED, disappearProcessor); Job<IPatternMatch> update = new StatelessJob<IPatternMatch>(CRUDActivationStateEnum.UPDATED, updateProcessor); jobs.add(Jobs.newEnableJob(appear)); jobs.add(Jobs.newEnableJob(disappear)); jobs.add(Jobs.newEnableJob(update)); allJobs.addAll(jobs); return jobs; }
/** * Creates the rule used for updating the results including changes in feature values. * * @param observableCollectionUpdate * the observable collection to handle * @param querySpecification * the {@link IQuerySpecification} used to create the rule */ protected static <Match extends IPatternMatch, Matcher extends ViatraQueryMatcher<Match>> RuleSpecification<Match> createUpdatingRuleSpecification( IObservablePatternMatchCollectionUpdate<Match> observableCollectionUpdate, IQuerySpecification<Matcher> querySpecification) { Set<Job<Match>> jobs = getObservableCollectionJobs(observableCollectionUpdate); Job<Match> updateJob = Jobs.newErrorLoggingJob(new SequentialProcessorsJob<Match>( CRUDActivationStateEnum.UPDATED, Arrays.asList( new ObservableCollectionProcessor<Match>(Direction.DELETE, observableCollectionUpdate), new ObservableCollectionProcessor<Match>(Direction.INSERT, observableCollectionUpdate) ))); jobs.add(updateJob); return Rules.newMatcherRuleSpecification(querySpecification, Lifecycles.getDefault(true, true), jobs); }