IOWA 1.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 (502) hide show
  1. checksums.yaml +7 -0
  2. data/CONTRIBUTORS +14 -0
  3. data/README.md +23 -0
  4. data/RELEASE_NOTES +77 -0
  5. data/ToDo +21 -0
  6. data/components/CRUDList/CRUDList.html +13 -0
  7. data/components/CRUDList/CRUDList.iwa +136 -0
  8. data/components/Content/Content.html +0 -0
  9. data/components/Content/Content.iwa +143 -0
  10. data/components/Content/example/README +9 -0
  11. data/components/Content/example/cgi/iowa.cgi +10 -0
  12. data/components/Content/example/demo.rb +30 -0
  13. data/components/Content/example/doc/index.html +7 -0
  14. data/components/Content/example/iowa/Content.html +1 -0
  15. data/components/Content/example/iowa/Content.iwa +1 -0
  16. data/components/Content/example/iowa/Main.html +6 -0
  17. data/components/Content/example/iowa/Main.iwa +3 -0
  18. data/components/Content/example/iowa/_content/body +7 -0
  19. data/components/Content/example/iowa/_content/body2 +3 -0
  20. data/components/Content/example/iowa/_content/title +2 -0
  21. data/components/Content/example/iowa/app.cnf +8 -0
  22. data/components/Content/example/iowa/app.rb +8 -0
  23. data/components/Content/example/webrick.rb +38 -0
  24. data/components/Include/Include.html +1 -0
  25. data/components/Include/Include.iwa +30 -0
  26. data/components/Include/readme +5 -0
  27. data/components/JumpTo/JumpTo.html +8 -0
  28. data/components/JumpTo/JumpTo.iwa +8 -0
  29. data/components/JumpTo/readme +6 -0
  30. data/doc/Architecture.txt +6 -0
  31. data/doc/History.txt +33 -0
  32. data/doc/StandardDispatcher.txt +19 -0
  33. data/examples/blog/README +1 -0
  34. data/examples/hello_world/README +17 -0
  35. data/examples/hello_world/htdocs/hello_world_html.html +24 -0
  36. data/examples/hello_world/htdocs/hello_world_ruby.html +41 -0
  37. data/examples/hello_world/iowa/HelloWorld.html +14 -0
  38. data/examples/hello_world/iowa/HelloWorld.iwa +31 -0
  39. data/examples/hello_world/iowa/Index.html +16 -0
  40. data/examples/hello_world/iowa/Index.iwa +5 -0
  41. data/examples/hello_world/iowa/iowa_hello_world.cnf +19 -0
  42. data/examples/hello_world/iowa/iowa_hello_world.rb +5 -0
  43. data/examples/hello_world/iowa/mapfile.cnf +6 -0
  44. data/examples/hw1/iowa/Main.html +1 -0
  45. data/examples/hw1/iowa/README +9 -0
  46. data/examples/hw1/iowa/hw.rb +4 -0
  47. data/examples/hw2/iowa/Main.html +10 -0
  48. data/examples/hw2/iowa/Main.iwa +7 -0
  49. data/examples/hw2/iowa/README +16 -0
  50. data/examples/hw2/iowa/hw.rb +4 -0
  51. data/examples/hw3/iowa/Main.html +11 -0
  52. data/examples/hw3/iowa/Main.iwa +7 -0
  53. data/examples/hw3/iowa/README +22 -0
  54. data/examples/hw3/iowa/hw.rb +4 -0
  55. data/examples/hw4/iowa/Greetings.html +10 -0
  56. data/examples/hw4/iowa/Greetings.iwa +9 -0
  57. data/examples/hw4/iowa/Main.html +12 -0
  58. data/examples/hw4/iowa/Main.iwa +10 -0
  59. data/examples/hw4/iowa/README +28 -0
  60. data/examples/hw4/iowa/hw.rb +4 -0
  61. data/examples/hw5/iowa/Footer.html +2 -0
  62. data/examples/hw5/iowa/Greetings.html +4 -0
  63. data/examples/hw5/iowa/Greetings.iwa +12 -0
  64. data/examples/hw5/iowa/Header.html +6 -0
  65. data/examples/hw5/iowa/Main.html +12 -0
  66. data/examples/hw5/iowa/Main.iwa +13 -0
  67. data/examples/hw5/iowa/README +16 -0
  68. data/examples/hw5/iowa/hw.rb +4 -0
  69. data/examples/template_server/iowa/Content.iwa +121 -0
  70. data/examples/template_server/iowa/Content.view +0 -0
  71. data/examples/template_server/iowa/DBContentDispatcher.rb +112 -0
  72. data/examples/template_server/iowa/DBContentPage.html +3 -0
  73. data/examples/template_server/iowa/DBContentPage.iwa +85 -0
  74. data/examples/template_server/iowa/app.cnf +13 -0
  75. data/examples/template_server/iowa/app.rb +5 -0
  76. data/ext/Classifier/classifier.c +256 -0
  77. data/ext/Classifier/ext_help.h +14 -0
  78. data/ext/Classifier/extconf.rb +5 -0
  79. data/ext/Classifier/tst.h +40 -0
  80. data/ext/Classifier/tst_cleanup.c +24 -0
  81. data/ext/Classifier/tst_delete.c +146 -0
  82. data/ext/Classifier/tst_grow_node_free_list.c +38 -0
  83. data/ext/Classifier/tst_init.c +41 -0
  84. data/ext/Classifier/tst_insert.c +192 -0
  85. data/ext/Classifier/tst_search.c +68 -0
  86. data/ext/http11/README +11 -0
  87. data/ext/http11/ext_help.h +15 -0
  88. data/ext/http11/extconf.rb +5 -0
  89. data/ext/http11/http11.c +534 -0
  90. data/ext/http11/http11.c.dif +422 -0
  91. data/ext/http11/http11_parser.c +1243 -0
  92. data/ext/http11/http11_parser.c.dif +193 -0
  93. data/ext/http11/http11_parser.h +49 -0
  94. data/ext/http11/http11_parser.h.dif +20 -0
  95. data/ext/http11/http11_parser.rl +192 -0
  96. data/ext/httpmachine/Makefile +149 -0
  97. data/ext/httpmachine/extconf.rb +33 -0
  98. data/ext/httpmachine/http.cpp +430 -0
  99. data/ext/httpmachine/http.h +156 -0
  100. data/ext/httpmachine/rubyhttp.cpp +165 -0
  101. data/external/mime-types/LICENCE +18 -0
  102. data/external/mime-types/README +46 -0
  103. data/external/mime-types/doc/classes/MIME.html +120 -0
  104. data/external/mime-types/doc/classes/MIME/InvalidContentType.html +119 -0
  105. data/external/mime-types/doc/classes/MIME/Type.html +866 -0
  106. data/external/mime-types/doc/classes/MIME/Type.src/M000010.html +22 -0
  107. data/external/mime-types/doc/classes/MIME/Type.src/M000011.html +18 -0
  108. data/external/mime-types/doc/classes/MIME/Type.src/M000012.html +19 -0
  109. data/external/mime-types/doc/classes/MIME/Type.src/M000013.html +18 -0
  110. data/external/mime-types/doc/classes/MIME/Type.src/M000014.html +26 -0
  111. data/external/mime-types/doc/classes/MIME/Type.src/M000015.html +33 -0
  112. data/external/mime-types/doc/classes/MIME/Type.src/M000016.html +27 -0
  113. data/external/mime-types/doc/classes/MIME/Type.src/M000017.html +35 -0
  114. data/external/mime-types/doc/classes/MIME/Type.src/M000018.html +34 -0
  115. data/external/mime-types/doc/classes/MIME/Type.src/M000019.html +24 -0
  116. data/external/mime-types/doc/classes/MIME/Type.src/M000020.html +38 -0
  117. data/external/mime-types/doc/classes/MIME/Type.src/M000021.html +22 -0
  118. data/external/mime-types/doc/classes/MIME/Type.src/M000022.html +18 -0
  119. data/external/mime-types/doc/classes/MIME/Type.src/M000023.html +18 -0
  120. data/external/mime-types/doc/classes/MIME/Type.src/M000024.html +18 -0
  121. data/external/mime-types/doc/classes/MIME/Type.src/M000025.html +18 -0
  122. data/external/mime-types/doc/classes/MIME/Type.src/M000026.html +18 -0
  123. data/external/mime-types/doc/classes/MIME/Type.src/M000027.html +18 -0
  124. data/external/mime-types/doc/classes/MIME/Type.src/M000028.html +18 -0
  125. data/external/mime-types/doc/classes/MIME/Type.src/M000029.html +18 -0
  126. data/external/mime-types/doc/classes/MIME/Type.src/M000030.html +19 -0
  127. data/external/mime-types/doc/classes/MIME/Type.src/M000031.html +26 -0
  128. data/external/mime-types/doc/classes/MIME/Types.html +459 -0
  129. data/external/mime-types/doc/classes/MIME/Types.src/M000001.html +19 -0
  130. data/external/mime-types/doc/classes/MIME/Types.src/M000002.html +32 -0
  131. data/external/mime-types/doc/classes/MIME/Types.src/M000003.html +21 -0
  132. data/external/mime-types/doc/classes/MIME/Types.src/M000004.html +18 -0
  133. data/external/mime-types/doc/classes/MIME/Types.src/M000005.html +26 -0
  134. data/external/mime-types/doc/classes/MIME/Types.src/M000006.html +18 -0
  135. data/external/mime-types/doc/classes/MIME/Types.src/M000007.html +18 -0
  136. data/external/mime-types/doc/classes/MIME/Types.src/M000008.html +18 -0
  137. data/external/mime-types/doc/classes/MIME/Types.src/M000009.html +18 -0
  138. data/external/mime-types/doc/created.rid +1 -0
  139. data/external/mime-types/doc/files/ChangeLog.html +320 -0
  140. data/external/mime-types/doc/files/README.html +145 -0
  141. data/external/mime-types/doc/files/lib/mime/types_rb.html +101 -0
  142. data/external/mime-types/doc/fr_class_index.html +30 -0
  143. data/external/mime-types/doc/fr_file_index.html +29 -0
  144. data/external/mime-types/doc/fr_method_index.html +57 -0
  145. data/external/mime-types/doc/index.html +24 -0
  146. data/external/mime-types/doc/rdoc-style.css +208 -0
  147. data/external/mime-types/lib/mime/types.rb +1558 -0
  148. data/external/package.rb +672 -0
  149. data/external/test_support.rb +95 -0
  150. data/external/tmail/README +7 -0
  151. data/external/tmail/tmail.rb +4 -0
  152. data/external/tmail/tmail/address.rb +222 -0
  153. data/external/tmail/tmail/base64.rb +52 -0
  154. data/external/tmail/tmail/compat.rb +39 -0
  155. data/external/tmail/tmail/config.rb +50 -0
  156. data/external/tmail/tmail/encode.rb +447 -0
  157. data/external/tmail/tmail/header.rb +895 -0
  158. data/external/tmail/tmail/info.rb +14 -0
  159. data/external/tmail/tmail/loader.rb +1 -0
  160. data/external/tmail/tmail/mail.rb +869 -0
  161. data/external/tmail/tmail/mailbox.rb +386 -0
  162. data/external/tmail/tmail/mbox.rb +1 -0
  163. data/external/tmail/tmail/net.rb +260 -0
  164. data/external/tmail/tmail/obsolete.rb +123 -0
  165. data/external/tmail/tmail/parser.rb +1475 -0
  166. data/external/tmail/tmail/parser.y +372 -0
  167. data/external/tmail/tmail/port.rb +356 -0
  168. data/external/tmail/tmail/scanner.rb +17 -0
  169. data/external/tmail/tmail/scanner_r.rb +243 -0
  170. data/external/tmail/tmail/stringio.rb +256 -0
  171. data/external/tmail/tmail/textutils.rb +197 -0
  172. data/external/tmail/tmail/tmail.rb +1 -0
  173. data/external/tmail/tmail/utils.rb +23 -0
  174. data/external/win32-process/README +133 -0
  175. data/external/win32-process/lib/win32/process.rb +561 -0
  176. data/external/windows-pr/README +145 -0
  177. data/external/windows-pr/doc/conversion_guide.txt +25 -0
  178. data/external/windows-pr/lib/windows/clipboard.rb +72 -0
  179. data/external/windows-pr/lib/windows/console.rb +323 -0
  180. data/external/windows-pr/lib/windows/device_io.rb +88 -0
  181. data/external/windows-pr/lib/windows/directory.rb +80 -0
  182. data/external/windows-pr/lib/windows/error.rb +313 -0
  183. data/external/windows-pr/lib/windows/eventlog.rb +120 -0
  184. data/external/windows-pr/lib/windows/file.rb +349 -0
  185. data/external/windows-pr/lib/windows/filesystem.rb +16 -0
  186. data/external/windows-pr/lib/windows/handle.rb +31 -0
  187. data/external/windows-pr/lib/windows/library.rb +76 -0
  188. data/external/windows-pr/lib/windows/limits.rb +13 -0
  189. data/external/windows-pr/lib/windows/memory.rb +117 -0
  190. data/external/windows-pr/lib/windows/msvcrt/buffer.rb +48 -0
  191. data/external/windows-pr/lib/windows/msvcrt/file.rb +18 -0
  192. data/external/windows-pr/lib/windows/msvcrt/string.rb +46 -0
  193. data/external/windows-pr/lib/windows/national.rb +557 -0
  194. data/external/windows-pr/lib/windows/path.rb +296 -0
  195. data/external/windows-pr/lib/windows/pipe.rb +77 -0
  196. data/external/windows-pr/lib/windows/process.rb +171 -0
  197. data/external/windows-pr/lib/windows/registry.rb +238 -0
  198. data/external/windows-pr/lib/windows/security.rb +89 -0
  199. data/external/windows-pr/lib/windows/service.rb +183 -0
  200. data/external/windows-pr/lib/windows/shell.rb +88 -0
  201. data/external/windows-pr/lib/windows/sound.rb +52 -0
  202. data/external/windows-pr/lib/windows/synchronize.rb +161 -0
  203. data/external/windows-pr/lib/windows/system_info.rb +70 -0
  204. data/external/windows-pr/lib/windows/unicode.rb +138 -0
  205. data/external/windows-pr/lib/windows/window.rb +22 -0
  206. data/iowa.gemspec +45 -0
  207. data/microprojects/DiskCache/LICENSE +28 -0
  208. data/microprojects/DiskCache/README +17 -0
  209. data/microprojects/DiskCache/external/package.rb +608 -0
  210. data/microprojects/DiskCache/external/test_support.rb +8 -0
  211. data/microprojects/DiskCache/setup.rb +22 -0
  212. data/microprojects/DiskCache/src/iowa/Association.rb +67 -0
  213. data/microprojects/DiskCache/src/iowa/Constants.rb +159 -0
  214. data/microprojects/DiskCache/src/iowa/DiskStore.rb +377 -0
  215. data/microprojects/DiskCache/src/iowa/Hash.rb +63 -0
  216. data/microprojects/DiskCache/src/iowa/Lockfile.rb +575 -0
  217. data/microprojects/DiskCache/src/iowa/Mutex.rb +142 -0
  218. data/microprojects/DiskCache/src/iowa/caches/DiskCache.rb +605 -0
  219. data/microprojects/DiskCache/src/iowa/caches/LRUCache.rb +287 -0
  220. data/microprojects/DiskCache/test/TC_DiskCache.rb +218 -0
  221. data/microprojects/LRUCache/LICENSE +28 -0
  222. data/microprojects/LRUCache/README +13 -0
  223. data/microprojects/LRUCache/external/package.rb +608 -0
  224. data/microprojects/LRUCache/external/test_support.rb +8 -0
  225. data/microprojects/LRUCache/setup.rb +22 -0
  226. data/microprojects/LRUCache/src/iowa/Association.rb +57 -0
  227. data/microprojects/LRUCache/src/iowa/Constants.rb +159 -0
  228. data/microprojects/LRUCache/src/iowa/Hash.rb +63 -0
  229. data/microprojects/LRUCache/src/iowa/Mutex.rb +129 -0
  230. data/microprojects/LRUCache/src/iowa/caches/LRUCache.rb +287 -0
  231. data/microprojects/LRUCache/test/TC_LRUCache.rb +65 -0
  232. data/microprojects/LinkedList/LICENSE +28 -0
  233. data/microprojects/LinkedList/README +13 -0
  234. data/microprojects/LinkedList/external/package.rb +608 -0
  235. data/microprojects/LinkedList/external/test_support.rb +8 -0
  236. data/microprojects/LinkedList/setup.rb +22 -0
  237. data/microprojects/LinkedList/src/iowa/LinkedList.rb +165 -0
  238. data/microprojects/LinkedList/test/TC_LinkedList.rb +42 -0
  239. data/microprojects/README +8 -0
  240. data/setup.rb +116 -0
  241. data/share/iowa/app_skeleton/Main.html +8 -0
  242. data/share/iowa/app_skeleton/Main.iwa +15 -0
  243. data/share/iowa/app_skeleton/app.cnf +48 -0
  244. data/share/iowa/app_skeleton/app.rb +58 -0
  245. data/share/iowa/app_skeleton/models/model.rb +49 -0
  246. data/src/ihc.rb +223 -0
  247. data/src/iowa.cgi +29 -0
  248. data/src/iowa.rb +637 -0
  249. data/src/iowa/AbstractCache.rb +96 -0
  250. data/src/iowa/AcceptLanguage.rb +76 -0
  251. data/src/iowa/Application.rb +928 -0
  252. data/src/iowa/ApplicationStats.rb +72 -0
  253. data/src/iowa/Association.rb +67 -0
  254. data/src/iowa/BindingsParser.rb +62 -0
  255. data/src/iowa/Breakpoint.rb +273 -0
  256. data/src/iowa/CSS.rb +564 -0
  257. data/src/iowa/Client.rb +192 -0
  258. data/src/iowa/Component.rb +405 -0
  259. data/src/iowa/ComponentProxy.rb +26 -0
  260. data/src/iowa/Config.rb +21 -0
  261. data/src/iowa/Constants.rb +226 -0
  262. data/src/iowa/Context.rb +218 -0
  263. data/src/iowa/ContextLogger.rb +16 -0
  264. data/src/iowa/DbPool.rb +222 -0
  265. data/src/iowa/DetachedComponent.rb +18 -0
  266. data/src/iowa/Dispatcher.rb +27 -0
  267. data/src/iowa/DynamicElements.rb +471 -0
  268. data/src/iowa/Element.rb +100 -0
  269. data/src/iowa/Email.rb +287 -0
  270. data/src/iowa/Extensions/AllExtensions.rb +4 -0
  271. data/src/iowa/Extensions/Class.rb +94 -0
  272. data/src/iowa/Extensions/Date.rb +88 -0
  273. data/src/iowa/Extensions/DateTime.rb +88 -0
  274. data/src/iowa/Extensions/Hash.rb +22 -0
  275. data/src/iowa/Extensions/Kernel.rb +6 -0
  276. data/src/iowa/Extensions/Numeric.rb +47 -0
  277. data/src/iowa/Extensions/Object.rb +11 -0
  278. data/src/iowa/Extensions/String.rb +60 -0
  279. data/src/iowa/Extensions/Time.rb +89 -0
  280. data/src/iowa/Extensions/TimeExtensions.rb +6 -0
  281. data/src/iowa/Form.rb +368 -0
  282. data/src/iowa/Hash.rb +85 -0
  283. data/src/iowa/ISAAC.rb +175 -0
  284. data/src/iowa/ImageSize.rb +279 -0
  285. data/src/iowa/IowaComponentMixins.rb +7 -0
  286. data/src/iowa/JSON-lexer.rb +296 -0
  287. data/src/iowa/JSON-objects.rb +201 -0
  288. data/src/iowa/KeyValueCoding.rb +91 -0
  289. data/src/iowa/LinkedList.rb +175 -0
  290. data/src/iowa/Loader.rb +22 -0
  291. data/src/iowa/Lockfile.rb +575 -0
  292. data/src/iowa/Logger.rb +74 -0
  293. data/src/iowa/Monkey.rb +20 -0
  294. data/src/iowa/Mutex.rb +142 -0
  295. data/src/iowa/Policy.rb +70 -0
  296. data/src/iowa/Pool.rb +243 -0
  297. data/src/iowa/PrettyException.rb +1091 -0
  298. data/src/iowa/Request.rb +244 -0
  299. data/src/iowa/Response.rb +133 -0
  300. data/src/iowa/Session.rb +354 -0
  301. data/src/iowa/SessionStats.rb +78 -0
  302. data/src/iowa/String.rb +65 -0
  303. data/src/iowa/Tag.rb +101 -0
  304. data/src/iowa/TemplateParser.rb +236 -0
  305. data/src/iowa/Util.rb +314 -0
  306. data/src/iowa/Webcache.rb +122 -0
  307. data/src/iowa/caches/BiLevelCache.rb +65 -0
  308. data/src/iowa/caches/ClassLimitedCache.rb +67 -0
  309. data/src/iowa/caches/DiskCache.rb +609 -0
  310. data/src/iowa/caches/DiskStore.rb +380 -0
  311. data/src/iowa/caches/LRUCache-alternative.rb +155 -0
  312. data/src/iowa/caches/LRUCache.rb +290 -0
  313. data/src/iowa/caches/SimpleLRUCache.rb +112 -0
  314. data/src/iowa/dispatchers/StandardDispatcher.rb +396 -0
  315. data/src/iowa/dispatchers/StandardDispatcherWithClassifier.rb +93 -0
  316. data/src/iowa/js/iowa_jsonrpc.js +381 -0
  317. data/src/iowa/js/jsonrpc.js +187 -0
  318. data/src/iowa/js/jsonrpc_async.js +261 -0
  319. data/src/iowa/loaders/DiskLoader.rb +50 -0
  320. data/src/iowa/loggers/Analogger.rb +54 -0
  321. data/src/iowa/loggers/AsyncLogger.rb +54 -0
  322. data/src/iowa/loggers/BitBucket.rb +38 -0
  323. data/src/iowa/loggers/Log4R.rb +13 -0
  324. data/src/iowa/loggers/Log4rLogger.rb +48 -0
  325. data/src/iowa/loggers/Logger.rb +29 -0
  326. data/src/iowa/loggers/RubyLogger.rb +9 -0
  327. data/src/iowa/pools/DBConnectionPool.rb +53 -0
  328. data/src/iowa/request/Apache.rb +90 -0
  329. data/src/iowa/request/EMHybrid.rb +59 -0
  330. data/src/iowa/request/ENV.rb +80 -0
  331. data/src/iowa/request/FCGI.rb +68 -0
  332. data/src/iowa/request/HTTPMachine.rb +75 -0
  333. data/src/iowa/request/Mongrel.rb +68 -0
  334. data/src/iowa/request/WEBrick.rb +48 -0
  335. data/src/iowa/version.rb +3 -0
  336. data/src/iowa/webrick/HTTPServer.rb +43 -0
  337. data/src/iowa/webrick/WEBrickServlet.rb +28 -0
  338. data/src/iowa_fcgi_handler.rb +101 -0
  339. data/src/iowa_httpmachine.rb +141 -0
  340. data/src/iowa_hybrid.rb +193 -0
  341. data/src/iowa_hybrid_cluster.rb +231 -0
  342. data/src/iowa_mongrel.rb +136 -0
  343. data/src/iowa_webrick.rb +194 -0
  344. data/src/iowa_webrick_legacy.rb +104 -0
  345. data/src/mod_iowa.rb +104 -0
  346. data/tcss.rb +61 -0
  347. data/test/README.windows +12 -0
  348. data/test/TC_AcceptLanguage.rb +61 -0
  349. data/test/TC_AppConfig.rb +43 -0
  350. data/test/TC_AppConfig/cgi/iowa.cgi +7 -0
  351. data/test/TC_AppConfig/doc/index.html +1 -0
  352. data/test/TC_AppConfig/iowa/Main.html +4 -0
  353. data/test/TC_AppConfig/iowa/Main.iwa +17 -0
  354. data/test/TC_AppConfig/iowa/README +1 -0
  355. data/test/TC_AppConfig/iowa/app.cnf +19 -0
  356. data/test/TC_AppConfig/iowa/app.rb +8 -0
  357. data/test/TC_AppConfig/webrick.rb +38 -0
  358. data/test/TC_Association.rb +29 -0
  359. data/test/TC_BiLevelCache.rb +71 -0
  360. data/test/TC_CGI_Adaptor.rb +55 -0
  361. data/test/TC_CGI_Adaptor/cgi/iowa.cgi +7 -0
  362. data/test/TC_CGI_Adaptor/doc/index.html +1 -0
  363. data/test/TC_CGI_Adaptor/iowa/Main.html +8 -0
  364. data/test/TC_CGI_Adaptor/iowa/Main.iwa +14 -0
  365. data/test/TC_CGI_Adaptor/iowa/README +1 -0
  366. data/test/TC_CGI_Adaptor/iowa/app.cnf +8 -0
  367. data/test/TC_CGI_Adaptor/iowa/app.rb +8 -0
  368. data/test/TC_CGI_Adaptor/webrick.rb +38 -0
  369. data/test/TC_CSS.rb +660 -0
  370. data/test/TC_ClassLimitedCache.rb +89 -0
  371. data/test/TC_Classifier.rb +80 -0
  372. data/test/TC_DbPool.rb +127 -0
  373. data/test/TC_DiskCache.rb +218 -0
  374. data/test/TC_Hybrid.rb +58 -0
  375. data/test/TC_Hybrid/doc/thing.txt +1 -0
  376. data/test/TC_Hybrid/iowa/Main.html +3 -0
  377. data/test/TC_Hybrid/iowa/Main.iwa +7 -0
  378. data/test/TC_Hybrid/iowa/NewPage.html +1 -0
  379. data/test/TC_Hybrid/iowa/NewPage.iwa +5 -0
  380. data/test/TC_Hybrid/iowa/app.cnf +10 -0
  381. data/test/TC_Hybrid/iowa/app.rb +5 -0
  382. data/test/TC_IOWAFunctions/doc/Ajax1.html +1 -0
  383. data/test/TC_IOWAFunctions/doc/Ajax1.iwa +1 -0
  384. data/test/TC_IOWAFunctions/doc/index.html +1 -0
  385. data/test/TC_IOWAFunctions/doc/js/dojo.js +9686 -0
  386. data/test/TC_IOWAFunctions/iowa/Ajax1.html +40 -0
  387. data/test/TC_IOWAFunctions/iowa/Ajax1.iwa +23 -0
  388. data/test/TC_IOWAFunctions/iowa/AjaxWidget.iwa +19 -0
  389. data/test/TC_IOWAFunctions/iowa/AjaxWidget.view +22 -0
  390. data/test/TC_IOWAFunctions/iowa/DanielTest.html +9 -0
  391. data/test/TC_IOWAFunctions/iowa/DanielTest.iwa +10 -0
  392. data/test/TC_IOWAFunctions/iowa/IntervalWidget.html +1 -0
  393. data/test/TC_IOWAFunctions/iowa/IntervalWidget.iwa +14 -0
  394. data/test/TC_IOWAFunctions/iowa/Main.html +1 -0
  395. data/test/TC_IOWAFunctions/iowa/NestedRepeat1.html +12 -0
  396. data/test/TC_IOWAFunctions/iowa/NestedRepeat1.iwa +24 -0
  397. data/test/TC_IOWAFunctions/iowa/RPCResponse.iwa +7 -0
  398. data/test/TC_IOWAFunctions/iowa/RPCResponse.view +1 -0
  399. data/test/TC_IOWAFunctions/iowa/Repeat1.iwa +31 -0
  400. data/test/TC_IOWAFunctions/iowa/Repeat1.view +9 -0
  401. data/test/TC_IOWAFunctions/iowa/Repeat2.iwa +32 -0
  402. data/test/TC_IOWAFunctions/iowa/Repeat2.view +11 -0
  403. data/test/TC_IOWAFunctions/iowa/Repeat3.iwa +44 -0
  404. data/test/TC_IOWAFunctions/iowa/Repeat3.view +18 -0
  405. data/test/TC_IOWAFunctions/iowa/TesCon.html +1 -0
  406. data/test/TC_IOWAFunctions/iowa/TesCon.iwa +5 -0
  407. data/test/TC_IOWAFunctions/iowa/app.cnf +19 -0
  408. data/test/TC_IOWAFunctions/iowa/app.rb +9 -0
  409. data/test/TC_IOWAFunctions/iowa/mapfile.cnf +8 -0
  410. data/test/TC_ISAAC.rb +52 -0
  411. data/test/TC_ImageSize.rb +84 -0
  412. data/test/TC_ImageSize/img.bmp +0 -0
  413. data/test/TC_ImageSize/img.gif +0 -0
  414. data/test/TC_ImageSize/img.jpg +0 -0
  415. data/test/TC_ImageSize/img.pcx +0 -0
  416. data/test/TC_ImageSize/img.pgm +7144 -0
  417. data/test/TC_ImageSize/img.png +0 -0
  418. data/test/TC_ImageSize/img.ppm +0 -0
  419. data/test/TC_ImageSize/img.psd +0 -0
  420. data/test/TC_ImageSize/img.tiff +0 -0
  421. data/test/TC_ImageSize/img.xbm +22 -0
  422. data/test/TC_KeyValueCoding.rb +35 -0
  423. data/test/TC_LRUCache.rb +296 -0
  424. data/test/TC_LinkedList.rb +46 -0
  425. data/test/TC_Lockfile.rb +106 -0
  426. data/test/TC_Minimal.rb +45 -0
  427. data/test/TC_Minimal/app.cnf +8 -0
  428. data/test/TC_Minimal/cgi-bin/iowa.cgi +11 -0
  429. data/test/TC_Minimal/doc/index.html +1 -0
  430. data/test/TC_Minimal/iowa/Main.html +1 -0
  431. data/test/TC_Minimal/iowa/README +1 -0
  432. data/test/TC_Minimal/iowa/app.rb +3 -0
  433. data/test/TC_Minimal/webrick.rb +38 -0
  434. data/test/TC_Mongrel.rb +58 -0
  435. data/test/TC_Mongrel/doc/thing.txt +1 -0
  436. data/test/TC_Mongrel/iowa/Main.html +3 -0
  437. data/test/TC_Mongrel/iowa/Main.iwa +7 -0
  438. data/test/TC_Mongrel/iowa/NewPage.html +1 -0
  439. data/test/TC_Mongrel/iowa/NewPage.iwa +5 -0
  440. data/test/TC_Mongrel/iowa/app.cnf +10 -0
  441. data/test/TC_Mongrel/iowa/app.rb +5 -0
  442. data/test/TC_NoSubclass.rb +56 -0
  443. data/test/TC_NoSubclass/cgi/iowa.cgi +7 -0
  444. data/test/TC_NoSubclass/doc/index.html +1 -0
  445. data/test/TC_NoSubclass/iowa/Main.html +8 -0
  446. data/test/TC_NoSubclass/iowa/Main.iwa +14 -0
  447. data/test/TC_NoSubclass/iowa/README +1 -0
  448. data/test/TC_NoSubclass/iowa/app.cnf +8 -0
  449. data/test/TC_NoSubclass/iowa/app.rb +5 -0
  450. data/test/TC_NoSubclass/webrick.rb +38 -0
  451. data/test/TC_Pool.rb +139 -0
  452. data/test/TC_RenderedCache/doc/thing.txt +1 -0
  453. data/test/TC_RenderedCache/iowa/BigPage.html +1 -0
  454. data/test/TC_RenderedCache/iowa/BigPage.iwa +12 -0
  455. data/test/TC_RenderedCache/iowa/Main.html +3 -0
  456. data/test/TC_RenderedCache/iowa/Main.iwa +7 -0
  457. data/test/TC_RenderedCache/iowa/NewPage.html +1 -0
  458. data/test/TC_RenderedCache/iowa/NewPage.iwa +11 -0
  459. data/test/TC_RenderedCache/iowa/app.cnf +13 -0
  460. data/test/TC_RenderedCache/iowa/app.rb +5 -0
  461. data/test/TC_RenderedCache/iowa/mapfile.map +4 -0
  462. data/test/TC_ResourceURL.rb +73 -0
  463. data/test/TC_ResourceURL/iowa/Main.html +2 -0
  464. data/test/TC_ResourceURL/iowa/Main.iwa +10 -0
  465. data/test/TC_ResourceURL/iowa/app.cnf +10 -0
  466. data/test/TC_ResourceURL/iowa/app.rb +5 -0
  467. data/test/TC_SimpleDetached.rb +41 -0
  468. data/test/TC_StandardDispatcher.rb +362 -0
  469. data/test/TC_StandardDispatcherWithClassifier.rb +358 -0
  470. data/test/TC_String.rb +24 -0
  471. data/test/TC_Tag.rb +41 -0
  472. data/test/TC_Webrick.rb +56 -0
  473. data/test/TC_Webrick/doc/thing.txt +1 -0
  474. data/test/TC_Webrick/iowa/Main.html +3 -0
  475. data/test/TC_Webrick/iowa/Main.iwa +7 -0
  476. data/test/TC_Webrick/iowa/NewPage.html +1 -0
  477. data/test/TC_Webrick/iowa/NewPage.iwa +5 -0
  478. data/test/TC_Webrick/iowa/app.cnf +10 -0
  479. data/test/TC_Webrick/iowa/app.rb +5 -0
  480. data/test/tc_template.rb +15 -0
  481. data/test/tests.conf +19 -0
  482. data/utils/CVS/Entries +3 -0
  483. data/utils/CVS/Repository +1 -0
  484. data/utils/CVS/Root +1 -0
  485. data/utils/QuickCert-1.0.2.tar.gz +0 -0
  486. data/utils/QuickCert-1.0.2/InstalledFiles +7 -0
  487. data/utils/QuickCert-1.0.2/MANIFEST +10 -0
  488. data/utils/QuickCert-1.0.2/Makefile +15 -0
  489. data/utils/QuickCert-1.0.2/README +56 -0
  490. data/utils/QuickCert-1.0.2/bin/QuickCert +355 -0
  491. data/utils/QuickCert-1.0.2/config.save +12 -0
  492. data/utils/QuickCert-1.0.2/data/examples/ruby/QuickCert/README +60 -0
  493. data/utils/QuickCert-1.0.2/data/examples/ruby/QuickCert/drbssl_c.rb +26 -0
  494. data/utils/QuickCert-1.0.2/data/examples/ruby/QuickCert/drbssl_s.rb +35 -0
  495. data/utils/QuickCert-1.0.2/data/examples/ruby/QuickCert/qc_config +21 -0
  496. data/utils/QuickCert-1.0.2/lib/QuickCert/defaults.rb +28 -0
  497. data/utils/QuickCert-1.0.2/setup.rb +1312 -0
  498. data/utils/iowa_apps +422 -0
  499. data/utils/smtp_sink.rb +9 -0
  500. data/utils/startup_template.cnf +27 -0
  501. data/utils/startup_template.rb +73 -0
  502. metadata +551 -0
@@ -0,0 +1,314 @@
1
+ require 'pathname'
2
+
3
+ class Pathname
4
+ def length
5
+ n = 0
6
+ self.each_filename {n += 1}
7
+ n
8
+ end
9
+ end
10
+
11
+ module Iowa
12
+ class DataTable < Hash
13
+
14
+ alias :old_get :[]
15
+ def [](idx)
16
+ if old_get(idx).instance_of? Array
17
+ old_get(idx)[0]
18
+ else
19
+ old_get(idx)
20
+ end
21
+ end
22
+
23
+ def >>(idx)
24
+ old_get(idx)
25
+ end
26
+
27
+ #alias :set :[]=
28
+ def set(k,v)
29
+ if old_get(k).instance_of? Array
30
+ old_get(k) << v
31
+ else
32
+ self[k] = [v]
33
+ end
34
+ end
35
+
36
+ def <<(hv)
37
+ if hv.instance_of? Hash
38
+ hv.each {|k,v| set(k,v)}
39
+ elsif hv.instance_of? Array
40
+ hv.each {|k| set(k,true)}
41
+ else
42
+ set(hv,true)
43
+ end
44
+ end
45
+
46
+ alias :old_each :each
47
+ def each
48
+ old_each do |key,ary|
49
+ if ary.instance_of? Array
50
+ ary.each do |val|
51
+ yield key,val
52
+ end
53
+ else
54
+ yield key,ary
55
+ end
56
+ end
57
+ end
58
+ end
59
+
60
+ module R
61
+ Table = Iowa::DataTable
62
+ end
63
+
64
+ module Util
65
+ def Util.hash_from_array(arr)
66
+ h = {}; arr.each {|x| h[x] = true}; h
67
+ end
68
+
69
+ def Util.escapeHTML(string)
70
+ string.gsub(/&/n, '&amp;').gsub(/\"/n, '&quot;').gsub(/>/n, '&gt;').gsub(/</n, '&lt;')
71
+ end
72
+
73
+ def Util.unescapeHTML(string)
74
+ string.gsub(/&(.*?);/n) do
75
+ match = $1.dup
76
+ case match
77
+ when /\Aamp\z/ni then '&'
78
+ when /\Aquot\z/ni then '"'
79
+ when /\Agt\z/ni then '>'
80
+ when /\Alt\z/ni then '<'
81
+ when /\A#0*(\d+)\z/n then
82
+ if Integer($1) < 256
83
+ Integer($1).chr
84
+ else
85
+ if Integer($1) < 65536 and ($KCODE[0] == ?u or $KCODE[0] == ?U)
86
+ [Integer($1)].pack("U")
87
+ else
88
+ "&##{$1};"
89
+ end
90
+ end
91
+ when /\A#x([0-9a-f]+)\z/ni then
92
+ if $1.hex < 256
93
+ $1.hex.chr
94
+ else
95
+ if $1.hex < 65536 and ($KCODE[0] == ?u or $KCODE[0] == ?U)
96
+ [$1.hex].pack("U")
97
+ else
98
+ "&#x#{$1};"
99
+ end
100
+ end
101
+ else
102
+ "&#{match};"
103
+ end
104
+ end
105
+ end
106
+
107
+ def Util.escape(string)
108
+ string.to_s.gsub(/([^ a-zA-Z0-9_.-]+)/n) do
109
+ '%' + $1.unpack('H2' * $1.size).join('%').upcase
110
+ end.tr(' ', '+')
111
+ end
112
+
113
+ def Util.unescape(string)
114
+ string.to_s.tr('+', ' ').gsub(/((?:%[0-9a-fA-F]{2})+)/n) do
115
+ [$1.delete('%')].pack('H*')
116
+ end
117
+ end
118
+
119
+ def wrap(txt, prefix='', linelen=76)
120
+ return unless txt && !txt.empty?
121
+ work = txt
122
+ textLen = linelen - prefix.length
123
+ patt = Regexp.new("^(.{0,#{textLen}})[ \n]")
124
+ next_prefix = prefix.tr("^ ", " ")
125
+
126
+ res = []
127
+
128
+ while work.length > textLen
129
+ if work =~ patt
130
+ res << $1
131
+ work.slice!(0, $&.length)
132
+ else
133
+ res << work.slice!(0, textLen)
134
+ end
135
+ end
136
+ res << work if work.length.nonzero?
137
+ (prefix + res.join("\r\n" + next_prefix))
138
+ end
139
+
140
+ def Util.get__set_args(args)
141
+ if args.kind_of?(Array)
142
+ val = args.shift
143
+ args = args.shift
144
+ else
145
+ val = args
146
+ args = nil
147
+ end
148
+ return [val,args]
149
+ end
150
+
151
+ def Util.get_cache(args = nil, extraconf = nil, conf = Iowa.config[Capplication], conf_item = Csessioncache,tools_only = false)
152
+ val,args = get__set_args(args)
153
+
154
+ val = conf[conf_item][Cclass] unless val
155
+ args = conf[conf_item].dup || {} unless args.respond_to?(:empty?) and !args.empty?
156
+ args.delete(Cclass)
157
+ args.merge!(extraconf) if extraconf
158
+ args = [{:maxsize => conf[conf_item][Cmaxsize], :ttl => conf[conf_item][Cttl]}] if (args.respond_to?(:length) and args.length == 0) or !args
159
+ if val.class.name == CClass
160
+ val.new(args)
161
+ elsif val.respond_to?(:include?) and val.respond_to?(:[]) and val.respond_to?(:[]=) and !val.respond_to?(:capitalize)
162
+ val
163
+ else
164
+ # Turn it into a string and figure things out.
165
+ klass = find_class(val,'iowa/caches',[Iowa.config[Capplication][Croot_path], iowa_inc_paths('iowa/caches'),$:].flatten)
166
+ if klass
167
+ if tools_only
168
+ [klass,args]
169
+ else
170
+ klass.new(args)
171
+ end
172
+ else
173
+ raise Iowa::NoCacheFound
174
+ end
175
+ end
176
+ end
177
+
178
+ def Util.get_dispatcher(args = nil)
179
+ conf = Iowa.config[Capplication]
180
+ val,args = get__set_args(args)
181
+
182
+ val = conf[Cdispatcher][Cclass] unless val
183
+ args = conf[Cdispatcher] unless args.respond_to?(:empty?) and !args.empty?
184
+
185
+ if val.class.name == CClass
186
+ val.new(args)
187
+ elsif val.respond_to?(:handleRequest?) and val.respond_to?(:dispatch)
188
+ val
189
+ else
190
+ klass = Util.find_class(val,'iowa/dispatchers',[conf[Croot_path], iowa_inc_paths('iowa/dispatchers'),$:].flatten)
191
+ if klass
192
+ klass.new(args)
193
+ else
194
+ raise Iowa::NoDispatcherFound
195
+ end
196
+ end
197
+ end
198
+
199
+ def Util.get_policy(args = nil)
200
+ conf = Iowa.config[Capplication]
201
+ val,args = get__set_args(args)
202
+
203
+ val = conf[Cpolicy][Cclass] unless val
204
+ args = conf[Cpolicy] unless args.respond_to?(:empty?) and !args.empty?
205
+
206
+ if val.class.name == CClass
207
+ val.new(args)
208
+ elsif val.respond_to?(:new_session_key) and val.respond_to?(:validate_session)
209
+ val
210
+ else
211
+ klass = Util.find_class(val,'iowa/policies',[conf[Croot_path], iowa_inc_paths('iowa/policies'),$:].flatten)
212
+ if klass
213
+ klass.new(args)
214
+ else
215
+ raise Iowa::NoPolicyFound
216
+ end
217
+ end
218
+ end
219
+
220
+ def Util.get_logger(args = nil)
221
+ conf = Iowa.config
222
+ val,args = get__set_args(args)
223
+
224
+ val = conf[Clogger][Cclass] unless val
225
+ #args = conf[Clogger][Cargs] unless args.respond_to?(:empty?) and !args.empty?
226
+
227
+ if val.class.name == CClass
228
+ val.new(args)
229
+ elsif val.respond_to?(:warn) and val.respond_to?(:info)
230
+ val
231
+ else
232
+ klass = Util.find_class(val,'iowa/loggers',[conf[Capplication][Croot_path], iowa_inc_paths('iowa/loggers'),$:].flatten)
233
+ if klass
234
+ #klass.new(*args)
235
+ klass.new
236
+ else
237
+ raise Iowa::NoLoggerFound
238
+ end
239
+ end
240
+ end
241
+
242
+ def Util.iowa_inc_paths(suffix)
243
+ $:.map do |p|
244
+ File.join(p,suffix)
245
+ end.select do |p|
246
+ FileTest.exist? p
247
+ end
248
+ end
249
+
250
+ def Util.path_combinations_worker(destination,items,path)
251
+ if items.length > 0
252
+ j = items.shift
253
+ j.each {|x| path_combinations_worker(destination,items.dup,"#{path}#{File::SEPARATOR}#{x}")}
254
+ else
255
+ destination.push path
256
+ end
257
+ end
258
+
259
+ def Util.path_combinations(items,path = '')
260
+ r = []
261
+ path_combinations_worker(r,items,path)
262
+ r
263
+ end
264
+
265
+ def Util.find_class__match_path(match,paths)
266
+ match_without_suffix = match.sub(/\.\w+$/,'')
267
+ klass_name_paths = paths.select {|p| match.index(p) == 0}.
268
+ sort_by {|p| Pathname.new(p).length}
269
+ klass_name_path = klass_name_paths.last
270
+ if klass_name_path
271
+ match_without_suffix[klass_name_path.length..-1]
272
+ else
273
+ nil
274
+ end
275
+ end
276
+
277
+ def Util.find_class(val,classpath_prefix,places)
278
+ thing = Iowa::String.new(val.to_s)
279
+ pieces = thing.split(/::|#{File::SEPARATOR}/)
280
+ parts = []
281
+ pieces.each do |piece|
282
+ x = [piece]
283
+ x.push piece.snake_case if piece != piece.snake_case
284
+ x.push piece.constant_case if piece != piece.constant_case
285
+ x.push piece.snake_case.constant_case if piece != piece.constant_case
286
+ parts.push x
287
+ end
288
+ klass = nil
289
+ places.each do |place|
290
+ has_suffix = parts.last.first =~ /\.\w+$/
291
+ paths = path_combinations(parts.dup,Iowa::String.new(place))
292
+ unless has_suffix
293
+ paths.collect! {|x| x = x + '.rb'}
294
+ end
295
+ match = paths.select do |path|
296
+ FileTest.exists? path
297
+ end
298
+ if match.first
299
+ require match.first
300
+ klass_name = find_class__match_path(match.first,places).sub(/^#{File::SEPARATOR}/,'')
301
+ klass_name = "#{classpath_prefix}#{File::SEPARATOR}#{klass_name}" if klass_name and klass_name !~ /^iowa/i
302
+ if klass_name
303
+ klass = klass_name.split(File::SEPARATOR).collect do |x|
304
+ Iowa::String.new(x).constant_case
305
+ end.inject(Object) { |o,n| o.const_get n }
306
+ break
307
+ end
308
+ end
309
+ end
310
+ klass
311
+ end
312
+
313
+ end
314
+ end
@@ -0,0 +1,122 @@
1
+ require 'net/http'
2
+ require 'iowa/caches/LRUCache'
3
+
4
+ module Iowa
5
+ class Webcache
6
+
7
+ unless Object.const_defined?(:WCLCacheItem)
8
+ WCLCacheItem = Struct.new('WCLCacheItem', :expires, :etag, :last_modified)
9
+ end
10
+
11
+ def initialize(cache_size = 100)
12
+ @cache = Iowa::LRUCache.new(cache_size)
13
+ end
14
+
15
+ def new_cache_item(query)
16
+ item = WCLCacheItem.new
17
+ item.etag = query['etag']
18
+ if query['expires']
19
+ begin
20
+ item.expires = Date.parse(query['expires']).to_time
21
+ rescue Exception
22
+ end
23
+ else
24
+ # Expire 30 seconds from now if there is no expiration.
25
+ item.expires = Time.now + 30
26
+ end
27
+
28
+ if query['last_modified']
29
+ begin
30
+ item.last_modified = Date.parse(query['last_modified']).to_time
31
+ rescue Exception
32
+ end
33
+ end
34
+ item
35
+ end
36
+
37
+ def get_url_head(url)
38
+ tries = 0
39
+ response = {}
40
+ if /^http/.match(url)
41
+ m = /^http[s]*:\/\/([^\/]*)(.*)/.match(url)
42
+ site = m[1]
43
+ site, port = site.split(':')
44
+ port ||= 80
45
+ path = m[2]
46
+ begin
47
+ http = Net::HTTP.new(site,port)
48
+ http.open_timeout = 3
49
+ http.start {|h| response = h.head(path)}
50
+ rescue Exception
51
+ tries += 1
52
+ retry if tries < 1
53
+ end
54
+ end
55
+ response
56
+ end
57
+
58
+ def get_url(url)
59
+ tries = 0
60
+ response = {}
61
+ if /^http/.match(url)
62
+ m = /^http[s]*:\/\/([^\/]*)(.*)/.match(url)
63
+ site = m[1]
64
+ site, port = site.split(':')
65
+ port ||= 80
66
+ path = m[2]
67
+ begin
68
+ http = Net::HTTP.new(site,port)
69
+ http.open_timeout = 3
70
+ http.start {|h| response = h.get(path)}
71
+ rescue Exception
72
+ tries += 1
73
+ retry if tries < 1
74
+ end
75
+ end
76
+ response.kind_of?(Array) ? response[1] : response.respond_to?(:body) ? response.body : ''
77
+ end
78
+
79
+ def set_cache(url)
80
+ @cache[url] = new_cache_item(get_url_head(url))
81
+ end
82
+
83
+ def [](url)
84
+ if item = @cache[url]
85
+ # Check
86
+
87
+ # If expires < now or no expires, check.
88
+ if (item.expires.nil?) or (item.expires && item.expires < Time.now)
89
+ query = new_cache_item(get_url_head(url))
90
+
91
+ # If there is an etag, compare.
92
+ if query.etag
93
+ if item.etag == query.etag
94
+ nil
95
+ else
96
+ @cache[url] = query
97
+ get_url(url)
98
+ end
99
+ elsif query.last_modified
100
+ if query.last_modified > item.last_modified
101
+ @cache[url] = query
102
+ get_url(url)
103
+ else
104
+ nil
105
+ end
106
+ else
107
+ @cache[url] = new_cache_item(query)
108
+ get_url(url)
109
+ end
110
+ else
111
+ nil
112
+ end
113
+ else
114
+ # Initial Fetch
115
+ set_cache(url)
116
+
117
+ # Since it's the initial fetch, it is new and must be loaded.
118
+ get_url(url)
119
+ end
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,65 @@
1
+ require 'iowa/caches/LRUCache'
2
+ require 'iowa/caches/DiskCache'
3
+
4
+ module Iowa
5
+ module Caches
6
+ class BiLevelCache < Iowa::Caches::LRUCache
7
+ # The bilevel cache takes two sets or arguments. The first
8
+ # is for itself, and the second is for the L2 cache that it
9
+ # will use. By default this cache will use an Iowa::Caches::DiskCache,
10
+ # but it can also use any other cache that follows the same API.
11
+
12
+ def initialize(l1_args,l2_args)
13
+ oargs = l2_args
14
+ l2_args = Iowa::Hash.new
15
+ l2_args.step_merge!(oargs)
16
+ l2_args.stringify_keys!
17
+ klass = l2_args[Cklass] || Iowa::Caches::DiskCache
18
+ @l2 = klass.new(l2_args)
19
+ super(l1_args)
20
+ add_finalizer {|key,obj| @l2[key] = obj}
21
+ end
22
+
23
+ # Return the l2 cache. Useful for things like cache.l2.size.
24
+
25
+ def l2
26
+ @l2
27
+ end
28
+
29
+ # Check to see if either the L1 or L2 caches contain the given key.
30
+
31
+ def include?(key)
32
+ super || @l2.include?(key)
33
+ end
34
+
35
+ # Return the element identified by the given key. If it's not in
36
+ # the L1 cache, the code checks the L2 cache. If the value is in
37
+ # the L2 cache, it deletes it from the L2 and inserts it back into
38
+ # the L1.
39
+
40
+ def [](key)
41
+ r = nil
42
+ @mutex.lock
43
+ if @lookup.has_key? key
44
+ r = super
45
+ elsif @l2.include?(key)
46
+ self[key] = r = @l2[key]
47
+ @l2.delete(key)
48
+ end
49
+ @mutex.unlock
50
+ r
51
+ end
52
+
53
+ # Check to see if the key is in the L2 cache, and remove it from
54
+ # there if it is, then insert the key/value into the L1 cache.
55
+
56
+ def []=(key,val)
57
+ @mutex.lock
58
+ @l2.delete(key) if @l2.include?(key)
59
+ super(key,val)
60
+ @mutex.unlock
61
+ end
62
+
63
+ end
64
+ end
65
+ end