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,5 @@
1
+ module TodoModell
2
+ class User<PersistentObject
3
+
4
+ end
5
+ end
data/apps/todo/todo.rb ADDED
@@ -0,0 +1,21 @@
1
+ require 'model/project.rb'
2
+ require 'model/todo.rb'
3
+ require 'model/comment.rb'
4
+
5
+ class TodoApp<HTTPApp
6
+ requires :localObjectStorage
7
+ def initialize(cluster,ops)
8
+ super
9
+
10
+ #p=TodoModel::Project.new(store)
11
+ #p.name="MyProject"
12
+ #p.save
13
+ end
14
+ def run
15
+ provides :todo
16
+ super
17
+ end
18
+ def store
19
+ getApp(:localObjectStorage)
20
+ end
21
+ end
@@ -0,0 +1,7 @@
1
+ <ul>
2
+ <% part.comments.each{|comment| %>
3
+ <li>
4
+ <%=comment.text%>
5
+ </li>
6
+ <% } %>
7
+ </ul>
@@ -0,0 +1,5 @@
1
+ <form action="<%=url(:action=>:addProject)%>" method="post">
2
+ Create new Project:<br>
3
+ <input type="text" name="projectName"></input>
4
+ <input type="submit"/>
5
+ </form>
@@ -0,0 +1,12 @@
1
+ <% if parts.length==0 %>
2
+ No Parts defined yet.
3
+ <% end %>
4
+ <ul>
5
+ <% parts.each{|part| %>
6
+ <li>
7
+ <a href="<%=url(:action=>:editPart,:part=>part.objectId)%>">
8
+ <%=part.name%>
9
+ </a>
10
+ </li>
11
+ <% } %>
12
+ </ul>
@@ -0,0 +1,16 @@
1
+ Project #:<%=projects.length%><br>
2
+ <table>
3
+ <% projects.each{|project| %>
4
+ <tr>
5
+ <td>
6
+ <a href="<%=url(:action=>:edit,:project=>project.objectId)%>">
7
+ <%=project.name%>
8
+ </a>
9
+ (<%=project.creationDate%>)
10
+ </td>
11
+ <td>
12
+ <a href="<%=url(:action=>:delete,:project=>project.objectId)%>">Delete</a>
13
+ </td>
14
+ </tr>
15
+ <% } %>
16
+ </table>
@@ -0,0 +1,11 @@
1
+ Editing Project <%=@project.name%>
2
+ <br />
3
+
4
+ <%= render_partial(:partList,:project=>@project.objectId) %>
5
+
6
+ <br />
7
+ Add Part:<br />
8
+ <form method="post" action="<%=url(:action=>:addPart,:project=>@project.objectId)%>">
9
+ <input type="text" name="partName"></input>
10
+ <input type="submit"></input>
11
+ </form>
@@ -0,0 +1,10 @@
1
+ Edit '<%=part.name%>' of '<%=part.project.name%>'
2
+
3
+ <br />
4
+ <%= render_partial(:commentList,:part=>part) %>
5
+
6
+ <form method="post" action="<%=url(:action=>:addComment,:part=>part.objectId)%>">
7
+ Comment:
8
+ <input type="text" name="text"/>
9
+ <input type="submit"/>
10
+ </form>
@@ -0,0 +1,2 @@
1
+ <%= render_partial(:projectList)%>
2
+ <%= render_partial(:createProject)%>
@@ -0,0 +1,4 @@
1
+ <%=question%>
2
+ <% choices.each{|item| name,url=item %>
3
+ <a href="<%=url%>"><%=name%></a>
4
+ <% } %>
@@ -0,0 +1,7 @@
1
+
2
+
3
+ class TransparentNetworkApp<Service
4
+ def initialize(cluster,options)
5
+ super(cluster,options,:transparentNetwork)
6
+ end
7
+ end
@@ -0,0 +1,97 @@
1
+
2
+ # FIXME: maybe include check for package lost
3
+ class BigTransfer
4
+ def initialize(node)
5
+ @node=node
6
+
7
+ @receivers={}
8
+
9
+ @mutex=Mutex.new
10
+ @recMutex=Mutex.new
11
+ @pkgId=0
12
+
13
+ @node.addReceiver(self) {|from,args|
14
+ receive(from,args)
15
+ }
16
+
17
+ @packages={}
18
+ end
19
+
20
+ def me
21
+ @node.me
22
+ end
23
+
24
+ def addReceiver(api,&block)
25
+ @receivers[api]=block
26
+ end
27
+
28
+ def removeReceiver(app)
29
+ @receivers.delete(app)
30
+ end
31
+ def log(*x)
32
+ @node.log(*x)
33
+ end
34
+ def stop
35
+
36
+ end
37
+
38
+ # close the api-object - api won't listen anymore
39
+ def close
40
+ @node.removeReceiver(self)
41
+ end
42
+
43
+ def receive(from,args)
44
+ pkgId=nil
45
+ pkgs=nil
46
+ @mutex.synchronize {
47
+ assert{args.is_a?(Array)}
48
+ pkgId,str,i,pkgs=args
49
+
50
+ @packages[pkgId]||=[]
51
+ @packages[pkgId]<<[str,i,pkgs]
52
+ }
53
+ if @packages[pkgId].length>=pkgs
54
+
55
+ @recMutex.synchronize {
56
+ ps=@packages[pkgId].clone
57
+ ps=ps.uniq{|p|p[1]}
58
+ if ps.length==pkgs
59
+ # ps is mad unique - so if length is ok, data should be ok
60
+ data=ps.sort{|a,b| a[1].to_i <=> b[1].to_i}.map{|p|p[0]}.join("")
61
+ @receivers.each{|k,v|v.call(from,data)}
62
+ @packages.delete(pkgId)
63
+ else
64
+ puts "PKG recv-COUNT #{ps.length} #{ps.map{|p|p[1]}}"
65
+ end
66
+
67
+ }
68
+ end
69
+ end
70
+
71
+ def sendMessage(data,node)
72
+ assert{data.is_a?(String)}
73
+ maxSize=UdpTransceiver::UDPSize-UdpTransceiver::Overhead
74
+
75
+ pkgs=(data.length.to_f/maxSize).ceil
76
+ i=0
77
+ pkgId=getNewPkgId
78
+ while data and data.length>0
79
+ str=data[0...maxSize]
80
+ data=data[maxSize..-1]
81
+ pkg=[pkgId,str,i,pkgs]
82
+ i+=1
83
+ @node.sendMessage(pkg,node)
84
+ end
85
+ end
86
+
87
+ private
88
+ def getNewPkgId
89
+ id=nil
90
+ @mutex.synchronize {
91
+ @pkgId+=1
92
+ id=@pkgId
93
+ }
94
+ id
95
+ end
96
+
97
+ end
@@ -0,0 +1,7 @@
1
+ Feature: Udp network information
2
+
3
+ Scenario: Single network node
4
+ Given a testbed with a "UdpNetwork" application
5
+ When the info function of the "UdpNetwork" application is queried
6
+ Then the result contains the NodeId of the "UdpNetwork" application
7
+
@@ -0,0 +1,84 @@
1
+ require 'tools/waiting_queue.rb'
2
+
3
+ class MessageQueue
4
+ MIDDLE_PRIORITY=10
5
+
6
+ def initialize(node,priority=nil)
7
+
8
+ priority||=MIDDLE_PRIORITY
9
+
10
+ @priority=priority
11
+
12
+ @node=node
13
+
14
+ @receivers={}
15
+
16
+ @mutex=Mutex.new
17
+ @recMutex=Mutex.new
18
+ @pkgId=0
19
+
20
+ @node.addReceiver(self) {|from,args|
21
+ receive(from,args)
22
+ }
23
+
24
+ @inQueue=WaitingQueue.new
25
+ @outQueue=WaitingQueue.new
26
+
27
+ @rThread=Thread.new { receiveThread}
28
+ @sThread=Thread.new { sendThread}
29
+ end
30
+
31
+ def me
32
+ @node.me
33
+ end
34
+
35
+ def addReceiver(api,&block)
36
+ @receivers[api]=block
37
+ end
38
+
39
+ def removeReceiver(app)
40
+ @receivers.delete(app)
41
+ end
42
+ def log(*x)
43
+ @node.log(*x)
44
+ end
45
+
46
+ # close the api-object - api won't listen anymore
47
+ def close
48
+ @rThread.stop
49
+ @node.removeReceiver(self)
50
+ end
51
+
52
+ def receive(from,args)
53
+ @inQueue<<[from,args]
54
+ end
55
+
56
+ def sendMessage(data,node)
57
+ @outQueue<<[data,node]
58
+ end
59
+
60
+ private
61
+ def receiveThread
62
+ begin
63
+ loop do
64
+ e=@inQueue.pop
65
+ from,data=e
66
+ @receivers.each{|k,v|v.call(from,data)}
67
+ pp e
68
  end
69
+ rescue Object=>e
70
+ pp e,e.backtrace
71
+ end
72
+ end
73
+ def sendThread
74
+ begin
75
+ loop do
76
+ e=@outQueue.pop
77
+ data,node=e
78
+ @node.sendMessage(data,node)
79
+ #sleep 0.2
80
+ end
81
+ rescue Object=>e
82
+ pp e,e.backtrace
83
+ end
1
84
  end
85
+ end
86
+
@@ -0,0 +1,39 @@
1
+ class NetworkInterfaceAPI
2
+ def initialize(node)
3
+ @node=node
4
+ @receivers={}
5
+ if @node
6
+ @node.addReceiver(self) {|from,args|
7
+ receive(from,args)
8
+ }
9
+ end
10
+ end
11
+ def me
12
+ @node.me
13
+ end
14
+
15
+ def addReceiver(api,&block)
16
+ @receivers[api]=block
17
+ end
18
+
19
+ def removeReceiver(app)
20
+ @receivers.delete(app)
21
+ end
22
+ def log(*x)
23
+ @node.log(*x)
24
+ end
25
+
26
+ # close the api-object - api won't listen anymore
27
+ def close
28
+ @node.removeReceiver(self)
29
+ end
30
+
31
+ def receive(from,args)
32
+ @receivers.each{|k,v|v.call(from,args)}
33
+ end
34
+
35
+ def sendMessage(data,node)
36
+ @node.sendMessage(data,node)
37
+ end
38
+
39
+ end
@@ -0,0 +1,186 @@
1
+ require 'network_interface_api.rb'
2
+
3
+ class QoSQueue<NetworkInterfaceAPI
4
+
5
+ class Connection
6
+ MAX_ACK_WAIT=3 # in seconds
7
+ MAX_ACK_WAIT_QUEUE = 4
8
+ SEND_PKGS=4
9
+ WAIT_TIME=1.5
10
+
11
+ PKG_ACK="A"
12
+ PKG_NORMAL="N"
13
+
14
+ def initialize(myNode,targetNode)
15
+ @myNode=myNode
16
+ @targetNode=targetNode
17
+ @queue=WaitingQueue.new
18
+
19
+ @lastRecvAck=0
20
+ @sendId=0
21
+ @missBuffer=[]
22
+ @sendMutex=Mutex.new
23
+
24
+
25
+ @lastSentAckTime=Time.now
26
+ @completeReceived=0
27
+ @lastReceived=0
28
+ @lastAckNumberSend=0
29
+ @recvMutex=Mutex.new
30
+
31
+ @inBuffer=[]
32
+ @quit=false
33
+
34
+ @sendThread=Thread.new {
35
+ begin
36
+ send!
37
+ rescue Object=>e
38
+ pp e,e.backtrace
39
+ end
40
+ }
41
+ @sendThread[:type]=:sendThread
42
+ @missSendThread=Thread.new {
43
+ begin
44
+ missSend!
45
+ rescue Object=>e
46
+ pp e,e.backtrace
47
+ end
48
+ }
49
+ @missSendThread[:type]=:sendMissThread
50
+
51
+ end
52
+
53
+ def stop
54
+ puts "STOPPING QOS"
55
+ @quit=true
56
+ sleep 0.1
57
+
58
+ @sendThread.kill
59
+ @missSendThread.kill
60
+ if @sendThread.alive?
61
+ sleep 0.1
62
+ @sendThread.kill!
63
+ end
64
+ if @missSendThread.alive?
65
+ sleep 0.1
66
+ @missSendThread.kill!
67
+ puts "HARD KILL"
68
+ end
69
+ end
70
+
71
+ def sendMessage(msg)
72
+ @queue<<msg
73
+ end
74
+
75
+ def recv(data,receivers)
76
+ id,type,data=data
77
+ @recvMutex.synchronize {
78
+ case type
79
+ when PKG_ACK
80
+ pp "GOT ACK #{id} #{type} #{data}"
81
+ @lastRecvAck=id
82
+ when PKG_NORMAL
83
+ @lastReceived=[@lastReceived,id].max
84
+ @inBuffer<<id
85
+ while @inBuffer.member?(@completeReceived+1)
86
+ @completeReceived+=1
87
+ @inBuffer.delete(@completeReceived)
88
+ end
89
+ if Time.now-@lastSentAckTime>MAX_ACK_WAIT || @completeReceived-@lastAckNumberSend>MAX_ACK_WAIT_QUEUE
90
+ sendAck
91
+ end
92
+ receivers.each{|k,v|v.call(@targetNode,data)}
93
+ end
94
+ }
95
+ return nil
96
+ end
97
+
98
+ private
99
+
100
+ def quit?
101
+ @quit
102
+ end
103
+
104
+ def sendAck
105
+ @myNode.sendMessage([@completeReceived,PKG_ACK,nil],@targetNode)
106
+ @lastSentAckTime=Time.now
107
+ @lastAckNumberSend=@completeReceived
108
+ puts "SENDING ACK #{@completeReceived} --- #{@lastReceived}"
109
+ end
110
+
111
+ def send!
112
+ while not quit?
113
+ data=@queue.pop
114
+
115
+ while @sendId-@lastRecvAck>MAX_ACK_WAIT_QUEUE
116
+ puts "ENQUEUE (waiting: #{@queue.length}"
117
+ sleep 0.2 # wait
118
+ end
119
+ @sendMutex.synchronize {
120
+ @sendId+=1
121
+ @myNode.sendMessage([@sendId,PKG_NORMAL,data],@targetNode)
122
+ puts "QoSSEND #{@sendId}"
123
+ @missBuffer<<[@sendId,data]
124
+ }
125
+ end
126
+ end
127
+
128
+ def missSend!
129
+ while not quit?
130
+ if @sendId-@lastRecvAck>=MAX_ACK_WAIT_QUEUE
131
+ @sendMutex.synchronize {
132
+ # resend
133
+ @missBuffer=@missBuffer.select{|b|b[0]>@lastRecvAck}.sort_by{|b|b[0]}
134
+ }
135
+ @missBuffer[0...SEND_PKGS].each{|b|
136
+ id,data=b
137
+ puts "RESEND #{id}"
138
+ @myNode.sendMessage([id,PKG_NORMAL,data],@targetNode)
139
+ }
140
+ end
141
+ sleep WAIT_TIME
142
+ end
143
+ end
144
+ end
145
+
146
+
147
+ def initialize(node)
148
+ super
149
+
150
+ @mutex=Mutex.new
151
+ @conns={}
152
+ @quit=false
153
+
154
+ end
155
+
156
+ def conn(from)
157
+ @mutex.synchronize {
158
+ return nil if @quit
159
+ @conns[from]||=Connection.new(@node,from)
160
+ }
161
+ end
162
+
163
+ def stop
164
+ puts "TRYING TO STOP QOS_QUEUE"
165
+ @mutex.synchronize {
166
+ puts "QOS_QUEUE stop #{@conns.length}"
167
+ @conns.each{|k,v|
168
+ puts "STOP:",v
169
+ v.stop
170
+ }
171
+ @quit=true
172
+ }
173
+ end
174
+
175
+ def receive(from,args)
176
+ c=conn(from)
177
+ return c.recv(args,@receivers) if c
178
+ nil
179
+ end
180
+
181
+ def sendMessage(data,node)
182
+ c=conn(node)
183
+ return c.sendMessage(data) if c
184
+ nil
185
+ end
186
+ end