Do some clean up of development files. Adjust converting script to
[working/Evergreen.git] / 1.6 / development / OpenSRF_intro.xml
index 34598db..0048152 100644 (file)
                <simpara>For example, the following code implements an OpenSRF service. The service\r
                includes one method named <literal>opensrf.simple-text.reverse()</literal> that accepts one\r
                string as input and returns the reversed version of that string:</simpara>\r
-               <programlisting language="perl" linenumbering="unnumbered">#!/usr/bin/perl\r
+<programlisting language="perl" linenumbering="unnumbered">\r
+#!/usr/bin/perl\r
 \r
-               package OpenSRF::Application::Demo::SimpleText;\r
+package OpenSRF::Application::Demo::SimpleText;\r
 \r
-               use strict;\r
+use strict;\r
 \r
-               use OpenSRF::Application;\r
-               use parent qw/OpenSRF::Application/;\r
+use OpenSRF::Application;\r
+use parent qw/OpenSRF::Application/;\r
 \r
-               sub text_reverse {\r
-                   my ($self , $conn, $text) = @_;\r
-                   my $reversed_text = scalar reverse($text);\r
-                   return $reversed_text;\r
-               }\r
+sub text_reverse {\r
+    my ($self , $conn, $text) = @_;\r
+    my $reversed_text = scalar reverse($text);\r
+    return $reversed_text;\r
+}\r
 \r
-               __PACKAGE__-&gt;register_method(\r
-                   method    =&gt; 'text_reverse',\r
-                   api_name  =&gt; 'opensrf.simple-text.reverse'\r
-               );</programlisting>\r
+__PACKAGE__-&gt;register_method(\r
+    method    =&gt; 'text_reverse',\r
+    api_name  =&gt; 'opensrf.simple-text.reverse'\r
+);\r
+</programlisting>\r
                <simpara>Ten lines of code, and we have a complete OpenSRF service that exposes a single\r
                method and could be deployed quickly on a cluster of servers to meet your\r
                application&#8217;s ravenous demand for reversed strings! If you&#8217;re unfamiliar with\r
                        <simpara>Begin by defining the service itself in <literal>opensrf.xml</literal>. To register the\r
                        <literal>opensrf.simple-text</literal> service, add the following section to the <literal>&lt;apps&gt;</literal>\r
                        element (corresponding to the XPath <literal>/opensrf/default/apps/</literal>):</simpara>\r
-                       <programlisting language="xml" linenumbering="unnumbered">&lt;apps&gt;\r
-                         &lt;opensrf.simple-text&gt; <co id="CO1-1"/> \r
-                           &lt;keepalive&gt;3&lt;/keepalive&gt;<co id="CO1-2"/> \r
-                           &lt;stateless&gt;1&lt;/stateless&gt;<co id="CO1-3"/>\r
-                           &lt;language&gt;perl&lt;/language&gt;<co id="CO1-4"/> \r
-                           &lt;implementation&gt;OpenSRF::Application::Demo::SimpleText&lt;/implementation&gt;<co id="CO1-5"/> \r
-                           &lt;max_requests&gt;100&lt;/max_requests&gt;<co id="CO1-6"/> \r
-                           &lt;unix_config&gt;\r
-                             &lt;max_requests&gt;1000&lt;/max_requests&gt; <co id="CO1-7"/> \r
-                             &lt;unix_log&gt;opensrf.simple-text_unix.log&lt;/unix_log&gt; <co id="CO1-8"/> \r
-                             &lt;unix_sock&gt;opensrf.simple-text_unix.sock&lt;/unix_sock&gt;<co id="CO1-9"/> \r
-                             &lt;unix_pid&gt;opensrf.simple-text_unix.pid&lt;/unix_pid&gt; <co id="CO1-10"/> \r
-                             &lt;min_children&gt;5&lt;/min_children&gt;  <co id="CO1-11"/> \r
-                             &lt;max_children&gt;15&lt;/max_children&gt;<co id="CO1-12"/> \r
-                             &lt;min_spare_children&gt;2&lt;/min_spare_children&gt;<co id="CO1-13"/> \r
-                             &lt;max_spare_children&gt;5&lt;/max_spare_children&gt; <co id="CO1-14"/> \r
-                           &lt;/unix_config&gt;\r
-                         &lt;/opensrf.simple-text&gt;\r
+<programlisting language="xml" linenumbering="unnumbered">\r
+&lt;apps&gt;\r
+  &lt;opensrf.simple-text&gt; <co id="CO1-1"/> \r
+    &lt;keepalive&gt;3&lt;/keepalive&gt;<co id="CO1-2"/> \r
+    &lt;stateless&gt;1&lt;/stateless&gt;<co id="CO1-3"/>\r
+    &lt;language&gt;perl&lt;/language&gt;<co id="CO1-4"/> \r
+    &lt;implementation&gt;OpenSRF::Application::Demo::SimpleText&lt;/implementation&gt;<co id="CO1-5"/> \r
+    &lt;max_requests&gt;100&lt;/max_requests&gt;<co id="CO1-6"/> \r
+    &lt;unix_config&gt;\r
+      &lt;max_requests&gt;1000&lt;/max_requests&gt; <co id="CO1-7"/> \r
+      &lt;unix_log&gt;opensrf.simple-text_unix.log&lt;/unix_log&gt; <co id="CO1-8"/> \r
+      &lt;unix_sock&gt;opensrf.simple-text_unix.sock&lt;/unix_sock&gt;<co id="CO1-9"/> \r
+      &lt;unix_pid&gt;opensrf.simple-text_unix.pid&lt;/unix_pid&gt; <co id="CO1-10"/> \r
+      &lt;min_children&gt;5&lt;/min_children&gt;  <co id="CO1-11"/> \r
+      &lt;max_children&gt;15&lt;/max_children&gt;<co id="CO1-12"/> \r
+      &lt;min_spare_children&gt;2&lt;/min_spare_children&gt;<co id="CO1-13"/> \r
+      &lt;max_spare_children&gt;5&lt;/max_spare_children&gt; <co id="CO1-14"/> \r
+    &lt;/unix_config&gt;\r
+  &lt;/opensrf.simple-text&gt;\r
 \r
-                         &lt;!-- other OpenSRF services registered here... --&gt;\r
-                       &lt;/apps&gt;</programlisting>\r
+  &lt;!-- other OpenSRF services registered here... --&gt;\r
+&lt;/apps&gt;\r
+</programlisting>\r
                        <calloutlist>\r
                        <callout arearefs="CO1-1">\r
                        <simpara>\r
                        edit the <literal>opensrf_core.xml</literal> configuration file to add the service to the list\r
                        of publicly accessible services:</simpara>\r
                        <formalpara><title>Making a service publicly accessible in <literal>opensrf_core.xml</literal></title><para>\r
-                       <programlisting language="xml" linenumbering="unnumbered">&lt;router&gt;<co id="CO2-1"/> \r
-                           &lt;!-- This is the public router. On this router, we only register applications\r
-                            which should be accessible to everyone on the opensrf network --&gt;\r
-                           &lt;name&gt;router&lt;/name&gt;\r
-                           &lt;domain&gt;public.localhost&lt;/domain&gt;<co id="CO2-2"/>\r
-                           &lt;services&gt;\r
-                               &lt;service&gt;opensrf.math&lt;/service&gt;\r
-                               &lt;service&gt;opensrf.simple-text&lt;/service&gt; <co id="CO2-3"/> \r
-                           &lt;/services&gt;\r
-                       &lt;/router&gt;</programlisting>\r
+<programlisting language="xml" linenumbering="unnumbered">\r
+&lt;router&gt;<co id="CO2-1"/> \r
+    &lt;!-- This is the public router. On this router, we only register applications\r
+     which should be accessible to everyone on the opensrf network --&gt;\r
+    &lt;name&gt;router&lt;/name&gt;\r
+    &lt;domain&gt;public.localhost&lt;/domain&gt;<co id="CO2-2"/>\r
+    &lt;services&gt;\r
+       &lt;service&gt;opensrf.math&lt;/service&gt;\r
+       &lt;service&gt;opensrf.simple-text&lt;/service&gt; <co id="CO2-3"/> \r
+    &lt;/services&gt;\r
+&lt;/router&gt;\r
+</programlisting>\r
                        </para></formalpara>\r
                        <calloutlist>\r
                        <callout arearefs="CO2-1">\r
                                <simpara>The following example calls the <literal>opensrf.simple-text.reverse</literal> method of the\r
                                <literal>opensrf.simple-text</literal> OpenSRF service, passing the string <literal>"foobar"</literal> as the\r
                                only method argument:</simpara>\r
-                               <programlisting language="sh" linenumbering="unnumbered">$ srfsh\r
-                               srfsh # request opensrf.simple-text opensrf.simple-text.reverse "foobar"\r
+<programlisting language="sh" linenumbering="unnumbered">\r
+$ srfsh\r
+srfsh # request opensrf.simple-text opensrf.simple-text.reverse "foobar"\r
 \r
-                               Received Data: "raboof"\r
+Received Data: "raboof"\r
 \r
-                               =------------------------------------\r
-                               Request Completed Successfully\r
-                               Request Time in seconds: 0.016718\r
-                               =------------------------------------</programlisting>\r
+=------------------------------------\r
+Request Completed Successfully\r
+Request Time in seconds: 0.016718\r
+=------------------------------------\r
+</programlisting>\r
                        </simplesect>\r
                        <simplesect id="opensrfIntrospection">\r
                                <title>Getting documentation for OpenSRF methods from the srfsh client</title>\r
                                accurate information. The quality varies across the set of OpenSRF and\r
                                Evergreen APIs, although some effort is being put towards improving the\r
                                state of the internal documentation.</simpara></note>\r
-                               <programlisting language="sh" linenumbering="unnumbered">srfsh# introspect opensrf.simple-text "opensrf.simple-text.reverse"\r
-                               --&gt; opensrf.simple-text\r
+<programlisting language="sh" linenumbering="unnumbered">\r
+srfsh# introspect opensrf.simple-text "opensrf.simple-text.reverse"\r
+--&gt; opensrf.simple-text\r
 \r
-                               Received Data: {\r
-                                 "__c":"opensrf.simple-text",\r
-                                 "__p":{\r
-                                   "api_level":1,\r
-                                   "stream":0,      <co id="CO3-1"/>\r
-                                   "object_hint":"OpenSRF_Application_Demo_SimpleText",\r
-                                   "remote":0,\r
-                                   "package":"OpenSRF::Application::Demo::SimpleText", <co id="CO3-2"/>\r
-                                   "api_name":"opensrf.simple-text.reverse",<co id="CO3-3"/>\r
-                                   "server_class":"opensrf.simple-text",\r
-                                   "signature":{ <co id="CO3-4"/>\r
-                                     "params":[  <co id="CO3-5"/>\r
-                                       {\r
-                                         "desc":"The string to reverse",\r
-                                         "name":"text",\r
-                                         "type":"string"\r
-                                       }\r
-                                     ],\r
-                                     "desc":"Returns the input string in reverse order\n", <co id="CO3-6"/>\r
-                                     "return":{                                            <co id="CO3-7"/>\r
-                                       "desc":"Returns the input string in reverse order",\r
-                                       "type":"string"\r
-                                     }\r
-                                   },\r
-                                   "method":"text_reverse",  <co id="CO3-8"/>\r
-                                   "argc":1 <co id="CO3-9"/>\r
-                                 }\r
-                               }</programlisting>\r
+Received Data: {\r
+  "__c":"opensrf.simple-text",\r
+  "__p":{\r
+    "api_level":1,\r
+    "stream":0,      <co id="CO3-1"/>\r
+    "object_hint":"OpenSRF_Application_Demo_SimpleText",\r
+    "remote":0,\r
+    "package":"OpenSRF::Application::Demo::SimpleText", <co id="CO3-2"/>\r
+    "api_name":"opensrf.simple-text.reverse",<co id="CO3-3"/>\r
+    "server_class":"opensrf.simple-text",\r
+    "signature":{ <co id="CO3-4"/>\r
+      "params":[  <co id="CO3-5"/>\r
+       {\r
+         "desc":"The string to reverse",\r
+         "name":"text",\r
+         "type":"string"\r
+       }\r
+      ],\r
+      "desc":"Returns the input string in reverse order\n", <co id="CO3-6"/>\r
+      "return":{                                            <co id="CO3-7"/>\r
+       "desc":"Returns the input string in reverse order",\r
+       "type":"string"\r
+      }\r
+    },\r
+    "method":"text_reverse",  <co id="CO3-8"/>\r
+    "argc":1 <co id="CO3-9"/>\r
+  }\r
+}\r
+</programlisting>\r
                                <calloutlist>\r
                                <callout arearefs="CO3-1">\r
                                <simpara>\r
                                <title>Calling OpenSRF methods from Perl applications</title>\r
                                <simpara>To call an OpenSRF method from Perl, you must connect to the OpenSRF service,\r
                                issue the request to the method, and then retrieve the results.</simpara>\r
-                               <programlisting language="perl" linenumbering="unnumbered">#/usr/bin/perl\r
-                               use strict;\r
-                               use OpenSRF::AppSession;\r
-                               use OpenSRF::System;\r
+<programlisting language="perl" linenumbering="unnumbered">\r
+#/usr/bin/perl\r
+use strict;\r
+use OpenSRF::AppSession;\r
+use OpenSRF::System;\r
 \r
-                               OpenSRF::System-&gt;bootstrap_client(config_file =&gt; '/openils/conf/opensrf_core.xml');<co id="CO4-1"/>\r
+OpenSRF::System-&gt;bootstrap_client(config_file =&gt; '/openils/conf/opensrf_core.xml');<co id="CO4-1"/>\r
 \r
-                               my $session = OpenSRF::AppSession-&gt;create("opensrf.simple-text");<co id="CO4-2"/>\r
+my $session = OpenSRF::AppSession-&gt;create("opensrf.simple-text");<co id="CO4-2"/>\r
 \r
-                               print "substring: Accepts a string and a number as input, returns a string\n";\r
-                               my $result = $session-&gt;request("opensrf.simple-text.substring", "foobar", 3);<co id="CO4-3"/>\r
-                               my $request = $result-&gt;gather(); <co id="CO4-4"/>\r
-                               print "Substring: $request\n\n";\r
+print "substring: Accepts a string and a number as input, returns a string\n";\r
+my $result = $session-&gt;request("opensrf.simple-text.substring", "foobar", 3);<co id="CO4-3"/>\r
+my $request = $result-&gt;gather(); <co id="CO4-4"/>\r
+print "Substring: $request\n\n";\r
 \r
-                               print "split: Accepts two strings as input, returns an array of strings\n";\r
-                               $request = $session-&gt;request("opensrf.simple-text.split", "This is a test", " ");<co id="CO4-5"/>\r
-                               my $output = "Split: [";\r
-                               my $element;\r
-                               while ($element = $request-&gt;recv()) {   <co id="CO4-6"/>\r
-                                   $output .= $element-&gt;content . ", ";  <co id="CO4-7"/>\r
-                               }\r
-                               $output =~ s/, $/]/;\r
-                               print $output . "\n\n";\r
+print "split: Accepts two strings as input, returns an array of strings\n";\r
+$request = $session-&gt;request("opensrf.simple-text.split", "This is a test", " ");<co id="CO4-5"/>\r
+my $output = "Split: [";\r
+my $element;\r
+while ($element = $request-&gt;recv()) {   <co id="CO4-6"/>\r
+    $output .= $element-&gt;content . ", ";  <co id="CO4-7"/>\r
+}\r
+$output =~ s/, $/]/;\r
+print $output . "\n\n";\r
 \r
-                               print "statistics: Accepts an array of strings as input, returns a hash\n";\r
-                               my @many_strings = [\r
-                                   "First I think I'll have breakfast",\r
-                                   "Then I think that lunch would be nice",\r
-                                   "And then seventy desserts to finish off the day"\r
-                               ];\r
+print "statistics: Accepts an array of strings as input, returns a hash\n";\r
+my @many_strings = [\r
+    "First I think I'll have breakfast",\r
+    "Then I think that lunch would be nice",\r
+    "And then seventy desserts to finish off the day"\r
+];\r
 \r
-                               $result = $session-&gt;request("opensrf.simple-text.statistics", @many_strings); <co id="CO4-8"/>\r
-                               $request = $result-&gt;gather();    <co id="CO4-9"/>\r
-                               print "Length: " . $result-&gt;{'length'} . "\n";\r
-                               print "Word count: " . $result-&gt;{'word_count'} . "\n";\r
+$result = $session-&gt;request("opensrf.simple-text.statistics", @many_strings); <co id="CO4-8"/>\r
+$request = $result-&gt;gather();    <co id="CO4-9"/>\r
+print "Length: " . $result-&gt;{'length'} . "\n";\r
+print "Word count: " . $result-&gt;{'word_count'} . "\n";\r
 \r
-                               $session-&gt;disconnect();       <co id="CO4-10"/></programlisting>\r
+$session-&gt;disconnect();       <co id="CO4-10"/>\r
+</programlisting>\r
                                <calloutlist>\r
                                <callout arearefs="CO4-1">\r
                                <simpara>\r
                        returns a list, we accept two arguments of type string: the string to be split,\r
                        and the delimiter that should be used to split the string.</simpara>\r
                        <formalpara><title>Basic text splitting method</title><para>\r
-                       <programlisting language="perl" linenumbering="unnumbered">sub text_split {\r
-                           my $self = shift;\r
-                           my $conn = shift;\r
-                           my $text = shift;\r
-                           my $delimiter = shift || ' ';\r
+<programlisting language="perl" linenumbering="unnumbered">\r
+sub text_split {\r
+    my $self = shift;\r
+    my $conn = shift;\r
+    my $text = shift;\r
+    my $delimiter = shift || ' ';\r
 \r
-                           my @split_text = split $delimiter, $text;\r
-                           return \@split_text;\r
-                       }\r
+    my @split_text = split $delimiter, $text;\r
+    return \@split_text;\r
+}\r
 \r
-                       __PACKAGE__-&gt;register_method(\r
-                           method    =&gt; 'text_split',\r
-                           api_name  =&gt; 'opensrf.simple-text.split'\r
-                       );</programlisting>\r
+__PACKAGE__-&gt;register_method(\r
+    method    =&gt; 'text_split',\r
+    api_name  =&gt; 'opensrf.simple-text.split'\r
+);\r
+</programlisting>\r
                        </para></formalpara>\r
                        <simpara>We simply return a reference to the list, and OpenSRF does the rest of the work\r
                        for us to convert the data into the language-independent format that is then\r
                        configuration file and dynamically register OpenSRF methods for creating,\r
                        reading, updating, and deleting all of the defined classes.</simpara>\r
                        <formalpara><title>Example fieldmapper class definition for "Open User Summary"</title><para>\r
-                       <programlisting language="xml" linenumbering="unnumbered">&lt;class id="mous" controller="open-ils.cstore open-ils.pcrud"\r
-                        oils_obj:fieldmapper="money::open_user_summary"\r
-                        oils_persist:tablename="money.open_usr_summary"\r
-                        reporter:label="Open User Summary"&gt;                                <co id="CO5-1"/>\r
-                           &lt;fields oils_persist:primary="usr" oils_persist:sequence=""&gt; <co id="CO5-2"/> \r
-                               &lt;field name="balance_owed" reporter:datatype="money" /&gt;  <co id="CO5-3"/> \r
-                               &lt;field name="total_owed" reporter:datatype="money" /&gt;\r
-                               &lt;field name="total_paid" reporter:datatype="money" /&gt;\r
-                               &lt;field name="usr" reporter:datatype="link"/&gt;\r
-                           &lt;/fields&gt;\r
-                           &lt;links&gt;\r
-                               &lt;link field="usr" reltype="has_a" key="id" map="" class="au"/&gt;<co id="CO5-4"/> \r
-                           &lt;/links&gt;\r
-                           &lt;permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1"&gt;<co id="CO5-5"/> \r
-                               &lt;actions&gt;\r
-                                   &lt;retrieve permission="VIEW_USER"&gt;<co id="CO5-6"/> \r
-                                       &lt;context link="usr" field="home_ou"/&gt;<co id="CO5-7"/>\r
-                                   &lt;/retrieve&gt;\r
-                               &lt;/actions&gt;\r
-                           &lt;/permacrud&gt;\r
-                       &lt;/class&gt;</programlisting>\r
+<programlisting language="xml" linenumbering="unnumbered">\r
+&lt;class id="mous" controller="open-ils.cstore open-ils.pcrud"\r
+ oils_obj:fieldmapper="money::open_user_summary"\r
+ oils_persist:tablename="money.open_usr_summary"\r
+ reporter:label="Open User Summary"&gt;                                <co id="CO5-1"/>\r
+    &lt;fields oils_persist:primary="usr" oils_persist:sequence=""&gt; <co id="CO5-2"/> \r
+       &lt;field name="balance_owed" reporter:datatype="money" /&gt;  <co id="CO5-3"/> \r
+       &lt;field name="total_owed" reporter:datatype="money" /&gt;\r
+       &lt;field name="total_paid" reporter:datatype="money" /&gt;\r
+       &lt;field name="usr" reporter:datatype="link"/&gt;\r
+    &lt;/fields&gt;\r
+    &lt;links&gt;\r
+       &lt;link field="usr" reltype="has_a" key="id" map="" class="au"/&gt;<co id="CO5-4"/> \r
+    &lt;/links&gt;\r
+    &lt;permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1"&gt;<co id="CO5-5"/> \r
+       &lt;actions&gt;\r
+           &lt;retrieve permission="VIEW_USER"&gt;<co id="CO5-6"/> \r
+               &lt;context link="usr" field="home_ou"/&gt;<co id="CO5-7"/>\r
+           &lt;/retrieve&gt;\r
+       &lt;/actions&gt;\r
+    &lt;/permacrud&gt;\r
+&lt;/class&gt;\r
+</programlisting>\r
                        </para></formalpara>\r
                        <calloutlist>\r
                        <callout arearefs="CO5-1">\r
                        <simpara>In the following example, the text splitting method has been reimplemented to\r
                        support streaming; very few changes are required:</simpara>\r
                        <formalpara><title>Text splitting method - streaming mode</title><para>\r
-                       <programlisting language="perl" linenumbering="unnumbered">sub text_split {\r
-                           my $self = shift;\r
-                           my $conn = shift;\r
-                           my $text = shift;\r
-                           my $delimiter = shift || ' ';\r
+<programlisting language="perl" linenumbering="unnumbered">\r
+sub text_split {\r
+    my $self = shift;\r
+    my $conn = shift;\r
+    my $text = shift;\r
+    my $delimiter = shift || ' ';\r
 \r
-                           my @split_text = split $delimiter, $text;\r
-                           foreach my $string (@split_text) { <co id="CO6-1"/>\r
-                               $conn-&gt;respond($string);\r
-                           }\r
-                           return undef;\r
-                       }\r
+    my @split_text = split $delimiter, $text;\r
+    foreach my $string (@split_text) { <co id="CO6-1"/>\r
+       $conn-&gt;respond($string);\r
+    }\r
+    return undef;\r
+}\r
 \r
-                       __PACKAGE__-&gt;register_method(\r
-                           method    =&gt; 'text_split',\r
-                           api_name  =&gt; 'opensrf.simple-text.split',\r
-                           stream    =&gt; 1<co id="CO6-2"/>\r
-                       );</programlisting>\r
+__PACKAGE__-&gt;register_method(\r
+    method    =&gt; 'text_split',\r
+    api_name  =&gt; 'opensrf.simple-text.split',\r
+    stream    =&gt; 1<co id="CO6-2"/>\r
+);\r
+</programlisting>\r
                        </para></formalpara>\r
                        <calloutlist>\r
                        <callout arearefs="CO6-1">\r
                        <simpara>You can include many calls to the OpenSRF logger; only those that are higher\r
                        than your configured logging level will actually hit the log. The following\r
                        example exercises all of the available logging levels in OpenSRF:</simpara>\r
-                       <programlisting language="perl" linenumbering="unnumbered">use OpenSRF::Utils::Logger;\r
-                       my $logger = OpenSRF::Utils::Logger;\r
-                       # some code in some function\r
-                       {\r
-                           $logger-&gt;error("Hmm, something bad DEFINITELY happened!");\r
-                           $logger-&gt;warn("Hmm, something bad might have happened.");\r
-                           $logger-&gt;info("Something happened.");\r
-                           $logger-&gt;debug("Something happened; here are some more details.");\r
-                           $logger-&gt;internal("Something happened; here are all the gory details.")\r
-                       }</programlisting>\r
+<programlisting language="perl" linenumbering="unnumbered">\r
+use OpenSRF::Utils::Logger;\r
+my $logger = OpenSRF::Utils::Logger;\r
+# some code in some function\r
+{\r
+    $logger-&gt;error("Hmm, something bad DEFINITELY happened!");\r
+    $logger-&gt;warn("Hmm, something bad might have happened.");\r
+    $logger-&gt;info("Something happened.");\r
+    $logger-&gt;debug("Something happened; here are some more details.");\r
+    $logger-&gt;internal("Something happened; here are all the gory details.")\r
+}\r
+</programlisting>\r
                        <simpara>If you call the mythical OpenSRF method containing the preceding OpenSRF logger\r
                        statements on a system running at the default logging level of INFO, you will\r
                        only see the INFO, WARN, and ERR messages, as follows:</simpara>\r
                        <formalpara><title>Results of logging calls at the default level of INFO</title><para>\r
-                       <screen>[2010-03-17 22:27:30] opensrf.simple-text [ERR :5681:SimpleText.pm:277:] Hmm, something bad DEFINITELY happened!\r
-                       [2010-03-17 22:27:30] opensrf.simple-text [WARN:5681:SimpleText.pm:278:] Hmm, something bad might have happened.\r
-                       [2010-03-17 22:27:30] opensrf.simple-text [INFO:5681:SimpleText.pm:279:] Something happened.</screen>\r
+<screen>\r
+[2010-03-17 22:27:30] opensrf.simple-text [ERR :5681:SimpleText.pm:277:] Hmm, something bad DEFINITELY happened!\r
+[2010-03-17 22:27:30] opensrf.simple-text [WARN:5681:SimpleText.pm:278:] Hmm, something bad might have happened.\r
+[2010-03-17 22:27:30] opensrf.simple-text [INFO:5681:SimpleText.pm:279:] Something happened.\r
+</screen>\r
                        </para></formalpara>\r
                        <simpara>If you then increase the the logging level to INTERNAL (5), the logs will\r
                        contain much more information, as follows:</simpara>\r
                        <formalpara><title>Results of logging calls at the default level of INTERNAL</title><para>\r
-                       <screen>[2010-03-17 22:48:11] opensrf.simple-text [ERR :5934:SimpleText.pm:277:] Hmm, something bad DEFINITELY happened!\r
-                       [2010-03-17 22:48:11] opensrf.simple-text [WARN:5934:SimpleText.pm:278:] Hmm, something bad might have happened.\r
-                       [2010-03-17 22:48:11] opensrf.simple-text [INFO:5934:SimpleText.pm:279:] Something happened.\r
-                       [2010-03-17 22:48:11] opensrf.simple-text [DEBG:5934:SimpleText.pm:280:] Something happened; here are some more details.\r
-                       [2010-03-17 22:48:11] opensrf.simple-text [INTL:5934:SimpleText.pm:281:] Something happened; here are all the gory details.\r
-                       [2010-03-17 22:48:11] opensrf.simple-text [ERR :5934:SimpleText.pm:283:] Resolver did not find a cache hit\r
-                       [2010-03-17 22:48:21] opensrf.simple-text [INTL:5934:Cache.pm:125:] Stored opensrf.simple-text.test_cache.masaa =&gt; "here" in memcached server\r
-                       [2010-03-17 22:48:21] opensrf.simple-text [DEBG:5934:Application.pm:579:] Coderef for [OpenSRF::Application::Demo::SimpleText::test_cache]...\r
-                       [2010-03-17 22:48:21] opensrf.simple-text [DEBG:5934:Application.pm:586:] A top level Request object is responding de nada\r
-                       [2010-03-17 22:48:21] opensrf.simple-text [DEBG:5934:Application.pm:190:] Method duration for [opensrf.simple-text.test_cache]:  10.005\r
-                       [2010-03-17 22:48:21] opensrf.simple-text [INTL:5934:AppSession.pm:780:] Calling queue_wait(0)\r
-                       [2010-03-17 22:48:21] opensrf.simple-text [INTL:5934:AppSession.pm:769:] Resending...0\r
-                       [2010-03-17 22:48:21] opensrf.simple-text [INTL:5934:AppSession.pm:450:] In send\r
-                       [2010-03-17 22:48:21] opensrf.simple-text [DEBG:5934:AppSession.pm:506:] AppSession sending RESULT to opensrf@private.localhost/... \r
-                       [2010-03-17 22:48:21] opensrf.simple-text [DEBG:5934:AppSession.pm:506:] AppSession sending STATUS to opensrf@private.localhost/... \r
-                       ...</screen>\r
+<screen>\r
+[2010-03-17 22:48:11] opensrf.simple-text [ERR :5934:SimpleText.pm:277:] Hmm, something bad DEFINITELY happened!\r
+[2010-03-17 22:48:11] opensrf.simple-text [WARN:5934:SimpleText.pm:278:] Hmm, something bad might have happened.\r
+[2010-03-17 22:48:11] opensrf.simple-text [INFO:5934:SimpleText.pm:279:] Something happened.\r
+[2010-03-17 22:48:11] opensrf.simple-text [DEBG:5934:SimpleText.pm:280:] Something happened; here are some more details.\r
+[2010-03-17 22:48:11] opensrf.simple-text [INTL:5934:SimpleText.pm:281:] Something happened; here are all the gory details.\r
+[2010-03-17 22:48:11] opensrf.simple-text [ERR :5934:SimpleText.pm:283:] Resolver did not find a cache hit\r
+[2010-03-17 22:48:21] opensrf.simple-text [INTL:5934:Cache.pm:125:] Stored opensrf.simple-text.test_cache.masaa =&gt; "here" in memcached server\r
+[2010-03-17 22:48:21] opensrf.simple-text [DEBG:5934:Application.pm:579:] Coderef for [OpenSRF::Application::Demo::SimpleText::test_cache]...\r
+[2010-03-17 22:48:21] opensrf.simple-text [DEBG:5934:Application.pm:586:] A top level Request object is responding de nada\r
+[2010-03-17 22:48:21] opensrf.simple-text [DEBG:5934:Application.pm:190:] Method duration for [opensrf.simple-text.test_cache]:  10.005\r
+[2010-03-17 22:48:21] opensrf.simple-text [INTL:5934:AppSession.pm:780:] Calling queue_wait(0)\r
+[2010-03-17 22:48:21] opensrf.simple-text [INTL:5934:AppSession.pm:769:] Resending...0\r
+[2010-03-17 22:48:21] opensrf.simple-text [INTL:5934:AppSession.pm:450:] In send\r
+[2010-03-17 22:48:21] opensrf.simple-text [DEBG:5934:AppSession.pm:506:] AppSession sending RESULT to opensrf@private.localhost/... \r
+[2010-03-17 22:48:21] opensrf.simple-text [DEBG:5934:AppSession.pm:506:] AppSession sending STATUS to opensrf@private.localhost/... \r
+...\r
+</screen>\r
                        </para></formalpara>\r
                        <simpara>To see everything that is happening in OpenSRF, try leaving your logging level\r
                        set to INTERNAL for a few minutes - just ensure that you have a lot of free disk\r
                        by sleeping for 10 seconds the first time it receives a given cache key and\r
                        cannot retrieve a corresponding value from the cache:</simpara>\r
                        <formalpara><title>Simple caching OpenSRF service</title><para>\r
-                       <programlisting language="perl" linenumbering="unnumbered">use OpenSRF::Utils::Cache;<co id="CO7-1"/>\r
-                       sub test_cache {\r
-                           my $self = shift;\r
-                           my $conn = shift;\r
-                           my $test_key = shift;\r
-                           my $cache = OpenSRF::Utils::Cache-&gt;new('global'); <co id="CO7-2"/>\r
-                           my $cache_key = "opensrf.simple-text.test_cache.$test_key"; <co id="CO7-3"/>\r
-                           my $result = $cache-&gt;get_cache($cache_key) || undef; <co id="CO7-4"/>\r
-                           if ($result) {\r
-                               $logger-&gt;info("Resolver found a cache hit");\r
-                               return $result;\r
-                           }\r
-                           sleep 10; <co id="CO7-5"/>\r
-                           my $cache_timeout = 300; <co id="CO7-6"/>\r
-                           $cache-&gt;put_cache($cache_key, "here", $cache_timeout); <co id="CO7-7"/>\r
-                           return "There was no cache hit.";\r
-                       }</programlisting>\r
+<programlisting language="perl" linenumbering="unnumbered">\r
+use OpenSRF::Utils::Cache;<co id="CO7-1"/>\r
+sub test_cache {\r
+    my $self = shift;\r
+    my $conn = shift;\r
+    my $test_key = shift;\r
+    my $cache = OpenSRF::Utils::Cache-&gt;new('global'); <co id="CO7-2"/>\r
+    my $cache_key = "opensrf.simple-text.test_cache.$test_key"; <co id="CO7-3"/>\r
+    my $result = $cache-&gt;get_cache($cache_key) || undef; <co id="CO7-4"/>\r
+    if ($result) {\r
+       $logger-&gt;info("Resolver found a cache hit");\r
+       return $result;\r
+    }\r
+    sleep 10; <co id="CO7-5"/>\r
+    my $cache_timeout = 300; <co id="CO7-6"/>\r
+    $cache-&gt;put_cache($cache_key, "here", $cache_timeout); <co id="CO7-7"/>\r
+    return "There was no cache hit.";\r
+}\r
+</programlisting>\r
                        </para></formalpara>\r
                        <calloutlist>\r
                        <callout arearefs="CO7-1">\r
                        OpenSRF requests and returns OpenSRF results as HTTP results to the initiating\r
                        HTTP client.</simpara>\r
                        <formalpara><title>Issuing an HTTP POST request to an OpenSRF method via the OpenSRF HTTP Translator</title><para>\r
-                       <programlisting language="bash" linenumbering="unnumbered"># curl request broken up over multiple lines for legibility\r
-                       curl -H "X-OpenSRF-service: opensrf.simple-text"<co id="CO8-1"/>\r
-                           --data 'osrf-msg=[  \<co id="CO8-2"/>\r
-                               {"__c":"osrfMessage","__p":{"threadTrace":0,"locale":"en-CA", <co id="CO8-3"/>\r
-                                   "type":"REQUEST","payload": {"__c":"osrfMethod","__p": \r
-                                       {"method":"opensrf.simple-text.reverse","params":["foobar"]}   \r
-                                   }}                                                                  \r
-                               }]'                                                                    \r
-                       http://localhost/osrf-http-translator <co id="CO8-4"/></programlisting>\r
+<programlisting language="bash" linenumbering="unnumbered">\r
+# curl request broken up over multiple lines for legibility\r
+curl -H "X-OpenSRF-service: opensrf.simple-text"<co id="CO8-1"/>\r
+    --data 'osrf-msg=[  \<co id="CO8-2"/>\r
+       {"__c":"osrfMessage","__p":{"threadTrace":0,"locale":"en-CA", <co id="CO8-3"/>\r
+           "type":"REQUEST","payload": {"__c":"osrfMethod","__p": \r
+               {"method":"opensrf.simple-text.reverse","params":["foobar"]}   \r
+           }}                                                                  \r
+       }]'                                                                    \r
+http://localhost/osrf-http-translator <co id="CO8-4"/>\r
+</programlisting>\r
                        </para></formalpara>\r
                        <calloutlist>\r
                        <callout arearefs="CO8-1">\r
                        </callout>\r
                        </calloutlist>\r
                        <formalpara><title>Results from an HTTP POST request to an OpenSRF method via the OpenSRF HTTP Translator</title><para>\r
-                       <programlisting language="bash" linenumbering="unnumbered"># HTTP response broken up over multiple lines for legibility\r
-                       [{"__c":"osrfMessage","__p":   <co id="CO9-1"/>\r
-                           {"threadTrace":0, "payload": <co id="CO9-2"/>\r
-                               {"__c":"osrfResult","__p": <co id="CO9-3"/>\r
-                                   {"status":"OK","content":"raboof","statusCode":200} <co id="CO9-4"/>\r
-                               },"type":"RESULT","locale":"en-CA" <co id="CO9-5"/>\r
-                           }\r
-                       },\r
-                       {"__c":"osrfMessage","__p":   <co id="CO9-6"/>\r
-                           {"threadTrace":0,"payload":  <co id="CO9-7"/>\r
-                               {"__c":"osrfConnectStatus","__p": <co id="CO9-8"/>\r
-                                   {"status":"Request Complete","statusCode":205}<co id="CO9-9"/>\r
-                               },"type":"STATUS","locale":"en-CA"  <co id="CO9-10"/>\r
-                           }\r
-                       }]</programlisting>\r
+<programlisting language="bash" linenumbering="unnumbered">\r
+# HTTP response broken up over multiple lines for legibility\r
+[{"__c":"osrfMessage","__p":   <co id="CO9-1"/>\r
+    {"threadTrace":0, "payload": <co id="CO9-2"/>\r
+       {"__c":"osrfResult","__p": <co id="CO9-3"/>\r
+           {"status":"OK","content":"raboof","statusCode":200} <co id="CO9-4"/>\r
+       },"type":"RESULT","locale":"en-CA" <co id="CO9-5"/>\r
+    }\r
+},\r
+{"__c":"osrfMessage","__p":   <co id="CO9-6"/>\r
+    {"threadTrace":0,"payload":  <co id="CO9-7"/>\r
+       {"__c":"osrfConnectStatus","__p": <co id="CO9-8"/>\r
+           {"status":"Request Complete","statusCode":205}<co id="CO9-9"/>\r
+       },"type":"STATUS","locale":"en-CA"  <co id="CO9-10"/>\r
+    }\r
+}]\r
+</programlisting>\r
                        </para></formalpara>\r
                        <calloutlist>\r
                        <callout arearefs="CO9-1">\r
                        the advantages of locale support and tracing the request from the requester\r
                        through the listener and responder (drone).</simpara>\r
                        <formalpara><title>A request for opensrf.simple-text.reverse("foobar"):</title><para>\r
-                       <programlisting language="xml" linenumbering="unnumbered">&lt;message from='router@private.localhost/opensrf.simple-text'\r
-                         to='opensrf@private.localhost/opensrf.simple-text_listener_at_localhost_6275'\r
-                         router_from='opensrf@private.localhost/_karmic_126678.3719_6288'\r
-                         router_to='' router_class='' router_command='' osrf_xid=''\r
-                       &gt;\r
-                         &lt;thread&gt;1266781414.366573.12667814146288&lt;/thread&gt;\r
-                         &lt;body&gt;\r
-                       [\r
-                         {"__c":"osrfMessage","__p":\r
-                           {"threadTrace":"1","locale":"en-US","type":"REQUEST","payload":\r
-                             {"__c":"osrfMethod","__p":\r
-                               {"method":"opensrf.simple-text.reverse","params":["foobar"]}\r
-                             }\r
-                           }\r
-                         }\r
-                       ]\r
-                         &lt;/body&gt;\r
-                       &lt;/message&gt;</programlisting>\r
+<programlisting language="xml" linenumbering="unnumbered">\r
+&lt;message from='router@private.localhost/opensrf.simple-text'\r
+  to='opensrf@private.localhost/opensrf.simple-text_listener_at_localhost_6275'\r
+  router_from='opensrf@private.localhost/_karmic_126678.3719_6288'\r
+  router_to='' router_class='' router_command='' osrf_xid=''\r
+&gt;\r
+  &lt;thread&gt;1266781414.366573.12667814146288&lt;/thread&gt;\r
+  &lt;body&gt;\r
+[\r
+  {"__c":"osrfMessage","__p":\r
+    {"threadTrace":"1","locale":"en-US","type":"REQUEST","payload":\r
+      {"__c":"osrfMethod","__p":\r
+       {"method":"opensrf.simple-text.reverse","params":["foobar"]}\r
+      }\r
+    }\r
+  }\r
+]\r
+  &lt;/body&gt;\r
+&lt;/message&gt;\r
+</programlisting>\r
                        </para></formalpara>\r
                        <formalpara><title>A response from opensrf.simple-text.reverse("foobar")</title><para>\r
-                       <programlisting language="xml" linenumbering="unnumbered">&lt;message from='opensrf@private.localhost/opensrf.simple-text_drone_at_localhost_6285'\r
-                         to='opensrf@private.localhost/_karmic_126678.3719_6288'\r
-                         router_command='' router_class='' osrf_xid=''\r
-                       &gt;\r
-                         &lt;thread&gt;1266781414.366573.12667814146288&lt;/thread&gt;\r
-                         &lt;body&gt;\r
-                       [\r
-                         {"__c":"osrfMessage","__p":\r
-                           {"threadTrace":"1","payload":\r
-                             {"__c":"osrfResult","__p":\r
-                               {"status":"OK","content":"raboof","statusCode":200}\r
-                             } ,"type":"RESULT","locale":"en-US"}\r
-                         },\r
-                         {"__c":"osrfMessage","__p":\r
-                           {"threadTrace":"1","payload":\r
-                             {"__c":"osrfConnectStatus","__p":\r
-                               {"status":"Request Complete","statusCode":205}\r
-                             },"type":"STATUS","locale":"en-US"}\r
-                         }\r
-                       ]\r
-                         &lt;/body&gt;\r
-                       &lt;/message&gt;</programlisting>\r
+<programlisting language="xml" linenumbering="unnumbered">\r
+&lt;message from='opensrf@private.localhost/opensrf.simple-text_drone_at_localhost_6285'\r
+  to='opensrf@private.localhost/_karmic_126678.3719_6288'\r
+  router_command='' router_class='' osrf_xid=''\r
+&gt;\r
+  &lt;thread&gt;1266781414.366573.12667814146288&lt;/thread&gt;\r
+  &lt;body&gt;\r
+[\r
+  {"__c":"osrfMessage","__p":\r
+    {"threadTrace":"1","payload":\r
+      {"__c":"osrfResult","__p":\r
+       {"status":"OK","content":"raboof","statusCode":200}\r
+      } ,"type":"RESULT","locale":"en-US"}\r
+  },\r
+  {"__c":"osrfMessage","__p":\r
+    {"threadTrace":"1","payload":\r
+      {"__c":"osrfConnectStatus","__p":\r
+       {"status":"Request Complete","statusCode":205}\r
+      },"type":"STATUS","locale":"en-US"}\r
+  }\r
+]\r
+  &lt;/body&gt;\r
+&lt;/message&gt;\r
+</programlisting>\r
                        </para></formalpara>\r
                        <simpara>The content of the <literal>&lt;body&gt;</literal> element of the OpenSRF request and result should\r
                        look familiar; they match the structure of the <link linkend="OpenSRFOverHTTP">OpenSRF over HTTP examples</link> that we previously dissected.</simpara>\r
                        </listitem>\r
                        <listitem>\r
                        <simpara>\r
-                       The optional <literal>stream</literal> member, if set to any value, specifies that the method supports returning multiple values from a single call to subsequent requests. OpenSRF automatically creates a corresponding method with ".atomic" appended to its name that returns the complete set of results in a single request. Streaming methods are useful if you are returning hundreds of records and want to act on the results as they return.\r
+                       The optional <literal>stream</literal> member, if set to any value, specifies that the method supports returning multiple values from a single call to \r
+                       subsequent requests. OpenSRF automatically creates a corresponding method with ".atomic" appended to its name that returns the complete set of results in a \r
+                       single request. Streaming methods are useful if you are returning hundreds of records and want to act on the results as they return.\r
                        </simpara>\r
                        </listitem>\r
                        <listitem>\r
                        </listitem>\r
                        <listitem>\r
                        <simpara>\r
-                       The <literal>params</literal> member of the <literal>signature</literal> hash is an array of hashes in which each array element describes the corresponding method argument in order.\r
+                       The <literal>params</literal> member of the <literal>signature</literal> hash is an array of hashes in which each array element describes the corresponding method \r
+                       argument in order.\r
                        </simpara>\r
                        <itemizedlist>\r
                        <listitem>\r
                        </listitem>\r
                        <listitem>\r
                        <simpara>\r
-                       The <literal>type</literal> member of the <literal>return</literal> hash specifies the data type of the return value: for example, string, integer, boolean, number, array, or hash.\r
+                       The <literal>type</literal> member of the <literal>return</literal> hash specifies the data type of the return value: for example, string, integer, boolean, number, \r
+                       array, or hash.\r
                        </simpara>\r
                        </listitem>\r
                        </itemizedlist>\r
                <itemizedlist>\r
                <listitem>\r
                <simpara>\r
-               The <literal>open-ils.actor</literal> service supports common tasks for working with user\r
+               The <systemitem class="service">open-ils.actor</systemitem> service supports common tasks for working with user\r
                     accounts and libraries.\r
                </simpara>\r
                </listitem>\r
                <listitem>\r
                <simpara>\r
-               The <literal>open-ils.auth</literal> service supports authentication of Evergreen users.\r
+               The <systemitem class="service">open-ils.auth</systemitem> service supports authentication of Evergreen users.\r
                </simpara>\r
                </listitem>\r
                <listitem>\r
                <simpara>\r
-               The <literal>open-ils.booking</literal> service supports the management of reservations\r
+               The <systemitem class="service">open-ils.booking</systemitem> service supports the management of reservations\r
                    for bookable items.\r
                </simpara>\r
                </listitem>\r
                <listitem>\r
                <simpara>\r
-               The <literal>open-ils.cat</literal> service supports common cataloging tasks, such as\r
+               The <systemitem class="service">open-ils.cat</systemitem> service supports common cataloging tasks, such as\r
                     creating, modifying, and merging bibliographic and authority records.\r
                </simpara>\r
                </listitem>\r
                <listitem>\r
                <simpara>\r
-               The <literal>open-ils.circ</literal> service supports circulation tasks such as checking\r
+               The <systemitem class="service">open-ils.circ</systemitem> service supports circulation tasks such as checking\r
                    out items and calculating due dates.\r
                </simpara>\r
                </listitem>\r
                <listitem>\r
                <simpara>\r
-               The <literal>open-ils.collections</literal> service supports tasks that assist collections\r
+               The <systemitem class="service">open-ils.collections</systemitem> service supports tasks that assist collections\r
                    agencies in contacting users with outstanding fines above a certain\r
                    threshold.\r
                </simpara>\r
                </listitem>\r
                <listitem>\r
                <simpara>\r
-               The <literal>open-ils.cstore</literal> private service supports unrestricted access to\r
+               The <systemitem class="service">open-ils.cstore</systemitem> private service supports unrestricted access to\r
                    Evergreen fieldmapper objects.\r
                </simpara>\r
                </listitem>\r
                <listitem>\r
                <simpara>\r
-               The <literal>open-ils.ingest</literal> private service supports tasks for importing\r
+               The <systemitem class="service">open-ils.ingest</systemitem> private service supports tasks for importing\r
                    data such as bibliographic and authority records.\r
                </simpara>\r
                </listitem>\r
                <listitem>\r
                <simpara>\r
-               The <literal>open-ils.pcrud</literal> service supports permission-based access to Evergreen\r
+               The <systemitem class="service">open-ils.pcrud</systemitem> service supports permission-based access to Evergreen\r
                    fieldmapper objects.\r
                </simpara>\r
                </listitem>\r
                <listitem>\r
                <simpara>\r
-               The <literal>open-ils.penalty</literal> penalty service supports the calculation of\r
+               The <systemitem class="service">open-ils.penalty</systemitem> penalty service supports the calculation of\r
                    penalties for users, such as being blocked from further borrowing, for\r
                    conditions such as having too many items checked out or too many unpaid\r
                    fines.\r
                </listitem>\r
                <listitem>\r
                <simpara>\r
-               The <literal>open-ils.reporter</literal> service supports the creation and scheduling of\r
+               The <systemitem class="service">open-ils.reporter</systemitem> service supports the creation and scheduling of\r
                    reports.\r
                </simpara>\r
                </listitem>\r
                <listitem>\r
                <simpara>\r
-               The <literal>open-ils.reporter-store</literal> private service supports access to Evergreen\r
+               The <systemitem class="service">open-ils.reporter-store</systemitem> private service supports access to Evergreen\r
                    fieldmapper objects for the reporting service.\r
                </simpara>\r
                </listitem>\r
                <listitem>\r
                <simpara>\r
-               The <literal>open-ils.search</literal> service supports searching across bibliographic\r
+               The <systemitem class="service">open-ils.search</systemitem> service supports searching across bibliographic\r
                    records, authority records, serial records, Z39.50 sources, and ZIP codes.\r
                </simpara>\r
                </listitem>\r
                <listitem>\r
                <simpara>\r
-               The <literal>open-ils.storage</literal> private service supports a deprecated method of\r
+               The <systemitem class="service">open-ils.storage</systemitem> private service supports a deprecated method of\r
                    providing access to Evergreen fieldmapper objects. Implemented in Perl,\r
                    this service has largely been replaced by the much faster C-based\r
                    <literal>open-ils.cstore</literal> service.\r
                </listitem>\r
                <listitem>\r
                <simpara>\r
-               The <literal>open-ils.supercat</literal> service supports transforms of MARC records into\r
+               The <systemitem class="service">open-ils.supercat</systemitem> service supports transforms of MARC records into\r
                    other formats, such as MODS, as well as providing Atom and RSS feeds and\r
                    SRU access.\r
                </simpara>\r
                </listitem>\r
                <listitem>\r
                <simpara>\r
-               The <literal>open-ils.trigger</literal> private service supports event-based triggers for\r
+               The <systemitem class="service">open-ils.trigger</systemitem> private service supports event-based triggers for\r
                    actions such as overdue and holds available notification emails.\r
                </simpara>\r
                </listitem>\r
                <listitem>\r
                <simpara>\r
-               The <literal>open-ils.vandelay</literal> service supports the import and export of batches of\r
+               The <systemitem class="service">open-ils.vandelay</systemitem> service supports the import and export of batches of\r
                    bibliographic and authority records.\r
                </simpara>\r
                </listitem>\r
                </itemizedlist>\r
-               <simpara>Of some interest is that the <literal>open-ils.reporter-store</literal> and <literal>open-ils.cstore</literal>\r
+               <simpara>Of some interest is that the <systemitem class="service">open-ils.reporter-store</systemitem> and <systemitem class="service">open-ils.cstore</systemitem>\r
                services have identical implementations. Surfacing them as separate services\r
                enables a deployer of Evergreen to ensure that the reporting service does not\r
-               interfere with the performance-critical <literal>open-ils.cstore</literal> service. One can also\r
+               interfere with the performance-critical <systemitem class="service">open-ils.cstore</systemitem> service. One can also\r
                direct the reporting service to a read-only database replica to, again, avoid\r
-               interference with <literal>open-ils.cstore</literal> which must write to the master database.</simpara>\r
+               interference with <systemitem class="service">open-ils.cstore</systemitem> which must write to the master database.</simpara>\r
                <simpara>There are only a few significant services that are not built on OpenSRF in\r
                Evergreen 1.6.0, such as the SIP and Z39.50 servers. These services implement\r
                different protocols and build on existing daemon architectures (Simple2ZOOM\r