lib/simpler_workflow/activity_registry.rb
module SimplerWorkflow
class ActivityRegistry
def register(*activity_tuple)
domain = activity_tuple.shift
activity = activity_tuple.pop if activity_tuple.last.is_a?(Activity)
raise "Activity missing from registration" unless activity
registry_for_domain(domain)[activity_tuple] = activity
end
alias :[]= :register
def get(*activity_tuple)
domain = activity_tuple.shift
if AWS::SimpleWorkflow::ActivityType === domain
name = domain.name.to_sym
version = domain.version
domain = domain.domain
else
name = activity_tuple.first
case name
when Hash
version = name[:version]
name = name[:name].to_sym
when String, Symbol
name = name.to_sym
version = activity_tuple.last
end
end
registry_for_domain(domain)[[name, version]]
end
alias :[] :get
def persist_attributes(activity)
domain = Domain.for(activity.domain)
sdb_domain(domain).items.create(activity.simple_db_name, activity.simple_db_attributes)
end
protected
def registries
@registries ||= {}
end
def registry_for_domain(domain)
domain = Domain.for(domain)
unless sdb_domain(domain).exists?
sdb.domains.create(sdb_domain_name(domain))
end
registries[domain.name.to_sym] ||= Hash.new do |registry, (name, version)|
activity = Activity.new(domain, name, version)
attributes = sdb_attributes(domain, activity.simple_db_name)
unless attributes.empty?
activity.on_fail(attributes[:failure_policy]) if attributes.has_key?(:failure_policy)
activity.on_fail(attributes['failure_policy']) if attributes.has_key?('failure_policy')
activity.on_success(name: attributes[:next_activity_name], version: attributes[:next_activity_version]) if attributes.has_key?(:next_activity_name)
activity.on_success(name: attributes['next_activity_name'], version: attributes['next_activity_version']) if attributes.has_key?('next_activity_name')
end
registry[[name, version]] = activity
end
end
def sdb_domain_name(domain)
"swf-#{domain.name}-activities"
end
def sdb_domain(domain)
sdb.domains[sdb_domain_name(domain)]
end
def sdb_attributes(domain, sdb_name)
if item = sdb_domain(domain).items[sdb_name]
h = item.attributes.to_h
h.each { |k, v| h[k] = v.first }
else
{}
end
end
def self.sdb
@sdb ||= AWS::SimpleDB.new
end
def sdb
self.class.sdb
end
end
end