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
@@ -0,0 +1,79 @@
1
+ module Rhoconnect
2
+ module Controller
3
+ class ClientsController < Rhoconnect::Controller::APIBase
4
+ set_default :admin_required, true
5
+ set_default :login_required, false
6
+ set_default :source_required, false
7
+ set_default :client_required, false
8
+
9
+ register Rhoconnect::EndPoint
10
+
11
+ post "/", :admin_required => false, :login_required => true, \
12
+ :deprecated_route => {:verb => :get, :url => ['/application/clientcreate', '/api/application/clientcreate']} do
13
+ content_type :json
14
+ client = Client.create(:user_id => current_user.id,:app_id => current_app.id)
15
+ client.update_fields(params)
16
+ { "client" => { "client_id" => client.id.to_s } }.to_json
17
+ end
18
+
19
+ post "/:client_id/register", :admin_required => false, :login_required => true, \
20
+ :deprecated_route => {:verb => :post, :url => ['/application/clientregister', '/api/application/clientregister'] } do
21
+ cur_client = extract_current_client
22
+ if cur_client.nil? and current_user and current_app
23
+ fields = {:user_id => current_user.id}
24
+ fields[:id] = params[:client_id].to_s
25
+ fields[:app_id] = current_app.id
26
+ cur_client = Client.create(fields)
27
+ end
28
+ cur_client.update_fields(params)
29
+ status 200
30
+ end
31
+
32
+ post "/:client_id/reset", :admin_required => false, :login_required => true, :client_required => true, \
33
+ :deprecated_route => {:verb => :get, :url => ['/application/clientreset', '/api/application/clientreset']} do
34
+ # Resets the store for a given app,client
35
+ if params == nil or params[:sources] == nil
36
+ current_client.flush_all_documents
37
+ else
38
+ params[:sources].each do |source|
39
+ current_client.flush_source_documents(source['name'])
40
+ end
41
+ end
42
+ status 200
43
+ end
44
+
45
+ get "/:client_id/sources/:source_id/docs/:doc" do
46
+ c = Client.load(params[:client_id],{:source_name => params[:source_id]})
47
+ c.get_db_doc(params[:doc])
48
+ end
49
+
50
+ post "/:client_id/sources/:source_id/docs/:doc" do
51
+ c = Client.load(params[:client_id],{:source_name => params[:source_id]})
52
+ append_to_doc = params[:append]
53
+ append_to_doc ||= false
54
+ c.set_db_doc(params[:doc], params[:data],append_to_doc)
55
+ ''
56
+ end
57
+
58
+ get "/:client_id", \
59
+ :deprecated_route => {:verb => :post, :url => ['/api/get_client_params', '/api/client/get_client_params']} do
60
+ Client.load(params[:client_id],{:source_name => '*'}).to_array.to_json
61
+ end
62
+
63
+ get "/:client_id/sources/:source_id/docnames", \
64
+ :deprecated_route => {:verb => :post, :url => ['/api/list_client_docs', '/api/client/list_client_docs']} do
65
+ result = ""
66
+ Rhoconnect::Stats::Record.update('clientdocs') do
67
+ c = Client.load(params[:client_id],{:source_name => params[:source_id]})
68
+ res = {}
69
+ Client.valid_doctypes.each do |doc|
70
+ db_key = c.docname(doc)
71
+ res.merge!(doc => db_key)
72
+ end
73
+ result = res.to_json
74
+ end
75
+ result
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,93 @@
1
+ module Rhoconnect
2
+ module Controller
3
+ class DynamicAdapterController < Rhoconnect::Controller::Base
4
+ set_default :admin_required, false
5
+ set_default :login_required, true
6
+ set_default :source_required, true
7
+ set_default :client_required, true
8
+
9
+ register Rhoconnect::EndPoint
10
+
11
+ # QUERY
12
+ get "/:source_name", :rc_handler => :query do
13
+ @model.query(params[:query])
14
+ end
15
+
16
+ # CUD
17
+ post "/:source_name", :rc_handler => :cud do
18
+ operation = params[:operation]
19
+ @model.send operation.to_sym, params["#{operation}_object".to_sym]
20
+ end
21
+
22
+ put "/:source_name/:id", :rc_handler => :update do
23
+ @model.update(params[:update_object])
24
+ end
25
+
26
+ delete "/:source_name/:id", :rc_handler => :delete do
27
+ @model.delete(params[:delete_object])
28
+ end
29
+
30
+ # push objects
31
+ post "/:source_id/push_objects", \
32
+ { :rc_handler => :push_objects,
33
+ :admin_required => true,
34
+ :login_required => false,
35
+ :source_required => false,
36
+ :client_required => false,
37
+ :deprecated_route => {:verb => :post, :url => ['/api/push_objects', '/api/source/push_objects']}
38
+ } do
39
+ @model.push_objects(params)
40
+ end
41
+
42
+ # push_deletes
43
+ post "/:source_id/push_deletes", \
44
+ { :rc_handler => :push_deletes,
45
+ :admin_required => true,
46
+ :login_required => false,
47
+ :source_required => false,
48
+ :client_required => false,
49
+ :deprecated_route => {:verb => :post, :url => ['/api/push_deletes', '/api/source/push_deletes']}
50
+ } do
51
+ @model.push_deletes(params)
52
+ end
53
+
54
+ # fast insert
55
+ post "/:source_id/fast_insert", \
56
+ { :admin_required => true,
57
+ :login_required => false,
58
+ :source_required => false,
59
+ :client_required => false,
60
+ :deprecated_route => {:verb => :post, :url => ['/api/fast_insert', '/api/source/fast_insert']}
61
+ } do
62
+ do_fast_insert
63
+ end
64
+
65
+ # fast update
66
+ post "/:source_id/fast_update", \
67
+ { :admin_required => true,
68
+ :login_required => false,
69
+ :source_required => false,
70
+ :client_required => false,
71
+ :deprecated_route => {:verb => :post, :url => ['/api/fast_update', '/api/source/fast_update']}
72
+ } do
73
+ do_fast_update
74
+ end
75
+
76
+ # fast object delete
77
+ post "/:source_id/fast_delete", \
78
+ { :admin_required => true,
79
+ :login_required => false,
80
+ :source_required => false,
81
+ :client_required => false,
82
+ :deprecated_route => {:verb => :post, :url => ['/api/fast_delete', '/api/source/fast_delete']}
83
+ } do
84
+ do_fast_delete
85
+ end
86
+
87
+ private
88
+ def self.rest_path
89
+ "/app/#{Rhoconnect::API_VERSION}"
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,124 @@
1
+ module Rhoconnect
2
+ module Controller
3
+ module JsBaseHelpers
4
+ def query_finish(return_value)
5
+ @model.result = return_value
6
+ end
7
+ end
8
+
9
+ class JsBase < Rhoconnect::Controller::Base
10
+
11
+ # Add helpers for deprecated routes
12
+ Rhoconnect::DefaultServer.helpers Rhoconnect::Controller::JsBaseHelpers
13
+
14
+ helpers Rhoconnect::Controller::JsBaseHelpers
15
+
16
+ # source name is available inherently from controller
17
+ before do
18
+ params[:source_name] = self.class._rest_name
19
+ params[:source_id] = self.class._rest_name
20
+ end
21
+
22
+ def self.register_routes(json)
23
+ Rhoconnect::Model::JsBase.register_models(json['models'])
24
+ json['result'].each do |key,val|
25
+ controller_name = "#{key}Controller"
26
+ next if Object.const_defined?(controller_name)
27
+ if controller_name == 'ApplicationController'
28
+ klass = Object.const_set(controller_name, Class.new(Rhoconnect::Controller::JsAppBase))
29
+ else
30
+ klass = Object.const_set(controller_name, Class.new(Rhoconnect::Controller::JsBase))
31
+ end
32
+ Rhoconnect.add_to_url_map(klass)
33
+ process_defaults(klass,val['defaults'])
34
+ process_routes(klass,val['routes'])
35
+ end
36
+ end
37
+
38
+ private
39
+
40
+ def self.process_defaults(klass,defaults)
41
+ defaults.each do |default|
42
+ default.each do |key,val|
43
+ klass.send(:set_default,key,val)
44
+ end
45
+ end
46
+ end
47
+
48
+ def self.process_routes(klass,routes)
49
+ routes.each do |r|
50
+ opts = {}
51
+ s_route = r.split('_rjs_')
52
+ verb = s_route[0]
53
+ action = s_route[2]
54
+ opts = hshify(s_route[3]) if s_route[3]
55
+ block = js_block(r)
56
+ case opts[:rc_handler]
57
+ when 'query'
58
+ block = js_block(r,:query_finish)
59
+ end
60
+ klass.send(verb,action,opts,&block)
61
+ end
62
+ end
63
+
64
+ def self.hshify(str)
65
+ result = JSON.parse(str, :symbolize_names => true)
66
+ # result = str.split(",").inject({}) do |res,element|
67
+ # items = element.split(":")
68
+ # res[items[0].to_sym] = items[1]
69
+ # res
70
+ # end
71
+ result
72
+ end
73
+
74
+ def self.js_block(key,finish_block=nil)
75
+ Proc.new do
76
+ json = {
77
+ :url => key,
78
+ :args => params,
79
+ :model => under_score(params[:source_name]),
80
+ :route => 'request'
81
+ }
82
+ return_value = NodeChannel.publish_channel_and_wait(json,@model)
83
+ if finish_block
84
+ self.send(finish_block, return_value)
85
+ else
86
+ return_value
87
+ end
88
+ end
89
+ end
90
+
91
+ def self._prefix
92
+ "app/#{Rhoconnect::API_VERSION}"
93
+ end
94
+
95
+ end
96
+ class JsAppBase < Rhoconnect::Controller::JsBase
97
+ set_default :admin_required, false
98
+ set_default :login_required, false
99
+ set_default :source_required, false
100
+ set_default :client_required, false
101
+
102
+ def self.inherited(subclass)
103
+ subclass.set_default :admin_required, false
104
+ subclass.set_default :login_required, false
105
+ subclass.set_default :source_required, false
106
+ subclass.set_default :client_required, false
107
+ super
108
+ end
109
+
110
+ register Rhoconnect::Handler::Search
111
+ register Rhoconnect::Handler::BulkData
112
+
113
+ # main app controller
114
+ def self._rest_name
115
+ "app"
116
+ end
117
+
118
+ private
119
+ def self._prefix
120
+ "rc/#{Rhoconnect::API_VERSION}"
121
+ end
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,22 @@
1
+ module Rhoconnect
2
+ module Controller
3
+ class ReadStateController < Rhoconnect::Controller::APIBase
4
+ set_default :admin_required, true
5
+ set_default :login_required, false
6
+ set_default :source_required, false
7
+ set_default :client_required, false
8
+
9
+ register Rhoconnect::EndPoint
10
+
11
+ put "/users/:user_name/sources/:source_name", \
12
+ :deprecated_route => {:verb => :post, :url => ['/api/set_refresh_time', '/api/source/set_refresh_time']} do
13
+ source = Source.load(params[:source_name],
14
+ {:app_id => APP_NAME, :user_id => params[:user_name]})
15
+ source.poll_interval = params[:poll_interval] if params[:poll_interval]
16
+ params[:refresh_time] ||= 0
17
+ source.read_state.refresh_time = Time.now.to_i + params[:refresh_time].to_i
18
+ ''
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,14 @@
1
+ module Rhoconnect
2
+ module Controller
3
+ class SourceAdapterBase < Rhoconnect::Controller::Base
4
+ # create SourceAdapterController class for every source
5
+ def self.register_controller(source_name)
6
+ return if Object.const_defined?("#{source_name}Controller")
7
+ # klass will be added automatically to the URL map
8
+ klass = Object.const_set("#{source_name}Controller", Class.new(Rhoconnect::Controller::SourceAdapterBase))
9
+ klass.register Rhoconnect::EndPoint
10
+ klass.register Rhoconnect::Handler::Sync
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,44 @@
1
+ module Rhoconnect
2
+ module Controller
3
+ class SourcesController < Rhoconnect::Controller::APIBase
4
+ set_default :admin_required, true
5
+ set_default :login_required, false
6
+ set_default :source_required, false
7
+ set_default :client_required, false
8
+
9
+ register Rhoconnect::EndPoint
10
+
11
+ # get source's params
12
+ get "/:source_id", \
13
+ :deprecated_route => {:verb => :post, :url => ['/api/get_source_params', '/api/source/get_source_params']} do
14
+ Source.load(params[:source_id],{:app_id => APP_NAME,:user_id => '*'}).to_array.to_json
15
+ end
16
+
17
+ # get all sources with particular partition type
18
+ get "/type/:partition_type", \
19
+ :deprecated_route => {:verb => :post, :url => ['/api/list_sources', '/api/source/list_sources']} do
20
+ sources = App.load(APP_NAME).sources
21
+ if params['partition_type'].nil? or params['partition_type'] == 'all'
22
+ sources.to_json
23
+ else
24
+ res = []
25
+ sources.each do |name|
26
+ s = Source.load(name,{:app_id => APP_NAME,:user_id => '*'})
27
+ if s and s.partition_type and s.partition_type == params['partition_type'].to_sym
28
+ res << name
29
+ end
30
+ end
31
+ res.to_json
32
+ end
33
+ end
34
+
35
+ # update source's params
36
+ put "/:source_id" do
37
+ source = Source.load(params[:source_id],
38
+ {:app_id => APP_NAME, :user_id => '*'})
39
+ source.update_fields(params[:data])
40
+ ''
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,25 @@
1
+ module Rhoconnect
2
+ module Controller
3
+ class StoreController < Rhoconnect::Controller::APIBase
4
+ set_default :admin_required, true
5
+ set_default :login_required, false
6
+ set_default :source_required, false
7
+ set_default :client_required, false
8
+
9
+ register Rhoconnect::EndPoint
10
+
11
+ get "/:doc", \
12
+ :deprecated_route => {:verb => :post, :url => ['/api/get_db_doc', '/api/source/get_db_doc']} do
13
+ Store.get_db_doc(params[:doc])
14
+ end
15
+
16
+ post "/:doc", \
17
+ :deprecated_route => {:verb => :post, :url => ['/api/set_db_doc', '/api/source/set_db_doc'] } do
18
+ append_to_doc = params[:append]
19
+ append_to_doc ||= false
20
+ Store.set_db_doc(params[:doc],params[:data],append_to_doc)
21
+ ''
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,67 @@
1
+ module Rhoconnect
2
+ module Controller
3
+ class SystemController < Rhoconnect::Controller::APIBase
4
+ set_default :admin_required, true
5
+ set_default :login_required, false
6
+ set_default :source_required, false
7
+ set_default :client_required, false
8
+
9
+ register Rhoconnect::EndPoint
10
+
11
+ get "/appserver", \
12
+ :deprecated_route => {:verb => :post, :url => ['/api/get_adapter', '/api/source/get_adapter']} do
13
+ {:adapter_url => Rhoconnect.appserver}.to_json
14
+ end
15
+
16
+ post "/appserver", \
17
+ :deprecated_route => {:verb => :post, :url => ['/api/save_adapter', '/api/source/save_adapter']} do
18
+ Rhoconnect.appserver = params['adapter_url'] || params[:attributes]['adapter_url']
19
+ end
20
+
21
+ get "/license", \
22
+ :deprecated_route => {:verb => :post, :url => ['/api/get_license_info', '/api/admin/get_license_info']} do
23
+ {:rhoconnect_version => Rhoconnect.license.rhoconnect_version,
24
+ :licensee => Rhoconnect.license.licensee,
25
+ :seats => Rhoconnect.license.seats,
26
+ :issued => Rhoconnect.license.issued,
27
+ :available => Rhoconnect.license.available }.to_json
28
+ end
29
+
30
+ post "/login", :rc_handler => :admin_authenticate, :admin_required => false, :deprecated_route => {:verb => :post, :url => ['/login', '/api/admin/login']} do
31
+ user = User.authenticate(params[:login], params[:password])
32
+ end
33
+
34
+ post "/reset", :deprecated_route => {:verb => :post, :url => ['/api/reset', '/api/admin/reset']} do
35
+ keep_token = current_user.token.value
36
+ Store.flush_all
37
+ Rhoconnect.bootstrap(Rhoconnect.base_directory)
38
+ # restoring previous token value after flushdb
39
+ current_user.token = keep_token
40
+ "DB reset"
41
+ end
42
+
43
+ get "/stats", \
44
+ :deprecated_route => {:verb => :post, :url => ['/api/stats', '/api/admin/stats']} do
45
+ if Rhoconnect.stats == true
46
+ names = params[:names]
47
+ if names
48
+ Rhoconnect::Stats::Record.keys(names).to_json
49
+ else
50
+ metric = params[:metric]
51
+ rtype = Rhoconnect::Stats::Record.rtype(metric)
52
+ if rtype == 'zset'
53
+ # returns [] if no results
54
+ Rhoconnect::Stats::Record.range(metric,params[:start],params[:finish]).to_json
55
+ elsif rtype == 'string'
56
+ Rhoconnect::Stats::Record.get_value(metric) || ''
57
+ else
58
+ raise ApiException.new(404, "Unknown metric")
59
+ end
60
+ end
61
+ else
62
+ raise ApiException.new(500, "Stats not enabled")
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,99 @@
1
+ module Rhoconnect
2
+ module Controller
3
+ class UsersController < Rhoconnect::Controller::APIBase
4
+ set_default :admin_required, true
5
+ set_default :login_required, false
6
+ set_default :source_required, false
7
+ set_default :client_required, false
8
+
9
+ register Rhoconnect::EndPoint
10
+
11
+ # show users
12
+ get "/", :admin_required => true, :deprecated_route => {:verb => :post, :url => ['/api/list_users', '/api/user/list_users']} do
13
+ current_app.users.members.to_json
14
+ end
15
+
16
+ # show user
17
+ get "/:user_id" do
18
+ User.load(params[:user_id]).to_array.to_json
19
+ end
20
+
21
+ # create user
22
+ post "/", :deprecated_route => { :url => "/api/create_user", :verb => :post } do
23
+ app = current_app
24
+ u = User.create({:login => params[:attributes][:login]})
25
+ u.password = params[:attributes]['password']
26
+ app.users << u.login
27
+ "User created"
28
+ end
29
+
30
+ # update user
31
+ put "/:user_id", :deprecated_route => {:verb => :post, :url => ["/api/update_user", '/api/user/update_user']} do
32
+ User.load(params[:user_id]).update(params[:attributes])
33
+ "User updated"
34
+ end
35
+
36
+ # delete user
37
+ delete "/:user_id", :deprecated_route => {:verb => :post, :url => ['/api/delete_user', '/api/user/delete_user']} do
38
+ app = current_app
39
+ User.load(params[:user_id]).delete
40
+ app.users.delete(params[:user_id])
41
+ s_params = {:app_id => APP_NAME,:user_id => params[:user_id]}
42
+ app.sources.each{ |source|
43
+ Source.load(source, s_params).flush_store_data
44
+ }
45
+ "User deleted"
46
+ end
47
+
48
+ # get user's clients
49
+ get "/:user_id/clients", :admin_required => true, \
50
+ :deprecated_route => {:verb => :post, :url => ['/api/list_clients', '/api/client/list_clients']} do
51
+ User.load(params[:user_id]).clients.members.to_json
52
+ end
53
+
54
+ # delete user's client
55
+ delete "/:user_id/clients/:client_id", :admin_required => true, \
56
+ :deprecated_route => {:verb => :post, :url => ['/api/delete_client', '/api/client/delete_client']} do
57
+ Client.load(params[:client_id],{:source_name => '*'}).delete
58
+ User.load(params[:user_id]).clients.delete(params[:client_id])
59
+ "Client deleted"
60
+ end
61
+
62
+ # get user's docnames
63
+ get "/:user_id/sources/:source_id/docnames", :admin_required => true, \
64
+ :deprecated_route => {:verb => :post, :url => ['/api/list_source_docs', '/api/source/list_source_docs']} do
65
+ res = {}
66
+ s = Source.load(params[:source_id], {:app_id => APP_NAME,:user_id => params[:user_id]})
67
+ [:md,:md_size,:md_copy,:errors].each do |doc|
68
+ db_key = s.docname(doc)
69
+ res.merge!(doc => db_key)
70
+ end
71
+ res.to_json
72
+ end
73
+
74
+ # get user's DB document
75
+ get "/:user_id/sources/:source_id/docs/:doc", :admin_required => true do
76
+ s = Source.load(params[:source_id], {:app_id => APP_NAME,:user_id => params[:user_id]})
77
+ db_key = s.docname(params[:doc])
78
+ Store.get_db_doc(db_key)
79
+ end
80
+
81
+ # set user's DB document
82
+ post "/:user_id/sources/:source_id/docs/:doc", :admin_required => true do
83
+ throw :halt, [500, "Unknown user '#{params[:user_id]}'"] unless User.is_exist?(params[:user_id])
84
+
85
+ s = Source.load(params[:source_id], {:app_id => APP_NAME,:user_id => params[:user_id]})
86
+ db_key = s.docname(params[:doc])
87
+ append_to_doc = params[:append]
88
+ append_to_doc ||= false
89
+ Store.set_db_doc(db_key,params[:data],append_to_doc)
90
+ ''
91
+ end
92
+
93
+ # ping user's client
94
+ post "/ping", :admin_required => true, :deprecated_route => {:verb => :post, :url => ['/api/ping', '/api/client/ping']} do
95
+ User.ping(params)
96
+ end
97
+ end
98
+ end
99
+ end
@@ -9,9 +9,7 @@ class DBAdapter
9
9
  def get_connection(dbfile)
10
10
  if defined?(JRUBY_VERSION) # JRuby
11
11
  require 'dbi'
12
- require 'dbd/Jdbc'
13
- require 'jdbc/sqlite3'
14
-
12
+
15
13
  db = DBI.connect("DBI:Jdbc:SQLite:#{dbfile}", nil, nil, 'driver' => 'org.sqlite.JDBC')
16
14
  class << db
17
15
  # jdbc/sqlite3 has no Database#execute_batch method