infopark_reactor 1.20.0 → 1.20.1
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.
- checksums.yaml +4 -4
- data/lib/reactor/attributes.rb +40 -5
- data/lib/reactor/cm/obj.rb +46 -24
- data/lib/reactor/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 454dbe710b4633a4ed51766bbff6715c3fc61389
|
4
|
+
data.tar.gz: 9bfab36ff12db044a67d43bb2af6949064621d86
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 544e8f98979aa61bd01a1b67452c52f33fc46c4acd75ec3120266556b083aba990ba191244f9bc6fba7e43a3a2ea92471bfc8fde8b0dea4fbe129379e3e09d0d
|
7
|
+
data.tar.gz: 22bad39cdab60ca1d9ce6ab0dac9a4a0d67e788a189c22ab883e279689d60500fd066d525157d7466d51def0bc8a764cda7176ddad6ca89b3aa65b1428fdd690
|
data/lib/reactor/attributes.rb
CHANGED
@@ -103,8 +103,17 @@ module Reactor
|
|
103
103
|
end
|
104
104
|
EOC
|
105
105
|
end
|
106
|
+
|
107
|
+
# active model dirty tracking
|
108
|
+
attribute_methods << <<-EOC
|
109
|
+
def #{attribute}_changed?
|
110
|
+
attribute_changed?(:#{attribute})
|
111
|
+
end
|
112
|
+
EOC
|
106
113
|
end
|
107
114
|
|
115
|
+
|
116
|
+
|
108
117
|
[:contentType].each do |attribute|
|
109
118
|
writers << attribute.to_sym
|
110
119
|
writers << attribute.to_s.underscore.to_sym
|
@@ -225,6 +234,18 @@ module Reactor
|
|
225
234
|
self[:channels] || []
|
226
235
|
end
|
227
236
|
|
237
|
+
def body_changed?
|
238
|
+
attribute_changed?(:body)
|
239
|
+
end
|
240
|
+
|
241
|
+
def title_changed?
|
242
|
+
attribute_changed?(:title)
|
243
|
+
end
|
244
|
+
|
245
|
+
def channels_changed?
|
246
|
+
attribute_changed?(:channels)
|
247
|
+
end
|
248
|
+
|
228
249
|
# Sets given attribute, to given value. Converts values if neccessary
|
229
250
|
# @see [Reactor::Attributes]
|
230
251
|
# @note options are passed to underlying xml interface, but as of now have no effect
|
@@ -239,8 +260,7 @@ module Reactor
|
|
239
260
|
formated_value = serialize_value(key, value)
|
240
261
|
crul_set(attr, formated_value, options)
|
241
262
|
|
242
|
-
|
243
|
-
|
263
|
+
__track_dirty_attribute(key)
|
244
264
|
active_record_set(key, formated_value) if active_record_attr?(key)
|
245
265
|
rails_connector_set(key, formated_value)
|
246
266
|
|
@@ -355,15 +375,30 @@ module Reactor
|
|
355
375
|
attribute_type(attr) == :linklist
|
356
376
|
end
|
357
377
|
|
358
|
-
|
359
|
-
|
378
|
+
if Reactor.rails4_2?
|
379
|
+
def active_record_set(field, value)
|
360
380
|
@attributes.write_from_user(field.to_s, value)
|
361
|
-
|
381
|
+
end
|
382
|
+
else
|
383
|
+
def active_record_set(field, value)
|
362
384
|
@attributes_cache.delete(field.to_s)
|
363
385
|
@attributes[field.to_s] = value
|
364
386
|
end
|
365
387
|
end
|
366
388
|
|
389
|
+
if Reactor.rails4_2? || Reactor.rails4_1?
|
390
|
+
def __track_dirty_attribute(key)
|
391
|
+
__send__(:attribute_will_change!, key.to_s)
|
392
|
+
end
|
393
|
+
else
|
394
|
+
def __track_dirty_attribute(key)
|
395
|
+
# in rails versions <= Rails 4.0 sometimes the first option
|
396
|
+
# and sometimes the second option is used
|
397
|
+
__send__(:attribute_will_change!, key.to_s)
|
398
|
+
__send__(:attribute_will_change!, key.to_sym)
|
399
|
+
end
|
400
|
+
end
|
401
|
+
|
367
402
|
# Lazily sets values for crul interface. May be removed in later versions
|
368
403
|
def crul_set(field, value, options)
|
369
404
|
@__crul_attributes ||= {}
|
data/lib/reactor/cm/obj.rb
CHANGED
@@ -151,33 +151,55 @@ module Reactor
|
|
151
151
|
|
152
152
|
skip_version_creation = @attrs.empty? && links_to_remove.empty? && links_to_set.empty? && !links_modified
|
153
153
|
|
154
|
-
# The save procedure consists of
|
155
|
-
#
|
156
|
-
# a. Execute take to assign the edited content to the current user
|
157
|
-
# b. Execute edit to create an edited content if there is none present
|
158
|
-
# c. Set object attributes (name, permalink, etc.)
|
159
|
-
# d. Set content attributes (title, body etc. + custom attributes)
|
160
|
-
# e. Resolve all links in *html* attributes
|
161
|
-
# Second request (overwrite linklists):
|
162
|
-
# f. Remove superflous links
|
163
|
-
# g. Overwrite existing links
|
164
|
-
# h. Add missing links
|
154
|
+
# The save procedure consists of two multiplexed CM requests.
|
155
|
+
# Each request combines multiple operations for better performance.
|
165
156
|
#
|
166
|
-
#
|
167
|
-
#
|
157
|
+
# It is necessary to split the procedure into two request because
|
158
|
+
# of the linklist handling. For objects with only released content
|
159
|
+
# the edit operation copies all links (and generates new ids).
|
160
|
+
# Only the new links from the edited content can be manipulated.
|
161
|
+
# Thus it is neccessary after perform a read of links after the
|
162
|
+
# edit operation.
|
168
163
|
#
|
169
|
-
#
|
170
|
-
#
|
164
|
+
# The second request may seem strange and redundant, but has very
|
165
|
+
# important reasons for being structured the way it is.
|
166
|
+
# The CM in all versions (as of this moment <= 7.0.1) contains
|
167
|
+
# multiple race conditions regarding slave workers and the CRUL
|
168
|
+
# interface.
|
171
169
|
#
|
172
|
-
# It
|
173
|
-
#
|
174
|
-
#
|
175
|
-
#
|
176
|
-
#
|
177
|
-
#
|
178
|
-
# to
|
179
|
-
#
|
180
|
-
|
170
|
+
# It is possible that the two requests are processed by two different
|
171
|
+
# slave workers which have an invalid cache. Without careful
|
172
|
+
# programing it may lead to unexpected results and/or data loss.
|
173
|
+
# The reason behind it is simple: the cache invalidate requests
|
174
|
+
# are distributed asynchronously between workers.
|
175
|
+
#
|
176
|
+
# It is impossible to ensure that the two requests are processed
|
177
|
+
# by the same worker: a worker may get killed at any time, without
|
178
|
+
# warning (producing errors on keep-alive connections). Furthermore
|
179
|
+
# the workers regularly kill themselves (after X processed requests)
|
180
|
+
# to contain memory leaks.
|
181
|
+
#
|
182
|
+
# Following cases are especially important to handle correctly:
|
183
|
+
# Let Slave 1 be the worker receiving the first request and Slave 2
|
184
|
+
# be the worker receiving the second request. Let Object be the
|
185
|
+
# object on which the save operation is performed.
|
186
|
+
#
|
187
|
+
# 1. If the Object contains only released version, then Slave 2
|
188
|
+
# may be unaware of the newly created edited version by the time
|
189
|
+
# the second request is being processed. Thefore all operations
|
190
|
+
# involving indirect content references for example adding links
|
191
|
+
# (obj where ... editedContent addLinkTo) would get rejected
|
192
|
+
# by the Slave 2.
|
193
|
+
#
|
194
|
+
# 2. If the Object contains an edited version, then Slave 2 may
|
195
|
+
# be unaware of the changes perfomed on it, change of editor for
|
196
|
+
# example, and can reject valid requests. The more dramatic
|
197
|
+
# scenario involves Slave 2 persisting its invalid cached content
|
198
|
+
# which would result in a data loss.
|
199
|
+
#
|
200
|
+
# The requests have been thus crafted to deal with those problems.
|
201
|
+
# The solution is based on the precise source-code level knowledge
|
202
|
+
# of the CM internals.
|
181
203
|
resp = MultiXmlRequest.execute do |reqs|
|
182
204
|
reqs.optional {|xml| SimpleCommandRequest.build(xml, @obj_id, 'take') } unless skip_version_creation
|
183
205
|
reqs.optional {|xml| SimpleCommandRequest.build(xml, @obj_id, 'edit') } unless skip_version_creation
|
data/lib/reactor/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: infopark_reactor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.20.
|
4
|
+
version: 1.20.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tomasz Przedmojski
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-01-
|
11
|
+
date: 2016-01-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|