rsence-pre 2.1.0.1.pre

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 (313) hide show
  1. data/.yardopts +10 -0
  2. data/INSTALL.rdoc +330 -0
  3. data/LICENSE.txt +622 -0
  4. data/README.rdoc +98 -0
  5. data/VERSION +1 -0
  6. data/bin/rsence +25 -0
  7. data/bin/rsence-pre +25 -0
  8. data/conf/default_conf.yaml +346 -0
  9. data/conf/default_strings.yaml +76 -0
  10. data/conf/rsence_command_strings.yaml +444 -0
  11. data/docs/ExampleGuiPlugin.rdoc +193 -0
  12. data/docs/JavascriptBundles.rdoc +0 -0
  13. data/docs/PluginBundleInfo.rdoc +173 -0
  14. data/docs/PluginBundles.rdoc +96 -0
  15. data/docs/Values.rdoc +163 -0
  16. data/js/comm/autosync/autosync.js +17 -0
  17. data/js/comm/autosync/js.inc +0 -0
  18. data/js/comm/comm.js +203 -0
  19. data/js/comm/js.inc +0 -0
  20. data/js/comm/jsloader/js.inc +0 -0
  21. data/js/comm/jsloader/jsloader.js +112 -0
  22. data/js/comm/queue/js.inc +0 -0
  23. data/js/comm/queue/queue.js +184 -0
  24. data/js/comm/session/js.inc +0 -0
  25. data/js/comm/session/session.js +52 -0
  26. data/js/comm/sessionwatcher/js.inc +0 -0
  27. data/js/comm/sessionwatcher/sessionwatcher.js +44 -0
  28. data/js/comm/transporter/js.inc +0 -0
  29. data/js/comm/transporter/transporter.js +261 -0
  30. data/js/comm/urlresponder/js.inc +0 -0
  31. data/js/comm/urlresponder/urlresponder.js +149 -0
  32. data/js/comm/values/js.inc +0 -0
  33. data/js/comm/values/values.js +433 -0
  34. data/js/controls/button/button.js +72 -0
  35. data/js/controls/button/js.inc +0 -0
  36. data/js/controls/button/themes/bright/button.css +89 -0
  37. data/js/controls/button/themes/bright/button.html +7 -0
  38. data/js/controls/button/themes/bright/button_parts1-ie6.gif +0 -0
  39. data/js/controls/button/themes/bright/button_parts1.png +0 -0
  40. data/js/controls/button/themes/default/button.css +89 -0
  41. data/js/controls/button/themes/default/button.html +7 -0
  42. data/js/controls/button/themes/default/button_parts1-ie6.gif +0 -0
  43. data/js/controls/button/themes/default/button_parts1.png +0 -0
  44. data/js/controls/checkbox/checkbox.js +49 -0
  45. data/js/controls/checkbox/js.inc +0 -0
  46. data/js/controls/checkbox/themes/default/checkbox.css +69 -0
  47. data/js/controls/checkbox/themes/default/checkbox.html +5 -0
  48. data/js/controls/checkbox/themes/default/checkbox_parts1-ie6.gif +0 -0
  49. data/js/controls/checkbox/themes/default/checkbox_parts1.png +0 -0
  50. data/js/controls/dialogs/alert_sheet/alert_sheet.js +63 -0
  51. data/js/controls/dialogs/alert_sheet/js.inc +0 -0
  52. data/js/controls/dialogs/confirm_sheet/confirm_sheet.js +37 -0
  53. data/js/controls/dialogs/confirm_sheet/js.inc +0 -0
  54. data/js/controls/dialogs/sheet/js.inc +0 -0
  55. data/js/controls/dialogs/sheet/sheet.js +84 -0
  56. data/js/controls/dialogs/sheet/themes/default/sheet.css +64 -0
  57. data/js/controls/dialogs/sheet/themes/default/sheet.html +14 -0
  58. data/js/controls/dialogs/sheet/themes/default/sheet_bg-ie6.gif +0 -0
  59. data/js/controls/dialogs/sheet/themes/default/sheet_bg.png +0 -0
  60. data/js/controls/dialogs/sheet/themes/default/sheet_dim-ie6.gif +0 -0
  61. data/js/controls/dialogs/sheet/themes/default/sheet_dim.png +0 -0
  62. data/js/controls/dialogs/sheet/themes/default/sheet_parts1-ie6.gif +0 -0
  63. data/js/controls/dialogs/sheet/themes/default/sheet_parts1.png +0 -0
  64. data/js/controls/dialogs/sheet/themes/default/sheet_parts2-ie6.gif +0 -0
  65. data/js/controls/dialogs/sheet/themes/default/sheet_parts2.png +0 -0
  66. data/js/controls/dialogs/sheet/themes/default/sheet_warning-ie6.gif +0 -0
  67. data/js/controls/dialogs/sheet/themes/default/sheet_warning.png +0 -0
  68. data/js/controls/imageview/imageview.js +109 -0
  69. data/js/controls/imageview/js.inc +0 -0
  70. data/js/controls/imageview/themes/default/blank.gif +0 -0
  71. data/js/controls/passwordcontrol/js.inc +0 -0
  72. data/js/controls/passwordcontrol/passwordcontrol.js +23 -0
  73. data/js/controls/passwordcontrol/themes/default/passwordcontrol.css +0 -0
  74. data/js/controls/passwordcontrol/themes/default/passwordcontrol.html +18 -0
  75. data/js/controls/progress/progressbar/js.inc +0 -0
  76. data/js/controls/progress/progressbar/progressbar.js +40 -0
  77. data/js/controls/progress/progressbar/themes/default/progressbar.css +16 -0
  78. data/js/controls/progress/progressbar/themes/default/progressbar.html +2 -0
  79. data/js/controls/progress/progressindicator/js.inc +0 -0
  80. data/js/controls/progress/progressindicator/progressindicator.js +44 -0
  81. data/js/controls/radiobutton/js.inc +0 -0
  82. data/js/controls/radiobutton/radiobutton.js +43 -0
  83. data/js/controls/radiobutton/themes/default/radiobutton.css +69 -0
  84. data/js/controls/radiobutton/themes/default/radiobutton.html +5 -0
  85. data/js/controls/radiobutton/themes/default/radiobutton_parts1-ie6.gif +0 -0
  86. data/js/controls/radiobutton/themes/default/radiobutton_parts1.png +0 -0
  87. data/js/controls/sliders/slider/js.inc +0 -0
  88. data/js/controls/sliders/slider/slider.js +357 -0
  89. data/js/controls/sliders/slider/themes/default/hslider_tracks-ie6.gif +0 -0
  90. data/js/controls/sliders/slider/themes/default/hslider_tracks.png +0 -0
  91. data/js/controls/sliders/slider/themes/default/slider.css +108 -0
  92. data/js/controls/sliders/slider/themes/default/slider.html +5 -0
  93. data/js/controls/sliders/slider/themes/default/slider_thumbs-ie6.gif +0 -0
  94. data/js/controls/sliders/slider/themes/default/slider_thumbs.png +0 -0
  95. data/js/controls/sliders/vslider/js.inc +0 -0
  96. data/js/controls/sliders/vslider/themes/default/vslider.css +52 -0
  97. data/js/controls/sliders/vslider/themes/default/vslider.html +5 -0
  98. data/js/controls/sliders/vslider/themes/default/vslider_tracks-ie6.gif +0 -0
  99. data/js/controls/sliders/vslider/themes/default/vslider_tracks.png +0 -0
  100. data/js/controls/sliders/vslider/vslider.js +41 -0
  101. data/js/controls/stepper/js.inc +0 -0
  102. data/js/controls/stepper/stepper.js +213 -0
  103. data/js/controls/stepper/themes/default/stepper-ie6.gif +0 -0
  104. data/js/controls/stepper/themes/default/stepper.css +14 -0
  105. data/js/controls/stepper/themes/default/stepper.html +2 -0
  106. data/js/controls/stepper/themes/default/stepper.png +0 -0
  107. data/js/controls/stringview/js.inc +0 -0
  108. data/js/controls/stringview/stringview.js +49 -0
  109. data/js/controls/stringview/themes/default/stringview.css +8 -0
  110. data/js/controls/stringview/themes/default/stringview.html +1 -0
  111. data/js/controls/tab/js.inc +0 -0
  112. data/js/controls/tab/tab.js +280 -0
  113. data/js/controls/tab/themes/bright/tab.css +76 -0
  114. data/js/controls/tab/themes/bright/tab.html +6 -0
  115. data/js/controls/tab/themes/bright/tab_bg_color-ie6.gif +0 -0
  116. data/js/controls/tab/themes/bright/tab_bg_color.png +0 -0
  117. data/js/controls/tab/themes/bright/tab_border_pattern-ie6.gif +0 -0
  118. data/js/controls/tab/themes/bright/tab_border_pattern.png +0 -0
  119. data/js/controls/tab/themes/bright/tab_parts1-ie6.gif +0 -0
  120. data/js/controls/tab/themes/bright/tab_parts1.png +0 -0
  121. data/js/controls/tab/themes/default/tab.css +77 -0
  122. data/js/controls/tab/themes/default/tab.html +6 -0
  123. data/js/controls/tab/themes/default/tab_bg_color-ie6.gif +0 -0
  124. data/js/controls/tab/themes/default/tab_bg_color.png +0 -0
  125. data/js/controls/tab/themes/default/tab_border_pattern-ie6.gif +0 -0
  126. data/js/controls/tab/themes/default/tab_border_pattern.png +0 -0
  127. data/js/controls/tab/themes/default/tab_parts1-ie6.gif +0 -0
  128. data/js/controls/tab/themes/default/tab_parts1.png +0 -0
  129. data/js/controls/textarea/js.inc +0 -0
  130. data/js/controls/textarea/textarea.js +24 -0
  131. data/js/controls/textarea/themes/default/textarea.css +21 -0
  132. data/js/controls/textarea/themes/default/textarea.html +18 -0
  133. data/js/controls/textcontrol/js.inc +0 -0
  134. data/js/controls/textcontrol/textcontrol.js +374 -0
  135. data/js/controls/textcontrol/themes/default/textcontrol.css +107 -0
  136. data/js/controls/textcontrol/themes/default/textcontrol.html +18 -0
  137. data/js/controls/textcontrol/themes/default/textcontrol_parts1-ie6.gif +0 -0
  138. data/js/controls/textcontrol/themes/default/textcontrol_parts1.png +0 -0
  139. data/js/controls/textcontrol/themes/default/textcontrol_parts2-ie6.gif +0 -0
  140. data/js/controls/textcontrol/themes/default/textcontrol_parts2.png +0 -0
  141. data/js/controls/textcontrol/themes/default/textcontrol_parts3-ie6.gif +0 -0
  142. data/js/controls/textcontrol/themes/default/textcontrol_parts3.png +0 -0
  143. data/js/controls/uploader/js.inc +0 -0
  144. data/js/controls/uploader/themes/default/upload_progress.gif +0 -0
  145. data/js/controls/uploader/themes/default/uploader.css +108 -0
  146. data/js/controls/uploader/themes/default/uploader.html +27 -0
  147. data/js/controls/uploader/uploader.js +154 -0
  148. data/js/controls/validatorview/js.inc +0 -0
  149. data/js/controls/validatorview/themes/default/validator-ie6.gif +0 -0
  150. data/js/controls/validatorview/themes/default/validator.png +0 -0
  151. data/js/controls/validatorview/themes/default/validatorview.css +0 -0
  152. data/js/controls/validatorview/themes/default/validatorview.html +0 -0
  153. data/js/controls/validatorview/validatorview.js +62 -0
  154. data/js/controls/window/js.inc +0 -0
  155. data/js/controls/window/themes/default/window.css +219 -0
  156. data/js/controls/window/themes/default/window.html +17 -0
  157. data/js/controls/window/themes/default/window_bg_active-ie6.gif +0 -0
  158. data/js/controls/window/themes/default/window_bg_active.png +0 -0
  159. data/js/controls/window/themes/default/window_bg_inactive-ie6.gif +0 -0
  160. data/js/controls/window/themes/default/window_bg_inactive.png +0 -0
  161. data/js/controls/window/themes/default/window_buttons-ie6.gif +0 -0
  162. data/js/controls/window/themes/default/window_buttons.png +0 -0
  163. data/js/controls/window/themes/default/window_parts1-ie6.gif +0 -0
  164. data/js/controls/window/themes/default/window_parts1.png +0 -0
  165. data/js/controls/window/themes/default/window_parts2-ie6.gif +0 -0
  166. data/js/controls/window/themes/default/window_parts2.png +0 -0
  167. data/js/controls/window/window.js +286 -0
  168. data/js/core/class/class.js +318 -0
  169. data/js/core/class/js.inc +0 -0
  170. data/js/core/elem/elem.js +1383 -0
  171. data/js/core/elem/js.inc +0 -0
  172. data/js/core/event/event.js +153 -0
  173. data/js/core/event/js.inc +0 -0
  174. data/js/core/iefix/ie_css_element.htc +5 -0
  175. data/js/core/iefix/ie_css_style.htc +5 -0
  176. data/js/core/iefix/iefix.js +359 -0
  177. data/js/core/iefix/js.inc +0 -0
  178. data/js/core/rsence_ns/js.inc +0 -0
  179. data/js/core/rsence_ns/rsence_ns.js +21 -0
  180. data/js/datetime/calendar/calendar.js +198 -0
  181. data/js/datetime/calendar/js.inc +0 -0
  182. data/js/datetime/calendar/themes/default/calendar.css +108 -0
  183. data/js/datetime/calendar/themes/default/calendar.html +9 -0
  184. data/js/datetime/calendar/themes/default/calendar_arrows-ie6.gif +0 -0
  185. data/js/datetime/calendar/themes/default/calendar_arrows.png +0 -0
  186. data/js/datetime/datetimevalue/datetimevalue.js +247 -0
  187. data/js/datetime/datetimevalue/js.inc +0 -0
  188. data/js/datetime/timesheet/js.inc +0 -0
  189. data/js/datetime/timesheet/themes/default/timesheet.css +30 -0
  190. data/js/datetime/timesheet/themes/default/timesheet.html +2 -0
  191. data/js/datetime/timesheet/timesheet.js +183 -0
  192. data/js/datetime/timesheet_item/js.inc +0 -0
  193. data/js/datetime/timesheet_item/themes/default/timesheet_item.css +42 -0
  194. data/js/datetime/timesheet_item/themes/default/timesheet_item.html +8 -0
  195. data/js/datetime/timesheet_item/timesheet_item.js +248 -0
  196. data/js/datetime/timesheet_item_edit/js.inc +0 -0
  197. data/js/datetime/timesheet_item_edit/timesheet_item_edit.js +274 -0
  198. data/js/foundation/application/application.js +208 -0
  199. data/js/foundation/application/js.inc +0 -0
  200. data/js/foundation/control/control.js +339 -0
  201. data/js/foundation/control/controldefaults/controldefaults.js +56 -0
  202. data/js/foundation/control/controldefaults/js.inc +0 -0
  203. data/js/foundation/control/dummyvalue/dummyvalue.js +51 -0
  204. data/js/foundation/control/dummyvalue/js.inc +0 -0
  205. data/js/foundation/control/dyncontrol/dyncontrol.js +500 -0
  206. data/js/foundation/control/dyncontrol/js.inc +0 -0
  207. data/js/foundation/control/dyncontrol/themes/default/dyncontrol.css +0 -0
  208. data/js/foundation/control/dyncontrol/themes/default/dyncontrol.html +0 -0
  209. data/js/foundation/control/eventresponder/eventresponder.js +750 -0
  210. data/js/foundation/control/eventresponder/js.inc +0 -0
  211. data/js/foundation/control/js.inc +0 -0
  212. data/js/foundation/control/valuematrix/js.inc +0 -0
  213. data/js/foundation/control/valuematrix/valuematrix.js +135 -0
  214. data/js/foundation/control/valueresponder/js.inc +0 -0
  215. data/js/foundation/control/valueresponder/valueresponder.js +79 -0
  216. data/js/foundation/eventmanager/eventmanager.js +991 -0
  217. data/js/foundation/eventmanager/js.inc +0 -0
  218. data/js/foundation/geom/point/js.inc +0 -0
  219. data/js/foundation/geom/point/point.js +202 -0
  220. data/js/foundation/geom/rect/js.inc +0 -0
  221. data/js/foundation/geom/rect/rect.js +651 -0
  222. data/js/foundation/json_renderer/js.inc +0 -0
  223. data/js/foundation/json_renderer/json_renderer.js +246 -0
  224. data/js/foundation/system/js.inc +0 -0
  225. data/js/foundation/system/system.js +381 -0
  226. data/js/foundation/thememanager/js.inc +0 -0
  227. data/js/foundation/thememanager/thememanager.js +393 -0
  228. data/js/foundation/value/js.inc +0 -0
  229. data/js/foundation/value/value.js +183 -0
  230. data/js/foundation/view/js.inc +0 -0
  231. data/js/foundation/view/markupview/js.inc +0 -0
  232. data/js/foundation/view/markupview/markupview.js +114 -0
  233. data/js/foundation/view/morphanimation/js.inc +0 -0
  234. data/js/foundation/view/morphanimation/morphanimation.js +237 -0
  235. data/js/foundation/view/view.js +1812 -0
  236. data/js/foundation/view/viewdefaults/js.inc +0 -0
  237. data/js/foundation/view/viewdefaults/viewdefaults.js +26 -0
  238. data/js/lists/checkboxlist/checkboxlist.js +171 -0
  239. data/js/lists/checkboxlist/js.inc +0 -0
  240. data/js/lists/listitems/js.inc +0 -0
  241. data/js/lists/listitems/listitems.js +88 -0
  242. data/js/lists/propertylist/js.inc +0 -0
  243. data/js/lists/propertylist/propertylist.js +326 -0
  244. data/js/lists/radiobuttonlist/js.inc +0 -0
  245. data/js/lists/radiobuttonlist/radiobuttonlist.js +116 -0
  246. data/js/util/reloadapp/js.inc +0 -0
  247. data/js/util/reloadapp/reloadapp.js +152 -0
  248. data/js/util/reloadapp/themes/default/reloadapp_warning-ie6.gif +0 -0
  249. data/js/util/reloadapp/themes/default/reloadapp_warning.png +0 -0
  250. data/js/util/sha/js.inc +0 -0
  251. data/js/util/sha/sha.js +426 -0
  252. data/js/views/centerview/centerview.js +75 -0
  253. data/js/views/centerview/js.inc +0 -0
  254. data/js/views/inlineview/inlineview.js +15 -0
  255. data/js/views/inlineview/js.inc +0 -0
  256. data/js/views/scrollview/js.inc +0 -0
  257. data/js/views/scrollview/scrollview.js +40 -0
  258. data/lib/conf/argv.rb +850 -0
  259. data/lib/conf/default.rb +219 -0
  260. data/lib/daemon/daemon.rb +387 -0
  261. data/lib/daemon/sigcomm.rb +64 -0
  262. data/lib/http/broker.rb +150 -0
  263. data/lib/http/rackup.rb +91 -0
  264. data/lib/http/request.rb +66 -0
  265. data/lib/http/response.rb +65 -0
  266. data/lib/plugins/dependencies.rb +285 -0
  267. data/lib/plugins/gui_plugin.rb +160 -0
  268. data/lib/plugins/guiparser.rb +123 -0
  269. data/lib/plugins/plugin.rb +438 -0
  270. data/lib/plugins/plugin_base.rb +162 -0
  271. data/lib/plugins/plugin_plugins.rb +81 -0
  272. data/lib/plugins/plugin_sqlite_db.rb +98 -0
  273. data/lib/plugins/pluginmanager.rb +635 -0
  274. data/lib/plugins/plugins.rb +169 -0
  275. data/lib/plugins/servlet.rb +108 -0
  276. data/lib/rsence.rb +32 -0
  277. data/lib/session/msg.rb +327 -0
  278. data/lib/session/sessionmanager.rb +522 -0
  279. data/lib/session/sessionstorage.rb +340 -0
  280. data/lib/transporter/transporter.rb +263 -0
  281. data/lib/util/gzstring.rb +9 -0
  282. data/lib/util/ruby19_fixes.rb +18 -0
  283. data/lib/values/hvalue.rb +378 -0
  284. data/lib/values/valuemanager.rb +172 -0
  285. data/plugins/client_pkg/client_pkg.rb +157 -0
  286. data/plugins/client_pkg/info.yaml +25 -0
  287. data/plugins/client_pkg/lib/client_pkg_build.rb +561 -0
  288. data/plugins/client_pkg/lib/client_pkg_cache.rb +50 -0
  289. data/plugins/client_pkg/lib/client_pkg_serve.rb +218 -0
  290. data/plugins/index_html/img/loading.gif +0 -0
  291. data/plugins/index_html/img/riassence.gif +0 -0
  292. data/plugins/index_html/index_html.rb +120 -0
  293. data/plugins/index_html/info.yaml +18 -0
  294. data/plugins/index_html/tmpl/index.html +15 -0
  295. data/plugins/main/info.yaml +18 -0
  296. data/plugins/main/js/main.js +84 -0
  297. data/plugins/main/main.rb +255 -0
  298. data/plugins/main/values.yaml +8 -0
  299. data/plugins/ticket/info.yaml +21 -0
  300. data/plugins/ticket/lib/common.rb +392 -0
  301. data/plugins/ticket/lib/favicon.rb +39 -0
  302. data/plugins/ticket/lib/file.rb +58 -0
  303. data/plugins/ticket/lib/img.rb +50 -0
  304. data/plugins/ticket/lib/objblob.rb +66 -0
  305. data/plugins/ticket/lib/rsrc.rb +34 -0
  306. data/plugins/ticket/lib/upload.rb +236 -0
  307. data/plugins/ticket/ticket.rb +333 -0
  308. data/setup/welcome/gui/welcome.yaml +92 -0
  309. data/setup/welcome/info.yaml +13 -0
  310. data/setup/welcome/text/welcome.html +9 -0
  311. data/setup/welcome/values.yaml +9 -0
  312. data/setup/welcome/welcome.rb +54 -0
  313. metadata +407 -0
@@ -0,0 +1,150 @@
1
+ ## RSence
2
+ # Copyright 2008 Riassence Inc.
3
+ # http://riassence.com/
4
+ #
5
+ # You should have received a copy of the GNU General Public License along
6
+ # with this software package. If not, contact licensing@riassence.com
7
+ ##
8
+
9
+ require 'rubygems'
10
+ require 'rack'
11
+
12
+ ## Minimally WEBrick -compatible response object
13
+ require 'http/response'
14
+
15
+ ## Minimally WEBrick -compatible request object
16
+ require 'http/request'
17
+
18
+
19
+ module RSence
20
+
21
+
22
+ # Broker sets up Rack and routes requests to the proper request processing instance.
23
+ class Broker
24
+
25
+ # This method is called from Rack.
26
+ # @param [Hash] env is the Rack environment.
27
+ # @return [Array(Number, Hash, String)] Rack-style response status, header, body
28
+ def call( env )
29
+ sleep @@ping_sim if @@ping_sim
30
+ unless @@transporter.online?
31
+ puts "#{Time.now.strftime('%Y-%m-%d %H:%M:%S')} -- Server busy."
32
+ headers = {
33
+ 'Retry-After' => '2',
34
+ 'Content-Type' => 'text/plain',
35
+ 'Refresh' => "2; #{env['REQUEST_URI']}",
36
+ 'Content-Length' => '4'
37
+ }
38
+ return [ 503, headers, 'BUSY' ]
39
+ end
40
+ request = Request.new(env)
41
+ response = Response.new
42
+ request_method = request.request_method.downcase
43
+ dispatcher = dispatcher_class.new( request, response )
44
+ dispatcher.send( request_method )
45
+ content_type = dispatcher.content_type
46
+ response.header['Content-Length'] = response.body.length.to_s unless response.header.has_key?('Content-Length')
47
+ return [response.status, response.header, response.body]
48
+ end
49
+
50
+ # Returns a dynamically created "REST Dispatcher" kind of class that has
51
+ # request and response as instance variables and the rest of the Broker
52
+ # class as the superclass. It calls the method according to the http method. Called from {#call}
53
+ # Broker currently implements only the {#get} and {#post} methods.
54
+ # @return [Broker] An instance of Broker with a {Request} instance as +@request+ and a {Response} instance as +@response+
55
+ def dispatcher_class
56
+ @dispatcher ||= Class.new(self.class) do
57
+ attr_accessor :content_type
58
+ def initialize(request,response)
59
+ @request = request
60
+ @response = response
61
+ end
62
+ end
63
+ end
64
+
65
+ # Creates the Rack instance and set up itself accordingly.
66
+ #
67
+ # @param [Transporter] transporter The single {Transporter} instance initialized by {HTTPDaemon}
68
+ # @param [Hash{Symbol => String}] conf Rack initialization settings
69
+ # @option conf [String] :bind_address ('127.0.0.1') The TCP/IP address or mask to bind to.
70
+ # @option conf [#to_i] :port ('8001') The TCP port to bind to.
71
+ # @option conf [String] :rack_require ('mongrel') The Rack handler to use.
72
+ def self.start( transporter, conf = {:bind_address => '127.0.0.1', :port => '8001', :rack_require => 'mongrel'} )
73
+
74
+ host = conf[:bind_address]
75
+ port = conf[:port]
76
+
77
+ @@transporter = transporter
78
+ latency = ::RSence.config[:http_server][:latency]
79
+ if latency == 0
80
+ @@ping_sim = false
81
+ else
82
+ @@ping_sim = latency/1000.0
83
+ end
84
+ Thread.new do
85
+ Thread.pass
86
+ puts "Testing if #{host}:#{port} responds.." if ::RSence.args[:debug]
87
+ until RSence.argv.test_port( port, host )
88
+ puts "..#{host}:#{port} doesn't respond yet.." if ::RSence.args[:debug]
89
+ sleep 0.2
90
+ end
91
+ puts "..#{host}:#{port} responds!" if ::RSence.args[:debug]
92
+ puts "RSence is online on the address http://#{host}:#{port}#{::RSence.config[:base_url]}"
93
+ @@transporter.online = true
94
+ end
95
+
96
+ require 'rack'
97
+
98
+ # Loads the selected web-server (default is 'mongrel')
99
+ rack_require = conf[:rack_require]
100
+ puts conf.inspect if RSence.args[:debug]
101
+
102
+ require rack_require
103
+
104
+ # Selects the handler for Rack
105
+ handler = {
106
+ 'webrick' => lambda { Rack::Handler::WEBrick },
107
+ 'ebb' => lambda { Rack::Handler::Ebb },
108
+ 'thin' => lambda { Rack::Handler::Thin },
109
+ 'mongrel' => lambda { Rack::Handler::Mongrel },
110
+ 'unicorn' => lambda { Rack::Handler::Unicorn },
111
+ 'rainbows' => lambda { Rack::Handler::Rainbows }
112
+ }[rack_require].call
113
+
114
+ handler.run( Rack::Lint.new(self.new), :Host => host, :Port => port )
115
+
116
+ end
117
+
118
+ # Generic 404 error handler. Just sets up response status, headers, body as a small "Page Not Found" html page
119
+ def not_found
120
+ puts "/404: #{@request.fullpath.inspect}" if RSence.args[:verbose]
121
+ @response.status = 404
122
+ err404 = '<html><head><title>404 - Page Not Found</title></head><body>404 - Page Not Found</body></html>'
123
+ @response['Content-Type'] = 'text/html; charset=UTF-8'
124
+ @response['Content-Length'] = err404.length.to_s
125
+ @response.body = err404
126
+ end
127
+
128
+ # Routes POST requests to {Transporter#servlet}
129
+ def post
130
+
131
+ puts "post: #{@request.fullpath}" if RSence.args[:verbose]
132
+
133
+ not_found unless @@transporter.servlet( :post, @request, @response )
134
+
135
+ end
136
+
137
+ # Routes GET requests to {Transporter#servlet}
138
+ def get
139
+
140
+ puts "get: #{@request.fullpath}" if RSence.args[:verbose]
141
+
142
+ not_found unless @@transporter.servlet( :get, @request, @response )
143
+
144
+ end
145
+
146
+ ### -- Add more http methods here when we have some apps to test with CalDAV implementation maybe? ++
147
+
148
+ end
149
+
150
+ end
@@ -0,0 +1,91 @@
1
+ ## RSence
2
+ # Copyright 2008 Riassence Inc.
3
+ # http://riassence.com/
4
+ #
5
+ # You should have received a copy of the GNU General Public License along
6
+ # with this software package. If not, contact licensing@riassence.com
7
+ ##
8
+
9
+
10
+ warn "Current RSence rackup Broker implementation does not work."
11
+ warn "Please try again in a future revision."
12
+ exit
13
+
14
+ if ARGV.include?('--root-path')
15
+ SERVER_PATH = ARGV[ARGV.index('--root-path')+1]
16
+ else
17
+ path = ::File.dirname(__FILE__)
18
+ exp_path = ::File.expand_path( path )
19
+ lib_path = ::File.split( exp_path )[0]
20
+ SERVER_PATH = ::File.split( lib_path )[0]
21
+ end
22
+
23
+ $LOAD_PATH << SERVER_PATH
24
+ $LOAD_PATH << ::File.join( SERVER_PATH, 'lib' )
25
+
26
+ # Use the default configuration:
27
+ require 'conf/default'
28
+
29
+ # Debug mode switch. The debug mode is intended for developers, not production.
30
+ $DEBUG_MODE = RSence.config[:debug_mode]
31
+
32
+ ENV['RACK_ENV'] = 'production' unless $DEBUG_MODE
33
+
34
+ ## Minimally WEBrick -compatible response object
35
+ require 'http/response'
36
+
37
+ ## Minimally WEBrick -compatible request object
38
+ require 'http/request'
39
+
40
+ # Transporter is the top-level handler for calls coming from the javascript COMM.Transporter.
41
+ require 'transporter/transporter'
42
+
43
+ module RSence
44
+ module Broker
45
+
46
+ @@transporter = Transporter.new
47
+
48
+ def self.start
49
+ conf = RSence.config[:http_server][:latency]
50
+ if conf == 0
51
+ @@ping_sim = false
52
+ else
53
+ @@ping_sim = conf/1000.0
54
+ end
55
+ end
56
+
57
+ def self.stop
58
+ @@transporter.plugins.shutdown
59
+ @@transporter.sessions.shutdown
60
+ end
61
+
62
+ def self.call(env)
63
+ request = Request.new(env)
64
+ response = Response.new
65
+ request_method = request.request_method.downcase
66
+ if request_method == 'get'
67
+ puts "get: #{request.fullpath}" if $DEBUG_MODE
68
+ sleep @@ping_sim if @@ping_sim
69
+ not_found( request, response ) unless @@transporter.servlet( :get, request, response )
70
+ elsif request_method == 'post'
71
+ puts "post: #{request.fullpath}" if $DEBUG_MODE
72
+ sleep @@ping_sim if @@ping_sim
73
+ not_found( request, response ) unless @@transporter.servlet( :post, request, response )
74
+ else
75
+ puts "unsupported method: #{request_method.inspect}"
76
+ end
77
+ response.header['Content-Length'] = response.body.length.to_s unless response.header.has_key?('Content-Length')
78
+ return [response.status, response.header, response.body]
79
+ end
80
+
81
+ def not_found( request, response )
82
+ puts "/404: #{request.fullpath.inspect}" if $DEBUG_MODE
83
+ response.status = 404
84
+ err404 = '<html><head><title>404 - Page Not Found</title></head><body>404 - Page Not Found</body></html>'
85
+ response['content-type'] = 'text/html; charset=UTF-8'
86
+ response['content-length'] = err404.length.to_s
87
+ response.body = err404
88
+ end
89
+
90
+ end
91
+ end
@@ -0,0 +1,66 @@
1
+ ## RSence
2
+ # Copyright 2008 Riassence Inc.
3
+ # http://riassence.com/
4
+ #
5
+ # You should have received a copy of the GNU General Public License along
6
+ # with this software package. If not, contact licensing@riassence.com
7
+ ##
8
+
9
+
10
+
11
+ require 'rubygems'
12
+ require 'rack'
13
+
14
+ module RSence
15
+
16
+ # Simple Request class, slightly more involved
17
+ # than the Rack::Request it's extending.
18
+ class Request < Rack::Request
19
+ attr_reader :header, :path, :query
20
+ def initialize(env)
21
+ @header = {}
22
+ super
23
+ env2header()
24
+ @path = path_info()
25
+ @query = params()
26
+ end
27
+ def unparsed_uri
28
+ return @header['request-uri']
29
+ end
30
+ def env2header
31
+ [ ['SERVER_NAME', 'server-name'],
32
+ ['HTTP_USER_AGENT', 'user-agent'],
33
+ ['HTTP_ACCEPT_ENCODING', 'accept-encoding'],
34
+ ['PATH_INFO', 'path-info'],
35
+ ['HTTP_HOST', 'host'],
36
+ ['HTTP_ACCEPT_LANGUAGE', 'accept-language'],
37
+ ['SERVER_PROTOCOL', 'server-protocol'],
38
+ ['REQUEST_PATH', 'request-path'],
39
+ ['HTTP_KEEP_ALIVE', 'keep-alive'],
40
+ ['SERVER_SOFTWARE', 'server-software'],
41
+ ['REMOTE_ADDR', 'remote-addr'],
42
+ ['HTTP_REFERER', 'referer'],
43
+ ['HTTP_VERSION', 'version'],
44
+ ['HTTP_ACCEPT_CHARSET', 'accept-charset'],
45
+ ['REQUEST_URI', 'request-uri'],
46
+ ['SERVER_PORT', 'server-port'],
47
+ ['QUERY_STRING', 'query-string'],
48
+ ['HTTP_ACCEPT', 'accept'],
49
+ ['REQUEST_METHOD', 'request-method'],
50
+ ['HTTP_CONNECTION', 'connection'],
51
+ ['HTTP_SOAPACTION', 'soapaction'],
52
+ ['HTTP_FORWARDED_HOST', 'forwarded-host']
53
+ ].each do |env_key,header_key|
54
+ if @env.has_key?(env_key)
55
+ @header[header_key] = @env[env_key]
56
+ end
57
+ if env_key.start_with?( 'HTTP_' )
58
+ x_env_key = "HTTP_X#{env_key[4..-1]}"
59
+ if @env.has_key?( x_env_key )
60
+ @header["x-#{header_key}"] = @env[ x_env_key ]
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,65 @@
1
+ ## RSence
2
+ # Copyright 2008 Riassence Inc.
3
+ # http://riassence.com/
4
+ #
5
+ # You should have received a copy of the GNU General Public License along
6
+ # with this software package. If not, contact licensing@riassence.com
7
+ ##
8
+
9
+
10
+
11
+ module RSence
12
+
13
+ # Classic WEBrick -compatible Response object for Rack.
14
+ # Implements only the methods used by the framework.
15
+ class Response
16
+
17
+ # Adds the + method "operator" to an extended Array.
18
+ # Used for pushing http body data.
19
+ class ResponseBody < Array
20
+ def +(body_data)
21
+ self.push(body_data)
22
+ end
23
+ end
24
+
25
+ def initialize
26
+ @body = ResponseBody.new(1)
27
+ @body[0] = ''
28
+ @status = 200
29
+ @header = {
30
+ 'Content-Type' => 'text/plain',
31
+ 'Server' => 'RSence'
32
+ }
33
+ end
34
+ def body=(body_data)
35
+ @body = ResponseBody.new(1)
36
+ @body[0] = body_data
37
+ end
38
+ def body
39
+ @body.join
40
+ end
41
+ def content_type=(new_content_type)
42
+ @header['Content-Type'] = new_content_type
43
+ end
44
+ def content_type
45
+ @header['Content-Type']
46
+ end
47
+ def camelize( header_key )
48
+ header_key.capitalize.gsub(/\-([a-z])/) { '-'+$1.upcase }
49
+ end
50
+ def []=(header_key,header_val)
51
+ @header[camelize( header_key )] = header_val.to_s
52
+ end
53
+ def status=(new_val)
54
+ @status = new_val.to_i
55
+ end
56
+ def status
57
+ @status
58
+ end
59
+ def header
60
+ @header
61
+ end
62
+ end
63
+
64
+ end
65
+
@@ -0,0 +1,285 @@
1
+ ## RSence
2
+ # Copyright 2010 Riassence Inc.
3
+ # http://riassence.com/
4
+ #
5
+ # You should have received a copy of the GNU General Public License along
6
+ # with this software package. If not, contact licensing@riassence.com
7
+ ##
8
+
9
+
10
+ module RSence
11
+
12
+ # = Description:
13
+ # Generic dependency calculator. Used by PluginManager.
14
+ # = Usage:
15
+ # This is an almost real world example:
16
+ # ## Initialize with pre-satisfied dependencies
17
+ # deps = RSence::Dependencies.new( [:foo1,:foo2] )
18
+ #
19
+ # ## :client_pkg doesn't depend on anything
20
+ # deps.set_deps( :client_pkg, nil )
21
+ #
22
+ # ## :system is the category of :client_pkg
23
+ # deps.set_deps( :system, :client_pkg )
24
+ #
25
+ # ## :index_html depends on :client_pkg
26
+ # deps.set_deps( :index_html, :client_pkg )
27
+ #
28
+ # ## :system is the category of :index_html
29
+ # deps.set_deps( :system, :index_html )
30
+ #
31
+ # ## :main depends on :index_html
32
+ # deps.set_deps( :main, :index_html )
33
+ #
34
+ # ## :system is the category of :main
35
+ # deps.set_deps( :system, :main )
36
+ #
37
+ # ## :impossible has several dependencies, of which :foo3 can't be satisfied
38
+ # deps.set_deps( :impossible, [:foo1, :foo2, :foo3] )
39
+ #
40
+ # ## :ticket has no dependencies
41
+ # deps.set_deps( :ticket, nil )
42
+ #
43
+ # ## :system is the category of :ticket
44
+ # deps.set_deps( :system, :ticket )
45
+ #
46
+ # ## :welcome depends on the :system category
47
+ # deps.set_deps( :welcome, :system )
48
+ #
49
+ # ## :first doesn't depend on anything
50
+ # deps.set_deps( :first, nil )
51
+ #
52
+ # ## Prepending is handled like this:
53
+ # deps.set_deps( :client_pkg, :first )
54
+ # deps.set_deps( :ticket, :first )
55
+ #
56
+ # ## Calculates the list of dependencies and returns them in an Array
57
+ # p deps.list
58
+ #
59
+ # ## Output of the example above:
60
+ # # impossible dependencies:
61
+ # # :impossible => [:foo3]
62
+ # # [:foo1, :foo2, :first, :ticket, :client_pkg, :index_html, :main, :system, :welcome]
63
+ class Dependencies
64
+
65
+ # Don't use Dependencies for external projects yet. It's subject to change
66
+ # without deprecation warnings.
67
+ # +resolved+ and +categories+ are optional.
68
+ def initialize( resolved = [], categories = {}, quiet=true )
69
+ @quiet = quiet
70
+ @pre_resolved = resolved.clone
71
+ @depends_on = {
72
+ # :name => [ :dep1, :dep2, :dep3, ... ]
73
+ }
74
+ @dependencies_of = {
75
+ #:dep1 => [ :name1, :name2, ... ]
76
+ }
77
+ @categories = []
78
+ categories.each_key do |cat_name, cat_items|
79
+ add_category( cat_name )
80
+ set_deps( cat_name, nil )
81
+ end
82
+ @unresolved = []
83
+ recalculate!
84
+ end
85
+
86
+ # Returns true, if +name+ is a pre-resolved dependency.
87
+ def pre_resolved?( name )
88
+ @pre_resolved.include?( name )
89
+ end
90
+
91
+ # Returns true, if +name+ is not a pre-resolved dependency and not a category.
92
+ def loadable?( name )
93
+ return (not pre_resolved?(name) and not category?(name))
94
+ end
95
+
96
+ # Returns list of items that are dependencies of +name+ in
97
+ # no particular order.
98
+ def deps_of( name )
99
+ outp = []
100
+ if @dependencies_of.has_key?(name)
101
+ @dependencies_of[name].each do |dep|
102
+ outp.push( dep )
103
+ outp += deps_of( dep )
104
+ end
105
+ end
106
+ outp.uniq!
107
+ outp.delete( name )
108
+ return outp
109
+ end
110
+ alias dependencies_of deps_of
111
+
112
+ # Returns list of items that +name+ depends on in no particular order.
113
+ def deps_on( name )
114
+ outp = []
115
+ if @depends_on.has_key?(name)
116
+ @depends_on[name].each do |dep|
117
+ outp.push( dep )
118
+ outp += deps_on( dep )
119
+ end
120
+ end
121
+ outp.uniq!
122
+ outp.delete( name )
123
+ return outp
124
+ end
125
+ alias depends_on deps_on
126
+
127
+ # List of categories
128
+ attr_reader :categories
129
+
130
+ # Adds the category +name+.
131
+ def add_category( name )
132
+ @categories.push( name ) unless @categories.include?( name )
133
+ end
134
+
135
+ # Deletes the category +name+, but doesn't dissolve its dependencies.
136
+ # Essentially turns +name+ into a regular item.
137
+ def del_category( name )
138
+ @categories.delete( name ) if @categories.include?( name )
139
+ end
140
+
141
+ # Returns true, if +name+ is a category.
142
+ def category?( name )
143
+ @categories.include?( name )
144
+ end
145
+
146
+ # Set list of dependency names as +deps+ that +name+ depends on
147
+ def set_deps( name, deps )
148
+ if deps.class == Symbol
149
+ deps = [deps]
150
+ elsif deps.class == String
151
+ deps = [deps.to_sym]
152
+ elsif deps.class == NilClass
153
+ deps = []
154
+ elsif deps.class != Array
155
+ raise "Dependencies.set_deps error: the deps is an unsupported type: #{deps.class}"
156
+ end
157
+ if not @depends_on.has_key?(name)
158
+ @depends_on[name] = deps
159
+ else
160
+ deps.each do |dep|
161
+ @depends_on[name].push( dep ) unless @depends_on[name].include?( dep )
162
+ end
163
+ end
164
+ deps.each do |dep|
165
+ if not @dependencies_of.has_key?( dep )
166
+ @dependencies_of[dep] = [name]
167
+ elsif not @dependencies_of[dep].include?( name )
168
+ @dependencies_of[dep].push( name )
169
+ end
170
+ end
171
+ recalculate!
172
+ end
173
+ alias set_dependencies set_deps
174
+ alias set_dependency set_deps
175
+
176
+ # Returns copy of the @depends_on Array
177
+ def clone_depends_on
178
+ Marshal.load( Marshal.dump( @depends_on ) )
179
+ end
180
+
181
+ # Returns clone of the @dependencies_of Array
182
+ def clone_dependencies_of
183
+ Marshal.load( Marshal.dump( @dependencies_of ) )
184
+ end
185
+
186
+ # Remove +name+ from dependency system, throws error if it's depended on another item.
187
+ def del_item( name )
188
+ d_of = deps_of( name )
189
+ if not d_of.empty?
190
+ d_of.each do |dep|
191
+ if category?( dep )
192
+ @depends_on[ dep ].delete( name )
193
+ else
194
+ throw "Dependencies.del_item error: the following items depend on #{name.inspect} -> #{deps_of(name).inspect}"
195
+ end
196
+ end
197
+ end
198
+ unless category?( name )
199
+ deps_on( name ).each do |dep|
200
+ @dependencies_of[dep].delete(name) if @dependencies_of.has_key?(dep)
201
+ end
202
+ @depends_on.delete( name )
203
+ @dependencies_of.delete( name )
204
+ end
205
+ recalculate!
206
+ end
207
+
208
+ # Returns the order of deletion possible without breaking the dependency chain
209
+ def del_order( name )
210
+ d_order = []
211
+ d_of = deps_of( name )
212
+ list.reverse.each do |dep|
213
+ if d_of.include?( dep )
214
+ d_order.push( dep )
215
+ end
216
+ end
217
+ d_order.push( name )
218
+ return d_order
219
+ end
220
+
221
+ # Deletes +name+ and all dependencies of +name+
222
+ def del_deps( name )
223
+ del_order( name ).each do |del_name|
224
+ del_item( del_name )
225
+ end
226
+ end
227
+
228
+ # Returns true, if +name+ is unresolved. The list of unresolved items is
229
+ # updated every time self#recalculate is called.
230
+ def unresolved?( name )
231
+ @unresolved.include?( name )
232
+ end
233
+
234
+ # Returns true, if +name+ is resolved (a valid dependency). Inverse of self#unresolved?
235
+ def resolved?( name )
236
+ (not unresolved?( name ))
237
+ end
238
+
239
+ # Recalculates the list and unresolved items.
240
+ def recalculate!
241
+ unresolved = []
242
+ resolved = @pre_resolved.clone
243
+ same_len = false
244
+ depends_on = clone_depends_on
245
+ target_len = depends_on.keys.length + resolved.length
246
+ until resolved.length == target_len
247
+ len = resolved.length
248
+ depends_on.each do | name, deps |
249
+ if deps.empty? and not resolved.include?(name)
250
+ resolved.push( name )
251
+ elsif deps.empty?
252
+ next
253
+ else
254
+ deps.each do |dep|
255
+ deps.delete(dep) if resolved.include?(dep)
256
+ end
257
+ end
258
+ end
259
+ if len == resolved.length
260
+ if same_len
261
+ warn "impossible dependencies:" unless @quiet
262
+ (depends_on.keys - resolved).each do |unsatisfied|
263
+ warn " #{unsatisfied.inspect} => #{depends_on[unsatisfied].inspect}" unless @quiet
264
+ unresolved.push( unsatisfied )
265
+ end
266
+ break
267
+ else
268
+ same_len = true
269
+ end
270
+ else
271
+ same_len = false
272
+ end
273
+ end
274
+ @unresolved = unresolved
275
+ @resolved = resolved
276
+ end
277
+
278
+ # Returns dependencies sorted in load order
279
+ def list
280
+ @resolved.clone
281
+ end
282
+ alias load_order list
283
+ end
284
+ end
285
+