appswarm 0.0.1

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 (305) hide show
  1. data/.autotest +124 -0
  2. data/History.txt +7 -0
  3. data/Manifest.txt +304 -0
  4. data/README.txt +373 -0
  5. data/Rakefile +153 -0
  6. data/TODO +7 -0
  7. data/apps/README.txt +17 -0
  8. data/apps/admin/admin.rb +79 -0
  9. data/apps/admin/controllers/admin.rb +81 -0
  10. data/apps/admin/controllers/settings.rb +63 -0
  11. data/apps/admin/controllers/users.rb +3 -0
  12. data/apps/admin/features/access.feature +21 -0
  13. data/apps/admin/features/mountLocal.feature +12 -0
  14. data/apps/admin/features/settings.feature +68 -0
  15. data/apps/admin/features/startApps.feature +27 -0
  16. data/apps/admin/layouts/main.rhtml +10 -0
  17. data/apps/admin/lib/settings.rb +52 -0
  18. data/apps/admin/static/admin.css +23 -0
  19. data/apps/admin/views/_log.rhtml +21 -0
  20. data/apps/admin/views/index.rhtml +43 -0
  21. data/apps/admin/views/info.rhtml +7 -0
  22. data/apps/admin/views/settings.rhtml +9 -0
  23. data/apps/admin/views/settings/_http_app.rhtml +15 -0
  24. data/apps/admin/views/settings/_web_server.rhtml +32 -0
  25. data/apps/admin/views/settings/index.rhtml +3 -0
  26. data/apps/admin/views/users/index.rhtml +6 -0
  27. data/apps/application_provider/application_provider.rb +11 -0
  28. data/apps/blog/blog.rb +27 -0
  29. data/apps/blog/controllers/blog.rb +29 -0
  30. data/apps/blog/views/index.rhtml +27 -0
  31. data/apps/browser_starter/browser_starter.rb +32 -0
  32. data/apps/crypto/crypto.rb +47 -0
  33. data/apps/crypto/crypto_rsa.rb +102 -0
  34. data/apps/crypto/spec/crypto_spec.rb +10 -0
  35. data/apps/directory_service/directory_service.rb +107 -0
  36. data/apps/directory_service/net_application.rb +92 -0
  37. data/apps/directory_service/spec/directory_service_spec.rb +36 -0
  38. data/apps/directory_service/spec/net_application_spec.rb +3 -0
  39. data/apps/global_application_interface/global_application.rb +52 -0
  40. data/apps/global_application_interface/global_application_interface.rb +84 -0
  41. data/apps/global_application_interface/spec/app_api_spec.rb +5 -0
  42. data/apps/global_tuple_space/global_tuple_space.rb +27 -0
  43. data/apps/global_web_proxy/features/session_handling.feature +7 -0
  44. data/apps/global_web_proxy/global_web_proxy.rb +221 -0
  45. data/apps/global_web_proxy/proxy/HTTPProxyServer-Dateien/rdoc-style.css +208 -0
  46. data/apps/global_web_proxy/proxy/HTTPProxyServer.html +566 -0
  47. data/apps/global_web_proxy/proxy/dnstest.rb +30 -0
  48. data/apps/global_web_proxy/proxy/proxy.rb +86 -0
  49. data/apps/global_web_proxy/proxy/wiki.html +267 -0
  50. data/apps/global_web_proxy/proxy/wiki.rb +115 -0
  51. data/apps/global_web_proxy/spec/res1 +112 -0
  52. data/apps/global_web_proxy/spec/res2 +125 -0
  53. data/apps/global_web_proxy/spec/web_proxy_spec.rb +88 -0
  54. data/apps/global_web_server/global_web_server.rb +120 -0
  55. data/apps/global_web_server/global_web_servlet.rb +6 -0
  56. data/apps/hello_world/controllers/hello_world.rb +11 -0
  57. data/apps/hello_world/features/show_on_local_web_server.feature +44 -0
  58. data/apps/hello_world/features/starting_apps.feature +6 -0
  59. data/apps/hello_world/features/through_global.feature +12 -0
  60. data/apps/hello_world/hello_world.rb +3 -0
  61. data/apps/hello_world/views/get.rhtml +10 -0
  62. data/apps/hello_world/views/index.rhtml +9 -0
  63. data/apps/hello_world/views/post.rhtml +10 -0
  64. data/apps/home/controllers/home.rb +11 -0
  65. data/apps/home/home.rb +12 -0
  66. data/apps/home/layouts/main.rhtml +16 -0
  67. data/apps/home/static/Zeichnung.svg +240 -0
  68. data/apps/home/static/home.css +134 -0
  69. data/apps/home/static/menu.css +99 -0
  70. data/apps/home/views/_appInfo.rhtml +22 -0
  71. data/apps/home/views/_dummy_fill.rhtml +3 -0
  72. data/apps/home/views/_info.rhtml +6 -0
  73. data/apps/home/views/_menu.rhtml +17 -0
  74. data/apps/home/views/index.rhtml +4 -0
  75. data/apps/home/views/overview.rhtml +2 -0
  76. data/apps/local_chunk_store/chunk_store.rb +15 -0
  77. data/apps/local_chunk_store/local_chunk_store.rb +123 -0
  78. data/apps/local_chunk_store/spec/local_chunk_store_spec.rb +30 -0
  79. data/apps/local_file_store/app_configuration.rb +78 -0
  80. data/apps/local_file_store/app_file_store.rb +32 -0
  81. data/apps/local_file_store/cached_file_store.rb +94 -0
  82. data/apps/local_file_store/features/testbed_handling_of_directories.feature +20 -0
  83. data/apps/local_file_store/local_file_store.rb +47 -0
  84. data/apps/local_file_store/spec/app_configuration_spec.rb +30 -0
  85. data/apps/local_file_store/spec/local_file_store_spec.rb +54 -0
  86. data/apps/local_object_storage/lib/cell.rb +29 -0
  87. data/apps/local_object_storage/lib/cellmgr.rb +57 -0
  88. data/apps/local_object_storage/lib/index.rb +43 -0
  89. data/apps/local_object_storage/lib/marshal.rb +96 -0
  90. data/apps/local_object_storage/lib/pagefile.rb +6 -0
  91. data/apps/local_object_storage/lib/persistent_object.rb +126 -0
  92. data/apps/local_object_storage/local_object_storage.rb +148 -0
  93. data/apps/local_object_storage/spec/local_object_storage_spec.rb +123 -0
  94. data/apps/local_secure_file_store/local_secure_file_store.rb +64 -0
  95. data/apps/local_secure_file_store/spec/local_secure_file_store_spec.rb +23 -0
  96. data/apps/local_tuple_space/local_tuple_space.rb +92 -0
  97. data/apps/local_tuple_space/spec/tuple_space_spec.rb +25 -0
  98. data/apps/local_web_server/features/parsing_args.feature +18 -0
  99. data/apps/local_web_server/local_web_server.rb +166 -0
  100. data/apps/logger/logger.rb +27 -0
  101. data/apps/master/master.rb +46 -0
  102. data/apps/master/spec/master_spec.rb +31 -0
  103. data/apps/my_spec_spec.rb +15 -0
  104. data/apps/name_service/name_service.rb +75 -0
  105. data/apps/name_service/spec/name_service_spec.rb +51 -0
  106. data/apps/network_discovery/network_discovery.rb +45 -0
  107. data/apps/network_discovery_localstore/network_discovery_localstore.rb +20 -0
  108. data/apps/network_discovery_udp/network_discovery_udp.rb +51 -0
  109. data/apps/network_lookup/network_lookup.rb +61 -0
  110. data/apps/network_node/abstract_node.rb +104 -0
  111. data/apps/network_node/drb_node.rb +90 -0
  112. data/apps/network_node/network_app.rb +9 -0
  113. data/apps/network_node/network_node.rb +471 -0
  114. data/apps/network_node/remote_service.rb +45 -0
  115. data/apps/network_node/secure_node.rb +125 -0
  116. data/apps/network_node/spec/drb_spec.rb +41 -0
  117. data/apps/network_node/spec/network_node_spec_not.rb +264 -0
  118. data/apps/new_network_node/new_network_node.rb +427 -0
  119. data/apps/new_network_node/spec/new_network_node_spec.rb +186 -0
  120. data/apps/node_broadcast/node_broadcast.rb +167 -0
  121. data/apps/node_broadcast/spec/node_broadcast_spec.rb +59 -0
  122. data/apps/permaspace/permaspace.rb +47 -0
  123. data/apps/plaindb/lib/btree.rb +38 -0
  124. data/apps/plaindb/plaindb.rb +199 -0
  125. data/apps/plaindb/spec/table_write_spec.rb +36 -0
  126. data/apps/routed_network/routed_network.rb +23 -0
  127. data/apps/routed_network/spec/routed_network_spec.rb +17 -0
  128. data/apps/session_manager/session_manager.rb +18 -0
  129. data/apps/spec_output.html +222 -0
  130. data/apps/todo/controllers/todo.rb +87 -0
  131. data/apps/todo/model/comment.rb +10 -0
  132. data/apps/todo/model/project.rb +20 -0
  133. data/apps/todo/model/todo.rb +16 -0
  134. data/apps/todo/model/user.rb +5 -0
  135. data/apps/todo/todo.rb +21 -0
  136. data/apps/todo/views/_commentList.rhtml +7 -0
  137. data/apps/todo/views/_createProject.rhtml +5 -0
  138. data/apps/todo/views/_partList.rhtml +12 -0
  139. data/apps/todo/views/_projectList.rhtml +16 -0
  140. data/apps/todo/views/edit.rhtml +11 -0
  141. data/apps/todo/views/editPart.rhtml +10 -0
  142. data/apps/todo/views/index.rhtml +2 -0
  143. data/apps/todo/views/question.rhtml +4 -0
  144. data/apps/transparent_network/transparent_network.rb +7 -0
  145. data/apps/udp_network/big_transfer.rb +97 -0
  146. data/apps/udp_network/features/information.feature +7 -0
  147. data/apps/udp_network/message_queue.rb +84 -0
  148. data/apps/udp_network/network_interface_api.rb +39 -0
  149. data/apps/udp_network/qos_queue.rb +186 -0
  150. data/apps/udp_network/simple_api.rb +180 -0
  151. data/apps/udp_network/spec/big_transfer_spec.rb +0 -0
  152. data/apps/udp_network/spec/qos_queue_spec.rb +99 -0
  153. data/apps/udp_network/spec/simple_api_spec.rb +35 -0
  154. data/apps/udp_network/spec/udp_network_spec.rb +115 -0
  155. data/apps/udp_network/spec/udp_transceiver_spec.rb +90 -0
  156. data/apps/udp_network/udp_network.rb +196 -0
  157. data/apps/udp_network/udp_transceiver.rb +329 -0
  158. data/apps/wiki/controllers/wiki.rb +56 -0
  159. data/apps/wiki/features/editing.feature +21 -0
  160. data/apps/wiki/layouts/main.rhtml +18 -0
  161. data/apps/wiki/lib/media_wiki_html.rb +35 -0
  162. data/apps/wiki/lib/wikicreole.rb +2147 -0
  163. data/apps/wiki/lib/wikicreole.tt +135 -0
  164. data/apps/wiki/lib/wikitest.rb +158 -0
  165. data/apps/wiki/lib/wikitest.tt +17 -0
  166. data/apps/wiki/model/menu.rb +15 -0
  167. data/apps/wiki/model/page.rb +31 -0
  168. data/apps/wiki/spec/wiki_creole_spec.rb +20 -0
  169. data/apps/wiki/spec/wiki_spec.rb +19 -0
  170. data/apps/wiki/static/Zeichnung.svg +240 -0
  171. data/apps/wiki/static/home.css +134 -0
  172. data/apps/wiki/static/mainMenu.css +32 -0
  173. data/apps/wiki/static/menu.css +99 -0
  174. data/apps/wiki/views/_mainMenu.rhtml +3 -0
  175. data/apps/wiki/views/_menu.rhtml +13 -0
  176. data/apps/wiki/views/edit.rhtml +13 -0
  177. data/apps/wiki/views/index.rhtml +2 -0
  178. data/apps/wiki/views/save.rhtml +1 -0
  179. data/apps/wiki/wiki.rb +17 -0
  180. data/bin/appswarm +47 -0
  181. data/cucumber.yml +2 -0
  182. data/data/PermaspaceApp/AFS_WikiApp_wiki_config +6 -0
  183. data/data/draft.txt +63 -0
  184. data/docs/appswarm_motivation.graffle +0 -0
  185. data/docs/appswarm_pics.graffle/QuickLook/Preview.pdf +0 -0
  186. data/docs/appswarm_pics.graffle/QuickLook/Thumbnail.tiff +0 -0
  187. data/docs/appswarm_pics.graffle/data.plist +63494 -0
  188. data/docs/appswarm_pics.graffle/image1.tiff +0 -0
  189. data/docs/appswarm_pics.graffle/image2.tif +0 -0
  190. data/docs/appswarm_pics.graffle/image3.tif +0 -0
  191. data/docs/appswarm_pics.graffle/image4.tif +0 -0
  192. data/docs/appswarm_pics.graffle/image5.tiff +0 -0
  193. data/docs/routing.graffle +0 -0
  194. data/features/step_definitions/appstart_steps.rb +28 -0
  195. data/features/step_definitions/cluster_steps.rb +18 -0
  196. data/features/step_definitions/testbed_steps.rb +64 -0
  197. data/features/step_definitions/webapp_steps.rb +257 -0
  198. data/features/support/env.rb +7 -0
  199. data/lib/appswarm.rb +127 -0
  200. data/lib/appswarm/README.txt +67 -0
  201. data/lib/appswarm/app_config.rb +19 -0
  202. data/lib/appswarm/application.rb +267 -0
  203. data/lib/appswarm/breaking_mutex.rb +41 -0
  204. data/lib/appswarm/cluster_funcs.rb +157 -0
  205. data/lib/appswarm/cross_spectool.rb +153 -0
  206. data/lib/appswarm/crypt.rb +10 -0
  207. data/lib/appswarm/crypt/crypto.rb +90 -0
  208. data/lib/appswarm/crypt/rsa_key +15 -0
  209. data/lib/appswarm/crypt/rsa_key.pub +5 -0
  210. data/lib/appswarm/crypt/test.rb +27 -0
  211. data/lib/appswarm/dir_tool.rb +41 -0
  212. data/lib/appswarm/event_api.rb +7 -0
  213. data/lib/appswarm/features_helper.rb +44 -0
  214. data/lib/appswarm/global_service.rb +38 -0
  215. data/lib/appswarm/http.rb +1 -0
  216. data/lib/appswarm/http/http_app.rb +257 -0
  217. data/lib/appswarm/http/http_controller.rb +267 -0
  218. data/lib/appswarm/http/http_provider.rb +80 -0
  219. data/lib/appswarm/http/static/favicon.ico +0 -0
  220. data/lib/appswarm/http/static/javascript/._prototype.js +0 -0
  221. data/lib/appswarm/http/static/javascript/prototype.js +2515 -0
  222. data/lib/appswarm/http/webrick_logger.rb +12 -0
  223. data/lib/appswarm/net_service.rb +69 -0
  224. data/lib/appswarm/package.rb +88 -0
  225. data/lib/appswarm/parallel_each.rb +46 -0
  226. data/lib/appswarm/protocols/protocol_dice.rb +25 -0
  227. data/lib/appswarm/proxy_testing.rb +48 -0
  228. data/lib/appswarm/public_api.rb +35 -0
  229. data/lib/appswarm/routing/matrix_math.rb +57 -0
  230. data/lib/appswarm/routing/pca.rb +211 -0
  231. data/lib/appswarm/routing/routetest.rb +85 -0
  232. data/lib/appswarm/routing/routing.rb +326 -0
  233. data/lib/appswarm/routing/spec/nods_spec.rb +23 -0
  234. data/lib/appswarm/routing/spec/pca_spec.rb +27 -0
  235. data/lib/appswarm/routing/spec/routing_spec.rb +91 -0
  236. data/lib/appswarm/secure_con.rb +437 -0
  237. data/lib/appswarm/secure_connection.rb +79 -0
  238. data/lib/appswarm/secure_marshal.rb +137 -0
  239. data/lib/appswarm/service.rb +76 -0
  240. data/lib/appswarm/simple_marshal.rb +96 -0
  241. data/lib/appswarm/simple_marshal_parser.rb +1243 -0
  242. data/lib/appswarm/simple_marshal_parser.tt +158 -0
  243. data/lib/appswarm/spec/application_spec.rb +50 -0
  244. data/lib/appswarm/spec/cluster_spec.rb +2 -0
  245. data/lib/appswarm/spec/hexdist_spec.rb +13 -0
  246. data/lib/appswarm/spec/http_controller_spec.rb +18 -0
  247. data/lib/appswarm/spec/main_spec.rb +6 -0
  248. data/lib/appswarm/spec/parallel_each_spec.rb +30 -0
  249. data/lib/appswarm/spec/secure_connection_spec.rb +108 -0
  250. data/lib/appswarm/spec/secure_marshal_spec.rb +93 -0
  251. data/lib/appswarm/spec/simple_marshal_spec.rb +87 -0
  252. data/lib/appswarm/spec/tools_spec.rb +13 -0
  253. data/lib/appswarm/spec/whiteboard_spec.rb +20 -0
  254. data/lib/appswarm/spec_helper.rb +18 -0
  255. data/lib/appswarm/test_bed.rb +207 -0
  256. data/lib/appswarm/tools.rb +284 -0
  257. data/lib/appswarm/tools/http_tunnel_client.rb +139 -0
  258. data/lib/appswarm/tools/http_tunnel_common.rb +8 -0
  259. data/lib/appswarm/tools/http_tunnel_server.rb +78 -0
  260. data/lib/appswarm/tools/parser/example_data.simple +102 -0
  261. data/lib/appswarm/tools/parser/match_test.rb +14 -0
  262. data/lib/appswarm/tools/parser/parser_lib.rb +165 -0
  263. data/lib/appswarm/tools/parser/parser_test.rb +104 -0
  264. data/lib/appswarm/tools/parser/spec/parser_spec.rb +44 -0
  265. data/lib/appswarm/tools/pipes.rb +95 -0
  266. data/lib/appswarm/tools/spec/tracing_spec.rb +16 -0
  267. data/lib/appswarm/tools/spec/waiting_queue_spec.rb +15 -0
  268. data/lib/appswarm/tools/thread_tool.rb +61 -0
  269. data/lib/appswarm/tools/tracing.rb +84 -0
  270. data/lib/appswarm/tools/treetop_test.rb +20 -0
  271. data/lib/appswarm/tools/treetop_test_grammar.rb +114 -0
  272. data/lib/appswarm/tools/treetop_test_grammar.tt +7 -0
  273. data/lib/appswarm/tools/waiting_prio_queue.rb +47 -0
  274. data/lib/appswarm/tools/waiting_queue.rb +34 -0
  275. data/lib/appswarm/whiteboard.rb +73 -0
  276. data/nettest.rb +50 -0
  277. data/packages/README.txt +1 -0
  278. data/packages/msandbox/data/packages/store/my.txt +1 -0
  279. data/packages/msandbox/interfaces.rb +172 -0
  280. data/packages/msandbox/old/defa.rb +3 -0
  281. data/packages/msandbox/old/test.rb +14 -0
  282. data/packages/msandbox/old/test2.rb +56 -0
  283. data/packages/msandbox/package.rb +67 -0
  284. data/packages/msandbox/packages/store/config.yml +1 -0
  285. data/packages/msandbox/packages/store/main.rb +27 -0
  286. data/packages/msandbox/packages/store/myinclude.rb +7 -0
  287. data/packages/msandbox/packages/store_test/config.yml +1 -0
  288. data/packages/msandbox/packages/store_test/main.rb +9 -0
  289. data/packages/msandbox/server.rb +146 -0
  290. data/packages/msandbox/test.rb +13 -0
  291. data/packages/msandbox/test2.rb +29 -0
  292. data/templates/web/appswarm/controllers/appswarm.rb +41 -0
  293. data/templates/web/appswarm/layouts/main.rhtml +20 -0
  294. data/templates/web/appswarm/models/asmenu.rb +14 -0
  295. data/templates/web/appswarm/models/asuser.rb +30 -0
  296. data/templates/web/appswarm/static/custom.css +15 -0
  297. data/templates/web/appswarm/static/home.css +134 -0
  298. data/templates/web/appswarm/static/mainMenu.css +32 -0
  299. data/templates/web/appswarm/static/menu.css +99 -0
  300. data/templates/web/appswarm/views/_mainMenu.rhtml +5 -0
  301. data/templates/web/appswarm/views/_menu.rhtml +13 -0
  302. data/templates/web/appswarm/views/_userInfo.rhtml +7 -0
  303. data/templates/web/appswarm/views/login.rhtml +9 -0
  304. data/tools/checkPort.rb +11 -0
  305. metadata +379 -0
@@ -0,0 +1,94 @@
1
+ class LocalFileStoreApp
2
+ class CachedFileStore
3
+ CACHE_SIZE=30000
4
+ DEFAULT_WRITE_DELAY=30
5
+
6
+ def initialize(store,writeDelay=nil,cacheSize=nil)
7
+ @writeDelay=writeDelay
8
+ @writeDelay||=DEFAULT_WRITE_DELAY
9
+
10
+ @cacheSize=cacheSize
11
+ @cacheSize||=CACHE_SIZE
12
+
13
+ @store=store
14
+
15
+ @dataCache={}
16
+ @dataAccessTime={}
17
+ @dataWriteTime={}
18
+ @lastWrite=nil
19
+
20
+ @mutex=Mutex.new
21
+ end
22
+ def []=(name,value)
23
+ @mutex.synchronize {
24
+ @dataCache[name]=value
25
+ @dataAccessTime[name]=Time.now
26
+ @dataWriteTime[name]=Time.now
27
+ checkWriteCache
28
+ }
29
+ end
30
+ def [](name)
31
+ @mutex.synchronize {
32
+ unless @dataCache.key?(name)
33
+ @dataCache[name]=@store[name]
34
+ @dataAccessTime[name]=Time.now
35
+ end
36
+ d=@dataCache[name]
37
+ checkWriteCache
38
+ d
39
+ }
40
+ end
41
+
42
+ def rm(name)
43
+ @store.rm(name)
44
+ end
45
+
46
+ def flush
47
+ @mutex.synchronize {
48
+ oldDelay=@writeDela
49
+ @writeDelay=-10000
50
+ checkWriteCache
51
+ @writeDelay=oldDelay
52
+ assert { @dataWriteTime.length==0}
53
+ }
54
+ end
55
+
56
+ private
57
+ def checkWriteCache
58
+ @dataWriteTime.each{|k,v|
59
+ if v<Time.now-@writeDelay
60
+ # write
61
+ @store[k]=@dataCache[k]
62
+ @dataWriteTime.delete(k)
63
+ end
64
+ }
65
+
66
+ checkHoldCache
67
+ end
68
+
69
+ def currentCacheSize
70
+ @dataCache.values.map{|s|s.length}.inject(0){|a,b|a+b}
71
+ end
72
+
73
+ # should only be called when
74
+ def checkHoldCache
75
+ while currentCacheSize>@cacheSize
76
+ # remove least recently accessed
77
+ leastTime=@dataAccessTime.values.min
78
+
79
+ keys=@dataAccessTime.keys.select{|k|@dataAccessTime[k]<=leastTime}
80
+ keys.each{|key|
81
+ unless @dataWriteTime.key?(key)
82
+ removeFromCache(key)
83
+ end
84
+ }
85
+ end
86
+ end
87
+ def removeFromCache(key)
88
+ @dataCache.delete(key)
89
+ @dataAccessTime.delete(key)
90
+ @dataWriteTime.delete(key)
91
+ end
92
+ end
93
+ end
94
+
@@ -0,0 +1,20 @@
1
+ Feature: Testbeds have separate storing directories and thus don't disturb eachothers.
2
+
3
+ Scenario: Serial running of testbeds
4
+ Given a testbed with a "LocalFileStore" application
5
+ And a "HelloWorld" application in it
6
+ When I store a string "hi123" for "HelloWorld" within the "LocalFileStore"
7
+ Then the restored string from the "LocalFileStore" for "HelloWorld" is "hi123"
8
+ When the testbed is stopped
9
+ And a new testbed with a "LocalFileStore" application is started
10
+ And a "HelloWorld" application in it
11
+ Then the restored string from the "LocalFileStore" for "HelloWorld" is not existing
12
+ When the testbed is stopped
13
+
14
+ Scenario: Nothing started
15
+ When the scenario is started
16
+ Then the ".appswarm_testing" directory should be empty
17
+
18
+ Scenario: Parallel running of testbeds
19
+
20
+ Scenario: No running of testbeds
@@ -0,0 +1,47 @@
1
+ class LocalFileStoreApp<Service
2
+ requires :permaspace
3
+ provides :localFileStore
4
+
5
+ def initialize(cluster,ops)
6
+ super(cluster,ops,:localFileStore)
7
+ @api={}
8
+ @cached={}
9
+ @configs={}
10
+ end
11
+
12
+ def stop
13
+ super
14
+ @cached.each{|k,v|v.flush}
15
+ @configs.each{|k,v|v.flush}
16
+ end
17
+
18
+ def config(app)
19
+ key=[app.class,app.getAppName]
20
+ unless @configs.key?(key)
21
+ @configs[key]=AppConfiguration.new(self,key)
22
+ end
23
+ c=@configs[key]
24
+ assert{c}
25
+ c
26
+ end
27
+
28
+ def cached(app,instance,time=nil,chacheSize=nil)
29
+ key=[app,instance]
30
+ unless @cached[key]
31
+ @cached[key]=CachedFileStore.new(api(app,instance),time,chacheSize)
32
+ end
33
+ end
34
+
35
+ def api(app,instance)
36
+ key=[app,instance]
37
+ unless @api[key]
38
+ @api[key]=AppFileStore.new(self,app,instance)
39
+ end
40
+ @api[key]
41
+ end
42
+ end
43
+
44
+ require 'app_file_store.rb'
45
+ require 'cached_file_store.rb'
46
+ require 'app_configuration.rb'
47
+
@@ -0,0 +1,30 @@
1
+ require 'application.rb'
2
+
3
+ describe "App Configuration" do
4
+ it_should_behave_like "AppSwarm Test"
5
+ class TestClass<Application
6
+
7
+ end
8
+ it "should save and restore app configs" do
9
+
10
+ b=TestBed.new
11
+ fs=b.run("LocalFileStore")
12
+ test=TestClass.new(b,{})
13
+ c=fs.config(test)
14
+ c.reset
15
+ ns=c[:nameSpace]
16
+ ns["myName"]="someAddress"
17
+ b.stop
18
+
19
+ b=TestBed.new(:testbedId=>b.testbedId)
20
+ fs=b.run("LocalFileStore")
21
+ sleep 0.4
22
+ test=TestClass.new(b,{})
23
+ c=AppConfiguration.config(test)
24
+ #c=fs.config(test)
25
+ c.elements.should == {:nameSpace=>{"myName"=>"someAddress"}}
26
+
27
+ b.stop
28
+ end
29
+
30
+ end
@@ -0,0 +1,54 @@
1
+ describe "Local File Store" do
2
+ it_should_behave_like "AppSwarm Test"
3
+ it "should store data permanently" do
4
+ b=TestBed.new
5
+ lfs=b.run("LocalFileStore")
6
+ lfsapi=lfs.api("myApp","myInstance")
7
+ lfsapi.rm("testFile")
8
+ lfsapi["testFile"]="testContent"
9
+ b.stop!
10
+ checkThreads("inBetween")
11
+
12
+ b=TestBed.new(:testbedId=>b.testbedId)
13
+ lfs=b.run("LocalFileStore")
14
+ lfsapi=lfs.api("myApp","myInstance")
15
+ lfsapi["testFile"].should == "testContent"
16
+ lfsapi.rm("testFile")
17
+ b.stop!
18
+ sleep 2
19
+ end
20
+ it "should cache data before writing" do
21
+ b=TestBed.new
22
+ lfs=b.run("LocalFileStore")
23
+ lfsapi=lfs.cached("myApp","myInstance")
24
+ lfsapi.rm("testFile")
25
+ lfsapi["testFile"]="testContent"
26
+ lfs.api("myApp","myInstance")["testFile"].should be_nil
27
+ lfsapi["testFile"].should == "testContent"
28
+ b.stop!
29
+ checkThreads("inBetween")
30
+ b=TestBed.new(:testbedId=>b.testbedId)
31
+ lfs=b.run("LocalFileStore")
32
+ lfsapi=lfs.api("myApp","myInstance")
33
+ lfsapi["testFile"].should == "testContent"
34
+ b.stop
35
+ sleep 2
36
+ end
37
+
38
+ it "should cache data in read cache" do
39
+ b=TestBed.new
40
+ lfs=b.run("LocalFileStore")
41
+ lfsapi=lfs.cached("myApp","myInstance")
42
+ lfsapi.rm("testFile")
43
+ lfsapi["testFile"]="testContent"
44
+ lfs.api("myApp","myInstance")["testFile"].should be_nil
45
+ lfsapi.flush
46
+ lfs.api("myApp","myInstance")["testFile"].should == "testContent"
47
+ lfs.api("myApp","myInstance").rm("testFile")
48
+ lfs.api("myApp","myInstance")["testFile"].should be_nil
49
+ lfsapi["testFile"].should == "testContent" # still there
50
+ b.stop
51
+ end
52
+
53
+
54
+ end
@@ -0,0 +1,29 @@
1
+ class Cell
2
+ attr_reader :cellId, :objectId
3
+ def initialize(app,cellId)
4
+ @cellId=cellId
5
+ @app=app
6
+ @data=nil
7
+ @objectId=nil
8
+ tryRead
9
+ end
10
+
11
+ def save(object)
12
+ @objectId=object.objectId
13
+ @data=LocalObjectStorage::Marshal::dump(object)
14
+ saveIntern
15
+ self
16
+ end
17
+
18
+ def load
19
+ LocalObjectStorage::Marshal::load(@data,@app)
20
+ end
21
+
22
+ private
23
+ def saveIntern
24
+ @app.store[@cellId]=@data
25
+ end
26
+ def tryRead
27
+ @data=@app.store[@cellId]
28
+ end
29
+ end
@@ -0,0 +1,57 @@
1
+ require File.expand_path('../cell.rb',__FILE__)
2
+
3
+ class CellMgr
4
+ def initialize(app)
5
+ @app=app
6
+ @cells=[]
7
+ @cellIds=0
8
+
9
+ readCells
10
+ end
11
+ def save(object)
12
+ p=getFreeCell
13
+ p.save(object)
14
+ p.cellId
15
+ end
16
+
17
+ def load(cellId)
18
+ pp "cellID",cellId
19
+ cell=@cells.select{|p|p.cellId==cellId}[0]
20
+
21
+ unless cell
22
+ pp "CELLID",cellId,@cellIds
23
+ if cellId<=@cellIds
24
+ cell=Cell.new(@app,cellId)
25
+ end
26
+ end
27
+ return cell.load if cell
28
+ raise "Cell with id #{cellId} not found!"
29
+ end
30
+
31
+ def saveIntern(cell)
32
+
33
+ end
34
+
35
+ def saveAll
36
+
37
+ end
38
+
39
+ private
40
+ def getFreeCell
41
+ p=Cell.new(@app,getNewCellId)
42
+ @cells << p
43
+ p
44
+ end
45
+
46
+ def readCells
47
+ config=@app.retrieveConfig
48
+ a=config["los"].content
49
+
50
+ @cellIds=a.keys.max if a
51
+ @cellIds||=0
52
+ end
53
+
54
+ def getNewCellId
55
+ @cellIds+=1
56
+ end
57
+ end
@@ -0,0 +1,43 @@
1
+ module LocalObjectStorage
2
+
3
+
4
+ class Index
5
+ def initialize(store,key)
6
+ @key=key
7
+ @store=store
8
+ @store||={}
9
+
10
+ @index={}
11
+ end
12
+
13
+ def [](id)
14
+ @index[id]
15
+ end
16
+ def []=(id,value)
17
+ @index[id]=value
18
+ end
19
+
20
+ def dump
21
+ Simple::Marshal::dump(@index)
22
+ end
23
+ def load(data)
24
+ @index=Simple::Marshal::load(data)
25
+ end
26
+
27
+ def deleteValue(id)
28
+ @index.each{|n,v|
29
+ if @index[n].is_a?(Array)
30
+ @index[n].delete(id)
31
+ else
32
+ @index.delete(n)
33
+ end
34
+ }
35
+ end
36
+ def delete(key)
37
+ @index.delete(key)
38
+ end
39
+
40
+ end
41
+
42
+
43
+ end
@@ -0,0 +1,96 @@
1
+
2
+ module LocalObjectStorage
3
+
4
+ module Marshal
5
+
6
+ MarshaledObject=Struct.new(:objectId)
7
+
8
+ def self.dump(object)
9
+
10
+ vars=getVarsFromObject(object)
11
+ vars=filterVars(vars)
12
+
13
+ a=[object.class.to_s,object.objectId,vars]
14
+ Simple::Marshal::dump(a)
15
+ end
16
+ def self.load(data,store)
17
+ raise "LocalObjectStorage::load data is nil!" if data.nil?
18
+ a=Simple::Marshal::load(data)
19
+ className,objectId,vars=a
20
+
21
+ if objectId.nil?
22
+ raise "ObjectID is nil"
23
+ end
24
+
25
+ klass=getClass(className)
26
+ object=klass.new(store)
27
+
28
+ # FIXME: unfilter is complex !!!
29
+
30
+ vars.each{|name,value|
31
+ if value.is_a?(MarshaledObject)
32
+ value=IncompleteObject.new(store,value.objectId,object,name)
33
+ else
34
+ value=unfilter(store,object,value,name)
35
+ end
36
+
37
+ object.instance_variable_set(name,value)
38
+ }
39
+ object
40
+ end
41
+
42
+ private
43
+
44
+ def self.unfilter(store,parent,var,name)
45
+ return IncompleteObject.new(store,var.objectId,parent,name) if var.is_a?(MarshaledObject)
46
+ if var.is_a?(Array)
47
+ a=[]
48
+ var.each{|v|a<<unfilter(store,a,v,nil)}
49
+ a
50
+ elsif var.is_a?(Hash)
51
+ nvar={}
52
+ var.each{|k,v|
53
+ nvar[k]=unfilter(store,nvar,v,k)
54
+ }
55
+ nvar
56
+ else
57
+ var
58
+ end
59
+ end
60
+
61
+ def self.filterVars(var)
62
+ return MarshaledObject.new(var.objectId) if var.is_a?(PersistentObject)
63
+
64
+
65
+ # FIXME: Filter IcompleteObject !!!!
66
+ return MarshaledObject.new(var.objectId) if var.is_a?(IncompleteObject)
67
+
68
+
69
+ if var.is_a?(Array)
70
+ var.map{|v|filterVars(v)}
71
+ elsif var.is_a?(Hash)
72
+ nvar={}
73
+
74
+ # NOTE: Persistent-Objects as keys in hashes are not supported !!!
75
+ var.each{|k,v|
76
+ nvar[k]=filterVars(v)
77
+ }
78
+ nvar
79
+ else
80
+ var
81
+ end
82
+ end
83
+
84
+
85
+ def self.getVarsFromObject(object)
86
+ vars={}
87
+ object.instance_variables.each{|var|
88
+ unless object.instance_variable_get(var).is_a?(LocalObjectStorageApp)
89
+ value=object.instance_variable_get(var)
90
+ vars[var]=value
91
+ end
92
+ }
93
+ vars
94
+ end
95
+ end
96
+ end