infopark_reactor 1.10.0.beta → 1.11.0.beta2

Sign up to get free protection for your applications and to get access to all the features.
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