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

  1 mike  1.1.2.1 //%2006////////////////////////////////////////////////////////////////////////
  2               //
  3               // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
  4               // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
  5               // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
  6               // IBM Corp.; EMC Corporation, The Open Group.
  7               // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
  8               // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
  9               // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
 10               // EMC Corporation; VERITAS Software Corporation; The Open Group.
 11               // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
 12               // EMC Corporation; Symantec Corporation; The Open Group.
 13               //
 14               // Permission is hereby granted, free of charge, to any person obtaining a copy
 15               // of this software and associated documentation files (the "Software"), to
 16               // deal in the Software without restriction, including without limitation the
 17               // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 18               // sell copies of the Software, and to permit persons to whom the Software is
 19               // furnished to do so, subject to the following conditions:
 20               //
 21               // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
 22 mike  1.1.2.1 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
 23               // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
 24               // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 25               // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 26               // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 27               // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 28               // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 29               //
 30               //==============================================================================
 31               //
 32               //%/////////////////////////////////////////////////////////////////////////////
 33               
 34               #include <cstdarg>
 35               #include <cassert>
 36               #include "MetaRepository.h"
 37               #include <Pegasus/Common/System.h>
 38 mike  1.1.2.8 #include <Pegasus/Common/Once.h>
 39 mike  1.1.2.7 #include "MetaTypes.h"
 40 mike  1.1.2.1 
 41               PEGASUS_NAMESPACE_BEGIN
 42               
 43 mike  1.1.2.8 typedef const MetaClass* ConstMetaClassPtr;
 44               #define PEGASUS_ARRAY_T ConstMetaClassPtr
 45               # include <Pegasus/Common/ArrayInter.h>
 46               # include <Pegasus/Common/ArrayImpl.h>
 47               #undef PEGASUS_ARRAY_T
 48               
 49 mike  1.1.2.10 //
 50                // Callback function and client data used to obtain namespaces from client.
 51                //
 52                static const MetaNameSpace* const* _nameSpaces;
 53 mike  1.1.2.1  
 54 mike  1.1.2.11 static const size_t _MAX_FEATURES = 128;
 55                static const size_t _MAX_QUALIFIERS = 128;
 56 mike  1.1.2.1  
 57 mike  1.1.2.11 class ThrowContext
 58 mike  1.1.2.5  {
 59 mike  1.1.2.11 public:
 60 mike  1.1.2.5  
 61 mike  1.1.2.11     PEGASUS_FORMAT(3, 4)
 62                    ThrowContext(CIMStatusCode code_, const char* format, ...) : code(code_)
 63                    {
 64                        char buffer[1024];
 65                        va_list ap;
 66                        va_start(ap, format);
 67                        vsprintf(buffer, format, ap);
 68                        va_end(ap);
 69                        msg = buffer;
 70                    }
 71                    CIMStatusCode code;
 72                    String msg;
 73                };
 74                
 75                #define Throw(ARGS) \
 76                    do \
 77                    { \
 78                        ThrowContext c ARGS; \
 79                        throw CIMException(c.code, c.msg); \
 80                    } \
 81                    while (0)
 82 mike  1.1.2.5  
 83                static bool _eqi(const char* s1, const char* s2)
 84                {
 85                    return System::strcasecmp(s1, s2) == 0;
 86                }
 87                
 88 mike  1.1.2.1  class Str
 89                {
 90                public:
 91                    Str(const String& s) : _cstr(s.getCString()) { }
 92                    Str(const CIMName& n) : _cstr(n.getString().getCString()) { }
 93                    Str(const CIMNamespaceName& n) : _cstr(n.getString().getCString()) { }
 94                    Str(const Exception& e) : _cstr(e.getMessage().getCString()) { }
 95                    Str(const CIMDateTime& x) : _cstr(x.toString().getCString()) { }
 96                    Str(const CIMObjectPath& x) : _cstr(x.toString().getCString()) { }
 97                    const char* operator*() const { return (const char*)_cstr; }
 98                    operator const char*() const { return (const char*)_cstr; }
 99                private:
100                    CString _cstr;
101                };
102                
103                static const MetaNameSpace* _findNameSpace(const char* name)
104                {
105 mike  1.1.2.10     if (!_nameSpaces)
106                        return 0;
107                
108                    for (const MetaNameSpace* const* p = _nameSpaces; *p; p++)
109 mike  1.1.2.1      {
110 mike  1.1.2.10         const MetaNameSpace* ns = *p;
111                
112                        if (_eqi(ns->name, name))
113                            return ns;
114 mike  1.1.2.1      }
115                
116                    // Not found!
117                    return 0;
118                }
119                
120                static bool _isSubClass(const MetaClass* super, const MetaClass* sub)
121                {
122                    if (!super)
123                        return true;
124                
125                    for (MetaClass* p = sub->super; p; p = p->super)
126                    {
127                        if (p == super)
128                            return true;
129                    }
130                
131                    return false;
132                }
133                
134                static inline bool _isDirectSubClass(
135 mike  1.1.2.1      const MetaClass* super, 
136                    const MetaClass* sub)
137                {
138                    return sub->super == super;
139                }
140                
141 mike  1.1.2.3  static char** _makePropertyList(const CIMPropertyList& propertyList)
142                {
143                    if (propertyList.isNull())
144                        return 0;
145                
146                    size_t size = propertyList.size();
147                    char** pl = (char**)malloc(sizeof(char*) * (size + 1));
148                
149                    for (size_t i = 0; i < size; i++)
150                        pl[i] = strdup(*Str(propertyList[i]));
151                
152                    pl[size] = 0;
153                
154                    return pl;
155                }
156                
157                static void _freePropertyList(char** pl)
158                {
159                    if (!pl)
160                        return;
161                
162 mike  1.1.2.3      for (size_t i = 0; pl[i]; i++)
163                    {
164                        free(pl[i]);
165                    }
166                
167                    free(pl);
168                }
169                
170                static void _printPropertyList(const char* const* pl)
171                {
172                    if (!pl)
173                        return;
174                
175                    for (size_t i = 0; pl[i]; i++)
176                        printf("pl[%s]\n", pl[i]);
177                }
178                
179 mike  1.1.2.8  static bool _contains(const Array<const MetaClass*>& x, const MetaClass* mc)
180                {
181                    Uint32 n = x.size();
182                    const MetaClass* const* p = x.getData();
183                
184                    while (n--)
185                    {
186                        if (*p++ == mc)
187                            return true;
188                    }
189                
190                    return false;
191                }
192                
193                static void _associators(
194                    const MetaNameSpace* ns,
195                    const CIMName& className,
196                    const CIMName& assocClass,
197                    const CIMName& resultClass,
198                    const String& role,
199                    const String& resultRole,
200 mike  1.1.2.8      Array<const MetaClass*>& result)
201                {
202                    // Lookup source class:
203                
204                    const MetaClass* mc = FindClass(ns, *Str(className));
205                    
206                    if (!mc)
207 mike  1.1.2.11         Throw((CIM_ERR_NOT_FOUND, "unknown class: %s", *Str(className)));
208 mike  1.1.2.8  
209                
210                    // Lookup result class (if any).
211                
212                    const MetaClass* rmc = 0;
213                
214                    if (!resultClass.isNull())
215                    {
216                        rmc = FindClass(ns, *Str(resultClass));
217                
218                        if (!rmc)
219 mike  1.1.2.11             Throw((CIM_ERR_NOT_FOUND, "unknown class: %s", *Str(resultClass)));
220 mike  1.1.2.8      }
221                
222                    // Convert these to UTF8 now to avoid doing so in loop below.
223                
224                    Str ac(assocClass);
225                    Str r(role);
226                    Str rr(resultRole);
227                
228                    // Process association classes:
229                
230                    for (size_t i = 0; ns->classes[i]; i++)
231                    {
232                        MetaClass* amc = ns->classes[i];
233                
234                        // Skip non-association classes:
235                
236                        if (!(amc->flags & META_FLAG_ASSOCIATION))
237                            continue;
238                
239                        // Filter by assocClass parameter:
240                
241 mike  1.1.2.8          if (!assocClass.isNull() && !_eqi(ac, amc->name))
242                            continue;
243                
244                        // Process reference properties:
245                
246                        MetaFeatureInfo features[META_MAX_FEATURES];
247                        size_t size = 0;
248                        MergeFeatures(amc, false, META_FLAG_REFERENCE, features, size);
249                
250                        for (size_t j = 0; j < size; j++)
251                        {
252                            const MetaFeature* mf = features[j].mf;
253                
254                            // Skip non references:
255                
256                            if (!(mf->flags & META_FLAG_REFERENCE))
257                                continue;
258                
259                            const MetaReference* mr = (const MetaReference*)mf;
260                
261                            // Filter by role parameter.
262 mike  1.1.2.8  
263                            if (role.size() && !_eqi(r, mf->name))
264                                continue;
265                
266                            // Filter by source class:
267                
268                            if (!IsA(mr->ref, mc))
269                                continue;
270                
271                            // Process result reference:
272                
273                            for (size_t k = 0; k < size; k++)
274                            {
275                                const MetaFeature* rmf = features[k].mf;
276                
277                                // Skip the feature under consideration:
278                
279                                if (rmf == mf)
280                                    continue;
281                
282                                // Skip non references:
283 mike  1.1.2.8  
284                                if (!(rmf->flags & META_FLAG_REFERENCE))
285                                    continue;
286                
287                                const MetaReference* rmr = (const MetaReference*)rmf;
288                
289                                // Filter by resultRole parameter.
290                
291                                if (resultRole.size() && !_eqi(rr, rmf->name))
292                                    continue;
293                
294                                // Skip references not of the result class kind:
295                
296                                if (rmc && !IsA(rmr->ref, rmc))
297                                    continue;
298                
299                                // ATTN: should we include entire class hierarchy under
300                                // result class?
301                
302                                // If reached, then save this one.
303                
304 mike  1.1.2.8                  if (!_contains(result, rmr->ref))
305                                    result.append(rmr->ref);
306                            }
307                        }
308                    }
309                }
310                
311                static void _references(
312                    const MetaNameSpace* ns,
313                    const CIMName& className,
314                    const CIMName& resultClass,
315                    const String& role,
316                    Array<const MetaClass*>& result)
317                {
318                    // Lookup source class:
319                
320                    const MetaClass* mc = FindClass(ns, *Str(className));
321                    
322                    if (!mc)
323 mike  1.1.2.11         Throw((CIM_ERR_NOT_FOUND, "unknown class: %s", *Str(className)));
324 mike  1.1.2.8  
325                    // Lookup result class (if any).
326                
327                    const MetaClass* rmc = 0;
328                
329                    if (!resultClass.isNull())
330                    {
331                        rmc = FindClass(ns, *Str(resultClass));
332                
333                        if (!rmc)
334 mike  1.1.2.11             Throw((CIM_ERR_NOT_FOUND, "unknown class: %s", *Str(resultClass)));
335 mike  1.1.2.8      }
336                
337                    // Convert these to UTF8 now to avoid doing so in loop below.
338                
339                    Str r(role);
340                
341                    // Process association classes:
342                
343                    for (size_t i = 0; ns->classes[i]; i++)
344                    {
345                        MetaClass* amc = ns->classes[i];
346                
347                        // Skip non-association classes:
348                
349                        if (!(amc->flags & META_FLAG_ASSOCIATION))
350                            continue;
351                
352                        // Filter by result class:
353                
354                        if (rmc && !IsA(rmc, amc))
355                            continue;
356 mike  1.1.2.8  
357                        // Process reference properties:
358                
359                        MetaFeatureInfo features[META_MAX_FEATURES];
360                        size_t size = 0;
361                        MergeFeatures(amc, false, META_FLAG_REFERENCE, features, size);
362                
363                        for (size_t j = 0; j < size; j++)
364                        {
365                            const MetaFeature* mf = features[j].mf;
366                
367                            // Skip non references:
368                
369                            if (!(mf->flags & META_FLAG_REFERENCE))
370                                continue;
371                
372                            const MetaReference* mr = (const MetaReference*)mf;
373                
374                            // Filter by role parameter.
375                
376                            if (role.size() && !_eqi(r, mf->name))
377 mike  1.1.2.8                  continue;
378                
379                            // Filter by source class:
380                
381                            if (!IsA(mr->ref, mc))
382                                continue;
383                
384                            // Add this one to the output:
385                
386                            if (!_contains(result, amc))
387                                result.append((MetaClass*)amc);
388                        }
389                    }
390                }
391                
392                //==============================================================================
393                //
394                // _getHostName()
395                //
396                //==============================================================================
397                
398 mike  1.1.2.8  static Once _once = PEGASUS_ONCE_INITIALIZER;
399                static const char* _hostName = 0;
400                
401                static void _initHostName()
402                {
403                    String hn = System::getHostName();
404                    _hostName = strdup(*Str(hn));
405                }
406                
407                static inline const char* _getHostName()
408                {
409                    once(&_once, _initHostName);
410                    return _hostName;
411                }
412                
413 mike  1.1.2.1  //==============================================================================
414                //
415                // class MetaRepository
416                //
417                //==============================================================================
418                
419                MetaRepository::MetaRepository()
420                {
421                }
422                
423                MetaRepository::~MetaRepository()
424                {
425                }
426                
427                CIMClass MetaRepository::getClass(
428                    const CIMNamespaceName& nameSpace,
429                    const CIMName& className,
430                    Boolean localOnly,
431                    Boolean includeQualifiers,
432                    Boolean includeClassOrigin,
433                    const CIMPropertyList& propertyList)
434 mike  1.1.2.1  {
435 mike  1.1.2.3      // Lookup namespace:
436                
437                    const MetaNameSpace* ns = _findNameSpace(*Str(nameSpace));
438                
439                    if (!ns)
440 mike  1.1.2.11         Throw((CIM_ERR_INVALID_NAMESPACE, "%s", *Str(nameSpace)));
441 mike  1.1.2.3  
442                    // Lookup class:
443                
444 mike  1.1.2.8      const MetaClass* mc = FindClass(ns, *Str(className));
445 mike  1.1.2.3  
446                    if (!mc)
447 mike  1.1.2.11     {
448                        Throw((CIM_ERR_NOT_FOUND, "unknown class: %s", *Str(className)));
449                    }
450 mike  1.1.2.3  
451                    // Build property list:
452                
453                    char** pl = _makePropertyList(propertyList);
454                
455                    // Make class:
456                
457                    CIMClass cc;
458                
459 mike  1.1.2.8      if (MakeClass(_getHostName(), ns, mc, localOnly, includeQualifiers, 
460                        includeClassOrigin, pl, cc) != 0)
461 mike  1.1.2.3      {
462                        _freePropertyList(pl);
463 mike  1.1.2.11         Throw((CIM_ERR_FAILED, "conversion failed: %s", mc->name));
464 mike  1.1.2.3      }
465                
466                    _freePropertyList(pl);
467                    return cc;
468 mike  1.1.2.1  }
469                
470                Array<CIMClass> MetaRepository::enumerateClasses(
471                    const CIMNamespaceName& nameSpace,
472                    const CIMName& className,
473                    Boolean deepInheritance,
474                    Boolean localOnly,
475                    Boolean includeQualifiers,
476                    Boolean includeClassOrigin)
477                {
478                    // Lookup namespace:
479                
480                    const MetaNameSpace* ns = _findNameSpace(*Str(nameSpace));
481                
482                    if (!ns)
483 mike  1.1.2.11         Throw((CIM_ERR_INVALID_NAMESPACE, "%s", *Str(nameSpace)));
484 mike  1.1.2.1  
485                    // Lookup class:
486                
487                    const MetaClass* super = 0;
488                    
489                    if (!className.isNull())
490                    {
491 mike  1.1.2.8          super = FindClass(ns, *Str(className));
492 mike  1.1.2.1  
493                        if (!super)
494 mike  1.1.2.11             Throw((CIM_ERR_NOT_FOUND, "unknown class: %s", *Str(className)));
495 mike  1.1.2.1      }
496                
497                    // Iterate all classes looking for matches:
498                
499                    Array<CIMClass> result;
500                
501                    for (size_t i = 0; ns->classes[i]; i++)
502                    {
503 mike  1.1.2.3          MetaClass* mc = ns->classes[i];
504 mike  1.1.2.1  
505 mike  1.1.2.3          bool flag = false;
506 mike  1.1.2.1  
507                        if (deepInheritance)
508                        {
509 mike  1.1.2.3              if (_isSubClass(super, mc))
510                                flag = true;
511 mike  1.1.2.1          }
512                        else
513                        {
514 mike  1.1.2.3              if (_isDirectSubClass(super, mc))
515                                flag = true;
516                        }
517                
518                        if (flag)
519                        {
520                            CIMClass cc;
521 mike  1.1.2.1  
522 mike  1.1.2.8              if (MakeClass(_getHostName(), ns, mc, localOnly, includeQualifiers, 
523                                includeClassOrigin, 0, cc) != 0)
524 mike  1.1.2.3              {
525 mike  1.1.2.11                 Throw((CIM_ERR_FAILED, "conversion failed: %s", mc->name));
526 mike  1.1.2.1              }
527 mike  1.1.2.8  
528                            result.append(cc);
529 mike  1.1.2.1          }
530                    }
531                
532                    return result;
533                }
534                
535                Array<CIMName> MetaRepository::enumerateClassNames(
536                    const CIMNamespaceName& nameSpace,
537                    const CIMName& className,
538                    Boolean deepInheritance)
539                {
540                    // Lookup namespace:
541                
542                    const MetaNameSpace* ns = _findNameSpace(*Str(nameSpace));
543                
544                    if (!ns)
545 mike  1.1.2.11         Throw((CIM_ERR_INVALID_NAMESPACE, "%s", *Str(nameSpace)));
546 mike  1.1.2.1  
547                    // Lookup class:
548                
549                    const MetaClass* super = 0;
550                    
551                    if (!className.isNull())
552                    {
553 mike  1.1.2.8          super = FindClass(ns, *Str(className));
554 mike  1.1.2.1  
555                        if (!super)
556 mike  1.1.2.11             Throw((CIM_ERR_NOT_FOUND, "unknown class: %s", *Str(className)));
557 mike  1.1.2.1      }
558                
559                    // Iterate all classes looking for matches:
560                
561                    Array<CIMName> result;
562                
563                    for (size_t i = 0; ns->classes[i]; i++)
564                    {
565 mike  1.1.2.3          MetaClass* mc = ns->classes[i];
566 mike  1.1.2.1  
567                        if (deepInheritance)
568                        {
569 mike  1.1.2.3              if (_isSubClass(super, mc))
570                                result.append(mc->name);
571 mike  1.1.2.1          }
572                        else
573                        {
574 mike  1.1.2.3              if (_isDirectSubClass(super, mc))
575                                result.append(mc->name);
576 mike  1.1.2.1          }
577                    }
578                
579                    return result;
580                }
581                
582                void MetaRepository::deleteClass(
583                    const CIMNamespaceName& nameSpace,
584                    const CIMName& className)
585                {
586 mike  1.1.2.11     Throw((CIM_ERR_NOT_SUPPORTED, "deleteClass()"));
587 mike  1.1.2.1  }
588                
589                void MetaRepository::createClass(
590                    const CIMNamespaceName& nameSpace,
591                    const CIMClass& newClass)
592                {
593 mike  1.1.2.11     Throw((CIM_ERR_NOT_SUPPORTED, "createClass()"));
594 mike  1.1.2.1  }
595                
596                void MetaRepository::modifyClass(
597                    const CIMNamespaceName& nameSpace,
598                    const CIMClass& newClass)
599                {
600 mike  1.1.2.11     Throw((CIM_ERR_NOT_SUPPORTED, "modifyClass()"));
601 mike  1.1.2.1  }
602                
603 mike  1.1.2.4  void MetaRepository::getSubClassNames(
604                    const CIMNamespaceName& nameSpace,
605                    const CIMName& className,
606                    Boolean deepInheritance,
607                    Array<CIMName>& subClassNames)
608                {
609                    subClassNames = MetaRepository::enumerateClassNames(
610                        nameSpace, className, deepInheritance);
611                }
612                
613                void MetaRepository::getSuperClassNames(
614                    const CIMNamespaceName& nameSpace,
615                    const CIMName& className,
616                    Array<CIMName>& superClassNames)
617                {
618                    superClassNames.clear();
619                
620                    // Lookup namespace:
621                
622                    const MetaNameSpace* ns = _findNameSpace(*Str(nameSpace));
623                
624 mike  1.1.2.4      if (!ns)
625 mike  1.1.2.11         Throw((CIM_ERR_INVALID_NAMESPACE, "%s", *Str(nameSpace)));
626 mike  1.1.2.4  
627                    // Lookup class:
628                
629 mike  1.1.2.8      const MetaClass* mc = FindClass(ns, *Str(className));
630 mike  1.1.2.4      
631                    if (!mc)
632 mike  1.1.2.11         Throw((CIM_ERR_NOT_FOUND, "unknown class: %s", *Str(className)));
633 mike  1.1.2.4  
634                    // Append superclass names:
635                
636                    for (const MetaClass* p = mc->super; p; p = p->super)
637                        superClassNames.append(p->name);
638                }
639                
640                void MetaRepository::createNameSpace(
641                    const CIMNamespaceName& nameSpace,
642                    const NameSpaceAttributes& attributes)
643                {
644 mike  1.1.2.11     Throw((CIM_ERR_NOT_SUPPORTED, "createNameSpace()"));
645 mike  1.1.2.4  }
646                
647                void MetaRepository::modifyNameSpace(
648                    const CIMNamespaceName& nameSpace,
649                    const NameSpaceAttributes& attributes)
650                {
651 mike  1.1.2.11     Throw((CIM_ERR_NOT_SUPPORTED, "modifyNameSpace()"));
652 mike  1.1.2.4  }
653                
654                Array<CIMNamespaceName> MetaRepository::enumerateNameSpaces()
655                {
656 mike  1.1.2.10     Array<CIMNamespaceName> result;
657                
658                    if (!_nameSpaces)
659                        return Array<CIMNamespaceName>();
660 mike  1.1.2.4  
661 mike  1.1.2.10     for (const MetaNameSpace* const* p = _nameSpaces; *p; p++)
662                    {
663                        const MetaNameSpace* ns = *p;
664                        result.append(ns->name);
665                    }
666 mike  1.1.2.4  
667 mike  1.1.2.10     return result;
668 mike  1.1.2.4  }
669                
670                void MetaRepository::deleteNameSpace(
671                    const CIMNamespaceName& nameSpace)
672                {
673 mike  1.1.2.11     Throw((CIM_ERR_NOT_SUPPORTED, "deleteNameSpace()"));
674 mike  1.1.2.4  }
675                
676                Boolean MetaRepository::getNameSpaceAttributes(
677                    const CIMNamespaceName& nameSpace,
678                    NameSpaceAttributes& attributes)
679                {
680 mike  1.1.2.11     Throw((CIM_ERR_NOT_SUPPORTED, "getNameSpaceAttributes()"));
681 mike  1.1.2.4  
682                    return false;
683                }
684                
685                Boolean MetaRepository::isRemoteNameSpace(
686                    const CIMNamespaceName& nameSpace,
687                    String& remoteInfo)
688                {
689                    return false;
690                }
691                
692                CIMQualifierDecl MetaRepository::getQualifier(
693                    const CIMNamespaceName& nameSpace,
694                    const CIMName& qualifierName)
695                {
696                    // Lookup namespace:
697                
698                    const MetaNameSpace* ns = _findNameSpace(*Str(nameSpace));
699                
700                    if (!ns)
701 mike  1.1.2.11         Throw((CIM_ERR_INVALID_NAMESPACE, "%s", *Str(nameSpace)));
702 mike  1.1.2.4  
703                    // Lookup qualifier:
704                
705 mike  1.1.2.8      const MetaQualifierDecl* mqd = FindQualifierDecl(ns, *Str(qualifierName));
706 mike  1.1.2.4      
707                    if (!mqd)
708 mike  1.1.2.11         Throw((CIM_ERR_NOT_FOUND, 
709                            "unknown qualifier: %s", *Str(qualifierName)));
710 mike  1.1.2.4  
711                    // Make the qualifier declaration:
712                
713                    CIMQualifierDecl cqd;
714                
715 mike  1.1.2.5      if (MakeQualifierDecl(ns, mqd, cqd) != 0)
716 mike  1.1.2.4      {
717 mike  1.1.2.11         Throw((CIM_ERR_FAILED, "conversion failed: %s", mqd->name));
718 mike  1.1.2.4      }
719                
720                    return cqd;
721                }
722                
723                void MetaRepository::setQualifier(
724                    const CIMNamespaceName& nameSpace,
725                    const CIMQualifierDecl& qualifierDecl)
726                {
727 mike  1.1.2.11     Throw((CIM_ERR_NOT_SUPPORTED, "setQualifier()"));
728 mike  1.1.2.4  
729                }
730                
731                void MetaRepository::deleteQualifier(
732                    const CIMNamespaceName& nameSpace,
733                    const CIMName& qualifierName)
734                {
735 mike  1.1.2.11     Throw((CIM_ERR_NOT_SUPPORTED, "deleteQualifier()"));
736 mike  1.1.2.4  }
737                
738                Array<CIMQualifierDecl> MetaRepository::enumerateQualifiers(
739                    const CIMNamespaceName& nameSpace)
740                {
741                    // Lookup namespace:
742                
743                    const MetaNameSpace* ns = _findNameSpace(*Str(nameSpace));
744                
745                    if (!ns)
746 mike  1.1.2.11         Throw((CIM_ERR_INVALID_NAMESPACE, "%s", *Str(nameSpace)));
747 mike  1.1.2.4  
748                    // Build the array of qualifier declarations:
749                
750                    Array<CIMQualifierDecl> result;
751                
752                    for (size_t i = 0; ns->qualifiers[i]; i++)
753                    {
754                        const MetaQualifierDecl* mqd = ns->qualifiers[i];
755                        CIMQualifierDecl cqd;
756                
757 mike  1.1.2.5          if (MakeQualifierDecl(ns, mqd, cqd) != 0)
758 mike  1.1.2.4          {
759 mike  1.1.2.11             Throw((CIM_ERR_FAILED, "conversion failed: %s", mqd->name));
760 mike  1.1.2.4          }
761                
762                        result.append(cqd);
763                    }
764                
765                    return result;
766                }
767                
768 mike  1.1.2.8  Array<CIMObjectPath> MetaRepository::associatorClassPaths(
769                    const CIMNamespaceName& nameSpace,
770                    const CIMName& className,
771                    const CIMName& assocClass,
772                    const CIMName& resultClass,
773                    const String& role,
774                    const String& resultRole)
775                {
776                    // Lookup namespace:
777                
778                    const MetaNameSpace* ns = _findNameSpace(*Str(nameSpace));
779                
780                    if (!ns)
781 mike  1.1.2.11         Throw((CIM_ERR_INVALID_NAMESPACE, "%s", *Str(nameSpace)));
782 mike  1.1.2.8  
783                    // Get associator meta-classes:
784                
785                    Array<const MetaClass*> mcs;
786                    _associators(ns, className, assocClass, resultClass, role, resultRole, mcs);
787                
788                    // Convert meta-classes to object names:
789                
790                    Array<CIMObjectPath> result;
791                
792                    for (Uint32 i = 0; i < mcs.size(); i++)
793                        result.append(CIMObjectPath(_getHostName(), nameSpace, mcs[i]->name));
794                
795                    return result;
796                }
797                
798                Array<CIMObject> MetaRepository::associatorClasses(
799                    const CIMNamespaceName& nameSpace,
800                    const CIMName& className,
801                    const CIMName& assocClass,
802                    const CIMName& resultClass,
803 mike  1.1.2.8      const String& role,
804                    const String& resultRole,
805                    Boolean includeQualifiers,
806                    Boolean includeClassOrigin,
807                    const CIMPropertyList& propertyList)
808                {
809                    // Lookup namespace:
810                
811                    const MetaNameSpace* ns = _findNameSpace(*Str(nameSpace));
812                
813                    if (!ns)
814 mike  1.1.2.11         Throw((CIM_ERR_INVALID_NAMESPACE, "%s", *Str(nameSpace)));
815 mike  1.1.2.8  
816                    // Get associator meta-classes:
817                
818                    Array<const MetaClass*> mcs;
819                    _associators(ns, className, assocClass, resultClass, role, resultRole, mcs);
820                
821                    // Convert meta-classes to classes.
822                
823                    Array<CIMObject> result;
824                
825                    char** pl = _makePropertyList(propertyList);
826                
827                    for (Uint32 i = 0; i < mcs.size(); i++)
828                    {
829                        const MetaClass* mc = mcs[i];
830                        CIMClass cc;
831                
832                        if (MakeClass(_getHostName(), ns, mc, false, includeQualifiers, 
833                            includeClassOrigin, pl, cc) != 0)
834                        {
835                            _freePropertyList(pl);
836 mike  1.1.2.11             Throw((CIM_ERR_FAILED, "conversion failed: %s", mc->name));
837 mike  1.1.2.8          }
838                
839                        result.append(cc);
840                    }
841                
842                    _freePropertyList(pl);
843                    return result;
844                }
845                
846                Array<CIMObject> MetaRepository::referenceClasses(
847                    const CIMNamespaceName& nameSpace,
848                    const CIMName& className,
849                    const CIMName& resultClass,
850                    const String& role,
851                    Boolean includeQualifiers,
852                    Boolean includeClassOrigin,
853                    const CIMPropertyList& propertyList)
854                {
855                    // Lookup namespace:
856                
857                    const MetaNameSpace* ns = _findNameSpace(*Str(nameSpace));
858 mike  1.1.2.8  
859                    if (!ns)
860 mike  1.1.2.11         Throw((CIM_ERR_INVALID_NAMESPACE, "%s", *Str(nameSpace)));
861 mike  1.1.2.8  
862                    // Get reference meta-classes:
863                
864                    Array<const MetaClass*> mcs;
865                    _references(ns, className, resultClass, role, mcs);
866                
867                    // Convert meta-classes to classes.
868                
869                    Array<CIMObject> result;
870                
871                    char** pl = _makePropertyList(propertyList);
872                
873                    for (Uint32 i = 0; i < mcs.size(); i++)
874                    {
875                        const MetaClass* mc = mcs[i];
876                        CIMClass cc;
877                
878                        if (MakeClass(_getHostName(), ns, mc, false, includeQualifiers, 
879                            includeClassOrigin, pl, cc) != 0)
880                        {
881                            _freePropertyList(pl);
882 mike  1.1.2.11             Throw((CIM_ERR_FAILED, "conversion failed: %s", mc->name));
883 mike  1.1.2.8          }
884                
885                        result.append(cc);
886                    }
887                
888                    _freePropertyList(pl);
889                    return result;
890                }
891                
892                Array<CIMObjectPath> MetaRepository::referenceClassPaths(
893                    const CIMNamespaceName& nameSpace,
894                    const CIMName& className,
895                    const CIMName& resultClass,
896                    const String& role)
897                {
898                    // Lookup namespace:
899                
900                    const MetaNameSpace* ns = _findNameSpace(*Str(nameSpace));
901                
902                    if (!ns)
903 mike  1.1.2.11         Throw((CIM_ERR_INVALID_NAMESPACE, "%s", *Str(nameSpace)));
904 mike  1.1.2.8  
905                    // Get reference meta-classes:
906                
907                    Array<const MetaClass*> mcs;
908                    _references(ns, className, resultClass, role, mcs);
909                
910                    // Convert meta-classes to object paths.
911                
912                    Array<CIMObjectPath> result;
913                
914                    for (Uint32 i = 0; i < mcs.size(); i++)
915                        result.append(CIMObjectPath(_getHostName(), nameSpace, mcs[i]->name));
916                
917                    return result;
918                }
919                
920 mike  1.1.2.9  const MetaClass* MetaRepository::findMetaClass(
921                    const char* nameSpace,
922                    const char* className)
923                {
924                    // Lookup namespace:
925                
926                    const MetaNameSpace* ns = _findNameSpace(nameSpace);
927                
928                    if (!ns)
929                        return 0;
930                
931                    return FindClass(ns, className);
932                }
933                
934 mike  1.1.2.10 void MetaRepository::installNameSpaces(const MetaNameSpace* const* nameSpaces)
935                {
936                    _nameSpaces = nameSpaces;
937                }
938                
939 mike  1.1.2.1  PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2