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,204 @@
1
+ class FunctionController < ApplicationController
2
+ layout "gfdnavi"
3
+
4
+ before_filter :login_required
5
+
6
+ def index
7
+ redirect_to :action => "list"
8
+ end
9
+
10
+ def create
11
+ user = (login=session[:user]) && User.find_by_login(login)
12
+ @directory = "/usr/#{user.login}/functions"
13
+ case request.method
14
+ when :post
15
+ @function = Function.new
16
+ @function.attributes = params[:function]
17
+ @function.owner = user
18
+ @function.path = "#{@directory}/#{@function.name}"
19
+ Node.make_user_directory(@directory, user, 0)
20
+ groups = params[:groups]
21
+ groups.shift if groups[0] == 'only me'
22
+ if user.super_user? && groups[0] == 'everyone' && groups.shift
23
+ @function.other_mode = 4
24
+ else
25
+ @function.other_mode = 0
26
+ end
27
+ @function.set_rgroups(groups) if groups.length > 0
28
+ if check_erb(@function) && check_script(@function)
29
+ flag = nil
30
+ Function.transaction do
31
+ if flag = @function.save
32
+ output_num = params[:output_num].to_i
33
+ output_num.times{|i|
34
+ fo = FunctionOutput.new( params[:output][i.to_s] )
35
+ fo.function = @function
36
+ fo.save!
37
+ }
38
+ argument_num = params[:argument_num].to_i
39
+ argument_num.times{|i|
40
+ param = params[:argument][i.to_s]
41
+ value_type = param.delete(:value_type)
42
+ fa = FunctionArgument.new( param )
43
+ fa.function = @function
44
+ fa.value_type = ValueType.find(:first,:conditions=>["name=?",value_type])
45
+ fa.save!
46
+ }
47
+ end
48
+ end
49
+ if flag
50
+ flash[:notice] = "create successful"
51
+ redirect_back_or_default :action => "list"
52
+ else
53
+ flash[:notice] = "create unsuccessful"
54
+ end
55
+ end
56
+ when :get
57
+ @function = Function.new
58
+ end
59
+ @groups = user.own_groups + user.belonging_groups
60
+ @user = user
61
+ end
62
+
63
+ def edit
64
+ user = (login=session[:user]) && User.find_by_login(login)
65
+ @function = Function.find(:first, :conditions=>["name=?",params[:id]], :user=>user)
66
+ unless @function && @function.owner==user
67
+ redirect_back_or_default :action => "list"
68
+ return
69
+ end
70
+ @directory = "/usr/#{user.login}/functions"
71
+ case request.method
72
+ when :post
73
+ @function.attributes = params[:function]
74
+ output_num = params[:output_num].to_i
75
+ outputs = @function.function_outputs
76
+ output_num.times{|i|
77
+ param = params[:output][i.to_s]
78
+ if outputs[i]
79
+ fo = outputs[i]
80
+ fo.attributes = param
81
+ else
82
+ fo = outputs.create(param)
83
+ end
84
+ fo.save
85
+ }
86
+ for i in output_num...outputs.length
87
+ outputs[i].destroy
88
+ end
89
+ argument_num = params[:argument_num].to_i
90
+ args = @function.function_arguments
91
+ argument_num.times{|i|
92
+ param = params[:argument][i.to_s]
93
+ value_type = param.delete(:value_type)
94
+ if args[i]
95
+ fa = args[i]
96
+ fa.attributes = param
97
+ else
98
+ fa = args.create(param)
99
+ end
100
+ fa.value_type = ValueType.find(:first,:conditions=>["name=?",value_type])
101
+ fa.save
102
+ }
103
+ for i in argument_num...args.length
104
+ args[i].destroy
105
+ end
106
+ groups = params[:groups]
107
+ groups.shift if groups[0] == 'only me'
108
+ if user.super_user? && groups[0] == 'everyone' && groups.shift
109
+ @function.other_mode = 4
110
+ else
111
+ @function.other_mode = 0
112
+ end
113
+ @function.set_rgroups(groups) if groups.length > 0
114
+ if check_erb(@function) && check_script(@function)
115
+ if @function.save
116
+ flash[:notice] = "edit successful"
117
+ redirect_back_or_default :action => "list"
118
+ else
119
+ flash[:notice] = "edit unsuccessful"
120
+ end
121
+ end
122
+ end
123
+ @groups = user.own_groups + user.belonging_groups
124
+ @user = user
125
+ end
126
+
127
+ def list
128
+ user = (login=session[:user]) && User.find_by_login(login)
129
+ funcs = Function.find(:all, :user => user)
130
+ @own_funcs = Array.new
131
+ @other_funcs = Array.new
132
+ funcs.each{|func|
133
+ if func.owner == user
134
+ @own_funcs.push func
135
+ else
136
+ @other_funcs.push func
137
+ end
138
+ }
139
+ @super_user = user.super_user
140
+ end
141
+
142
+ def details
143
+ name = params[:id]
144
+ user = (login=session[:user]) && User.find_by_login(login)
145
+ func = Function.find(:first, :conditions=>["name=?",name], :user=>user)
146
+ if func
147
+ @func = func
148
+ @user = user
149
+ else
150
+ redirect_back_or_default :action => "list"
151
+ return
152
+ end
153
+ end
154
+
155
+ def create_setting_html
156
+ unless request.xhr?
157
+ render :nothing => true
158
+ return
159
+ end
160
+ narg = params[:narg].to_i
161
+ args = params[:argument]
162
+ html = ""
163
+ if narg > 0
164
+ html += "<table>\n"
165
+ narg.times{|n|
166
+ html += " <tr>\n"
167
+ arg = args[n.to_s]
168
+ html +=<<-"EOS"
169
+ <td>#{arg["description"]}</td>
170
+ <td>(#{arg["value_type"]})</td>
171
+ <td><input type="text" size="5" value="#{arg["default"]}" name="analysis[function_arguments][#{n}]"/></td>
172
+ EOS
173
+ html += " </tr>\n"
174
+ }
175
+ html += "</table>\n"
176
+ end
177
+ render :update do |page|
178
+ page << "$('function_setting_html').value='#{escape_javascript(html)}'"
179
+ end
180
+ end
181
+
182
+ private
183
+
184
+ def check_script(function)
185
+ script = function.script
186
+ if script =~ /retry/
187
+ flash[:notice] = "you cannot use retry in script"
188
+ return false
189
+ end
190
+ return true
191
+ end
192
+
193
+ def check_erb(function)
194
+ html = function.setting_html
195
+ begin
196
+ ERB.new(html).run
197
+ return true
198
+ rescue SyntaxError
199
+ flash[:notice] = "html is invalid"
200
+ return false
201
+ end
202
+ end
203
+
204
+ end
@@ -0,0 +1,115 @@
1
+ class GroupController < ApplicationController
2
+ layout 'gfdnavi'
3
+
4
+ before_filter :login_required
5
+
6
+ def create
7
+ user = (login=session[:user]) && User.find_by_login(login)
8
+ raise("only super user can create groups") if !User.super_user?(user)
9
+
10
+ case request.method
11
+ when :post
12
+ if user
13
+ group = Group.new(:name => params[:group][:name])
14
+ group.owner = user
15
+ if group.save
16
+ flash['notice'] = "Create group successful"
17
+ redirect_back_or_default :action => "list"
18
+ return
19
+ end
20
+ end
21
+ flash['notice'] = "Failed to create a group"
22
+ redirect_back_or_default :action => "list"
23
+ end
24
+ end
25
+
26
+ def delete
27
+ user = (login=session[:user]) && User.find_by_login(login)
28
+ name = params[:id]
29
+ group = Group.find(:first,:conditions=>["name=?",name])
30
+ if group
31
+ if group.owner == user || User.super_user?(user)
32
+ if group.destroy
33
+ flash[:notice] = "delete group successed #{name}"
34
+ end
35
+ end
36
+ end
37
+ redirect_back_or_default :action => "list"
38
+ end
39
+
40
+ def add_member
41
+ case request.method
42
+ when :post
43
+ if ( group = Group.find(:first,:conditions=>["name=?",params[:id]]) )
44
+ user = (login=session[:user]) && User.find_by_login(login)
45
+ if user.super_user || group.owner == user
46
+ unames = params[:user].split(/[;, ]+/)
47
+ res, mesg = group.add_members(unames)
48
+ flash[:notice] = mesg
49
+ end
50
+ end
51
+ redirect_back_or_default :action => "list"
52
+ when :get
53
+ @group = Group.find(:first,:conditions=>["name=?",params[:id]])
54
+ end
55
+ end
56
+
57
+ def delete_member
58
+ case request.method
59
+ when :post
60
+ if ( group = Group.find(:first,:conditions=>["name=?",params[:id]]) )
61
+ user = (login=session[:user]) && User.find_by_login(login)
62
+ if user.super_user || group.owner == user
63
+ res, mesg = group.del_member(params[:user])
64
+ flash[:notice] = mesg
65
+ end
66
+ end
67
+ redirect_back_or_default :action => "list"
68
+ when :get
69
+ if (group = Group.find(:first,:condition=>["name=?",params[:id]]))
70
+ @name = group.name
71
+ @members = group.members.collect{|u| u.login}
72
+ end
73
+ end
74
+ end
75
+
76
+ def change_owner
77
+ case request.method
78
+ when :post
79
+ if ( group = Group.find(:first,:conditions=>["name=?",params[:id]]) ) && ( owner = User.find(:first,:conditions=>["login=?",(oname=params[:user])]) )
80
+ user = (login=session[:user]) && User.find_by_login(login)
81
+ if user.super_user || group.owner == user
82
+ group.owner = owner
83
+ if group.respond_to?(:update) ? group.update : group.save
84
+ flash[:notice] = "owner was changed to #{oname}"
85
+ else
86
+ flash[:notice] = "faild to change owner"
87
+ end
88
+ end
89
+ end
90
+ redirect_back_or_default :action => "list"
91
+ when :get
92
+ if (group = Group.find(:first,:conditions=>["name=?",params[:id]]))
93
+ @name = group.name
94
+ members = group.members
95
+ root = User.find_by_sql("SELECT * FROM users WHERE login='root' LIMIT 1")[0]
96
+ members.push(root) unless members.include?(root)
97
+ members.delete(group.owner)
98
+ @members = members.collect{|u| u.login}
99
+ end
100
+ end
101
+ end
102
+
103
+ def list
104
+ user = (login=session[:user]) && User.find_by_login(login)
105
+ if User.super_user?(user)
106
+ @own_groups = Group.find(:all)
107
+ @super_user = true
108
+ else
109
+ @own_groups = user.own_groups(true)
110
+ @super_user = false
111
+ end
112
+ @belonging_groups = user.belonging_groups
113
+ end
114
+
115
+ end
@@ -0,0 +1,52 @@
1
+ class KeywordAttributesController < ApplicationController
2
+
3
+ layout "gfdnavi"
4
+
5
+ def index
6
+ path = params[:path]
7
+ path = "" unless path
8
+ path = File.join("",path)
9
+ user = (login=session[:user]) && User.find_by_login(login)
10
+ node = Node.find(:first, :conditions => ["path=?",path], :user => user)
11
+ if node
12
+ @kas = node.keyword_attributes
13
+ respond_to do |format|
14
+ format.html
15
+ format.xml { render :xml => @kas}
16
+ end
17
+ else
18
+ respond_to do |format|
19
+ format.html {
20
+ render :text => "not found", :status => :not_found
21
+ }
22
+ format.xml { head :not_found }
23
+ end
24
+ end
25
+ end
26
+
27
+ =begin
28
+ def show
29
+ if id = params[:id]
30
+ user = (login=session[:user]) && User.find_by_login(login)
31
+ ka = KeywordAttribute.find(id)
32
+ if ka && ka.node(false,:user=>user)
33
+ @ka = ka
34
+ respond_to do |format|
35
+ format.html
36
+ format.xml {render :xml => @ka}
37
+ end
38
+ return
39
+ end
40
+ end
41
+ respond_to do |format|
42
+ format.html {
43
+ flash[:notice] = "not found"
44
+ redirect_to :status => :not_found, :controller => "finder"
45
+ }
46
+ format.xml { head :not_found }
47
+ end
48
+ end
49
+ =end
50
+
51
+
52
+ end
@@ -0,0 +1,928 @@
1
+ require "vizshot_gfdnavi"
2
+ require "pp"
3
+
4
+ class KnowledgeController < ApplicationController
5
+ layout "gfdnavi", :except => [:list_without_layout, :show_without_layout, :category_search]
6
+ before_filter :login_required, :except => [:index, :list, :list_without_layout, :show, :show_without_layout, :appear_comment_input_form, :fig2analysis, :category_search]
7
+ verify :method => :post, :only => [ :destroy, :create, :update ], :redirect_to => { :action => :list }
8
+
9
+ def index
10
+ list
11
+ render :action => 'list'
12
+ end
13
+
14
+ # == paginate�𗘗p���āA�m���h�L�������g�̈ꗗ��\������
15
+ def list
16
+ @user = (login=session[:user]) && User.find_by_login(login)
17
+
18
+ # ���̕����̃R�[�h�͎d���Ȃ����G�ȍ��ɂȂ��Ă���B
19
+ # paginate ���\�b�h�͓����I�� find ���\�b�h���g���Ă��邪
20
+ # ���� find �� Rails �Œ�`���ꂽ�I���W�i���̂��̂ł���B
21
+ # ����A�g�����������̂� node.rb �ōĒ�`���� find�B
22
+ # �Ƃ������ƂŁA�d�����邪 node.rb �� find �Ɠ����悤�ȋL�q�������B
23
+ # list_without_layout �ɂ‚��Ă����l�B
24
+ if Knowledge.respond_to?("paginate")
25
+ # for Rails 2.*
26
+ other_readable_conditions = Node.conditions_to_read(@user)
27
+ unless @user # �񃍃O�C�����
28
+ conditions = " AND (#{other_readable_conditions})"
29
+ else
30
+ if @user.super_user
31
+ conditions = ""
32
+ elsif @user.groups == 0 # ���[�U���O���[�v�ɏ������Ȃ��ꍇ
33
+ conditions = " AND (( (owner_id = #{@user.id}) OR (#{other_readable_conditions})))"
34
+ else # ���[�U�����炩�̃O���[�v�ɏ�������ꍇ
35
+ conditions = " AND (( (owner_id = #{@user.id}) OR NOT ((groups_readable & 1) = 0) OR (#{other_readable_conditions})))"
36
+ end
37
+ end
38
+
39
+ # �\�[�g
40
+ unless params['sort']
41
+ order = "mtime DESC"
42
+ else
43
+ case params['sort']
44
+ when "time"
45
+ sort_by = "mtime"
46
+ when "author"
47
+ sort_by = "creator"
48
+ else
49
+ sort_by = params['sort']
50
+ end
51
+ order = sort_by
52
+ order += " DESC" if params['reverse_sort'] == 'reverse_sort'
53
+ end
54
+
55
+ # �i�荞��
56
+ if params["commit"] == "Search"
57
+ conditions += " AND (knowledges.category = \"#{params['category']}\")" unless params["category"] == ""
58
+ conditions += " AND (knowledges.creator = \"#{params['creator']}\")" unless params["creator"] == ""
59
+ end
60
+
61
+ # �y�[�W���O���ĕ\������
62
+ @knowledges = Knowledge.paginate_by_sql("SELECT knowledges.* FROM nodes, knowledges WHERE ((knowledges.node_id=nodes.id) AND (node_type=3) #{conditions} AND (knowledges.comment_on IS NULL)) ORDER BY #{order}", :page => params[:page], :per_page => GFDNAVI_PAGINATE_PER)
63
+ else
64
+ # for Rails 1.*
65
+ @knowledge_pages, @knowledges = paginate :knowledges, :per_page => GFDNAVI_PAGINATE_PER
66
+ @knowledge = Knowledge.find(:all, :user => @user, :order =>"mtime DESC")
67
+ end
68
+ end
69
+
70
+ # == ���̉�ʂɖ��ߍ��ނ��߂ɁA
71
+ # ��ʏ㕔��Gfdnavi�̃��j���[���o������list��\������
72
+ # �R�����g�̈ꗗ�\���ȂǂɎg����B
73
+ def list_without_layout
74
+ @list_without_layout = true
75
+ @user = (login=session[:user]) && User.find_by_login(login)
76
+ if params[:node_ids]
77
+ node_ids = params[:node_ids]
78
+ end
79
+
80
+ # for Rails 2.*
81
+ unless @user # �񃍃O�C�����
82
+ conditions = " AND (#{other_readable_conditions})"
83
+ else
84
+ if @user.super_user
85
+ conditions = ""
86
+ elsif @user.groups == 0 # ���[�U���O���[�v�ɏ������Ȃ��ꍇ
87
+ conditions = " AND (( (owner_id = #{@user.id}) OR (#{other_readable_conditions})))"
88
+ else # ���[�U�����炩�̃O���[�v�ɏ�������ꍇ
89
+ conditions = " AND (( (owner_id = #{@user.id}) OR NOT ((groups_readable & 1) = 0) OR (#{other_readable_conditions})))"
90
+ end
91
+ end
92
+
93
+ # �R�����g�̏ꍇ�͌Â����A�����łȂ���ΐV�������ɕ\��
94
+ if params[:from] == "show_comments"
95
+ order = "ORDER BY mtime"
96
+ else
97
+ order = "ORDER BY mtime DESC"
98
+ end
99
+
100
+ # Rails 1.* �ւ̑Ή�
101
+ if Knowledge.respond_to?("paginate")
102
+ # for Rails 2.*
103
+ @knowledges = Knowledge.paginate(:all, {:user => @user}, {:page => params[:page], :per_page => 5, :conditions => ["(node_id IN (?))", node_ids], :order =>"mtime DESC"})
104
+ else
105
+ # for Rails 1.*
106
+ @knowledge_pages, @knowledges = paginate :knowledges, :per_page => 5
107
+ @knowledges = []
108
+ for nid in node_ids
109
+ @knowledges.push(Knowledge.find(@user, :first, {:conditions => ["id = ?", nid]}))
110
+ end
111
+ @knowledges = @knowledges.uniq
112
+ @knowledges.sort! {|a,b| b.mtime <=> a.mtime}
113
+ end
114
+
115
+ render :action => 'list'
116
+ end
117
+
118
+ # �m���h�L�������g�̉{��
119
+ def show
120
+ begin
121
+ @user = (login=session[:user]) && User.find_by_login(login)
122
+ @knowledge, @knowledge_figures, @comments, @image_paths, @image_widths, @image_heights, @caption_widths, @caption_heights = Knowledge.read_parameters_of_knowledge_document(params[:path], @user)
123
+ rescue
124
+ flash[:notice] = "The knowledge document doesn't exist."
125
+ redirect_to :action => 'list'
126
+ else
127
+ @num_of_figure = 1 # �R�����g���e�����o���������Ƃ��ɕK�v
128
+ end
129
+ end
130
+
131
+ # ��ʏ㕔��Gfdnavi�̃��j���[���o������show�����s����
132
+ def show_without_layout
133
+ @show_without_layout = true
134
+ show
135
+ render :action => 'show'
136
+ end
137
+
138
+ # list.rhtml -> new.rhtml (Click "New Knowledge" button.)
139
+ def new
140
+ @type = "new"
141
+ @knowledge = Knowledge.new
142
+ @user = (login=session[:user]) && User.find_by_login(login)
143
+ @groups = @user.belonging_groups
144
+ @num_of_figure = 1
145
+ end
146
+
147
+ # Click "Click a Knowledge Document with this/these Image(s)" button in Analysis
148
+ def new_from_analysis
149
+ @type = "new_from_analysis"
150
+ @knowledge = Knowledge.new
151
+ @user = (login=session[:user]) && User.find_by_login(login)
152
+ @groups = @user.belonging_groups
153
+ session[:knowledge] = Hash.new
154
+
155
+ # ��ʓ��ɂ���G�̔ԍ��̔z����擾
156
+ if (diagram_ids = session[:diagrams].dup)
157
+ session[:knowledge_figure] = Hash.new
158
+ session[:knowledge_figure]["diagram_ids"] = diagram_ids
159
+ else
160
+ raise "diagram is not found."
161
+ end
162
+ @num_of_figure = diagram_ids ? diagram_ids.length : 0
163
+ end
164
+
165
+ # Edit a knowledge document.
166
+ # list.rhtml -> edit.rhtml (Click "Edit" link.)
167
+ def edit
168
+ @type = "edit"
169
+ @user = (login=session[:user]) && User.find_by_login(login)
170
+ @groups = @user.belonging_groups
171
+
172
+ # �ҏW�Ώۂ̕����̓��e�����炩���߃t�H�[���ɏ�������ł���
173
+ @knowledge = Knowledge.find(:first, :conditions => ["path=?", params[:path]], :user => @user)
174
+ unless @user == @knowledge.owner || @user.super_user
175
+ flash[:notice] = "Sorry, you don't have the right to edit this document."
176
+ redirect_to :action => "list"
177
+ end
178
+ session[:knowledge] = Hash.new
179
+ session[:knowledge_figure] = Hash.new
180
+ @figure_captions = Array.new
181
+ @figure_paths = Array.new
182
+
183
+ # �������̐}�ɂ‚��Ă����l
184
+ knowledge_figures = @knowledge.knowledge_figures
185
+ knowledge_figures.each do |kf|
186
+ img = Image.find(kf.image_id, :user => @user)
187
+ @figure_captions << kf.caption
188
+ @figure_paths << img.path
189
+ end
190
+
191
+ @num_of_figure = @knowledge.knowledge_figures.length
192
+ end
193
+
194
+ # create a knowledge document in new.rhtml
195
+ def create_from_new
196
+ if params[:commit] == "Create"
197
+ create
198
+ else
199
+ redirect_to :action => "new"
200
+ end
201
+ end
202
+
203
+ # create a knowledge document in edit.rhtml
204
+ def create_from_edit
205
+ if (params[:commit] == "Save" || params[:commit] == "Save As")
206
+ create
207
+ else
208
+ redirect_to :action => "edit", :path => params[:original_path]
209
+ end
210
+ end
211
+
212
+ # == create a knowledge document in Analysis.
213
+ # Save images in this method, and call create method to make a knowledge document.
214
+ def create_from_analysis
215
+ user = (login=session[:user]) && User.find_by_login(login)
216
+ unless user
217
+ redirect_to :controller=> "knowledge", :action => "index"
218
+ return
219
+ end
220
+
221
+ ActiveRecord::Base::transaction do
222
+ unless params[:commit] == "Create"
223
+ redirect_to :action => "new_from_analysis"
224
+ else
225
+ # �摜��ۑ����邽�߂̃p�X�`�F�b�N�B
226
+ # create���\�b�h���ɂ��������̂����邪�A������͒m�������p�B
227
+ if check_path(params[:node]["path"]) == "path_error."
228
+ redirect_to :action => "list"
229
+ return
230
+ end
231
+
232
+ # === save images
233
+ dirs = params[:node]["path"].split(File::Separator)[0..-2]
234
+ dirname = dirs.join("/")
235
+ dirname = dirname + "/" unless dirname == ""
236
+ filename = params[:node]["path"].split(File::Separator)[-1]
237
+
238
+ if params[:knowledge_figure]
239
+ params[:knowledge_figure].each do |key, value|
240
+ # determine realpath(��΃p�X) for figure.
241
+ case key.to_i
242
+ when 0..9 then auto_figure_path = "image00" + key.to_s
243
+ when 10..99 then auto_figure_path = "image0" + key.to_s
244
+ else auto_figure_path = "image" + key.to_s
245
+ end
246
+ type = "diagram"
247
+ name = value["filename"]
248
+
249
+ if user.super_user
250
+ value["figure_path"] = "/" + dirname + "." + filename + "/" + auto_figure_path
251
+ else
252
+ value["figure_path"] = "/usr/" + Knowledge.remove_scheme(user) + "/knowledge/" + dirname + "." + filename + "/" + auto_figure_path
253
+ end
254
+
255
+ # group
256
+ group = params[:knowledge]["group_name"]
257
+
258
+ # about groups
259
+ unless params[:groups]
260
+ groups = ['everyone']
261
+ # raise "Check at least 1 group to visible!\n"
262
+ else
263
+ groups = params[:groups].values # Hash to Array
264
+ end
265
+ if groups[0] == 'everyone'
266
+ other_mode = 4
267
+ groups.shift
268
+ else
269
+ other_mode = 0
270
+ end
271
+
272
+ refs = Array.new
273
+ var = Image.new
274
+
275
+ diagram = DiagramCache.find(session[:diagrams][key.to_i - 1])
276
+ viz = YAML.load(diagram.vizshot)
277
+ ids = viz.get_variables.collect{|v| # ���̃u���b�N�͂Ƃ肠�������̂܂܂ɂ��Ă��邪�A�v�Ή�
278
+ if Variable===v && ! v.id
279
+ from = v.fname
280
+ to, pa = auto_file_path("data")
281
+ File.move(from, to)
282
+ v.path = pa + '/' + v.name
283
+ v.owner = user
284
+ v.other_mode = other_mode
285
+ v.set_rgroups(groups) if groups.length > 0
286
+ v.save!
287
+ else
288
+ v = Variable===v ? v : Variable.find(:first, :conditions=>["path=?",v],:user=>user)
289
+ end
290
+ refs << v.node
291
+ v.id
292
+ }
293
+ var.vizshot = viz.to_yaml
294
+ var.path = value["figure_path"] + ".png"
295
+ name = var.name = File.basename(var.path)
296
+ var.owner = user
297
+ var.other_mode = other_mode
298
+ var.node.set_rgroups(groups) if groups.length > 0
299
+
300
+ from = value["diagram_path"]
301
+ to = var.fname
302
+ FileUtils.makedirs( File.dirname(to) )
303
+
304
+ # �m�������쐬�Ɠ����ɕۑ�����摜�ɂ�keyword_attributes�͂‚��Ȃ�
305
+
306
+
307
+ ## If none, make directory.
308
+ # make directories
309
+ make_directories(var, user, groups, other_mode)
310
+
311
+ # save images
312
+ if var.save
313
+ rtype = {"diagram"=>"draw", "data"=>"analyze"}[type]
314
+ refs.each{|ref|
315
+ NodeRelation.new(:name=>rtype, :reference=>ref, :referenced_by=>var.node).save!
316
+ }
317
+ FileUtils.copy( from, to )
318
+ else
319
+ flash[:notice] = "Failed to save images.\n"
320
+ redirect_to :action => "list"
321
+ return
322
+ end
323
+ end
324
+ end
325
+ end
326
+ create
327
+ end
328
+ end
329
+
330
+ # == create and save Knowledge Document
331
+ # �ϐ� @knowledge �� knowledge_figures �ɓ��̓t�H�[������擾�����l��������
332
+ # ��� save (temporary save ���s��).
333
+ #
334
+ # save, temporary save �̏ꍇ������
335
+ # * �ꎞ�ۑ��Ȃ�o�b�N�A�b�v�̂ݕۑ�
336
+ # * �㏑���ۑ��Ȃ�{�̂ƃo�b�N�A�b�v�̗�����ۑ�
337
+ # * ���̂ق��̏ꍇ�͖{�̂̂ݕۑ�
338
+ def create
339
+ # print "========= create ==========\n"
340
+ # print "params = "
341
+ # pp params
342
+ @user = (login=session[:user]) && User.find_by_login(login)
343
+ add_a_comment_button_message = "Add a Comment on this document."
344
+
345
+ # === knowledges table
346
+ # * path check (�㏑�����A�R�����g���͎����Ńp�X�����܂��Ă���̂ŁA�`�F�b�N�͂��Ȃ�)
347
+ unless (params[:original_path] && params[:commit] == "Save") || (params[:commit] == add_a_comment_button_message) || (params[:commit] == "Temporary Save")
348
+ if check_path(params[:node]["path"]) == "path_error."
349
+ redirect_to :action => "list"
350
+ return
351
+ end
352
+ end
353
+
354
+ unless params[:commit]=="Save"
355
+ @knowledge = Knowledge.new
356
+ else
357
+ # ==== Click "Save" button in edit.rhtml
358
+ # * if "Save", insert all original data include "@Knowledge.id"
359
+ begin
360
+ @knowledge = Knowledge.find(:first, :conditions => ["path=?", params[:original_path]], :user => @user)
361
+ @old_knowledge = Knowledge.new
362
+ @old_knowledge.id = @knowledge.id
363
+ @old_knowledge.attributes = @knowledge.attributes
364
+ @old_knowledge.node.attributes = @knowledge.node.attributes
365
+ @old_knowledge.knowledge_figures = @knowledge.knowledge_figures
366
+ rescue
367
+ raise "Specified knowledge is not found or not yours."
368
+ end
369
+ end
370
+
371
+ # * about groups
372
+ if (!params[:groups] || params[:commit] == add_a_comment_button_message)
373
+ @groups = ['everyone']
374
+ else
375
+ # raise "Check at least 1 group to visible!\n" unless params[:groups]
376
+ @groups = params[:groups].values # Hash to Array
377
+ end
378
+
379
+ if @groups[0] == 'everyone'
380
+ other_mode = 4
381
+ @groups.shift
382
+ else
383
+ other_mode = 0
384
+ end
385
+ @knowledge.other_mode = other_mode
386
+
387
+ # * insert title, textbody(and change for RD-like format)
388
+ # , default_layout, horizontal number of figures
389
+ # , height/width, %/px, and size(number).
390
+ horizontal_figures = params[:knowledge]["horizontal_figures"] || 1
391
+ figures_size_status = params[:knowledge]["height_or_width"] == "width" ? 1 : 0
392
+ figures_size_status += 2 if params[:knowledge]["percent_or_pixel"] == "pixel"
393
+ figures_size_number = params[:knowledge]["figures_size_number"] || 100
394
+
395
+ if params[:commit] == add_a_comment_button_message
396
+ # for creating comment, insert knowledge.id to "comment_on"
397
+ if (knowledge = Knowledge.find(:first, :conditions => ["path=?", params[:path]], :user => @user))
398
+ @knowledge.attributes = {"comment_on" => knowledge.node_id}
399
+ end
400
+ # for creating comment, determine "comment_number"
401
+ @knowledge.attributes = {"comment_number" => params[:knowledge]["comment_number"]}
402
+ end
403
+
404
+ @knowledge.attributes = {
405
+ "category" => params[:knowledge]["category"],
406
+ "title" => params[:knowledge]["title"],
407
+ "creator" => params[:knowledge]["creator"],
408
+ "textbody" => params[:knowledge]["textbody"],
409
+ "description" => params[:knowledge]["description"],
410
+ "default_layout" => params[:knowledge]["default_layout"] || 0,
411
+ "horizontal_figures" => horizontal_figures,
412
+ "figures_size_status" => figures_size_status,
413
+ "figures_size_number" => figures_size_number
414
+ }
415
+
416
+ # === nodes table
417
+ # * insert name, path, owner for knowledge.node
418
+
419
+ # * �㏑�����ɂ́A���̃p�X��p����
420
+ # * ����ȊO�̎��́A���͂��ꂽ�p�X��p����
421
+ if params[:commit] == "Save"
422
+ begin
423
+ @knowledge.path = params[:original_path]
424
+ rescue
425
+ flash[:notice] = "Unknown error. The path of original knowledge document doesn't exists."
426
+ redirect_to :action => 'list'
427
+ end
428
+ else
429
+ if params[:node]["path"] && params[:node]["path"] != ""
430
+ filename = params[:node]["path"] + ".knlge"
431
+ elsif params[:original_path]
432
+ filename = params[:original_path] + ".knlge"
433
+ else
434
+ filename = ".knlge"
435
+ end
436
+
437
+ if @user.super_user
438
+ @knowledge.path = "/" + filename
439
+ else
440
+ @knowledge.path = "/usr/"+ Knowledge.remove_scheme(@user) + "/knowledge/" + filename
441
+ end
442
+ end
443
+
444
+ @knowledge.name = File.basename(@knowledge.path)
445
+
446
+ # �㏑���ۑ����A���Ƃ����̃��[�U�ƕʂ̃��[�U(�X�[�p�[���[�U�Ȃ�)�������������Ƃ��Ă��Aowner�͕ύX���Ȃ�
447
+ @knowledge.owner = @user unless params[:commit] == "Save"
448
+
449
+ @knowledge.node.set_rgroups(@groups) if @groups.length > 0
450
+
451
+ # if none, make directory.
452
+ # * path in the disc
453
+ FileUtils.makedirs(File.dirname(@knowledge.fname)) or raise("failed to makedir")
454
+ # * path in gfdnavi
455
+ make_directories(@knowledge, @user, @groups, other_mode)
456
+
457
+ # === knowledge_figures table
458
+ # if "Save", at first keep original knowledge_figures and keyword attributes
459
+ # that are already in the database. (delete them later.)
460
+ if params[:commit]=="Save"
461
+ old_knowledge_figures = KnowledgeFigure.find(:all, :conditions => ["knowledge_id = ?", params[:id]])
462
+ old_keyword_attributes = KeywordAttribute.find(:all, :conditions => ["node_id = ?", @knowledge.node])
463
+ end
464
+
465
+ # params�œn���ꂽ�G��Array(knowledge_figures)�Ɋi�[
466
+ knowledge_figures = Array.new
467
+ if params[:knowledge_figure]
468
+ params[:knowledge_figure].sort {|a, b| a[0].to_i <=> b[0].to_i}.each do |key, value| # �G�̏��Ԃ𐳂����\�[�g
469
+ figure_path = value["figure_path"]
470
+ if figure_path && figure_path != ""
471
+ unless img = Image.find(:first, :conditions => ["path=?", figure_path + ".png"], :user => @user)
472
+ raise "Image file #{figure_path} is not found."
473
+ end
474
+ knowledge_figure = KnowledgeFigure.new(:caption => value["figure_caption"], :image_id => img.node_id)
475
+ knowledge_figure.knowledge = @knowledge
476
+ knowledge_figures.push(knowledge_figure)
477
+ end
478
+ end
479
+ end
480
+
481
+ # �ۑ����悤�Ƃ��Ă���knowledge�I�u�W�F�N�g�ɊG���֘A�t����
482
+ @knowledge.knowledge_figures = knowledge_figures
483
+
484
+ # �����p�ɁAtitle �� textbody �� author(creator) �� category �� keyword_attributes �ɓ����B
485
+ @knowledge.keyword_attributes.build(:name => "title", :value => params[:knowledge]["title"])
486
+ @knowledge.keyword_attributes.build(:name => "textbody", :value => params[:knowledge]["textbody"])
487
+ @knowledge.keyword_attributes.build(:name => "description", :value => params[:knowledge]["description"])
488
+ @knowledge.keyword_attributes.build(:name => "creator", :value => params[:knowledge]["creator"])
489
+ @knowledge.keyword_attributes.build(:name => "category", :value => params[:knowledge]["category"])
490
+
491
+ # �X�V���Amtime���㏑��
492
+ @knowledge.mtime = Time.new unless params[:commit] == "Create"
493
+
494
+ # * �ꎞ�ۑ��Ȃ�o�b�N�A�b�v�̂ݕۑ�
495
+ # * �㏑���ۑ��Ȃ�{�̂ƃo�b�N�A�b�v�̗�����ۑ�
496
+ # * ���̂ق��̏ꍇ�͖{�̂̂ݕۑ�
497
+ if params[:commit] == "Temporary Save"
498
+ create_backup
499
+ @type = params[:type]
500
+ @knowledge = Knowledge.find(params[:document_id], :user => @user) if @type == "edit"
501
+ render :partial => "backup"
502
+ else
503
+ # �m�������� save
504
+ unless @knowledge.save
505
+ if params[:knowledge]["title"] == ""
506
+ flash[:notice] = "Title is empty. Failed to save."
507
+ redirect_to :action => "list"
508
+ else
509
+ flash[:notice] = "Failed to save."
510
+ redirect_to :action => 'list'
511
+ end
512
+ else
513
+ # === �����̏ꍇ�B
514
+ # Create, Save, Save As, new_from_analysis, comment
515
+
516
+ # temporary backup������
517
+ temporary_backups = KnowledgeBackup.find(:all, :conditions => ["backup_on=? AND temporary", @knowledge.path])
518
+ temporary_backups.each do |tb|
519
+ tb.destroy
520
+ end
521
+
522
+ # ���b�Z�[�W���o��
523
+ if params[:commit] == add_a_comment_button_message
524
+ flash[:notice] = "A comment is successfully saved."
525
+ else
526
+ flash[:notice] = "A knowledge document is successfully saved."
527
+ end
528
+
529
+ # �㏑���ۑ��̂Ƃ��A�o�b�N�A�b�v��ʃe�[�u���ɕۑ����Ă���
530
+ if params[:commit] == "Save"
531
+ create_backup
532
+ end
533
+
534
+ # + node_relations table
535
+ # * �摜���琔�l�f�[�^�ւƒH��Anode_relations�e�[�u����
536
+ # �m������ -> ���l�f�[�^�ւ̊֌W���i�[����
537
+ # * knowledge��node_id���K�v�Ȃ̂ŁA�ۑ���ł���K�v������B
538
+ # ++ Save �̂Ƃ��̂݁A�O�� node_relations ������
539
+ if params[:commit] == "Save"
540
+ old_node_relations = NodeRelation.find(:all, :conditions => ["name=? AND referenced_by=?", "based_on", @knowledge.node_id])
541
+ old_node_relations.each do |relation|
542
+ relation.destroy
543
+ end
544
+ end
545
+ # ++ node_relations �e�[�u���Ɋ֌W���L�^����
546
+ begin
547
+ variable_paths = Array.new
548
+ knowledge_figures.each do |figure|
549
+ image = Image.find(figure.image_id, :user => @user)
550
+ vizshot_yaml = image.vizshot
551
+ vizshot = YAML.load(vizshot_yaml)
552
+ analysis = Analysis.from_vizshot(vizshot)
553
+
554
+ analysis.attributes["variables"].each do |variable|
555
+ node_of_variable = Node.find(variable.node_id)
556
+ node_relation = NodeRelation.new
557
+ node_relation.attributes = {:reference => node_of_variable, :referenced_by => @knowledge.node, :name => "based_on"}
558
+ variable_paths.push(variable.path)
559
+ node_relation.save
560
+ end
561
+ end
562
+ rescue
563
+ flash[:notice] = "Unknown error is occurred when NodeRelation objects are created."
564
+ end
565
+
566
+ if variable_paths.length > 0
567
+ node_relation_hash = {"reference" => []}
568
+ variable_paths.uniq.each do |vpath|
569
+ node_relation_hash["reference"].push({"name" => "based_on", "path" => vpath})
570
+ end
571
+ end
572
+
573
+ # If "Save", delete original knowledge_figures.
574
+ if params[:commit] == "Save"
575
+ old_knowledge_figures.each do |old_knowledge_figure|
576
+ old_knowledge_figure.destroy
577
+ end
578
+ old_keyword_attributes.each do |old_keyword_attribute|
579
+ old_keyword_attribute.destroy
580
+ end
581
+ end
582
+
583
+ # == .knlge �t�@�C���쐬
584
+ # * knowledge �e�[�u���̗v�f
585
+ if (comment_on = @knowledge.comment_on && Knowledge.find(@knowledge.comment_on, :user => @user))
586
+ comment_on_path = comment_on.path
587
+ else
588
+ comment_on_path = nil
589
+ end
590
+
591
+ knowledge_hash = {
592
+ "gfdnavi_knowledge" =>
593
+ {
594
+ "title" => @knowledge.title,
595
+ "creator" => @knowledge.creator,
596
+ "category" => @knowledge.category,
597
+ "textbody" => @knowledge.textbody,
598
+ "description" => @knowledge.description,
599
+ "default_layout" => @knowledge.default_layout,
600
+ "horizontal_figures"=> @knowledge.horizontal_figures,
601
+ "knowledge_figures" => [],
602
+ "owner" => @knowledge.owner.login,
603
+ "figures_size_status" => @knowledge.figures_size_status,
604
+ "figures_size_number" => @knowledge.figures_size_number,
605
+ "comment_on" => comment_on_path,
606
+ "comment_number" => @knowledge.comment_number,
607
+ "rgroups" => @groups,
608
+ "other_mode" => @knowledge.other_mode
609
+ }}
610
+ # * knowledge_figures �e�[�u���̗v�f
611
+ @knowledge.knowledge_figures.length.times do |i|
612
+ image_id = @knowledge.knowledge_figures[i].image_id
613
+ image_path = Image.find(image_id, :user => @user).path
614
+ knowledge_hash["gfdnavi_knowledge"]["knowledge_figures"].push({"image_path" => image_path, "caption" => @knowledge.knowledge_figures[i].caption})
615
+ end
616
+
617
+ # * node_relation �e�[�u���̗v�f
618
+ knowledge_hash["gfdnavi_knowledge"].merge!(node_relation_hash) if node_relation_hash
619
+
620
+ # * .knlge�t�@�C���ւ̏�������
621
+ File.open(@knowledge.fname,"w"){|file| file.print knowledge_hash.to_yaml}
622
+
623
+ # * �R�����g�Ȃ�A���̃h�L�������g�� redirect
624
+ if params[:commit] == add_a_comment_button_message
625
+ @knowledge, @knowledge_figures, @comments, @image_paths, @image_widths, @image_heights, @caption_widths, @caption_heights = Knowledge.read_parameters_of_knowledge_document(params[:path], @user)
626
+ @num_of_figure = 1 # �R�����g���e�����o���������Ƃ��ɕK�v
627
+ @displayed_knowledge = @knowledge
628
+ render :partial => 'comments'
629
+ else
630
+ redirect_to :action => 'show', :path => @knowledge.path
631
+ end
632
+ end
633
+ end
634
+ end
635
+
636
+ # == Save backup of knowledge, knowledge figures.
637
+ # params[commit]�� "Save" �� "Temporary Save" �̂Ƃ��ɌĂ΂��B
638
+ def create_backup
639
+ # === search backups of knowledge.
640
+ if params[:commit] == "Temporary Save"
641
+ saved_backup = @knowledge
642
+ new_version_number = 0
643
+ else
644
+ saved_backup = @old_knowledge
645
+ backups = KnowledgeBackup.find(:all, :conditions => ["backup_on=?", @knowledge.path])
646
+ if backups.length > 0
647
+ backups.collect! {|backup|
648
+ backup = backup.version_number
649
+ }
650
+ new_version_number = backups.max + 1
651
+ else
652
+ new_version_number = 1
653
+ end
654
+ end
655
+
656
+ # === knowledge_backups Table.
657
+ knowledge_backup = KnowledgeBackup.new
658
+ knowledge_backup.attributes = {
659
+ "title" => saved_backup.title,
660
+ "creator" => saved_backup.creator,
661
+ "textbody" => saved_backup.textbody,
662
+ "description" => saved_backup.description,
663
+ "default_layout" => saved_backup.default_layout || 0,
664
+ "horizontal_figures" => saved_backup.horizontal_figures,
665
+ "figures_size_status" => saved_backup.figures_size_status,
666
+ "figures_size_number" => saved_backup.figures_size_number,
667
+ "comment_on" => saved_backup.comment_on,
668
+ "comment_number" => saved_backup.comment_number,
669
+ "mtime" => saved_backup.mtime,
670
+ "backup_on" => saved_backup.path,
671
+ "version_number" => new_version_number,
672
+ "temporary" => (params[:commit]=="Temporary Save"),
673
+ "owner_id" => @user.id,
674
+ "rgroups" => @groups,
675
+ "other_mode" => saved_backup.other_mode
676
+ }
677
+
678
+ @knowledge.id = params[:original_id] if params[:commit] == "Temporary Save"
679
+ knowledge_backup.temporary = (params[:commit] == "Temporary Save")
680
+ knowledge_backup.backup_on = @knowledge.path || "temporarily_backup"
681
+
682
+ # === knowledge_figure_backups Table.
683
+ knowledge_figure_backups = Array.new
684
+ if params[:knowledge_figure]
685
+ params[:knowledge_figure].sort {|a, b| a[0].to_i <=> b[0].to_i}.each do |key, value| # �G�̏��Ԃ𐳂����\�[�g
686
+ if value["figure_path"] && value["figure_path"] != ""
687
+ unless img = Image.find(:first, :conditions => ["path=?", value["figure_path"] + ".png"], :user => @user)
688
+ raise "Image file #{figure_path} is not found."
689
+ end
690
+ knowledge_figure_backup = KnowledgeFigureBackup.new(:caption => value["figure_caption"], :image_id => img.node_id)
691
+ knowledge_figure_backup.knowledge_backup = knowledge_backup
692
+ knowledge_figure_backups.push(knowledge_figure_backup)
693
+ elsif value["diagram_path"] && value["diagram_path"] != ""
694
+ knowledge_figure_backup = KnowledgeFigureBackup.new(:caption => value["figure_caption"])
695
+ knowledge_figure_backup.knowledge_backup = knowledge_backup
696
+ knowledge_figure_backups.push(knowledge_figure_backup)
697
+ end
698
+ end
699
+ end
700
+ knowledge_backup.knowledge_figure_backups = knowledge_figure_backups
701
+ unless knowledge_backup.save
702
+ flash[:notice] = "The backup failed to save."
703
+ end
704
+
705
+ # create ".knlge" file for backup.
706
+ # * knowledge_backups Table.
707
+ knowledge_backup_hash = {
708
+ "gfdnavi_knowledge" =>
709
+ {
710
+ "title" => saved_backup.title,
711
+ "creator" => saved_backup.creator,
712
+ "category" => saved_backup.category,
713
+ "textbody" => saved_backup.textbody,
714
+ "description" => saved_backup.description,
715
+ "default_layout" => saved_backup.default_layout,
716
+ "horizontal_figures"=> saved_backup.horizontal_figures,
717
+ "knowledge_figures" => [],
718
+ "owner" => saved_backup.owner.login,
719
+ "figures_size_status" => saved_backup.figures_size_status,
720
+ "figures_size_number" => saved_backup.figures_size_number,
721
+ "comment_on" => saved_backup.comment_on,
722
+ "comment_number" => saved_backup.comment_number,
723
+ "backup_on" => saved_backup.path,
724
+ "version_number" => new_version_number,
725
+ "temporary" => (params[:commit]=="Temporary Save"),
726
+ "rgroups" => @groups,
727
+ "other_mode" => saved_backup.other_mode
728
+ }}
729
+ # * knowledge_figure_backups Table
730
+ saved_backup.knowledge_figures.length.times do |i|
731
+ image_id = saved_backup.knowledge_figures[i].image_id
732
+ image_path = Image.find(image_id, :user => @user).path
733
+ knowledge_backup_hash["gfdnavi_knowledge"]["knowledge_figures"].push({"image_path" => image_path, "caption" => @knowledge.knowledge_figures[i].caption})
734
+ end
735
+
736
+ # �o�[�W�����‚��̃o�b�N�A�b�v�́A.knlge�t�@�C���Ƃ��ĕۑ�����
737
+ unless params[:commit]=="Temporary Save"
738
+ File.open(saved_backup.fname[0..-7] + "." + new_version_number.to_s + ".knlge","w"){|file| file.print knowledge_backup_hash.to_yaml}
739
+ end
740
+ end
741
+
742
+ # == �m���������f�[�^�x�[�X�ƃf�B�X�N�����������
743
+ def destroy
744
+ @user = (login=session[:user]) && User.find_by_login(login)
745
+ knowledge = Knowledge.find(:first, :conditions => ["path=?", params[:path]], :user => @user)
746
+
747
+ # �֘A����R�����g�̃f�[�^�x�[�X����̏���
748
+ comments = Knowledge.find(:all, :conditions => ["comment_on=?", knowledge.node_id])
749
+ comments.each do |comment|
750
+ comment.destroy
751
+ end
752
+
753
+ # node_relations �e�[�u������̊֌W�̏���
754
+ node_relations = NodeRelation.find(:all, :conditions => ["name=? AND referenced_by=?", "based_on", knowledge.node_id])
755
+ node_relations.each do |nr|
756
+ nr.destroy
757
+ end
758
+
759
+ # �f�B�X�N���� .knlge �t�@�C��������
760
+ File.delete(knowledge. fname)
761
+
762
+ # �f�[�^�x�[�X����̏���
763
+ knowledge.destroy
764
+
765
+ if knowledge.comment_on
766
+ # �R�����g���폜����ꍇ
767
+ @knowledge, @knowledge_figures, @comments, @image_paths, @image_widths, @image_heights, @caption_widths, @caption_heights = Knowledge.read_parameters_of_knowledge_document(params[:parent_path], @user)
768
+ @displayed_knowledge = @knowledge
769
+ render :partial => 'comments'
770
+ else
771
+ # �R�����g�łȂ��A���ʂ̒m���������폜����ꍇ
772
+ redirect_to :action => 'list'
773
+ end
774
+ end
775
+
776
+ def destroy_backup
777
+ @user = (login=session[:user]) && User.find_by_login(login)
778
+ @type = params[:type]
779
+ @knowledge = Knowledge.find(params[:document_id], :user => @user) if @type == "edit"
780
+
781
+ @knowledge_backup = KnowledgeBackup.find(params[:backup_id])
782
+ knowledge_figure_backup = KnowledgeFigureBackup.new
783
+
784
+ # .knlge�t�@�C���̏���
785
+ # File.delete(@knowledge.fname)
786
+
787
+ # �f�[�^�x�[�X����̏���
788
+ flash[:notice] = "A backup file is failed to delete." unless @knowledge_backup.destroy
789
+
790
+ render :partial => "backup"
791
+ end
792
+
793
+
794
+ # == show.rhtml�̉����ɃR�����g�쐬�p�̃t�H�[�����o��������
795
+ def appear_comment_input_form
796
+ # �o������t�H�[���� partial �Ŗ��ߍ��܂�Ă���̂ŁA
797
+ # �񃍃O�C�����A before_filter :login_required ���g�킸��
798
+ # ���O�C����͈�U index (list.rhtml) �܂Ŗ߂��Ă��炤�B
799
+ unless @user = (login=session[:user]) && User.find_by_login(login)
800
+ redirect_to :controller => "user", :action => "login"
801
+ else
802
+ # �����̕ϐ��͊e�R�����g��\������ۂɏ㏑������Ă��܂��Ă���̂�
803
+ # �����ŁA�R�����g�̂‚���ꂽ�A���̃h�L�������g�̒l���Ăё�����Ă����B
804
+ @knowledge, @knowledge_figures, @comments, @image_paths, @image_widths, @image_heights, @caption_widths, @caption_heights = Knowledge.read_parameters_of_knowledge_document(params[:path], @user)
805
+ @num_of_figure = 1
806
+ @type = "comment"
807
+
808
+ # edit�Ɠ��l�A@knowledge �̒��g�����̂܂܃t�H�[���ɓ���B
809
+ # �������A�R�����g�̏ꍇ�͂��̂܂ܓ����Ă͍���̂ŁA�����ʼn��H���Ă����B
810
+ new_comment_number = @comments.collect{|comment| comment.comment_number}.max || 0 + 1
811
+ @knowledge.title = "Re[#{new_comment_number}]:"+ @knowledge.title
812
+ @knowledge.creator = @user.full_name
813
+ @knowledge.textbody = ""
814
+ @knowledge.description = ""
815
+ render :partial => "comment_input_form"
816
+ end
817
+ end
818
+
819
+ # == �m���h�L�������g�쐬�t�H�[�����́A�O���[�v�̉Ž����̓��͕����� knowledge �e�[�u�����珑���߂��B
820
+ def restore_group_form
821
+ @user = (login=session[:user]) && User.find_by_login(login)
822
+ @groups = @user.belonging_groups
823
+ render :partial => "group_form"
824
+ end
825
+
826
+ # == �m���h�L�������g�쐬�t�H�[�����́A�}�̓��͕����� knowledge_figure_backups �e�[�u�����珑���߂��B
827
+ def restore_knowledge_figure_form
828
+ @type = params[:type]
829
+ @user = (login=session[:user]) && User.find_by_login(login)
830
+ @groups = @user.belonging_groups
831
+
832
+ # list.rhtml -> edit.rhtml (Click "Edit".)
833
+ @knowledge = KnowledgeBackup.find(params[:id])
834
+ @figure_captions = Array.new
835
+ @figure_paths = Array.new
836
+
837
+ knowledge_figures = @knowledge.knowledge_figure_backups
838
+ knowledge_figures.each do |kf|
839
+ @figure_captions << kf.caption
840
+ if (img = Image.find(kf.image_id, :user => @user))
841
+ # �ꎞ�ۑ��̂Ƃ��́A����image_id��null�ɂȂ�B
842
+ @figure_paths << img.node.path
843
+ else
844
+ @figure_paths << kf.temporarily_image_path
845
+ end
846
+ end
847
+
848
+ @num_of_figure = @knowledge.knowledge_figure_backups.length
849
+ render :partial => "knowledge_figure_form"
850
+ end
851
+
852
+ # == ���݂���J�e�S���[�̃��X�g�����o��
853
+ def category_search
854
+ @categories = Array.new
855
+ Knowledge.find(:all, :group => "category", :conditions => ['category LIKE ?', params[:keyword] + '%'], :order => "category").each do |knowledge|
856
+ @categories << knowledge.category
857
+ end
858
+
859
+ render :partial => 'category_table'
860
+ end
861
+
862
+ # /view/knowledge/_layout_figure.rhtml �Ŏg�p
863
+ def fig2analysis
864
+ user = (login=session[:user]) && User.find_by_login(login)
865
+ vizshot_yaml = Image.find(params[:image_id], :user => user).vizshot
866
+ vizshot = YAML.load(vizshot_yaml)
867
+
868
+ analysis = Analysis.from_vizshot(vizshot)
869
+
870
+ session[:analysis] = analysis
871
+ variable = Array.new
872
+ variable = [analysis.attributes["variables"], Node.find(analysis.attributes["variables"][0].attributes["node_id"], :user => user).path]
873
+ session[:variables_list] = variable
874
+
875
+ redirect_to :controller => "analysis", :action => "index"
876
+ end
877
+
878
+ private
879
+ def make_directories(obj, user, groups, other_mode)
880
+ full_path = ""
881
+ parent = nil
882
+
883
+ obj.path.split(File::Separator)[0..-2].each{|dname|
884
+ full_path = File.join(full_path, dname)
885
+ dir = Directory.find(:first, :conditions=>["path=?",full_path], :user=>user)
886
+ unless dir
887
+ dir = Directory.new
888
+ dir.name = dname
889
+ dir.path = full_path
890
+ dir.parent = parent.node
891
+ dir.owner = user
892
+ dir.other_mode = other_mode
893
+ dir.node.set_rgroups(groups) if groups.length > 0
894
+ if full_path == obj.file
895
+ dir.downloadable = obj.downloadable?
896
+ dir.plain_file = true
897
+ end
898
+ dir.save!
899
+ end
900
+ parent = dir
901
+ }
902
+ end
903
+
904
+ # == ���͂��ꂽ�p�X�����������ǂ����𒲂ׂ�
905
+ # // �Ȃǂ����������ׂ�B
906
+ def check_path(path)
907
+ case path
908
+ when /\.\.\//
909
+ flash[:notice] = '"../" cannot be used in path.'
910
+ return "path_error."
911
+ when /^\s*$/
912
+ flash[:notice] = 'Path cannot be empty.'
913
+ return "path_error."
914
+ when /^\s*\//, /\/\s*$/, /\/\s*\//
915
+ flash[:notice] = "Directory that doesn't have name is forbidden."
916
+ return "path_error."
917
+ when /\_comment\_/
918
+ flash[:notice] = "\"_comment_\" is forbidden string."
919
+ return "path_error."
920
+ when /\.\d\.$/
921
+ flash[:notice] = "\".number.knlge\" is forbidden string."
922
+ return "path_error."
923
+ end
924
+ end
925
+
926
+ end
927
+
928
+