rhoconnect 3.4.5 → 4.0.0.beta.10

Sign up to get free protection for your applications and to get access to all the features.
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,4 +1,5 @@
1
1
  require 'openssl'
2
+ require 'pathname'
2
3
 
3
4
  module Rhoconnect
4
5
  class LicenseException < RuntimeError; end
@@ -6,7 +7,7 @@ module Rhoconnect
6
7
 
7
8
  class License
8
9
  attr_reader :rhoconnect_version, :licensee, :seats, :issued
9
- #attr_accessor :license
10
+ attr_accessor :license
10
11
 
11
12
  # ships with rhoconnect
12
13
  RHO_PUBLICKEY = "99068e3a2708e6fe918252be8880eac539a1d2b2402651d75de5c7a2333a1cb2"
@@ -19,8 +20,15 @@ module Rhoconnect
19
20
  elsif ENV['RHOSYNC_LICENSE']
20
21
  @license = ENV['RHOSYNC_LICENSE']
21
22
  else
23
+ app_config = Rhoconnect.get_config(Rhoconnect.base_directory)
22
24
  settings = Rhoconnect.get_config(Rhoconnect.base_directory)[Rhoconnect.environment]
23
- @license = IO.read(File.join(Rhoconnect.base_directory,settings[:licensefile])).strip
25
+ licensefile = settings[:licensefile]
26
+ if licensefile
27
+ path_to_license = (Pathname.new(licensefile).absolute?) ? licensefile : File.join(Rhoconnect.base_directory, licensefile)
28
+ else
29
+ path_to_license = File.join(File.dirname(__FILE__), '..', '..', 'generators', 'templates', 'application', 'settings', 'license.key')
30
+ end
31
+ @license = IO.read(path_to_license).strip
24
32
  end
25
33
  _decrypt
26
34
  rescue Exception => e
@@ -9,9 +9,22 @@ module Rhoconnect
9
9
  end
10
10
 
11
11
  def call(env)
12
- env[Rhoconnect::CURRENT_USER] = Rhoconnect.extract_current_user(env)
12
+ #puts "env is *** #{env.inspect}"
13
+ env[Rhoconnect::CURRENT_USER] = extract_current_user(env)
13
14
  @app.call(env)
14
15
  end
16
+
17
+ def extract_current_user(env)
18
+ user = nil
19
+ if User.is_exist?(env['rack.session'][:login])
20
+ user = User.load(env['rack.session'][:login])
21
+ end
22
+ if user and (user.admin == 1 || env['rack.session'][:app_name] == APP_NAME)
23
+ user
24
+ else
25
+ nil
26
+ end
27
+ end
15
28
  end
16
29
  end
17
30
  end
@@ -4,6 +4,15 @@ module Rhoconnect
4
4
  CURRENT_REQUEST = 'CURRENT_REQUEST'.freeze
5
5
  CURRENT_APP = 'CURRENT_APP'.freeze
6
6
  CURRENT_USER = 'CURRENT_USER'.freeze
7
+ CURRENT_SOURCE = 'CURRENT_SOURCE'.freeze
8
+ CURRENT_CLIENT = 'CURRENT_CLIENT'.freeze
9
+ QUERY_RES = 'QUERY_RES'.freeze
10
+
11
+ UNKNOWN_CLIENT = "Unknown client".freeze
12
+ UNKNOWN_SOURCE = "Unknown source".freeze
13
+
14
+ # TODO : Remove in Rhoconnect 4.0
15
+ SYNC_VERSION = 3
7
16
 
8
17
  # header names, in the form of server's HTTP variables
9
18
  # X-RhoConnect-API-TOKEN
@@ -14,96 +23,4 @@ module Rhoconnect
14
23
  PAGE_TOKEN_HEADER = 'X-Rhoconnect-PAGE-TOKEN'
15
24
  # X-RhoConnect-PAGE-OBJECT-COUNT
16
25
  PAGE_OBJECT_COUNT_HEADER = 'X-Rhoconnect-PAGE-OBJECT-COUNT'
17
-
18
- # old-way admin routes
19
- OLD_API_URI_REGEXP = /\/api\//
20
- # new way system routes will be:
21
- # /rc/<version>/system/<method>
22
- # /rc/<version>/<resource>/<method>
23
- SYSTEM_API_URI_REGEXP = /\/rc\/\w+\/\w+/
24
- # also, /app/v1/<Controller>/push_* are still remain Admin routes
25
- PUSH_API_URI_REGEXP = /\/app\/\w+\/\w+\/push\w+/
26
- # also, /app/v1/<Controller>/fast_* are still remain Admin routes
27
- FAST_CUD_API_URI_REGEXP = /\/app\/\w+\/\w+\/fast\w+/
28
-
29
- def is_clients_non_admin_route(env)
30
- # FIXME : not all routes for Clients protocol are admin routes
31
- full_path = env['SCRIPT_NAME'] + env['PATH_INFO']
32
- /\/rc\/\w+\/clients/.match(full_path) and not ((env[CURRENT_REQUEST].request_method == 'GET') ||
33
- (env[CURRENT_REQUEST].request_method == 'POST' and /\/rc\/\w+\/clients\/\w+\/sources/.match(full_path)))
34
- end
35
-
36
- def is_client_route(env)
37
- # FIXME - once Controllers concept is implemented
38
- # remove this - since the inclusion of Admin Middleware
39
- # will automatically imply what routes are Admin and which are not
40
- full_path = env['SCRIPT_NAME'] + env['PATH_INFO']
41
- # login route and index route doesn't need a token
42
- return true if /\/login/.match(full_path) || full_path == '/'
43
- # old application routes are not admin
44
- return true if full_path == '/application'
45
- return true if full_path == '/api/application'
46
- return true if /\/application\//.match(full_path)
47
- # some of the clients routes are not admin
48
- return true if is_clients_non_admin_route(env)
49
- # push_objects and push_deletes methods are admin
50
- return false if PUSH_API_URI_REGEXP.match(full_path)
51
- # fast_insert/update/delete methods are admin
52
- return false if FAST_CUD_API_URI_REGEXP.match(full_path)
53
- # old api methods + every method in /rc/v1/app namespace
54
- return true if /\/app\//.match(full_path)
55
- # all other methods in the /rc/v1/ are admin routes
56
- return false if SYSTEM_API_URI_REGEXP.match(full_path)
57
- # all old /api methods are admin as well
58
- return false if OLD_API_URI_REGEXP.match(full_path)
59
-
60
- # everything else should not be admin
61
- true
62
- end
63
-
64
- def is_admin_route(env)
65
- not is_client_route(env)
66
- end
67
-
68
- def is_login_required(env)
69
- # FIXME - once Controllers concept is implemented
70
- # remove this - since the inclusion of LoginRequired Middleware
71
- # will automatically imply what routes require Login and which are not
72
- full_path = env['SCRIPT_NAME'] + env['PATH_INFO']
73
- return false if full_path == '/' or /login/.match(full_path)
74
- # all methods in app namespace
75
- return true if /\/app\//.match(full_path)
76
- # old application routes are not admin
77
- return true if full_path == '/application'
78
- return true if full_path == '/api/application'
79
- return true if /\/application\//.match(full_path)
80
- # also methods that operate on clients should have an associated user
81
- return true if is_clients_non_admin_route(env)
82
-
83
- # for every other route login is not required
84
- # because it's either an admin route (where api_user must be supplied anyway)
85
- # or it's a custom route extending RhoConnect server
86
- false
87
- end
88
-
89
- def extract_current_user(env)
90
- user = nil
91
- if User.is_exist?(env['rack.session'][:login])
92
- user = User.load(env['rack.session'][:login])
93
- end
94
- if user and (user.admin == 1 || env['rack.session'][:app_name] == APP_NAME)
95
- user
96
- else
97
- nil
98
- end
99
- end
100
-
101
- def extract_api_user(env)
102
- r = env[CURRENT_REQUEST]
103
- # API_TOKEN is either a param or a header
104
- u = ApiToken.load(env[API_TOKEN_HEADER])
105
- u = ApiToken.load(r.params['api_token']) unless u
106
- raise Rhoconnect::ApiException.new(422, "No API token provided") unless u
107
- u.user
108
- end
109
- end
26
+ end
@@ -21,7 +21,7 @@ module Rhoconnect
21
21
  if is_sync_protocol(env)
22
22
  env['HTTP_COOKIE'] = env['HTTP_COOKIE'] || CGI.unescape(get_session_from_url(env))
23
23
  end
24
-
24
+ #puts "and here #{@app.inspect} #{env.inspect}"
25
25
  status, headers, body = @app.call(env)
26
26
 
27
27
  if is_sync_protocol(env)
@@ -0,0 +1,229 @@
1
+ module Rhoconnect
2
+ module Model
3
+ class Exception < RuntimeError; end
4
+ # raise this to cause client to be logged out during a sync
5
+ class LoginException < Rhoconnect::Model::Exception; end
6
+ class LogoffException < Rhoconnect::Model::Exception; end
7
+ # raise these to trigger rhoconnect sending an error to the client
8
+ class ServerTimeoutException < Rhoconnect::Model::Exception; end
9
+ class ServerErrorException < Rhoconnect::Model::Exception; end
10
+ class ObjectConflictErrorException < Rhoconnect::Model::Exception; end
11
+
12
+ class Base
13
+ attr_accessor :session, :source
14
+
15
+ def initialize(source)
16
+ @source = source
17
+ end
18
+
19
+ # public API Method for loading an instance of the Model
20
+ def self.load(username)
21
+ source = Source.load(self.name,
22
+ {:user_id => username,:app_id => APP_NAME})
23
+ self.create(source)
24
+ end
25
+
26
+ # public API method to load the Model's data
27
+ def get_data(docname = :md)
28
+ source.get_data(docname)
29
+ end
30
+
31
+ def self.create(source)
32
+ model=nil
33
+ if source
34
+ begin
35
+ if source.name
36
+ source.name = source.name.dup if source.name.frozen?
37
+ source.name.strip!
38
+ end
39
+ # certain models are pre-defined and reserved
40
+ # load them and instantiate
41
+ if Rhoconnect.predefined_sources.has_key?(source.name)
42
+ model = (Object.const_get(source.name)).new(source)
43
+ elsif Object.const_defined?(source.name) && Object.const_get(source.name).to_s.split("::").first != 'Rhoconnect'
44
+ # fix until source adpaters are phased out, checking for Rhoconnect namespace
45
+ # so that backend models with same name as Rhoconnect models are instantiated correctly
46
+ kls = Object.const_get(source.name)
47
+ unless kls
48
+ require under_score(source.name)
49
+ model = (Object.const_get(source.name)).new(source)
50
+ else
51
+ model = kls.new(source)
52
+ end
53
+ else
54
+ model=Rhoconnect::Model::DynamicAdapterModel.new(source)
55
+ end
56
+ rescue ArgumentError => e
57
+ # Backward compatibility with code generated by gems < 2.2.0
58
+ log "ERROR: credential parameter in `initialize` method is deprecated and removed in version >= 2.2.0."
59
+ raise e
60
+ rescue Exception => e
61
+ log "Failure to create model from class #{source.name}: #{e.inspect.to_s}"
62
+ raise e
63
+ end
64
+ end
65
+ model
66
+ end
67
+
68
+ def login; end
69
+
70
+ def query(params=nil); end
71
+
72
+ def search(params=nil); end
73
+
74
+ def sync
75
+ if @result and @result.empty?
76
+ @source.lock(:md) do |s|
77
+ s.flush_data(:md)
78
+ s.put_value(:md_size,0)
79
+ end
80
+ else
81
+ if @result
82
+ @source.put_tmp_data(@tmp_docname,@result)
83
+ @stash_size += @result.size
84
+ end
85
+ @source.lock(:md) do |s|
86
+ s.flush_data(:md)
87
+ s.rename_tmp_data(@tmp_docname,:md)
88
+ s.put_value(:md_size,@stash_size)
89
+ end
90
+ end
91
+ end
92
+
93
+ def before_query
94
+ @tmp_docname = :md.to_s + get_random_uuid
95
+ @stash_size = 0
96
+ end
97
+
98
+ def after_query
99
+ res = nil
100
+ if @source.is_pass_through?
101
+ res = @result
102
+ else
103
+ self.sync
104
+ res = true
105
+ end
106
+ res
107
+ end
108
+
109
+ def do_query(params=nil)
110
+ before_query
111
+ params ? self.query(params) : self.query
112
+ after_query
113
+ end
114
+
115
+ def stash_result
116
+ return if @result.nil?
117
+ @source.put_tmp_data(@tmp_docname,@result,true)
118
+ @stash_size += @result.size
119
+ @result = nil
120
+ end
121
+
122
+ def expire_bulk_data(partition = :user)
123
+ Rhoconnect.expire_bulk_data(current_user.login,partition)
124
+ end
125
+
126
+ # do pre-processing before CUD operation
127
+ def validate(operation,operations_hashes,client_ids)
128
+ {}
129
+ end
130
+
131
+ def create(create_hash); end
132
+
133
+ def update(update_hash); end
134
+
135
+ def delete(delete_hash); end
136
+
137
+ def ask(params=nil); end
138
+
139
+ def logoff; end
140
+
141
+ # re-define in subc;ass to provide your own filename
142
+ def store_blob(obj,field_name,blob)
143
+ blob[:tempfile].path if blob[:tempfile]
144
+ end
145
+
146
+ # plugin callbacks implementation
147
+ def push_objects(params)
148
+ timeout = params[:timeout] || 10
149
+ raise_on_expire = params[:raise_on_expire] || false
150
+ rebuild_md = params[:rebuild_md].nil? ? true : params[:rebuild_md]
151
+ objects = params[:objects]
152
+
153
+ @source.lock(:md,timeout,raise_on_expire) do |s|
154
+ diff_count = 0
155
+ # in case of rebuild_md
156
+ # we clean-up and rebuild the whole :md doc
157
+ # on every request
158
+ if(rebuild_md)
159
+ doc = @source.get_data(:md)
160
+ orig_doc_size = doc.size
161
+ objects.each do |id,obj|
162
+ doc[id] ||= {}
163
+ doc[id].merge!(obj)
164
+ end if objects
165
+ diff_count = doc.size - orig_doc_size
166
+ @source.put_data(:md,doc)
167
+ else
168
+ # if rebuild_md == false
169
+ # we only operate on specific set values
170
+ # which brings a big optimization
171
+ # in case of small transactions
172
+ diff_count = @source.update_objects(:md, objects)
173
+ end
174
+
175
+ @source.update_count(:md_size,diff_count)
176
+ end
177
+ @source.announce_changes
178
+ end
179
+
180
+ def push_deletes(params)
181
+ timeout = params[:timeout] || 10
182
+ raise_on_expire = params[:raise_on_expire] || false
183
+ rebuild_md = params[:rebuild_md].nil? ? true : params[:rebuild_md]
184
+ objects = params[:objects]
185
+
186
+ @source.lock(:md,timeout,raise_on_expire) do |s|
187
+ diff_count = 0
188
+ if(rebuild_md)
189
+ # in case of rebuild_md
190
+ # we clean-up and rebuild the whole :md doc
191
+ # on every request
192
+ doc = @source.get_data(:md)
193
+ orig_doc_size = doc.size
194
+ objects.each do |id|
195
+ doc.delete(id)
196
+ end if objects
197
+ diff_count = doc.size - orig_doc_size
198
+ @source.put_data(:md,doc)
199
+ else
200
+ # if rebuild_md == false
201
+ # we only operate on specific set values
202
+ # which brings a big optimization
203
+ # in case of small transactions
204
+ diff_count = -@source.remove_objects(:md, objects)
205
+ end
206
+
207
+ @source.update_count(:md_size,diff_count)
208
+ end
209
+ @source.announce_changes
210
+ end
211
+
212
+ protected
213
+ def current_user
214
+ @source.user
215
+ end
216
+
217
+ end
218
+ end
219
+
220
+ # to preserve backward compatibility
221
+ # TODO: Remove in 4.1
222
+ SourceAdapter = Rhoconnect::Model::Base
223
+ SourceAdapterException = Rhoconnect::Model::Exception
224
+ SourceAdapterLoginException = Rhoconnect::Model::LoginException
225
+ SourceAdapterLogoffException = Rhoconnect::Model::LogoffException
226
+ SourceAdapterServerTimeoutException = Rhoconnect::Model::ServerTimeoutException
227
+ SourceAdapterServerErrorException = Rhoconnect::Model::ServerErrorException
228
+ SourceAdapterObjectConflictErrorException = Rhoconnect::Model::ObjectConflictErrorException
229
+ end
@@ -0,0 +1,90 @@
1
+ require 'json'
2
+ require 'rest_client'
3
+ require 'uri'
4
+
5
+ module Rhoconnect
6
+ module Model
7
+ class DynamicAdapterModel < Rhoconnect::Model::Base
8
+ attr_accessor :uri, :partition
9
+
10
+ def initialize(source, partition=nil, uri=nil)
11
+ @source = source
12
+ @uri = uri || Rhoconnect.appserver
13
+ @partition = partition || @source.user_id
14
+
15
+ if @uri
16
+ @uri = URI.parse(@uri)
17
+ user = @uri.user
18
+ @uri.user = nil
19
+ @uri = @uri.to_s
20
+ end
21
+
22
+ @token = Rhoconnect.api_token || user
23
+ raise Exception.new("Please provide a :token or set it in uri") unless @token
24
+ super(source)
25
+ end
26
+
27
+ def self.authenticate(login,password)
28
+ hsh = {:login => login, :password => password, :api_token => Rhoconnect.api_token}.to_json
29
+ headers = {:content_type => :json, :accept => :json}
30
+ RestClient.post "#{Rhoconnect.appserver}/rhoconnect/authenticate", hsh, headers
31
+ end
32
+
33
+ def query(params=nil)
34
+ @result={}
35
+ @result = JSON.parse(send_objects('query',@source.name, @partition, params))
36
+ end
37
+
38
+ def create(create_hash)
39
+ send_objects('create',@source.name, @partition, create_hash)
40
+ end
41
+
42
+ def update(update_hash)
43
+ send_objects('update',@source.name, @partition, update_hash)
44
+ end
45
+
46
+ def delete(delete_hash)
47
+ send_objects('delete',@source.name, @partition, delete_hash)
48
+ end
49
+
50
+ #protected
51
+
52
+ def validate_args(action, source_name, partition, obj = {}) # :nodoc:
53
+ raise Exception.new("Please set uri in your settings or through console") unless @uri
54
+ raise ArgumentError.new("Missing object id for #{obj.inspect}") if ['update','delete'].include? action and not obj.has_key?('id')
55
+ raise ArgumentError.new("Missing source_name.") if source_name.empty?
56
+ #raise ArgumentError.new("Missing partition for #{model}.") unless partition or partition.blank?
57
+ end
58
+
59
+ def send_objects(action, source_name, partition, obj = {}) # :nodoc:
60
+ validate_args(action, source_name, partition, obj)
61
+ process(:post, "/rhoconnect/#{action}",
62
+ {
63
+ :resource => source_name,
64
+ :partition => partition,
65
+ :attributes => obj
66
+ }
67
+ )
68
+ end
69
+
70
+ def resource(path) # :nodoc:
71
+ RestClient::Resource.new(@uri)[path]
72
+ end
73
+
74
+ def process(method, path, payload = nil) # :nodoc:
75
+ headers = api_headers
76
+ payload = payload.merge!(:api_token => @token).to_json
77
+ args = [method, payload, headers].compact
78
+ response = resource(path).send(*args)
79
+ response
80
+ end
81
+
82
+ def api_headers # :nodoc:
83
+ {
84
+ :content_type => :json,
85
+ :accept => :json
86
+ }
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,121 @@
1
+ module Rhoconnect
2
+ module Model
3
+ class JsBase < Rhoconnect::Model::Base
4
+ class << self
5
+ attr_accessor :js_method_list,:actual_name
6
+ end
7
+ attr_accessor :result
8
+
9
+ def method_missing(method_name,*args)
10
+ obj = Object.const_get(self.class.to_s)
11
+ if obj.js_method_list.include? method_name.to_s
12
+ package_and_publish(method_name,args)
13
+ else
14
+ log "METHOD #{method_name} NOT DEFINED IN JS MODEL #{self.class.to_s}"
15
+ return "#{method_name} method not defined for #{self.class.to_s}"
16
+ end
17
+ end
18
+
19
+ def self.register_models(models)
20
+ app = App.load(APP_NAME)
21
+ models.each do |key,val|
22
+ a_name = key
23
+ klassified = key.classify
24
+ unless Object.const_defined?(klassified)
25
+ klass = Object.const_set(klassified, Class.new(Rhoconnect::Model::JsBase))
26
+ klass.js_method_list = val
27
+ klass.actual_name = a_name
28
+ end
29
+ source = Source.load(klassified,{:app_id=>APP_NAME,:user_id=>'*'})
30
+ unless source
31
+ sconfig = Rhoconnect.source_config(klassified)
32
+ Source.create(sconfig.merge!(:name => klassified),{:app_id => APP_NAME})
33
+ app.sources << klassified
34
+ end
35
+ end
36
+ end
37
+
38
+ def login
39
+ rho_methods('login')
40
+ end
41
+
42
+ def query(params=nil)
43
+ @result = rho_methods('query',params)
44
+ end
45
+
46
+ def search(params=nil)
47
+ rho_methods('search',params)
48
+ end
49
+
50
+ def create(create_hash)
51
+ rho_methods('create',create_hash)
52
+ end
53
+
54
+ def update(update_hash)
55
+ rho_methods('update',update_hash)
56
+ end
57
+
58
+ def delete(delete_hash)
59
+ rho_methods('delete',delete_hash)
60
+ end
61
+
62
+ def logoff
63
+ rho_methods('logoff')
64
+ end
65
+
66
+ def store_blob(obj,field_name,blob)
67
+ raise "store_blob not implemented in JavaScript yet."
68
+ # TODO: add method handling here
69
+ end
70
+
71
+ private
72
+
73
+ def rho_methods(name,args=nil)
74
+ obj = Object.const_get(self.class.to_s)
75
+ if obj.js_method_list.include? name
76
+ package_and_publish(name,args)
77
+ else
78
+ sup.send(name,args)
79
+ end
80
+ end
81
+
82
+ def package_and_publish(method_name,args=nil)
83
+ json = {
84
+ :klss => self.class.actual_name,
85
+ :function => method_name,
86
+ :args => args,
87
+ :route => 'request'
88
+ }
89
+ NodeChannel.publish_channel_and_wait(json,self.class)
90
+ end
91
+ end
92
+ end
93
+ end
94
+
95
+ #allows me to call super method by passing string
96
+ class SuperProxy
97
+ def initialize(obj)
98
+ @obj = obj
99
+ end
100
+
101
+ def method_missing(meth, *args)
102
+ @obj.class.superclass.superclass.instance_method(meth).bind(@obj).call(*args)
103
+ end
104
+ end
105
+
106
+ class Object
107
+ private
108
+ def sup
109
+ SuperProxy.new(self)
110
+ end
111
+ end
112
+
113
+ class String
114
+ def classify
115
+ result = self.split("_").inject("") do |res,index|
116
+ res += index.capitalize
117
+ res
118
+ end
119
+ result
120
+ end
121
+ end
@@ -24,7 +24,7 @@ module Rhoconnect
24
24
  send_ping_to_device(authtoken, params)
25
25
  rescue InvalidAuthToken => error
26
26
  if not already_retried
27
- Store.flash_data(C2DM_AUTHTOKEN_KEY)
27
+ Store.flush_data(C2DM_AUTHTOKEN_KEY)
28
28
  already_retried = true
29
29
  retry
30
30
  end
@@ -6,7 +6,7 @@ module Rhoconnect
6
6
  # register the adapter as pre-defined
7
7
  Rhoconnect.register_predefined_source('RhoInternalBenchmarkAdapter')
8
8
 
9
- class RhoInternalBenchmarkAdapter < Rhoconnect::SourceAdapter
9
+ class RhoInternalBenchmarkAdapter < Rhoconnect::Model::Base
10
10
  def initialize(source)
11
11
  super(source)
12
12
  end
@@ -22,10 +22,10 @@ module Rhoconnect
22
22
  #end
23
23
  sleep @source.simulate_time
24
24
  end
25
- Rhoconnect::Store.lock(lock_name,1) do
25
+ #Rhoconnect::Store.lock(lock_name,1) do
26
26
  @result = Rhoconnect::Store.get_data(db_name)
27
- end
28
- @result
27
+ #end
28
+ #@result
29
29
  end
30
30
 
31
31
  def create(create_hash)
@@ -54,12 +54,15 @@ module Rhoconnect
54
54
  Rhoconnect::Store.lock(lock_name,1) do
55
55
  Rhoconnect::Store.delete_data(db_name,{id=>delete_hash}) if id
56
56
  end
57
+ id
57
58
  end
58
59
 
59
60
  def db_name
60
61
  res = ''
61
62
  if @source.user_id[0..1] == 'nq'
62
63
  res = "test_db_storage:#{@source.app_id}:nquser"
64
+ elsif @source.user_id[0..1] == 'mq'
65
+ res = "test_db_storage:#{@source.app_id}:mquser"
63
66
  else
64
67
  res = "test_db_storage:#{@source.app_id}:benchuser"
65
68
  end
@@ -1,5 +1,5 @@
1
1
  module Rhoconnect
2
- class ReadState < Model
2
+ class ReadState < StoreOrm
3
3
  field :refresh_time, :integer
4
4
  field :prev_refresh_time, :integer
5
5
  field :retry_counter, :integer
@@ -20,11 +20,11 @@ module Rhoconnect
20
20
  end
21
21
 
22
22
  def self.delete(app_id)
23
- Store.flash_data("#{class_prefix(self)}:#{app_id}:*")
23
+ Store.flush_data("#{class_prefix(self)}:#{app_id}:*")
24
24
  end
25
25
 
26
26
  def self.delete_user(params)
27
- Store.flash_data("#{class_prefix(self)}:#{params[:app_id]}:#{params[:user_id]}:#{params[:source_name]}:*")
27
+ Store.flush_data("#{class_prefix(self)}:#{params[:app_id]}:#{params[:user_id]}:#{params[:source_name]}:*")
28
28
  end
29
29
 
30
30
  private