infopark_cloud_connector 6.8.3.115.227021242 → 6.8.3.174.51542603
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/rails_connector/basic_obj.rb +1 -2
- data/lib/rails_connector/blob.rb +19 -52
- data/lib/rails_connector/cache_middleware.rb +0 -1
- data/lib/rails_connector/cms_backend.rb +179 -17
- data/lib/rails_connector/model_identity.rb +13 -0
- data/lib/rails_connector/workspace.rb +2 -11
- metadata +4 -49
- data/lib/rails_connector/chain.rb +0 -175
- data/lib/rails_connector/cms_base_model.rb +0 -55
- data/lib/rails_connector/content_cache.rb +0 -23
- data/lib/rails_connector/dict_storage.rb +0 -66
- data/lib/rails_connector/dynamo_cms_backend.rb +0 -136
- data/lib/rails_connector/obj_data_from_database.rb +0 -109
- data/lib/rails_connector/path_conversion.rb +0 -21
- data/lib/rails_connector/permission.rb +0 -39
- data/lib/rails_connector/revision.rb +0 -75
- data/lib/rails_connector/s3_blob.rb +0 -89
- data/lib/rails_connector/service_blob.rb +0 -48
- data/lib/rails_connector/service_cms_backend.rb +0 -194
- data/lib/rails_connector/version.rb +0 -38
- data/lib/rails_connector/workspace_data_from_database.rb +0 -19
@@ -1,16 +1,15 @@
|
|
1
1
|
require 'json'
|
2
2
|
require 'ostruct'
|
3
|
-
require 'kvom'
|
4
3
|
|
5
4
|
module RailsConnector
|
6
5
|
# The CMS file class
|
7
6
|
# @api public
|
8
7
|
class BasicObj
|
9
8
|
extend ActiveModel::Naming
|
10
|
-
include Kvom::ModelIdentity
|
11
9
|
|
12
10
|
include DateAttribute
|
13
11
|
include SEO
|
12
|
+
include ModelIdentity
|
14
13
|
|
15
14
|
# Create a new Obj instance with the given values and attributes.
|
16
15
|
# Normally this method should not be used.
|
data/lib/rails_connector/blob.rb
CHANGED
@@ -1,81 +1,48 @@
|
|
1
|
-
require "aws-sdk"
|
2
|
-
|
3
1
|
module RailsConnector
|
4
2
|
|
3
|
+
# TODO Caching:
|
4
|
+
# unlimited urls: ewig
|
5
|
+
# limited urls: zeitlimit - x (x fuer mindestverwendbarkeitszeit)
|
5
6
|
class Blob
|
6
7
|
|
7
8
|
class << self
|
8
|
-
def find(id)
|
9
|
-
new(blob_class.find(id))
|
10
|
-
end
|
11
|
-
|
12
|
-
def config
|
13
|
-
@config or raise "Blob storage has not been configured yet"
|
14
|
-
end
|
15
|
-
|
16
|
-
def configure(spec)
|
17
|
-
@config = spec.symbolize_keys
|
18
|
-
@blob_class = nil
|
19
|
-
end
|
20
|
-
|
21
|
-
def blob_class
|
22
|
-
@blob_class ||= blob_class_from_config
|
23
|
-
end
|
24
9
|
|
25
|
-
|
26
|
-
def reset_blob_class_cache
|
27
|
-
@blob_class = nil
|
10
|
+
def configure(config)
|
28
11
|
end
|
29
12
|
|
30
|
-
def
|
31
|
-
|
13
|
+
def find(id)
|
14
|
+
new(id)
|
32
15
|
end
|
33
16
|
|
34
|
-
private
|
35
|
-
|
36
|
-
def blob_class_from_config
|
37
|
-
blob_class =
|
38
|
-
case config[:type].to_sym
|
39
|
-
when :s3
|
40
|
-
S3Blob
|
41
|
-
when :service
|
42
|
-
ServiceBlob
|
43
|
-
else
|
44
|
-
raise "Unsupported blob storage type #{config[:type]}"
|
45
|
-
end
|
46
|
-
blob_class.configure(config)
|
47
|
-
blob_class
|
48
|
-
end
|
49
17
|
end
|
50
18
|
|
51
|
-
|
52
|
-
@instance = blob_instance
|
53
|
-
end
|
19
|
+
attr_reader :id
|
54
20
|
|
55
|
-
def id
|
56
|
-
|
21
|
+
def initialize(id)
|
22
|
+
@id = id
|
57
23
|
end
|
58
24
|
|
59
25
|
def url
|
60
|
-
|
61
|
-
end
|
62
|
-
|
63
|
-
def meta_url
|
64
|
-
instance.meta_url
|
26
|
+
raw_data["url"]
|
65
27
|
end
|
66
28
|
|
67
29
|
def content_type
|
68
|
-
|
30
|
+
meta_data[:content_type]
|
69
31
|
end
|
70
32
|
|
71
33
|
def length
|
72
|
-
|
34
|
+
meta_data[:content_length].to_i
|
73
35
|
end
|
74
36
|
|
75
37
|
private
|
76
38
|
|
77
|
-
|
39
|
+
def raw_data
|
40
|
+
@raw_data ||= CmsBackend.find_blob_data_by_id(id)
|
41
|
+
end
|
78
42
|
|
43
|
+
def meta_data
|
44
|
+
@meta_data ||= RestClient.head(raw_data["meta_url"]).headers
|
45
|
+
end
|
79
46
|
end
|
80
47
|
|
81
|
-
end
|
48
|
+
end
|
@@ -1,39 +1,201 @@
|
|
1
|
+
require 'rest_client'
|
2
|
+
|
1
3
|
module RailsConnector
|
2
4
|
|
5
|
+
class ContentServiceObjQueries
|
6
|
+
def initialize(queries)
|
7
|
+
@queries = queries
|
8
|
+
@open_queries = queries.dup
|
9
|
+
@results = {}
|
10
|
+
end
|
11
|
+
|
12
|
+
def open_queries
|
13
|
+
@open_queries[0..99]
|
14
|
+
end
|
15
|
+
|
16
|
+
def handle_response(response)
|
17
|
+
objs = {}
|
18
|
+
response["objs"].each do |obj|
|
19
|
+
objs[obj["_id"].first] = obj
|
20
|
+
end
|
21
|
+
|
22
|
+
queries_to_delete = []
|
23
|
+
response["results"].each_with_index do |response, i|
|
24
|
+
query = @open_queries[i]
|
25
|
+
if response["continuation_handle"]
|
26
|
+
query[:continuation_handle] = response["continuation_handle"]
|
27
|
+
else
|
28
|
+
queries_to_delete << i
|
29
|
+
end
|
30
|
+
result = (@results[query.__id__] ||= [])
|
31
|
+
response["refs"].each do |obj_ref|
|
32
|
+
id = obj_ref["id"]
|
33
|
+
# TODO fetch missing ObjData from Service
|
34
|
+
result << (objs[id] or raise "Data for Obj with id #{id} missing!")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
queries_to_delete.reverse_each {|i| @open_queries.delete_at(i) }
|
38
|
+
end
|
39
|
+
|
40
|
+
def results
|
41
|
+
@queries.map {|query| @results[query.__id__] || [] }
|
42
|
+
end
|
43
|
+
|
44
|
+
def finished?
|
45
|
+
open_queries.empty?
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# connects the cloud connector to the connector service
|
3
50
|
class CmsBackend
|
51
|
+
BLOB_DATA_CACHE_PREFIX = 'blob_data'.freeze
|
52
|
+
VALID_INDEX_NAMES = %w[id path ppath permalink].freeze
|
4
53
|
|
5
|
-
|
6
|
-
|
7
|
-
|
54
|
+
class << self
|
55
|
+
def instance
|
56
|
+
@instance ||= new
|
8
57
|
end
|
58
|
+
|
59
|
+
delegate :begin_caching, :end_caching, :caching?, :query_counter, :find_workspace_data_by_id,
|
60
|
+
:find_obj_data_by, :find_blob_data_by_id, to: :instance
|
61
|
+
end
|
62
|
+
|
63
|
+
def initialize
|
64
|
+
@query_counter = 0
|
9
65
|
end
|
10
66
|
|
11
|
-
def
|
12
|
-
|
67
|
+
def begin_caching
|
68
|
+
@caching = true
|
13
69
|
end
|
14
70
|
|
15
|
-
def
|
16
|
-
|
71
|
+
def end_caching
|
72
|
+
CmsCacheStorage.cache.clear
|
73
|
+
@caching = false
|
17
74
|
end
|
18
75
|
|
19
|
-
def
|
20
|
-
|
76
|
+
def caching?
|
77
|
+
!!@caching
|
78
|
+
end
|
79
|
+
|
80
|
+
def query_counter
|
81
|
+
@query_counter
|
82
|
+
end
|
83
|
+
|
84
|
+
def find_workspace_data_by_id(id)
|
85
|
+
from_content_state_id = ContentStateCaching.find_content_state_id(id)
|
86
|
+
request_params = {:workspace_id => id}
|
87
|
+
request_params[:content_state_id] = from_content_state_id if from_content_state_id
|
88
|
+
raw_data = ContentService.query('workspaces/query', request_params)
|
89
|
+
if raw_workspace_data = raw_data['workspace']
|
90
|
+
workspace_data = WorkspaceDataFromService.new(raw_workspace_data)
|
91
|
+
if from_content_state_id != workspace_data.content_state_id
|
92
|
+
ContentStateCaching.store_content_state(workspace_data)
|
93
|
+
ContentStateCaching.store_content_state_id(workspace_data.id,
|
94
|
+
workspace_data.content_state_id)
|
95
|
+
end
|
96
|
+
workspace_data
|
97
|
+
end
|
21
98
|
end
|
22
99
|
|
23
|
-
def
|
24
|
-
|
100
|
+
def find_obj_data_by(workspace_data, index, keys)
|
101
|
+
index = index.to_s
|
102
|
+
assert_valid_index_name(index)
|
103
|
+
raw_data = find_raw_data_from_cache_or_database_by(workspace_data, index, keys)
|
104
|
+
raw_data.map do |raw_list|
|
105
|
+
raw_list.map do |raw_obj_data|
|
106
|
+
ObjDataFromService.new(raw_obj_data)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def find_blob_data_by_id(id)
|
112
|
+
cache_key = "#{BLOB_DATA_CACHE_PREFIX}/#{id}"
|
113
|
+
if data_from_cache = CmsCacheStorage.cache.read(cache_key)
|
114
|
+
data_from_cache
|
115
|
+
else
|
116
|
+
data_from_database = find_blob_data_from_database_by(id)
|
117
|
+
if maxage = data_from_database['maxage']
|
118
|
+
CmsCacheStorage.cache.write(cache_key, data_from_database, :expires_in => maxage)
|
119
|
+
end
|
120
|
+
data_from_database
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
private
|
125
|
+
|
126
|
+
def find_raw_data_from_cache_or_database_by(workspace_data, index, keys)
|
127
|
+
keys_from_database = []
|
128
|
+
# load results from cache
|
129
|
+
results_from_cache = keys.map do |key|
|
130
|
+
find_raw_data_from_cache_by(workspace_data, index, key).tap do |objs|
|
131
|
+
keys_from_database << key unless objs
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
# load cache misses from database and store them in cache
|
136
|
+
results_from_database =
|
137
|
+
find_raw_data_from_database_by(workspace_data, index, keys_from_database)
|
138
|
+
keys_from_database.each_with_index do |key, key_number|
|
139
|
+
store_raw_data_list_in_cache(workspace_data, index, key, results_from_database[key_number])
|
140
|
+
end
|
141
|
+
|
142
|
+
# combine the results
|
143
|
+
results_from_cache.map do |objs_from_cache|
|
144
|
+
objs_from_cache || results_from_database.shift
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def find_raw_data_from_cache_by(workspace_data, index, key)
|
149
|
+
ContentStateCaching.find_obj_data(workspace_data, index, key) if caching?
|
150
|
+
end
|
151
|
+
|
152
|
+
def find_raw_data_from_database_by(workspace_data, index, keys)
|
153
|
+
return [] if keys.blank?
|
154
|
+
instrumenter = ActiveSupport::Notifications.instrumenter
|
155
|
+
instrumenter.instrument(
|
156
|
+
"cms_load.rails_connector", :name => "Obj Load", :index => index, :keys => keys
|
157
|
+
) do
|
158
|
+
@query_counter += 1
|
159
|
+
queries = ContentServiceObjQueries.new(keys.map {|key| {:type => index, :param => key} })
|
160
|
+
until queries.finished?
|
161
|
+
queries.handle_response(ContentService.query(
|
162
|
+
"objs/query",
|
163
|
+
:queries => queries.open_queries,
|
164
|
+
:workspace_id => workspace_data.id,
|
165
|
+
:revision_id => workspace_data.revision_id
|
166
|
+
))
|
167
|
+
end
|
168
|
+
queries.results
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
UNIQUE_INDICES = [:id, :path, :permalink].freeze
|
173
|
+
|
174
|
+
def store_raw_data_list_in_cache(workspace_data, index, key, raw_data_list)
|
175
|
+
raw_data_list.each do |values|
|
176
|
+
UNIQUE_INDICES.each do |unique_index|
|
177
|
+
unique_index_values = values["_#{unique_index}"]
|
178
|
+
if unique_index_values.present?
|
179
|
+
store_item_in_cache(workspace_data, unique_index, unique_index_values.first, [values])
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
unless UNIQUE_INDICES.include?(index)
|
184
|
+
store_item_in_cache(workspace_data, index, key, raw_data_list)
|
185
|
+
end
|
25
186
|
end
|
26
187
|
|
27
|
-
def
|
28
|
-
|
188
|
+
def store_item_in_cache(workspace_data, index, key, item)
|
189
|
+
ContentStateCaching.store_obj_data(workspace_data, index, key, item)
|
29
190
|
end
|
30
191
|
|
31
|
-
def
|
32
|
-
|
192
|
+
def find_blob_data_from_database_by(id)
|
193
|
+
@query_counter += 1
|
194
|
+
ContentService.query('blobs/query', :blob_ids => [id])['blobs'][id]
|
33
195
|
end
|
34
196
|
|
35
|
-
def
|
36
|
-
|
197
|
+
def assert_valid_index_name(index)
|
198
|
+
raise ArgumentError, "invalid index name '#{index}'" unless VALID_INDEX_NAMES.include?(index)
|
37
199
|
end
|
38
200
|
|
39
201
|
end
|
@@ -2,7 +2,8 @@ module RailsConnector
|
|
2
2
|
|
3
3
|
class Workspace
|
4
4
|
extend ActiveModel::Naming
|
5
|
-
|
5
|
+
|
6
|
+
include ModelIdentity
|
6
7
|
|
7
8
|
def self.current=(workspace_or_proc)
|
8
9
|
@current = workspace_or_proc
|
@@ -44,16 +45,6 @@ class Workspace
|
|
44
45
|
@workspace_data
|
45
46
|
end
|
46
47
|
|
47
|
-
# only available with direct access to dynamo
|
48
|
-
def revision
|
49
|
-
@workspace_data.revision
|
50
|
-
end
|
51
|
-
|
52
|
-
# only available with direct access to dynamo
|
53
|
-
def content_cache_id=(id)
|
54
|
-
@workspace_data.content_cache_id = id
|
55
|
-
end
|
56
|
-
|
57
48
|
def published?
|
58
49
|
self.id == 'published'
|
59
50
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: infopark_cloud_connector
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.8.3.
|
4
|
+
version: 6.8.3.174.51542603
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,24 +9,8 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-03-
|
12
|
+
date: 2013-03-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
-
- !ruby/object:Gem::Dependency
|
15
|
-
name: aws-sdk
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
|
-
requirements:
|
19
|
-
- - ~>
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: 1.3.6
|
22
|
-
type: :runtime
|
23
|
-
prerelease: false
|
24
|
-
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- - ~>
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: 1.3.6
|
30
14
|
- !ruby/object:Gem::Dependency
|
31
15
|
name: rest-client
|
32
16
|
requirement: !ruby/object:Gem::Requirement
|
@@ -75,22 +59,6 @@ dependencies:
|
|
75
59
|
- - ~>
|
76
60
|
- !ruby/object:Gem::Version
|
77
61
|
version: 2.3.2
|
78
|
-
- !ruby/object:Gem::Dependency
|
79
|
-
name: kvom
|
80
|
-
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
|
-
requirements:
|
83
|
-
- - '='
|
84
|
-
- !ruby/object:Gem::Version
|
85
|
-
version: 6.8.3.115.227021242
|
86
|
-
type: :runtime
|
87
|
-
prerelease: false
|
88
|
-
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
|
-
requirements:
|
91
|
-
- - '='
|
92
|
-
- !ruby/object:Gem::Version
|
93
|
-
version: 6.8.3.115.227021242
|
94
62
|
description: The Cloud Connector for Infopark CMS Fiona enables you to develop modern,
|
95
63
|
dynamic Web 2.0 applications using Ruby on Rails and at the same time display CMS
|
96
64
|
managed content.
|
@@ -121,15 +89,12 @@ files:
|
|
121
89
|
- lib/rails_connector/blob.rb
|
122
90
|
- lib/rails_connector/cache.rb
|
123
91
|
- lib/rails_connector/cache_middleware.rb
|
124
|
-
- lib/rails_connector/chain.rb
|
125
92
|
- lib/rails_connector/client_error.rb
|
126
93
|
- lib/rails_connector/cloud_engine.rb
|
127
94
|
- lib/rails_connector/cms_api_search_request.rb
|
128
95
|
- lib/rails_connector/cms_backend.rb
|
129
|
-
- lib/rails_connector/cms_base_model.rb
|
130
96
|
- lib/rails_connector/cms_cache_storage.rb
|
131
97
|
- lib/rails_connector/cms_rest_api.rb
|
132
|
-
- lib/rails_connector/content_cache.rb
|
133
98
|
- lib/rails_connector/content_conversion.rb
|
134
99
|
- lib/rails_connector/content_service.rb
|
135
100
|
- lib/rails_connector/content_state.rb
|
@@ -138,8 +103,6 @@ files:
|
|
138
103
|
- lib/rails_connector/controller_runtime.rb
|
139
104
|
- lib/rails_connector/date_attribute.rb
|
140
105
|
- lib/rails_connector/default_search_request.rb
|
141
|
-
- lib/rails_connector/dict_storage.rb
|
142
|
-
- lib/rails_connector/dynamo_cms_backend.rb
|
143
106
|
- lib/rails_connector/elasticsearch_request.rb
|
144
107
|
- lib/rails_connector/errors.rb
|
145
108
|
- lib/rails_connector/link.rb
|
@@ -152,22 +115,14 @@ files:
|
|
152
115
|
- lib/rails_connector/migrations/migration_store.rb
|
153
116
|
- lib/rails_connector/migrations/migrator.rb
|
154
117
|
- lib/rails_connector/migrations/workspace_lock.rb
|
118
|
+
- lib/rails_connector/model_identity.rb
|
155
119
|
- lib/rails_connector/named_link.rb
|
156
120
|
- lib/rails_connector/obj_data.rb
|
157
|
-
- lib/rails_connector/obj_data_from_database.rb
|
158
121
|
- lib/rails_connector/obj_data_from_hash.rb
|
159
122
|
- lib/rails_connector/obj_data_from_service.rb
|
160
123
|
- lib/rails_connector/obj_search_enumerator.rb
|
161
|
-
- lib/rails_connector/path_conversion.rb
|
162
|
-
- lib/rails_connector/permission.rb
|
163
124
|
- lib/rails_connector/rack_middlewares.rb
|
164
|
-
- lib/rails_connector/revision.rb
|
165
|
-
- lib/rails_connector/s3_blob.rb
|
166
|
-
- lib/rails_connector/service_blob.rb
|
167
|
-
- lib/rails_connector/service_cms_backend.rb
|
168
|
-
- lib/rails_connector/version.rb
|
169
125
|
- lib/rails_connector/workspace.rb
|
170
|
-
- lib/rails_connector/workspace_data_from_database.rb
|
171
126
|
- lib/rails_connector/workspace_data_from_service.rb
|
172
127
|
- lib/rails_connector/workspace_selection_middleware.rb
|
173
128
|
- lib/tasks/migration.rake
|
@@ -185,7 +140,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
185
140
|
version: '0'
|
186
141
|
segments:
|
187
142
|
- 0
|
188
|
-
hash:
|
143
|
+
hash: 676465587
|
189
144
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
190
145
|
none: false
|
191
146
|
requirements:
|