infopark_reactor 1.10.0.beta → 1.11.0.beta2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/app/models/rails_connector/abstract_model.rb +7 -0
  3. data/app/models/rails_connector/abstract_obj.rb +31 -0
  4. data/app/models/rails_connector/attribute.rb +94 -0
  5. data/app/models/rails_connector/blob_mapping.rb +12 -0
  6. data/app/models/rails_connector/channel.rb +41 -0
  7. data/app/models/rails_connector/content.rb +12 -0
  8. data/app/models/rails_connector/meta/eager_loader.rb +41 -0
  9. data/app/models/rails_connector/obj_class.rb +143 -0
  10. data/app/models/rails_connector/object_with_meta_data.rb +18 -0
  11. data/infopark_reactor.gemspec +4 -4
  12. data/lib/generators/cm/migration/USAGE +8 -0
  13. data/lib/generators/cm/migration/migration_generator.rb +16 -0
  14. data/lib/generators/cm/migration/templates/template.rb +8 -0
  15. data/lib/infopark_reactor.rb +35 -1
  16. data/lib/reactor/attributes.rb +2 -4
  17. data/lib/reactor/cm/attribute.rb +91 -0
  18. data/lib/reactor/cm/bridge.rb +50 -0
  19. data/lib/reactor/cm/channel.rb +18 -0
  20. data/lib/reactor/cm/editorial_group.rb +23 -0
  21. data/lib/reactor/cm/group.rb +241 -0
  22. data/lib/reactor/cm/language.rb +57 -0
  23. data/lib/reactor/cm/link.rb +136 -0
  24. data/lib/reactor/cm/live_group.rb +23 -0
  25. data/lib/reactor/cm/log_entry.rb +64 -0
  26. data/lib/reactor/cm/missing_credentials.rb +8 -0
  27. data/lib/reactor/cm/multi_xml_request.rb +102 -0
  28. data/lib/reactor/cm/obj.rb +544 -0
  29. data/lib/reactor/cm/obj_class.rb +187 -0
  30. data/lib/reactor/cm/object_base.rb +165 -0
  31. data/lib/reactor/cm/permissions.rb +44 -0
  32. data/lib/reactor/cm/user.rb +139 -0
  33. data/lib/reactor/cm/workflow.rb +41 -0
  34. data/lib/reactor/cm/xml_attribute.rb +36 -0
  35. data/lib/reactor/cm/xml_markup.rb +86 -0
  36. data/lib/reactor/cm/xml_multi_request_error.rb +10 -0
  37. data/lib/reactor/cm/xml_request.rb +83 -0
  38. data/lib/reactor/cm/xml_request_error.rb +11 -0
  39. data/lib/reactor/cm/xml_response.rb +43 -0
  40. data/lib/reactor/cm/xml_single_request_error.rb +21 -0
  41. data/lib/reactor/configuration.rb +8 -0
  42. data/lib/{engine.rb → reactor/engine.rb} +16 -1
  43. data/lib/reactor/legacy.rb +3 -3
  44. data/lib/reactor/link/temporary_link.rb +8 -4
  45. data/lib/reactor/migration.rb +87 -0
  46. data/lib/reactor/permission.rb +2 -2
  47. data/lib/reactor/persistence.rb +14 -12
  48. data/lib/reactor/plans/common_attribute.rb +33 -0
  49. data/lib/reactor/plans/common_channel.rb +32 -0
  50. data/lib/reactor/plans/common_group.rb +45 -0
  51. data/lib/reactor/plans/common_obj_class.rb +70 -0
  52. data/lib/reactor/plans/create_attribute.rb +33 -0
  53. data/lib/reactor/plans/create_channel.rb +24 -0
  54. data/lib/reactor/plans/create_group.rb +35 -0
  55. data/lib/reactor/plans/create_obj.rb +49 -0
  56. data/lib/reactor/plans/create_obj_class.rb +29 -0
  57. data/lib/reactor/plans/delete_attribute.rb +24 -0
  58. data/lib/reactor/plans/delete_channel.rb +22 -0
  59. data/lib/reactor/plans/delete_group.rb +29 -0
  60. data/lib/reactor/plans/delete_obj.rb +23 -0
  61. data/lib/reactor/plans/delete_obj_class.rb +23 -0
  62. data/lib/reactor/plans/prepared.rb +16 -0
  63. data/lib/reactor/plans/rename_group.rb +33 -0
  64. data/lib/reactor/plans/rename_obj_class.rb +25 -0
  65. data/lib/reactor/plans/update_attribute.rb +24 -0
  66. data/lib/reactor/plans/update_group.rb +31 -0
  67. data/lib/reactor/plans/update_obj.rb +31 -0
  68. data/lib/reactor/plans/update_obj_class.rb +27 -0
  69. data/lib/reactor/rails_connector_meta.rb +144 -0
  70. data/lib/reactor/tools/migrator.rb +136 -0
  71. data/lib/reactor/tools/response_handler/base.rb +23 -0
  72. data/lib/reactor/tools/response_handler/string.rb +20 -0
  73. data/lib/reactor/tools/response_handler/xml_attribute.rb +53 -0
  74. data/lib/reactor/tools/smart_xml_logger.rb +70 -0
  75. data/lib/reactor/tools/sower.rb +90 -0
  76. data/lib/reactor/tools/uploader.rb +134 -0
  77. data/lib/reactor/tools/versioner.rb +121 -0
  78. data/lib/reactor/tools/workflow_generator.rb +1 -1
  79. data/lib/reactor/tools/xml_attributes.rb +71 -0
  80. data/lib/reactor/version.rb +1 -1
  81. data/lib/tasks/cm_migrate.rake +8 -0
  82. data/lib/tasks/cm_seeds.rake +41 -0
  83. metadata +82 -13
  84. data/README.md +0 -186
@@ -0,0 +1,35 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'reactor/plans/common_group'
3
+
4
+ module Reactor
5
+
6
+ module Plans
7
+
8
+ class CreateGroup < CommonGroup
9
+
10
+ def initialize(*args)
11
+ super()
12
+
13
+ (name, _), options = separate_arguments(*args)
14
+
15
+ @name = name || options[:name]
16
+
17
+ set(:name, @name)
18
+ end
19
+
20
+ def prepare!
21
+ error('name is nil') if @name.nil?
22
+ error("group #{@name} already exists") if Reactor::Cm::Group.exists?(@name)
23
+
24
+ prepare_params!(nil)
25
+ end
26
+
27
+ def migrate!
28
+ Reactor::Cm::Group.create(@params)
29
+ end
30
+
31
+ end
32
+
33
+ end
34
+
35
+ end
@@ -0,0 +1,49 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module Reactor
3
+ module Plans
4
+ class CreateObj
5
+
6
+ def set(key, value)
7
+ @attrs[key.to_sym] = value
8
+ end
9
+
10
+ def initialize(opts={})
11
+ @name = opts[:name]
12
+ @parent = opts[:parent]
13
+ @objClass = opts[:objClass]
14
+ @attrs = {}
15
+ @ignoreExisting = opts[:ignoreExisting]
16
+ end
17
+
18
+ def prepare!
19
+ raise "#{self.class.name}: name is nil" if @name.nil?
20
+ raise "#{self.class.name}: parent is nil" if @parent.nil?
21
+ raise "#{self.class.name}: objClass is nil" if @objClass.nil?
22
+ raise "#{self.class.name}: parent does not exist" if not Reactor::Cm::Obj.exists?(@parent)
23
+ raise "#{self.class.name}: obj with name #{@name} already exists" if (!@ignoreExisting) && Reactor::Cm::Obj.exists?(path)
24
+ =begin
25
+ raise "#{self.class.name}: objClass #{@objClass} not found" if not Reactor::Cm::ObjClass.exists?(@objClass)
26
+ @attrs.keys.each do |attr|
27
+ raise "#{self.class.name}: attr #{attr} not found for objClass #{@objClass}" if not Reactor::Cm::ObjClass.has_attribute?(attr)
28
+ end
29
+ =end
30
+ # ...?
31
+ end
32
+
33
+ def migrate!
34
+ return true if (@ignoreExisting) && Reactor::Cm::Obj.exists?(path)
35
+ @obj = Cm::Obj.create(@name, @parent, @objClass)
36
+ @attrs.each do |key,value|
37
+ @obj.set(key,value)
38
+ end
39
+ @obj.save!
40
+ @obj.release!
41
+ end
42
+
43
+ def path
44
+ File.join(@parent, @name)
45
+ end
46
+
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,29 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'reactor/plans/common_obj_class'
3
+
4
+ module Reactor
5
+ module Plans
6
+ class CreateObjClass < CommonObjClass
7
+ def initialize(*args)
8
+ super()
9
+ (name, type), options = separate_arguments(*args)
10
+ @name = name || options[:name]
11
+ @type = type || options[:objType] || options[:type]
12
+ end
13
+
14
+ def prepare!
15
+ error("name is nil") if @name.nil?
16
+ error("type is nil") if @type.nil?
17
+ error("objClass #{@name} already exists") if Reactor::Cm::ObjClass.exists?(@name)
18
+ prepare_attrs!(nil)
19
+ prepare_params!(nil)
20
+ end
21
+
22
+ def migrate!
23
+ klass = Reactor::Cm::ObjClass.create(@name, @type)
24
+ migrate_attrs!(klass)
25
+ migrate_params!(klass)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,24 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module Reactor
3
+ module Plans
4
+ class DeleteAttribute < CommonAttribute
5
+ def initialize(*args)
6
+ super()
7
+ (name, x), options = separate_arguments(*args)
8
+ @name = name || options[:name]
9
+ end
10
+
11
+ def prepare!
12
+ error("name is nil") if @name.nil?
13
+ error("attribute #{@name} does not exist") if not Reactor::Cm::Attribute.exists?(@name)
14
+ # TODO: check used..
15
+ end
16
+
17
+ def migrate!
18
+ attrib = Reactor::Cm::Attribute.get(@name)
19
+ attrib.delete!
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,22 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module Reactor
3
+ module Plans
4
+ class DeleteChannel < CommonAttribute
5
+ def initialize(*args)
6
+ super()
7
+ (name, x), options = separate_arguments(*args)
8
+ @name = name || options[:name]
9
+ end
10
+
11
+ def prepare!
12
+ error("name is nil") if @name.nil?
13
+ error("channel #{@name} does not exist") if not Reactor::Cm::Channel.exists?(@name)
14
+ end
15
+
16
+ def migrate!
17
+ Reactor::Cm::Channel.get(@name).delete!
18
+ end
19
+
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,29 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module Reactor
3
+
4
+ module Plans
5
+
6
+ class DeleteGroup < CommonGroup
7
+
8
+ def initialize(*args)
9
+ super()
10
+
11
+ (name, _), options = separate_arguments(*args)
12
+ @name = name || options[:name]
13
+ end
14
+
15
+ def prepare!
16
+ error('name is nil') if @name.nil?
17
+ error("group #{@name} does not exist") unless Reactor::Cm::Group.exists?(@name)
18
+ end
19
+
20
+ def migrate!
21
+ group = Reactor::Cm::Group.get(@name)
22
+ group.delete!
23
+ end
24
+
25
+ end
26
+
27
+ end
28
+
29
+ end
@@ -0,0 +1,23 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'reactor/plans/prepared'
3
+
4
+ module Reactor
5
+ module Plans
6
+ class DeleteObj
7
+ include Prepared
8
+
9
+ def initialize(opts={})
10
+ @key = opts[:obj_id] || opts[:path]
11
+ end
12
+
13
+ def prepare!
14
+ error("object (key=#{@key}) not found") if not Reactor::Cm::Obj.exists?(@key)
15
+ end
16
+
17
+ def migrate!
18
+ obj = Reactor::Cm::Obj.get(@key)
19
+ obj.delete!
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module Reactor
3
+ module Plans
4
+ class DeleteObjClass < CommonObjClass
5
+ include Prepared
6
+
7
+ def initialize(*args)
8
+ super()
9
+ (name, x), options = separate_arguments(*args)
10
+ @name = name || options[:name]
11
+ end
12
+
13
+ def prepare!
14
+ error("objClass #{@name} not found") if not Reactor::Cm::ObjClass.exists?(@name)
15
+ end
16
+
17
+ def migrate!
18
+ klass = Reactor::Cm::ObjClass.get(@name)
19
+ klass.delete!
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,16 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module Reactor
3
+ module Plans
4
+ module Prepared
5
+ def error(message)
6
+ "#{self.class.name}: #{message}"
7
+ end
8
+
9
+ def separate_arguments(*args)
10
+ array_args = args.select {|a| !a.is_a?(Hash) }
11
+ hash_args = args.select {|a| a.is_a?(Hash) }.reduce({}, &:merge)
12
+ return array_args, hash_args
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,33 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module Reactor
3
+
4
+ module Plans
5
+
6
+ class RenameGroup
7
+
8
+ include Prepared
9
+
10
+ def initialize(*args)
11
+ (from, to), options = separate_arguments(*args)
12
+
13
+ @from = from || options[:from]
14
+ @to = to || options[:to]
15
+ end
16
+
17
+ def prepare!
18
+ error('from is nil') if @from.nil?
19
+ error('to is nil') if @to.nil?
20
+ error('from does not exist') unless Reactor::Cm::Group.exists?(@from)
21
+ error('to does exist') if Reactor::Cm::Group.exists?(@to)
22
+ end
23
+
24
+ def migrate!
25
+ group = Reactor::Cm::Group.get(@from)
26
+ group.rename!(@to)
27
+ end
28
+
29
+ end
30
+
31
+ end
32
+
33
+ end
@@ -0,0 +1,25 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module Reactor
3
+ module Plans
4
+ class RenameObjClass
5
+ include Prepared
6
+
7
+ def initialize(*args)
8
+ (from, to), options = separate_arguments(*args)
9
+ @from = from || options[:from]
10
+ @to = to || options[:to]
11
+ end
12
+
13
+ def prepare!
14
+ error("from is nil") if @from.nil?
15
+ error("to is nil") if @to.nil?
16
+ error("from does not exist") if not Reactor::Cm::ObjClass.exists?(@from)
17
+ error("to does exist") if Reactor::Cm::ObjClass.exists?(@to)
18
+ end
19
+
20
+ def migrate!
21
+ Reactor::Cm::ObjClass.rename(@from, @to)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,24 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module Reactor
3
+ module Plans
4
+ class UpdateAttribute < CommonAttribute
5
+ def initialize(*args)
6
+ super()
7
+ (name, x), options = separate_arguments(*args)
8
+ @name = name || options[:name]
9
+ end
10
+
11
+ def prepapre!
12
+ error("name is nil") if @name.nil?
13
+ error("attribute #{@name} not found") if not Reactor::Cm::Attribute.exists?(@name)
14
+ prepare_params!(nil)
15
+ end
16
+
17
+ def migrate!
18
+ attrib = Reactor::Cm::Attribute.get(@name)
19
+ migrate_params!(attrib)
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,31 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module Reactor
3
+
4
+ module Plans
5
+
6
+ class UpdateGroup < CommonGroup
7
+
8
+ def initialize(*args)
9
+ super()
10
+
11
+ (name, _), options = separate_arguments(*args)
12
+ @name = name || options[:name]
13
+ end
14
+
15
+ def prepapre!
16
+ error('name is nil') if @name.nil?
17
+ error("group #{@name} not found") unless Reactor::Cm::Group.exists?(@name)
18
+
19
+ prepare_params!(nil)
20
+ end
21
+
22
+ def migrate!
23
+ group = Reactor::Cm::Group.get(@name)
24
+ migrate_params!(group)
25
+ end
26
+
27
+ end
28
+
29
+ end
30
+
31
+ end
@@ -0,0 +1,31 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module Reactor
3
+ module Plans
4
+ class UpdateObj
5
+ include Prepared
6
+
7
+ def initialize(opts={})
8
+ @key = opts[:obj_id] || opts[:path]
9
+ @attrs = {}
10
+ end
11
+
12
+ def set(key, value)
13
+ @attrs[key.to_sym] = value
14
+ end
15
+
16
+ def prepare!
17
+ error("object (key=#{@key}) not found") if not Reactor::Cm::Obj.exists?(@key)
18
+ #TODO: attribute check
19
+ end
20
+
21
+ def migrate!
22
+ obj = Reactor::Cm::Obj.get(@key)
23
+ @attrs.each do |key,value|
24
+ @obj.set(key,value)
25
+ end
26
+ @obj.save!
27
+ @obj.release!
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,27 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module Reactor
3
+ module Plans
4
+ class UpdateObjClass < CommonObjClass
5
+ include Prepared
6
+
7
+ def initialize(*args)
8
+ super()
9
+ (name, x), options = separate_arguments(*args)
10
+ @name = name || options[:name]
11
+ end
12
+
13
+ def prepare!
14
+ error("objClass #{@name} not found") if Reactor::Cm::ObjClass.exists?(@name)
15
+ @klass = Reactor::Cm::ObjClass.get(@name)
16
+ prepare_attrs!(@klass)
17
+ prepare_params!(@klass)
18
+ end
19
+
20
+ def migrate!
21
+ migrate_attrs!(@klass)
22
+ migrate_params!(@klass)
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,144 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module RailsConnector
3
+
4
+ module Meta
5
+
6
+ # This method is an equivalent of Rails.logger.silence, which has been deprecated
7
+ def self.hello_im_rails_and_im_retarted_so_please_be_patient(&block)
8
+ begin
9
+ old_logger_level, Rails.logger.level = Rails.logger.level, Logger::ERROR
10
+ yield self
11
+ ensure
12
+ Rails.logger.level = old_logger_level
13
+ end
14
+ end
15
+
16
+ def self.included(base) #:nodoc:
17
+ # Class enhancements
18
+ base.extend(ClassMethods)
19
+ end
20
+
21
+ # The RailsConnector::ObjClass object for this file format.
22
+ # This will always return a proper object, even if no custom
23
+ # Ruby class exists.
24
+ def obj_class_definition
25
+ @obj_class_definition ||= RailsConnector::Meta::EagerLoader.instance.obj_class(self.obj_class)
26
+ end
27
+ alias_method :obj_class_def, :obj_class_definition
28
+
29
+ # Returns true, if there is a custom Ruby class defined for the object
30
+ # or false, if it is represented by RailsConnector::Obj
31
+ def has_custom_ruby_class?
32
+ self.class.is_custom_ruby_class?
33
+ end
34
+
35
+ # Returns the custom attributes in the form of a Hash.
36
+ def custom_attributes
37
+ self.obj_class_definition.custom_attributes
38
+ end
39
+
40
+ # Returns true, if the file format has an attribute of the given name.
41
+ def custom_attribute?(attr)
42
+ self.obj_class_definition.custom_attribute?(attr)
43
+ end
44
+
45
+ # Returns an Array of String of all mandatory attributes, no mather if it's
46
+ # custom or built-in. Built-in attributes are underscored (valid_from,
47
+ # not validFrom).
48
+ # Possible +options+ are:
49
+ # <tt>:only_custom_attributes</tt>:: Return only custom attributes, omit
50
+ # built-in attributes like content_type or valid_from.
51
+ def mandatory_attribute_names(options = {})
52
+ self.obj_class_definition.mandatory_attribute_names(options)
53
+ end
54
+
55
+ # Returns true, if the file format has an mandatory attribute of the given name.
56
+ def mandatory_attribute?(attr)
57
+ self.obj_class_definition.mandatory_attribute?(attr)
58
+ end
59
+
60
+ # Returns the version of this object. This number is increased every time
61
+ # this object is released.
62
+ def version
63
+ load_meta_details
64
+ @object_with_meta_data.version.presence.to_i || 0
65
+ end
66
+
67
+ # Returns the time of the reminder, if it is set.
68
+ def reminder_from
69
+ load_meta_details
70
+ @object_with_meta_data.reminder_from.presence &&
71
+ ::RailsConnector::DateAttribute.parse(@object_with_meta_data.reminder_from)
72
+ end
73
+
74
+ # Returns the reminder comment, if a reminder is set.
75
+ def reminder_comment
76
+ load_meta_details
77
+ @object_with_meta_data.reminder_comment
78
+ end
79
+
80
+ # Return the name of the workflow, that is assigned to this object.
81
+ def workflow_name
82
+ load_meta_details
83
+ @object_with_meta_data.workflow_name
84
+ end
85
+
86
+ # Return the current editor as a String. If there is no edited content,
87
+ # which is always the case in live mode, an empty String is returned.
88
+ # The 'contents' table is queried for this information.
89
+ def editor
90
+ return @editor if @editor
91
+
92
+ load_meta_details
93
+
94
+ content_id = if self.edited?
95
+ @object_with_meta_data.edited_content_id
96
+ else
97
+ @object_with_meta_data.released_cont_id
98
+ end
99
+
100
+ if content_id
101
+ content = RailsConnector::Content.find(content_id)
102
+ @editor = content.editor
103
+ else
104
+ @editor = ''
105
+ end
106
+ end
107
+
108
+ private
109
+
110
+ # Load the objects details from the `objects' tables.
111
+ def load_meta_details #:nodoc:
112
+ return if @object_with_meta_data
113
+
114
+ @object_with_meta_data = RailsConnector::ObjectWithMetaData.find(self.id)
115
+
116
+ # reset depending instance variables
117
+ @editor = nil
118
+ end
119
+
120
+
121
+ # the methods in this module will become class methods
122
+ module ClassMethods
123
+
124
+ # The RailsConnector::ObjClass object for this file format.
125
+ # This will only return a proper object if a custom Ruby class exists
126
+ # and will throw a RuntimeError otherwise.
127
+ def obj_class_definition
128
+ raise "Obtaining the obj_class_definition of an Obj without custom Ruby class " \
129
+ "is logically impossible." unless is_custom_ruby_class?
130
+ # @obj_class_definition ||= RailsConnector::ObjClass.find_by_name(self.name)
131
+ @obj_class_definition ||= RailsConnector::Meta::EagerLoader.instance.obj_class(self.name)
132
+ end
133
+ alias_method :obj_class_def, :obj_class_definition
134
+
135
+ # RailsConnector::AbstractObj returns false, everything else true.
136
+ def is_custom_ruby_class?
137
+ self != RailsConnector::AbstractObj
138
+ end
139
+
140
+ end
141
+
142
+ end
143
+
144
+ end