(file) Return to CIMObjectPath.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Common

Diff for /pegasus/src/Pegasus/Common/CIMObjectPath.cpp between version 1.28 and 1.29

version 1.28, 2003/09/09 21:01:07 version 1.29, 2003/09/19 19:56:26
Line 569 
Line 569 
 } }
  
 /** /**
     ATTN: RK - Association classes have keys whose types are      ATTN-RK: The DMTF specification for the string form of an
     references.  These reference values must be treated specially      object path makes it impossible for a parser to distinguish
     in the XML encoding, using the VALUE.REFERENCE tag structure.      between a key values of String type and Reference type.
   
     Pegasus had been passing reference values simply as String      Given the ambiguity, this implementation takes a guess at the
     values.  For example, EnumerateInstanceNames returned      type of a quoted key value.  If the value can be parsed into
     KEYVALUEs of string type rather than VALUE.REFERENCEs.      a CIMObjectPath with at least one key binding, the type is
       set to REFERENCE.  Otherwise, the type is set to STRING.
     I've modified the XmlReader::getKeyBindingElement() and      Note: This algorithm appears to be in line with what the Sun
     XmlWriter::appendInstanceNameElement() methods to read and write      WBEM Services implementation does.
     the XML in the proper format.  However, making that change  
     required that a CIMObjectPath object be able to distinguish      To be totally correct, it would be necessary to retrieve the
     between a key of String type and a key of reference type.      class definition and look up the types of the key properties
       to determine how to interpret the key values.  This is clearly
     I've modified the String format of CIMObjectPaths slightly to      too inefficient for internal transformations between
     allow efficient processing of references whose keys are also      CIMObjectPaths and String values.
     of reference type.  The "official" form uses the same  
     encoding for key values of String type and of reference type,  
     and so it would be necessary to retrieve the class definition  
     and look up the types of the key properties to determine how  
     to treat the key values.  This is clearly too inefficient for  
     internal transformations between CIMObjectPaths and String  
     values.  
   
     The workaround is to encode a 'R' at the beginning of the  
     value for a key of reference type (before the opening '"').  
     This allows the parser to know a priori whether the key is of  
     String or reference type.  
   
     In this example:  
   
         MyClass.Key1="StringValue",Key2=R"RefClass.KeyA="StringA",KeyB=10"  
   
     Property Key1 of class MyClass is of String type, and so it  
     gets the usual encoding.  Key2 is a reference property, so  
     the extra 'R' is inserted before its encoded value.  Note  
     that this algorithm is recursive, such that RefClass could  
     include KeyC of reference type, which would also get encoded  
     with the 'R' notation.  
   
     The toString() method inserts the 'R' to provide symmetry.  A  
     new CIMKeyBinding type (REFERENCE) has been defined to denote  
     keys in a CIMObjectPath that are of reference type.  This  
     CIMKeyBinding type must be used appropriately for  
     CIMObjectPath::toString() to behave correctly.  
   
     A result of this change is that instances names in the  
     instance repository will include this extra 'R' character.  
     Note that for user-facing uses of the String encoding of  
     instance names (such as might appear in MOF for static  
     association instances or in the CGI client), this solution  
     is non-standard and therefore unacceptable.  It is likely  
     that these points will need to process the more expensive  
     operation of retrieving the class definition to determine  
     the key property types.  
 */ */
 void _parseKeyBindingPairs( void _parseKeyBindingPairs(
     const String& objectName,     const String& objectName,
Line 655 
Line 616 
         p = equalsign + 1;         p = equalsign + 1;
         CIMKeyBinding::Type type;         CIMKeyBinding::Type type;
  
         if (*p == 'R')          if (*p == '"')
         {         {
             p++;              // Could be CIMKeyBinding::STRING or CIMKeyBinding::REFERENCE
   
             type = CIMKeyBinding::REFERENCE;  
  
             if (*p++ != '"')              p++;
                 throw MalformedObjectNameException(objectName);  
  
             while (*p && *p != '"')             while (*p && *p != '"')
             {             {
Line 681 
Line 639 
  
             if (*p++ != '"')             if (*p++ != '"')
                 throw MalformedObjectNameException(objectName);                 throw MalformedObjectNameException(objectName);
         }  
         else if (*p == '"')  
         {  
             p++;  
  
               /*
                   Guess at the type of this quoted key value.  If the value
                   can be parsed into a CIMObjectPath with at least one key
                   binding, the type is assumed to be a REFERENCE.  Otherwise,
                   the type is set to STRING.  (See method header for details.)
                */
             type = CIMKeyBinding::STRING;             type = CIMKeyBinding::STRING;
  
             while (*p && *p != '"')              try
             {             {
                 if (*p == '\\')                  CIMObjectPath testForPath(valueString);
                   if (testForPath.getKeyBindings().size() > 0)
                 {                 {
                     *p++;                      // We've found a reference value!
                       type = CIMKeyBinding::REFERENCE;
                     if ((*p != '\\') && (*p != '"'))  
                     {  
                         throw MalformedObjectNameException(objectName);  
                     }                     }
                 }                 }
               catch (Exception & e)
                 valueString.append(*p++);              {
                   // Not a reference value; leave type as STRING
             }             }
   
             if (*p++ != '"')  
                 throw MalformedObjectNameException(objectName);  
         }         }
         else if (toupper(*p) == 'T' || toupper(*p) == 'F')         else if (toupper(*p) == 'T' || toupper(*p) == 'F')
         {         {
Line 932 
Line 888 
  
             CIMKeyBinding::Type type = keyBindings[i].getType();             CIMKeyBinding::Type type = keyBindings[i].getType();
  
             if (type == CIMKeyBinding::REFERENCE)  
                 objectName.append('R');  
   
             if (type == CIMKeyBinding::STRING || type == CIMKeyBinding::REFERENCE)             if (type == CIMKeyBinding::STRING || type == CIMKeyBinding::REFERENCE)
                 objectName.append('"');                 objectName.append('"');
  


Legend:
Removed from v.1.28  
changed lines
  Added in v.1.29

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2