rhoconnect 3.4.5 → 4.0.0.beta.10

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 (337) hide show
  1. data/CHANGELOG.md +57 -3
  2. data/Gemfile +9 -7
  3. data/Gemfile.lock +37 -37
  4. data/Rakefile +18 -7
  5. data/bench/benchapp/Gemfile +1 -1
  6. data/bench/benchapp/config.ru +0 -3
  7. data/bench/benchapp/controllers/ruby/application.rb +17 -0
  8. data/bench/benchapp/controllers/ruby/application_controller.rb +17 -0
  9. data/bench/benchapp/controllers/ruby/mock_adapter_controller.rb +8 -0
  10. data/bench/benchapp/controllers/ruby/queue_mock_adapter_controller.rb +8 -0
  11. data/bench/benchapp/{sources → models/ruby}/mock_adapter.rb +1 -1
  12. data/bench/benchapp/{sources → models/ruby}/queue_mock_adapter.rb +0 -0
  13. data/bench/benchapp/spec/{sources → models/ruby}/mock_adapter_spec.rb +1 -1
  14. data/bench/benchapp/spec/{sources → models/ruby}/queue_mock_adapter_spec.rb +1 -1
  15. data/bench/benchapp/spec/spec_helper.rb +2 -2
  16. data/bench/blobapp/Gemfile +1 -1
  17. data/bench/blobapp/config.ru +0 -3
  18. data/bench/blobapp/controllers/ruby/application_controller.rb +17 -0
  19. data/bench/blobapp/controllers/ruby/blob_adapter_controller.rb +8 -0
  20. data/bench/blobapp/{sources → models/ruby}/blob_adapter.rb +9 -2
  21. data/bench/blobapp/spec/{sources → models/ruby}/blob_adapter_spec.rb +1 -1
  22. data/bench/blobapp/spec/spec_helper.rb +1 -1
  23. data/bench/lib/bench/cli.rb +1 -1
  24. data/bench/scripts/blob_cud_script.rb +1 -1
  25. data/bench/scripts/query_md_script.rb +1 -1
  26. data/bench/scripts/query_only_script.rb +1 -1
  27. data/bench/scripts/query_script.rb +1 -1
  28. data/bench/scripts/test_query_script.rb +7 -1
  29. data/bench/spec/mock_adapter_spec.rb +1 -1
  30. data/bench/spec/result_spec.rb +3 -3
  31. data/bin/rhoconnect +5 -3
  32. data/commands/dtach/dtach_install.rb +2 -2
  33. data/commands/execute.rb +8 -3
  34. data/commands/generators/app.rb +3 -3
  35. data/commands/generators/controller.rb +6 -0
  36. data/commands/generators/model.rb +6 -0
  37. data/commands/generators/source.rb +3 -3
  38. data/commands/generators/update.rb +1 -1
  39. data/commands/redis/redis_about.rb +2 -2
  40. data/commands/redis/redis_download.rb +1 -1
  41. data/commands/redis/redis_install.rb +4 -3
  42. data/commands/redis/redis_restart.rb +4 -4
  43. data/commands/redis/redis_start.rb +5 -4
  44. data/commands/redis/redis_startbg.rb +5 -4
  45. data/commands/redis/redis_status.rb +13 -0
  46. data/commands/redis/redis_stop.rb +3 -3
  47. data/commands/rhoconnect/config.rb +28 -16
  48. data/commands/rhoconnect/flushdb.rb +1 -2
  49. data/commands/rhoconnect/get_token.rb +15 -11
  50. data/commands/rhoconnect/restart.rb +13 -5
  51. data/commands/rhoconnect/set_admin_password.rb +8 -8
  52. data/commands/rhoconnect/start.rb +74 -16
  53. data/commands/rhoconnect/startbg.rb +1 -1
  54. data/commands/rhoconnect/startdebug.rb +1 -1
  55. data/commands/rhoconnect/stop.rb +13 -1
  56. data/commands/rhoconnect/web.rb +5 -5
  57. data/commands/rhoconnect_console/console.rb +7 -5
  58. data/commands/{rhoconnect → rhoconnect_spec}/spec.rb +0 -0
  59. data/commands/rhoconnect_war/war.rb +9 -9
  60. data/commands/utilities/blank_app.ru +56 -0
  61. data/commands/utilities/redis_runner.rb +54 -19
  62. data/doc/authentication.txt +80 -6
  63. data/doc/blob-sync.txt +104 -97
  64. data/doc/bulk-sync.txt +1 -1
  65. data/doc/client-java.txt +3 -3
  66. data/doc/client-objc.txt +2 -2
  67. data/doc/client.txt +4 -4
  68. data/doc/command-line.txt +105 -200
  69. data/doc/data-partitioning.txt +40 -0
  70. data/doc/deploying.txt +249 -77
  71. data/doc/extending-rhoconnect-server.txt +40 -57
  72. data/doc/heroku-addon.txt +2 -0
  73. data/doc/install.txt +45 -95
  74. data/doc/introduction.txt +1 -1
  75. data/doc/java-plugin.txt +365 -190
  76. data/doc/metadata.txt +1 -1
  77. data/doc/migration.txt +108 -142
  78. data/doc/preparing-production.txt +1 -1
  79. data/doc/push-backend-setup.txt +2 -0
  80. data/doc/push-client-setup-android.txt +78 -0
  81. data/doc/push-client-setup-bb.txt +81 -0
  82. data/doc/push-client-setup-ios.txt +70 -0
  83. data/doc/push-client-setup-rps.txt +200 -0
  84. data/doc/push-client-setup.txt +63 -66
  85. data/doc/push-server-setup.txt +67 -40
  86. data/doc/push-testing.txt +29 -0
  87. data/doc/push.txt +21 -6
  88. data/doc/rest-api.txt +128 -55
  89. data/doc/rhoconnect-redis-stack.txt +120 -0
  90. data/doc/settings.txt +4 -12
  91. data/doc/source-adapters-intro.txt +28 -0
  92. data/doc/source-adapters.txt +235 -272
  93. data/doc/stats-middleware.txt +9 -29
  94. data/doc/supported-platforms.txt +21 -30
  95. data/doc/testing.txt +40 -42
  96. data/doc/tutorial.txt +72 -57
  97. data/examples/simple/Gemfile +1 -1
  98. data/examples/simple/application.rb +4 -5
  99. data/examples/simple/my_server.rb +2 -2
  100. data/examples/simple/settings/settings.yml +1 -1
  101. data/generators/rhoconnect.rb +151 -50
  102. data/generators/templates/application/Gemfile +1 -1
  103. data/generators/templates/application/Rakefile +3 -3
  104. data/generators/templates/application/config.ru +1 -4
  105. data/generators/templates/application/controllers/application_controller.rb +17 -0
  106. data/generators/templates/application/controllers/js/application_controller.js +14 -0
  107. data/generators/templates/application/controllers/ruby/application_controller.rb +17 -0
  108. data/generators/templates/application/package.json +8 -0
  109. data/generators/templates/application/rcgemfile +2 -5
  110. data/generators/templates/application/settings/settings.yml +3 -3
  111. data/generators/templates/application/spec/application_controller_spec.rb +23 -0
  112. data/generators/templates/application/spec/js_spec.rb +25 -0
  113. data/generators/templates/application/spec/spec_helper.rb +21 -7
  114. data/generators/templates/source/controllers/js/controller.js +7 -0
  115. data/generators/templates/source/controllers/ruby/controller.rb +8 -0
  116. data/generators/templates/source/controllers/ruby/controller_spec.rb +27 -0
  117. data/generators/templates/source/models/js/model.js +46 -0
  118. data/generators/templates/source/{source_adapter.rb → models/ruby/model.rb} +15 -10
  119. data/generators/templates/source/{source_spec.rb → models/ruby/model_spec.rb} +1 -1
  120. data/install.sh +5 -5
  121. data/installer/unix-like/create_texts.rb +2 -2
  122. data/installer/unix-like/rho_connect_install_constants.rb +2 -2
  123. data/installer/unix-like/rho_connect_install_utilities.rb +1 -1
  124. data/installer/utils/constants.rb +4 -4
  125. data/js-adapters/ballroom.js +216 -0
  126. data/js-adapters/node.rb +52 -0
  127. data/js-adapters/node_channel.rb +181 -0
  128. data/js-adapters/request.js +27 -0
  129. data/js-adapters/response.js +57 -0
  130. data/js-adapters/rhoconnect_helpers.js +60 -0
  131. data/js-adapters/router.js +60 -0
  132. data/js-adapters/server.js +5 -0
  133. data/lib/rhoconnect/api/app/ans_login.rb +3 -3
  134. data/lib/rhoconnect/api/app/bulk_data.rb +10 -10
  135. data/lib/rhoconnect/api/app/fast_delete.rb +11 -10
  136. data/lib/rhoconnect/api/app/fast_insert.rb +11 -10
  137. data/lib/rhoconnect/api/app/fast_update.rb +11 -10
  138. data/lib/rhoconnect/api/app/login.rb +5 -5
  139. data/lib/rhoconnect/api/app/push_deletes.rb +12 -11
  140. data/lib/rhoconnect/api/app/push_objects.rb +12 -11
  141. data/lib/rhoconnect/api/app/query.rb +8 -7
  142. data/lib/rhoconnect/api/app/queue_updates.rb +98 -94
  143. data/lib/rhoconnect/api/app/search.rb +8 -7
  144. data/lib/rhoconnect/api/client/client_get_db_doc.rb +5 -5
  145. data/lib/rhoconnect/api/client/client_set_db_doc.rb +8 -8
  146. data/lib/rhoconnect/api/client/create.rb +7 -7
  147. data/lib/rhoconnect/api/client/get_client_params.rb +4 -4
  148. data/lib/rhoconnect/api/client/list_client_docs.rb +17 -17
  149. data/lib/rhoconnect/api/client/register.rb +12 -12
  150. data/lib/rhoconnect/api/client/reset.rb +5 -5
  151. data/lib/rhoconnect/api/readstate/set_refresh_time.rb +9 -9
  152. data/lib/rhoconnect/api/source/get_source_params.rb +4 -4
  153. data/lib/rhoconnect/api/source/list_sources.rb +16 -16
  154. data/lib/rhoconnect/api/source/update_source_params.rb +6 -6
  155. data/lib/rhoconnect/api/store/get_db_doc.rb +4 -4
  156. data/lib/rhoconnect/api/store/set_db_doc.rb +7 -7
  157. data/lib/rhoconnect/api/system/get_adapter.rb +4 -4
  158. data/lib/rhoconnect/api/system/get_license_info.rb +8 -8
  159. data/lib/rhoconnect/api/system/login.rb +15 -15
  160. data/lib/rhoconnect/api/system/reset.rb +11 -11
  161. data/lib/rhoconnect/api/system/save_adapter.rb +4 -4
  162. data/lib/rhoconnect/api/system/stats.rb +22 -22
  163. data/lib/rhoconnect/api/user/create_user.rb +7 -7
  164. data/lib/rhoconnect/api/user/delete_client.rb +6 -6
  165. data/lib/rhoconnect/api/user/delete_user.rb +11 -10
  166. data/lib/rhoconnect/api/user/list_clients.rb +4 -4
  167. data/lib/rhoconnect/api/user/list_source_docs.rb +10 -10
  168. data/lib/rhoconnect/api/user/list_users.rb +3 -3
  169. data/lib/rhoconnect/api/user/ping.rb +3 -3
  170. data/lib/rhoconnect/api/user/show_user.rb +3 -3
  171. data/lib/rhoconnect/api/user/update_user.rb +5 -5
  172. data/lib/rhoconnect/api/user/user_get_db_doc.rb +5 -5
  173. data/lib/rhoconnect/api/user/user_set_db_doc.rb +10 -10
  174. data/lib/rhoconnect/api_token.rb +5 -6
  175. data/lib/rhoconnect/app.rb +6 -46
  176. data/lib/rhoconnect/application/init.rb +5 -2
  177. data/lib/rhoconnect/async.rb +76 -39
  178. data/lib/rhoconnect/bulk_data/bulk_data.rb +6 -4
  179. data/lib/rhoconnect/client.rb +59 -9
  180. data/lib/rhoconnect/condition/admin_required.rb +27 -0
  181. data/lib/rhoconnect/condition/client_required.rb +50 -0
  182. data/lib/rhoconnect/condition/login_required.rb +22 -0
  183. data/lib/rhoconnect/condition/source_required.rb +49 -0
  184. data/lib/rhoconnect/condition/verbs.rb +17 -0
  185. data/lib/rhoconnect/condition/verify_success.rb +19 -0
  186. data/lib/rhoconnect/controller/app_base.rb +74 -0
  187. data/lib/rhoconnect/controller/base.rb +68 -0
  188. data/lib/rhoconnect/controller/clients_controller.rb +79 -0
  189. data/lib/rhoconnect/controller/dynamic_adapter_controller.rb +93 -0
  190. data/lib/rhoconnect/controller/js_base.rb +124 -0
  191. data/lib/rhoconnect/controller/read_state_controller.rb +22 -0
  192. data/lib/rhoconnect/controller/source_adapter_base.rb +14 -0
  193. data/lib/rhoconnect/controller/sources_controller.rb +44 -0
  194. data/lib/rhoconnect/controller/store_controller.rb +25 -0
  195. data/lib/rhoconnect/controller/system_controller.rb +67 -0
  196. data/lib/rhoconnect/controller/users_controller.rb +99 -0
  197. data/lib/rhoconnect/db_adapter.rb +1 -3
  198. data/lib/rhoconnect/document.rb +159 -50
  199. data/lib/rhoconnect/handler/authenticate/execute_methods.rb +77 -0
  200. data/lib/rhoconnect/handler/authenticate/runner.rb +49 -0
  201. data/lib/rhoconnect/handler/authenticate.rb +3 -0
  202. data/lib/rhoconnect/handler/bulk_data.rb +28 -0
  203. data/lib/rhoconnect/handler/changes/engine.rb +271 -0
  204. data/lib/rhoconnect/handler/changes/execute_methods.rb +88 -0
  205. data/lib/rhoconnect/handler/changes/pass_through_runner.rb +11 -0
  206. data/lib/rhoconnect/handler/changes/runner.rb +53 -0
  207. data/lib/rhoconnect/handler/changes.rb +31 -0
  208. data/lib/rhoconnect/handler/helpers/auth_method.rb +29 -0
  209. data/lib/rhoconnect/handler/helpers/binding.rb +18 -0
  210. data/lib/rhoconnect/handler/helpers/bulk_data.rb +53 -0
  211. data/lib/rhoconnect/handler/helpers/source_job.rb +14 -0
  212. data/lib/rhoconnect/handler/helpers.rb +4 -0
  213. data/lib/rhoconnect/handler/plugin_callbacks/execute_methods.rb +99 -0
  214. data/lib/rhoconnect/handler/plugin_callbacks/runner.rb +28 -0
  215. data/lib/rhoconnect/handler/plugin_callbacks.rb +67 -0
  216. data/lib/rhoconnect/handler/query/engine.rb +93 -0
  217. data/lib/rhoconnect/handler/query/execute_methods.rb +21 -0
  218. data/lib/rhoconnect/handler/query/pass_through_runner.rb +35 -0
  219. data/lib/rhoconnect/handler/query/runner.rb +270 -0
  220. data/lib/rhoconnect/handler/query.rb +19 -0
  221. data/lib/rhoconnect/handler/search/engine.rb +60 -0
  222. data/lib/rhoconnect/handler/search/execute_methods.rb +32 -0
  223. data/lib/rhoconnect/handler/search/pass_through_runner.rb +18 -0
  224. data/lib/rhoconnect/handler/search/runner.rb +104 -0
  225. data/lib/rhoconnect/handler/search.rb +26 -0
  226. data/lib/rhoconnect/handler/sync.rb +29 -0
  227. data/lib/rhoconnect/jobs/source_job.rb +13 -4
  228. data/lib/rhoconnect/js_adapter.rb +79 -0
  229. data/lib/rhoconnect/license.rb +10 -2
  230. data/lib/rhoconnect/middleware/current_user.rb +14 -1
  231. data/lib/rhoconnect/middleware/helpers.rb +10 -93
  232. data/lib/rhoconnect/middleware/x_domain_session_wrapper.rb +1 -1
  233. data/lib/rhoconnect/model/base.rb +229 -0
  234. data/lib/rhoconnect/model/dynamic_adapter_model.rb +90 -0
  235. data/lib/rhoconnect/model/js_base.rb +121 -0
  236. data/lib/rhoconnect/ping/android.rb +1 -1
  237. data/lib/rhoconnect/predefined_adapters/bench_adapter.rb +7 -4
  238. data/lib/rhoconnect/read_state.rb +3 -3
  239. data/lib/rhoconnect/server.rb +159 -190
  240. data/lib/rhoconnect/source.rb +100 -11
  241. data/lib/rhoconnect/stats/record.rb +10 -10
  242. data/lib/rhoconnect/store.rb +905 -591
  243. data/lib/rhoconnect/{model.rb → store_orm.rb} +53 -115
  244. data/lib/rhoconnect/tasks.rb +18 -4
  245. data/lib/rhoconnect/test_methods.rb +30 -17
  246. data/lib/rhoconnect/user.rb +35 -17
  247. data/lib/rhoconnect/utilities.rb +1 -1
  248. data/lib/rhoconnect/version.rb +2 -2
  249. data/lib/rhoconnect/web-console/server.rb +29 -14
  250. data/lib/rhoconnect/web-console/views/home.js +10 -10
  251. data/lib/rhoconnect/web-console/views/new_ping.js +1 -1
  252. data/lib/rhoconnect.rb +120 -51
  253. data/rhoconnect.gemspec +4 -3
  254. data/spec/api/api_helper.rb +1 -6
  255. data/spec/api/app/fast_delete_spec.rb +4 -4
  256. data/spec/api/app/fast_insert_spec.rb +4 -4
  257. data/spec/api/app/fast_update_spec.rb +8 -8
  258. data/spec/api/app/push_deletes_spec.rb +2 -2
  259. data/spec/api/app/push_objects_spec.rb +5 -5
  260. data/spec/api/client/client_get_db_doc_spec.rb +6 -4
  261. data/spec/api/client/client_set_db_doc_spec.rb +3 -2
  262. data/spec/api/client/get_client_params_spec.rb +14 -0
  263. data/spec/api/client/list_client_docs_spec.rb +30 -20
  264. data/spec/api/client/reset_spec.rb +36 -0
  265. data/spec/api/source/get_source_params_spec.rb +23 -17
  266. data/spec/api/system/get_license_info_spec.rb +0 -20
  267. data/spec/api/system/login_spec.rb +8 -0
  268. data/spec/api/system/reset_spec.rb +0 -1
  269. data/spec/api/system/stats_spec.rb +5 -5
  270. data/spec/api/user/create_user_spec.rb +14 -6
  271. data/spec/api/user/delete_user_spec.rb +20 -18
  272. data/spec/api/user/list_users_spec.rb +5 -6
  273. data/spec/api/user/update_user_spec.rb +5 -4
  274. data/spec/apps/rhotestapp/config.ru +16 -1
  275. data/spec/apps/rhotestapp/controllers/js/js_sample_controller.js +23 -0
  276. data/spec/apps/rhotestapp/controllers/js/sample2_controller.js +32 -0
  277. data/spec/apps/rhotestapp/controllers/ruby/application_controller.rb +21 -0
  278. data/spec/apps/rhotestapp/controllers/ruby/sample_adapter_controller.rb +8 -0
  279. data/spec/apps/rhotestapp/models/js/js_sample.js +55 -0
  280. data/spec/apps/rhotestapp/models/js/sample2.js +25 -0
  281. data/spec/apps/rhotestapp/{sources → models/ruby}/base_adapter.rb +0 -0
  282. data/spec/apps/rhotestapp/{sources → models/ruby}/fixed_schema_adapter.rb +0 -0
  283. data/spec/apps/rhotestapp/{sources → models/ruby}/other_adapter.rb +0 -0
  284. data/spec/apps/rhotestapp/{sources → models/ruby}/sample_adapter.rb +0 -0
  285. data/spec/apps/rhotestapp/{sources → models/ruby}/simple_adapter.rb +2 -2
  286. data/spec/apps/rhotestapp/{sources → models/ruby}/sub_adapter.rb +0 -0
  287. data/spec/apps/rhotestapp/settings/settings.yml +0 -1
  288. data/spec/bulk_data/bulk_data_spec.rb +20 -5
  289. data/spec/cli/cli_spec.rb +83 -0
  290. data/spec/client_spec.rb +20 -17
  291. data/spec/client_sync_spec.rb +244 -406
  292. data/spec/controllers/js_base_spec.rb +89 -0
  293. data/spec/doc/doc_spec.rb +18 -18
  294. data/spec/document_spec.rb +29 -13
  295. data/spec/dynamic_adapter_spec.rb +6 -6
  296. data/spec/generator/generator_spec.rb +7 -4
  297. data/spec/jobs/bulk_data_job_spec.rb +14 -10
  298. data/spec/jobs/source_job_spec.rb +8 -8
  299. data/spec/license_spec.rb +5 -2
  300. data/spec/models/js_model_spec.rb +39 -0
  301. data/spec/node_spec.rb +42 -0
  302. data/spec/perf/store_perf_spec.rb +67 -12
  303. data/spec/ping/android_spec.rb +1 -1
  304. data/spec/read_state_spec.rb +1 -1
  305. data/spec/rhoconnect_spec.rb +1 -1
  306. data/spec/server/cors_spec.rb +14 -18
  307. data/spec/server/server_spec.rb +265 -88
  308. data/spec/server/stats_spec.rb +1 -1
  309. data/spec/source_adapter_spec.rb +54 -27
  310. data/spec/source_spec.rb +8 -3
  311. data/spec/source_sync_spec.rb +538 -468
  312. data/spec/spec_helper.rb +35 -4
  313. data/spec/stats/record_spec.rb +10 -10
  314. data/spec/{model_spec.rb → store_orm_spec.rb} +56 -54
  315. data/spec/store_spec.rb +159 -179
  316. data/spec/support/shared_examples.rb +36 -27
  317. data/spec/sync_states_spec.rb +40 -33
  318. data/spec/test_methods_spec.rb +18 -14
  319. data/spec/user_spec.rb +17 -30
  320. metadata +156 -52
  321. data/bench/benchapp/application.rb +0 -39
  322. data/bench/blobapp/application.rb +0 -44
  323. data/commands/rhoconnect/clean_start.rb +0 -9
  324. data/commands/rhoconnect/create_user.rb +0 -18
  325. data/commands/rhoconnect/delete_device.rb +0 -9
  326. data/commands/rhoconnect/delete_user.rb +0 -8
  327. data/commands/rhoconnect/reset.rb +0 -16
  328. data/commands/rhoconnect/reset_refresh.rb +0 -11
  329. data/generators/templates/application/application.rb +0 -43
  330. data/lib/rhoconnect/client_sync.rb +0 -434
  331. data/lib/rhoconnect/dynamic_adapter.rb +0 -91
  332. data/lib/rhoconnect/middleware/admin_user.rb +0 -23
  333. data/lib/rhoconnect/middleware/current_request.rb +0 -16
  334. data/lib/rhoconnect/middleware/login_required.rb +0 -22
  335. data/lib/rhoconnect/source_adapter.rb +0 -132
  336. data/lib/rhoconnect/source_sync.rb +0 -464
  337. data/spec/apps/rhotestapp/application.rb +0 -23
@@ -1,132 +0,0 @@
1
- module Rhoconnect
2
- class SourceAdapterException < RuntimeError; end
3
-
4
- # raise this to cause client to be logged out during a sync
5
- class SourceAdapterLoginException < SourceAdapterException; end
6
-
7
- class SourceAdapterLogoffException < SourceAdapterException; end
8
-
9
- # raise these to trigger rhoconnect sending an error to the client
10
- class SourceAdapterServerTimeoutException < SourceAdapterException; end
11
- class SourceAdapterServerErrorException < SourceAdapterException; end
12
-
13
- class SourceAdapterObjectConflictError < SourceAdapterException; end
14
-
15
- class SourceAdapter
16
- attr_accessor :session
17
-
18
- def initialize(source,credential=nil)
19
- @source = source
20
- end
21
-
22
- def self.create(source,credential=nil)
23
- adapter=nil
24
- if source
25
- begin
26
- if source.name
27
- source.name = source.name.dup if source.name.frozen?
28
- source.name.strip!
29
- end
30
- # certain adapters are pre-defined and reserved
31
- # load them and instantiate
32
- if Rhoconnect.predefined_sources.has_key?(source.name)
33
- adapter=(Object.const_get(source.name)).new(source)
34
- elsif Object.const_defined?(source.name) && Object.const_get(source.name).to_s.split("::").first != 'Rhoconnect'
35
- # fix until source adpaters are phased out, checking for Rhoconnect namespace
36
- # so that backend models with same name as Rhoconnect models are instantiated correctly
37
- require under_score(source.name)
38
- adapter=(Object.const_get(source.name)).new(source)
39
- else
40
- adapter=DynamicAdapter.new(source)
41
- end
42
- rescue ArgumentError => e
43
- # Backward compatibility with code generated by gems < 2.2.0
44
- adapter=(Object.const_get(source.name)).new(source,credential)
45
- log "WARNING: credential parameter in `initialize` method is deprecated and removed in version >= 2.2.0."
46
- rescue Exception => e
47
- log "Failure to create adapter from class #{source.name}: #{e.inspect.to_s}"
48
- raise e
49
- end
50
- end
51
- adapter
52
- end
53
-
54
- def login; end
55
-
56
- def query(params=nil); end
57
-
58
- def search(params=nil); end
59
-
60
- def sync
61
- if @result and @result.empty?
62
- @source.lock(:md) do |s|
63
- s.flash_data(:md)
64
- s.put_value(:md_size,0)
65
- end
66
- else
67
- if @result
68
- Store.put_data(@tmp_docname,@result)
69
- @stash_size += @result.size
70
- end
71
- @source.lock(:md) do |s|
72
- s.flash_data(:md)
73
- Store.rename(@tmp_docname,s.docname(:md))
74
- s.put_value(:md_size,@stash_size)
75
- end
76
- end
77
- end
78
-
79
- def do_query(params=nil)
80
- @tmp_docname = @source.docname(:md) + get_random_uuid
81
- @stash_size = 0
82
- params ? self.query(params) : self.query
83
- if @source.is_pass_through?
84
- @result
85
- else
86
- self.sync
87
- true
88
- end
89
- end
90
-
91
- def stash_result
92
- return if @result.nil?
93
- Store.put_data(@tmp_docname,@result,true)
94
- @stash_size += @result.size
95
- @result = nil
96
- end
97
-
98
- def expire_bulk_data(partition = :user)
99
- Rhoconnect.expire_bulk_data(current_user.login,partition)
100
- end
101
-
102
- # do pre-processing before CUD operation
103
- def validate(operation,operations_hashes,client_ids)
104
- {}
105
- end
106
-
107
- def create(create_hash); end
108
-
109
- def update(update_hash); end
110
-
111
- def delete(delete_hash); end
112
-
113
- def ask(params=nil); end
114
-
115
- def logoff; end
116
-
117
- def save(docname)
118
- return if @result.nil?
119
- if @result.empty?
120
- Store.flash_data(docname)
121
- else
122
- Store.put_data(docname,@result)
123
- end
124
- end
125
-
126
- protected
127
- def current_user
128
- @source.user
129
- end
130
-
131
- end
132
- end
@@ -1,464 +0,0 @@
1
- module Rhoconnect
2
- class SourceSync
3
- attr_reader :adapter
4
-
5
- def initialize(source)
6
- @source = source
7
- raise InvalidArgumentError.new('Invalid source') if @source.nil?
8
- raise InvalidArgumentError.new('Invalid app for source') unless @source.app
9
- @adapter = SourceAdapter.create(@source)
10
- end
11
-
12
- # CUD Operations
13
- def create
14
- _measure_and_process_cud('create')
15
- end
16
-
17
- def update
18
- _measure_and_process_cud('update')
19
- end
20
-
21
- def delete
22
- _measure_and_process_cud('delete')
23
- end
24
-
25
- # Pass through CUD to adapter, no data stored
26
- def pass_through_cud(cud_params,query_params)
27
- return if _auth_op('login') == false
28
- res,processed_objects = {},[]
29
- begin
30
- ['create','update','delete'].each do |op|
31
- key,objects = op,cud_params[op]
32
- objects.each do |key,value|
33
- case op
34
- when 'create'
35
- @adapter.send(op.to_sym,value)
36
- when 'update'
37
- value['id'] = key
38
- @adapter.send(op.to_sym,value)
39
- when 'delete'
40
- value['id'] = key
41
- @adapter.send(op.to_sym,value)
42
- end
43
- processed_objects << key
44
- end if objects
45
- end
46
- rescue Exception => e
47
- log "Error in pass through method: #{e.message}"
48
- res['error'] = {'message' => e.message }
49
- end
50
- _auth_op('logoff')
51
- res['processed'] = processed_objects
52
- res.to_json
53
- end
54
-
55
- # Read Operation; params are query arguments
56
- def read(client_id=nil,params=nil)
57
- _read('query',client_id,params)
58
- end
59
-
60
- def search(client_id=nil,params=nil)
61
- return if _auth_op('login',client_id) == false
62
- res = _read('search',client_id,params)
63
- _auth_op('logoff',client_id)
64
- res
65
- end
66
-
67
- def process_cud
68
- if @source.cud_queue or @source.queue
69
- async(:cud,@source.cud_queue || @source.queue)
70
- else
71
- do_cud
72
- end
73
- end
74
-
75
- def do_cud
76
- return if _auth_op('login') == false
77
- self.create
78
- self.update
79
- self.delete
80
- _auth_op('logoff')
81
- end
82
-
83
- def process_query(params=nil)
84
- if @source.query_queue or @source.queue
85
- async(:query,@source.query_queue || @source.queue,params)
86
- else
87
- do_query(params)
88
- end
89
- end
90
-
91
- def do_query(params=nil)
92
- result = nil
93
- @source.if_need_refresh do
94
- Rhoconnect::Stats::Record.update("source:query:#{@source.name}") do
95
- if _auth_op('login')
96
- result = self.read(nil,params)
97
- _auth_op('logoff')
98
- end
99
- # re-wind refresh time in case of error
100
- query_failure = Store.exists?(@source.docname(:errors))
101
- @source.rewind_refresh_time(query_failure)
102
- end
103
- end
104
- result
105
- end
106
-
107
- # Enqueue a job for the source based on job type
108
- def async(job_type,queue_name,params=nil)
109
- SourceJob.queue = queue_name
110
- Resque.enqueue(SourceJob,job_type,@source.id,
111
- @source.app_id,@source.user_id,params)
112
- end
113
-
114
- def fast_insert(new_objs, timeout=10,raise_on_expire=false)
115
- @source.lock(:md,timeout,raise_on_expire) do |s|
116
- diff_count = new_objs.size
117
- @source.put_data(:md, new_objs, true)
118
- @source.update_count(:md_size,diff_count)
119
- end
120
- @source.announce_changes
121
- end
122
-
123
- def fast_update(remove_hash, new_hash, timeout=10,raise_on_expire=false)
124
- return unless ((remove_hash and remove_hash.size > 0) or (new_hash and new_hash.size > 0))
125
- @source.lock(:md,timeout,raise_on_expire) do |s|
126
- # get the objects from DB, remove prev attr data, add new attr data
127
- update_keys = Set.new
128
- update_keys += Set.new(remove_hash.keys) if remove_hash
129
- update_keys += Set.new(new_hash.keys) if new_hash
130
- objs_to_update = @source.get_objects(:md, update_keys.to_a) || {}
131
- diff_count = -objs_to_update.size
132
- # remove old values from DB
133
- @source.delete_data(:md, objs_to_update)
134
- # update data
135
- remove_hash.each do |key, obj|
136
- next unless objs_to_update[key]
137
- obj.each do |attrib, value|
138
- objs_to_update[key].delete(attrib)
139
- objs_to_update.delete(key) if objs_to_update[key].empty?
140
- end
141
- end if remove_hash
142
- new_hash.each do |key, obj|
143
- objs_to_update[key] ||= {}
144
- objs_to_update[key].merge!(obj)
145
- end if new_hash
146
- # store new data into DB
147
- @source.put_data(:md, objs_to_update, true)
148
- diff_count += objs_to_update.size
149
- @source.update_count(:md_size,diff_count)
150
- end
151
- @source.announce_changes
152
- end
153
-
154
- def fast_delete(delete_objs, timeout=10,raise_on_expire=false)
155
- @source.lock(:md,timeout,raise_on_expire) do |s|
156
- diff_count = -delete_objs.size
157
- @source.delete_data(:md, delete_objs)
158
- @source.update_count(:md_size,diff_count)
159
- end
160
- @source.announce_changes
161
- end
162
-
163
- def push_objects(objects,timeout=10,raise_on_expire=false,rebuild_md=true)
164
- @source.lock(:md,timeout,raise_on_expire) do |s|
165
- diff_count = 0
166
- # in case of rebuild_md
167
- # we clean-up and rebuild the whole :md doc
168
- # on every request
169
- if(rebuild_md)
170
- doc = @source.get_data(:md)
171
- orig_doc_size = doc.size
172
- objects.each do |id,obj|
173
- doc[id] ||= {}
174
- doc[id].merge!(obj)
175
- end
176
- diff_count = doc.size - orig_doc_size
177
- @source.put_data(:md,doc)
178
- else
179
- # if rebuild_md == false
180
- # we only operate on specific set values
181
- # which brings a big optimization
182
- # in case of small transactions
183
- diff_count = @source.update_objects(:md, objects)
184
- end
185
-
186
- @source.update_count(:md_size,diff_count)
187
- end
188
- @source.announce_changes
189
- end
190
-
191
- def push_deletes(objects,timeout=10,raise_on_expire=false,rebuild_md=true)
192
- @source.lock(:md,timeout,raise_on_expire) do |s|
193
- diff_count = 0
194
- if(rebuild_md)
195
- # in case of rebuild_md
196
- # we clean-up and rebuild the whole :md doc
197
- # on every request
198
- doc = @source.get_data(:md)
199
- orig_doc_size = doc.size
200
- objects.each do |id|
201
- doc.delete(id)
202
- end
203
- diff_count = doc.size - orig_doc_size
204
- @source.put_data(:md,doc)
205
- else
206
- # if rebuild_md == false
207
- # we only operate on specific set values
208
- # which brings a big optimization
209
- # in case of small transactions
210
- diff_count = -@source.remove_objects(:md, objects)
211
- end
212
-
213
- @source.update_count(:md_size,diff_count)
214
- end
215
- @source.announce_changes
216
- end
217
-
218
- private
219
- def _auth_op(operation,client_id=-1)
220
- edockey = client_id == -1 ? @source.docname(:errors) :
221
- Client.load(client_id,{:source_name => @source.name}).docname(:search_errors)
222
- begin
223
- Store.flash_data(edockey) if operation == 'login'
224
- @adapter.send operation
225
- rescue Exception => e
226
- log "SourceAdapter raised #{operation} exception: #{e}"
227
- log e.backtrace.join("\n")
228
- Store.put_data(edockey,{"#{operation}-error"=>{'message'=>e.message}},true)
229
- return false
230
- end
231
- true
232
- end
233
-
234
- def _process_create(modified_recs,key,value)
235
- link = @adapter.create value
236
- # Store object-id link for the client
237
- # If we have a link, store object in client document
238
- # Otherwise, store object for delete on client
239
- modified_recs.each do |modified_rec|
240
- if link
241
- modified_rec[:links] ||= {}
242
- modified_rec[:links][modified_rec[:key]] = { 'l' => link.to_s }
243
- modified_rec[:creates] ||= {}
244
- modified_rec[:creates][link.to_s] = value
245
- else
246
- modified_rec[:deletes] ||= {}
247
- modified_rec[:deletes][modified_rec[:key]] = value
248
- end
249
- end
250
- end
251
-
252
- def _process_update(modified_recs,key,value)
253
- # Add id to object hash to forward to backend call
254
- value['id'] = key
255
- # Perform operation
256
- @adapter.update value
257
- end
258
-
259
- def _process_delete(modified_recs,key,value)
260
- value['id'] = key
261
- @adapter.delete value
262
- # Perform operation
263
- modified_recs.each do |modified_rec|
264
- modified_rec[:dels] ||= {}
265
- modified_rec[:dels][modified_rec[:key]] = value
266
- end
267
- end
268
-
269
- def _measure_and_process_cud(operation)
270
- Rhoconnect::Stats::Record.update("source:#{operation}:#{@source.name}") do
271
- _process_cud(operation)
272
- end
273
- end
274
-
275
- def _process_cud(operation)
276
- # take everything from the queue and erase it
277
- # so that no other process will be able to process it again
278
- operation_hashes = []
279
- client_ids = []
280
- @source.lock(operation) do |s|
281
- operation_hashes,client_ids = s.get_zdata(operation)
282
- s.flush_zdata(operation)
283
- end
284
- invalid_meta = @adapter.validate(operation,operation_hashes,client_ids)
285
-
286
- errors,links,deletes,creates,dels = {},{},{},{},{}
287
- operation_hashes.each_with_index do |client_operation_data,index|
288
- client_id = client_ids[index]
289
-
290
- current_invalid_meta = invalid_meta[index] || {}
291
- client_operation_data.each do |key, value|
292
- begin
293
- continue_loop = true
294
- modified_recs = [{:client_id => client_id, :key => key, :value => value }]
295
- record_invalid_meta = current_invalid_meta[key] || {}
296
- # Remove object from queue
297
- client_operation_data.delete(key)
298
-
299
- # skip the rec - if it is a duplicate of some other record
300
- next if record_invalid_meta[:duplicate_of]
301
-
302
- # prepare duplicate docs
303
- duplicates = record_invalid_meta[:duplicates] || {}
304
- duplicates.each do |duplicate|
305
- modified_recs << duplicate
306
- end
307
-
308
- # raise conflict error if record is marked with one
309
- raise SourceAdapterObjectConflictError.new(record_invalid_meta[:error]) if record_invalid_meta[:error]
310
-
311
- # Call on source adapter to process individual object
312
- case operation
313
- when 'create'
314
- _process_create(modified_recs,key,value)
315
- when 'update'
316
- _process_update(modified_recs,key,value)
317
- when 'delete'
318
- _process_delete(modified_recs,key,value)
319
- end
320
- rescue Exception => e
321
- log "SourceAdapter raised #{operation} exception: #{e}"
322
- log e.backtrace.join("\n")
323
- continue_loop = false
324
- modified_recs.each do |modified_rec|
325
- modified_rec[:errors] ||= {}
326
- modified_rec[:errors][modified_rec[:key]] = modified_rec[:value]
327
- modified_rec[:errors]["#{modified_rec[:key]}-error"] = {'message'=>e.message}
328
- end
329
- end
330
-
331
- { :errors => errors,
332
- :links => links,
333
- :deletes => deletes,
334
- :creates => creates,
335
- :dels => dels }.each do |doc_name, doc|
336
- modified_recs.each do |modified_rec|
337
- doc[modified_rec[:client_id]] ||= {}
338
- next unless modified_rec[doc_name]
339
- doc[modified_rec[:client_id]].merge!(modified_rec[doc_name])
340
- end
341
- end
342
- break unless continue_loop
343
- end
344
-
345
- # Record rest of queue (if something in the middle failed)
346
- if not client_operation_data.empty?
347
- @source.put_zdata(operation,client_id,client_operation_data,true)
348
- end
349
- end
350
-
351
- # now, process all the modified docs
352
- processed_clients = {}
353
- client_ids.each do |client_id|
354
- processed_clients[client_id] = Client.load(client_id,{:source_name => @source.name}) unless processed_clients[client_id]
355
- end
356
- { "delete_page" => deletes,
357
- "#{operation}_links" => links,
358
- "#{operation}_errors" => errors }.each do |doctype,client_docs|
359
- client_docs.each do |client_id,data|
360
- client = processed_clients[client_id]
361
- client.put_data(doctype,data,true) unless data.empty?
362
- end
363
- end
364
-
365
- if operation == 'create'
366
- total_creates = {}
367
- creates.each do |client_id,client_doc|
368
- next if client_doc.empty?
369
- client = processed_clients[client_id]
370
- client.put_data(:cd,client_doc,true)
371
- client.update_count(:cd_size,client_doc.size)
372
- total_creates.merge!(client_doc)
373
- end
374
- unless total_creates.empty?
375
- @source.lock(:md) do |s|
376
- s.put_data(:md,total_creates,true)
377
- s.update_count(:md_size,total_creates.size)
378
- end
379
- end
380
- end
381
-
382
- if operation == 'delete'
383
- # Clean up deleted objects from master document and corresponding client document
384
- total_dels = {}
385
- objs = {}
386
- dels.each do |client_id,client_doc|
387
- next if client_doc.empty?
388
- client = processed_clients[client_id]
389
- client.delete_data(:cd,client_doc)
390
- client.update_count(:cd_size,-client_doc.size)
391
- total_dels.merge!(client_doc)
392
- end
393
- unless total_dels.empty?
394
- @source.lock(:md) do |s|
395
- s.delete_data(:md,total_dels)
396
- s.update_count(:md_size,-total_dels.size)
397
- end
398
- end
399
- end
400
- if operation == 'update'
401
- errors.each do |client_id, error_doc|
402
- next if error_doc.empty?
403
- client = processed_clients[client_id]
404
- cd = client.get_data(:cd)
405
- error_doc.each do |key, value|
406
- client.put_data(:update_rollback,{key => cd[key]},true) if cd[key]
407
- end
408
- end
409
- end
410
- end
411
-
412
- # Metadata Operation; source adapter returns json
413
- def _get_data(method)
414
- if @adapter.respond_to?(method)
415
- data = @adapter.send(method)
416
- if data
417
- @source.put_value(method,data)
418
- if method == :schema
419
- parsed = JSON.parse(data)
420
- schema_version = parsed['version']
421
- raise "Mandatory version key is not defined in source adapter schema method" if schema_version.nil?
422
- @source.put_value("#{method}_sha1",Digest::SHA1.hexdigest(schema_version))
423
- else
424
- @source.put_value("#{method}_sha1",Digest::SHA1.hexdigest(data))
425
- end
426
- end
427
- end
428
- end
429
-
430
- # Read Operation; params are query arguments
431
- def _read(operation,client_id,params=nil)
432
- errordoc = nil
433
- result = nil
434
- begin
435
- if operation == 'search'
436
- client = Client.load(client_id,{:source_name => @source.name})
437
- errordoc = client.docname(:search_errors)
438
- compute_token(client.docname(:search_token))
439
- result = @adapter.search(params)
440
- @adapter.save(client.docname(:search)) unless @source.is_pass_through?
441
- else
442
- errordoc = @source.docname(:errors)
443
- [:metadata,:schema].each do |method|
444
- _get_data(method)
445
- end
446
- result = @adapter.do_query(params)
447
- end
448
- # operation,sync succeeded, remove errors
449
- Store.lock(errordoc) do
450
- Store.flash_data(errordoc)
451
- end
452
- rescue Exception => e
453
- # store sync,operation exceptions to be sent to all clients for this source/user
454
- log "SourceAdapter raised #{operation} exception: #{e}"
455
- log e.backtrace.join("\n")
456
- Store.lock(errordoc) do
457
- Store.put_data(errordoc,{"#{operation}-error"=>{'message'=>e.message}},true)
458
- end
459
- end
460
- # pass through expects result hash
461
- @source.is_pass_through? ? result : true
462
- end
463
- end
464
- end
@@ -1,23 +0,0 @@
1
- class Application < Rhoconnect::Base
2
- class << self
3
- def authenticate(username,password,session)
4
- session[:auth] = "delegated"
5
- raise RuntimeError.new('server error') if password == 'server error'
6
- raise LoginException.new('login exception') if password == 'wrongpass'
7
- return "different" if password == "diffuser"
8
- password == 'wrongpassnomsg' ? false : true
9
- end
10
-
11
- # Add hooks for application startup here
12
- # Don't forget to call super at the end!
13
- def initializer(path)
14
- super
15
- end
16
-
17
- def ans_authenticate(username, password)
18
- 'ansuser:secret' == [username,password].join(':')
19
- end
20
- end
21
- end
22
-
23
- Application.initializer(File.dirname(__FILE__))