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
@@ -9,8 +9,9 @@ module Rhoconnect
9
9
  if settings.respond_to?(:fiberpool_size)
10
10
  options[:size] = settings.fiberpool_size
11
11
  end
12
- options[:rescue_exception] = handle_exception
12
+ options[:rescue_exception] = handle_exception
13
13
  builder.use Rack::FiberPool, options unless test?
14
+ builder.use Rhoconnect::Middleware::Async, options
14
15
  super
15
16
  end
16
17
 
@@ -28,56 +29,92 @@ module Rhoconnect
28
29
  end
29
30
  end
30
31
 
31
- module AsyncHelpers
32
- def self.included(klass)
33
- (klass.instance_methods & self.instance_methods).each do |method|
34
- klass.instance_eval{remove_method method.to_sym}
32
+ module Middleware
33
+ class Async
34
+ def initialize(app, opts={})
35
+ @app = app
36
+ yield self if block_given?
35
37
  end
36
- end
37
-
38
- def catch_all
39
- res = nil
40
- begin
41
- res = catch(:halt) { yield }
42
- rescue ApiException => ae
43
- res = [ae.error_code, ae.message]
44
- rescue Exception => e
45
- log e.message + e.backtrace.join("\n")
46
- res = [500, e.message]
47
- end
48
- res
49
- end
50
-
51
- def execute_api_call(client_call = false)
38
+
39
+ def call(env)
52
40
  f = Fiber.current
41
+ # making a copy is crucial here
42
+ # otherwise 'env' will not be the same
43
+ # in the deferred execution
44
+ aenv = env.dup
53
45
  operation = proc {
54
- self.request.env['REQUEST_THREAD'] = Thread.current
55
- if(request.env['RHO_ABORT_PROCESS'])
46
+ res = nil
47
+ aenv['REQUEST_THREAD'] = Thread.current
48
+ if(aenv['RHO_ABORT_PROCESS'])
56
49
  res = [500, 'Request is aborted']
57
50
  else
58
- catch_all do
59
- res = yield params, current_user, self
60
- if params.has_key? :warning
61
- Rhoconnect.log params[:warning]
62
- response.headers['Warning'] = params[:warning]
63
- end
64
- res
65
- end
51
+ res = @app.call(aenv)
66
52
  end
53
+ res
67
54
  }
68
55
  result = nil
69
56
  callback = proc { |proc_res| result = proc_res; f.resume }
70
-
57
+
71
58
  EventMachine.defer operation, callback
72
59
  Fiber.yield
73
- # we can not throw exceptions across threads
74
- # so we analyze it in the main thread after the
75
- # request has been processed and if result
76
- # has error code - then we throw :halt here
77
- if Array === result and Fixnum === result.first
78
- throw :halt, result
79
- end
80
60
  result
61
+ end
81
62
  end
82
63
  end
64
+
65
+ # module AsyncHelpers
66
+ # #def self.included(klass)
67
+ # # (klass.instance_methods & self.instance_methods).each do |method|
68
+ # # klass.instance_eval{remove_method method.to_sym}
69
+ # # end
70
+ # #end
71
+ #
72
+ # def catch_all
73
+ # res = nil
74
+ # begin
75
+ # res = catch(:halt) { yield }
76
+ # rescue ApiException => ae
77
+ # res = [ae.error_code, ae.message]
78
+ # rescue Exception => e
79
+ # log e.message + e.backtrace.join("\n")
80
+ # res = [500, e.message]
81
+ # end
82
+ # res
83
+ # end
84
+ #
85
+ # def execute_api_call(&block)
86
+ # f = Fiber.current
87
+ # operation = proc {
88
+ # catch_all do
89
+ # puts " we are processing the route #{self.inspect}"
90
+ # method = self.class.send(:generate_method, "calling_method", &block)
91
+ # #method = instance_method "calling_method"
92
+ # #remove_method "calling_method"
93
+ #
94
+ # #method = Sinatra::Base.generate_method("calling_method", &block)
95
+ # proc = method.bind(self)
96
+ # res = proc.call
97
+ # #res = yield
98
+ # if params.has_key? :warning
99
+ # Rhoconnect.log params[:warning]
100
+ # response.headers['Warning'] = params[:warning]
101
+ # end
102
+ # res
103
+ # end
104
+ # }
105
+ # result = nil
106
+ # callback = proc { |proc_res| result = proc_res; f.resume }
107
+ #
108
+ # EventMachine.defer operation, callback
109
+ # Fiber.yield
110
+ # # we can not throw exceptions across threads
111
+ # # so we analyze it in the main thread after the
112
+ # # request has been processed and if result
113
+ # # has error code - then we throw :halt here
114
+ # if Array === result and Fixnum === result.first
115
+ # throw :halt, result
116
+ # end
117
+ # result
118
+ # end
119
+ # end
83
120
  end
@@ -2,7 +2,7 @@ require 'resque'
2
2
  require 'rhoconnect/jobs/bulk_data_job'
3
3
 
4
4
  module Rhoconnect
5
- class BulkData < Model
5
+ class BulkData < StoreOrm
6
6
  field :name, :string
7
7
  field :state, :string
8
8
  field :app_id, :string
@@ -23,7 +23,7 @@ module Rhoconnect
23
23
  def delete
24
24
  sources[0, -1].each do |source|
25
25
  s = Source.load(source,{:app_id => app_id, :user_id => user_id})
26
- Store.flash_data(s.docname(:md_copy)) if s
26
+ s.flush_data(:md_copy) if s
27
27
  end
28
28
  super
29
29
  end
@@ -32,8 +32,10 @@ module Rhoconnect
32
32
  sources[0, -1].each do |source|
33
33
  s = Source.load(source,{:app_id => app_id, :user_id => user_id})
34
34
  if s
35
- SourceSync.new(s).process_query(nil)
36
- s.clone(:md,:md_copy) unless s.sync_type.to_sym == :bulk_sync_only
35
+ rh = lambda { @model.query(params[:query])}
36
+ model = Rhoconnect::Model::Base.create(s)
37
+ Rhoconnect::Handler::Query::Engine.new(model, rh, {}).do_sync
38
+ s.clone(:md, s.docname(:md_copy)) unless s.sync_type.to_sym == :bulk_sync_only
37
39
  end
38
40
  end
39
41
  end
@@ -1,7 +1,7 @@
1
1
  module Rhoconnect
2
2
  class InvalidSourceNameError < RuntimeError; end
3
3
 
4
- class Client < Model
4
+ class Client < StoreOrm
5
5
  field :device_type, :string
6
6
  field :device_push_type, :string
7
7
  field :device_pin, :string
@@ -15,6 +15,32 @@ module Rhoconnect
15
15
 
16
16
  include Document
17
17
  include LockOps
18
+
19
+ define_valid_doctypes([:cd,
20
+ :cd_size,
21
+ :page,
22
+ :delete_page,
23
+ :create_links,
24
+ :create_links_page,
25
+ :metadata_page,
26
+ :total_count_page,
27
+ :page_token,
28
+ :schema_sha1,
29
+ :schema_page,
30
+ :metadata_sha1,
31
+ :metadata_page,
32
+ :search,
33
+ :search_token,
34
+ :search_page,
35
+ :search_errors,
36
+ :create_errors,
37
+ :create_errors_page,
38
+ :update_errors,
39
+ :update_errors_page,
40
+ :update_rollback,
41
+ :update_rollback_page,
42
+ :delete_errors,
43
+ :delete_errors_page])
18
44
 
19
45
  def self.create(fields,params={})
20
46
  Rhoconnect.license.check_and_use_seat
@@ -41,17 +67,20 @@ module Rhoconnect
41
67
 
42
68
  def doc_suffix(doctype)
43
69
  doctype = doctype.to_s
44
- if doctype == '*'
45
- "#{self.user_id}:#{self.id}:*"
46
- elsif self.source_name
70
+ if self.source_name
47
71
  "#{self.user_id}:#{self.id}:#{self.source_name}:#{doctype}"
48
72
  else
49
73
  raise InvalidSourceNameError.new('Invalid Source Name For Client')
50
74
  end
51
75
  end
52
76
 
77
+ def store_index(doctype)
78
+ source = Source.load(self.source_name,{:app_id => app_id,:user_id => self.user_id})
79
+ index = compute_store_index(doctype, source, user_id)
80
+ end
81
+
53
82
  def delete
54
- flash_data('*')
83
+ flush_all_documents
55
84
  Rhoconnect.license.free_seat
56
85
  if Rhoconnect.stats
57
86
  Rhoconnect::Stats::Record.set('clients') { Store.decr('client:count') }
@@ -60,12 +89,33 @@ module Rhoconnect
60
89
  end
61
90
  super
62
91
  end
63
-
92
+
93
+ def flush_all_documents
94
+ app.sources.each do |sourcename|
95
+ flush_source_documents(sourcename)
96
+ end
97
+ end
98
+
99
+ def flush_source_documents(source_name)
100
+ self.class.valid_doctypes.each do |doctype|
101
+ flush_source_data(doctype, source_name)
102
+ end
103
+ end
104
+
105
+ def flush_source_data(doctype, from_source)
106
+ verify_doctype(doctype)
107
+ self.source_name=from_source
108
+ docnamestr = docname('') + doctype.to_s
109
+ Store.flush_data(docnamestr)
110
+ end
111
+
64
112
  def switch_user(new_user_id)
65
- flash_data('*')
113
+ loaded_source = self.source_name
114
+ flush_all_documents
66
115
  User.load(self.user_id).clients.delete(self.id)
67
116
  User.load(new_user_id).clients << self.id
68
117
  self.user_id = new_user_id
118
+ self.source_name = loaded_source
69
119
  end
70
120
 
71
121
  def update_clientdoc(sources)
@@ -73,9 +123,9 @@ module Rhoconnect
73
123
  # source masterdoc and source schema might have changed!
74
124
  sources.each do |source|
75
125
  s = Source.load(source,{:app_id => app_id,:user_id => user_id})
126
+ self.source_name = source
76
127
  unless s.sync_type.to_sym == :bulk_sync_only
77
- self.source_name = source
78
- Store.clone(s.docname(:md_copy),self.docname(:cd))
128
+ s.clone(:md_copy,self.docname(:cd))
79
129
  end
80
130
  self.put_value(:schema_sha1,s.get_value(:schema_sha1))
81
131
  end
@@ -0,0 +1,27 @@
1
+ module Rhoconnect
2
+ module Condition
3
+ module AdminRequired
4
+ def self.extended(base)
5
+ base.include_admin_required_condition
6
+ end
7
+
8
+ def include_admin_required_condition
9
+ set(:admin_required) do |value|
10
+ condition do
11
+ if value
12
+ begin
13
+ api_token = ApiToken.load(env[API_TOKEN_HEADER])
14
+ api_token = ApiToken.load(params[:api_token]) unless api_token
15
+ raise Rhoconnect::ApiException.new(422, "No API token provided") unless api_token
16
+ raise Rhoconnect::ApiException.new(422, "Invalid/missing API user") unless api_token.user and api_token.user.admin == 1
17
+ env[Rhoconnect::CURRENT_USER] = api_token.user
18
+ rescue Rhoconnect::ApiException => ae
19
+ throw :halt, [422, {'Content-Type' => 'text/plain'}, ae.message]
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,50 @@
1
+ require 'rhoconnect/middleware/helpers'
2
+
3
+ module Rhoconnect
4
+ module Condition
5
+ # Sinatra condition
6
+ module ClientRequired
7
+ def self.extended(base)
8
+ base.include_client_required_condition
9
+ end
10
+
11
+ def include_client_required_condition
12
+ include ClientRequiredHelpers
13
+ set(:client_required) do |value|
14
+ condition do
15
+ if value
16
+ catch_all do
17
+ client = extract_current_client
18
+ # client should be valid here
19
+ raise ArgumentError.new(UNKNOWN_CLIENT) unless client
20
+ env[CURRENT_CLIENT] = client
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+
28
+ module ClientRequiredHelpers
29
+ # helper method
30
+ def extract_current_client
31
+ client = nil
32
+ # TODO: This is removed when V3 is deprecated
33
+ if params["cud"]
34
+ cud_client_id = JSON.parse(params["cud"])["client_id"]
35
+ params.merge!(:client_id => cud_client_id) if cud_client_id
36
+ end
37
+ client_id = @env[Rhoconnect::CLIENT_ID_HEADER]
38
+ client_id = params[:client_id] unless client_id
39
+ if client_id
40
+ client = Client.load(client_id.to_s,
41
+ params[:source_name] ? {:source_name => params[:source_name]} : {:source_name => '*'})
42
+ if client and current_user and client.user_id != current_user.login
43
+ client.switch_user(current_user.login)
44
+ end
45
+ end
46
+ client
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,22 @@
1
+ require 'rhoconnect/middleware/helpers'
2
+
3
+ module Rhoconnect
4
+ module Condition
5
+ module LoginRequired
6
+ def self.extended(base)
7
+ base.include_login_required_condition
8
+ end
9
+
10
+ def include_login_required_condition
11
+ set(:login_required) do |value|
12
+ #puts "lgin kls is #{self.to_s}"
13
+ condition do
14
+ if value
15
+ throw :halt, [401, {'Content-Type' => 'text/plain'}, "Not authenticated"] if @env[Rhoconnect::CURRENT_USER].nil?
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,49 @@
1
+ require 'rhoconnect/middleware/helpers'
2
+
3
+ module Rhoconnect
4
+ module Condition
5
+ module SourceRequired
6
+ def self.extended(base)
7
+ base.include_source_required_condition
8
+ end
9
+
10
+ def include_source_required_condition
11
+ set(:source_required) do |value|
12
+ condition do
13
+ if value
14
+ catch_all do
15
+ source = nil
16
+ user = current_user
17
+ # TODO - this should be removed when old routes are removed
18
+ if params["cud"]
19
+ cud_source_name = JSON.parse(params["cud"])["source_name"]
20
+ params.merge!({:source_name => cud_source_name}) if cud_source_name
21
+ end
22
+ # resource name is the source
23
+ if params[:source_name] and user
24
+ source = Source.load(params[:source_name],
25
+ {:user_id => user.login,:app_id => APP_NAME})
26
+
27
+ # if source does not exist create one for dynamic adapter
28
+ unless source
29
+ sconfig = Rhoconnect.source_config(params[:source_name])
30
+ source = Source.create(sconfig.merge!({:name => params[:source_name]}),{:user_id => user.login, :app_id => APP_NAME})
31
+ current_app.sources << source.name
32
+ end
33
+ else
34
+ Rhoconnect.log "ERROR: Can't load source, no source_name provided.\n"
35
+ raise ArgumentError.new(UNKNOWN_SOURCE)
36
+ end
37
+ #puts "loaded source: #{source.inspect}"
38
+ env[CURRENT_SOURCE] = source
39
+ # by default - all routes should have an access to the model
40
+ # if the route require source
41
+ @model = Rhoconnect::Model::Base.create(source)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,17 @@
1
+ module Rhoconnect
2
+ module Condition
3
+ module Verbs
4
+ def self.extended(base)
5
+ base.include_verbs_condition
6
+ end
7
+
8
+ def include_verbs_condition
9
+ set(:verbs) do |*verbs|
10
+ condition do
11
+ verbs.any?{|v| v == request.request_method }
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,19 @@
1
+ module Rhoconnect
2
+ module Condition
3
+ module VerifySuccess
4
+ def self.extended(base)
5
+ base.include_verify_success_condition
6
+ end
7
+
8
+ def include_verify_success_condition
9
+ set(:verify_success) do |value|
10
+ condition do
11
+ if value
12
+ success?
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,74 @@
1
+ module Rhoconnect
2
+ module Controller
3
+ class AppBase < Rhoconnect::Controller::Base
4
+ set_default :admin_required, false
5
+ set_default :login_required, false
6
+ set_default :source_required, false
7
+ set_default :client_required, false
8
+
9
+ def self.inherited(subclass)
10
+ subclass.set_default :admin_required, false
11
+ subclass.set_default :login_required, false
12
+ subclass.set_default :source_required, false
13
+ subclass.set_default :client_required, false
14
+ super
15
+ end
16
+
17
+ register Rhoconnect::Handler::Search
18
+ register Rhoconnect::Handler::BulkData
19
+
20
+ # main app controller
21
+ def self._rest_name
22
+ "app"
23
+ end
24
+
25
+ private
26
+ def self._prefix
27
+ "rc/#{Rhoconnect::API_VERSION}"
28
+ end
29
+ end
30
+ end
31
+
32
+ # aliasing Rhoconnect::Base class name to provide backward compatibility
33
+ # TODO: deprecate this class along with application.rb support
34
+ # and remove in 4.1
35
+ class Base < Rhoconnect::Controller::AppBase
36
+ def self.initializer(path=nil)
37
+ require 'rhoconnect/application/init'
38
+
39
+ # post deprecation warning !!!
40
+ warning_for_deprecated_application = <<_MIGRATE_TO_NEW_RHOCONNECT
41
+
42
+ ***** WARNING *****
43
+ RhoConnect has detected that you're using deprecated Application class.
44
+
45
+ Application class support will be removed in RhoConnect 4.1.
46
+ Please, migrate your Application class into ApplicationController.
47
+
48
+ For more details, see RhoConnect Migration guidelines at
49
+ docs.rhomobile.com
50
+
51
+ _MIGRATE_TO_NEW_RHOCONNECT
52
+ puts warning_for_deprecated_application
53
+
54
+ # !!! Add routes here - because otherwise they will be added in all apps
55
+ # even those that has new style Application class
56
+ self.register Rhoconnect::EndPoint
57
+
58
+ # Application login
59
+ post "/login", { :rc_handler => :authenticate, :deprecated_route => {:verb => :post, :url => ['/application/clientlogin', '/api/application/clientlogin']},
60
+ :client_required => false } do
61
+ Application.authenticate(params[:login], params[:password], session)
62
+ end
63
+
64
+ # Push service login
65
+ get "/rps_login", :rc_handler => :rps_authenticate, :client_required => false do
66
+ if Application.singleton_methods.map(&:to_sym).include?(:rps_authenticate)
67
+ Application.rps_authenticate(params[:login], params[:password])
68
+ else
69
+ false
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,68 @@
1
+ module Rhoconnect
2
+ module Controller
3
+ class Base < Rhoconnect::Server
4
+ def self.rest_path
5
+ "/#{_prefix}/#{_rest_name}"
6
+ end
7
+
8
+ def self._rest_name
9
+ ret = self.name
10
+ # remove the namespace
11
+ stripped = ret.split("::").last
12
+ ret = stripped unless stripped.nil?
13
+
14
+ ret.gsub!(/Controller/){}
15
+ end
16
+
17
+ def self._prefix
18
+ "app/#{Rhoconnect::API_VERSION}"
19
+ end
20
+
21
+ def self.get(route, params = {}, &block)
22
+ _add_route(route, :get, params, &block)
23
+ end
24
+
25
+ def self.post(route, params = {}, &block)
26
+ _add_route(route, :post, params, &block)
27
+ end
28
+
29
+ def self.put(route, params = {}, &block)
30
+ _add_route(route, :put, params, &block)
31
+ end
32
+
33
+ def self.delete(route, params = {}, &block)
34
+ _add_route(route, :delete, params, &block)
35
+ end
36
+
37
+ private
38
+ def self._add_route(route, verb, params, &block)
39
+ resource_route = route
40
+ @default_settings ||= {}
41
+ @default_settings.each do |setting, value|
42
+ params[setting] = value unless params.has_key?(setting)
43
+ end
44
+ api4 "#{self.rest_path}", resource_route, verb, params, &block
45
+ end
46
+ end
47
+
48
+ # the only purpose of this class is to prepend
49
+ # rest route with /rc/version prefix
50
+ # as opposed to Application-specific resources
51
+ class APIBase < Rhoconnect::Controller::Base
52
+ def self._rest_name
53
+ ret = self.name
54
+ # remove the namespace
55
+ stripped = ret.split("::").last
56
+ ret = stripped unless stripped.nil?
57
+
58
+ ret.gsub!(/Controller/){}
59
+ ret.downcase
60
+ end
61
+
62
+ private
63
+ def self._prefix
64
+ "rc/#{Rhoconnect::API_VERSION}"
65
+ end
66
+ end
67
+ end
68
+ end