def self::create(opts,redis,name)
doc = XML::Smart::open_unprotected(opts[:properties_init])
doc.register_namespace 'p', 'http://cpee.org/ns/properties/2.0'
id = CPEE::Persistence::new_object(opts)
uuid = SecureRandom.uuid
instance = CPEE::Persistence::obj + ':' + id.to_s
redis.multi do |multi|
multi.zadd('instances',id,id)
doc.root.find(PROPERTIES_PATHS_FULL.join(' | ')).each do |e|
if e.class == XML::Smart::Dom::Element && e.element_only?
val = e.find('*').map { |f| f.dump }.join
multi.set(File.join(instance, NewInstance::path(e)), val)
else
multi.set(File.join(instance, NewInstance::path(e)), e.text)
end
end
doc.root.find(PROPERTIES_PATHS_INDEX_UNORDERED.join(' | ')).each do |e|
p = NewInstance::path(e)
multi.sadd(File.join(instance, File.dirname(p)), File.basename(p))
end
doc.root.find(PROPERTIES_PATHS_INDEX_ORDERED.join(' | ')).each_with_index do |e,i|
p = NewInstance::path(e)
multi.zadd(File.join(instance, File.dirname(p)), i, File.basename(p))
end
Dir[File.join(opts[:notifications_init],'*','subscription.xml')].each do |f|
XML::Smart::open_unprotected(f) do |doc|
doc.register_namespace 'np', 'http://riddl.org/ns/common-patterns/notifications-producer/2.0'
key = File.basename(File.dirname(f))
url = doc.find('string(/np:subscription/@url)')
multi.sadd(CPEE::Persistence::obj + ":#{id}/handlers",key)
multi.set(CPEE::Persistence::obj + ":#{id}/handlers/#{key}/url",url)
doc.find('/np:subscription/np:topic/*').each do |e|
c = File.join(e.parent.attributes['id'],e.qname.name,e.text)
multi.sadd(CPEE::Persistence::obj + ":#{id}/handlers/#{key}",c)
multi.sadd(CPEE::Persistence::obj + ":#{id}/handlers/#{c}",key)
end
end rescue nil
end
multi.set(File.join(instance, 'attributes', 'uuid'), uuid)
multi.zadd(File.join(instance, 'attributes'), -2, 'uuid')
multi.set(File.join(instance, 'attributes', 'info'), name)
multi.zadd(File.join(instance, 'attributes'), -1, 'info')
multi.set(File.join(instance, 'state', '@changed'), Time.now.xmlschema(3))
end
content = {
:state => 'ready',
:attributes => CPEE::Persistence::extract_list(id,opts,'attributes').to_h
}
CPEE::Message::send(:event,'state/change',File.join(opts[:url],'/'),id,uuid,name,content,redis)
return id, uuid
end