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,74 @@
1
+
2
+ # Iowa::Logger is the base class that IOWA loggers all inherit from.
3
+ #
4
+
5
+ module Iowa
6
+ class Logger
7
+
8
+ Levels = {:debug => true, :info => true, :warning => true, :error => true, :fatal => true}
9
+
10
+ @store = {}
11
+
12
+ def self.[](val)
13
+ @store[val]
14
+ end
15
+
16
+ def self.[]=(key,val)
17
+ @store[key] = val
18
+ end
19
+
20
+ def initialize(*args)
21
+ configure
22
+ open
23
+ end
24
+
25
+ def configure
26
+ end
27
+
28
+ def open
29
+ end
30
+
31
+ def level
32
+ @logger.level
33
+ end
34
+
35
+ def level=(lvl)
36
+ l = normalize_level(lvl)
37
+ @level = l
38
+ @logger.level = l
39
+ end
40
+
41
+ def normalize_level(lvl)
42
+ l = lvl.to_s.downcase.intern
43
+ l = :debug unless Levels.has_key?(l)
44
+ l
45
+ end
46
+
47
+ def debug(msg)
48
+ @logger.debug msg
49
+ end
50
+
51
+ def info(msg)
52
+ @logger.info msg
53
+ end
54
+
55
+ def warn(msg)
56
+ @logger.warn msg
57
+ end
58
+
59
+ def error(msg)
60
+ @logger.error msg
61
+ end
62
+
63
+ def fatal(msg)
64
+ @logger.fatal msg
65
+ end
66
+
67
+ def close
68
+ @logger.close
69
+ end
70
+
71
+ def flush; end
72
+
73
+ end
74
+ end
@@ -0,0 +1,20 @@
1
+ module Iowa
2
+ # Monkey see, Monkey do.
3
+ #
4
+ # That is, use this class to deal with @ usage in templates that doesn't match any existing method.
5
+ #
6
+ class Monkey
7
+ def initialize(val = '')
8
+ @val = val
9
+ end
10
+
11
+ def method_missing(meth)
12
+ Monkey.new("#{@val}.#{meth}")
13
+ end
14
+
15
+ def to_s
16
+ @val
17
+ end
18
+ end
19
+ end
20
+
@@ -0,0 +1,142 @@
1
+ module Iowa
2
+
3
+ # Iowa::Mutex is a slight modification of the standard Ruby Mutex class.
4
+ # This class changes the array operations used to manage the queue of
5
+ # threads waiting for a lock in order to get better memory management
6
+ # behavior from the array. This mutex will also not block if the thread
7
+ # holding a lock on a mutex calls lock on that mutex again. If nested
8
+ # locking occurs, the locks must be matched by an equal number of unlocks
9
+ # before the mutex will actually be unlocked.
10
+
11
+ class Mutex
12
+
13
+ # Creates a new Mutex.
14
+
15
+ def initialize
16
+ @waiting = []
17
+ @locked = false;
18
+ @nested_locks = 0
19
+ @waiting.taint # enable tainted comunication
20
+ self.taint
21
+ end
22
+
23
+
24
+ # Returns the thread that holds the lock or +false+ if the mutex is not locked.
25
+
26
+ def locked?
27
+ @locked
28
+ end
29
+
30
+
31
+ # Attempts to obtain the lock and returns immediately. Returns +true+ if the
32
+ # lock was granted.
33
+
34
+ def try_lock
35
+ @nested_locks += 1 and return true if @locked == Thread.current
36
+ result = false
37
+ Thread.critical = true
38
+ unless @locked
39
+ @locked = Thread.current
40
+ result = true
41
+ end
42
+ Thread.critical = false
43
+ result
44
+ end
45
+
46
+
47
+ # Attempts to obtain a lock on the mutex. Block if a lock can not be
48
+ # obtained immediately and waits until the lock can be obtained.
49
+ # If this thread already holds this lock, returns immediately.
50
+ # Returns the mutex.
51
+
52
+ def lock
53
+ if @locked == Thread.current
54
+ @nested_locks += 1
55
+ else
56
+ while (Thread.critical = true; @locked)
57
+ @waiting.unshift Thread.current
58
+ Thread.stop
59
+ end
60
+ @locked = Thread.current
61
+ Thread.critical = false
62
+ end
63
+ self
64
+ end
65
+
66
+
67
+ # Releases this thread's lock on the mutex and wakes the next thread
68
+ # waiting for the lock, if any.
69
+
70
+ def unlock
71
+ return unless @locked
72
+ if @nested_locks > 0
73
+ @nested_locks -= 1
74
+ else
75
+ Thread.critical = true
76
+ @locked = false
77
+ begin
78
+ t = @waiting.pop
79
+ t.wakeup if t
80
+ rescue ThreadError
81
+ retry
82
+ end
83
+ Thread.critical = false
84
+ begin
85
+ t.run if t
86
+ rescue ThreadError
87
+ end
88
+ end
89
+ self
90
+ end
91
+
92
+
93
+ # If the mutex is locked, unlocks the mutex, wakes one waiting thread, and
94
+ # yields in a critical section.
95
+
96
+ def exclusive_unlock
97
+ return unless @locked
98
+ if @nested_locks > 0
99
+ @nested_locks -= 1
100
+ else
101
+ Thread.exclusive do
102
+ @locked = false
103
+ begin
104
+ t = @waiting.pop
105
+ t.wakeup if t
106
+ rescue ThreadError
107
+ retry
108
+ end
109
+ yield
110
+ end
111
+ end
112
+ self
113
+ end
114
+
115
+
116
+ # Obtains a lock, runs the block, and releases the lock when the block
117
+ # completes. See the example under Mutex.
118
+
119
+ def synchronize
120
+ lock
121
+ begin
122
+ yield
123
+ ensure
124
+ unlock
125
+ end
126
+ end
127
+
128
+ def synchronize_unless(cond)
129
+ unless cond
130
+ lock
131
+ begin
132
+ yield
133
+ ensure
134
+ unlock
135
+ end
136
+ else
137
+ yield
138
+ end
139
+ end
140
+
141
+ end
142
+ end
@@ -0,0 +1,70 @@
1
+ require 'iowa/Constants'
2
+ require 'digest/sha1'
3
+
4
+ module Iowa
5
+
6
+ # An instance of Policy implements all of the functions
7
+ # surrounding session key creation and validation as well
8
+ # as the handling of getting/setting request and action
9
+ # ids in a URL or in a cookie. This class implements the
10
+ # default IOWA policies in these areas and also serves
11
+ # as a template for the API that other policy classes
12
+ # must deliver.
13
+
14
+ class Policy
15
+
16
+ RNDSesFormat = '%08x'.freeze
17
+
18
+ MatchURL = Regexp.new('(/*(?:[^/]*/*)*?)(\w+\-\w+\-\w+\.\w+\.[\w\.]+)*(-\w+)?$')
19
+
20
+ def initialize(args)
21
+ args = {:prng => Kernel} if args and args.empty?
22
+ args[:prng] ||= Kernel
23
+ @prng = args[:prng]
24
+ end
25
+
26
+ def rand(num)
27
+ @prng.rand(num)
28
+ end
29
+
30
+ def new_session_key
31
+ r1 = sprintf(RNDSesFormat,@prng.rand(2147483647))
32
+ r2 = sprintf(RNDSesFormat,@prng.rand(2147483647))
33
+ tn = Time.now
34
+ t = Digest::SHA1.hexdigest("#{tn.tv_sec}#{tn.tv_usec}")[C_0to7]
35
+ id = "#{r1}-#{r2}-#{t}"
36
+ end
37
+
38
+ def getIDs(url)
39
+ if (match = MatchURL.match url)
40
+ urlRoot = match[1]
41
+ remainder = match[2]? match[2] : C_empty
42
+ urlRoot.sub!(/\/$/,C_empty)
43
+ sessionID, requestID, actionID = remainder.split(C_dot,3)
44
+ [urlRoot, sessionID, requestID, actionID]
45
+ else
46
+ [nil,nil,nil,nil]
47
+ end
48
+ end
49
+
50
+ def baseURL(context)
51
+ context.urlRoot != '' ? "#{context.urlRoot}" : '/'
52
+ end
53
+
54
+ def sessionURL(context)
55
+ "#{context.urlRoot}/#{context.sessionID}"
56
+ end
57
+
58
+ def actionURL(context)
59
+ Iowa.app.location.to_s != C_empty ?
60
+ "#{context.urlRoot}/#{context.sessionID}.#{context.requestID}.#{context.elementID}-#{Iowa.app.location}" :
61
+ "#{context.urlRoot}/#{context.sessionID}.#{context.requestID}.#{context.elementID}"
62
+ end
63
+
64
+ def locationFlag(context)
65
+ Iowa.app.location.to_s != C_empty ?
66
+ "-#{Iowa.app.location}" : C_empty
67
+ end
68
+
69
+ end
70
+ end
@@ -0,0 +1,243 @@
1
+ # Adapted from the Pool class in Facets, with additional smarts to enable it
2
+ # to fullfill my needs as a dbpool that will monitor connections and recover
3
+ # from failed connections (such as when the database is restarted) automatically,
4
+ # so that the application using the pool never knows about it.
5
+
6
+ require 'thread'
7
+ require 'monitor'
8
+
9
+ module Iowa
10
+ class Pool < Array
11
+
12
+ attr_accessor :start_size, :max_size, :min_size, :max_age, :monitor_interval, :logger, :in_use_count
13
+
14
+ include MonitorMixin
15
+
16
+ def self.StartSize(val = nil)
17
+ #@start_size ||= nil
18
+ (val or !@start_size) ? (@start_size = val || 1) : @start_size
19
+ end
20
+ def self.start_size(val = nil);StartSize(val);end
21
+
22
+ def self.MaxSize(val = nil)
23
+ #@max_size ||= nil
24
+ (val or !@max_size) ? (@max_size = val || 4) : @max_size
25
+ end
26
+ def self.max_size(val = nil);MaxSize(val);end
27
+
28
+ def self.MinSize(val = nil)
29
+ #@min_size ||= nil
30
+ (val or !@min_size) ? (@min_size = val || 1) : @min_size
31
+ end
32
+ def self.min_size(val = nil);MinSize(val);end
33
+
34
+ def self.MaxAge(val = nil)
35
+ #@max_age ||= nil
36
+ (val or !@max_age) ? (@max_age = val || nil) : @max_age
37
+ end
38
+ def self.max_age(val = nil);MaxAge(val);end
39
+
40
+ def self.MonitorInterval(val = nil)
41
+ #@monitor_interval ||= nil
42
+ (val or !@monitor_interval) ? (@monitor_interval = val || 300) : @monitor_interval
43
+ end
44
+ def self.monitor_interval(val = nil);MonitorInterval(val); end
45
+
46
+ def self.DoNotMonitor(val = nil)
47
+ #@do_not_monitor ||= nil
48
+ (val or @do_not_monitor.nil?) ? (@do_not_monitor = val || false) : @do_not_monitor
49
+ end
50
+ def self.do_not_monitor(val = nil);DoNotMonitor(val); end
51
+
52
+ def self.Logger(val = nil)
53
+ #@logger ||= nil
54
+ (val or @logger.nil?) ? (@logger = val || false) : @logger
55
+ end
56
+ def self.logger(val = nil);Logger(val); end
57
+
58
+ def set_monitor(l)
59
+ self.class.__send__(:define_method,:monitor,l)
60
+ end
61
+
62
+ def set_newobj(l)
63
+ self.class.__send__(:define_method,:newobj,l)
64
+ end
65
+
66
+ def set_valid(l)
67
+ self.class.__send__(:define_method,:valid?,l)
68
+ end
69
+
70
+ def initialize(params = {})
71
+ super()
72
+ @start_size = params[:start_size] || self.class.StartSize
73
+ @max_size = params[:max_size] || self.class.MaxSize
74
+ @min_size = params[:min_size] || self.class.MinSize
75
+ @max_size = 1 if @max_size < 1
76
+ @min_size = 0 if @min_size < 0
77
+ @start_size = 0 if @start_size < 0
78
+ @min_size = @max_size - 1 if @min_size > @max_size
79
+ @start_size = @min_size if @start_size > @max_size
80
+ @max_age = params[:max_age] || self.class.MaxAge
81
+ @monitor_interval = params[:monitor_interval] || self.class.MonitorInterval
82
+ @logger = params[:logger]
83
+ set_monitor(params[:monitor]) if params[:monitor]
84
+ set_newobj(params[:newobj]) if params[:newobj]
85
+ set_valid(params[:valid]) if params[:valid]
86
+ @params = params
87
+
88
+ @cv = new_cond()
89
+ @monitor_status = nil
90
+ @resource_age = {}
91
+ @in_use_count = 0
92
+ @start_size.times {no = newobj; push(no); @resource_age[no] = Time.now.to_i}
93
+ @in_use_count = 0
94
+ @monitor_thread = monitor_start unless params[:do_not_monitor] or self.class.DoNotMonitor
95
+ end
96
+
97
+ def log(msg)
98
+ if @logger
99
+ log_msg = "#{self.class.name} :: #{msg}"
100
+ if @logger.respond_to?(:info)
101
+ @logger.info(log_msg)
102
+ elsif @logger.respond_to?(:puts)
103
+ @logger.puts(log_msg)
104
+ elsif @logger.respond_to(:write)
105
+ @logger.write(log_msg)
106
+ end
107
+ end
108
+ end
109
+
110
+ def pool_size
111
+ length + @in_use_count
112
+ end
113
+
114
+ def monitor_start
115
+ if @monitor_status
116
+ @monitor_status = :running
117
+ else
118
+ @run_monitor = true
119
+ Thread.start {run_monitor}
120
+ end
121
+ end
122
+
123
+ def monitor_pause
124
+ log("Pausing monitoring.")
125
+ @monitor_status = :paused
126
+ end
127
+
128
+ def monitor_stop
129
+ @run_monitor = false
130
+ end
131
+
132
+ def run_monitor
133
+ log("Starting resource Pool monitor. Interval is #{@monitor_interval} seconds.")
134
+ while @run_monitor
135
+ unless @monitor_status == :paused
136
+ do_monitor_age unless @monitor_status == :paused
137
+ do_monitor unless @monitor_status == :paused
138
+ do_monitor_minsize unless @monitor_status == :paused
139
+ #@monitor_status = :sleeping
140
+ sleep(@monitor_interval)
141
+ else
142
+ while @monitor_status == :paused
143
+ sleep 2
144
+ end
145
+ end
146
+ #@monitor_status = :running unless @monitor_status == :paused
147
+ end
148
+ end
149
+
150
+ def monitor_age(obj)
151
+ (Time.now.to_i - @resource_age[obj]) > @max_age if @max_age
152
+ end
153
+
154
+ def do_monitor_age
155
+ delete_list = []
156
+ each_index do |x|
157
+ delete_list.push(x) if monitor_age(self[x])
158
+ end
159
+ delete_list.each {|x| delete_at(x)}
160
+ end
161
+
162
+ def monitor(obj)
163
+ valid?(obj)
164
+ end
165
+
166
+ def do_monitor
167
+ each_index do |x|
168
+ self[x] = newobj unless monitor(self[x])
169
+ end
170
+ end
171
+
172
+ def do_monitor_minsize
173
+ while length < @min_size
174
+ push(newobj)
175
+ end
176
+ end
177
+
178
+ def newobj
179
+ true
180
+ end
181
+
182
+ def valid?(obj)
183
+ if obj.respond_to?(:ping)
184
+ obj.ping
185
+ elsif obj.respond_to?(:connected?)
186
+ obj.connected?
187
+ elsif obj.respond_to?(:alive?)
188
+ obj.alive?
189
+ else
190
+ obj
191
+ end
192
+ end
193
+
194
+ def push(obj)
195
+ synchronize do
196
+ if pool_size <= @max_size
197
+ super
198
+ @in_use_count -= 1
199
+ @resource_age[obj] = Time.now.to_i
200
+ @cv.signal()
201
+ true
202
+ else
203
+ false
204
+ end
205
+ end
206
+ end
207
+
208
+ def pop
209
+ synchronize do
210
+ obj = nil
211
+ if empty? and (pool_size < @max_size)
212
+ obj = newobj
213
+ @in_use_count += 1
214
+ else
215
+ @cv.wait_while {empty?} if empty?
216
+ obj = super
217
+ @resource_age.delete(obj)
218
+ @in_use_count += 1
219
+ end
220
+ if !valid?(obj)
221
+ @in_use_count -= 1
222
+ sleep 1
223
+ redo
224
+ end
225
+ obj
226
+ end
227
+ end
228
+
229
+ def obtain
230
+ result = nil
231
+ begin
232
+ obj = pop()
233
+ result = yield(obj)
234
+ ensure
235
+ push(obj)
236
+ end
237
+ result
238
+ end
239
+
240
+ end
241
+
242
+ end
243
+