Please disable Adblockers and enable JavaScript for domain CEWebS.cs.univie.ac.at! We have NO ADS, but they may interfere with some of our course material.

Name: patterns/px3.rb 
1:
#!/usr/bin/env ruby
2:
require 'rubygems'
3:
require 'pp'
4:
require 'term/ansicolor'
5:
require File.expand_path(File.dirname(__FILE__) + '/../lib/remar')
6:
 
7:
m = REMAR.new.ruleset do
8:
  value :endpoint, 'http://b', :syn
9:
  
10:
  event :running_syncing_before, :instance, :activity, :endpoint
11:
  event :running_syncing_after, :instance, :activity, :endpoint
12:
  
13:
  context :wait, :buf => [], :waiting => false, :continue => false
14:
  context :sync, :run => [], :fin => []
15:
  
16:
  call :continue
17:
  
18:
  rule event.running_syncing_before do
19:
    context.wait.buf << [event.instance, event.activity]
20:
    if context.wait.waiting == false
21:
      context.wait.waiting = true
22:
      timed 5 do
23:
        context.wait.continue = true
24:
      end    
25:
    end  
26:
  end
27:
  rule context.wait{buf.length >= 5 || continue == true}, context.sync{run.empty?} do
28:
    context.wait.continue = false
29:
    context.sync.run = context.wait.buf.slice!(0..9)
30:
    context.sync.run.each do |instance,activity|
31:
      continue instance,activity
32:
    end
33:
  end
34:
  
35:
  rule event.running_syncing_after do
36:
    context.sync.fin << [event.instance, event.activity]
37:
  end
38:
  rule context.sync{fin.length == run.length} do
39:
    context.wait.waiting = false
40:
    context.sync.fin.each do |instance,activity|
41:
      continue instance,activity
42:
    end
43:
    context.sync.fin.clear
44:
    context.sync.run.clear
45:
  end
46:
end
47:
 
48:
m.on_continue do |instance,position|
49:
  puts Term::ANSIColor::bold(Term::ANSIColor::red("  Continuing #{instance}, #{position}"))
50:
end  
51:
 
52:
m.before_push do |evt_name,evt_data,context|
53:
  puts Term::ANSIColor::bold("Pushing #{evt_name} #{evt_data.inspect}")
54:
end
55:
m.after_push do |context|
56:
  puts "  After:\n" + context.pretty_inspect.gsub(/^/,'    |')
57:
end
58:
 
59:
puts Term::ANSIColor::bold("Initial context:")
60:
puts m.context.pretty_inspect.gsub(/^/,'    |')
61:
 
62:
m.push :running_syncing_before, :activity => :p, :endpoint => 'http://b', :instance => 'http://localhost:9188/p1'
63:
m.push :running_syncing_before, :activity => :p, :endpoint => 'http://b', :instance => 'http://localhost:9188/p2'
64:
sleep 7
65:
m.push :running_syncing_after, :activity => :p, :endpoint => 'http://b', :instance => 'http://localhost:9188/p1'
66:
m.push :running_syncing_after, :activity => :p, :endpoint => 'http://b', :instance => 'http://localhost:9188/p2'