spiderfw 0.5

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 (638) hide show
  1. data/README +4 -0
  2. data/Rakefile +74 -0
  3. data/apps/cas_server/_init.rb +23 -0
  4. data/apps/cas_server/config/options.rb +9 -0
  5. data/apps/cas_server/controllers/mixins/cas_login_mixin.rb +353 -0
  6. data/apps/cas_server/lib/cas.rb +329 -0
  7. data/apps/cas_server/lib/utils.rb +30 -0
  8. data/apps/cas_server/models/login_ticket.rb +11 -0
  9. data/apps/cas_server/models/mixins/consumable.rb +10 -0
  10. data/apps/cas_server/models/proxy_granting_ticket.rb +12 -0
  11. data/apps/cas_server/models/proxy_ticket.rb +12 -0
  12. data/apps/cas_server/models/service_ticket.rb +22 -0
  13. data/apps/cas_server/models/ticket.rb +20 -0
  14. data/apps/cas_server/models/ticket_granting_ticket.rb +15 -0
  15. data/apps/cas_server/views/logout.shtml +3 -0
  16. data/apps/core/admin/_init.rb +23 -0
  17. data/apps/core/admin/admin.rb +17 -0
  18. data/apps/core/admin/controllers/admin_controller.rb +15 -0
  19. data/apps/core/admin/views/index.shtml +1 -0
  20. data/apps/core/admin/views/spider_admin.layout.shtml +23 -0
  21. data/apps/core/admin/widgets/admin_menu/admin_menu.rb +17 -0
  22. data/apps/core/auth/_init.rb +42 -0
  23. data/apps/core/auth/controllers/login_controller.rb +94 -0
  24. data/apps/core/auth/controllers/mixins/auth_helper.rb +114 -0
  25. data/apps/core/auth/controllers/mixins/http_basic_auth.rb +24 -0
  26. data/apps/core/auth/controllers/mixins/http_digest_auth.rb +26 -0
  27. data/apps/core/auth/lib/authenticable.rb +86 -0
  28. data/apps/core/auth/lib/authenticator.rb +11 -0
  29. data/apps/core/auth/lib/digest_authenticator.rb +44 -0
  30. data/apps/core/auth/lib/login_authenticator.rb +27 -0
  31. data/apps/core/auth/models/digest_user.rb +34 -0
  32. data/apps/core/auth/models/group.rb +22 -0
  33. data/apps/core/auth/models/login_user.rb +15 -0
  34. data/apps/core/auth/models/mixins/access_control.rb +71 -0
  35. data/apps/core/auth/models/mixins/authentication_tracking.rb +19 -0
  36. data/apps/core/auth/models/super_user.rb +8 -0
  37. data/apps/core/auth/models/user.rb +15 -0
  38. data/apps/core/auth/po/it/spider_auth.po +33 -0
  39. data/apps/core/auth/po/spider_auth.pot +31 -0
  40. data/apps/core/auth/views/login.shtml +25 -0
  41. data/apps/core/components/_init.rb +21 -0
  42. data/apps/core/components/po/it/spider_components.po +52 -0
  43. data/apps/core/components/po/spider_components.pot +53 -0
  44. data/apps/core/components/public/css/admin.css +73 -0
  45. data/apps/core/components/public/css/crud.css +58 -0
  46. data/apps/core/components/public/css/img/add.gif +0 -0
  47. data/apps/core/components/public/css/img/ajax-loader.gif +0 -0
  48. data/apps/core/components/public/css/img/back.gif +0 -0
  49. data/apps/core/components/public/css/img/bg_header.png +0 -0
  50. data/apps/core/components/public/css/img/body_bg.jpg +0 -0
  51. data/apps/core/components/public/css/img/gray_gradient.gif +0 -0
  52. data/apps/core/components/public/css/img/li_bg.png +0 -0
  53. data/apps/core/components/public/css/img/li_bg_active.png +0 -0
  54. data/apps/core/components/public/css/img/li_bg_hover.png +0 -0
  55. data/apps/core/components/public/css/img/logo.png +0 -0
  56. data/apps/core/components/public/css/img/menu_bg.png +0 -0
  57. data/apps/core/components/public/css/img/menu_bottom.png +0 -0
  58. data/apps/core/components/public/css/img/menu_top.png +0 -0
  59. data/apps/core/components/public/css/img/section-bottom.jpg +0 -0
  60. data/apps/core/components/public/css/list.css +7 -0
  61. data/apps/core/components/public/css/menu.css +47 -0
  62. data/apps/core/components/public/css/spider.css +9 -0
  63. data/apps/core/components/public/css/switcher.css +13 -0
  64. data/apps/core/components/public/css/table.css +99 -0
  65. data/apps/core/components/public/js/inheritance.js +71 -0
  66. data/apps/core/components/public/js/jquery/jquery-1.3.2.js +4376 -0
  67. data/apps/core/components/public/js/jquery/jquery-ui/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  68. data/apps/core/components/public/js/jquery/jquery-ui/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  69. data/apps/core/components/public/js/jquery/jquery-ui/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  70. data/apps/core/components/public/js/jquery/jquery-ui/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  71. data/apps/core/components/public/js/jquery/jquery-ui/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  72. data/apps/core/components/public/js/jquery/jquery-ui/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  73. data/apps/core/components/public/js/jquery/jquery-ui/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  74. data/apps/core/components/public/js/jquery/jquery-ui/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  75. data/apps/core/components/public/js/jquery/jquery-ui/css/smoothness/images/ui-icons_222222_256x240.png +0 -0
  76. data/apps/core/components/public/js/jquery/jquery-ui/css/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  77. data/apps/core/components/public/js/jquery/jquery-ui/css/smoothness/images/ui-icons_454545_256x240.png +0 -0
  78. data/apps/core/components/public/js/jquery/jquery-ui/css/smoothness/images/ui-icons_888888_256x240.png +0 -0
  79. data/apps/core/components/public/js/jquery/jquery-ui/css/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  80. data/apps/core/components/public/js/jquery/jquery-ui/css/smoothness/jquery-ui-1.7.2.custom.css +406 -0
  81. data/apps/core/components/public/js/jquery/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  82. data/apps/core/components/public/js/jquery/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  83. data/apps/core/components/public/js/jquery/jquery-ui/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png +0 -0
  84. data/apps/core/components/public/js/jquery/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  85. data/apps/core/components/public/js/jquery/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  86. data/apps/core/components/public/js/jquery/jquery-ui/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  87. data/apps/core/components/public/js/jquery/jquery-ui/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  88. data/apps/core/components/public/js/jquery/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  89. data/apps/core/components/public/js/jquery/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  90. data/apps/core/components/public/js/jquery/jquery-ui/css/ui-lightness/images/ui-icons_222222_256x240.png +0 -0
  91. data/apps/core/components/public/js/jquery/jquery-ui/css/ui-lightness/images/ui-icons_228ef1_256x240.png +0 -0
  92. data/apps/core/components/public/js/jquery/jquery-ui/css/ui-lightness/images/ui-icons_ef8c08_256x240.png +0 -0
  93. data/apps/core/components/public/js/jquery/jquery-ui/css/ui-lightness/images/ui-icons_ffd27a_256x240.png +0 -0
  94. data/apps/core/components/public/js/jquery/jquery-ui/css/ui-lightness/images/ui-icons_ffffff_256x240.png +0 -0
  95. data/apps/core/components/public/js/jquery/jquery-ui/css/ui-lightness/jquery-ui-1.7.2.custom.css +406 -0
  96. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/AUTHORS.txt +30 -0
  97. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/GPL-LICENSE.txt +278 -0
  98. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/MIT-LICENSE.txt +25 -0
  99. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/external/bgiframe/ChangeLog.txt +20 -0
  100. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/external/bgiframe/META.json +32 -0
  101. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/external/bgiframe/jquery.bgiframe.js +100 -0
  102. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/external/bgiframe/jquery.bgiframe.min.js +10 -0
  103. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/external/bgiframe/jquery.bgiframe.pack.js +10 -0
  104. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/external/bgiframe/test/index.html +197 -0
  105. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/external/cookie/jquery.cookie.js +97 -0
  106. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/external/cookie/jquery.cookie.min.js +10 -0
  107. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/external/cookie/jquery.cookie.pack.js +10 -0
  108. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/external/cookie/jquery.cookie.zip +0 -0
  109. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/external/jsdiff/jsdiff.js +159 -0
  110. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/external/qunit/testrunner.js +780 -0
  111. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/external/qunit/testsuite.css +120 -0
  112. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/external/simulate/jquery.simulate.js +152 -0
  113. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/jquery-1.3.2.js +4376 -0
  114. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  115. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  116. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  117. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  118. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  119. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  120. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  121. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  122. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/images/ui-icons_222222_256x240.png +0 -0
  123. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/images/ui-icons_2e83ff_256x240.png +0 -0
  124. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/images/ui-icons_454545_256x240.png +0 -0
  125. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/images/ui-icons_888888_256x240.png +0 -0
  126. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/images/ui-icons_cd0a0a_256x240.png +0 -0
  127. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/ui.accordion.css +9 -0
  128. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/ui.all.css +2 -0
  129. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/ui.base.css +8 -0
  130. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/ui.core.css +37 -0
  131. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/ui.datepicker.css +62 -0
  132. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/ui.dialog.css +13 -0
  133. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/ui.progressbar.css +4 -0
  134. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/ui.resizable.css +13 -0
  135. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/ui.slider.css +17 -0
  136. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/ui.tabs.css +11 -0
  137. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/ui.theme.css +245 -0
  138. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  139. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  140. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/images/ui-bg_flat_10_000000_40x100.png +0 -0
  141. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  142. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  143. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  144. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  145. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  146. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  147. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/images/ui-icons_222222_256x240.png +0 -0
  148. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/images/ui-icons_228ef1_256x240.png +0 -0
  149. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/images/ui-icons_ef8c08_256x240.png +0 -0
  150. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/images/ui-icons_ffd27a_256x240.png +0 -0
  151. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/images/ui-icons_ffffff_256x240.png +0 -0
  152. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/jquery-ui-1.7.2.custom.css +406 -0
  153. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/ui.accordion.css +9 -0
  154. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/ui.all.css +2 -0
  155. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/ui.base.css +8 -0
  156. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/ui.core.css +37 -0
  157. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/ui.datepicker.css +62 -0
  158. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/ui.dialog.css +13 -0
  159. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/ui.progressbar.css +4 -0
  160. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/ui.resizable.css +13 -0
  161. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/ui.slider.css +17 -0
  162. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/ui.tabs.css +11 -0
  163. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/ui.theme.css +247 -0
  164. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/effects.blind.js +49 -0
  165. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/effects.bounce.js +78 -0
  166. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/effects.clip.js +54 -0
  167. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/effects.core.js +545 -0
  168. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/effects.drop.js +50 -0
  169. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/effects.explode.js +79 -0
  170. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/effects.fold.js +56 -0
  171. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/effects.highlight.js +48 -0
  172. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/effects.pulsate.js +56 -0
  173. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/effects.scale.js +180 -0
  174. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/effects.shake.js +57 -0
  175. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/effects.slide.js +50 -0
  176. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/effects.transfer.js +45 -0
  177. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/jquery-ui-i18n.js +771 -0
  178. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ar.js +20 -0
  179. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-bg.js +20 -0
  180. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ca.js +19 -0
  181. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-cs.js +19 -0
  182. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-da.js +19 -0
  183. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-de.js +19 -0
  184. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-el.js +19 -0
  185. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-eo.js +19 -0
  186. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-es.js +19 -0
  187. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-fa.js +19 -0
  188. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-fi.js +19 -0
  189. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-fr.js +19 -0
  190. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-he.js +19 -0
  191. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-hr.js +19 -0
  192. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-hu.js +19 -0
  193. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-hy.js +19 -0
  194. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-id.js +19 -0
  195. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-is.js +19 -0
  196. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-it.js +19 -0
  197. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ja.js +20 -0
  198. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ko.js +19 -0
  199. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-lt.js +19 -0
  200. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-lv.js +19 -0
  201. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ms.js +19 -0
  202. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-nl.js +19 -0
  203. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-no.js +19 -0
  204. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-pl.js +19 -0
  205. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-pt-BR.js +19 -0
  206. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ro.js +22 -0
  207. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ru.js +19 -0
  208. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-sk.js +19 -0
  209. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-sl.js +20 -0
  210. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-sq.js +19 -0
  211. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-sr-SR.js +19 -0
  212. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-sr.js +19 -0
  213. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-sv.js +19 -0
  214. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-th.js +19 -0
  215. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-tr.js +19 -0
  216. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-uk.js +25 -0
  217. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-zh-CN.js +19 -0
  218. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-zh-TW.js +19 -0
  219. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/jquery-ui-1.7.2.custom.js +9133 -0
  220. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/ui.accordion.js +477 -0
  221. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/ui.core.js +519 -0
  222. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/ui.datepicker.js +1636 -0
  223. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/ui.dialog.js +671 -0
  224. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/ui.draggable.js +766 -0
  225. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/ui.droppable.js +282 -0
  226. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/ui.progressbar.js +116 -0
  227. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/ui.resizable.js +800 -0
  228. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/ui.selectable.js +257 -0
  229. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/ui.slider.js +558 -0
  230. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/ui.sortable.js +1019 -0
  231. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/ui.tabs.js +685 -0
  232. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/version.txt +1 -0
  233. data/apps/core/components/public/js/jquery/jquery-ui/index.html +367 -0
  234. data/apps/core/components/public/js/jquery/jquery-ui/js/jquery-1.3.2.min.js +19 -0
  235. data/apps/core/components/public/js/jquery/jquery-ui/js/jquery-ui-1.7.2.custom.min.js +298 -0
  236. data/apps/core/components/public/js/jquery/plugins/jquery-autocomplete/changelog.txt +27 -0
  237. data/apps/core/components/public/js/jquery/plugins/jquery-autocomplete/jquery.autocomplete.css +48 -0
  238. data/apps/core/components/public/js/jquery/plugins/jquery-autocomplete/jquery.autocomplete.js +808 -0
  239. data/apps/core/components/public/js/jquery/plugins/jquery-autocomplete/jquery.autocomplete.min.js +13 -0
  240. data/apps/core/components/public/js/jquery/plugins/jquery-autocomplete/jquery.autocomplete.pack.js +12 -0
  241. data/apps/core/components/public/js/jquery/plugins/jquery-autocomplete/lib/jquery.ajaxQueue.js +116 -0
  242. data/apps/core/components/public/js/jquery/plugins/jquery-autocomplete/lib/jquery.bgiframe.min.js +10 -0
  243. data/apps/core/components/public/js/jquery/plugins/jquery-autocomplete/lib/jquery.js +3558 -0
  244. data/apps/core/components/public/js/jquery/plugins/jquery-autocomplete/lib/thickbox-compressed.js +10 -0
  245. data/apps/core/components/public/js/jquery/plugins/jquery-autocomplete/lib/thickbox.css +163 -0
  246. data/apps/core/components/public/js/jquery/plugins/jquery-autocomplete/todo +166 -0
  247. data/apps/core/components/public/js/jquery/plugins/jquery.form.js +653 -0
  248. data/apps/core/components/public/js/jquery/plugins/jquery.query-2.1.6.js +224 -0
  249. data/apps/core/components/public/js/jquery/plugins/jquery.url.js +214 -0
  250. data/apps/core/components/public/js/jquery/plugins/jtree/jquery.jtree.1.0.js +187 -0
  251. data/apps/core/components/public/js/jquery/plugins/jtree/jquery.jtree.1.0.min.js +1 -0
  252. data/apps/core/components/public/js/jquery/plugins/jtree/jquery.jtree.spider.1.0.js +193 -0
  253. data/apps/core/components/public/js/jquery/plugins/treeview/changelog.txt +35 -0
  254. data/apps/core/components/public/js/jquery/plugins/treeview/images/ajax-loader.gif +0 -0
  255. data/apps/core/components/public/js/jquery/plugins/treeview/images/file.gif +0 -0
  256. data/apps/core/components/public/js/jquery/plugins/treeview/images/folder-closed.gif +0 -0
  257. data/apps/core/components/public/js/jquery/plugins/treeview/images/folder.gif +0 -0
  258. data/apps/core/components/public/js/jquery/plugins/treeview/images/minus.gif +0 -0
  259. data/apps/core/components/public/js/jquery/plugins/treeview/images/plus.gif +0 -0
  260. data/apps/core/components/public/js/jquery/plugins/treeview/images/treeview-black-line.gif +0 -0
  261. data/apps/core/components/public/js/jquery/plugins/treeview/images/treeview-black.gif +0 -0
  262. data/apps/core/components/public/js/jquery/plugins/treeview/images/treeview-default-line.gif +0 -0
  263. data/apps/core/components/public/js/jquery/plugins/treeview/images/treeview-default.gif +0 -0
  264. data/apps/core/components/public/js/jquery/plugins/treeview/images/treeview-famfamfam-line.gif +0 -0
  265. data/apps/core/components/public/js/jquery/plugins/treeview/images/treeview-famfamfam.gif +0 -0
  266. data/apps/core/components/public/js/jquery/plugins/treeview/images/treeview-gray-line.gif +0 -0
  267. data/apps/core/components/public/js/jquery/plugins/treeview/images/treeview-gray.gif +0 -0
  268. data/apps/core/components/public/js/jquery/plugins/treeview/images/treeview-red-line.gif +0 -0
  269. data/apps/core/components/public/js/jquery/plugins/treeview/images/treeview-red.gif +0 -0
  270. data/apps/core/components/public/js/jquery/plugins/treeview/jquery.treeview.async.js +110 -0
  271. data/apps/core/components/public/js/jquery/plugins/treeview/jquery.treeview.css +74 -0
  272. data/apps/core/components/public/js/jquery/plugins/treeview/jquery.treeview.edit.js +37 -0
  273. data/apps/core/components/public/js/jquery/plugins/treeview/jquery.treeview.js +256 -0
  274. data/apps/core/components/public/js/jquery/plugins/treeview/jquery.treeview.min.js +15 -0
  275. data/apps/core/components/public/js/jquery/plugins/treeview/jquery.treeview.pack.js +16 -0
  276. data/apps/core/components/public/js/jquery/plugins/treeview/jquery.treeview.sortable.js +386 -0
  277. data/apps/core/components/public/js/jquery/plugins/treeview/lib/jquery.cookie.js +92 -0
  278. data/apps/core/components/public/js/jquery/plugins/treeview/lib/jquery.js +3534 -0
  279. data/apps/core/components/public/js/jquery/plugins/treeview/todo +8 -0
  280. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/LICENSE +0 -0
  281. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/README +0 -0
  282. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/jquery.timepickr.css +34 -0
  283. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/jquery.timepickr.js +1413 -0
  284. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/jquery.timepickr.min.js +10 -0
  285. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/images/222222_256x240_icons_icons.png +0 -0
  286. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/images/2e83ff_256x240_icons_icons.png +0 -0
  287. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/images/454545_256x240_icons_icons.png +0 -0
  288. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/images/888888_256x240_icons_icons.png +0 -0
  289. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/images/aaaaaa_40x100_textures_01_flat_0.png +0 -0
  290. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/images/cccccc_40x100_textures_03_highlight_soft_75.png +0 -0
  291. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/images/cd0a0a_256x240_icons_icons.png +0 -0
  292. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/images/dadada_40x100_textures_02_glass_75.png +0 -0
  293. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/images/e6e6e6_40x100_textures_02_glass_75.png +0 -0
  294. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/images/fbf9ee_40x100_textures_02_glass_55.png +0 -0
  295. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/images/fef1ec_40x100_textures_05_inset_soft_95.png +0 -0
  296. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/images/ffffff_40x100_textures_02_glass_65.png +0 -0
  297. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/images/ffffff_40x100_textures_02_glass_75.png +0 -0
  298. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/ui.accordion.css +9 -0
  299. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/ui.all.css +4 -0
  300. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/ui.allplugins.css +7 -0
  301. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/ui.core.css +37 -0
  302. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/ui.datepicker.css +60 -0
  303. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/ui.dialog.css +13 -0
  304. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/ui.progressbar.css +4 -0
  305. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/ui.resizable.css +13 -0
  306. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/ui.slider.css +13 -0
  307. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/ui.tabs.css +9 -0
  308. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/ui.theme.css +238 -0
  309. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/ui.timepickr.css +44 -0
  310. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/ui.timepickr.js +2307 -0
  311. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/ui.timepickr.min.js +10 -0
  312. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/body-bg.png +0 -0
  313. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/btn-hover.png +0 -0
  314. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/btn.png +0 -0
  315. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/buttons.psd +0 -0
  316. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/index.html +326 -0
  317. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/jquery.anchorHandler.js +44 -0
  318. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/jquery.strings.js +290 -0
  319. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/jquery.ui.all.js +518 -0
  320. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/jquery.utils.js +255 -0
  321. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/jquery.utils.ui.min.js +26 -0
  322. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/logo-ff.png +0 -0
  323. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/logo-ie.png +0 -0
  324. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/logo.png +0 -0
  325. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/logo.psd +0 -0
  326. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/package.png +0 -0
  327. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/reset.css +48 -0
  328. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/script_code.png +0 -0
  329. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/styles.css +308 -0
  330. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/themeroller_ready_black_200px.gif +0 -0
  331. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/weather_sun.png +0 -0
  332. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/src/css/ui.dropslide.css +26 -0
  333. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/src/css/ui.timepickr.css +18 -0
  334. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/src/ui.dropslide.js +132 -0
  335. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/src/ui.timepickr.js +217 -0
  336. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/test/data/testrunner.js +1 -0
  337. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/test/index.html +34 -0
  338. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/test/otherlibs/jquery/1.2.1/jquery.js +11 -0
  339. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/test/otherlibs/jquery/1.2.3/jquery.js +11 -0
  340. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/test/qunit/testrunner.js +780 -0
  341. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/test/qunit/testsuite.css +120 -0
  342. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/test/styles.css +201 -0
  343. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/test/test.js +41 -0
  344. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/test/unit/ui.timepickr.js +154 -0
  345. data/apps/core/components/public/js/list.js +234 -0
  346. data/apps/core/components/public/js/spider.js +484 -0
  347. data/apps/core/components/public/widgets/search_table.js +10 -0
  348. data/apps/core/components/public/widgets/table.js +9 -0
  349. data/apps/core/components/widgets/admin/admin.rb +75 -0
  350. data/apps/core/components/widgets/admin/admin.shtml +16 -0
  351. data/apps/core/components/widgets/confirm/confirm.rb +37 -0
  352. data/apps/core/components/widgets/confirm/confirm.shtml +9 -0
  353. data/apps/core/components/widgets/crud/crud.rb +119 -0
  354. data/apps/core/components/widgets/crud/crud.shtml +59 -0
  355. data/apps/core/components/widgets/crud/form_table/form_table.rb +13 -0
  356. data/apps/core/components/widgets/crud/form_table/form_table.shtml +3 -0
  357. data/apps/core/components/widgets/list/list.rb +294 -0
  358. data/apps/core/components/widgets/list/list.shtml +38 -0
  359. data/apps/core/components/widgets/list/plugins/exportable/exportable_list.rb +19 -0
  360. data/apps/core/components/widgets/list/plugins/exportable/exportable_list.shtml +5 -0
  361. data/apps/core/components/widgets/menu/menu.rb +20 -0
  362. data/apps/core/components/widgets/menu/menu.shtml +13 -0
  363. data/apps/core/components/widgets/search_table/search_table.rb +22 -0
  364. data/apps/core/components/widgets/search_table/search_table.shtml +11 -0
  365. data/apps/core/components/widgets/switcher/switcher.rb +68 -0
  366. data/apps/core/components/widgets/switcher/switcher.shtml +17 -0
  367. data/apps/core/components/widgets/table/table.rb +153 -0
  368. data/apps/core/components/widgets/table/table.shtml +41 -0
  369. data/apps/core/components/widgets/tabs/tabs.rb +38 -0
  370. data/apps/core/components/widgets/tabs/tabs.shtml +2 -0
  371. data/apps/core/forms/_init.rb +22 -0
  372. data/apps/core/forms/po/it/spider_forms.po +36 -0
  373. data/apps/core/forms/po/spider_forms.pot +37 -0
  374. data/apps/core/forms/public/date_time.js +23 -0
  375. data/apps/core/forms/public/form.css +81 -0
  376. data/apps/core/forms/public/form.js +19 -0
  377. data/apps/core/forms/public/input.js +30 -0
  378. data/apps/core/forms/public/search_select.js +123 -0
  379. data/apps/core/forms/public/select.js +11 -0
  380. data/apps/core/forms/tags/element_label.erb +1 -0
  381. data/apps/core/forms/tags/element_row.erb +4 -0
  382. data/apps/core/forms/tags/row.erb +4 -0
  383. data/apps/core/forms/widgets/form/form.rb +430 -0
  384. data/apps/core/forms/widgets/form/form.shtml +47 -0
  385. data/apps/core/forms/widgets/inputs/checkbox/checkbox.rb +13 -0
  386. data/apps/core/forms/widgets/inputs/checkbox/checkbox.shtml +3 -0
  387. data/apps/core/forms/widgets/inputs/date_time/date_time.rb +48 -0
  388. data/apps/core/forms/widgets/inputs/date_time/date_time.shtml +4 -0
  389. data/apps/core/forms/widgets/inputs/hidden/hidden.rb +8 -0
  390. data/apps/core/forms/widgets/inputs/hidden/hidden.shtml +3 -0
  391. data/apps/core/forms/widgets/inputs/input/input.rb +105 -0
  392. data/apps/core/forms/widgets/inputs/input/input.shtml +3 -0
  393. data/apps/core/forms/widgets/inputs/input/readonly.shtml +6 -0
  394. data/apps/core/forms/widgets/inputs/password/password.rb +24 -0
  395. data/apps/core/forms/widgets/inputs/password/password.shtml +5 -0
  396. data/apps/core/forms/widgets/inputs/search_select/search_select.rb +168 -0
  397. data/apps/core/forms/widgets/inputs/search_select/search_select.shtml +42 -0
  398. data/apps/core/forms/widgets/inputs/select/select.rb +126 -0
  399. data/apps/core/forms/widgets/inputs/select/select.shtml +8 -0
  400. data/apps/core/forms/widgets/inputs/subform/subform.rb +10 -0
  401. data/apps/core/forms/widgets/inputs/subform/subform.shtml +5 -0
  402. data/apps/core/forms/widgets/inputs/text/text.rb +9 -0
  403. data/apps/core/forms/widgets/inputs/text/text.shtml +3 -0
  404. data/apps/core/forms/widgets/inputs/text_area/text_area.rb +10 -0
  405. data/apps/core/forms/widgets/inputs/text_area/text_area.shtml +1 -0
  406. data/apps/drb_server/_init.rb +8 -0
  407. data/apps/drb_server/lib/model_server.rb +41 -0
  408. data/apps/drb_server/script/start_server.rb +19 -0
  409. data/apps/hippo/_init.rb +10 -0
  410. data/apps/hippo/models/mixins/hippo_struct.rb +210 -0
  411. data/apps/hippo/models/security_group.rb +21 -0
  412. data/apps/hippo/models/security_user.rb +29 -0
  413. data/apps/messenger/_init.rb +24 -0
  414. data/apps/messenger/config/options.rb +15 -0
  415. data/apps/messenger/config/worker.rb +3 -0
  416. data/apps/messenger/controllers/messenger_controller.rb +80 -0
  417. data/apps/messenger/controllers/mixins/messenger_controller_mixin.rb +54 -0
  418. data/apps/messenger/lib/backends/email/smtp.rb +0 -0
  419. data/apps/messenger/messenger.rb +94 -0
  420. data/apps/messenger/models/email.rb +22 -0
  421. data/apps/messenger/models/message.rb +44 -0
  422. data/apps/messenger/po/it/spider_messenger.po +77 -0
  423. data/apps/messenger/po/spider_messenger.pot +77 -0
  424. data/apps/messenger/views/index.shtml +13 -0
  425. data/apps/messenger/views/list.shtml +5 -0
  426. data/apps/messenger/views/messenger.layout.shtml +4 -0
  427. data/apps/messenger/views/queue.shtml +8 -0
  428. data/apps/messenger/views/tags/sent_messages.shtml +1 -0
  429. data/apps/soap/_init.rb +16 -0
  430. data/apps/soap/controllers/soap_controller.rb +334 -0
  431. data/apps/soap/doc/examples/example.rb +28 -0
  432. data/apps/soap/lib/soap.rb +217 -0
  433. data/apps/sso/_init.rb +16 -0
  434. data/apps/sso/config/options.rb +13 -0
  435. data/apps/sso/controllers/mixins/saml2_mixin.rb +149 -0
  436. data/apps/sso/lib/saml2/backend.rb +16 -0
  437. data/apps/sso/lib/saml2/lasso_backend.rb +88 -0
  438. data/apps/sso/lib/saml2.rb +112 -0
  439. data/apps/sso/views/saml2_post.shtml +19 -0
  440. data/apps/webdav/_init.rb +15 -0
  441. data/apps/webdav/controllers/webdav_controller.rb +862 -0
  442. data/apps/webdav/lib/locking.rb +193 -0
  443. data/apps/webdav/lib/vfs/abstract.rb +78 -0
  444. data/apps/webdav/lib/vfs/local.rb +126 -0
  445. data/apps/webdav/lib/vfs/mapped.rb +235 -0
  446. data/apps/webdav/lib/vfs/properties.rb +41 -0
  447. data/apps/worker/_init.rb +13 -0
  448. data/apps/worker/cmd.rb +65 -0
  449. data/apps/worker/config/options.rb +9 -0
  450. data/apps/worker/lib/runner.rb +43 -0
  451. data/apps/worker/lib/task.rb +9 -0
  452. data/apps/worker/models/job.rb +20 -0
  453. data/apps/worker/worker.rb +168 -0
  454. data/bin/spider +9 -0
  455. data/blueprints/app/_init.rb +10 -0
  456. data/blueprints/app/controllers/__APP___controller.rb +14 -0
  457. data/blueprints/app/views/__APP__.layout.shtml +8 -0
  458. data/blueprints/app/views/index.shtml +3 -0
  459. data/blueprints/install/config/config.yml +14 -0
  460. data/blueprints/install/init.rb +3 -0
  461. data/data/locale/it/LC_MESSAGES/spider.mo +0 -0
  462. data/data/locale/it/LC_MESSAGES/spider_auth.mo +0 -0
  463. data/data/locale/it/LC_MESSAGES/spider_components.mo +0 -0
  464. data/data/locale/it/LC_MESSAGES/spider_forms.mo +0 -0
  465. data/data/locale/it/LC_MESSAGES/spider_messenger.mo +0 -0
  466. data/lib/spiderfw/app.rb +186 -0
  467. data/lib/spiderfw/autoload.rb +12 -0
  468. data/lib/spiderfw/cache/template_cache.rb +136 -0
  469. data/lib/spiderfw/cmd/cmd.rb +72 -0
  470. data/lib/spiderfw/cmd/commands/cert.rb +427 -0
  471. data/lib/spiderfw/cmd/commands/console.rb +27 -0
  472. data/lib/spiderfw/cmd/commands/init.rb +52 -0
  473. data/lib/spiderfw/cmd/commands/model.rb +131 -0
  474. data/lib/spiderfw/cmd/commands/setup.rb +54 -0
  475. data/lib/spiderfw/cmd/commands/test.rb +61 -0
  476. data/lib/spiderfw/cmd/commands/webserver.rb +93 -0
  477. data/lib/spiderfw/config/configurable.rb +38 -0
  478. data/lib/spiderfw/config/configuration.rb +281 -0
  479. data/lib/spiderfw/config/options/spider.rb +122 -0
  480. data/lib/spiderfw/controller/app_controller.rb +14 -0
  481. data/lib/spiderfw/controller/controller.rb +321 -0
  482. data/lib/spiderfw/controller/controller_exceptions.rb +27 -0
  483. data/lib/spiderfw/controller/controller_io.rb +26 -0
  484. data/lib/spiderfw/controller/controller_mixin.rb +12 -0
  485. data/lib/spiderfw/controller/cookie.rb +20 -0
  486. data/lib/spiderfw/controller/cookies.rb +17 -0
  487. data/lib/spiderfw/controller/dispatcher.rb +269 -0
  488. data/lib/spiderfw/controller/first_responder.rb +59 -0
  489. data/lib/spiderfw/controller/formats/html.rb +90 -0
  490. data/lib/spiderfw/controller/helpers/widget_helper.rb +73 -0
  491. data/lib/spiderfw/controller/home_controller.rb +26 -0
  492. data/lib/spiderfw/controller/http_controller.rb +112 -0
  493. data/lib/spiderfw/controller/mixins/http_mixin.rb +228 -0
  494. data/lib/spiderfw/controller/mixins/static_content.rb +90 -0
  495. data/lib/spiderfw/controller/mixins/visual.rb +489 -0
  496. data/lib/spiderfw/controller/page_controller.rb +39 -0
  497. data/lib/spiderfw/controller/request.rb +48 -0
  498. data/lib/spiderfw/controller/response.rb +50 -0
  499. data/lib/spiderfw/controller/router.rb +9 -0
  500. data/lib/spiderfw/controller/scene.rb +27 -0
  501. data/lib/spiderfw/controller/session/file_session.rb +83 -0
  502. data/lib/spiderfw/controller/session/flash_hash.rb +56 -0
  503. data/lib/spiderfw/controller/session/memory_session.rb +62 -0
  504. data/lib/spiderfw/controller/session/transient_hash.rb +18 -0
  505. data/lib/spiderfw/controller/session.rb +106 -0
  506. data/lib/spiderfw/controller/spider_controller.rb +20 -0
  507. data/lib/spiderfw/create.rb +64 -0
  508. data/lib/spiderfw/env.rb +17 -0
  509. data/lib/spiderfw/exceptions.rb +2 -0
  510. data/lib/spiderfw/home.rb +26 -0
  511. data/lib/spiderfw/http/adapters/cgi.rb +62 -0
  512. data/lib/spiderfw/http/adapters/cgi_io.rb +27 -0
  513. data/lib/spiderfw/http/adapters/fcgi.rb +62 -0
  514. data/lib/spiderfw/http/adapters/mongrel.rb +207 -0
  515. data/lib/spiderfw/http/adapters/rack.rb +152 -0
  516. data/lib/spiderfw/http/adapters/thin.rb +38 -0
  517. data/lib/spiderfw/http/adapters/webrick.rb +176 -0
  518. data/lib/spiderfw/http/http.rb +297 -0
  519. data/lib/spiderfw/http/server.rb +40 -0
  520. data/lib/spiderfw/i18n/cldr.rb +114 -0
  521. data/lib/spiderfw/i18n/gettext.rb +8 -0
  522. data/lib/spiderfw/i18n/i18n.rb +120 -0
  523. data/lib/spiderfw/i18n/provider.rb +12 -0
  524. data/lib/spiderfw/i18n/rails.rb +89 -0
  525. data/lib/spiderfw/i18n/shtml_parser.rb +41 -0
  526. data/lib/spiderfw/model/active_record.rb +335 -0
  527. data/lib/spiderfw/model/base_model.rb +2068 -0
  528. data/lib/spiderfw/model/condition.rb +416 -0
  529. data/lib/spiderfw/model/data_type.rb +75 -0
  530. data/lib/spiderfw/model/datatypes/binary.rb +10 -0
  531. data/lib/spiderfw/model/datatypes/bool.rb +10 -0
  532. data/lib/spiderfw/model/datatypes/decimal.rb +22 -0
  533. data/lib/spiderfw/model/datatypes/email.rb +13 -0
  534. data/lib/spiderfw/model/datatypes/password.rb +63 -0
  535. data/lib/spiderfw/model/datatypes/serialized_object.rb +32 -0
  536. data/lib/spiderfw/model/datatypes/text.rb +10 -0
  537. data/lib/spiderfw/model/datatypes/uuid.rb +29 -0
  538. data/lib/spiderfw/model/datatypes.rb +19 -0
  539. data/lib/spiderfw/model/element.rb +250 -0
  540. data/lib/spiderfw/model/extended_models/managed.rb +43 -0
  541. data/lib/spiderfw/model/identity_mapper.rb +89 -0
  542. data/lib/spiderfw/model/inline_model.rb +37 -0
  543. data/lib/spiderfw/model/mappers/db_mapper.rb +1126 -0
  544. data/lib/spiderfw/model/mappers/hash_mapper.rb +114 -0
  545. data/lib/spiderfw/model/mappers/mapper.rb +926 -0
  546. data/lib/spiderfw/model/mappers/mappers.rb +7 -0
  547. data/lib/spiderfw/model/mappers/proxy_mapper.rb +25 -0
  548. data/lib/spiderfw/model/mappers/vfs/flat_file.rb +31 -0
  549. data/lib/spiderfw/model/mixins/converted.rb +110 -0
  550. data/lib/spiderfw/model/mixins/list.rb +135 -0
  551. data/lib/spiderfw/model/mixins/mixins.rb +7 -0
  552. data/lib/spiderfw/model/mixins/state_machine.rb +81 -0
  553. data/lib/spiderfw/model/mixins/synchronized.rb +88 -0
  554. data/lib/spiderfw/model/mixins/tree.rb +296 -0
  555. data/lib/spiderfw/model/mixins/versioned.rb +147 -0
  556. data/lib/spiderfw/model/model.rb +226 -0
  557. data/lib/spiderfw/model/model_hash.rb +50 -0
  558. data/lib/spiderfw/model/proxy_model.rb +37 -0
  559. data/lib/spiderfw/model/query.rb +147 -0
  560. data/lib/spiderfw/model/query_funcs.rb +99 -0
  561. data/lib/spiderfw/model/query_set.rb +700 -0
  562. data/lib/spiderfw/model/request.rb +80 -0
  563. data/lib/spiderfw/model/storage/base_storage.rb +110 -0
  564. data/lib/spiderfw/model/storage/db/adapters/mssql.rb +129 -0
  565. data/lib/spiderfw/model/storage/db/adapters/mysql.rb +436 -0
  566. data/lib/spiderfw/model/storage/db/adapters/oci8.rb +533 -0
  567. data/lib/spiderfw/model/storage/db/adapters/sqlite.rb +163 -0
  568. data/lib/spiderfw/model/storage/db/connectors/odbc.rb +213 -0
  569. data/lib/spiderfw/model/storage/db/db.rb +13 -0
  570. data/lib/spiderfw/model/storage/db/db_connection_pool.rb +126 -0
  571. data/lib/spiderfw/model/storage/db/db_connector.rb +9 -0
  572. data/lib/spiderfw/model/storage/db/db_schema.rb +233 -0
  573. data/lib/spiderfw/model/storage/db/db_storage.rb +872 -0
  574. data/lib/spiderfw/model/storage/db/dialects/no_total_rows.rb +18 -0
  575. data/lib/spiderfw/model/storage/db/reflector.rb +36 -0
  576. data/lib/spiderfw/model/storage/null_storage.rb +18 -0
  577. data/lib/spiderfw/model/storage/schema.rb +19 -0
  578. data/lib/spiderfw/model/storage.rb +72 -0
  579. data/lib/spiderfw/model/sync.rb +94 -0
  580. data/lib/spiderfw/model/type.rb +13 -0
  581. data/lib/spiderfw/model/unit_of_work.rb +75 -0
  582. data/lib/spiderfw/requires.rb +21 -0
  583. data/lib/spiderfw/resource.rb +18 -0
  584. data/lib/spiderfw/setup/setup_task.rb +44 -0
  585. data/lib/spiderfw/tag/tag.rb +28 -0
  586. data/lib/spiderfw/templates/blocks/attr_if.rb +32 -0
  587. data/lib/spiderfw/templates/blocks/comment.rb +38 -0
  588. data/lib/spiderfw/templates/blocks/debugger.rb +16 -0
  589. data/lib/spiderfw/templates/blocks/each.rb +51 -0
  590. data/lib/spiderfw/templates/blocks/html.rb +70 -0
  591. data/lib/spiderfw/templates/blocks/if.rb +35 -0
  592. data/lib/spiderfw/templates/blocks/pass.rb +16 -0
  593. data/lib/spiderfw/templates/blocks/render.rb +23 -0
  594. data/lib/spiderfw/templates/blocks/run.rb +30 -0
  595. data/lib/spiderfw/templates/blocks/tag.rb +21 -0
  596. data/lib/spiderfw/templates/blocks/tag_if.rb +29 -0
  597. data/lib/spiderfw/templates/blocks/text.rb +43 -0
  598. data/lib/spiderfw/templates/blocks/widget.rb +58 -0
  599. data/lib/spiderfw/templates/blocks/yield.rb +18 -0
  600. data/lib/spiderfw/templates/layout.rb +44 -0
  601. data/lib/spiderfw/templates/resources/less.rb +14 -0
  602. data/lib/spiderfw/templates/template.rb +625 -0
  603. data/lib/spiderfw/templates/template_blocks.rb +185 -0
  604. data/lib/spiderfw/utils/annotations.rb +201 -0
  605. data/lib/spiderfw/utils/fork.rb +75 -0
  606. data/lib/spiderfw/utils/hash_comparison.rb +8 -0
  607. data/lib/spiderfw/utils/inflector.rb +42 -0
  608. data/lib/spiderfw/utils/logger.rb +92 -0
  609. data/lib/spiderfw/utils/monkey/class.rb +59 -0
  610. data/lib/spiderfw/utils/monkey/date_time.rb +34 -0
  611. data/lib/spiderfw/utils/monkey/debugger.rb +25 -0
  612. data/lib/spiderfw/utils/monkey/exception.rb +23 -0
  613. data/lib/spiderfw/utils/monkey/kernel.rb +12 -0
  614. data/lib/spiderfw/utils/monkey/module.rb +12 -0
  615. data/lib/spiderfw/utils/monkey/symbol.rb +7 -0
  616. data/lib/spiderfw/utils/monkey/time.rb +17 -0
  617. data/lib/spiderfw/utils/multi_level_hash.rb +33 -0
  618. data/lib/spiderfw/utils/periodic_runner.rb +50 -0
  619. data/lib/spiderfw/utils/rails.rb +78 -0
  620. data/lib/spiderfw/utils/rails_app.rb +53 -0
  621. data/lib/spiderfw/utils/sanitizer.rb +178 -0
  622. data/lib/spiderfw/utils/setup_task.rb +35 -0
  623. data/lib/spiderfw/utils/shared_store/file_shared_store.rb +73 -0
  624. data/lib/spiderfw/utils/shared_store/memory_shared_store.rb +46 -0
  625. data/lib/spiderfw/utils/shared_store.rb +47 -0
  626. data/lib/spiderfw/utils/test_case.rb +24 -0
  627. data/lib/spiderfw/utils/thread_out.rb +24 -0
  628. data/lib/spiderfw/version.rb +3 -0
  629. data/lib/spiderfw/widget/rest_model.rb +20 -0
  630. data/lib/spiderfw/widget/widget.rb +671 -0
  631. data/lib/spiderfw/widget/widget_attributes.rb +54 -0
  632. data/lib/spiderfw/widget/widget_plugin.rb +37 -0
  633. data/lib/spiderfw.rb +509 -0
  634. data/spider.gemspec +43 -0
  635. data/views/errors/404.shtml +6 -0
  636. data/views/errors/error.layout.shtml +70 -0
  637. data/views/errors/error_generic.shtml +6 -0
  638. metadata +800 -0
@@ -0,0 +1,926 @@
1
+ module Spider; module Model
2
+
3
+ # The Mapper connects a BaseModel to a Storage; it fetches data from the Storage and converts it to objects,
4
+ # and vice versa.
5
+ # It is not usually called directly; the BaseModel provides methods for interacting with the mapper.
6
+ # Its methods may be overridden with BaseModel#with_mapper, though.
7
+
8
+ class Mapper
9
+ attr_reader :model
10
+ attr_accessor :storage
11
+ # Mapper type (:db, :hash, etc.)
12
+ attr_reader :type
13
+
14
+ # Returns whether this Mapper can write to the storage.
15
+ def self.write?
16
+ true
17
+ end
18
+
19
+ # Takes a BaseModel class and a storage instance.
20
+ def initialize(model, storage)
21
+ @model = model
22
+ @storage = storage
23
+ @raw_data = {}
24
+ @options = {}
25
+ @no_map_elements = {}
26
+ @sequences = []
27
+ end
28
+
29
+
30
+ # Configuration methods
31
+
32
+ # Sets that the given elements will not be processed.
33
+ def no_map(*els)
34
+ els.each{ |el| @no_map_elements[el] = true }
35
+ end
36
+
37
+ # Returns whether the given element can be handled by the mapper.
38
+ def mapped?(element)
39
+ element = element.name if (element.is_a? Element)
40
+ element = @model.elements[element]
41
+ return false if (element.attributes[:unmapped])
42
+ return false if (element.attributes[:computed_from])
43
+ return false if @no_map_elements[element.name]
44
+ return true
45
+ end
46
+
47
+ # Utility methods
48
+
49
+ # An array of mapped elements.
50
+ def map_elements # :nodoc:
51
+ @model.elements_array.select{ |el| !@no_map_elements[el.name] }
52
+ end
53
+
54
+ # Calls the given action. Used by UnitOfWork tasks.
55
+ def execute_action(action, object) # :nodoc:
56
+ case action
57
+ when :save
58
+ save(object)
59
+ when :keys
60
+ # do nothing; keys will be set by save
61
+ else
62
+ raise MapperError, "#{action} action not implemented"
63
+ end
64
+ end
65
+
66
+ # Converts hashes and arrays to QuerySets and BaseModel instances.
67
+ def normalize(obj)
68
+ obj.no_autoload do
69
+ @model.elements.select{ |n, el|
70
+ mapped?(el) && el.model? && obj.element_has_value?(el)
71
+ }.each do |name, element|
72
+ val = obj.get(name)
73
+ next if (val.is_a?(BaseModel) || val.is_a?(QuerySet))
74
+ if (val.is_a? Array)
75
+ val.each_index { |i| val[i] = Spider::Model.get(element.model, val[i]) unless val[i].is_a?(BaseModel) || val.is_a?(QuerySet) }
76
+ obj.set(name, QuerySet.new(element.model, val))
77
+ else
78
+ val = Spider::Model.get(element.model, val)
79
+ obj.set(name, val)
80
+ end
81
+ end
82
+ end
83
+ end
84
+
85
+ #############################################################
86
+ # Info #
87
+ #############################################################
88
+
89
+ # Returns true if information to find the given element is accessible to the mapper.
90
+ # (see for example DbMapper#have_references?)
91
+ def have_references?(element)
92
+ raise MapperError, "Unimplemented"
93
+ end
94
+
95
+ # Returns true if information to find the given element is accessible to the mapper, or to an integrated model's mapper.
96
+ # (see for example DbMapper#someone_have_references?)
97
+ def someone_have_references?(element)
98
+ raise MapperError, "Unimplemented"
99
+ end
100
+
101
+
102
+ ##############################################################
103
+ # Save (insert and update) #
104
+ ##############################################################
105
+
106
+ # This method is called before a save operation, normalizing and preparing the object.
107
+ # 'mode' can be :insert or :update.
108
+ # This method is well suited for being overridden, to add custom preprocessing of the object; just
109
+ # remember to call #super, or use #before_insert and #before_update instead.
110
+ def before_save(obj, mode)
111
+ normalize(obj)
112
+ if (mode == :insert)
113
+ before_insert(obj)
114
+ elsif (mode == :update)
115
+ before_update(obj)
116
+ end
117
+ @model.elements_array.each do |el|
118
+ if (el.attributes[:set_before_save])
119
+ set_data = el.attributes[:set_before_save]
120
+ if (el.model? && set_data.is_a?(Hash))
121
+ if (obj.element_has_value?(el))
122
+ set_data.each{ |k, v| obj.get(el).set(k, v) }
123
+ else
124
+ obj.set(el, el.model.new(set_data))
125
+ end
126
+ else
127
+ obj.set(el, set_data)
128
+ end
129
+ end
130
+ raise RequiredError.new(el) if (el.required? && obj.element_modified?(el) && !obj.element_has_value?(el))
131
+ if (el.unique? && !el.integrated? && obj.element_modified?(el))
132
+ existent = @model.where(el.name => obj.get(el))
133
+ if (mode == :insert && existent.length > 0) || (mode == :update && existent.length > 1)
134
+ raise NotUniqueError.new(el)
135
+ end
136
+ end
137
+ end
138
+ if (@model.extended_models)
139
+ @model.extended_models.each do |m, el|
140
+ obj.instantiate_element(el) unless obj.get(el)
141
+ unless sub = obj.get(el)
142
+ raise "Object #{obj} is missing its superclass object for model #{m} (element #{el.name})"
143
+ end
144
+ sub.save if (obj.element_modified?(el) || !obj.primary_keys_set?) && sub.mapper.class.write?
145
+ end
146
+ end
147
+ @model.elements_array.select{ |el| el.attributes[:integrated_model] }.each do |el|
148
+ sub_obj = obj.get(el)
149
+ sub_obj.save if sub_obj && sub_obj.modified? && obj.element_modified?(el) && obj.get(el).mapper.class.write?
150
+ end
151
+ end
152
+
153
+ # Hook to provide custom preprocessing. The default implementation does nothing.
154
+ def before_insert(obj)
155
+ end
156
+
157
+ # Hook to provide custom preprocessing. The default implementation does nothing.
158
+ def before_update(obj)
159
+ end
160
+
161
+ # Hook to provide custom preprocessing. Will be passed a QuerySet. The default implementation does nothing.
162
+ def before_delete(objects)
163
+ end
164
+
165
+ # Called after a succesful save. 'mode' can be :insert or :update.
166
+ def after_save(obj, mode)
167
+ obj.reset_modified_elements
168
+ save_associations(obj, mode)
169
+
170
+ end
171
+
172
+ # Hook called after a succesful save: the object is not in save mode.
173
+ def save_done(obj, mode)
174
+ end
175
+
176
+ # Hook to provide custom preprocessing. Will be passed a QuerySet. The default implementation does nothing.
177
+ def after_delete(objects)
178
+ end
179
+
180
+ # Saves the object to the storage.
181
+ def save(obj, request=nil)
182
+ prev_autoload = obj.autoload?
183
+ obj.save_mode
184
+ storage.in_transaction
185
+ if (@model.extended_models && !@model.extended_models.empty?)
186
+ is_insert = false
187
+ # Load local primary keys if they exist
188
+ # FIXME: load without cloning?
189
+ check_obj = obj.clone
190
+ @model.elements_array.select{ |el| el.attributes[:local_pk] }.each do |local_pk|
191
+ check_obj.get(local_pk)
192
+ end
193
+ @model.elements_array.select{ |el| el.attributes[:local_pk]}.each do |local_pk|
194
+ if (!check_obj.element_has_value?(local_pk))
195
+ is_insert = true
196
+ break
197
+ end
198
+ end
199
+ end
200
+ save_mode = (!is_insert && obj.primary_keys_set?) ? :update : :insert
201
+ before_save(obj, save_mode)
202
+ # @model.elements_array.select{ |el| el.attributes[:integrated_model] }.each do |el|
203
+ # obj.get(el).save if obj.element_modified?(el)
204
+ # end
205
+ if (save_mode == :update)
206
+ do_update(obj)
207
+ else
208
+ do_insert(obj)
209
+ end
210
+ after_save(obj, save_mode)
211
+ storage.commit_or_continue
212
+ obj.autoload = prev_autoload
213
+ unless @doing_save_done
214
+ @doing_save_done = true
215
+ save_done(obj, save_mode)
216
+ end
217
+ @doing_save_done = false
218
+ end
219
+
220
+ # Elements that are associated to this one externally.
221
+ def association_elements
222
+ @model.elements_array.select{ |el| mapped?(el) && !el.integrated? && !have_references?(el) }
223
+ end
224
+
225
+ # Saves object associations.
226
+ def save_associations(obj, mode)
227
+ association_elements.select{ |el| obj.element_has_value?(el) }.each do |el|
228
+ save_element_associations(obj, el, mode)
229
+ end
230
+ end
231
+
232
+ # Deletes all associations from the given object to the element.
233
+ def delete_element_associations(obj, element, associated=nil)
234
+ if (element.attributes[:junction])
235
+ condition = {element.attributes[:reverse] => obj.primary_keys}
236
+ condition[element.attributes[:junction_their_element]] = associated if associated
237
+ element.mapper.delete(condition)
238
+ else
239
+ if (element.multiple?)
240
+ condition = Condition.and
241
+ if (associated)
242
+ condition = associated.keys_to_condition
243
+ else
244
+ condition[element.reverse] = obj
245
+ end
246
+ # associated.each do |child|
247
+ # condition_row = Condition.or
248
+ # element.model.primary_keys.each{ |el| condition_row.set(el.name, '<>', child.get(el))}
249
+ # condition << condition_row
250
+ # end
251
+ if (element.owned?)
252
+ element.mapper.delete(condition)
253
+ else
254
+ element.mapper.bulk_update({element.reverse => nil}, condition)
255
+ end
256
+ end
257
+ end
258
+ end
259
+
260
+ # Saves the associations from the given object to the element.
261
+ def save_element_associations(obj, element, mode)
262
+ our_element = element.attributes[:reverse]
263
+ val = obj.get(element)
264
+ if (element.attributes[:junction])
265
+ their_element = element.attributes[:junction_their_element]
266
+ if (val.model != element.model) # dereferenced junction
267
+ unless (mode == :insert)
268
+ current = obj.get_new
269
+ current_val = current.get(element)
270
+ condition = Condition.and
271
+ current_val.each do |row|
272
+ next if val.include?(row)
273
+ condition_row = Condition.or
274
+ condition_row[their_element] = row
275
+ condition << condition_row
276
+ end
277
+ unless condition.empty?
278
+ condition[our_element] = obj
279
+ element.model.mapper.delete(condition)
280
+ end
281
+ end
282
+ val.each do |row|
283
+ next if current_val && current_val.include?(row)
284
+ junction = element.model.new({ our_element => obj, their_element => row })
285
+ junction.insert
286
+ end
287
+ else
288
+ unless mode == :insert
289
+ condition = Condition.and
290
+ condition[our_element] = obj
291
+ raise "Can't save without a junction id" unless element.attributes[:junction_id]
292
+ val.each do |row|
293
+ next unless row_id = row.get(element.attributes[:junction_id])
294
+ condition.set(:id, '<>', row_id)
295
+ end
296
+ element.model.mapper.delete(condition)
297
+ end
298
+ val.set(our_element, obj)
299
+ val.save
300
+ end
301
+ else
302
+ if (element.multiple?)
303
+ condition = Condition.and
304
+ condition[our_element] = obj
305
+ val.each do |row|
306
+ condition_row = Condition.or
307
+ element.model.primary_keys.each{ |el| condition_row.set(el.name, '<>', row.get(el))}
308
+ condition << condition_row
309
+ end
310
+ if (element.owned?)
311
+ element.mapper.delete(condition)
312
+ else
313
+ element.mapper.bulk_update({our_element => nil}, condition)
314
+ end
315
+ end
316
+ val.set(our_element, obj)
317
+ val.save
318
+ end
319
+ end
320
+
321
+ # Saves the given object and all objects reachable from it.
322
+ def save_all(root)
323
+ uow = UnitOfWork.new
324
+ uow.add(root)
325
+ uow.run()
326
+ end
327
+
328
+ # Inserts the object in the storage.
329
+ def insert(obj)
330
+ prev_autoload = obj.save_mode()
331
+ storage.in_transaction
332
+ before_save(obj, :insert)
333
+ do_insert(obj)
334
+ after_save(obj, :insert)
335
+ storage.commit_or_continue
336
+ obj.autoload = prev_autoload
337
+ end
338
+
339
+ # Updates the object in the storage.
340
+ def update(obj)
341
+ prev_autoload = obj.save_mode()
342
+ storage.in_transaction
343
+ before_save(obj, :update)
344
+ do_update(obj)
345
+ after_save(obj, :update)
346
+ storage.commit_or_continue
347
+ obj.autoload = prev_autoload
348
+ end
349
+
350
+ # FIXME: remove?
351
+ def bulk_update(values, conditon) # :nodoc:
352
+ end
353
+
354
+ # Deletes an object, or objects according to a condition.
355
+ # Will not delete with null condition (i.e. all objects) unless force is true
356
+ def delete(obj_or_condition, force=false)
357
+
358
+ def prepare_delete_condition(obj)
359
+ condition = Condition.and
360
+ @model.primary_keys.each do |key|
361
+ condition[key.name] = map_condition_value(key.type, obj.get(key))
362
+ end
363
+ return condition
364
+ end
365
+
366
+ curr = nil
367
+ if (obj_or_condition.is_a?(BaseModel))
368
+ condition = prepare_delete_condition(obj_or_condition)
369
+ curr = QuerySet.new(@model, obj_or_condition)
370
+ elsif (obj_or_condition.is_a?(QuerySet))
371
+ qs = obj_or_condition
372
+ condition = Condition.or
373
+ qs.each{ |obj| condition << prepare_delete_condition(obj) }
374
+ else
375
+ condition = obj_or_condition.is_a?(Condition) ? obj_or_condition : Condition.new(obj_or_condition)
376
+ end
377
+ Spider::Logger.debug("Deleting with condition:")
378
+ Spider::Logger.debug(condition)
379
+ prepare_query_condition(condition)
380
+ cascade = @model.elements_array.select{ |el| !el.integrated? && el.attributes[:delete_cascade] }
381
+ assocs = association_elements.select do |el|
382
+ !storage.supports?(:delete_cascade) || !schema.cascade?(el.name) # TODO: implement
383
+ end
384
+ curr = @model.where(condition) unless curr
385
+ before_delete(curr)
386
+ vals = []
387
+ started_transaction = false
388
+ unless cascade.empty? && assocs.empty?
389
+ storage.in_transaction
390
+ started_transaction = true
391
+ curr.each do |curr_obj|
392
+ obj_vals = {}
393
+ cascade.each do |el|
394
+ obj_vals[el] = curr_obj.get(el)
395
+ end
396
+ vals << obj_vals
397
+ assocs.each do |el|
398
+ delete_element_associations(curr_obj, el)
399
+ end
400
+ end
401
+ end
402
+ do_delete(condition, force)
403
+ vals.each do |obj_vals|
404
+ obj_vals.each do |el, val|
405
+ el.model.mapper.delete(val)
406
+ end
407
+ end
408
+ after_delete(curr)
409
+ storage.commit_or_continue if started_transaction
410
+ end
411
+
412
+ # Deletes all objects from the storage.
413
+ def delete_all!
414
+ all = @model.all
415
+ #all.fetch_window = 100
416
+ delete(all, true)
417
+ end
418
+
419
+ # Actual interaction with the storage. May be implemented by subclasses.
420
+ def do_delete(obj, force=false)
421
+ raise MapperError, "Unimplemented"
422
+ end
423
+
424
+ # Actual interaction with the storage. May be implemented by subclasses.
425
+ def do_insert(obj)
426
+ raise MapperError, "Unimplemented"
427
+ end
428
+
429
+ # Actual interaction with the storage. May be implemented by subclasses.
430
+ def do_update(obj)
431
+ raise MapperError, "Unimplemented"
432
+ end
433
+
434
+ # Actual interaction with the storage. May be implemented by subclasses.
435
+ def lock(obj=nil, mode=:exclusive)
436
+ raise MapperError, "Unimplemented"
437
+ end
438
+
439
+ # Actual interaction with the storage. May be implemented by subclasses.
440
+ def sequence_next(name)
441
+ raise MapperError, "Unimplemented"
442
+ end
443
+
444
+ ##############################################################
445
+ # Load (and find) #
446
+ ##############################################################
447
+
448
+ # Loads an element. Other elements may be loaded as well, according to lazy groups.
449
+ def load_element(objects, element)
450
+ load(objects, Query.new(nil, [element.name]))
451
+ end
452
+
453
+ # Loads only the given element, ignoring lazy groups.
454
+ def load_element!(objects, element)
455
+ load(objects, Query.new(nil, [element.name]), :no_expand_request => true)
456
+ end
457
+
458
+ # Loads elements of given objects according to query.request.
459
+ def load(objects, query, options={})
460
+ objects = queryset_siblings(objects) unless objects.is_a?(QuerySet)
461
+ request = query.request
462
+ condition = Condition.or
463
+ objects.each_current do |obj|
464
+ condition << obj.keys_to_condition if obj.primary_keys_set?
465
+ end
466
+ return find(Query.new(condition, request), objects, options)
467
+ end
468
+
469
+ # Finds objects according to a query, merging the results into a query_set if given.
470
+ def find(query, query_set=nil, options={})
471
+ set = nil
472
+ Spider::Model.with_identity_mapper do |im|
473
+ # im.put(query_set)
474
+ # FIXME!!! probably need to update loaded elements, but it's extremely slow
475
+ query_set.update_loaded_elements if query_set
476
+ set = query_set || QuerySet.new(@model)
477
+ was_loaded = set.loaded
478
+ set.loaded = true
479
+ set.index_by(*@model.primary_keys)
480
+ set.last_query = query
481
+ if (query.request.with_superclass? && @model.superclass < BaseModel)
482
+ return find_with_superclass(query, set, options)
483
+ end
484
+
485
+ if (@model.attributes[:condition])
486
+ query.condition = Condition.and(query.condition, @model.attributes[:condition])
487
+ end
488
+ keys_loaded = true
489
+ @model.primary_keys.each do |key|
490
+ unless set.element_loaded?(key)
491
+ keys_loaded = false
492
+ break
493
+ end
494
+ end
495
+ do_fetch = true
496
+ if (keys_loaded)
497
+ do_fetch = false
498
+ query.request.each_key do |key|
499
+ if (have_references?(key))
500
+ do_fetch = true
501
+ break
502
+ end
503
+ end
504
+ end
505
+ if (do_fetch)
506
+ @model.primary_keys.each{ |key| query.request[key] = true}
507
+ expand_request(query.request, set) unless options[:no_expand_request]
508
+ query = prepare_query(query, query_set)
509
+ query.request.total_rows = true unless query.request.total_rows == false
510
+ result = fetch(query)
511
+ if !result || result.empty?
512
+ set.each_current do |obj|
513
+ query.request.keys.each do |element_name|
514
+ el = @model.elements[element_name]
515
+ next if el.integrated? || @model.extended_models[el.model]
516
+ obj.set_loaded_value(element_name, nil)
517
+ end
518
+ end
519
+ return set
520
+ end
521
+ set.total_rows = result.total_rows if (!was_loaded)
522
+ result.each do |row|
523
+ obj = map(query.request, row, @model) # set.model ?!?
524
+ next unless obj
525
+ merge_object(set, obj)
526
+ @raw_data[obj.object_id] = row
527
+ end
528
+ end
529
+ set = get_external(set, query)
530
+ # delay_put = true if (@model.primary_keys.select{ |k| @model.elements[k.name].integrated? }.length > 0)
531
+
532
+
533
+ # if (delay_put)
534
+ # set.no_autoload(false) do
535
+ # set.each_index do |i|
536
+ # set[i].primary_keys_set?
537
+ # set[i] = im.put(set[i], true)
538
+ # end
539
+ # end
540
+ # end
541
+ end
542
+ return set
543
+ end
544
+
545
+
546
+ def merge_object(set, obj) # :nodoc:
547
+ search = {}
548
+ @model.primary_keys.each{ |k| search[k.name] = obj.get(k.name) }
549
+ obj_res = set.find(search) # FIXME: find a better way
550
+ if (obj_res && obj_res[0])
551
+ obj_res[0].merge!(obj)
552
+ obj.loaded_elements.each{ |name, bool| set.element_loaded(name) }
553
+ else
554
+ set << obj
555
+ end
556
+ end
557
+
558
+ def find_with_superclass(query, set=nil, options={}) # :nodoc:
559
+ q = query.clone
560
+ polym_request = Request.new
561
+ polym_condition = Condition.new
562
+ query.request.keys.each do |el_name|
563
+ if (!@model.superclass.has_element?(el_name))
564
+ polym_request[el_name] = true
565
+ query.request.delete(el_name)
566
+ end
567
+ end
568
+ q.with_polymorph(@model, polym_request)
569
+ res = @model.superclass.mapper.find(q)
570
+ res.change_model(@model)
571
+ res.each do |obj|
572
+ merge_object(set, obj)
573
+ end
574
+ return set
575
+ end
576
+
577
+ # Does a count query on the storage for given condition
578
+ def count(condition)
579
+ query = Query.new(condition)
580
+ result = fetch(query)
581
+ return result.length
582
+ end
583
+
584
+ # Actual interaction with the storage. Should be implemented by subclasses.
585
+ def fetch(query)
586
+ raise MapperError, "Unimplemented"
587
+ end
588
+
589
+
590
+ # Transforms a Storage result into an object. Should be implemented by subclasses.
591
+ def map(request, result, obj)
592
+ raise MapperError, "Unimplemented"
593
+ end
594
+
595
+ # Loads external elements, according to query, and merges them into an object or a QuerySet
596
+ def get_external(objects, query)
597
+ objects = queryset_siblings(objects) unless objects.is_a?(QuerySet)
598
+ return objects if objects.length < 1
599
+ got_external = {}
600
+ get_integrated = {}
601
+ query.request.each_key do |element_name|
602
+ element = @model.elements[element_name]
603
+ next unless element && (mapped?(element) || element.attributes[:element_query])
604
+ next if objects.element_loaded?(element_name)
605
+ next unless element.reverse # FIXME
606
+ if element.integrated?
607
+ get_integrated[element.integrated_from] ||= Request.new
608
+ get_integrated[element.integrated_from][element.integrated_from_element] = query.request[element_name]
609
+ elsif element.model?
610
+ next if query.request[element_name] == true && someone_have_references?(element)
611
+ sub_query = Query.new
612
+ sub_query.request = ( query.request[element_name].class == Request ) ? query.request[element_name] : nil
613
+ sub_query.condition = element.attributes[:condition] if element.attributes[:condition]
614
+ got_external[element] = true
615
+ objects = get_external_element(element, sub_query, objects)
616
+ end
617
+ # no furter attempts to try; set as loaded
618
+ objects.element_loaded(element_name)
619
+ end
620
+ get_integrated.each do |integrated, request|
621
+ next if got_external[integrated]
622
+ next if objects.element_loaded?(integrated.name)
623
+ sub_query = Query.new(nil, request)
624
+ objects = get_external_element(integrated, sub_query, objects)
625
+ objects.element_loaded(integrated)
626
+ end
627
+ return objects
628
+ end
629
+
630
+ # Loads an external element, according to query, and merges the result into an object or QuerySet.
631
+ def get_external_element(element, query, objects)
632
+ Spider::Logger.debug("Getting external element #{element.name} for #{@model}")
633
+ return load_element(objects, element) if (have_references?(element))
634
+ return nil if objects.empty?
635
+ index_by = []
636
+ @model.primary_keys.each{ |key| index_by << :"#{element.attributes[:reverse]}.#{key.name}" }
637
+ result = objects.element_queryset(element).index_by(*index_by)
638
+ @model.primary_keys.each{ |key| result.request[key.name] = true }
639
+ result.request[element.attributes[:reverse]] = true
640
+ result.load
641
+ return associate_external(element, objects, result)
642
+ end
643
+
644
+ # Given the results of a query for an element, and a set of objects, associates
645
+ # the result with the corresponding objects.
646
+ def associate_external(element, objects, result)
647
+ # result.reindex
648
+ objects.element_loaded(element.name)
649
+ objects.each_current do |obj|
650
+ search_params = {}
651
+ @model.primary_keys.each do |key|
652
+ field = @schema.field(key.name)
653
+ search_params[:"#{element.attributes[:reverse]}.#{key.name}"] = obj.get(key)
654
+ end
655
+ sub_res = result.find(search_params)
656
+ sub_res.each do |sub_obj|
657
+ sub_obj.set_loaded_value(element.attributes[:reverse], obj)
658
+ end
659
+ sub_res = sub_res[0] if !element.multiple?
660
+ sub_res.loadable = false if sub_res.respond_to?(:loadable=)
661
+ obj.set_loaded_value(element, sub_res)
662
+ end
663
+ return objects
664
+ end
665
+
666
+ # Returns the siblings, if any, of the object, in its ancestor QuerySet.
667
+ def queryset_siblings(obj)
668
+ return QuerySet.new(@model, obj) unless obj._parent
669
+ orig_obj = obj
670
+ path = []
671
+ seen = {obj => true}
672
+ while (obj._parent && !seen[obj._parent])
673
+ path.unshift(obj._parent_element) if (obj._parent_element) # otherwise it's a query set
674
+ obj = obj._parent
675
+ seen[obj] = true
676
+ end
677
+ res = path.empty? ? obj : obj.all_children(path)
678
+ raise RuntimeError, "Broken object path" if (obj && !path.empty? && res.length < 1)
679
+ res = QuerySet.new(@model, res) unless res.is_a?(QuerySet)
680
+ return res
681
+ end
682
+
683
+
684
+ # Converts a value from the storage to a value for the object.
685
+ def map_back_value(type, value)
686
+ raise MapperError, "Unimplemented"
687
+ end
688
+
689
+
690
+ ##############################################################
691
+ # Strategy #
692
+ ##############################################################
693
+
694
+ def prepare_query(query, obj=nil)
695
+ if (query.request.polymorphs?)
696
+ conds = split_condition_polymorphs(query.condition, query.request.polymorphs.keys)
697
+ conds.each{ |polym, c| query.condition << c }
698
+ end
699
+ prepare_query_request(query.request, obj)
700
+ prepare_query_condition(query.condition)
701
+ return query
702
+ end
703
+
704
+ def split_condition_polymorphs(condition, polymorphs)
705
+ conditions = {}
706
+ return conditions if condition.polymorph && polymorphs.include?(condition.polymorph)
707
+ model = condition.polymorph ? condition.polymorph : @model
708
+ condition.each_with_comparison do |el, val, comp|
709
+ if (!model.has_element?(el))
710
+ polymorphs.each do |polym|
711
+ if (polym.has_element?(el))
712
+ conditions[polym] ||= Condition.new
713
+ conditions[polym].polymorph = polym
714
+ conditions[polym].set(el, comp, val)
715
+ condition.delete(el)
716
+ end
717
+ end
718
+ end
719
+ end
720
+ condition.subconditions.each do |sub|
721
+ res = split_condition_polymorphs(sub, polymorphs)
722
+ polymorphs.each do |polym|
723
+ next unless res[polym]
724
+ if (!conditions[polym])
725
+ conditions[polym] = res[polym]
726
+ else
727
+ conditions[polym] << res[polym]
728
+ end
729
+ end
730
+ end
731
+ return conditions
732
+ end
733
+
734
+
735
+ # Normalizes a request.
736
+ def prepare_query_request(request, obj=nil)
737
+ @model.primary_keys.each do |key|
738
+ request[key] = true
739
+ end
740
+ request.each do |k, v|
741
+ next unless element = @model.elements[k]
742
+ if (element.integrated?)
743
+ integrated_from = element.integrated_from
744
+ integrated_from_element = element.integrated_from_element
745
+ request.request("#{integrated_from.name}.#{integrated_from_element}")
746
+ end
747
+ end
748
+ end
749
+
750
+ # Adds lazy groups to request.
751
+ def expand_request(request, obj=nil)
752
+ lazy_groups = []
753
+ request.each do |k, v|
754
+ unless element = @model.elements[k]
755
+ request.delete(k)
756
+ next
757
+ end
758
+ grps = element.lazy_groups
759
+ lazy_groups += grps if grps
760
+ end
761
+ lazy_groups.uniq!
762
+ @model.elements.each do |name, element|
763
+ next if (obj && obj.element_loaded?(name))
764
+ if (element.lazy_groups && (lazy_groups - element.lazy_groups).length < lazy_groups.length)
765
+ if (element.attributes[:lazy_check_owner])
766
+ next unless have_references?(name)
767
+ end
768
+ request.request(name)
769
+ end
770
+ end
771
+ end
772
+
773
+ # Preprocessing of the condition
774
+ #--
775
+ # FIXME: better name, move somewhere else
776
+ def prepare_query_condition(condition)
777
+ model = condition.polymorph ? condition.polymorph : @model
778
+ condition.simplify
779
+ condition.each_with_comparison do |k, v, c|
780
+ raise MapperError, "Condition for nonexistent element #{k} on model #{model}" unless element = model.elements[k]
781
+ if (element.integrated?)
782
+ condition.delete(k)
783
+ integrated_from = element.integrated_from
784
+ integrated_from_element = element.integrated_from_element
785
+ condition.set("#{integrated_from.name}.#{integrated_from_element}", c, v)
786
+ elsif (element.junction? && !v.is_a?(BaseModel) && !v.is_a?(Hash)) # conditions on junction id don't make sense
787
+ condition.delete(k)
788
+ condition.set("#{k}.#{element.attributes[:junction_their_element]}", c, v)
789
+ end
790
+ if (element.type < Spider::DataType && !v.is_a?(element.type))
791
+ condition.delete(k)
792
+ condition.set(k, c, element.type.from_value(v))
793
+ elsif element.type == DateTime && v && !v.is_a?(Date)
794
+ condition.delete(k)
795
+ condition.set(k, c, DateTime.parse(v))
796
+ end
797
+
798
+ end
799
+ condition.subconditions.each do |sub|
800
+ prepare_query_condition(sub)
801
+ end
802
+ return condition
803
+ end
804
+
805
+ # Returns task dependecies for the UnitOfWork. May be implemented by subclasses.
806
+ def get_dependencies(obj, action)
807
+ return []
808
+ end
809
+
810
+
811
+ end
812
+
813
+ ##############################################################
814
+ # MapperTask #
815
+ ##############################################################
816
+
817
+ # The MapperTask is used by the UnitOfWork.
818
+ class MapperTask
819
+ attr_reader :dependencies, :object, :action
820
+
821
+ def initialize(object, action)
822
+ @object = object
823
+ @action = action
824
+ @dependencies = []
825
+ end
826
+
827
+ def <<(task)
828
+ @dependencies << task
829
+ end
830
+
831
+ def execute()
832
+ Spider::Logger.debug "Executing #{@action} on #{@object}"
833
+ @object.mapper.execute_action(@action, @object)
834
+ end
835
+
836
+ def eql?(task)
837
+ return false unless task.class == self.class
838
+ return false unless (task.object == self.object && task.action == self.action)
839
+ return true
840
+ end
841
+
842
+ def hash
843
+ return @object.hash + @action.hash
844
+ end
845
+
846
+ def ===(task)
847
+ return eql?(task)
848
+ end
849
+
850
+ # def to_s
851
+ # "#{@action} on #{@object} (#{object.class})\n"
852
+ # end
853
+
854
+ def inspect
855
+ if (@action && @object)
856
+ str = "#{@action} on #{@object} (#{object.class})\n"
857
+ if (@dependencies.length > 0)
858
+ str += "-dependencies:\n"
859
+ @dependencies.each do |dep|
860
+ str += "---#{dep.action} on #{dep.object}\n"
861
+ end
862
+ end
863
+ else
864
+ str = "Root Task"
865
+ end
866
+ return str
867
+ end
868
+
869
+ end
870
+
871
+ ##############################################################
872
+ # Aggregates #
873
+ ##############################################################
874
+
875
+ def max(element, condition=nil)
876
+ raise "Unimplemented"
877
+ end
878
+
879
+
880
+ ##############################################################
881
+ # Exceptions #
882
+ ##############################################################
883
+
884
+ # Generic Mapper error.
885
+
886
+ class MapperError < RuntimeError; end
887
+
888
+ # Generic Mapper error regarding an element.
889
+
890
+ class MapperElementError < MapperError
891
+ def initialize(element)
892
+ @element = element
893
+ end
894
+ def element
895
+ @element
896
+ end
897
+ def self.create_subclass(msg)
898
+ e = Class.new(self)
899
+ e.msg = msg
900
+ return e
901
+ end
902
+ def self.msg=(msg)
903
+ @msg = msg
904
+ end
905
+ def self.msg
906
+ @msg
907
+ end
908
+ def message
909
+ _(self.class.msg) % @element.label
910
+ end
911
+ def to_s
912
+ self.class.name.to_s + " " + message
913
+ end
914
+ end
915
+
916
+ # A required element has no value
917
+
918
+ RequiredError = MapperElementError.create_subclass(_("Element %s is required"))
919
+
920
+ # An uniqueness constraint has been violated.
921
+
922
+ NotUniqueError = MapperElementError.create_subclass(_("Another item with the same %s is already present"))
923
+
924
+
925
+
926
+ end; end