jruby-jms 0.10.2 → 0.11.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 (70) hide show
  1. data/HISTORY.md +15 -0
  2. data/README.md +27 -28
  3. data/Rakefile +7 -1
  4. data/doc/classes/JMS.html +265 -0
  5. data/doc/classes/JMS/BytesMessage.html +215 -0
  6. data/doc/classes/JMS/Connection.html +1145 -0
  7. data/doc/classes/JMS/MapMessage.html +333 -0
  8. data/doc/classes/JMS/Message.html +1085 -0
  9. data/doc/classes/JMS/MessageConsumer.html +316 -0
  10. data/doc/classes/JMS/MessageListenerImpl.html +262 -0
  11. data/doc/classes/JMS/ObjectMessage.html +170 -0
  12. data/doc/classes/JMS/OracleAQConnectionFactory.html +184 -0
  13. data/doc/classes/JMS/QueueBrowser.html +155 -0
  14. data/doc/classes/JMS/Session.html +947 -0
  15. data/doc/classes/JMS/SessionPool.html +411 -0
  16. data/doc/classes/JMS/TextMessage.html +194 -0
  17. data/doc/created.rid +1 -0
  18. data/doc/files/README_md.html +440 -0
  19. data/doc/files/lib/jms/bytes_message_rb.html +122 -0
  20. data/doc/files/lib/jms/connection_rb.html +140 -0
  21. data/doc/files/lib/jms/imports_rb.html +108 -0
  22. data/doc/files/lib/jms/logging_rb.html +129 -0
  23. data/doc/files/lib/jms/map_message_rb.html +122 -0
  24. data/doc/files/lib/jms/message_consumer_rb.html +122 -0
  25. data/doc/files/lib/jms/message_listener_impl_rb.html +122 -0
  26. data/doc/files/lib/jms/message_rb.html +122 -0
  27. data/doc/files/lib/jms/object_message_rb.html +122 -0
  28. data/doc/files/lib/jms/oracle_a_q_connection_factory_rb.html +122 -0
  29. data/doc/files/lib/jms/queue_browser_rb.html +122 -0
  30. data/doc/files/lib/jms/session_pool_rb.html +108 -0
  31. data/doc/files/lib/jms/session_rb.html +164 -0
  32. data/doc/files/lib/jms/text_message_rb.html +122 -0
  33. data/doc/files/lib/jms_rb.html +131 -0
  34. data/doc/fr_class_index.html +39 -0
  35. data/doc/fr_file_index.html +42 -0
  36. data/doc/fr_method_index.html +120 -0
  37. data/doc/index.html +24 -0
  38. data/doc/rdoc-style.css +208 -0
  39. data/examples/advanced/session_pool.rb +37 -0
  40. data/examples/client-server/replier.rb +29 -0
  41. data/examples/client-server/requestor.rb +40 -0
  42. data/examples/jms.yml +85 -9
  43. data/examples/performance/consumer.rb +6 -8
  44. data/examples/performance/producer.rb +10 -10
  45. data/examples/producer-consumer/browser.rb +24 -0
  46. data/examples/{consumer.rb → producer-consumer/consumer.rb} +5 -4
  47. data/examples/producer-consumer/consumer_async.rb +30 -0
  48. data/examples/{producer.rb → producer-consumer/producer.rb} +5 -3
  49. data/examples/publish-subscribe/publish.rb +24 -0
  50. data/examples/publish-subscribe/subscribe.rb +31 -0
  51. data/lib/jms/bytes_message.rb +52 -0
  52. data/lib/jms/connection.rb +170 -162
  53. data/lib/jms/imports.rb +21 -0
  54. data/lib/jms/logging.rb +17 -1
  55. data/lib/jms/{javax_jms_map_message.rb → map_message.rb} +2 -2
  56. data/lib/jms/message.rb +285 -0
  57. data/lib/jms/{javax_jms_message_consumer.rb → message_consumer.rb} +6 -3
  58. data/lib/jms/{message_listener.rb → message_listener_impl.rb} +3 -3
  59. data/lib/jms/{javax_jms_object_message.rb → object_message.rb} +1 -1
  60. data/lib/jms/oracle_a_q_connection_factory.rb +35 -0
  61. data/lib/jms/{javax_jms_queue_browser.rb → queue_browser.rb} +5 -4
  62. data/lib/jms/{javax_jms_session.rb → session.rb} +23 -25
  63. data/lib/jms/session_pool.rb +148 -0
  64. data/lib/jms/{javax_jms_text_message.rb → text_message.rb} +1 -1
  65. data/test/connection_test.rb +31 -29
  66. data/test/jms.yml +8 -9
  67. data/test/message_test.rb +29 -29
  68. data/test/session_test.rb +39 -39
  69. metadata +62 -22
  70. data/lib/jms/javax_jms_message.rb +0 -264
data/doc/created.rid ADDED
@@ -0,0 +1 @@
1
+ Tue, 19 Apr 2011 10:13:57 -0400
@@ -0,0 +1,440 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
+ <head>
8
+ <title>File: README.md</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
+ <link rel="stylesheet" href=".././rdoc-style.css" type="text/css" media="screen" />
12
+ <script type="text/javascript">
13
+ // <![CDATA[
14
+
15
+ function popupCode( url ) {
16
+ window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
+ }
18
+
19
+ function toggleCode( id ) {
20
+ if ( document.getElementById )
21
+ elem = document.getElementById( id );
22
+ else if ( document.all )
23
+ elem = eval( "document.all." + id );
24
+ else
25
+ return false;
26
+
27
+ elemStyle = elem.style;
28
+
29
+ if ( elemStyle.display != "block" ) {
30
+ elemStyle.display = "block"
31
+ } else {
32
+ elemStyle.display = "none"
33
+ }
34
+
35
+ return true;
36
+ }
37
+
38
+ // Make codeblocks hidden by default
39
+ document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
+
41
+ // ]]>
42
+ </script>
43
+
44
+ </head>
45
+ <body>
46
+
47
+
48
+
49
+ <div id="fileHeader">
50
+ <h1>README.md</h1>
51
+ <table class="header-table">
52
+ <tr class="top-aligned-row">
53
+ <td><strong>Path:</strong></td>
54
+ <td>README.md
55
+ </td>
56
+ </tr>
57
+ <tr class="top-aligned-row">
58
+ <td><strong>Last Update:</strong></td>
59
+ <td>Mon Apr 18 10:06:20 -0400 2011</td>
60
+ </tr>
61
+ </table>
62
+ </div>
63
+ <!-- banner header -->
64
+
65
+ <div id="bodyContent">
66
+
67
+
68
+
69
+ <div id="contextContent">
70
+
71
+ <div id="description">
72
+ <p>
73
+ ## jruby-jms
74
+ </p>
75
+ <ul>
76
+ <li><a
77
+ href="http://github.com/reidmorrison/jruby-jms">github.com/reidmorrison/jruby-jms</a>
78
+
79
+ </li>
80
+ </ul>
81
+ <p>
82
+ ### Current Activities &amp; Backward Compatibility
83
+ </p>
84
+ <p>
85
+ The API is relatively stable at this point and I do not expect any breaking
86
+ changes at this point.
87
+ </p>
88
+ <p>
89
+ There may still be some minor changes to the API to make things better
90
+ and/or simpler. Once the code goes to V1.0.0 I will make every effort to
91
+ not break the existing interface in any way.
92
+ </p>
93
+ <p>
94
+ ### Feedback is welcome and appreciated :)
95
+ </p>
96
+ <p>
97
+ ### Introduction
98
+ </p>
99
+ <p>
100
+ jruby-jms attempts to &quot;rubify&quot; the Java <a
101
+ href="../classes/JMS.html">JMS</a> API without compromising performance. It
102
+ does this by sprinkling &quot;Ruby-goodness&quot; into the existing <a
103
+ href="../classes/JMS.html">JMS</a> Java interfaces, I.e. By adding Ruby
104
+ methods to the existing classes and interfaces. Since jruby-jms exposes the
105
+ <a href="../classes/JMS.html">JMS</a> Java classes directly there is no
106
+ performance impact that would have been introduced had the entire API been
107
+ wrapped in a Ruby layer.
108
+ </p>
109
+ <p>
110
+ In this way, using regular Ruby constructs a Ruby program can easily
111
+ interact with <a href="../classes/JMS.html">JMS</a> in a highly performant
112
+ way. Also, in this way you are not limited to whatever the Ruby wrapper
113
+ would have exposed, since the entire <a href="../classes/JMS.html">JMS</a>
114
+ API is available to you at any time.
115
+ </p>
116
+ <p>
117
+ The initial internal use version of JRuby-<a
118
+ href="../classes/JMS.html">JMS</a> was created in 2008. It has been in use
119
+ in production since 2009.
120
+ </p>
121
+ <p>
122
+ ### Install
123
+ </p>
124
+ <pre>
125
+ jgem install jruby-jms
126
+ </pre>
127
+ <p>
128
+ ### Simplification
129
+ </p>
130
+ <p>
131
+ One of the difficulties with the regular <a
132
+ href="../classes/JMS.html">JMS</a> API is that it use completely separate
133
+ classes for Topics and Queues in <a href="../classes/JMS.html">JMS</a> 1.1.
134
+ This means that once a program writes to a Queue for example, that without
135
+ changing the program it could not be changed to write to a topic. Also a
136
+ consumer on a topic or a queue are identical. jruby-jms fixes this issue by
137
+ allowing you to have a Consumer or Producer that is independent of whether
138
+ it is producing or consuming to/from or a Topic or a Queue. The complexity
139
+ of which <a href="../classes/JMS.html">JMS</a> class is used is taken care
140
+ of by jruby-jms.
141
+ </p>
142
+ <p>
143
+ ## Concepts &amp; Terminology
144
+ </p>
145
+ <p>
146
+ ### Java Message Service (<a href="../classes/JMS.html">JMS</a>) API
147
+ </p>
148
+ <p>
149
+ The <a href="../classes/JMS.html">JMS</a> API is a standard interface part
150
+ of Java EE 6 as a way for programs to send and receive messages through a
151
+ messaging and queuing system.
152
+ </p>
153
+ <p>
154
+ For more information on the <a href="../classes/JMS.html">JMS</a> API: <a
155
+ href="http://download.oracle.com/javaee/6/api/index.html?javax/jms/package-summary.html">download.oracle.com/javaee/6/api/index.html?javax/jms/package-summary.html</a>
156
+ </p>
157
+ <p>
158
+ ### Broker / Queue Manager
159
+ </p>
160
+ <p>
161
+ Depending on which <a href="../classes/JMS.html">JMS</a> provider you are
162
+ using they refer to their centralized server as either a Broker or Queue
163
+ Manager. The Broker or Queue Manager is the centralized &quot;server&quot;
164
+ through which all messages pass through.
165
+ </p>
166
+ <p>
167
+ Some Brokers support an in-vm broker instance so that messages can be
168
+ passed between producers and consumers within the same Java Virtual Machine
169
+ (JVM) instance. This removes the need to make any network calls. Highly
170
+ recommended for passing messages between threads in the same JVM.
171
+ </p>
172
+ <p>
173
+ ### Connection
174
+ </p>
175
+ <p>
176
+ In order to connect to any broker the Client <a
177
+ href="../classes/JMS.html">JMS</a> application must create a connection. In
178
+ traditional <a href="../classes/JMS.html">JMS</a> a ConnectionFactory is
179
+ used to create connections. In jruby-jms the <a
180
+ href="../classes/JMS/Connection.html">JMS::Connection</a> takes care of the
181
+ complexities of dealing with the factory class, just pass the required
182
+ parameters to Connection.new at it takes care of the rest.
183
+ </p>
184
+ <p>
185
+ ### Queue
186
+ </p>
187
+ <p>
188
+ A queue used for holding messages. The queue is defined prior to the
189
+ message being sent and is used to hold the messages. The consumer does not
190
+ have to be running in order to receive messages.
191
+ </p>
192
+ <p>
193
+ ### Topic
194
+ </p>
195
+ <p>
196
+ Instead of sending messages to a single queue, a topic can be used to
197
+ publish messages and allow multiple consumers to register for messages that
198
+ match the topic they are interested in
199
+ </p>
200
+ <p>
201
+ ### Producer
202
+ </p>
203
+ <p>
204
+ Producers write messages to queues or topics
205
+ </p>
206
+ <p>
207
+ ActiveMQ Example:
208
+ </p>
209
+ <pre>
210
+ require 'rubygems'
211
+ require 'jms'
212
+
213
+ # Connect to ActiveMQ
214
+ config = {
215
+ :factory =&gt; 'org.apache.activemq.ActiveMQConnectionFactory',
216
+ :broker_url =&gt; 'tcp://localhost:61616',
217
+ :require_jars =&gt; [
218
+ &quot;~/Applications/apache-activemq-5.5.0/activemq-all-5.5.0.jar&quot;,
219
+ &quot;~/Applications/apache-activemq-5.5.0/lib/optional/slf4j-log4j12-1.5.11.jar&quot;,
220
+ &quot;~/Applications/apache-activemq-5.5.0/lib/optional/log4j-1.2.14.jar&quot;
221
+ ]
222
+ }
223
+
224
+ JMS::Connection.session(config) do |session|
225
+ session.producer(:queue_name =&gt; 'ExampleQueue') do |producer|
226
+ producer.send(session.message(&quot;Hello World&quot;))
227
+ end
228
+ end
229
+ </pre>
230
+ <p>
231
+ ### Consumer
232
+ </p>
233
+ <p>
234
+ Consumers read message from a queue or topic
235
+ </p>
236
+ <p>
237
+ ActiveMQ Example:
238
+ </p>
239
+ <pre>
240
+ require 'rubygems'
241
+ require 'jms'
242
+
243
+ # Connect to ActiveMQ
244
+ config = {
245
+ :factory =&gt; 'org.apache.activemq.ActiveMQConnectionFactory',
246
+ :broker_url =&gt; 'tcp://localhost:61616',
247
+ :require_jars =&gt; [&quot;~/Applications/apache-activemq-5.4.2/activemq-all-5.4.2.jar&quot;]
248
+ }
249
+
250
+ JMS::Connection.session(config) do |session|
251
+ session.consume(:queue_name =&gt; 'ExampleQueue', :timeout=&gt;1000) do |message|
252
+ p message
253
+ end
254
+ end
255
+ </pre>
256
+ <p>
257
+ ## Overview
258
+ </p>
259
+ <p>
260
+ jruby-jms is a complete JRuby API into the Java Messaging Specification (<a
261
+ href="../classes/JMS.html">JMS</a>) V1.1 followed by several <a
262
+ href="../classes/JMS.html">JMS</a> Providers.
263
+ </p>
264
+ <p>
265
+ ## Threading
266
+ </p>
267
+ <p>
268
+ A <a href="../classes/JMS/Connection.html">JMS::Connection</a> instance can
269
+ be shared between threads, whereas a session, consumer, producer, and any
270
+ artifacts created by the session should only be used by one thread at a
271
+ time.
272
+ </p>
273
+ <p>
274
+ For consumers, it is recommended to create a session for each thread and
275
+ leave that thread blocked on Consumer.receive. Or, even better use
276
+ Connection.on_message which will create a session, within which any message
277
+ received from the specified queue or topic match will be passed to the
278
+ block.
279
+ </p>
280
+ <p>
281
+ ## Logging
282
+ </p>
283
+ <p>
284
+ jruby-jms detects the logging available in the current environment. When
285
+ running under Rails it will use the Rails logger, otherwise the standard
286
+ Ruby logger. The logger can also be replaced by calling Connection.logger=
287
+ </p>
288
+ <p>
289
+ ## Dependencies
290
+ </p>
291
+ <p>
292
+ ### <a href="../classes/JMS.html">JMS</a> V1.1 Provider
293
+ </p>
294
+ <p>
295
+ In order to communicate with a <a href="../classes/JMS.html">JMS</a> V 1.1
296
+ provider jruby-jms needs the jar files supplied by the <a
297
+ href="../classes/JMS.html">JMS</a> provider. As in the examples above the
298
+ jar files can be specified in the configuration element :require_jars.
299
+ Otherwise, the jars must be explicitly required in the Ruby code:
300
+ </p>
301
+ <pre>
302
+ `require &quot;~/Applications/apache-activemq-5.4.2/activemq-all-5.4.2.jar&quot;`
303
+ </pre>
304
+ <p>
305
+ ### JRuby
306
+ </p>
307
+ <p>
308
+ jruby-jms has been tested against JRuby 1.5.1 and 1.6.1, but should work
309
+ with any current JRuby version.
310
+ </p>
311
+ <p>
312
+ ## Development
313
+ </p>
314
+ <p>
315
+ Want to contribute to jruby-jms?
316
+ </p>
317
+ <p>
318
+ First clone the repo and run the tests:
319
+ </p>
320
+ <pre>
321
+ git clone git://github.com/reidmorrison/jruby-jms.git
322
+ cd jruby-jms
323
+ jruby -S rake test
324
+ </pre>
325
+ <p>
326
+ Feel free to submit any issues and we&#8216;ll try to resolve it.
327
+ </p>
328
+ <p>
329
+ ## Contributing
330
+ </p>
331
+ <p>
332
+ Once you&#8216;ve made your great commits:
333
+ </p>
334
+ <ol>
335
+ <li>[Fork](<a
336
+ href="http://help.github.com/forking">help.github.com/forking</a>/)
337
+ jruby-jms
338
+
339
+ </li>
340
+ <li>Create a topic branch - `git checkout -b my_branch`
341
+
342
+ </li>
343
+ <li>Push to your branch - `git push origin my_branch`
344
+
345
+ </li>
346
+ <li>Create an [Issue](<a
347
+ href="http://github.com/reidmorrison/jruby-jms/issues">github.com/reidmorrison/jruby-jms/issues</a>)
348
+ with a link to your branch
349
+
350
+ </li>
351
+ <li>That&#8216;s it!
352
+
353
+ </li>
354
+ </ol>
355
+ <p>
356
+ ## Meta
357
+ </p>
358
+ <ul>
359
+ <li>Code: `git clone git://github.com/reidmorrison/jruby-jms.git`
360
+
361
+ </li>
362
+ <li>Home: &lt;<a
363
+ href="http://github.com/reidmorrison/jruby-jms">github.com/reidmorrison/jruby-jms</a>&gt;
364
+
365
+ </li>
366
+ <li>Bugs: &lt;<a
367
+ href="http://github.com/reidmorrison/jruby-jms/issues">github.com/reidmorrison/jruby-jms/issues</a>&gt;
368
+
369
+ </li>
370
+ <li>Gems: &lt;<a
371
+ href="http://rubygems.org/gems/jruby-jms">rubygems.org/gems/jruby-jms</a>&gt;
372
+
373
+ </li>
374
+ </ul>
375
+ <p>
376
+ This project uses [Semantic Versioning](<a
377
+ href="http://semver.org">semver.org</a>/).
378
+ </p>
379
+ <p>
380
+ ## Author
381
+ </p>
382
+ <table>
383
+ <tr><td valign="top">Reid Morrison :: rubywmq@gmail.com :</td><td>@reidmorrison
384
+
385
+ </td></tr>
386
+ </table>
387
+ <p>
388
+ ## License
389
+ </p>
390
+ <p>
391
+ Copyright 2008 - 2011 J. Reid Morrison
392
+ </p>
393
+ <p>
394
+ Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
395
+ you may not use this file except in compliance with the License. You may
396
+ obtain a copy of the License at
397
+ </p>
398
+ <pre>
399
+ http://www.apache.org/licenses/LICENSE-2.0
400
+ </pre>
401
+ <p>
402
+ Unless required by applicable law or agreed to in writing, software
403
+ distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
404
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
405
+ See the License for the specific language governing permissions and
406
+ limitations under the License.
407
+ </p>
408
+
409
+ </div>
410
+
411
+
412
+ </div>
413
+
414
+
415
+ </div>
416
+
417
+
418
+ <!-- if includes -->
419
+
420
+ <div id="section">
421
+
422
+
423
+
424
+
425
+
426
+
427
+
428
+
429
+ <!-- if method_list -->
430
+
431
+
432
+ </div>
433
+
434
+
435
+ <div id="validator-badges">
436
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
437
+ </div>
438
+
439
+ </body>
440
+ </html>
@@ -0,0 +1,122 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
+ <head>
8
+ <title>File: bytes_message.rb</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
+ <link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
12
+ <script type="text/javascript">
13
+ // <![CDATA[
14
+
15
+ function popupCode( url ) {
16
+ window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
+ }
18
+
19
+ function toggleCode( id ) {
20
+ if ( document.getElementById )
21
+ elem = document.getElementById( id );
22
+ else if ( document.all )
23
+ elem = eval( "document.all." + id );
24
+ else
25
+ return false;
26
+
27
+ elemStyle = elem.style;
28
+
29
+ if ( elemStyle.display != "block" ) {
30
+ elemStyle.display = "block"
31
+ } else {
32
+ elemStyle.display = "none"
33
+ }
34
+
35
+ return true;
36
+ }
37
+
38
+ // Make codeblocks hidden by default
39
+ document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
+
41
+ // ]]>
42
+ </script>
43
+
44
+ </head>
45
+ <body>
46
+
47
+
48
+
49
+ <div id="fileHeader">
50
+ <h1>bytes_message.rb</h1>
51
+ <table class="header-table">
52
+ <tr class="top-aligned-row">
53
+ <td><strong>Path:</strong></td>
54
+ <td>lib/jms/bytes_message.rb
55
+ </td>
56
+ </tr>
57
+ <tr class="top-aligned-row">
58
+ <td><strong>Last Update:</strong></td>
59
+ <td>Fri Apr 15 15:56:42 -0400 2011</td>
60
+ </tr>
61
+ </table>
62
+ </div>
63
+ <!-- banner header -->
64
+
65
+ <div id="bodyContent">
66
+
67
+
68
+
69
+ <div id="contextContent">
70
+
71
+ <div id="description">
72
+ <p>
73
+ Copyright 2008, 2009, 2010, 2011 J. Reid Morrison
74
+ </p>
75
+ <p>
76
+ Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
77
+ you may not use this file except in compliance with the License. You may
78
+ obtain a copy of the License at
79
+ </p>
80
+ <pre>
81
+ http://www.apache.org/licenses/LICENSE-2.0
82
+ </pre>
83
+ <p>
84
+ Unless required by applicable law or agreed to in writing, software
85
+ distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
86
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
87
+ See the License for the specific language governing permissions and
88
+ limitations under the License.
89
+ </p>
90
+
91
+ </div>
92
+
93
+
94
+ </div>
95
+
96
+
97
+ </div>
98
+
99
+
100
+ <!-- if includes -->
101
+
102
+ <div id="section">
103
+
104
+
105
+
106
+
107
+
108
+
109
+
110
+
111
+ <!-- if method_list -->
112
+
113
+
114
+ </div>
115
+
116
+
117
+ <div id="validator-badges">
118
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
119
+ </div>
120
+
121
+ </body>
122
+ </html>