gfdnavi 1.3.0.0

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 (446) hide show
  1. data/ChangeLog +10949 -0
  2. data/LICENCE.txt +57 -0
  3. data/Makefile +18 -0
  4. data/TODO +132 -0
  5. data/app/controllers/analysis_controller.rb +700 -0
  6. data/app/controllers/application.rb +41 -0
  7. data/app/controllers/draw_method_controller.rb +172 -0
  8. data/app/controllers/explorer_controller.rb +197 -0
  9. data/app/controllers/finder_controller.rb +331 -0
  10. data/app/controllers/function_controller.rb +204 -0
  11. data/app/controllers/group_controller.rb +115 -0
  12. data/app/controllers/keyword_attributes_controller.rb +52 -0
  13. data/app/controllers/knowledge_controller.rb +928 -0
  14. data/app/controllers/nodes_controller.rb +515 -0
  15. data/app/controllers/search_controller.rb +341 -0
  16. data/app/controllers/user_controller.rb +337 -0
  17. data/app/helpers/analysis_helper.rb +2 -0
  18. data/app/helpers/application_helper.rb +105 -0
  19. data/app/helpers/description_helper.rb +2 -0
  20. data/app/helpers/function_helper.rb +2 -0
  21. data/app/helpers/group_helper.rb +2 -0
  22. data/app/helpers/search_helper.rb +3 -0
  23. data/app/helpers/user_helper.rb +2 -0
  24. data/app/helpers/work_flow_helper.rb +92 -0
  25. data/app/models/actual_file.rb +3 -0
  26. data/app/models/analysis.rb +715 -0
  27. data/app/models/analysis_history.rb +42 -0
  28. data/app/models/cross_array.rb +22 -0
  29. data/app/models/cross_result.rb +254 -0
  30. data/app/models/derived_spatial_attribute.rb +3 -0
  31. data/app/models/diagram_cache.rb +16 -0
  32. data/app/models/diagram_cache_datum.rb +4 -0
  33. data/app/models/diagram_cache_session.rb +8 -0
  34. data/app/models/directory.rb +21 -0
  35. data/app/models/draw_method.rb +48 -0
  36. data/app/models/draw_method_attribute.rb +8 -0
  37. data/app/models/draw_parameter.rb +12 -0
  38. data/app/models/explorer_query.rb +354 -0
  39. data/app/models/explorer_result.rb +312 -0
  40. data/app/models/function.rb +75 -0
  41. data/app/models/function_argument.rb +6 -0
  42. data/app/models/function_output.rb +4 -0
  43. data/app/models/group.rb +153 -0
  44. data/app/models/image.rb +20 -0
  45. data/app/models/keyword_attribute.rb +179 -0
  46. data/app/models/knowledge.rb +94 -0
  47. data/app/models/knowledge_backup.rb +32 -0
  48. data/app/models/knowledge_figure.rb +16 -0
  49. data/app/models/knowledge_figure_backup.rb +16 -0
  50. data/app/models/knowledge_parser.rb +392 -0
  51. data/app/models/node.rb +605 -0
  52. data/app/models/node_entity_abstract.rb +112 -0
  53. data/app/models/node_lineage.rb +6 -0
  54. data/app/models/node_relation.rb +4 -0
  55. data/app/models/path_node.rb +60 -0
  56. data/app/models/query.rb +193 -0
  57. data/app/models/query_history.rb +12 -0
  58. data/app/models/results.rb +48 -0
  59. data/app/models/sign_up_user.rb +25 -0
  60. data/app/models/spatial_and_time_attribute.rb +11 -0
  61. data/app/models/user.rb +115 -0
  62. data/app/models/user_mailer.rb +48 -0
  63. data/app/models/value_type.rb +3 -0
  64. data/app/models/variable.rb +70 -0
  65. data/app/models/virtual_node.rb +457 -0
  66. data/app/views/analysis/__help_analysis_tab.en.html +57 -0
  67. data/app/views/analysis/__help_draw_share.en.html +12 -0
  68. data/app/views/analysis/__help_draw_tab.en.html +6 -0
  69. data/app/views/analysis/_analysis_function_settings.rhtml +61 -0
  70. data/app/views/analysis/_analysis_settings.rhtml +28 -0
  71. data/app/views/analysis/_diagram.rhtml +70 -0
  72. data/app/views/analysis/_dimension_option.rhtml +59 -0
  73. data/app/views/analysis/_draw_general_settings.rhtml +217 -0
  74. data/app/views/analysis/_draw_settings.rhtml +73 -0
  75. data/app/views/analysis/_history.rhtml +19 -0
  76. data/app/views/analysis/_popular_diagrams.rhtml +42 -0
  77. data/app/views/analysis/_save_form.rhtml +44 -0
  78. data/app/views/analysis/_variables.rhtml +66 -0
  79. data/app/views/analysis/_variables_order.rhtml +56 -0
  80. data/app/views/analysis/index.rhtml +195 -0
  81. data/app/views/analysis/preview.rhtml +3 -0
  82. data/app/views/analysis/save.rhtml +73 -0
  83. data/app/views/analysis/show_diagram.rhtml +42 -0
  84. data/app/views/cross/_display_map.rhtml +201 -0
  85. data/app/views/cross/_result.rhtml +205 -0
  86. data/app/views/cross/_show_result_tree.rhtml +40 -0
  87. data/app/views/cross/_show_results.rhtml +80 -0
  88. data/app/views/cross/_style.rhtml +21 -0
  89. data/app/views/cross/index.rhtml +271 -0
  90. data/app/views/draw_method/_edit_form.rhtml +110 -0
  91. data/app/views/draw_method/create.rhtml +8 -0
  92. data/app/views/draw_method/details.rhtml +113 -0
  93. data/app/views/draw_method/edit.rhtml +8 -0
  94. data/app/views/draw_method/list.rhtml +80 -0
  95. data/app/views/explorer/_display_map.rhtml +199 -0
  96. data/app/views/explorer/_show_result_tree.rhtml +40 -0
  97. data/app/views/explorer/_show_results.rhtml +101 -0
  98. data/app/views/explorer/_style.rhtml +21 -0
  99. data/app/views/explorer/index.rhtml +214 -0
  100. data/app/views/finder/_children.html.erb +84 -0
  101. data/app/views/finder/_children_details.html.erb +74 -0
  102. data/app/views/finder/_children_details_tr.html.erb +196 -0
  103. data/app/views/finder/create_tree.html.erb +15 -0
  104. data/app/views/finder/flex.html.erb +52 -0
  105. data/app/views/finder/index.html.erb +47 -0
  106. data/app/views/finder/show_details.html.erb +3 -0
  107. data/app/views/finder/show_images.html.erb +3 -0
  108. data/app/views/function/_edit_form.rhtml +106 -0
  109. data/app/views/function/create.rhtml +8 -0
  110. data/app/views/function/details.rhtml +96 -0
  111. data/app/views/function/edit.rhtml +8 -0
  112. data/app/views/function/list.rhtml +80 -0
  113. data/app/views/group/add_member.rhtml +13 -0
  114. data/app/views/group/change_owner.rhtml +15 -0
  115. data/app/views/group/create.rhtml +11 -0
  116. data/app/views/group/delete_member.rhtml +14 -0
  117. data/app/views/group/list.rhtml +63 -0
  118. data/app/views/knowledge/_backup.rhtml +135 -0
  119. data/app/views/knowledge/_category.rhtml +58 -0
  120. data/app/views/knowledge/_category_list.rhtml +34 -0
  121. data/app/views/knowledge/_category_table.rhtml +23 -0
  122. data/app/views/knowledge/_comment.rhtml +64 -0
  123. data/app/views/knowledge/_comment_input_form.rhtml +19 -0
  124. data/app/views/knowledge/_comments.rhtml +84 -0
  125. data/app/views/knowledge/_form.rhtml +139 -0
  126. data/app/views/knowledge/_group_figure_form.rhtml +187 -0
  127. data/app/views/knowledge/_layout_figure.rhtml +61 -0
  128. data/app/views/knowledge/_layout_figures_in_a_row_above_text.rhtml +42 -0
  129. data/app/views/knowledge/_layout_figures_under_text.rhtml +45 -0
  130. data/app/views/knowledge/_layout_one_figure_above_text.rhtml +28 -0
  131. data/app/views/knowledge/_summary.rhtml +21 -0
  132. data/app/views/knowledge/edit.rhtml +37 -0
  133. data/app/views/knowledge/list.rhtml +287 -0
  134. data/app/views/knowledge/new.rhtml +23 -0
  135. data/app/views/knowledge/new_from_analysis.rhtml +21 -0
  136. data/app/views/knowledge/show.rhtml +196 -0
  137. data/app/views/layouts/gfdnavi.rhtml +105 -0
  138. data/app/views/nodes/_ancestors.html.erb +89 -0
  139. data/app/views/nodes/_description_methods_table.html.erb +75 -0
  140. data/app/views/nodes/_mode.html.erb +16 -0
  141. data/app/views/nodes/description.html.erb +181 -0
  142. data/app/views/nodes/description_methods.html.erb +1 -0
  143. data/app/views/nodes/edit.html.erb +73 -0
  144. data/app/views/nodes/index.html.erb +25 -0
  145. data/app/views/nodes/show.html.erb +20 -0
  146. data/app/views/search/_children_details_mapsearch.rhtml +68 -0
  147. data/app/views/search/_children_details_tr.rhtml +205 -0
  148. data/app/views/search/_show_grouplist.rhtml +74 -0
  149. data/app/views/search/_show_results.rhtml +43 -0
  150. data/app/views/search/_show_results_global.rhtml +36 -0
  151. data/app/views/search/_show_results_partial.rhtml +39 -0
  152. data/app/views/search/_show_results_partial_groupbyfile.rhtml +50 -0
  153. data/app/views/search/_show_variablelist.rhtml +28 -0
  154. data/app/views/search/mapsearch.rhtml +176 -0
  155. data/app/views/search/remapsearch.rjs +18 -0
  156. data/app/views/search/show_details.rhtml +3 -0
  157. data/app/views/user/add_user.rhtml +30 -0
  158. data/app/views/user/change_password.rhtml +25 -0
  159. data/app/views/user/edit.html.erb +50 -0
  160. data/app/views/user/index.rhtml +162 -0
  161. data/app/views/user/login.rhtml +41 -0
  162. data/app/views/user/logout.rhtml +4 -0
  163. data/app/views/user/signup.rhtml +36 -0
  164. data/app/views/user/signup_succeeded.rhtml +36 -0
  165. data/app/views/user_mailer/authorization_inform.rhtml +15 -0
  166. data/app/views/user_mailer/signup_accepted.rhtml +12 -0
  167. data/app/views/user_mailer/signup_confirm.rhtml +14 -0
  168. data/app/views/user_mailer/signup_inform.rhtml +13 -0
  169. data/app/views/user_mailer/signup_rejected.rhtml +11 -0
  170. data/app/views/work_flow/_push_wsdls.rhtml +55 -0
  171. data/app/views/work_flow/index.rhtml +46 -0
  172. data/config/database.yml.example +35 -0
  173. data/config/environment.rb +68 -0
  174. data/config/gfdnavi.yml.example +95 -0
  175. data/config/load_config.rb +151 -0
  176. data/config/routes.rb +35 -0
  177. data/consistency_checker.rb +129 -0
  178. data/data/gfdnavi_docs/how_to_draw_multiple_images.knlge +68 -0
  179. data/data/gfdnavi_docs/how_to_knowledge.knlge +138 -0
  180. data/data/gfdnavi_docs/how_to_write_document_about_Gfdnavi.knlge +30 -0
  181. data/data/samples/jmadata.SIGEN +8 -0
  182. data/data/samples/jmadata.yml +6 -0
  183. data/data/samples/jmadata/MSM-P/2006.nc.yml +2 -0
  184. data/data/samples/jmadata/MSM-P/2006.yml +17 -0
  185. data/data/samples/jmadata/MSM-P/2006/0101.nc +0 -0
  186. data/data/samples/jmadata/MSM-P/2006/0101.nc.yml +13 -0
  187. data/data/samples/jmadata/MSM-P/2006/0102.nc +0 -0
  188. data/data/samples/jmadata/MSM-P/2006/0103.nc +0 -0
  189. data/data/samples/jmadata/MSM-P/2006/0104.nc +0 -0
  190. data/data/samples/jmadata/MSM-P/2006/0105.nc +0 -0
  191. data/data/samples/jmadata/MSM-P/2006/010[1-3].nc.yml +2 -0
  192. data/data/samples/jmadata/MSM-P/2006/skip_data.rb +96 -0
  193. data/data/samples/jmadata/MSM-P/2006/skip_data.sh +6 -0
  194. data/data/samples/reanalysis.SIGEN +8 -0
  195. data/data/samples/reanalysis/era40.SIGEN +8 -0
  196. data/data/samples/reanalysis/era40.yml +2 -0
  197. data/data/samples/reanalysis/era40/t.jan.nc +0 -0
  198. data/data/samples/reanalysis/era40/t.jan.nc.yml +1 -0
  199. data/data/samples/reanalysis/ncep.SIGEN +9 -0
  200. data/data/samples/reanalysis/ncep/T.jan.100hPa.png +0 -0
  201. data/data/samples/reanalysis/ncep/T.jan.100hPa.png.yml +43 -0
  202. data/data/samples/reanalysis/ncep/T.jan.nc +0 -0
  203. data/data/samples/reanalysis/ncep/T.jan.zonal_mean.nc +0 -0
  204. data/data/samples/reanalysis/ncep/T.jan.zonal_mean.nc.yml +8 -0
  205. data/data/samples/reanalysis/ncep/T.jan_only_root.nc +0 -0
  206. data/data/samples/reanalysis/ncep/T.jan_only_root.nc.yml +4 -0
  207. data/data/samples/reanalysis/ncep/UV.jan.nc +0 -0
  208. data/data/samples/reanalysis/ncep/UV.jan.nc.yml +10 -0
  209. data/data/samples/reanalysis/ncep/UV.jan.nc.yml.ja +11 -0
  210. data/data/samples/sonde_operational.yml +5 -0
  211. data/data/samples/sonde_operational/std_plev.yml +12 -0
  212. data/data/samples/sonde_operational/std_plev/41256.spl.nc +0 -0
  213. data/data/samples/sonde_operational/std_plev/42410.spl.nc +0 -0
  214. data/data/samples/sonde_operational/std_plev/43333.spl.nc +0 -0
  215. data/data/samples/sonde_operational/std_plev/43346.spl.nc +0 -0
  216. data/data/samples/sonde_operational/std_plev/48698.spl.nc +0 -0
  217. data/data/samples/sonde_operational/std_plev/61641.spl.nc +0 -0
  218. data/data/samples/sonde_operational/std_plev/63741.spl.nc +0 -0
  219. data/data/samples/sonde_operational/std_plev/67083.spl.nc +0 -0
  220. data/data/samples/sonde_operational/std_plev/72261.spl.nc +0 -0
  221. data/data/samples/sonde_operational/std_plev/76805.spl.nc +0 -0
  222. data/data/samples/sonde_operational/std_plev/82193.spl.nc +0 -0
  223. data/data/samples/sonde_operational/std_plev/91165.spl.nc +0 -0
  224. data/data/samples/sonde_operational/std_plev/91610.spl.nc +0 -0
  225. data/data/samples/sonde_operational/std_plev/91948.spl.nc +0 -0
  226. data/data/samples/sonde_operational/std_plev/94294.spl.nc +0 -0
  227. data/db/NetCDFparser.rb +406 -0
  228. data/db/create_derived_spatial_attributes.sql +12 -0
  229. data/db/draw_methods/line.yml +6 -0
  230. data/db/draw_methods/scatter.yml +38 -0
  231. data/db/draw_methods/tone.yml +64 -0
  232. data/db/draw_methods/vector.yml +19 -0
  233. data/db/dump_db.rb +43 -0
  234. data/db/functions/additions.yml +10 -0
  235. data/db/functions/cut.yml +10 -0
  236. data/db/functions/division.yml +10 -0
  237. data/db/functions/mean.yml +28 -0
  238. data/db/functions/multiplication.yml +10 -0
  239. data/db/functions/stddev.yml +28 -0
  240. data/db/functions/subtraction.yml +10 -0
  241. data/db/migrate/001_initial_scheme.rb +289 -0
  242. data/db/migrate/002_add_open_id_authentication_tables.rb +20 -0
  243. data/db/register_directory_tree.rb +760 -0
  244. data/db/restore_db.rb +60 -0
  245. data/gfdnavi-install +828 -0
  246. data/install.rb +828 -0
  247. data/lib/activerecord_gfdnavi.rb +31 -0
  248. data/lib/basic_authorization.rb +50 -0
  249. data/lib/create_activeresources.rb +108 -0
  250. data/lib/execute_analysis.rb +472 -0
  251. data/lib/file_gfdnavi.rb +38 -0
  252. data/lib/gphys_gfdnavi.rb +81 -0
  253. data/lib/localdir.rb +110 -0
  254. data/lib/login_system.rb +110 -0
  255. data/lib/multibytes.rb +20 -0
  256. data/lib/narray_yaml.rb +58 -0
  257. data/lib/no_rdb_base.rb +40 -0
  258. data/lib/opendapdir.rb +171 -0
  259. data/lib/tar.rb +127 -0
  260. data/lib/tasks/clean.rake +65 -0
  261. data/lib/tasks/setup.rake +316 -0
  262. data/lib/tasks/update.rake +62 -0
  263. data/lib/vizshot_gfdnavi.rb +224 -0
  264. data/public/crossdomain.xml +4 -0
  265. data/public/flex/NodeTreeDescriptor.as +55 -0
  266. data/public/flex/TreeNode.as +253 -0
  267. data/public/flex/finder.mxml +304 -0
  268. data/public/flex/finder.swf +0 -0
  269. data/public/flex/gfdnavi.mxml +52 -0
  270. data/public/flex/gfdnavi.swf +0 -0
  271. data/public/images/Help_S-shots/dir_tree_with_add.jpg +0 -0
  272. data/public/images/analyze.gif +0 -0
  273. data/public/images/circle.gif +0 -0
  274. data/public/images/create_from_analysis_button.png +0 -0
  275. data/public/images/delete.png +0 -0
  276. data/public/images/down.png +0 -0
  277. data/public/images/drawbutton.gif +0 -0
  278. data/public/images/gfdnavi_home_logo.png +0 -0
  279. data/public/images/gfdnavi_logo_big.png +0 -0
  280. data/public/images/gfdnavi_logo_med.png +0 -0
  281. data/public/images/gfdnavi_logo_mini.png +0 -0
  282. data/public/images/gfdnavi_logo_nobg_big.png +0 -0
  283. data/public/images/gfdnavi_logo_nobg_med.png +0 -0
  284. data/public/images/gfdnavi_logo_nobg_small.png +0 -0
  285. data/public/images/gfdnavi_logo_small.png +0 -0
  286. data/public/images/gfdnavi_logo_xsmall.png +0 -0
  287. data/public/images/hbar.png +0 -0
  288. data/public/images/helpmark16.png +0 -0
  289. data/public/images/helpmark18.png +0 -0
  290. data/public/images/kikyu_g.gif +0 -0
  291. data/public/images/kikyu_r.gif +0 -0
  292. data/public/images/map_icon_g.gif +0 -0
  293. data/public/images/map_icon_r.gif +0 -0
  294. data/public/images/new_knowledge.png +0 -0
  295. data/public/images/openid.png +0 -0
  296. data/public/images/read_in_the_form.png +0 -0
  297. data/public/images/slider_f.gif +0 -0
  298. data/public/images/slider_f_red.gif +0 -0
  299. data/public/images/star1.gif +0 -0
  300. data/public/images/star2.gif +0 -0
  301. data/public/images/startanim.gif +0 -0
  302. data/public/images/stopanim.gif +0 -0
  303. data/public/images/tree/DL.png +0 -0
  304. data/public/images/tree/anal_viz.png +0 -0
  305. data/public/images/tree/analyze_visualize_checked_items.png +0 -0
  306. data/public/images/tree/binary.png +0 -0
  307. data/public/images/tree/details.png +0 -0
  308. data/public/images/tree/download_checked_items.png +0 -0
  309. data/public/images/tree/folder.png +0 -0
  310. data/public/images/tree/folder_close.gif +0 -0
  311. data/public/images/tree/image2.png +0 -0
  312. data/public/images/tree/knowledge.png +0 -0
  313. data/public/images/tree/knowledges.png +0 -0
  314. data/public/images/tree/last.gif +0 -0
  315. data/public/images/tree/last.png +0 -0
  316. data/public/images/tree/minus.gif +0 -0
  317. data/public/images/tree/minus_simple.gif +0 -0
  318. data/public/images/tree/none.gif +0 -0
  319. data/public/images/tree/none.png +0 -0
  320. data/public/images/tree/plus.gif +0 -0
  321. data/public/images/tree/plus_simple.gif +0 -0
  322. data/public/images/tree/show.png +0 -0
  323. data/public/images/tree/show_checked_items.png +0 -0
  324. data/public/images/tree/t.gif +0 -0
  325. data/public/images/tree/t.png +0 -0
  326. data/public/images/tree/tate.gif +0 -0
  327. data/public/images/tree/tate.png +0 -0
  328. data/public/images/up.png +0 -0
  329. data/public/images/vbar.png +0 -0
  330. data/public/images/white.bmp +0 -0
  331. data/public/images/x.gif +0 -0
  332. data/public/index.html +100 -0
  333. data/public/javascripts/AC_OETags.js +269 -0
  334. data/public/javascripts/analysis.js +751 -0
  335. data/public/javascripts/application.js +29 -0
  336. data/public/javascripts/directory_tree.js +102 -0
  337. data/public/javascripts/draw_method.js +83 -0
  338. data/public/javascripts/excanvas.js +704 -0
  339. data/public/javascripts/function.js +107 -0
  340. data/public/javascripts/gfdnavi.js +175 -0
  341. data/public/javascripts/knowledge.js +384 -0
  342. data/public/javascripts/mapsearch.js +313 -0
  343. data/public/javascripts/progress.js +42 -0
  344. data/public/javascripts/resizable_box.js +164 -0
  345. data/public/javascripts/slider.js +260 -0
  346. data/public/javascripts/tab.js +17 -0
  347. data/public/javascripts/work_flow.js +452 -0
  348. data/public/stylesheets/analysis.css +111 -0
  349. data/public/stylesheets/description.css +71 -0
  350. data/public/stylesheets/gfdnavi.css +141 -0
  351. data/public/stylesheets/knowledge.css +218 -0
  352. data/public/stylesheets/search.css +184 -0
  353. data/public/stylesheets/tree.css +45 -0
  354. data/public/stylesheets/tree_for_ie.css +3 -0
  355. data/public/stylesheets/work_flow.css +78 -0
  356. data/script/cleaner +11 -0
  357. data/script/server_ssl +131 -0
  358. data/test/fixtures/diagram_cache_data.yml +5 -0
  359. data/test/fixtures/diagram_cache_sessions.yml +6 -0
  360. data/test/fixtures/diagram_caches.yml +6 -0
  361. data/test/fixtures/directories.yml +57 -0
  362. data/test/fixtures/draw_parameters.yml +6 -0
  363. data/test/fixtures/function_arguments.yml +15 -0
  364. data/test/fixtures/function_outputs.yml +15 -0
  365. data/test/fixtures/functions.yml +29 -0
  366. data/test/fixtures/group_members.yml +33 -0
  367. data/test/fixtures/groups.yml +25 -0
  368. data/test/fixtures/images.yml +12 -0
  369. data/test/fixtures/keyword_attributes.yml +73 -0
  370. data/test/fixtures/knowledges.yml +10 -0
  371. data/test/fixtures/node_relations.yml +11 -0
  372. data/test/fixtures/nodes.yml +298 -0
  373. data/test/fixtures/sign_up_users.yml +8 -0
  374. data/test/fixtures/spatial_and_time_attributes.yml +29 -0
  375. data/test/fixtures/user_mailer/authorization_inform +11 -0
  376. data/test/fixtures/user_mailer/signup_accepted +10 -0
  377. data/test/fixtures/user_mailer/signup_confirm +17 -0
  378. data/test/fixtures/user_mailer/signup_inform +10 -0
  379. data/test/fixtures/user_mailer/signup_rejected +9 -0
  380. data/test/fixtures/users.yml +31 -0
  381. data/test/fixtures/value_types.yml +10 -0
  382. data/test/fixtures/variables.yml +17 -0
  383. data/test/functional/analysis_controller_test.rb +169 -0
  384. data/test/functional/description_controller_test.rb +18 -0
  385. data/test/functional/function_controller_test.rb +18 -0
  386. data/test/functional/group_controller_test.rb +18 -0
  387. data/test/functional/search_controller_test.rb +83 -0
  388. data/test/functional/user_controller_test.rb +77 -0
  389. data/test/functional/webservice_analysis_api_test.rb +12 -0
  390. data/test/functional/work_flow_controller_test.rb +18 -0
  391. data/test/test_helper.rb +28 -0
  392. data/test/unit/diagram_cache_datum_test.rb +10 -0
  393. data/test/unit/diagram_cache_session_test.rb +10 -0
  394. data/test/unit/diagram_cache_test.rb +10 -0
  395. data/test/unit/directory_test.rb +49 -0
  396. data/test/unit/draw_parameter_test.rb +10 -0
  397. data/test/unit/function_argument_test.rb +10 -0
  398. data/test/unit/function_output_test.rb +10 -0
  399. data/test/unit/function_test.rb +10 -0
  400. data/test/unit/group_test.rb +48 -0
  401. data/test/unit/image_test.rb +13 -0
  402. data/test/unit/keyword_attribute_test.rb +33 -0
  403. data/test/unit/knowledge_test.rb +13 -0
  404. data/test/unit/node_relation_test.rb +20 -0
  405. data/test/unit/node_test.rb +85 -0
  406. data/test/unit/sign_up_user_test.rb +20 -0
  407. data/test/unit/spatial_and_time_attribute_test.rb +29 -0
  408. data/test/unit/user_mailer_test.rb +101 -0
  409. data/test/unit/user_test.rb +134 -0
  410. data/test/unit/value_type_test.rb +10 -0
  411. data/test/unit/variable_test.rb +35 -0
  412. data/vendor/plugins/acts_as_list/README +23 -0
  413. data/vendor/plugins/acts_as_list/init.rb +3 -0
  414. data/vendor/plugins/acts_as_list/lib/active_record/acts/list.rb +256 -0
  415. data/vendor/plugins/acts_as_list/test/list_test.rb +332 -0
  416. data/vendor/plugins/acts_as_tree/README +26 -0
  417. data/vendor/plugins/acts_as_tree/Rakefile +22 -0
  418. data/vendor/plugins/acts_as_tree/init.rb +1 -0
  419. data/vendor/plugins/acts_as_tree/lib/active_record/acts/tree.rb +96 -0
  420. data/vendor/plugins/acts_as_tree/test/abstract_unit.rb +0 -0
  421. data/vendor/plugins/acts_as_tree/test/acts_as_tree_test.rb +219 -0
  422. data/vendor/plugins/acts_as_tree/test/database.yml +0 -0
  423. data/vendor/plugins/acts_as_tree/test/fixtures/mixin.rb +0 -0
  424. data/vendor/plugins/acts_as_tree/test/fixtures/mixins.yml +0 -0
  425. data/vendor/plugins/acts_as_tree/test/schema.rb +0 -0
  426. data/vendor/plugins/will_paginate/CHANGELOG +92 -0
  427. data/vendor/plugins/will_paginate/LICENSE +18 -0
  428. data/vendor/plugins/will_paginate/README.rdoc +131 -0
  429. data/vendor/plugins/will_paginate/Rakefile +62 -0
  430. data/vendor/plugins/will_paginate/examples/apple-circle.gif +0 -0
  431. data/vendor/plugins/will_paginate/examples/index.haml +69 -0
  432. data/vendor/plugins/will_paginate/examples/index.html +92 -0
  433. data/vendor/plugins/will_paginate/examples/pagination.css +90 -0
  434. data/vendor/plugins/will_paginate/examples/pagination.sass +91 -0
  435. data/vendor/plugins/will_paginate/init.rb +1 -0
  436. data/vendor/plugins/will_paginate/lib/will_paginate.rb +86 -0
  437. data/vendor/plugins/will_paginate/lib/will_paginate/array.rb +16 -0
  438. data/vendor/plugins/will_paginate/lib/will_paginate/collection.rb +145 -0
  439. data/vendor/plugins/will_paginate/lib/will_paginate/core_ext.rb +32 -0
  440. data/vendor/plugins/will_paginate/lib/will_paginate/finder.rb +247 -0
  441. data/vendor/plugins/will_paginate/lib/will_paginate/named_scope.rb +132 -0
  442. data/vendor/plugins/will_paginate/lib/will_paginate/named_scope_patch.rb +39 -0
  443. data/vendor/plugins/will_paginate/lib/will_paginate/version.rb +9 -0
  444. data/vendor/plugins/will_paginate/lib/will_paginate/view_helpers.rb +373 -0
  445. data/vendor/plugins/will_paginate/will_paginate.gemspec +21 -0
  446. metadata +586 -0
@@ -0,0 +1,605 @@
1
+ require "activerecord_gfdnavi"
2
+
3
+
4
+ class Node < ActiveRecord::Base
5
+ acts_as_tree :order => "name"
6
+
7
+ belongs_to :owner, :class_name => "User", :foreign_key => :owner_id
8
+
9
+ has_many :keyword_attributes, :dependent => :destroy
10
+ has_many :spatial_and_time_attributes, :dependent => :destroy
11
+ has_many :draw_parameters, :dependent => :destroy
12
+
13
+ has_many :references, :through => :node_relations_reference
14
+ has_many :referenced_by, :through => :node_relations_referenced_by
15
+ has_many :node_relations_reference, :class_name => "NodeRelation", :foreign_key => :referenced_by
16
+ has_many :node_relations_referenced_by, :class_name => "NodeRelation", :foreign_key => :reference
17
+
18
+ has_many :ancestor, :through => :node_lineages_ancestor
19
+ has_many :descendant, :through => :node_lineages_descendant
20
+ has_many :node_lineages_ancestor, :class_name => "NodeLineage", :foreign_key => :ancestor
21
+ has_many :node_lineages_descendant, :class_name => "NodeLineage", :foreign_key => :descendant
22
+
23
+ validates_presence_of :path, :name
24
+ validates_uniqueness_of :path
25
+
26
+ before_create :set_default_values, :update_permission
27
+ before_update :update_permission
28
+ after_update :update_children
29
+ after_create :save_yaml, :set_nodelineage_to_ancestors
30
+ before_destroy :destroy_entity
31
+
32
+
33
+ DIRECTORY = 0
34
+ VARIABLE = 1
35
+ IMAGE = 2
36
+ KNOWLEDGE = 3
37
+ FUNCTION = 4
38
+ DRAW_METHOD = 5
39
+
40
+ NODE_TYPES = %w(directory variable image knowledge function draw_method)
41
+
42
+ LOCAL_DRIVE = 100
43
+ OPENDAP = 101
44
+
45
+ RESERVED_NAMES = %w(children parent edit analysis draw)
46
+
47
+
48
+ #<< class methods >>
49
+
50
+ class << self
51
+
52
+ def find(*args)
53
+ args.push(Hash.new) unless Hash === args[-1]
54
+ hash = args[-1]
55
+ user = hash.delete(:user)
56
+ conditions = conditions_to_read(user) and \
57
+ hash[:conditions] = add_conditions(hash[:conditions], conditions)
58
+ super(*args)
59
+ end
60
+
61
+ def count(*args)
62
+ args.push(Hash.new) unless Hash === args[-1]
63
+ hash = args[-1]
64
+ user = hash.delete(:user)
65
+ conditions = conditions_to_read(user) and \
66
+ hash[:conditions] = add_conditions(hash[:conditions], conditions)
67
+ super(*args)
68
+ end
69
+
70
+ def top_directory_nodes
71
+ nodes = Node.find(:all, :conditions => "parent_id is NULL AND node_type=#{Node::DIRECTORY}", :order => 'path')
72
+ if nodes.length == 0
73
+ nodes = Node.find(:all, :conditions => "parent_id=0 AND node_type=#{Node::DIRECTORY}", :order => 'path')
74
+ end
75
+ return nodes
76
+ end
77
+
78
+ # size [Integer] size in bytes or nil
79
+ def size2str(size)
80
+ if size.nil?
81
+ ''
82
+ elsif size < 1000
83
+ size.to_s
84
+ elsif size < 10000
85
+ (size / 100.0).round.to_s.insert(1,'.') + 'K'
86
+ elsif size < 1000000
87
+ (size / 1000).to_s + 'K'
88
+ elsif size < 10000000
89
+ (size / 1e5).round.to_s.insert(1,'.') + 'M'
90
+ elsif size < 1000000000
91
+ (size / 1000000).to_s + 'M'
92
+ elsif size < 1e10
93
+ (size / 1e8).round.to_s.insert(1,'.') + 'G'
94
+ else
95
+ (size / 1000000000).to_s + 'G'
96
+ end
97
+ end
98
+
99
+ def make_user_directory(path, user, other_mode=0, rgroups=0)
100
+ /(\/usr)\/(.+)/ =~ path or
101
+ raise(ArgumentError, "#{path} cannot be a user directory")
102
+ full_path = $1 # initially /usr
103
+ reldir = $2
104
+ parent = Node.find(:first,:conditions=>["path=?",full_path]) or
105
+ raise("Cannot find #{full_path}")
106
+ dir = nil
107
+ reldir.split(/\//).each do |dname|
108
+ full_path = File.join(full_path, dname)
109
+ dir = Directory.find(:first, :conditions=>["path=?",full_path],
110
+ :user=>user)
111
+ unless dir
112
+ dir = Directory.new
113
+ dir.name = dname
114
+ dir.path = full_path
115
+ dir.parent = parent
116
+ dir.owner = user
117
+ dir.other_mode = other_mode
118
+ if rgroups.is_a?(Integer)
119
+ dir.rgroups = rgroups
120
+ else
121
+ # assume an array of groups
122
+ dir.set_rgroups(*rgroups)
123
+ end
124
+ FileUtils.makedirs(dir.fname) or raise("failed to makedir")
125
+ dir.save!
126
+ end
127
+ parent = dir.node
128
+ end
129
+ dir
130
+ end
131
+
132
+ # protected
133
+ # ARGUMENTS
134
+ # * user : a User or nil (assuming non-login case) or :all.
135
+ # Do not use :all, if you do not understand what this means.
136
+ # * prefix (String) : Use this if you neede to explicitly specify the
137
+ # name of the node table. (Useful if you use find_by_sql.)
138
+ # E.g. 'nodes.',
139
+ def conditions_to_read(user, prefix='')
140
+ if String === user
141
+ user = User.find_by_login(user)
142
+ end
143
+ if User === user
144
+ if user.super_user
145
+ conditions = nil
146
+ else
147
+ groups = user.groups
148
+ if groups == 0
149
+ # the user is not a member of any group
150
+ conditions = "( (#{prefix}owner_id = #{user.id}) OR " + boolean_condition("#{prefix}other_readable") + ")"
151
+ else
152
+ conditions = "( (#{prefix}owner_id = #{user.id}) OR NOT ((#{prefix}groups_readable & #{groups}) = 0) OR " + boolean_condition("#{prefix}other_readable") + ')'
153
+ end
154
+ end
155
+ elsif user == :all
156
+ conditions = nil
157
+ elsif user.nil?
158
+ conditions = '(' + boolean_condition("#{prefix}other_readable") + ')'
159
+ else
160
+ raise ArgumentError, "invalid user argument #{user.inspect}"
161
+ end
162
+ conditions
163
+ end
164
+
165
+ end
166
+
167
+ #<< instance methods >>
168
+
169
+ def set_rgroups(*groups)
170
+ groups = groups[0] if groups.length==1 and groups[0].is_a?(Array)
171
+ self.rgroups = Group.bit_mask_for(*groups)
172
+ end
173
+ def set_wgroups(*groups)
174
+ groups = groups[0] if groups.length==1 and groups[0].is_a?(Array)
175
+ self.wgroups = Group.bit_mask_for(*groups)
176
+ end
177
+
178
+
179
+ alias _children children
180
+ def children(reload=false, hash={})
181
+ user = hash.delete(:user)
182
+ if inc = hash.delete(:include)
183
+ ch = Node.find(:all, :conditions=>["parent_id=?",self.id], :include=>inc, :user=>user)
184
+ else
185
+ ch = _children(reload,hash)
186
+ if user
187
+ ch = ch.find(:all, :user=>user, :include=>inc)
188
+ end
189
+ end
190
+ return ch
191
+ end
192
+
193
+ @@parent = Hash.new
194
+ def parent
195
+ return nil if parent_id == 0
196
+ return @@parent[parent_id] ||= parent_id && Node.find(:first,:conditions=>["id=?",parent_id],:user=>:all)
197
+ end
198
+
199
+ def entity
200
+ return @entity if @entity
201
+ NODE_TYPES.each {|typ|
202
+ if node_type == Node.const_get(typ.upcase)
203
+ @entity = ActiveRecord.class_eval(typ.classify)._find(:first,:conditions=>"node_id=#{self.id}")
204
+ return @entity
205
+ end
206
+ }
207
+ return nil
208
+ end
209
+
210
+ def entity=(ent)
211
+ @entity = ent
212
+ end
213
+
214
+ NODE_TYPES.each do |typ|
215
+ type_num = Node.const_get(typ.upcase)
216
+ pluralized_name = typ.pluralize
217
+ eval <<-"EOF"
218
+ def self.find_#{pluralized_name}(*args)
219
+ hash = Hash===args[-1] ? args.pop : Hash.new
220
+ hash[:select] = "nodes.*"
221
+ hash[:from] = "nodes, #{pluralized_name}"
222
+ hash[:conditions] = add_conditions(hash[:conditions], "#{pluralized_name}.node_id=nodes.id")
223
+ hash[:conditions] = add_conditions(hash[:conditions], "node_type=#{type_num}")
224
+ args.push hash
225
+ self.find(*args)
226
+ end
227
+ def #{typ}?
228
+ node_type == #{type_num}
229
+ end
230
+ @@#{typ}_nodes = Hash.new
231
+ def #{typ}_nodes(hash={})
232
+ refind = hash.delete(:refind)
233
+ keys = hash.keys
234
+ keys.delete(:user)
235
+ user = hash[:user]
236
+ user = user.login if User === user
237
+ if keys.length == 0
238
+ h = ( @@#{typ}_nodes[self.path] ||= Hash.new )
239
+ if (obj=h[user]) && (!refind)
240
+ return obj
241
+ end
242
+ end
243
+ hash[:conditions] = add_conditions(hash[:conditions], "node_type=#{type_num}")
244
+ obj = children.find(:all, hash)
245
+ h[user] = obj if keys.length == 0
246
+ return obj
247
+ end
248
+ def has_#{typ}_nodes?(hash={})
249
+ hash[:conditions] = add_conditions(hash[:conditions], "node_type=#{type_num} AND parent_id=\#\{self.id\}")
250
+ hash[:select] = "1"
251
+ Node.find(:first, hash) != nil
252
+ end
253
+ @@#{typ}_node_length = Hash.new
254
+ def count_#{typ}_nodes(hash={})
255
+ refind = hash.delete(:refind)
256
+ keys = hash.keys
257
+ keys.delete(:user)
258
+ user = hash[:user]
259
+ user = user.login if User === user
260
+ if keys.length == 0
261
+ h = ( @@#{typ}_node_length[self.path] ||= Hash.new )
262
+ if (obj=h[user]) && (!refind)
263
+ return obj
264
+ end
265
+ end
266
+ hash[:conditions] = add_conditions(hash[:conditions], "node_type=#{type_num}")
267
+ len = children.count(:all, hash)
268
+ h[user] = len if keys.length == 0
269
+ return len
270
+ end
271
+ @@#{pluralized_name} = Hash.new
272
+ def #{pluralized_name}(hash={})
273
+ refind = hash[:refind]
274
+ keys = hash.keys
275
+ keys.delete(:user)
276
+ user = hash[:user]
277
+ user = user.login if User === user
278
+ if keys.length == 0
279
+ h = ( @@#{pluralized_name}[self.path] ||= Hash.new )
280
+ if (obj=h[user]) && (!refind)
281
+ return obj
282
+ end
283
+ end
284
+ obj = #{typ}_nodes(hash).collect{|node| node.entity}
285
+ h[user] = obj if keys.length == 0
286
+ return obj
287
+ end
288
+ EOF
289
+ end
290
+
291
+ def fname
292
+ if self.file && self.file!="NULL"
293
+ return add_prefix(self.file)
294
+ else
295
+ return add_prefix(path)
296
+ end
297
+ end
298
+
299
+ def remote?
300
+ /^http:\/\// =~ fname
301
+ end
302
+
303
+ def opendap?
304
+ remote? # equivalent at this moment
305
+ end
306
+
307
+ def target
308
+ # for bug of rails
309
+ self
310
+ end
311
+
312
+ def add_prefix(name)
313
+ if /^temporary:(.*)/ =~ name
314
+ name = $1
315
+ if variable? || image?
316
+ return GFDNAVI_WORK_PATH + name
317
+ else
318
+ raise "[bug]"
319
+ end
320
+ elsif /^http:\/\// =~ name
321
+ return name
322
+ elsif /^\/usr(.*)/ =~ name
323
+ if $1
324
+ GFDNAVI_USER_PATH + $1
325
+ else
326
+ GFDNAVI_USER_PATH.dup
327
+ end
328
+ else
329
+ return GFDNAVI_DATA_PATH + name
330
+ end
331
+ end
332
+
333
+ def to_xml(opts={})
334
+ opts = opts.dup
335
+ user = opts.delete(:user)
336
+ num_dirs = opts.delete(:num_dirs)
337
+ uri_prefix = opts.delete(:uri_prefix)
338
+ opts.update :except => [:parent_id, :node_type, :owner_id, :other_mode, :rgroups, :wgroups, :guest_owner_id, :file, :other_readable, :groups_readable]
339
+ super(opts) do |xml|
340
+ xml.node_type Node::NODE_TYPES[self.node_type]
341
+ xml.children({"uri" => File.join(uri_prefix,"data/")+File.join(path,"children.xml")})
342
+ xml.keyword_attributes({"uri" => File.join(uri_prefix,"data/")+File.join(path,"keyword_attributes.xml")})
343
+ if user && (user.super_user? || self.owner == user)
344
+ xml.owner self.owner.login
345
+ xml.other_mode self.other_mode
346
+ xml.rgroups Group.find_by_bit_flag(self.rgroups)
347
+ xml.wgroups Group.find_by_bit_flag(self.wgroups)
348
+ end
349
+ if num_dirs
350
+ xml.num_dirs self.count_directory_nodes(:user=>user)
351
+ end
352
+ if image?
353
+ xml.img_src File.join(uri_prefix, "data", path)
354
+ end
355
+ if directory? && entity.downloadable?
356
+ xml.dl_url File.join(uri_prefix, "data", path)
357
+ end
358
+ yield(xml) if block_given?
359
+ end
360
+ end
361
+
362
+ def full_path
363
+ "localhost@#{path}"
364
+ end
365
+
366
+ def stdname(name)
367
+ self.keyword_attributes.find_by_stdname(name)
368
+ end
369
+
370
+
371
+ protected
372
+ def validate
373
+ if path =~ /^temporary/
374
+ errors.add(:path, "temporary variable cannot be saved")
375
+ end
376
+ unless /^\// =~ path || /^http:\/\// =~ path
377
+ errors.add(:path, "path must be started with '/' or 'http://'")
378
+ end
379
+ if RESERVED_NAMES.include?(name)
380
+ errors.add(:name, "#{name} cannot be used as name")
381
+ end
382
+ end
383
+
384
+ def set_default_values
385
+ unless self.parent
386
+ ary = path.split("/")[0..-2]
387
+ unless ary.length == 0
388
+ if ary.length == 1
389
+ parent_path = "/"
390
+ else
391
+ parent_path = ary.join("/")
392
+ end
393
+ (parent = Node.find(:first,:conditions=>["path=?",parent_path])) && (self.parent = parent)
394
+ end
395
+ end
396
+ self.owner = self.parent.owner if !owner && self.parent
397
+ self.mtime = Time.new if !mtime
398
+ end
399
+
400
+ # Updates the node_lineages table (with respect to self) by writing the
401
+ # ids of the relationship with its ancestors.
402
+ #
403
+ # It is much faster than the update_nodelineage method,
404
+ # but it is applicable only when the nodes table is filled in the
405
+ # descending order in the directory tree (which should be the case).
406
+ #
407
+ def set_nodelineage_to_ancestors
408
+ parent = self
409
+ myid = self.id
410
+ rel_depth = 0
411
+ NodeLineage.transaction do
412
+ while (parent)
413
+ nl = NodeLineage.new
414
+ #puts "ancestor=#{r.ancestor_id}, descendant=#{r.descendant_id}"
415
+ nl.ancestor = parent.id
416
+ nl.descendant = myid
417
+ nl.rel_depth = rel_depth
418
+ nl.save
419
+ parent = parent.parent
420
+ rel_depth += 1
421
+ end
422
+ end
423
+ end
424
+
425
+ # THIS METHOD IS CURRENTLY UNUSED -- Insted,
426
+ # set_nodelineage_to_ancestors is used. (2008/06/02 horinout)
427
+ #
428
+ # Updates the node_lineages table for self.
429
+ # It is complete but takes time, since the nodes table is
430
+ # fully scanned.
431
+ def update_nodelineage
432
+ NodeLineage.delete_all(["ancestor=? or descendant=?",self.id,self.id])
433
+ qstr=<<-EOM
434
+ select n1.id as ancestor_id, n1.path as ancestor_path,
435
+ n2.id as descendant_id ,n2.path as descendant_path
436
+ from nodes n1 join nodes n2 on concat(n2.path,'/') like concat(n1.path,'/%')
437
+ or n1.path='/'
438
+ where n1.id=#{self.id} or n2.id=#{self.id};
439
+ EOM
440
+ res = NodeLineage.find_by_sql(qstr)
441
+ res.each{ |r|
442
+ nr = NodeLineage.new
443
+ #puts "ancestor=#{r.ancestor_id}, descendant=#{r.descendant_id}"
444
+ nr.ancestor = r.ancestor_id
445
+ nr.descendant = r.descendant_id
446
+ nr.rel_depth = r.descendant_path.gsub(/[^\/#]/,"").length-r.ancestor_path.gsub(/[^\/#]/,"").length
447
+ nr.save
448
+ }
449
+ end
450
+
451
+ def update_permission
452
+ @change_permission = false
453
+ if !parent
454
+ # a root node
455
+ if self.other_mode.nil? || (self.other_mode & 4)!=0 # r ok for others
456
+ # anyone can read
457
+ unless self.other_readable == true
458
+ self.other_readable = true
459
+ @change_permission = true
460
+ end
461
+ unless self.groups_readable == -1
462
+ self.groups_readable = -1 # == unsigned 0xffffffffffffffff
463
+ @change_permission = true
464
+ end
465
+ else
466
+ # read limited only to permited groups
467
+ unless self.other_readable == false
468
+ self.other_readable = false
469
+ @change_permission = true
470
+ end
471
+ unless self.groups_readable == self.rgroups
472
+ self.groups_readable = self.rgroups
473
+ @change_permission = true
474
+ end
475
+ end
476
+ else
477
+ if self.other_mode.nil? || (self.other_mode & 4)!=0 # r ok for others
478
+ # settings same as the direct parent
479
+ unless self.other_readable == parent.other_readable
480
+ self.other_readable = parent.other_readable
481
+ @change_permission = true
482
+ end
483
+ unless self.groups_readable == parent.groups_readable
484
+ self.groups_readable = parent.groups_readable
485
+ @change_permission = true
486
+ end
487
+ else
488
+ # read limited only to permited groups
489
+ unless self.other_readable == false
490
+ self.other_readable = false
491
+ @change_permission = true
492
+ end
493
+ unless self.groups_readable == parent.groups_readable & self.rgroups
494
+ self.groups_readable = parent.groups_readable & self.rgroups
495
+ @change_permission = true
496
+ end
497
+ end
498
+ end
499
+ end
500
+
501
+ def update_children
502
+ if @change_permission
503
+ c = children(false,{:user=>:all})
504
+ if c.length > 0
505
+ c.each{|child|
506
+ if child.respond_to?(:update)
507
+ child.update
508
+ else
509
+ child.save
510
+ end
511
+ }
512
+ end
513
+ end
514
+ @change_permission = nil
515
+ end
516
+
517
+ def destroy_entity
518
+ entity.destroy if entity
519
+ end
520
+
521
+ def save_yaml
522
+ return if knowledge? || function? || draw_method?
523
+ return if file or remote?
524
+ yaml_fname = fname + ".yml"
525
+ sigen_fname = fname + ".SIGEN"
526
+ hash = make_attribute_hash
527
+ unless hash.length==0 || file || (variable? && entity.actual_files.length>0)
528
+ unless File.exist?(yaml_fname) || File.exist?(sigen_fname)
529
+ File.open(yaml_fname,"w"){|file| file.print hash.to_yaml}
530
+ end
531
+ end
532
+ end
533
+
534
+
535
+ def make_attribute_hash
536
+ hash = Hash.new
537
+ keyword_attributes.each{|key|
538
+ hash[key.name] = key.value
539
+ }
540
+ vh = Hash.new
541
+ variable_nodes(:user => :all).each{|var|
542
+ vh[var.name] = var.make_attribute_hash
543
+ }
544
+ if vh.length > 0
545
+ hash['contains'] = vh
546
+ end
547
+ chash = Node.columns_hash
548
+ gh = Hash.new
549
+ gh['user'] = owner.login if owner && (parent && owner != parent.owner)
550
+ gh['other_mode'] = other_mode if other_mode && other_mode!=chash['other_mode'].default
551
+ if (gs = Group.find_by_bit_flag(rgroups)) && gs != []
552
+ gh['rgroups'] = gs.collect{|g| g.name}
553
+ end
554
+ if (gs = Group.find_by_bit_flag(wgroups)) && gs != []
555
+ gh['wgroups'] = gs.collect{|g| g.name}
556
+ end
557
+ gh['guest_owner_id'] = guest_owner_id if guest_owner_id
558
+ if references.length > 0
559
+ gh['references'] = references.collect{|ref|
560
+ {'path' => ref.path, 'name' => ref.name}
561
+ }
562
+ end
563
+ if image? && entity.vizshot
564
+ gh['vizshot'] = entity.vizshot
565
+ end
566
+ hash['gfdnavi'] = gh if gh.length > 0
567
+ return hash
568
+ end
569
+
570
+
571
+ def make_directories
572
+ if file && file!=""
573
+ apath = file.splite("/")[1..-2]
574
+ else
575
+ apath = path.splite("/")[1..-1]
576
+ end
577
+ dir = Node.find_by_sql("SELECT * FROM nodes WHERE path='/' LIMIT 1")[0]
578
+ user = "root"
579
+ if apath[0] = "usr"
580
+ user = apath[1]
581
+ apath = apath[2..-1]
582
+ dir = make_directory(dir, "usr", "root")
583
+ dir = make_directory(dir, user, user)
584
+ end
585
+ apath = apath.split("/")
586
+ apath.each{|name|
587
+ dir = make_directory(dir, name, user)
588
+ }
589
+ end
590
+
591
+ def make_directory(parent, name, uname)
592
+ user = User.find(:first,:conditions=>["login=?",uname])
593
+ path = File.join(parent.path, name)
594
+ node = Node.find(:first, :conditions=>["path=?",path], :usr=>user)
595
+ if node
596
+ return node.entity
597
+ else
598
+ dir = Directory.new(:name=>name, :path=>path)
599
+ dir.user = user
600
+ return dir
601
+ end
602
+ end
603
+
604
+
605
+ end