(file) Return to Globalization_HOWTO.htm CVS log (file) (dir) Up to [Pegasus] / pegasus / doc

   1 chuck 1.5 <!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en">
   2 chuck 1.1 <html>
   3           <head>
   4 chuck 1.5   <meta http-equiv="Content-Type"
   5            content="text/html; charset=iso-8859-1">
   6             <meta name="GENERATOR"
   7            content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]">
   8 chuck 1.1 </head>
   9 chuck 1.5 <body text="#000000" bgcolor="#ffffff" link="#0000ef" vlink="#55188a"
  10            alink="#ff0000">
  11 chuck 1.6 <center>
  12           <p><big><big><big>Globalization HOWTO</big></big></big></p>
  13 chuck 1.5 <p>Release: Pegasus 2.3 </p>
  14           <p>Author: Chuck Carmack (carmack@us.ibm.com) </p>
  15 chuck 1.6 <p>December 1, 2003</p>
  16 chuck 1.5 </center>
  17           <p><br>
  18 chuck 1.6 Change History:<br>
  19           </p>
  20           <table cellpadding="2" cellspacing="2" border="1"
  21            style="text-align: left; width: 100%; margin-left: auto; margin-right: auto;">
  22             <tbody>
  23               <tr>
  24                 <td style="vertical-align: top;">01/12/03<br>
  25                 </td>
  26                 <td style="vertical-align: top;">carmack<br>
  27                 </td>
  28                 <td style="vertical-align: top;">Section 2.2.2. &nbsp;Changed how
  29           the package name parameter should be used. &nbsp;It should no longer be
  30           used as part of the table name inside the bundle.<br>
  31                 </td>
  32               </tr>
  33 sushma.fernandes 1.6.38.1     <tr>
  34                                 <td style="vertical-align: top;">01/23/07<br>
  35                                 </td>
  36                                 <td style="vertical-align: top;">Sushma Fernandes<br>
  37                                 </td>
  38                                 <td style="vertical-align: top;">Section 2.2.5. &nbsp; Added information on special considerations while creating a new message.<br>
  39                                 </td>
  40                               </tr>
  41 chuck            1.6        </tbody>
  42                           </table>
  43                           <p><br>
  44 chuck            1.5      </p>
  45                           <h2> 1.0 Introduction</h2>
  46                           <p><br>
  47                           As part of the Pegasus 2.3 release, functions were added for
  48                           globalization support.&nbsp;&nbsp; Globalization involves two major
  49                           aspects:&nbsp; internationalization and localization. <br>
  50                           &nbsp; </p>
  51                           <p>Internationalization is the process of writing a program that is
  52                           locale-neutral.&nbsp; In other words, the program should be able to run
  53                           in any locale without change.&nbsp; There are several categories in a
  54                           locale, including the language of message strings, date format, time
  55 chuck            1.6      format, etc.&nbsp; For release 2.3, the Pegasus server is concerned with
  56                           the language of the message strings it returns to its clients. <br>
  57 chuck            1.5      &nbsp; </p>
  58                           <p>To support internationalization, a program is designed to do the
  59                           following: <br>
  60                           &nbsp; </p>
  61                           <blockquote> <li> Support character sets that can represent customer
  62                           data in any language.&nbsp; Typically, the program supports some
  63                           variation of Unicode for internal data.&nbsp; There is usually some
  64                           conversion between the supported character sets for external data, and
  65                           the internal character set.&nbsp; Since Unicode covers all characters,
  66                           and usually has converters on the platform, it is a good choice for the
  67                           'normalized' internal character set.&nbsp;&nbsp;&nbsp; The most
  68                           'interoperable' solution for external data is to support UTF-8 (eg.
  69 chuck            1.6      network and file system data).&nbsp; The internal data is usually UTF-16
  70                           (or UCS-2, but that is deprecated).</li>
  71 chuck            1.5        <br>
  72                           &nbsp; <li> Extract locale-sensitive resources, such as message
  73                           strings, from the code to external resource files.&nbsp; Typically, the
  74                           resources are loaded based on the locale requested by the end-user, and
  75                           returned to the end-user for display.</li>
  76 chuck            1.1      </blockquote>
  77 chuck            1.5      <p><br>
  78                           Localization is the process of customizing a software product to
  79                           support particular locales.&nbsp; For example, a product that is
  80                           internationalized might want to only localize for certain
  81                           countries.&nbsp; This would mean that the localized resources (eg.
  82                           message files) would only be translated and shipped for the countries
  83                           that the product supports.&nbsp; Since the code for the product is
  84                           locale-neutral, it will be easy to drop in new translations as more
  85                           countries are supported. <br>
  86                           &nbsp; </p>
  87 chuck            1.1      <p>The Pegasus 2.3 release added support for globalization.&nbsp; At a
  88 chuck            1.5      high-level, the following additions were made to Pegasus 2.3: <br>
  89                           &nbsp; </p>
  90 chuck            1.1      <ul>
  91 chuck            1.5        <li> Support UTF-8 for external data.</li>
  92                             <br>
  93                           &nbsp;
  94                             <ul>
  95                               <li> The CIM-XML documents contained in the HTTP messages</li>
  96                               <li> The files in the repository</li>
  97                               <li> Note:&nbsp; Pegasus 2.3 does NOT&nbsp;support UTF-8 in the MOF
  98                           files</li>
  99                               <br>
 100                           &nbsp;
 101                             </ul>
 102                             <li> Support UTF-16 for internal data.</li>
 103                             <br>
 104                           &nbsp; <li> Extract the hardcoded messages from the Pegasus code into
 105                           message files.&nbsp; An API was added to load messages from the message
 106                           files.</li>
 107                             <br>
 108                           &nbsp; <li> APIs were added for clients to associate a language with
 109 chuck            1.6      the CIM objects they are sending to Pegasus.&nbsp; Also, APIs were added
 110                           for clients to determine the language of the error message or CIM
 111 chuck            1.5      object that Pegasus returns.</li>
 112                             <br>
 113                           &nbsp; <li> APIs were added for providers to determine the language of
 114                           CIM objects sent by the client.&nbsp; Also, APIs were added for
 115 chuck            1.6      providers to associate a language with the CIM object, or error message,
 116                           they return to the client.</li>
 117 chuck            1.1      </ul>
 118 chuck            1.5      <p><br>
 119                           Please refer to PEPs 56 and 58 for details about the globalization
 120                           design in Pegasus 2.3. <br>
 121                           &nbsp; </p>
 122                           <p>This document provides a HOWTO guide to be used by developers to
 123                           globalize code that is being added to Pegasus.&nbsp; The audience for
 124                           this document are: <br>
 125                           &nbsp; </p>
 126 chuck            1.1      <ul>
 127 chuck            1.5        <li> Provider developers - both CMPI and C++</li>
 128                             <li> Client developers</li>
 129                             <li> Pegasus developers</li>
 130 chuck            1.1      </ul>
 131 chuck            1.5      <p><br>
 132                           The quickest way to approach this document is to read the General
 133                           section, and then the developer section that relates to what you are
 134                           doing. <br>
 135                           &nbsp; </p>
 136                           <h2> 2.0 General</h2>
 137 chuck            1.1      &nbsp;
 138 chuck            1.5      <h3> 2.1 Unicode Support</h3>
 139                           <p><br>
 140                           Pegasus 2.3 supports Unicode throughout the processing of
 141                           requests.&nbsp; External data to Pegasus is encoded in UTF-8.&nbsp;
 142                           Internal data is encoded in UTF-16. <br>
 143                           &nbsp; </p>
 144 chuck            1.4      <p>UTF-8 support for external data includes the CIM-XML messages passed
 145 chuck            1.5      over the network, and the repository files.&nbsp; Note:&nbsp; UTF-8
 146                           support was NOT added to the MOF&nbsp;Compiler for MOF files in release
 147                           2.3.&nbsp; For the CIM-XML messages, Pegasus follows section 4.8 of
 148                           the&nbsp; <a
 149                            href="http://www.dmtf.org/standards/documents/WBEM/DSP200.html">CIM-HTTP
 150 chuck            1.1      specification</a>&nbsp;&nbsp;&nbsp; Specifically, Pegasus supports the
 151                           "utf-8" setting for the charset parameter of the Content-Type header and
 152                           the XML encoding attribute.&nbsp; If no charset is specified, the 7-bit
 153 chuck            1.5      ASCII is assumed. <br>
 154                           &nbsp; </p>
 155 chuck            1.1      <p>The internal support of UTF-16 is encapsulated in the Pegasus String
 156 chuck            1.5      class.&nbsp; This class has been updated to contain UTF-16
 157                           characters.&nbsp; Specifically, the Char16 objects inside the String
 158                           contain UTF-16 characters.&nbsp; Note: a UTF-16 surrogate pair is
 159                           contained in two consecutive Char16 objects.&nbsp; To keep backwards
 160                           compatibilty, the methods on the String class have not changed.&nbsp;
 161                           New methods have been added as needed.&nbsp; The following describes
 162                           this in more detail: </p>
 163 chuck            1.1      <ul>
 164 chuck            1.5        <li> The Pegasus 2.2 methods that take a char *, or return char *, are
 165                           unchanged.&nbsp; Code written to Pegasus 2.2 may have expected to store
 166                           8-bit ASCII (ISO-8859-1) characters into String.&nbsp; These methods
 167 chuck            1.6      will convert the input to UTF-16 from 8-bit ASCII.&nbsp; (This is simple
 168                           because UTF-16 is a superset of 8-bit ASCII - simply need to prepend
 169                           '\0' to each char).&nbsp; The Pegasus 2.2 methods that return char data
 170                           will attempt to convert from the UTF-16 internal representation to
 171                           8-bit ASCII.&nbsp; Characters that cannot be converted will be replaced
 172                           with a substitution character.</li>
 173 chuck            1.5        <br>
 174                           &nbsp; <li> All methods that take or return Char16 data are
 175                           unchanged.&nbsp; The String class now supports UTF-16 data in Char16,
 176                           although surrogate pairs will require two consecutive Char16
 177 chuck            1.6      objects.&nbsp; The String class does NO checking for unmatched surrogate
 178                           pairs.</li>
 179 chuck            1.5        <br>
 180                           &nbsp; <li> New methods have been added to take and return UTF-8
 181                           data.&nbsp; The String class will convert between UTF-8 and the UTF-16
 182 chuck            1.6      internal representation as needed.&nbsp; These new methods will use char
 183                           * parameters, but will be clearly labelled as UTF-8 methods.</li>
 184 chuck            1.5        <br>
 185                           &nbsp;
 186                           </ul>
 187                           PROGRAMMING NOTE:&nbsp; Putting EBCDIC data into the String class is
 188                           dangerous.&nbsp; The String class is designed for UTF-16, which is a
 189                           superset of 8-bit ASCII.&nbsp; Any String object containing EBCDIC data
 190                           will not work if it is used by Pegasus to read or write data from
 191                           external sources, such as the network or repository files.&nbsp; In
 192 chuck            1.6      other words, any String containing EBCDIC data should not leave the code
 193                           using it. <br>
 194 chuck            1.5      &nbsp; <br>
 195                           &nbsp;
 196                           <h3> 2.2 Localization Support</h3>
 197 chuck            1.1      &nbsp;
 198 chuck            1.5      <h4> 2.2.1 Language Headers</h4>
 199                           <p><br>
 200                           Pegasus 2.3 supports clients and providers that wish to localize.&nbsp;
 201                           There are two areas to be localized:&nbsp; <a
 202                            href="http://www.dmtf.org/standards/documents/WBEM/DSP201.html#SecERROR">ERROR</a>&nbsp;
 203                           elements in the CIM-XML; and&nbsp; <a
 204                            href="http://www.dmtf.org/standards/documents/WBEM/DSP201.html#SecObjectDefinitionElements">Object
 205                           Definition</a>&nbsp; elements in the CIM-XML.&nbsp; Clients can
 206                           request&nbsp; the server to return error messages and CIM objects in a
 207                           set of languages of their choosing.&nbsp; Clients can also tag a
 208                           language to the CIM objects they are sending to the server.&nbsp;
 209                           Providers and the server can return error messages and CIM objects that
 210                           are tagged with one of&nbsp; languages requested by the client. <br>
 211                           &nbsp; </p>
 212                           <p>The localization design is based on section 4.8 of the <a
 213                            href="http://www.dmtf.org/standards/documents/WBEM/DSP200.html">CIM-HTTP
 214                           specification</a> , which refers to <a
 215                            href="http://www.ietf.org/rfc/rfc2616.txt?number=2616">RFC 2616</a>.&nbsp;
 216                           The method used to tag a language to the CIM-XML is through the
 217                           Accept-Language and Content-Language HTTP headers.&nbsp; These headers
 218 chuck            1.1      are basically lists of language tags.&nbsp; An HTTP request can contain
 219 chuck            1.5      an Accept-Language header, which indicates the list of preferred
 220                           languages that the client wants in the response.&nbsp; This list can be
 221                           prioritized by using the quality numbers.&nbsp; An HTTP request or
 222                           response can contain a Content-Language header, which indicates the
 223                           language(s) of the content in the message.&nbsp; In the Pegasus case,
 224                           this would be the CIM-XML.&nbsp; Note that the Content-Language header
 225                           is a list of language tags.&nbsp; This allows the content of an HTTP
 226                           message to contain more than one translation.&nbsp; However, in the
 227                           Pegasus case, there is only one CIM-XML document in the HTTP message,
 228                           and thus one translation. <br>
 229                           &nbsp; </p>
 230                           <p>CIM clients may use the Accept-Language HTTP header to specify the
 231                           languages they wish to be returned in the CIM response message.&nbsp;
 232 chuck            1.6      CIM clients may also use the Content-Language header to tag the language
 233                           of any CIM objects they are sending to the server in the CIM request
 234                           message.&nbsp; The server, and providers, should attempt to return
 235                           error messages and CIM objects in one of the accept languages requested
 236                           by the client.&nbsp; The server and providers should set the
 237                           Content-Language header in the CIM response message to indicate which of
 238                           the requested languages they are returning. <br>
 239 chuck            1.5      &nbsp; </p>
 240 chuck            1.1      <p>NOTE:&nbsp; Localization support was not added for the MOF files and
 241 chuck            1.5      repository in Pegasus 2.3.&nbsp; The #pragma locale, #pragma
 242                           instancelocale, and translatable qualifier flavor are not supported in
 243                           the Pegasus 2.3 MOF compiler.&nbsp; From the client perspective,
 244                           classes, qualifiers, and instances stored in the repository are not
 245                           tagged with a language.&nbsp; The Accept-Language and Content-Language
 246                           headers will be ignored for repository operations.&nbsp; However, since
 247 chuck            1.6      the repository will support UTF-8,&nbsp; characters for any language may
 248                           be stored there. <br>
 249 chuck            1.5      &nbsp; </p>
 250 chuck            1.1      <p>NOTE:&nbsp; Since the Content-Language header applies to the entire
 251 chuck            1.5      HTTP message, it applies to the entire CIM-XML document.&nbsp; This
 252                           includes all the objects in the document, including enumerated objects,
 253                           and all the values in the objects.&nbsp; This is a limitation that will
 254                           remain until the CIM standard has been updated to support language tags
 255                           tied to individual CIM values.&nbsp; From the client perspective, it is
 256                           possible for Pegasus to send a CIM response with NO Content-Language,
 257 chuck            1.6      even if the client had sent Accept-Language.&nbsp;&nbsp; This can happen
 258                           if Pegasus does not know the language of the response.&nbsp; An example
 259                           is a request that was sent to a Pegasus 2.2 provider.&nbsp; Another
 260                           example is an enumerated response where each provider returned a
 261                           different language.&nbsp; Please refer to PEP58 for details on these
 262 chuck            1.5      provider scenarios. <br>
 263                           &nbsp; </p>
 264                           <p>Pegasus 2.3 has added classes for the localization support.&nbsp;
 265                           There are new classes called AcceptLanguages and ContentLanguages that
 266                           encapsulate the Accept-Language and Content-Language headers,
 267                           respectively.&nbsp; These classes are basically containers of
 268                           AcceptLanguageElement and ContentLanguageElement, where a language
 269                           element represents one language tag.&nbsp; The AcceptLanguages class
 270                           will keep the AcceptLanguageElement's prioritized based on quality,
 271                           according to RFC 2616. <br>
 272                           &nbsp; </p>
 273                           <p>AcceptLanguages and ContentLanguages are the objects used by code
 274                           throughout the request/response processing, from the client to the
 275                           server to the providers and back.&nbsp; The server handles the creation
 276                           of these objects from the HTTP headers.&nbsp; Code at each point in the
 277                           process will have access to these objects. <br>
 278                           &nbsp; </p>
 279                           <p>Please refer to the following files for details on the new Pegasus
 280                           classes. <br>
 281                           &nbsp; </p>
 282 chuck            1.1      <ul>
 283 chuck            1.5        <li> pegasus/src/Pegasus/Common/AcceptLanguages.h</li>
 284                             <li> pegasus/src/Pegasus/Common/AcceptLanguageElement.h</li>
 285                             <li> pegasus/src/Pegasus/Common/ContentLanguages.h</li>
 286                             <li> pegasus/src/Pegasus/Common/ContentLanguageElement.h</li>
 287                             <li> pegasus/src/Pegasus/Common/LanguageElementContainer.h</li>
 288                             <li> pegasus/src/Pegasus/Common/LanguageElement.h</li>
 289 chuck            1.1      </ul>
 290 chuck            1.5      <p><br>
 291                           See the sections below for details on how to write clients and
 292                           providers to use these classes. <br>
 293                           &nbsp; <br>
 294                           &nbsp; </p>
 295                           <h4> 2.2.2 Message Bundles</h4>
 296                           <p><br>
 297                           One of the goals of globalization for Pegasus 2.3 is the extraction of
 298                           hardcoded messages&nbsp; into translated message files, loading
 299                           translated messages from those files, and returning those messages to
 300                           the client.&nbsp; The topics to be discussed here are:&nbsp; how to
 301                           create message files, how to compile message files, and how to load
 302                           messages into Pegasus. <br>
 303                           &nbsp; </p>
 304 chuck            1.1      <p>At the time of writing, the message loading function in Pegasus 2.3
 305 chuck            1.5      used the International Components for Unicode (<a
 306                            href="http://oss.software.ibm.com/icu">ICU)</a> libraries.&nbsp; This
 307                           is expected to be the future direction for Pegasus. <a
 308                            href="http://oss.software.ibm.com/icu">ICU </a>uses a resource bundle
 309                           format for their message files.&nbsp;&nbsp; In order to load the
 310                           messages, ICU requires that the resource bundles are compiled into a
 311                           binary form (.res file) using their genrb tool. <br>
 312                           &nbsp; </p>
 313                           <p>Platform Maintainers Note:&nbsp; Please refer to PEP 58 for
 314                           information about how to build Pegasus to use the ICU libraries. <br>
 315                           &nbsp; </p>
 316                           <p>The documentation for ICU resource bundles is in the <a
 317                            href="http://oss.software.ibm.com/icu/userguide/ResourceManagement.html">Resource
 318                           Management</a>&nbsp; section of the <a
 319                            href="http://oss.software.ibm.com/icu/userguide/">ICU User Guide</a>
 320 chuck            1.6      .&nbsp; This section will tell you how to create and organize your
 321                           resource bundles for different languages.&nbsp; Note:&nbsp; your
 322                           resource bundles should be organized in a tree structure similiar to
 323                           the one shown in the Resource Management section, including the empty
 324                           bundles in the tree.&nbsp;<br>
 325                           </p>
 326                           <p><br>
 327                           It is recommended that you ship a root resource bundle to be used as
 328                           the fallback in case the client requests a language that you are not
 329 chuck            1.5      supporting.&nbsp; The Pegasus make files are set up to automatically
 330                           create and compile a root resource bundle for you.&nbsp; For Pegasus
 331                           2.3, the make will use your "en" bundle, upper case all the messages,
 332                           and then put the uppercased messages into the root bundle.&nbsp; The
 333                           uppercasing of the messages is necessary to create a "fallback" root
 334 chuck            1.6      bundle that contains invariant characters across all EBCDIC and
 335 chuck            1.5      ASCII&nbsp;codepages. <br>
 336                           &nbsp; </p>
 337                           <p>NOTE:&nbsp; When creating your resource bundles, the name of the
 338 chuck            1.6      table resource should <span style="font-style: italic;">not</span>
 339                           contain the package name.&nbsp;&nbsp;&nbsp; For example, if you <br>
 340                           have a bundle with a package name of "xyz", then the "en" bundle should
 341                           start like this: </p>
 342                           <p><br>
 343                           en:table { <br>
 344                           ..... messages here <br>
 345                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 346                           }</p>
 347                           <p><i>not</i> like this:</p>
 348 chuck            1.5      <p>xyz_en:table { <br>
 349                           ..... messages here <br>
 350                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 351                           } <br>
 352 chuck            1.6      &nbsp; <br>
 353                           </p>
 354                           <p>This is needed because the package name (-p) option is used by the
 355                           Pegasus make files on the call to genrb. <br>
 356 chuck            1.5      &nbsp; </p>
 357 chuck            1.1      <p>NOTE:&nbsp; Pegasus 2.3 only supports simple string resources in the
 358 chuck            1.5      ICU resource bundles.&nbsp; String resources may only be loaded by
 359                           key.&nbsp; Tables, arrays, and other complex resource types, are not
 360                           supported. <br>
 361                           &nbsp; </p>
 362 chuck            1.2      <p>In order to compile your resource bundles, support has been added to
 363 chuck            1.5      the Pegasus make files to run genrb.&nbsp; A new make target,
 364                           "messages", has been added that will call genrb and put the compiled
 365                           bundles (.res) in a directory of your choosing.&nbsp; An example of ICU
 366                           resource bundles and the make files to compile them are located in: <br>
 367                           &nbsp; </p>
 368 chuck            1.2      <ul>
 369 chuck            1.5        <li> pegasus/src/Providers/sample/LocalizedProvider/Makefile (just
 370                           causes the make to recurse to the msg sub-directory)</li>
 371                             <li> pegasus/src/Providers/sample/LocalizedProvider/msg/Makefile
 372                           (compiles the bundles in the msg/ directory)</li>
 373                             <li> pegasus/src/Providers/sample/LocalizedProvider/msg/*.txt (the
 374                           resource bundles to compile, using the recommended ICU language tree
 375                           structure)</li>
 376 chuck            1.2      </ul>
 377 chuck            1.5      <p><br>
 378                           NOTE:&nbsp; At the time of writing, only the Linux make files have been
 379                           updated to compile ICU resource bundles. <br>
 380                           &nbsp; </p>
 381                           <p>It is important to place the compiled resource bundles in a
 382                           directory where your code can find them .&nbsp; The make files above
 383                           compile the resource bundles into
 384                           $PEGASUS_HOME/msg/provider/localizedProvider.&nbsp; The code that loads
 385                           these messages uses the MessageLoader class (next section) to load
 386                           messages from this directory. <br>
 387                           &nbsp; <br>
 388                           &nbsp; </p>
 389                           <h4> 2.2.3 Message Loading</h4>
 390                           <p><br>
 391                           Code that needs to load a message in Pegasus does not call ICU
 392                           directly.&nbsp; Two message loading classes were added for Pegasus
 393 chuck            1.6      2.3:&nbsp; MessageLoader and MessageLoaderParms.&nbsp; These classes are
 394                           abstractions designed to hide of the actual loader used (but note that
 395                           at the time of writing, only ICU is supported).&nbsp;&nbsp; The
 396 chuck            1.5      MessageLoader is used to load a message using a list of preferrred
 397                           languages.&nbsp; The parameters to MessageLoader are encapsulated in a
 398                           MessageLoaderParms object. <br>
 399                           &nbsp; </p>
 400                           <p>The MessageLoader is the place where the Accept-Language header,
 401                           Content-Language header, and the ICU resource bundles, join up.&nbsp;
 402                           The MessageLoader class is designed to receive an AcceptLanguages
 403                           object, and a set of parameters indicating the bundle base-name and
 404 chuck            1.6      message ID to use.&nbsp; The AcceptLanguages object contains the list of
 405                           requested languages sent by the client.&nbsp; The MessageLoader
 406                           searches for the message in the set of bundles named with the base-name,
 407                           using the AcceptLanguages for the list of specific translated bundles
 408                           to search.&nbsp; The MessageLoader returns the message that it found,
 409                           along with a ContentLanguages object indicating the language of the
 410                           message.&nbsp; The ContentLanguages object should be used to indicate
 411                           the language of the response sent back to the client. <br>
 412 chuck            1.5      &nbsp; </p>
 413                           <p>The MessageLoaderParms object contains the parameters to load the
 414                           message.&nbsp; There are many parameters, but many can be allowed to
 415                           default.&nbsp; Here is a description of the parameters: <br>
 416                           &nbsp; <br>
 417                           &nbsp;
 418                           <table border="1" cols="3" width="100%" nosave="">
 419                             <tbody>
 420                               <tr>
 421                                 <td>String msg_id;&nbsp;</td>
 422                                 <td>Input.&nbsp; <br>
 423                           Required.</td>
 424                                 <td>Message ID&nbsp; of the message to load from the resource
 425                           bundle.&nbsp; This is the key that ICU will use to load the message.</td>
 426                               </tr>
 427                               <tr>
 428                                 <td>String default_msg;</td>
 429                                 <td>Input.&nbsp; <br>
 430                           Required</td>
 431                                 <td>Message to return if the no message can be loaded for msg_id
 432                           from any resource bundle.&nbsp; Note:&nbsp; The args parameters below
 433 chuck            1.5      are substituted into this string.&nbsp; <br>
 434                           Note:&nbsp; For the args into this&nbsp; string, use the Pegasus '$'
 435                           form, as described in pegasus/src/Pegasus/Common/Formatter.h.&nbsp;
 436                           Don't use the ICU substitution format for the default message string.</td>
 437                               </tr>
 438                               <tr>
 439                                 <td>String msg_src_path;&nbsp;</td>
 440                                 <td>Input.&nbsp; <br>
 441                           Optional <br>
 442                           Default: $PEGASUS_HOME/msg/pegasus/pegasusServer</td>
 443 chuck            1.6            <td>Path to the resource bundle file which contains the
 444 chuck            1.5      msg_id.&nbsp; <br>
 445                           Note: Only specify the path down to the bundle base-name.&nbsp; Do not
 446                           append a language tag, such as "_root" or "_en".&nbsp; Do not append a
 447                           file extension. <br>
 448                           Note: relative paths start at $PEGASUS_HOME/msg.&nbsp; <br>
 449                           Note: defaults to the bundle containing the Pegasus server messages.</td>
 450                               </tr>
 451                               <tr>
 452                                 <td>AcceptLanguages acceptlanguages;</td>
 453                                 <td>Input.&nbsp; <br>
 454                           Optional <br>
 455                           Default: AcceptLanguages::EMPTY</td>
 456                                 <td>Contains the list of preferred languages, in priority
 457                           order.&nbsp; This is combined with msg_src_path to determine which
 458 chuck            1.6      resource bundles to search for for the msg_id.&nbsp;&nbsp; If not empty,
 459                           overrides useThreadLocale and useProcessLocale.</td>
 460 chuck            1.5          </tr>
 461                               <tr>
 462                                 <td>ContentLanguages contentlanguages;</td>
 463                                 <td>Output</td>
 464                                 <td>Contains the language that MessageLoader found for the
 465                           msg_id.&nbsp;</td>
 466                               </tr>
 467                               <tr>
 468                                 <td>Boolean useProcessLocale;</td>
 469                                 <td>Input <br>
 470                           Optional <br>
 471                           Default = false</td>
 472                                 <td>If true, MessageLoader will use the default locale of the
 473                           process.&nbsp; If true, overrides useThreadLocale.</td>
 474                               </tr>
 475                               <tr>
 476                                 <td>Boolean useThreadLocale;</td>
 477                                 <td>Input <br>
 478                           Optional <br>
 479                           Default = <font color="#ff0000">true</font></td>
 480                                 <td>If true, MessageLoader will use the AcceptLanguages set by
 481 chuck            1.5      Pegasus into the caller's Thread.&nbsp;&nbsp; See the Note below for
 482                           details.&nbsp;</td>
 483                               </tr>
 484                               <tr>
 485                                 <td>Boolean useICUfallback</td>
 486                                 <td>Input <br>
 487                           Optional <br>
 488                           Default = false</td>
 489                                 <td>If true, use ICU's fallback mechnism to search more general
 490                           resource bundles if the msg_id cannot be found.&nbsp; Note: the
 491                           recommended setting is false if you are using an AcceptLanguages from a
 492                           CIM client.&nbsp; The Accept-Languages HTTP header from the client
 493 chuck            1.6      contains the fallback specifications. &nbsp;Using ICU's fallback in this
 494                           case may lead to returning a language that the client didn't ask for.</td>
 495 chuck            1.5          </tr>
 496                               <tr>
 497                                 <td>Formatter::Arg arg0; <br>
 498                           &nbsp;Formatter::Arg arg1; <br>
 499                           &nbsp;Formatter::Arg arg2; <br>
 500                           &nbsp;Formatter::Arg arg3; <br>
 501                           &nbsp;Formatter::Arg arg4; <br>
 502                           &nbsp;Formatter::Arg arg5; <br>
 503                           &nbsp;Formatter::Arg arg6; <br>
 504                           &nbsp;Formatter::Arg arg7; <br>
 505                           &nbsp;Formatter::Arg arg8; <br>
 506                           &nbsp;Formatter::Arg arg9;</td>
 507                                 <td>Input <br>
 508                           Optional <br>
 509                           Default: Formatter::Arg( ) // empty arg</td>
 510                                 <td>These are the substitution variables, using the Pegasus
 511                           Formatter::Arg class.</td>
 512                               </tr>
 513                             </tbody>
 514 chuck            1.1      </table>
 515 chuck            1.5      </p>
 516                           <p>Notes: <br>
 517                           &nbsp; </p>
 518                           <p>The "useThreadLocale" parameter defaults to true.&nbsp; This flag
 519                           indicates to use the AcceptLanguages object set by Pegasus into the
 520                           Pegasus Thread in which the caller's code is running.&nbsp; This
 521                           AcceptLanguages object reflects the languages requested by the
 522                           client.&nbsp; This is useful for code that may not have access to the
 523 chuck            1.6      AcceptLanguages from the client.&nbsp; Pegasus sets this AcceptLanguages
 524                           object into the Thread of providers and internal Pegasus code.&nbsp;
 525                           For this reason, it is recommended that provider and internal Pegasus
 526                           code use the "useThreadLocale" flag instead of explicity passing in an
 527                           AcceptLanguages object.&nbsp; See the Provider Developer and Pegasus
 528                           Developer sections for details. <br>
 529 chuck            1.5      &nbsp; </p>
 530 chuck            1.2      <p>The "useProcessLocale" flag can be used to tell MessageLoader to use
 531                           the default locale of the process, as determined by ICU.&nbsp; This is
 532 chuck            1.5      useful for situations where the caller is not localizing for a client
 533 chuck            1.6      request.&nbsp; The caller may itself be a client (eg. cimconfig), or may
 534                           need to log messages to the system log in the locale of the Pegasus
 535 chuck            1.5      server process.&nbsp; See the CLI Messages and Logger Messages sections
 536                           below. <br>
 537                           &nbsp; </p>
 538                           <p>"Master switch" <br>
 539                           The MessageLoader class has a public static Boolean variable called
 540 chuck            1.2      _useProcessLocale that may be used to override all the AcceptLanguages
 541 chuck            1.5      and useThreadLocale settings in the MessageLoaderParms objects passed
 542                           in.&nbsp; This is useful for CLI code (eg cimconfig) that needs to
 543                           localize its messages based on the locale of its process, which refects
 544                           the locale set by the user running the CLI (eg. $LANG on Unix).&nbsp;
 545                           The CLI code may call Pegasus APIs that are coded to use the Thread's
 546                           AcceptLanguages, which will not be set in this case.&nbsp; The
 547                           _useProcessLocale static variable tells the MessageLoader to ignore the
 548                           AcceptLanguages, useThreadLocale, and useProcessLocale settings in
 549                           MessageLoaderParms that it gets.&nbsp; The MessageLoader will use the
 550                           default process locale, as determined by ICU, in this case. <br>
 551                           &nbsp; </p>
 552 chuck            1.2      <p><i>Important Note:</i>&nbsp; The MessageLoader defaults to <i>not </i>use
 553 chuck            1.5      the "fallback" mechanism described in the ICU Resource Management
 554                           section.&nbsp; This is because the Accept-Language header itself
 555                           describes the fallback that the client wants.&nbsp; However, the
 556 chuck            1.6      MessageLoader does "fallback" to the root resource bundle if none of the
 557                           languages in AcceptLanguages can be found.&nbsp; If the root resource
 558                           bundle cannot be found, then the default_msg is returned.&nbsp; The
 559                           "useICUFallback" flag can be set to have MessageLoader use ICU fallback
 560                           on all message load attempts.&nbsp; However, usage of this flag for
 561                           client requests may lead to incorrect results.&nbsp; For example, a
 562                           client sets Accept-Language to french, german, and spanish, in that
 563                           order, but there is no french resource bundle.&nbsp; A call to
 564                           MessageLoader with useICUfallback == true would cause the root resource
 565                           bundle string to be returned on the attempt to load from the french
 566                           bundle.&nbsp; But the client requested german to be the fallback after
 567                           french. <br>
 568 chuck            1.5      &nbsp; </p>
 569                           <p>Please refer to the following files for details on the new Pegasus
 570                           classes. <br>
 571                           &nbsp; </p>
 572 chuck            1.1      <ul>
 573 chuck            1.5        <li> pegasus/src/Pegasus/Common/MessageLoader.h</li>
 574 chuck            1.1      </ul>
 575 chuck            1.5      <h4> 2.2.4 Message Loading Example</h4>
 576                           <p><br>
 577                           The following example shows how a message may be loaded using the
 578 chuck            1.2      classes described above.&nbsp; Note: this a generic example.&nbsp; Each
 579 chuck            1.5      of the developer sections below have 'real-life' examples that are
 580                           better suited to each type of code. </p>
 581                           <p>// Build an AcceptLanguages with some language elements <br>
 582                           AcceptLanguages acceptLangs; <br>
 583                           acceptLangs.add(AcceptLanguageElement("fr", 0.5)); <br>
 584                           acceptLangs.add(AcceptLanguageElement("de", 0.8)); <br>
 585                           acceptLangs.add(AcceptLanguageElement("es", 0.4)); </p>
 586                           <p>// Construct a MessageLoaderParms <br>
 587                           MessageLoaderParms parms("msgID", "default message"); <br>
 588                           parms. msg_src_path = "/my_msg_dir/my_bundle"; <br>
 589                           parms.acceptlanguages = acceptLangs; </p>
 590                           <p>// Note: If you have args, set them into MessageLoaderParms </p>
 591                           <p>// Load the localized String <br>
 592                           String localizedMsg = MessageLoader::getMessage(parms); <br>
 593                           &nbsp; <br>
 594                           &nbsp; </p>
 595 sushma.fernandes 1.6.38.1 <h4> 2.2.5 Message Writing Guidelines</h4>
 596 chuck            1.5      <p><br>
 597                           Here are some basic rules for writing messages: <br>
 598                           &nbsp; </p>
 599 chuck            1.1      <ul>
 600 chuck            1.5        <li> If you want to claim that you are globalized, no hardcoded
 601                           messages!</li>
 602 chuck            1.6        <li> Avoid creating a message in the code by combining other
 603                           messages.&nbsp; When you do this you are assuming that you know the
 604                           grammar for every language.</li>
 605 chuck            1.5        <li> String substitutions into messages are generally untranslated,
 606                           ie. not loaded from the resource bundle.&nbsp;&nbsp; Example: a file
 607                           name.</li>
 608                             <li> Avoid jargon, humour, and cultural idioms.&nbsp; Use full
 609                           sentences.&nbsp; Have your messages reviewed by your globalization
 610                           team.&nbsp; Your messages need to make sense to the translators, and
 611                           ultimately the customer.</li>
 612                             <li> <b>TODO </b>- find a good message writing guide to link to</li>
 613 chuck            1.1      </ul>
 614 sushma.fernandes 1.6.38.1 
 615                           <p><b>Are there any special considerations while creating a new message ? </b></p>
 616                           
 617                           <ul>
 618                           <li>If a message definition contains text within a single quote
 619                           it is not interpreted in any way.
 620                           
 621                           <p><i>Example:</i></p>
 622                           <p> Server.CIMOperationRequestAuthorizer.NOT_IN_AUTHORIZED_GRP:
 623                               string {"PGS05202: User '{0}' is not authorized to access CIM data."}
 624                           </p>
 625                           
 626                           <p><i>Processed message:</i></p>
 627                           <p>  User {0} is not authorized to access CIM data.  </p>
 628                           </li>
 629                           
 630                           <li> For a single quote to appear in a processed message, it needs to be preceded by
 631                           another single quote.
 632                           
 633                           <p><i>Example:</i></p>
 634                           <p> Server.CIMOperationRequestAuthorizer.NOT_IN_AUTHORIZED_GRP:
 635 sushma.fernandes 1.6.38.1     string {"PGS05202: User ''{0}'' is not authorized to access CIM data."}
 636                           </p>
 637                           
 638                           <p><i>Processed message:</i></p>
 639                           <p>  User 'wbemuser' is not authorized to access CIM data.  </p>
 640                           </li>
 641                           
 642                           <li> For a double quote to appear in a processed message, it needs to be preceded by
 643                           a back slash.
 644                           
 645                           <p><i>Example:</i></p>
 646                           <p>
 647                           ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.
 648                           UNSUPPORTED_USERCONTEXT_VALUE:string {"PGS03029: Unsupported UserContext
 649                           value: \"{0}\"."}
 650                           </p>
 651                           
 652                           <p><i>Processed message:</i></p>
 653                           <p>  Unsupported UserContext value: "10".  </p>
 654                           </li>
 655                           </ul>
 656 sushma.fernandes 1.6.38.1 
 657                           <p>&nbsp;</p>
 658                           
 659                           <h4> 2.2.6 Localized Exceptions</h4>
 660 chuck            1.5      <p><br>
 661                           The base Exception class, and derived classes, have been updated to
 662                           support localization.&nbsp; Constructors have been added that take a
 663                           MessageLoaderParms object.&nbsp; These constructors will use the
 664                           MessageLoaderParms object to call the MessageLoader to load the
 665 chuck            1.6      localized exception message.&nbsp; The localized message is saved in the
 666                           Exception.&nbsp; The ContentLanguages object returned by MessageLoader
 667                           is also saved in the Exception.&nbsp; This indicates the language of
 668                           the message.&nbsp; The ContentLanguages object is used later to set the
 669                           Content-Language header in the HTTP message to the client. <br>
 670 chuck            1.5      &nbsp; </p>
 671 chuck            1.2      <p>The old Exception constructors that take a String will remain.&nbsp;
 672                           These should be used in cases where the code throwing the exception is
 673 chuck            1.5      not localized, or the String is not localized (for example, a file
 674                           name).&nbsp; Also, there are several exceptions in Pegasus where the
 675                           String parameter is meant to be a non-localized substitution in a
 676                           localized message owned by the Exception (see InternalException.h,
 677                           ClassNotResolved for an example).&nbsp; The old constructors for these
 678                           have been kept. <br>
 679                           &nbsp; <br>
 680                           &nbsp; </p>
 681                           <h2> 3.0 Provider Developers</h2>
 682 chuck            1.1      &nbsp;
 683 chuck            1.5      <h3> 3.1 Design Issues</h3>
 684                           <p><br>
 685                           Providers that wish to globalize should consider the following in their
 686                           design: <br>
 687                           &nbsp; </p>
 688 chuck            1.1      <ul>
 689 chuck            1.5        <li> Are there localized string properties that need to be
 690                           supported?&nbsp; If so, then the client will use Accept-Language to
 691 chuck            1.6      request specific languages for these properties.&nbsp; If the properties
 692                           are read-only, use MessageLoader to load the localized strings for the
 693                           properties.</li>
 694 chuck            1.5        <li> If you have a localized read/write string property, then the
 695                           client will use Content-Language to set the property with an associated
 696                           language.&nbsp; The client will expect to be able to retrieve the
 697                           property in that same language later (using Accept-Language).</li>
 698                             <li> Note: only the string property types in CIM are candidates for
 699                           localization.&nbsp; The other types, including datetime, are
 700                           locale-neutral.</li>
 701                             <li> Are there error messages that need to returned to the client in
 702                           different languages?&nbsp; The client will use Accept-Language to
 703                           request specific languages for the error messages.</li>
 704                             <li> What resource bundle translations, if any, will be shipped with
 705                           the provider?</li>
 706                             <li> Do any codepage conversions need to be done between the UTF-16
 707                           characters in the String objects and the codepage of data stored on the
 708                           system?&nbsp; This is a concern for EBCDIC platforms.&nbsp; All EBCDIC
 709                           data needs to be converted to at least 7-bit ASCII before it is passed
 710                           into the String object.</li>
 711 chuck            1.1      </ul>
 712 chuck            1.5      <p><br>
 713                           To help providers handle the situations described above, Pegasus 2.3
 714                           will pass the Accept-Language received from the client to the
 715                           provider.&nbsp; The provider should load strings from its resource
 716                           bundle based on the client's Accept-Language.&nbsp; The client's
 717                           Accept-Language is passed to the provider in two ways: <br>
 718                           &nbsp; </p>
 719 chuck            1.1      <ul>
 720 chuck            1.5        <li> Pegasus will set the Accept-Language from the client into the
 721                           thread in which the provider is running.&nbsp; By using the
 722 chuck            1.6      useThreadLocale setting in MessageLoaderParms, providers can easily load
 723                           strings using the client's requested Accept-Language.&nbsp; The
 724 chuck            1.5      provider does not need to know what the Accept-Language is.&nbsp; This
 725 chuck            1.6      is the recommended method to load messages based on the client's request.</li>
 726 chuck            1.5        <br>
 727                           &nbsp; <li> The OperationContext will contain an AcceptLanguages object
 728 chuck            1.6      that has the Accept-Language requested by the client.&nbsp; The provider
 729                           can use this AcceptLanguages object to load strings with MessageLoader.</li>
 730 chuck            1.1      </ul>
 731 chuck            1.5      <p><br>
 732                           The OperationContext will also contain a ContentLanguages object that
 733                           is set from the Content-Language in the client request.&nbsp; This is
 734                           the language of the CIM objects being passed to the provider on that
 735                           request.&nbsp; A localized provider should store the content language
 736                           along with the data from the CIM objects.&nbsp; This will allow the
 737                           client to use Accept-Language later to retreive the data in that
 738                           language. <br>
 739                           &nbsp; </p>
 740                           <p>The provider should indicate the language of CIM objects it is
 741                           returning by calling setContext( ) on the ResponseHandler.&nbsp; This
 742                           will be used to set the Content-Language in the CIM response message
 743                           sent back to the client.&nbsp; If setContext( ) is not called, then no
 744 chuck            1.6      Content-Language will be returned to the client.&nbsp; The setContext( )
 745                           function should only be called once per response. <br>
 746 chuck            1.5      &nbsp; </p>
 747                           <h3> 3.2 Sample Code</h3>
 748                           <p><br>
 749                           The following sample code shows a localized getInstance( ) where the
 750                           instance returned is localized based on the Accept-Language of the
 751                           client request.&nbsp; Note that this example also throws a localized
 752                           exception. <br>
 753                           &nbsp; </p>
 754                           <p>void LocalizedProvider::getInstance( <br>
 755                           &nbsp;&nbsp;&nbsp; const OperationContext &amp; context, <br>
 756                           &nbsp;&nbsp;&nbsp; const CIMObjectPath &amp; instanceReference, <br>
 757                           &nbsp;&nbsp;&nbsp; const Boolean includeQualifiers, <br>
 758                           &nbsp;&nbsp;&nbsp; const Boolean includeClassOrigin, <br>
 759                           &nbsp;&nbsp;&nbsp; const CIMPropertyList &amp; propertyList, <br>
 760                           &nbsp;&nbsp;&nbsp; InstanceResponseHandler &amp; handler) <br>
 761                           { <br>
 762                           &nbsp;&nbsp;&nbsp;&nbsp; // convert a potential fully qualified
 763                           reference into a local reference <br>
 764                           &nbsp;&nbsp;&nbsp;&nbsp; // (class name and keys only). <br>
 765                           &nbsp;&nbsp;&nbsp;&nbsp; CIMObjectPath localReference = CIMObjectPath( <br>
 766                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String(), <br>
 767 chuck            1.5      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String(), <br>
 768                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 769                           instanceReference.getClassName(), <br>
 770                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 771                           instanceReference.getKeyBindings()); </p>
 772                           <p>&nbsp;&nbsp;&nbsp;&nbsp; // begin processing the request <br>
 773                           &nbsp;&nbsp;&nbsp;&nbsp; handler.processing(); </p>
 774                           <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Find the instance to be returned. <br>
 775                           &nbsp;&nbsp;&nbsp;&nbsp; Uint32 i; <br>
 776                           &nbsp;&nbsp;&nbsp;&nbsp; Uint32 n = _instances.size(); <br>
 777                           &nbsp;&nbsp;&nbsp;&nbsp; for (i = 0;&nbsp; i &lt; n;&nbsp; i++) <br>
 778                           &nbsp;&nbsp;&nbsp;&nbsp; { <br>
 779                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 780                           if(localReference == _instanceNames[i]) <br>
 781                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>
 782                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 783                           // We found the instance to return </p>
 784 chuck            1.1      <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 785 chuck            1.5      // Build the parameters for loading the localized string property. <br>
 786                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 787                           // We are going to let the message loader parameters default to use the <br>
 788                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 789                           // AcceptLanguages that Pegasus set into our thread. <br>
 790                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 791                           // (this equals the AcceptLanguages requested by the client) <br>
 792                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 793                           // Note: This parms object could be constructed once and <br>
 794                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 795                           // reused. <br>
 796                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 797                           MessageLoaderParms parms("myMsgID", "myDefaultString"); <br>
 798                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 799                           parms.msg_src_path = "/myprovider/msg/myResourceBundle"; </p>
 800 chuck            1.1      <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 801 chuck            1.5      // Load the string for the localized property from the resource bundle <br>
 802                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 803                           String localizedString = MessageLoader::getMessage(parms); </p>
 804 chuck            1.1      <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 805 chuck            1.5      // Remove the old property from the instance to be returned <br>
 806                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 807                           Uint32 index = instances[i].findProperty("myProperty"); <br>
 808                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 809                           if (index != PEG_NOT_FOUND) <br>
 810                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 811                           { <br>
 812                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 813                           _instances[i].removeProperty(index); <br>
 814                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 815                           } </p>
 816 chuck            1.1      <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 817 chuck            1.5      // Add the localized string property to the instance <br>
 818                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 819                           instances[i].addProperty(CIMProperty("myProperty", localizedString)); </p>
 820 chuck            1.1      <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 821 chuck            1.5      // The MessageLoader set the contentlanguages member <br>
 822                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 823                           // of parms to the language that it found for the message. <br>
 824                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 825                           ContentLanguages rtnLangs = parms.contentlanguages; </p>
 826 chuck            1.1      <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 827 chuck            1.5      // We need to tag the instance we are returning with the <br>
 828                           &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// the
 829                           content language. <br>
 830                           &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
 831                           &nbsp;OperationContext context;<br>
 832                           &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
 833                           &nbsp;context.insert(ContentLanguageListContainer(rtnLangs));<br>
 834                           &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
 835                           &nbsp;handler.setContext(context);<br>
 836                           </p>
 837                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 838                           // deliver requested instance<br>
 839                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 840 chuck            1.1      handler.deliver(_instances[i]);
 841                           <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 842 chuck            1.5      break; <br>
 843                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 844                           }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp; end if <br>
 845                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 846                           }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //
 847                           end for </p>
 848 chuck            1.1      <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // throw an exception if
 849 chuck            1.5      the instance wasn't found <br>
 850                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i == n) <br>
 851                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>
 852                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 853                           // Build the parameters for loading the localized error message. <br>
 854                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 855                           // We are going to let the message loader parameters default to use the <br>
 856                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 857                           // AcceptLanguages that Pegasus set into our thread. <br>
 858                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 859                           // (this equals the AcceptLanguages requested by the client) <br>
 860                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 861                           // Note: This parms object could be constructed once and <br>
 862                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 863                           // reused. <br>
 864                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 865                           MessageLoaderParms errParms("myErrorMsgID", "myErrorDefaultString"); <br>
 866                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 867                           errParms.msg_src_path = "/myprovider/msg/myResourceBundle"; </p>
 868 chuck            1.1      <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 869 chuck            1.5      // Note: the exception calls MessageLoader::getMessage( ) <br>
 870                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 871                           // Note: no need to call handler.setContext( ) in this case <br>
 872                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 873                           throw CIMObjectNotFoundException(errParms); <br>
 874                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>
 875                           &nbsp; </p>
 876                           <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // complete processing
 877                           the request <br>
 878                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; handler.complete(); <br>
 879                           } <br>
 880                           &nbsp; </p>
 881 chuck            1.1      <p>NOTE: A sample provider has been written that fully demonstates the
 882 chuck            1.5      design issues described above.&nbsp; This provider is located at: <br>
 883                           &nbsp; </p>
 884 chuck            1.1      <ul>
 885 chuck            1.5        <li> pegasus/src/Providers/sample/LocalizedProvider/</li>
 886 chuck            1.1      </ul>
 887 chuck            1.5      <p><br>
 888                           This sample provider also demonstrates how some of the special issues
 889                           can be handled.&nbsp; The special issues are caused by having a
 890                           read/only localized property and a read/write localized property.&nbsp;
 891                           What happens if the client sets the read/write property with a
 892                           Content-Language that is not one of the supported languages for the
 893                           read/only property?&nbsp; This provider allows the client to set any
 894 chuck            1.6      language into the read/write property, and get that property back in the
 895                           same language.&nbsp; This becomes an issue when the client does a
 896 chuck            1.5      getInstance( ) later, because the Content-Language on the returned
 897 chuck            1.6      instance applies to all the properties.&nbsp; A related issue is what to
 898                           return for Content-Language when the client does enumerateInstances,
 899 chuck            1.5      but the instances have different languages.&nbsp; Recall that
 900 chuck            1.6      Content-Language applies to the entire response (a limitation in the CIM
 901                           specification). <br>
 902 chuck            1.5      &nbsp; </p>
 903                           <p>NOTE:&nbsp; Indication Providers have other special considerations
 904                           for language support.&nbsp; Please refer to&nbsp; PEP58. <br>
 905                           &nbsp; </p>
 906                           <p>NOTE:&nbsp; The CMPI interface has been updated for language
 907                           support.&nbsp; Please refer to the CMPI documentation for details. <br>
 908                           &nbsp; </p>
 909                           <p>NOTE: SPECIAL ISSUES FOR OS/400 PROVIDERS: </p>
 910 chuck            1.1      <ul>
 911 chuck            1.5        <li> Convert between UTF-16 in the String objects and EBCDIC system
 912                           data as needed.&nbsp; The converters in
 913                           Pegasus/Common/OS400ConvertChar.h may be used to convert between EBCDIC
 914                           CCSID 37 and ASCII CCSID 819 (a subset of UTF-16).</li>
 915                             <li> The Pegasus program, and all bound service programs,&nbsp; will
 916                           run in a UTF-8 locale even though the job CCSID is 37.&nbsp; The
 917                           C-runtime library (printf, fopen, isalpha, strcmp, etc) will expect
 918                           UTF-8, or at least 7-bit ASCII, characters.</li>
 919                             <li> Consideration should be given to the codepage for the compiled
 920                           string literals.&nbsp; Use #pragma convert as needed.&nbsp; But,
 921                           remember that the C-runtime will expect UTF-8.</li>
 922                             <li> For more details, refer to "Unicode support" in chapter 3 of the <u>ILE
 923 chuck            1.1      C/C++ for iSeries Run-Time Functions, Version 5</u> publication for V5R3
 924                           (SC41-5607-02).&nbsp; The Pegasus string literals will be compiled with
 925 chuck            1.5      the UTF-8 compile switch described in this section.&nbsp; OS/400
 926                           provider developers should strongly consider using the same compile
 927 chuck            1.6      switch for their string literals.&nbsp; This would allow the literals to
 928                           match the UTF-8 encoding expected by the C-runtime.</li>
 929 chuck            1.1      </ul>
 930 chuck            1.5      <h2> 4. 0 Client Developers</h2>
 931                           <p><br>
 932                           Methods have been added to CIMClient to set the Accept-Language and
 933                           Content-Language on the request, and retrieve Content-Language on the
 934                           response.&nbsp; The language tags in the Accept-Language header must
 935                           meet the ISO-639 and ISO-3166 standards. <br>
 936                           &nbsp; </p>
 937                           <p>Please refer to <br>
 938                           &nbsp; </p>
 939 chuck            1.1      <ul>
 940 chuck            1.5        <li> pegasus/src/Pegasus/Client/CIMClient.h</li>
 941                             <br>
 942                           &nbsp;
 943                           </ul>
 944                           for the new methods on CIMClient. <br>
 945                           &nbsp;
 946                           <p>Here is a code fragment that uses the new methods on CIMClient </p>
 947                           <p>&nbsp;&nbsp;&nbsp; // <br>
 948                           &nbsp;&nbsp;&nbsp; // Get a localized instance in French <br>
 949                           &nbsp;&nbsp;&nbsp; // </p>
 950                           <p>&nbsp;&nbsp; // Language priority is martian, pig-latin, and
 951                           french.&nbsp; We should <br>
 952                           &nbsp;&nbsp; // get french back, even though its the lowest priority <br>
 953                           &nbsp; AcceptLanguages acceptLangs; <br>
 954                           &nbsp; acceptLangs.add(AcceptLanguageElement("x-martian")); <br>
 955                           &nbsp; acceptLangs.add(AcceptLanguageElement("fr", 0.1)); <br>
 956                           &nbsp; acceptLangs.add(AcceptLanguageElement("x-pig-latin", 0.4)); </p>
 957                           <p>&nbsp;&nbsp;&nbsp; // Set the requested languages into the CIMClient <br>
 958                           &nbsp; client.setRequestAcceptLanguages(acceptLangs); </p>
 959                           <p>&nbsp;&nbsp; // Get the instance <br>
 960                           &nbsp; CIMInstance instance = client.getInstance( <br>
 961 chuck            1.5      &nbsp;&nbsp;&nbsp; NAMESPACE, <br>
 962                           &nbsp;&nbsp;&nbsp; cimNInstances[0].buildPath(sampleClass), <br>
 963                           &nbsp;&nbsp;&nbsp; localOnly, <br>
 964                           &nbsp;&nbsp;&nbsp; includeQualifiers, <br>
 965                           &nbsp;&nbsp;&nbsp; includeClassOrigin); </p>
 966                           <p>&nbsp; // Get the string property that should be french <br>
 967                           &nbsp; String returnedString; <br>
 968                           &nbsp; instance.getProperty ( <br>
 969                           &nbsp;&nbsp;&nbsp; instance.findProperty("myProp")). <br>
 970                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 971                           getValue(). <br>
 972                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 973                           get(returnedString); </p>
 974                           <p>&nbsp; // Check that we got back french <br>
 975                           &nbsp; ContentLanguages CL_FR("fr"); <br>
 976                           &nbsp; String expectedFRString = "oui"; <br>
 977                           &nbsp; PEGASUS_ASSERT(CL_FR == client.getResponseContentLanguages()); <br>
 978                           &nbsp; PEGASUS_ASSERT(expectedFRString == returnedString); </p>
 979                           <p>&nbsp;&nbsp;&nbsp; // <br>
 980                           &nbsp;&nbsp;&nbsp; // Create an instance in French <br>
 981                           &nbsp;&nbsp;&nbsp; // </p>
 982 chuck            1.5      <p>&nbsp;&nbsp; String oui = "Oui"; <br>
 983                           &nbsp;&nbsp; CIMInstance frInstance(CLASSNAME); <br>
 984                           &nbsp;&nbsp; frInstance.addProperty(CIMProperty( <br>
 985                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 986                           CIMName("myProp"), <br>
 987                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 988                           oui)); </p>
 989                           <p>&nbsp;&nbsp; CIMObjectPath frInstanceName =
 990                           frInstance.buildPath(sampleClass); </p>
 991                           <p>&nbsp;&nbsp; client.setRequestContentLanguages(CL_FR); </p>
 992                           <p>&nbsp;&nbsp; client.createInstance(NAMESPACE, frInstance); <br>
 993                           &nbsp; <br>
 994                           &nbsp; <br>
 995                           &nbsp; </p>
 996                           <p>Also, refer to </p>
 997 chuck            1.1      <ul>
 998 chuck            1.5        <li> pegasus/src/Clients/g11ntest/</li>
 999 chuck            1.1      </ul>
1000 chuck            1.5      for more examples of a client that uses Accept-Language and
1001                           Content-Language. <br>
1002                           &nbsp;
1003 chuck            1.1      <p>NOTE:&nbsp; Consideration should be given for converting the UTF-16
1004                           characters in the String objects passed over the CIMClient interface to
1005 chuck            1.5      a platform codepage.&nbsp; This is especially needed for EBCDIC
1006                           platforms.&nbsp; See the Provider developer section for details of the
1007                           EBCDIC considerations. <br>
1008                           &nbsp; <br>
1009                           &nbsp; </p>
1010                           <h3> 4.1 Default Process Locale</h3>
1011                           <p><br>
1012                           A method has been added to CIMClient to set the Accept-Language for the
1013                           requests based on the default locale of the process, as determined by
1014                           ICU.&nbsp; If ICU is installed on the client system then CIMClient will
1015                           set the Accept-Language from the default ICU process locale.&nbsp; If
1016                           ICU is not installed then the caller is required to set an
1017                           AcceptLanguages into CIMClient that meets the ISO-639 and IS0-3166
1018                           standards.&nbsp; Note:&nbsp; this is useful for local clients, such as
1019                           the Pegasus CLIs, where ICU would be installed on both the client and
1020                           server sides. <br>
1021                           &nbsp; <br>
1022                           &nbsp; </p>
1023                           <h2> 5. 0 Pegasus Developers</h2>
1024                           <p><br>
1025                           The design for Pegasus releases beyond 2.3 is to avoid using hardcoded
1026 chuck            1.5      messages.&nbsp; All new messages should be loaded from a Pegasus
1027                           resource bundle.&nbsp; This section describes the process to follow if
1028                           you are creating a new message.&nbsp; The process depends on where you
1029                           are in the code. <br>
1030                           &nbsp; <br>
1031                           &nbsp; </p>
1032                           <h3> <b>5.1 Pegasus Resource Bundles</b></h3>
1033                           <p><br>
1034                           Place any new Pegasus messages into one of the following resource
1035                           bundles: <br>
1036                           &nbsp; </p>
1037 chuck            1.1      <ul>
1038 chuck            1.5        <li> pegasus/src/Pegasus/msg/Server/pegasusServer_*.txt&nbsp; for
1039                           server and MOF compiler (cimmof, cimmofl) messages</li>
1040                             <li> pegasus/src/Pegasus/msg/CLI/pegasusCLI_*.txt for all CLI messages
1041                           (except the MOF compiler)</li>
1042 chuck            1.1      </ul>
1043 chuck            1.5      <p><br>
1044                           The make messages target will compile these resource bundles. </p>
1045                           <p>Note:&nbsp; As described above, the resource bundle path in
1046 chuck            1.6      MessageLoaderParms defaults to the server resource bundle.&nbsp; For CLI
1047                           messages, you will need to specify the bundle for your CLI. <br>
1048 chuck            1.5      &nbsp; </p>
1049                           <h3> 5.2 Server Messages</h3>
1050                           <p><br>
1051                           For messages returned from one of the services in the Pegasus server
1052 chuck            1.1      (eg. CIMOperationRequestDispatcher, or ProviderManagerService), the goal
1053                           is to make it easy for any code in the call chain to throw an exception
1054 chuck            1.5      with a localized error string.&nbsp; The code throwing the exception
1055                           will not need to know the Accept-Language that the client
1056                           requested.&nbsp; To understand how this works, some design points need
1057                           to described: <br>
1058                           &nbsp; </p>
1059                           <p><b>Server Design Points:</b> <br>
1060                           &nbsp; </p>
1061                           <p>The CIMMessage object has been expanded to include an
1062                           AcceptLanguages object and a ContentLanguages object.&nbsp; For
1063                           CIMRequestMessage, these objects contain the Accept-Language and
1064                           Content-Language headers that were built from the client request.&nbsp;
1065 chuck            1.6      For CIMResponseMessage, the ContentLanguages object is used to build the
1066                           Content-Language header associated with the CIM <i>objects </i>in the
1067                           response message.&nbsp; The AcceptLanguages object in the
1068 chuck            1.5      CIMResponseMessage is ignored. <br>
1069                           &nbsp; </p>
1070                           <p>The localization of the cimException object in the
1071 chuck            1.6      CIMResponseMessage is handled separately from the CIM objects.&nbsp; The
1072                           message string in the cimException object is assumed to have been
1073 chuck            1.5      localized by the time it is built into the XML.&nbsp; For this reason,
1074                           the localization of the exception is the responsibility of the code
1075                           throwing the exception.&nbsp; (The goal of the design is to make that
1076                           easy - see below).&nbsp; The ContentLanguages object in the
1077                           CIMResponseMessage has NO relation to this exception.&nbsp; The
1078                           cimException object keeps its own localization information once it is
1079                           created. <br>
1080                           &nbsp; </p>
1081 chuck            1.1      <p>To enable exceptions to be localized, the ability was added to set a
1082 chuck            1.5      global language for all the code running from a Pegasus Thread
1083                           object.&nbsp; The top level code for a Thread can set a global
1084                           AcceptLanguages object that can be accessed by all the low-level
1085                           functions that it calls.&nbsp; This will allow an exception thrown by
1086                           the low-level function to be localized based on this global
1087                           AcceptLanguages object.&nbsp; Note:&nbsp; This applies only to Threads
1088                           that are managed by a ThreadPool. <br>
1089                           &nbsp; </p>
1090                           <p>Each service in the request path of the Pegasus server sets the
1091                           AcceptLanguages into its Thread from the AcceptLanguages in the
1092                           CIMRequestMessage object that it dequeues.&nbsp; This sets the global
1093                           langauge for all the functions in the same thread that are called below
1094 chuck            1.6      handleEnqueue.&nbsp; <i>If you are writing a new service that processes
1095                           requests, or discover a request service that was missed, please do
1096                           this.&nbsp;</i> The CIMOperationRequestDispatcher service is an example. <br>
1097 chuck            1.5      &nbsp; </p>
1098                           <p><b>How to Throw a Localized Exception from Server code:</b> <br>
1099                           &nbsp; </p>
1100                           <p>With all that background, here is how code running in a Pegasus
1101                           service can throw a localized exception: <br>
1102                           This example assumes that the top-level code in the service had set the
1103                           global thread AcceptLanguages beforehand.&nbsp; As described above,
1104                           every service in Pegasus should do that.&nbsp; The code here may be
1105                           buried several layers deep in the call chain, but does not need to know
1106                           the AcceptLanguage of the current client request. </p>
1107                           <p>// First, construct a MessageLoaderParms <br>
1108                           // <br>
1109                           // Notes: <br>
1110                           //&nbsp; 1) The errorMessageID must be in the Pegasus server resource
1111                           bundle. <br>
1112                           //&nbsp; 2) The default message is the old "hardcoded" message. <br>
1113                           //&nbsp; 3) The MessageLoaderParms will default to use the Pegasus
1114                           server resource bundle <br>
1115                           //&nbsp; 4) The MessageLoaderParms will default to use the
1116                           AcceptLanguages set into the current Thread.&nbsp; Don't change this! <br>
1117                           //&nbsp; 5) You might need to set the arguments for the message into
1118 chuck            1.5      the MessageLoaderParms <br>
1119                           MessageLoaderParms parms("errorMessageID", "default message"); </p>
1120                           <p>// Second, throw the Exception <br>
1121                           // Note: this applies to all the derived classes from Exception,
1122                           including the CIMException's <br>
1123                           throw new Exception(parms); <br>
1124                           &nbsp; </p>
1125 chuck            1.1      <p>NOTE:&nbsp; If you are throwing an Exception with un-localized data,
1126                           use the constructor that takes a String.&nbsp; An example of this would
1127                           be an Exception where you are passing in a file name.&nbsp; Most of the
1128                           "non-CIM" exceptions defined in Exception.h and InternalException.h take
1129 chuck            1.5      un-localized data. <br>
1130                           &nbsp; </p>
1131                           <p><b>The Exception Macros</b> <br>
1132                           &nbsp; </p>
1133                           <p>There are many spots in the server code that use the
1134                           PEGASUS_CIM_EXCEPTION macro to throw a TraceableCIMException.&nbsp; The
1135                           use of this macro in the code like the following example presented a
1136                           design problem: </p>
1137                           <p>.... <br>
1138                           } catch (Exception &amp; e) <br>
1139                           { <br>
1140                           &nbsp;&nbsp;&nbsp; throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
1141                           e.getMessage()); <br>
1142                           } <br>
1143                           &nbsp; </p>
1144 chuck            1.2      <p>This type of code would have lost the ContentLanguages saved in "e",
1145 chuck            1.5      so that the Content-Language would not be set in HTTP response to the
1146                           client. <br>
1147                           &nbsp; </p>
1148                           <p>For Pegasus 2.3, these types of macro calls can stay.&nbsp; The
1149 chuck            1.6      TraceableCIMException constructed by the macro will "re-localize".&nbsp;
1150                           That is, the "CIM" part of the message (the part based on the error
1151                           code) will be localized at throw time, and the ContentLanguages
1152                           re-established.&nbsp; A key is to avoid a "language mismatch" problem
1153                           between the CIM part of the message and the extra part of the
1154                           message.&nbsp; The design point here is that all internal exceptions
1155                           thrown by Pegasus code are localized using the global AcceptLanguages
1156                           of the Thread...see above. <br>
1157 chuck            1.5      &nbsp; </p>
1158                           <p>In the future, it will be safer and more maintainable to use of
1159                           the&nbsp; new "localized" flavors of the macro.&nbsp; For example: <br>
1160                           &nbsp; </p>
1161                           <p>When the message from a caught&nbsp; Exception needs to be become
1162                           the extra message in a thrown CIMException: </p>
1163                           <p>.... <br>
1164                           } catch (Exception &amp; e) <br>
1165                           { <br>
1166                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw
1167                           PEGASUS_CIM_EXCEPTION_LANG(e.getContentLanguages( ), <br>
1168                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1169                           CIM_ERR_FAILED, <br>
1170                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1171                           e.getMessage( )); <br>
1172                           } <br>
1173                           &nbsp; </p>
1174                           <p>This guarantees that the ContentLanguages in "e" is copied to the
1175                           newly created TraceableCIMException. <br>
1176                           &nbsp; </p>
1177                           <p>In the case where the extra message for the CIMException is
1178 chuck            1.5      determined by the throwing code: <br>
1179                           &nbsp; </p>
1180                           <p>throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED, <br>
1181                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1182                           MessageLoaderParms("Repository.CIMRepository.COMPACT_FAILED",&nbsp;
1183                           "compact failed")); <br>
1184                           &nbsp; </p>
1185                           <p>(example from CIMRepository.cpp) <br>
1186                           This uses a MessageLoaderParms object to localize the extra message in
1187                           the newly created TraceableCIMException. <br>
1188                           &nbsp; </p>
1189                           <h3> 5.2 Logger Messages</h3>
1190                           <p><br>
1191                           New methods have been added to Logger to take a message ID of a message
1192                           to be loaded from the Pegasus server resource bundle.&nbsp; The caller
1193 chuck            1.6      is only required to pass in the message ID, the old "hardcoded" message,
1194                           and the args.&nbsp; The Logger will use MessageLoader to load the
1195                           message in the locale of the Pegasus server <i>process</i>, using the
1196                           hardcoded message as the default string.&nbsp; Please refer to
1197 chuck            1.5      pegasus/src/Pegasus/Logger.h. </p>
1198 chuck            1.2      <p>Note:&nbsp; Messages sent to the "logs", whether the system logs or
1199 chuck            1.5      the Pegasus log file, are converted to UTF-8 before being sent. <br>
1200                           &nbsp; </p>
1201                           <h3> 5.3 CLI Messages</h3>
1202                           <p><br>
1203                           The goal for messages returned by the Pegasus CLIs is to localize in
1204                           the locale of the user running the CLI.&nbsp; This should be automatic
1205                           -- the user should not be required to tell the CLI what the locale
1206                           is.&nbsp;&nbsp; For the CLIs that are CIM clients (cimconfing,
1207                           cimprovider) there are two sets of messages to localize&nbsp; --
1208 chuck            1.6      messages generated in the CLI process itself, and messages returned from
1209                           the Pegasus server .&nbsp; For CLIs that are directly linked into
1210 chuck            1.5      Pegasus (cimmofl), all the messages are generated in the CLI's process,
1211                           but the CLI may call Pegasus APIs that are coded to localize based on a
1212                           client's requested languages. <br>
1213                           &nbsp; </p>
1214                           <p>Code in the client side of the client/server CLIs (eg. cimconfig,
1215                           cimmof), or in directly linked CLIs (cimmofl), should use the
1216                           _useProcessLocale "master switch" described in the Message Loading
1217 chuck            1.6      section.&nbsp; This will cause all messages, including exceptions thrown
1218                           by Pegasus APIs,&nbsp; to be loaded in the locale based on the
1219 chuck            1.5      environment in which the program is running.&nbsp; This locale can be
1220                           set by the user before running the program. <br>
1221                           &nbsp; </p>
1222                           <p>Code in the client side of the client/server CLIs need to send an
1223                           Accept-Language to the Pegasus server that reflects the default locale
1224                           of the CLI's process.&nbsp; See the Client Developer section for
1225                           details. <br>
1226                           &nbsp; </p>
1227                           <p>An example of these considerations can be seen in the source code
1228                           for cimconfig. <br>
1229                           &nbsp; </p>
1230                           <p> </p>
1231 chuck            1.1      <hr>
1232 chuck            1.5      <p><i>Copyright (c) 2003 BMC Software; Hewlett-Packard Development
1233                           Company, L.P.; IBM Corp.; The Open Group</i> </p>
1234                           <p><i>Permission is hereby granted, free of charge, to any person
1235                           obtaining a copy&nbsp; of this software and associated documentation
1236                           files (the "Software"), to deal in the Software without restriction,
1237                           including without limitation the rights to use, copy, modify, merge,
1238 chuck            1.6      publish, distribute, sublicense, and/or sell copies of the Software, and
1239                           to permit persons to whom the Software is furnished to do so, subject
1240                           to the following conditions:</i> </p>
1241 chuck            1.5      <p><i>THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE
1242                           INCLUDED IN ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE
1243                           SOFTWARE IS PROVIDED&nbsp; "AS IS", WITHOUT WARRANTY OF ANY KIND,
1244                           EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
1245                           MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
1246                           IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
1247                           CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
1248                           TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
1249                           SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</i> <br>
1250                           &nbsp; <br>
1251                           &nbsp; </p>
1252 chuck            1.1      </body>
1253                           </html>

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2