infopark_reactor_migrations 1.5.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +5 -0
- data/Gemfile +4 -0
- data/LICENSE +165 -0
- data/README +64 -0
- data/Rakefile +19 -0
- data/infopark_reactor_migrations.gemspec +27 -0
- data/lib/generators/cm/migration/USAGE +8 -0
- data/lib/generators/cm/migration/migration_generator.rb +15 -0
- data/lib/generators/cm/migration/templates/template.rb +7 -0
- data/lib/infopark_reactor_migrations.rb +29 -0
- data/lib/reactor/cm/attribute.rb +84 -0
- data/lib/reactor/cm/bridge.rb +49 -0
- data/lib/reactor/cm/editorial_group.rb +22 -0
- data/lib/reactor/cm/group.rb +270 -0
- data/lib/reactor/cm/language.rb +56 -0
- data/lib/reactor/cm/link.rb +132 -0
- data/lib/reactor/cm/live_group.rb +22 -0
- data/lib/reactor/cm/missing_credentials.rb +7 -0
- data/lib/reactor/cm/obj.rb +402 -0
- data/lib/reactor/cm/obj_class.rb +186 -0
- data/lib/reactor/cm/object_base.rb +164 -0
- data/lib/reactor/cm/user.rb +100 -0
- data/lib/reactor/cm/workflow.rb +40 -0
- data/lib/reactor/cm/xml_attribute.rb +35 -0
- data/lib/reactor/cm/xml_markup.rb +85 -0
- data/lib/reactor/cm/xml_request.rb +82 -0
- data/lib/reactor/cm/xml_request_error.rb +16 -0
- data/lib/reactor/cm/xml_response.rb +41 -0
- data/lib/reactor/configuration.rb +7 -0
- data/lib/reactor/migration.rb +82 -0
- data/lib/reactor/migrations/railtie.rb +10 -0
- data/lib/reactor/migrations/version.rb +5 -0
- data/lib/reactor/plans/common_attribute.rb +32 -0
- data/lib/reactor/plans/common_group.rb +44 -0
- data/lib/reactor/plans/common_obj_class.rb +69 -0
- data/lib/reactor/plans/create_attribute.rb +32 -0
- data/lib/reactor/plans/create_group.rb +34 -0
- data/lib/reactor/plans/create_obj.rb +48 -0
- data/lib/reactor/plans/create_obj_class.rb +28 -0
- data/lib/reactor/plans/delete_attribute.rb +23 -0
- data/lib/reactor/plans/delete_group.rb +28 -0
- data/lib/reactor/plans/delete_obj.rb +22 -0
- data/lib/reactor/plans/delete_obj_class.rb +22 -0
- data/lib/reactor/plans/prepared.rb +15 -0
- data/lib/reactor/plans/rename_group.rb +32 -0
- data/lib/reactor/plans/rename_obj_class.rb +24 -0
- data/lib/reactor/plans/update_attribute.rb +23 -0
- data/lib/reactor/plans/update_group.rb +30 -0
- data/lib/reactor/plans/update_obj.rb +30 -0
- data/lib/reactor/plans/update_obj_class.rb +26 -0
- data/lib/reactor/tools/migrator.rb +135 -0
- data/lib/reactor/tools/response_handler/base.rb +22 -0
- data/lib/reactor/tools/response_handler/string.rb +19 -0
- data/lib/reactor/tools/response_handler/xml_attribute.rb +52 -0
- data/lib/reactor/tools/smart_xml_logger.rb +69 -0
- data/lib/reactor/tools/sower.rb +89 -0
- data/lib/reactor/tools/uploader.rb +131 -0
- data/lib/reactor/tools/versioner.rb +120 -0
- data/lib/reactor/tools/xml_attributes.rb +70 -0
- data/lib/tasks/cm_migrate.rake +8 -0
- data/lib/tasks/cm_seeds.rake +41 -0
- metadata +193 -0
@@ -0,0 +1,164 @@
|
|
1
|
+
require 'reactor/tools/xml_attributes'
|
2
|
+
|
3
|
+
module Reactor
|
4
|
+
module Cm
|
5
|
+
class ObjectBase
|
6
|
+
def self.inherited(subclass)
|
7
|
+
# dynamic binding is required, otherwise class attributes
|
8
|
+
# aren't stored in the correct class
|
9
|
+
subclass.send(:include, Reactor::XmlAttributes)
|
10
|
+
end
|
11
|
+
|
12
|
+
# Default base_name is lowercased class name (without namespaces)
|
13
|
+
def self.base_name
|
14
|
+
self.name.split('::').last.downcase
|
15
|
+
end
|
16
|
+
|
17
|
+
def base_name
|
18
|
+
self.class.base_name
|
19
|
+
end
|
20
|
+
|
21
|
+
# Sets the base name for the object. Use it when inheriting the class, for example:
|
22
|
+
# class Obj < ObjectBase
|
23
|
+
# set_base_name 'obj'
|
24
|
+
# end
|
25
|
+
def self.set_base_name(base_name_value)
|
26
|
+
# we us evaluation of a string in this case, because
|
27
|
+
# define_method cannot handle default values
|
28
|
+
self.class_eval <<-EOH
|
29
|
+
def self.base_name
|
30
|
+
'#{base_name_value}'
|
31
|
+
end
|
32
|
+
EOH
|
33
|
+
end
|
34
|
+
|
35
|
+
private_class_method :new
|
36
|
+
# Constructor of this class should never be called directly.
|
37
|
+
# Use class methods .get and .create instead (as well as helper method .exists?)
|
38
|
+
def initialize(pk_val)
|
39
|
+
primary_key_value_set(pk_val)
|
40
|
+
end
|
41
|
+
|
42
|
+
# Reloads the data from CM. Fetches all defined attributes.
|
43
|
+
def reload
|
44
|
+
request = XmlRequest.prepare do |xml|
|
45
|
+
xml.where_key_tag!(base_name, primary_key, primary_key_value)
|
46
|
+
xml.get_key_tag!(base_name, self.class.xml_attribute_names)
|
47
|
+
end
|
48
|
+
|
49
|
+
response = request.execute!
|
50
|
+
|
51
|
+
self.class.attributes.each do |attr_name, attr_def|
|
52
|
+
self.send(:"#{attr_name}=", self.class.response_handler.get(response, attr_def))
|
53
|
+
end
|
54
|
+
|
55
|
+
self
|
56
|
+
end
|
57
|
+
|
58
|
+
# Saves all settable instance attributes to the Content Manager.
|
59
|
+
def save!
|
60
|
+
request = XmlRequest.prepare do |xml|
|
61
|
+
xml.where_key_tag!(base_name, primary_key, primary_key_value)
|
62
|
+
xml.set_tag!(base_name) do
|
63
|
+
self.class.attributes(:set).each do |name, xml_attribute|
|
64
|
+
value = self.send(name)
|
65
|
+
serialize_attribute_to_xml(xml, xml_attribute, value)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
response = request.execute!
|
71
|
+
|
72
|
+
response.ok?
|
73
|
+
end
|
74
|
+
|
75
|
+
# Alias for #save!
|
76
|
+
def save ; save! ; end
|
77
|
+
|
78
|
+
# Proxy method. @see .delete!(login)
|
79
|
+
def delete!
|
80
|
+
self.class.delete!(self.primary_key_value)
|
81
|
+
end
|
82
|
+
|
83
|
+
def serialize_attribute_to_xml(xml, xml_attribute, value)
|
84
|
+
self.class.serialize_attribute_to_xml(xml, xml_attribute, value)
|
85
|
+
end
|
86
|
+
|
87
|
+
def self.serialize_attribute_to_xml(xml, xml_attribute, value)
|
88
|
+
xml.value_tag!(xml_attribute.name, value)
|
89
|
+
end
|
90
|
+
|
91
|
+
# Returns true when object with given primary key exists in CM
|
92
|
+
# Returns false otherwise
|
93
|
+
def self.exists?(pk_val)
|
94
|
+
request = XmlRequest.prepare do |xml|
|
95
|
+
xml.where_key_tag!(base_name, primary_key, pk_val)
|
96
|
+
xml.get_key_tag!(base_name, primary_key)
|
97
|
+
end
|
98
|
+
|
99
|
+
response = request.execute!
|
100
|
+
|
101
|
+
return response.ok?
|
102
|
+
|
103
|
+
rescue XmlRequestError => e
|
104
|
+
return false
|
105
|
+
end
|
106
|
+
|
107
|
+
# Returns an instance of the class for object with given primary key
|
108
|
+
# XmlRequestError will be raised when error occurs (for example
|
109
|
+
# when there is no object with given primary key)
|
110
|
+
def self.get(pk_val)
|
111
|
+
obj = new(pk_val)
|
112
|
+
obj.reload
|
113
|
+
obj
|
114
|
+
end
|
115
|
+
|
116
|
+
# Removes object with given pk from CM.
|
117
|
+
# Returns true on success, raises XmlRequestError on error
|
118
|
+
def self.delete!(pk_val)
|
119
|
+
request = XmlRequest.prepare do |xml|
|
120
|
+
xml.where_key_tag!(base_name, primary_key, pk_val)
|
121
|
+
xml.delete_tag!(base_name)
|
122
|
+
end
|
123
|
+
|
124
|
+
return request.execute!.ok?
|
125
|
+
end
|
126
|
+
# Alias for #delete!
|
127
|
+
def delete ; delete! ; end
|
128
|
+
|
129
|
+
class << self
|
130
|
+
# This method should never be called directly. It should always be overriden!
|
131
|
+
# pk_value is the value of primary key, it should have its double in attributes hash
|
132
|
+
# attributes is a hash of attributes set on creation {:name => 'value'}
|
133
|
+
protected
|
134
|
+
def create(pk_value, attributes)
|
135
|
+
request = XmlRequest.prepare do |xml|
|
136
|
+
xml.create_tag!(base_name) do
|
137
|
+
attributes.each do |attr_name, attr_value|
|
138
|
+
#serialize_attribute_to_xml(xml, xml_attribute, value)
|
139
|
+
xml.value_tag!(attr_name, attr_value)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
response = request.execute!
|
145
|
+
|
146
|
+
return get(pk_value)
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
protected
|
151
|
+
def primary_key
|
152
|
+
self.class.primary_key
|
153
|
+
end
|
154
|
+
|
155
|
+
def primary_key_value
|
156
|
+
instance_variable_get("@#{self.primary_key}")
|
157
|
+
end
|
158
|
+
|
159
|
+
def primary_key_value_set(value)
|
160
|
+
instance_variable_set("@#{self.primary_key}", value)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'reactor/cm/object_base'
|
2
|
+
require 'reactor/configuration'
|
3
|
+
require 'reactor/cm/language'
|
4
|
+
require 'reactor/tools/xml_attributes'
|
5
|
+
|
6
|
+
module Reactor
|
7
|
+
|
8
|
+
module Cm
|
9
|
+
|
10
|
+
class User
|
11
|
+
|
12
|
+
class Internal < Reactor::Cm::ObjectBase
|
13
|
+
set_base_name 'user'
|
14
|
+
|
15
|
+
# Attribute definitions
|
16
|
+
attribute :login, :except => [:set]
|
17
|
+
attribute :super_user, :except => [:set], :name => :isSuperUser
|
18
|
+
attribute :default_group, :name => :defaultGroup
|
19
|
+
attribute :groups, :type => :list
|
20
|
+
attribute :real_name, :name => :realName
|
21
|
+
|
22
|
+
def change_password(new_password)
|
23
|
+
request = XmlRequest.prepare do |xml|
|
24
|
+
xml.where_key_tag!(base_name, primary_key, primary_key_value)
|
25
|
+
xml.set_tag!(base_name) do
|
26
|
+
xml.tag!('password', :verifyNewPassword => new_password) do
|
27
|
+
xml.text!(new_password)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
response = request.execute!
|
33
|
+
|
34
|
+
response.ok?
|
35
|
+
end
|
36
|
+
|
37
|
+
primary_key :login
|
38
|
+
|
39
|
+
# Returns true if user is root, false otherwise
|
40
|
+
def super_user?
|
41
|
+
super_user == '1'
|
42
|
+
end
|
43
|
+
|
44
|
+
# Creates a user with given login and sets its default group
|
45
|
+
# Returns instance of the class for user with given login
|
46
|
+
def self.create(login, default_group)
|
47
|
+
super(login, {:login => login, :defaultGroup => default_group})
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
include XmlAttributes
|
53
|
+
|
54
|
+
attribute :name
|
55
|
+
attribute :groups, :type => :list
|
56
|
+
|
57
|
+
primary_key 'login'
|
58
|
+
|
59
|
+
def initialize(name)
|
60
|
+
@name = name
|
61
|
+
end
|
62
|
+
|
63
|
+
def is_root?
|
64
|
+
request = XmlRequest.prepare do |xml|
|
65
|
+
xml.where_key_tag!(base_name, self.class.primary_key, self.name)
|
66
|
+
xml.get_key_tag!(base_name, 'isSuperUser')
|
67
|
+
end
|
68
|
+
|
69
|
+
response = request.execute!
|
70
|
+
|
71
|
+
response.xpath('//isSuperUser/text()') == '1'
|
72
|
+
end
|
73
|
+
|
74
|
+
def language
|
75
|
+
Reactor::Cm::Language.get(self.name)
|
76
|
+
end
|
77
|
+
|
78
|
+
def groups
|
79
|
+
xml_attribute = self.class.xml_attribute(:groups)
|
80
|
+
|
81
|
+
request = XmlRequest.prepare do |xml|
|
82
|
+
xml.where_key_tag!(base_name, self.class.primary_key, self.name)
|
83
|
+
xml.get_key_tag!(base_name, xml_attribute.name)
|
84
|
+
end
|
85
|
+
|
86
|
+
response = request.execute!
|
87
|
+
|
88
|
+
self.class.response_handler.get(response, xml_attribute)
|
89
|
+
end
|
90
|
+
|
91
|
+
protected
|
92
|
+
def base_name
|
93
|
+
'userProxy'
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'reactor/cm/object_base'
|
2
|
+
|
3
|
+
module Reactor
|
4
|
+
module Cm
|
5
|
+
class Workflow < ObjectBase
|
6
|
+
# Attribute definitions
|
7
|
+
attribute :name, :except => [:set]
|
8
|
+
attribute :title
|
9
|
+
attribute :is_enabled, :name => :isEnabled
|
10
|
+
attribute :edit_groups, :name => :editGroups, :type => :list
|
11
|
+
attribute :mutiple_signatures, :name => :allowsMultipleSignatures
|
12
|
+
# This attribute should be used as follows:
|
13
|
+
# workflow.signatures = [{:attribute => 'mySigAttr', :group => 'myGroup'},{:attribute => 'mySigAttr', :group => 'myOtherGroup'}]
|
14
|
+
attribute :signatures, :name => :signatureDefs, :type => :signaturelist
|
15
|
+
|
16
|
+
primary_key :name
|
17
|
+
|
18
|
+
# Creates a workflow with given name. A list of edit groups
|
19
|
+
# may also be specified - otherwise it defaults to empty list
|
20
|
+
def self.create(name, edit_groups = [])
|
21
|
+
super(name, {:name => name, :editGroups => edit_groups})
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.serialize_attribute_to_xml(xml, xml_attribute, value)
|
25
|
+
if xml_attribute.name.to_sym == :signatureDefs
|
26
|
+
xml.tag!('signatureDefs') do
|
27
|
+
(value || []).each do |hash|
|
28
|
+
xml.tag!('listitem') do
|
29
|
+
xml.tag!('listitem', hash[:attribute])
|
30
|
+
xml.tag!('listitem', hash[:group])
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
else
|
35
|
+
super(xml, xml_attribute, value)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Reactor
|
2
|
+
|
3
|
+
module Cm
|
4
|
+
|
5
|
+
class XmlAttribute
|
6
|
+
|
7
|
+
AVAILABLE_SCOPES = [:get, :set, :create]
|
8
|
+
|
9
|
+
attr_accessor :name
|
10
|
+
attr_accessor :type
|
11
|
+
attr_accessor :scopes
|
12
|
+
|
13
|
+
def initialize(name, type, options)
|
14
|
+
@name = name
|
15
|
+
@type = type.presence || :string
|
16
|
+
|
17
|
+
@scopes =
|
18
|
+
if options[:except].present?
|
19
|
+
AVAILABLE_SCOPES - options[:except]
|
20
|
+
elsif options[:only].present?
|
21
|
+
options[:only]
|
22
|
+
else
|
23
|
+
AVAILABLE_SCOPES
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def scope?(name)
|
28
|
+
self.scopes.include?(name)
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'builder'
|
2
|
+
|
3
|
+
module Reactor
|
4
|
+
module Cm
|
5
|
+
class XmlMarkup < Builder::XmlMarkup
|
6
|
+
|
7
|
+
def where_key_tag!(base_name, key, value)
|
8
|
+
where_tag!(base_name) do |xml|
|
9
|
+
xml.tag!(key.to_s) do
|
10
|
+
xml.text!(value.to_s)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def where_tag!(base_name)
|
16
|
+
tag!("#{base_name}-where") do |xml|
|
17
|
+
yield xml
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def create_tag!(base_name)
|
22
|
+
tag!("#{base_name}-create") do |xml|
|
23
|
+
yield xml
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def delete_tag!(base_name)
|
28
|
+
tag!("#{base_name}-delete")
|
29
|
+
end
|
30
|
+
|
31
|
+
def get_key_tag!(base_name, key)
|
32
|
+
get_tag!(base_name) do |xml|
|
33
|
+
if key.kind_of?(Array)
|
34
|
+
key.each {|k| xml.tag!(k.to_s) }
|
35
|
+
else
|
36
|
+
xml.tag!(key.to_s) ; end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def get_tag!(base_name)
|
41
|
+
tag!("#{base_name}-get") do |xml|
|
42
|
+
yield xml
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def set_key_tag!(base_name, key, value, options = {})
|
47
|
+
set_tag!(base_name) do
|
48
|
+
value_tag!(key, value, options)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def set_tag!(base_name)
|
53
|
+
tag!("#{base_name}-set") do |xml|
|
54
|
+
yield xml
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def value_tag!(key, value, options = {})
|
59
|
+
if value.kind_of? Array then array_value_tag!(key, value, options)
|
60
|
+
elsif value.kind_of? Hash then hash_value_tag!(key, value)
|
61
|
+
else tag!(key.to_s) { text!(value.to_s) }
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def array_value_tag!(name, values, options = {})
|
66
|
+
tag!(name.to_s, options) do
|
67
|
+
values.each do |value|
|
68
|
+
tag!('listitem') do
|
69
|
+
text!(value.to_s)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def hash_value_tag!(name, hash)
|
76
|
+
hash.each do |value, attr_hash|
|
77
|
+
tag!(name.to_s, attr_hash) do
|
78
|
+
text!(value.to_s)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'reactor/cm/xml_response'
|
3
|
+
require 'reactor/cm/xml_request_error'
|
4
|
+
require 'reactor/cm/xml_markup'
|
5
|
+
require 'reactor/tools/smart_xml_logger'
|
6
|
+
|
7
|
+
module Reactor
|
8
|
+
module Cm
|
9
|
+
|
10
|
+
if Rails.env.development? && false
|
11
|
+
#LOGGER = SmartXmlLogger.new(Rails.logger, :debug)
|
12
|
+
LOGGER = SmartXmlLogger.new(Kernel, :puts)
|
13
|
+
else
|
14
|
+
LOGGER = SmartXmlLogger.new(nil) # turn off logging
|
15
|
+
end
|
16
|
+
LOGGER.configure(:request, :xpath => 'cm-payload/cm-request/*', :start_indent => 2)
|
17
|
+
LOGGER.configure(:response, :xpath => 'cm-payload/cm-response/*', :start_indent => 2)
|
18
|
+
|
19
|
+
class XmlRequest
|
20
|
+
|
21
|
+
def self.token(login, instance_secret)
|
22
|
+
Digest::MD5.hexdigest(login + instance_secret)
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.prepare
|
26
|
+
access = Configuration::xml_access
|
27
|
+
sanity_check(access)
|
28
|
+
xml = XmlMarkup.new
|
29
|
+
ret = nil
|
30
|
+
xml.instruct!
|
31
|
+
ret = xml.tag!('cm-payload', 'payload-id' =>'abcabc', 'timestamp' => Time.now.getutc.strftime('%Y%m%d%H%M%S'), 'version' => '6.7.3') do
|
32
|
+
xml.tag!('cm-header') do
|
33
|
+
xml.tag!('cm-sender', 'sender-id' => access[:id], 'name' => "ruby-simple-client")
|
34
|
+
xml.tag!('cm-authentication', 'login' => access[:username], 'token' => token(access[:username],access[:secret]))
|
35
|
+
end
|
36
|
+
id = self.generate_id
|
37
|
+
xml.tag!('cm-request', 'request-id' => id) do |xml2|
|
38
|
+
yield xml2 if block_given?
|
39
|
+
end
|
40
|
+
end
|
41
|
+
XmlRequest.new(ret)
|
42
|
+
end
|
43
|
+
|
44
|
+
def execute!
|
45
|
+
access = Configuration::xml_access
|
46
|
+
payload = @xml
|
47
|
+
|
48
|
+
res = Net::HTTP.new(access[:host], access[:port]).start do |http|
|
49
|
+
req = Net::HTTP::Post.new('/xml')
|
50
|
+
Reactor::Cm::LOGGER.log('REQUEST:')
|
51
|
+
Reactor::Cm::LOGGER.log_xml(:request, payload)
|
52
|
+
req.body = payload
|
53
|
+
http.request(req)
|
54
|
+
end
|
55
|
+
Reactor::Cm::LOGGER.log('RESPONSE:')
|
56
|
+
Reactor::Cm::LOGGER.log_xml(:response, res.body)
|
57
|
+
response = XmlResponse.new(res.body)
|
58
|
+
raise XmlRequestError, response unless response.ok?
|
59
|
+
response
|
60
|
+
end
|
61
|
+
|
62
|
+
class << self
|
63
|
+
protected
|
64
|
+
|
65
|
+
def generate_id
|
66
|
+
rand(10000)
|
67
|
+
end
|
68
|
+
|
69
|
+
def sanity_check(access)
|
70
|
+
raise Reactor::Cm::MissingCredentials if access[:username].nil? || access[:username].empty?
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
protected
|
75
|
+
|
76
|
+
def initialize(xml)
|
77
|
+
@xml = xml
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'reactor/tools/response_handler/xml_attribute'
|
2
|
+
|
3
|
+
module Reactor
|
4
|
+
|
5
|
+
module Cm
|
6
|
+
|
7
|
+
class XmlResponse
|
8
|
+
|
9
|
+
attr_reader :xml
|
10
|
+
attr_reader :xml_str
|
11
|
+
|
12
|
+
def initialize(xml)
|
13
|
+
@xml_str = xml
|
14
|
+
@xml = REXML::Document.new(xml)
|
15
|
+
@handler = Reactor::ResponseHandler::XmlAttribute.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def xpath(expr)
|
19
|
+
arr = REXML::XPath.match(@xml, expr)
|
20
|
+
|
21
|
+
return arr.first if arr.length == 1
|
22
|
+
return arr
|
23
|
+
end
|
24
|
+
|
25
|
+
def ok?
|
26
|
+
xp = xpath('//cm-code')
|
27
|
+
|
28
|
+
if xp.is_a?(Array)
|
29
|
+
codes = xp.map { |result| result.attribute('numeric').value }.uniq
|
30
|
+
|
31
|
+
return codes.size == 1 && codes.first == '200'
|
32
|
+
end
|
33
|
+
|
34
|
+
xp.attribute('numeric').value == '200'
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'reactor/plans/create_obj'
|
2
|
+
require 'reactor/plans/delete_obj'
|
3
|
+
require 'reactor/plans/update_obj'
|
4
|
+
require 'reactor/plans/create_obj_class'
|
5
|
+
require 'reactor/plans/delete_obj_class'
|
6
|
+
require 'reactor/plans/update_obj_class'
|
7
|
+
require 'reactor/plans/rename_obj_class'
|
8
|
+
require 'reactor/plans/create_attribute'
|
9
|
+
require 'reactor/plans/delete_attribute'
|
10
|
+
require 'reactor/plans/update_attribute'
|
11
|
+
require 'reactor/plans/create_group'
|
12
|
+
require 'reactor/plans/update_group'
|
13
|
+
require 'reactor/plans/delete_group'
|
14
|
+
require 'reactor/plans/rename_group'
|
15
|
+
|
16
|
+
module Reactor
|
17
|
+
class Migration
|
18
|
+
METHODS = {
|
19
|
+
:create_obj => Plans::CreateObj,
|
20
|
+
:delete_obj => Plans::DeleteObj,
|
21
|
+
:update_obj => Plans::UpdateObj,
|
22
|
+
:create_class => Plans::CreateObjClass,
|
23
|
+
:delete_class => Plans::DeleteObjClass,
|
24
|
+
:update_class => Plans::UpdateObjClass,
|
25
|
+
:rename_class => Plans::RenameObjClass,
|
26
|
+
:create_attribute => Plans::CreateAttribute,
|
27
|
+
:delete_attribute => Plans::DeleteAttribute,
|
28
|
+
:update_attribute => Plans::UpdateAttribute,
|
29
|
+
:create_group => Plans::CreateGroup,
|
30
|
+
:delete_group => Plans::DeleteGroup,
|
31
|
+
:update_group => Plans::UpdateGroup,
|
32
|
+
:rename_group => Plans::RenameGroup,
|
33
|
+
}
|
34
|
+
|
35
|
+
def self.method_missing(name, *args, &block)
|
36
|
+
if METHODS.key? name.to_sym then
|
37
|
+
instance = init(name,*args)
|
38
|
+
plan(instance,&block)
|
39
|
+
prepare(instance)
|
40
|
+
migrate(instance)
|
41
|
+
else
|
42
|
+
super(name, *args, &block)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.respond_to?(name)
|
47
|
+
METHODS.key?(name.to_sym) || super(name)
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.contains(*args)
|
51
|
+
@contained ||= []
|
52
|
+
args.flatten.each do |arg|
|
53
|
+
migration_num = arg.to_i.to_s
|
54
|
+
@contained << migration_num
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.contained
|
59
|
+
@contained || []
|
60
|
+
end
|
61
|
+
|
62
|
+
protected
|
63
|
+
def self.init(name,*args)
|
64
|
+
METHODS[name.to_sym].new(*args)
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.plan(instance,&block)
|
68
|
+
instance.instance_eval(&block) if block_given?
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.prepare(instance)
|
72
|
+
instance.prepare! if instance.respond_to? :prepare!
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.migrate(instance)
|
76
|
+
instance.migrate!
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
def initialize ; end
|
81
|
+
end
|
82
|
+
end
|