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,6 @@
1
+ class PageFile
2
+ def initialize(app,name)
3
+ @app=app
4
+ @name=name
5
+ end
6
+ end
@@ -0,0 +1,126 @@
1
+ class PersistentObject
2
+ attr_reader :objectId,:myStore
3
+
4
+ # load PersistentObject, objectId is nil, otherwise create one
5
+ def initialize(myStore,objectId=nil)
6
+ @myStore=myStore
7
+ if objectId
8
+ loadFromStore(objectId)
9
+ end
10
+
11
+ objectId||=myStore.createObjectId
12
+ @objectId=objectId
13
+ end
14
+
15
+ def save
16
+ @myStore.save(self)
17
+ end
18
+
19
+ def ==(other)
20
+ return false if other.class!=self.class
21
+ instance_variables.each{|var|
22
+ o=other.instance_variable_get(var)
23
+ m=instance_variable_get(var)
24
+ if m.is_a?(LocalObjectStorage)
25
+ # ignore
26
+ elsif m.is_a?(PersistentObject) || m.is_a?(IncompleteObject)
27
+ return false if m.objectId!=o.objectId
28
+ else
29
+ return false if m!=o
30
+ end
31
+ }
32
+ true
33
+ end
34
+
35
+ def delete
36
+ @myStore.delete(self)
37
+ end
38
+
39
+ def self.getAll(store)
40
+ pp "GETTING ALL #{self}"
41
+ store.findByClass(self)
42
+ end
43
+
44
+ def self.getById(store,id)
45
+ store.findByObjectId(id)
46
+ end
47
+
48
+ def self.findAll(store,&block)
49
+ store.findByClass(self).select{|element|
50
+ block.call(element)
51
+ }
52
+ end
53
+
54
+ private
55
+ def loadFromStore(objectId)
56
+ data=@myStore.getData(objectId)
57
+ end
58
+ end
59
+
60
+ class IncompleteObject
61
+ attr_reader :objectId
62
+ def initialize(myStore,objectId,owner,name)
63
+ @owner=owner
64
+ @objectId=objectId
65
+ @myStore=myStore
66
+ @name=name
67
+ end
68
+ def method_missing(*s)
69
+ read.send(*s)
70
+ end
71
+
72
+ def read
73
+ object=@myStore.restore(@objectId)
74
+ if @owner.is_a?(Hash)
75
+ @owner[@name]=object
76
+ elsif @owner.is_a?(Array)
77
+ @owner.each_index {|i|
78
+ @owner[i]=object if @owner[i]==self
79
+ }
80
+ else
81
+ @owner.instance_variable_set(@name,object)
82
+ end
83
+ object
84
+ end
85
+ end
86
+
87
+
88
+ class Transaction
89
+ @@transaction={}
90
+
91
+ def initialize
92
+ @modifiedObjects=[]
93
+ @readObjects=[]
94
+ end
95
+
96
+ def modify(object)
97
+ @modifiedObjects << object
98
+ end
99
+ def read(object)
100
+ @readObjects << object
101
+ end
102
+
103
+ def finish
104
+ # FIXME
105
+ # check readObjects for modifications
106
+ # if not modified, then save
107
+ # otherwise through exception
108
+ @modifiedObjects.uniq.each{|o|o.save}
109
+ end
110
+
111
+ def self.run(&block)
112
+ @@transaction[Thread.current]||=[]
113
+ clist=@@transaction[Thread.current]
114
+ tx=Transaction.new
115
+ clist<<tx
116
+ block.call
117
+ clist.delete(tx)
118
+ tx.finish
119
+ end
120
+ end
121
+
122
+ def transaction(&block)
123
+ Transaction.run(block)
124
+ end
125
+
126
+
@@ -0,0 +1,148 @@
1
+ require 'service.rb'
2
+ require File.expand_path('../lib/index.rb',__FILE__)
3
+ require File.expand_path('../lib/persistent_object.rb',__FILE__)
4
+ require File.expand_path('../lib/marshal.rb',__FILE__)
5
+ require File.expand_path('../lib/cellmgr.rb',__FILE__)
6
+
7
+ class LocalObjectStorageApp<Service
8
+
9
+ class Store
10
+ def initialize(app)
11
+ @app=app
12
+ end
13
+ def [](key)
14
+ config=@app.retrieveConfig
15
+ config["los"][key].content
16
+ end
17
+ def []=(key,value)
18
+ config=@app.retrieveConfig
19
+ config["los"][key]=value
20
+ end
21
+ end
22
+
23
+
24
+ provides :localObjectStorage
25
+ requires :localFileStore
26
+
27
+ include LocalObjectStorage
28
+
29
+ attr_reader :store
30
+
31
+ def initialize(cluster,ops)
32
+ super(cluster,ops,:localObjectStorage)
33
+
34
+ @mgr=CellMgr.new(self)
35
+ @store=Store.new(self)
36
+ @indexes={}
37
+ @maxObjectId=0
38
+
39
+ createIndexes
40
+ readIndexes
41
+ end
42
+
43
+ def outputIndexes
44
+ #pp @indexes
45
+ #pp "MGW:",@mgr
46
+ end
47
+
48
+ def findByObjectId(objectId)
49
+ restore(objectId)
50
+ end
51
+
52
+ def findByClass(klass)
53
+ findIdByClass(klass).map{|objectId|restore(objectId)}
54
+ end
55
+ def findIdByClass(klass)
56
+ find(:class=>klass.to_s)
57
+ end
58
+
59
+ def createObjectId
60
+ @maxObjectId+=1
61
+ end
62
+
63
+ def save(object)
64
+ cellId=@mgr.save(object)
65
+
66
+ @indexes[:objectId][object.objectId]=cellId
67
+
68
+ klass=object.class.to_s
69
+ @indexes[:class][klass]||=[]
70
+ @indexes[:class][klass] << object.objectId
71
+ @indexes[:class][klass].uniq!
72
+ end
73
+
74
+ def delete(object)
75
+ deleteId(object.objectId)
76
+ end
77
+
78
+ def deleteId(objectId)
79
+ @indexes.each{|name,index|
80
+ index.deleteValue(objectId) unless name==:objectId
81
+ }
82
+ @indexes[:objectId].delete(objectId)
83
+ end
84
+
85
+ def restore(objectId)
86
+ objectId=objectId.to_i
87
+ cellId=@indexes[:objectId][objectId]
88
+ raise "Object #{objectId} not found!" unless cellId
89
+ @mgr.load(cellId)
90
+ end
91
+
92
+ def stop
93
+ super
94
+ saveIndexes
95
+ @mgr.saveAll
96
+ end
97
+
98
+ def deleteAll(klass)
99
+ findIdByClass(klass).each{|o|deleteId(o)}
100
+ pp "DELALL",@indexes
101
+ end
102
+
103
+ private
104
+
105
+ def find(hash)
106
+ set=nil
107
+ hash.each{|k,v|
108
+ v=[v].flatten
109
+ res=v.map{|a|@indexes[k][a]}.flatten.select{|i|i}
110
+ if set.nil?
111
+ set=res
112
+ else
113
+ set&=res
114
+ end
115
+ }
116
+ set.flatten.select{|s|not s.nil?}
117
+ end
118
+
119
+ def readIndexes
120
+ config=retrieveConfig
121
+ indexes=config["indexes"].content
122
+ if indexes
123
+ indexes.each{|name,index|
124
+ @indexes[name.to_sym]=LocalObjectStorage::Index.new(self,name)
125
+ @indexes[name.to_sym].load(index)
126
+ }
127
+ end
128
+
129
+ end
130
+
131
+ def saveIndexes
132
+ config=retrieveConfig
133
+ @indexes.each{|name,index|
134
+ config["indexes"][name]=index.dump
135
+ }
136
+ end
137
+
138
+ def storeIndex(which,what)
139
+ i=@indexes[which]
140
+ what.each{|n,v|i[n]=v}
141
+ end
142
+
143
+ def createIndexes
144
+ [:objectId,:class].each{|key|
145
+ @indexes[key]= LocalObjectStorage::Index.new(self,key)
146
+ }
147
+ end
148
+ end
@@ -0,0 +1,123 @@
1
+ require File.expand_path('../../local_object_storage.rb',__FILE__)
2
+
3
+ class ExampleObject<PersistentObject
4
+ attr_accessor :a
5
+
6
+ def initialize(store)
7
+ super
8
+ end
9
+ end
10
+
11
+ describe "Local Object Storage marshaling" do
12
+ it "should only marshal simple types" do
13
+ b=TestBed.new
14
+ store=b.run("LocalObjectStorage")
15
+ o=ExampleObject.new(store)
16
+ o.a=10
17
+ data=LocalObjectStorage::Marshal::dump(o)
18
+ o2=LocalObjectStorage::Marshal::load(data,store)
19
+ o2.class.should == ExampleObject
20
+ o2.a.should == 10
21
+ b.stop
22
+ end
23
+ it "should store ids for persistent objects" do
24
+ b=TestBed.new
25
+ store=b.run("LocalObjectStorage")
26
+ a=ExampleObject.new(store)
27
+ x=ExampleObject.new(store)
28
+ a.a=x
29
+ data=LocalObjectStorage::Marshal::dump(a)
30
+ a2=LocalObjectStorage::Marshal::load(data,store)
31
+ a2.a.should be_a_kind_of(IncompleteObject)
32
+ b.stop
33
+ end
34
+ it "should resolve persistent objects on use" do
35
+ b=TestBed.new
36
+ store=b.run("LocalObjectStorage")
37
+ a=ExampleObject.new(store)
38
+ x=ExampleObject.new(store)
39
+ a.a=x
40
+ a.save
41
+ x.save
42
+ data=LocalObjectStorage::Marshal::dump(a)
43
+ a2=LocalObjectStorage::Marshal::load(data,store)
44
+ a2.a.a
45
+ a2.a.should be_a_kind_of(ExampleObject)
46
+ a2.a.should == x
47
+ b.stop
48
+ end
49
+
50
+ it "should store arrays of po's correctly" do
51
+ b=TestBed.new
52
+ store=b.run("LocalObjectStorage")
53
+ a=ExampleObject.new(store)
54
+ x=ExampleObject.new(store)
55
+ z=ExampleObject.new(store)
56
+ a.a=[x,z]
57
+ a.save
58
+ x.save
59
+ z.save
60
+ data=LocalObjectStorage::Marshal::dump(a)
61
+ a2=LocalObjectStorage::Marshal::load(data,store)
62
+ #a2.a.read
63
+ a2.a.should be_a_kind_of(Array)
64
+ a2.a.each{|y|y.read if y.is_a?(IncompleteObject)}
65
+ a2.a.should == [x,z]
66
+ b.stop
67
+ end
68
+ end
69
+
70
+ describe "Local Object Storage" do
71
+ it "should store persistent objects within pages" do
72
+ t=TestBed.new
73
+ store=t.run("LocalObjectStorage")
74
+ store.deleteAll(ExampleObject)
75
+
76
+ a=ExampleObject.new(store)
77
+ a.a=99
78
+ a.save
79
+ t.stop
80
+ t=TestBed.new(:testbedId=>t.testbedId)
81
+ store=t.run("LocalObjectStorage")
82
+ #store.outputIndexes
83
+ xs=store.findByClass(ExampleObject)
84
+ xs.should == [a]
85
+ t.stop
86
+ end
87
+ it "indexes keep track of object's positions" do
88
+ b=TestBed.new
89
+ store=b.run("LocalObjectStorage")
90
+ a=ExampleObject.new(store)
91
+ a.a=99
92
+ a.save
93
+ objectId=a.objectId
94
+ x=store.findByObjectId(objectId)
95
+ x.should == a
96
+ xs=store.findByClass(ExampleObject)
97
+ xs.should == [a]
98
+ xs=ExampleObject.getAll(store)
99
+ xs.should == [a]
100
+
101
+ store.findByClass(String).should == []
102
+ b.stop
103
+ end
104
+ it "deleting objects should keep track of indexes" do
105
+ b=TestBed.new
106
+ store=b.run("LocalObjectStorage")
107
+ store.deleteAll(ExampleObject)
108
+ a=ExampleObject.new(store)
109
+ a.a=99
110
+ a.save
111
+ objectId=a.objectId
112
+ a=ExampleObject.new(store)
113
+ a.a=70
114
+ a.save
115
+ store.findByClass(ExampleObject).length.should == 2
116
+ a.delete
117
+ store.findByClass(ExampleObject).length.should == 1
118
+ as=store.findByClass(ExampleObject)
119
+ as[0].objectId.should == objectId
120
+ b.stop
121
+ end
122
+ it "should differentiate between owning and owned objects for garbage collection"
123
+ end
@@ -0,0 +1,64 @@
1
+ require 'service.rb'
2
+
3
+ class LocalSecureFileStoreApp<Service
4
+
5
+ class MyFile
6
+
7
+ end
8
+
9
+ class FileDoesNotExist<Exception
10
+
11
+ end
12
+
13
+ def initialize(cluster,options)
14
+ super(cluster,options,:localSecureFileStore)
15
+ end
16
+
17
+ def load(name,key)
18
+ key=hash(key)
19
+ name=check(name)
20
+ filename=name+"_"+key
21
+ p=path(filename)
22
+ raise FileDoesNotExist unless File.exists?(p)
23
+ read(p)
24
+ end
25
+
26
+ def files(key)
27
+ key=hash(key)
28
+ filename="*_"+key
29
+ Dir[path(filename)].map{|f|File.split(f)[1].gsub("_"+key,"")}
30
+ end
31
+
32
+ def store(name,key,content)
33
+ key=hash(key)
34
+ name=check(name)
35
+ if name.length>0
36
+ p=path(name+"_"+key)
37
+ f=File.open(p,"w")
38
+ f.print content
39
+ f.close
40
+ true
41
+ else
42
+ false
43
+ end
44
+ end
45
+
46
+ private
47
+
48
+ def hash(value)
49
+ Crypt::hexdigest(value.to_s)
50
+ end
51
+
52
+ def path(file)
53
+ File.join(getAppDataPath,file)
54
+ end
55
+ def read(file)
56
+ f=File.open(file)
57
+ c=f.read
58
+ f.close
59
+ c
60
+ end
61
+ def check(name)
62
+ name.gsub(/[^a-zA-Z0-9_]/,"")
63
+ end
64
+ end