/** * Constructor that creates a new ChangeMonitor instance based on the specified ViatraQuery engine. Note that to * monitor changes of a specific model instance, a VIATRA Query should be initialized on said model instance. * * @param engine * The ViatraQueryEngine the monitor is based on. */ public ChangeMonitor(ViatraQueryEngine engine) { super(engine); this.changesBetweenCheckpoints = new HashMap<>(); this.accumulator = new HashMap<>(); allJobs = new HashSet<Job<?>>(); rules = new HashSet<RuleSpecification<IPatternMatch>>(); specs = new HashMap<IQuerySpecification<?>, RuleSpecification<IPatternMatch>>(); started = false; UpdateCompleteBasedSchedulerFactory schedulerFactory = Schedulers.getQueryEngineSchedulerFactory(engine); executionSchema = ExecutionSchemas.createViatraQueryExecutionSchema(engine, schedulerFactory); }
/** * Reuse rule engine if it was already created for this query engine to handle observable collections. * */ private static RuleEngine getRuleEngine(ViatraQueryEngine engine) { Map<ViatraQueryEngine, WeakReference<RuleEngine>> ruleEngineMap = getInstance().getQueryToRuleEngineMap(); if(ruleEngineMap.containsKey(engine)){ WeakReference<RuleEngine> ruleEngineRef = ruleEngineMap.get(engine); RuleEngine ruleEngine = ruleEngineRef.get(); if(ruleEngine != null){ return ruleEngine; } } RuleEngine ruleEngine = ExecutionSchemas.createViatraQueryExecutionSchema(engine, Schedulers.getQueryEngineSchedulerFactory(engine)); ruleEngineMap.put(engine, new WeakReference<RuleEngine>(ruleEngine)); return ruleEngine; }
@SuppressWarnings("unchecked") /** * @throws ViatraQueryRuntimeException */ public EventDrivenTransformation build() { Preconditions.checkState(engine != null, "ViatraQueryEngine must be set."); Map<RuleSpecification<?>, EventDrivenTransformationRule<?, ?>> rulesToAdd = new HashMap<>(); if (schedulerFactory == null) { schedulerFactory = Schedulers.getQueryEngineSchedulerFactory(engine); } if (conflictResolver == null) { conflictResolver = new ArbitraryOrderConflictResolver(); } AdaptableEVM vm = AdaptableEVMFactory.getInstance().createAdaptableEVM(); vm.addAdapters(adapters); vm.addListeners(listeners); ExecutionSchema schema = (adapters.size() > 0 || listeners.size() > 0) ? vm.createAdaptableExecutionSchema(engine, schedulerFactory, conflictResolver) : ExecutionSchemas.createViatraQueryExecutionSchema(engine, schedulerFactory, conflictResolver); GenericQueryGroup.of(collectPreconditions()).prepare(engine); for (@SuppressWarnings("rawtypes") EventDrivenTransformationRule rule : rules) { schema.addRule(rule.getRuleSpecification(), rule.getFilter()); rulesToAdd.put(rule.getRuleSpecification(), rule); } EventDrivenTransformation transformation = new EventDrivenTransformation(schema, engine); transformation.setRules(rulesToAdd); vm.initialize(engine); return transformation; }