00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00035 #include "OW_MOFCompiler.hpp"
00036 #include "OW_Format.hpp"
00037 #include "OW_MOFParserDecls.hpp"
00038 #include "OW_MOFCIMOMVisitor.hpp"
00039 #include "OW_Assertion.hpp"
00040 #include "OW_ThreadCancelledException.hpp"
00041 #include "OW_MOFGrammar.hpp"
00042 
00043 #include "OW_CIMObjectPath.hpp"
00044 #include "OW_CIMException.hpp"
00045 #include "OW_CIMOMHandleIFC.hpp"
00046 #include "OW_ExceptionIds.hpp"
00047 #include "OW_Enumeration.hpp"
00048 #include "OW_NonRecursiveMutex.hpp"
00049 #include "OW_NonRecursiveMutexLock.hpp"
00050 #include "OW_Logger.hpp"
00051 
00052 #include <assert.h>
00053 #include <cctype>
00054 
00055 
00056 void owmof_delete_buffer(YY_BUFFER_STATE b);
00057 YY_BUFFER_STATE owmof_scan_bytes( const char *bytes, int len );
00058 
00059 namespace OW_NAMESPACE
00060 {
00061 
00062 OW_DEFINE_EXCEPTION_WITH_ID(MOFCompiler)
00063 
00064 namespace MOF
00065 {
00066 
00067 
00068 namespace
00069 {
00070 
00071 NonRecursiveMutex g_guard;
00072 }
00073 
00074 Compiler::Compiler( const CIMOMHandleIFCRef& ch, const Options& opts, const ParserErrorHandlerIFCRef& mpeh )
00075    : theErrorHandler(mpeh)
00076    , include_stack_ptr(0)
00077    , m_ch(ch)
00078    , m_opts(opts)
00079 {
00080 }
00081 Compiler::~Compiler()
00082 {
00083 }
00084 long Compiler::compile( const String& filename )
00085 {
00086    include_stack_ptr = 0;
00087    theLineInfo = LineInfo(filename,1);
00088    try
00089    {
00090       try
00091       {
00092          size_t i = filename.lastIndexOf(OW_FILENAME_SEPARATOR);
00093          if (i != String::npos)
00094          {
00095             basepath = filename.substring(0,i);
00096          }
00097          else
00098          {
00099             basepath = String();
00100          }
00101          if (filename != "-")
00102          {
00103             owmofin = fopen(filename.c_str(), "r");
00104             if (!owmofin)
00105             {
00106                theErrorHandler->fatalError("Unable to open file", LineInfo(filename, 0));
00107                return 1;
00108             }
00109          }
00110          theErrorHandler->progressMessage("Starting parsing",
00111                LineInfo(filename, 0));
00112          
00113          {
00114             NonRecursiveMutexLock lock(g_guard);
00115             #ifdef YYOW_DEBUG
00116             owmofdebug = 1;
00117             #endif
00118             owmofparse(this);
00119          }
00120 
00121          theErrorHandler->progressMessage("Finished parsing",
00122                theLineInfo);
00123          CIMOMVisitor v(m_ch, m_opts, theErrorHandler);
00124          mofSpecification->Accept(&v);
00125       }
00126       catch (const ParseFatalErrorException&)
00127       {
00128          
00129       }
00130       catch (AssertionException& e)
00131       {
00132          theErrorHandler->fatalError(Format( "INTERNAL COMPILER ERROR: %1", e).c_str(), theLineInfo);
00133       }
00134       catch (Exception& e)
00135       {
00136          theErrorHandler->fatalError(Format( "ERROR: %1", e).c_str(), theLineInfo);
00137       }
00138       catch (std::exception& e)
00139       {
00140          theErrorHandler->fatalError(Format( "INTERNAL COMPILER ERROR: %1", e.what() ).c_str(), theLineInfo);
00141       }
00142       catch (ThreadCancelledException&)
00143       {
00144          theErrorHandler->fatalError("INTERNAL COMPILER ERROR: Thread cancelled", theLineInfo);
00145          throw;
00146       }
00147       catch(...)
00148       {
00149          theErrorHandler->fatalError( "INTERNAL COMPILER ERROR: Unknown exception", theLineInfo);
00150       }
00151    }
00152    catch (const ParseFatalErrorException&)
00153    {
00154       
00155    }
00156    return theErrorHandler->errorCount();
00157 }
00158 namespace {
00159    struct owmofBufferDeleter
00160    {
00161       owmofBufferDeleter(YY_BUFFER_STATE buf) : m_buf(buf) {}
00162       ~owmofBufferDeleter() {owmof_delete_buffer(m_buf);}
00163       YY_BUFFER_STATE m_buf;
00164    };
00165 }
00166 long Compiler::compileString( const String& mof )
00167 {
00168    include_stack_ptr = 0;
00169    String filename = "string";
00170    theLineInfo = LineInfo(filename,1);
00171    try
00172    {
00173       try
00174       {
00175          NonRecursiveMutexLock lock(g_guard);
00176          
00177             YY_BUFFER_STATE buf = owmof_scan_bytes(mof.c_str(), mof.length());
00178             owmofBufferDeleter deleter(buf);
00179             theErrorHandler->progressMessage("Starting parsing",
00180                   LineInfo(filename, 0));
00181             #ifdef YYOW_DEBUG
00182             owmofdebug = 1;
00183             #endif
00184             owmofparse(this);
00185          
00186          lock.release();
00187 
00188          theErrorHandler->progressMessage("Finished parsing",
00189                theLineInfo);
00190          CIMOMVisitor v(m_ch, m_opts, theErrorHandler);
00191          mofSpecification->Accept(&v);
00192       }
00193       catch (const ParseFatalErrorException&)
00194       {
00195          
00196       }
00197       catch (AssertionException& e)
00198       {
00199          theErrorHandler->fatalError(Format( "INTERNAL COMPILER ERROR: %1", e).c_str(), LineInfo("(none)", 0));
00200       }
00201       catch (Exception& e)
00202       {
00203          theErrorHandler->fatalError(Format( "ERROR: %1", e).c_str(), LineInfo("(none)", 0));
00204       }
00205       catch (std::exception& e)
00206       {
00207          theErrorHandler->fatalError(Format( "INTERNAL COMPILER ERROR: %1", e.what() ).c_str(), LineInfo("(none)", 0));
00208       }
00209       catch (ThreadCancelledException&)
00210       {
00211          theErrorHandler->fatalError("INTERNAL COMPILER ERROR: Thread cancelled", theLineInfo);
00212          throw;
00213       }
00214       catch(...)
00215       {
00216          theErrorHandler->fatalError( "INTERNAL COMPILER ERROR: Unknown exception", LineInfo("(none)", 0));
00217       }
00218    }
00219    catch (const ParseFatalErrorException&)
00220    {
00221       
00222    }
00223    return theErrorHandler->errorCount();
00224 }
00225 
00226 String Compiler::fixParsedString(const String& s)
00227 {
00228    bool inString = false;
00229    StringBuffer unescaped;
00230    for (size_t i = 0; i < s.length(); ++i)
00231    {
00232       if (inString)
00233       {
00234          if (s[i] == '\\')
00235          {
00236             ++i;
00237 
00238             
00239             OW_ASSERT(i < s.length());
00240 
00241             switch (s[i])
00242             {
00243                case 'b':
00244                   unescaped += '\b';
00245                   break;
00246                case 't':
00247                   unescaped += '\t';
00248                   break;
00249                case 'n':
00250                   unescaped += '\n';
00251                   break;
00252                case 'f':
00253                   unescaped += '\f';
00254                   break;
00255                case 'r':
00256                   unescaped += '\r';
00257                   break;
00258                case '"':
00259                   unescaped += '"';
00260                   break;
00261                case '\'':
00262                   unescaped += '\'';
00263                   break;
00264                case '\\':
00265                   unescaped += '\\';
00266                   break;
00267                case 'x':
00268                case 'X':
00269                   {
00270                      
00271                      UInt16 hex = 0;
00272                      for (size_t j = 0; j < 4; ++j)
00273                      {
00274                         hex <<= 4;
00275                         char c = s[i+j];
00276                         if (isdigit(c))
00277                         {
00278                            hex |= c - '0';
00279                         }
00280                         else if (isxdigit(c))
00281                         {
00282                            c = toupper(c);
00283                            hex |= c - 'A' + 0xA;
00284                         }
00285                         else
00286                         {
00287                            break;
00288                         }
00289                      }
00290                      if (hex > CHAR_MAX)
00291                      {
00292                         OW_THROW(MOFCompilerException, "Escape sequence larger than supported maximum");
00293                      }
00294                      unescaped += static_cast<char>(hex);
00295                   }
00296                   break;
00297                default:
00298                   
00299                   OW_ASSERTMSG(0, "Invalid escape sequence");
00300                   break;
00301             }
00302          }
00303          else if (s[i] == '"')
00304          {
00305             inString = false;
00306          }
00307          else
00308          {
00309             unescaped += s[i];
00310          }
00311       }
00312       else
00313       {
00314          
00315          if (s[i] == '"')
00316          {
00317             inString = true;
00318          }
00319       }
00320    }
00321 
00322    return unescaped.releaseString();
00323 }
00324 
00325 class StoreLocalDataHandle : public CIMOMHandleIFC
00326 {
00327 public:
00328    StoreLocalDataHandle(const CIMOMHandleIFCRef& hdl, CIMInstanceArray& instances, CIMClassArray& classes, CIMQualifierTypeArray& qualifierTypes)
00329       : m_realhdl(hdl)
00330       , m_instances(instances)
00331       , m_classes(classes)
00332       , m_qualifierTypes(qualifierTypes)
00333    {
00334    }
00335    virtual CIMObjectPath createInstance(const String &ns, const CIMInstance &instance)
00336    {
00337       m_instances.push_back(instance);
00338       return CIMObjectPath(ns, instance);
00339    }
00340    virtual CIMClass getClass(const String &ns, const String &className,
00341       WBEMFlags:: ELocalOnlyFlag localOnly=WBEMFlags:: E_NOT_LOCAL_ONLY,
00342       WBEMFlags:: EIncludeQualifiersFlag includeQualifiers=WBEMFlags:: E_INCLUDE_QUALIFIERS,
00343       WBEMFlags:: EIncludeClassOriginFlag includeClassOrigin=WBEMFlags:: E_INCLUDE_CLASS_ORIGIN,
00344       const StringArray *propertyList=0)
00345    {
00346       
00347       for (size_t i = 0; i < m_classes.size(); ++i)
00348       {
00349          if (m_classes[i].getName() == CIMName(className))
00350          {
00351             return m_classes[i];
00352          }
00353       }
00354       
00355       if (m_realhdl)
00356       {
00357          try
00358          {
00359             return m_realhdl->getClass(ns, className, localOnly, includeQualifiers, includeClassOrigin, propertyList);
00360          }
00361          catch (CIMException& e)
00362          {
00363             
00364          }
00365       }
00366 
00367       
00368       return CIMClass(className);
00369    }
00370 
00371    virtual CIMQualifierType getQualifierType(const String &ns, const String &qualifierName)
00372    {
00373       
00374       for (size_t i = 0; i < m_qualifierTypes.size(); ++i)
00375       {
00376          if (m_qualifierTypes[i].getName() == CIMName(qualifierName))
00377          {
00378             return m_qualifierTypes[i];
00379          }
00380       }
00381       
00382       if (m_realhdl)
00383       {
00384          return m_realhdl->getQualifierType(ns, qualifierName);
00385       }
00386       OW_THROWCIM(CIMException::FAILED);
00387    }
00388 
00389    virtual void setQualifierType(const String &ns, const CIMQualifierType &qualifierType)
00390    {
00391       m_qualifierTypes.push_back(qualifierType);
00392    }
00393 
00394    virtual void createClass(const String &ns, const CIMClass &cimClass)
00395    {
00396       m_classes.push_back(cimClass);
00397    }
00398 
00399 private:
00400    CIMOMHandleIFCRef m_realhdl;
00401    CIMInstanceArray& m_instances;
00402    CIMClassArray& m_classes;
00403    CIMQualifierTypeArray& m_qualifierTypes;
00404 
00405 #define THROW_ERROR_NOT_IMPLEMENTED(name) OW_THROWCIMMSG(CIMException::FAILED, Format("Not implemented: %1", (name)).c_str())
00406 #define THROW_ERROR_NOT_IMPLEMENTED_FUNCNAME() THROW_ERROR_NOT_IMPLEMENTED(OW_LOGGER_PRETTY_FUNCTION)
00407    
00408    virtual void enumClassNames(const String &ns, const String &className, StringResultHandlerIFC &result, WBEMFlags:: EDeepFlag deep=WBEMFlags:: E_DEEP)
00409    {
00410       THROW_ERROR_NOT_IMPLEMENTED_FUNCNAME();
00411    }
00412    virtual void close()
00413    {
00414       THROW_ERROR_NOT_IMPLEMENTED_FUNCNAME();
00415    }
00416    virtual void enumClass(const String &ns, const String &className, CIMClassResultHandlerIFC &result, WBEMFlags:: EDeepFlag deep=WBEMFlags:: E_SHALLOW, WBEMFlags:: ELocalOnlyFlag localOnly=WBEMFlags:: E_NOT_LOCAL_ONLY, WBEMFlags:: EIncludeQualifiersFlag includeQualifiers=WBEMFlags:: E_INCLUDE_QUALIFIERS, WBEMFlags:: EIncludeClassOriginFlag includeClassOrigin=WBEMFlags:: E_INCLUDE_CLASS_ORIGIN)
00417    {
00418       THROW_ERROR_NOT_IMPLEMENTED_FUNCNAME();
00419    }
00420    virtual void enumInstanceNames(const String &ns, const String &className, CIMObjectPathResultHandlerIFC &result)
00421    {
00422       THROW_ERROR_NOT_IMPLEMENTED_FUNCNAME();
00423    }
00424    virtual void enumInstances(const String &ns, const String &className, CIMInstanceResultHandlerIFC &result, WBEMFlags:: EDeepFlag deep=WBEMFlags:: E_DEEP, WBEMFlags:: ELocalOnlyFlag localOnly=WBEMFlags:: E_NOT_LOCAL_ONLY, WBEMFlags:: EIncludeQualifiersFlag includeQualifiers=WBEMFlags:: E_EXCLUDE_QUALIFIERS, WBEMFlags:: EIncludeClassOriginFlag includeClassOrigin=WBEMFlags:: E_EXCLUDE_CLASS_ORIGIN, const StringArray *propertyList=0)
00425    {
00426       THROW_ERROR_NOT_IMPLEMENTED_FUNCNAME();
00427    }
00428    virtual CIMValue invokeMethod(const String &ns, const CIMObjectPath &path, const String &methodName, const CIMParamValueArray &inParams, CIMParamValueArray &outParams)
00429    {
00430       THROW_ERROR_NOT_IMPLEMENTED_FUNCNAME();
00431    }
00432    virtual CIMInstance getInstance(const String &ns, const CIMObjectPath &instanceName, WBEMFlags:: ELocalOnlyFlag localOnly=WBEMFlags:: E_NOT_LOCAL_ONLY, WBEMFlags:: EIncludeQualifiersFlag includeQualifiers=WBEMFlags:: E_EXCLUDE_QUALIFIERS, WBEMFlags:: EIncludeClassOriginFlag includeClassOrigin=WBEMFlags:: E_EXCLUDE_CLASS_ORIGIN, const StringArray *propertyList=0)
00433    {
00434       THROW_ERROR_NOT_IMPLEMENTED_FUNCNAME();
00435    }
00436    virtual void enumQualifierTypes(const String &ns, CIMQualifierTypeResultHandlerIFC &result)
00437    {
00438       THROW_ERROR_NOT_IMPLEMENTED_FUNCNAME();
00439    }
00440    virtual void deleteQualifierType(const String &ns, const String &qualName)
00441    {
00442       THROW_ERROR_NOT_IMPLEMENTED_FUNCNAME();
00443    }
00444    virtual void deleteClass(const String &ns, const String &className)
00445    {
00446       THROW_ERROR_NOT_IMPLEMENTED_FUNCNAME();
00447    }
00448    virtual void modifyInstance(const String &ns, const CIMInstance &modifiedInstance, WBEMFlags:: EIncludeQualifiersFlag includeQualifiers=WBEMFlags:: E_INCLUDE_QUALIFIERS, const StringArray *propertyList=0)
00449    {
00450       THROW_ERROR_NOT_IMPLEMENTED_FUNCNAME();
00451    }
00452    virtual void modifyClass(const String &ns, const CIMClass &cimClass)
00453    {
00454       THROW_ERROR_NOT_IMPLEMENTED_FUNCNAME();
00455    }
00456    virtual void setProperty(const String &ns, const CIMObjectPath &instanceName, const String &propertyName, const CIMValue &newValue)
00457    {
00458       THROW_ERROR_NOT_IMPLEMENTED_FUNCNAME();
00459    }
00460    virtual CIMValue getProperty(const String &ns, const CIMObjectPath &instanceName, const String &propertyName)
00461    {
00462       THROW_ERROR_NOT_IMPLEMENTED_FUNCNAME();
00463    }
00464    virtual void deleteInstance(const String &ns, const CIMObjectPath &path)
00465    {
00466       THROW_ERROR_NOT_IMPLEMENTED_FUNCNAME();
00467    }
00468    virtual void associators(const String &ns, const CIMObjectPath &path, CIMInstanceResultHandlerIFC &result, const String &assocClass=String(), const String &resultClass=String(), const String &role=String(), const String &resultRole=String(), WBEMFlags:: EIncludeQualifiersFlag includeQualifiers=WBEMFlags:: E_EXCLUDE_QUALIFIERS, WBEMFlags:: EIncludeClassOriginFlag includeClassOrigin=WBEMFlags:: E_EXCLUDE_CLASS_ORIGIN, const StringArray *propertyList=0)
00469    {
00470       THROW_ERROR_NOT_IMPLEMENTED_FUNCNAME();
00471    }
00472    virtual void associatorNames(const String &ns, const CIMObjectPath &objectName, CIMObjectPathResultHandlerIFC &result, const String &assocClass=String(), const String &resultClass=String(), const String &role=String(), const String &resultRole=String())
00473    {
00474       THROW_ERROR_NOT_IMPLEMENTED_FUNCNAME();
00475    }
00476    virtual void associatorsClasses(const String &ns, const CIMObjectPath &path, CIMClassResultHandlerIFC &result, const String &assocClass=String(), const String &resultClass=String(), const String &role=String(), const String &resultRole=String(), WBEMFlags:: EIncludeQualifiersFlag includeQualifiers=WBEMFlags:: E_EXCLUDE_QUALIFIERS, WBEMFlags:: EIncludeClassOriginFlag includeClassOrigin=WBEMFlags:: E_EXCLUDE_CLASS_ORIGIN, const StringArray *propertyList=0)
00477    {
00478       THROW_ERROR_NOT_IMPLEMENTED_FUNCNAME();
00479    }
00480    virtual void referenceNames(const String &ns, const CIMObjectPath &path, CIMObjectPathResultHandlerIFC &result, const String &resultClass=String(), const String &role=String())
00481    {
00482       THROW_ERROR_NOT_IMPLEMENTED_FUNCNAME();
00483    }
00484    virtual void references(const String &ns, const CIMObjectPath &path, CIMInstanceResultHandlerIFC &result, const String &resultClass=String(), const String &role=String(), WBEMFlags:: EIncludeQualifiersFlag includeQualifiers=WBEMFlags:: E_EXCLUDE_QUALIFIERS, WBEMFlags:: EIncludeClassOriginFlag includeClassOrigin=WBEMFlags:: E_EXCLUDE_CLASS_ORIGIN, const StringArray *propertyList=0)
00485    {
00486       THROW_ERROR_NOT_IMPLEMENTED_FUNCNAME();
00487    }
00488    virtual void referencesClasses(const String &ns, const CIMObjectPath &path, CIMClassResultHandlerIFC &result, const String &resultClass=String(), const String &role=String(), WBEMFlags:: EIncludeQualifiersFlag includeQualifiers=WBEMFlags:: E_EXCLUDE_QUALIFIERS, WBEMFlags:: EIncludeClassOriginFlag includeClassOrigin=WBEMFlags:: E_EXCLUDE_CLASS_ORIGIN, const StringArray *propertyList=0)
00489    {
00490       THROW_ERROR_NOT_IMPLEMENTED_FUNCNAME();
00491    }
00492    virtual void execQuery(const String &ns, CIMInstanceResultHandlerIFC &result, const String &query, const String &queryLanguage)
00493    {
00494       THROW_ERROR_NOT_IMPLEMENTED_FUNCNAME();
00495    }
00496 };
00497 
00498 class LoggerErrHandler : public ParserErrorHandlerIFC
00499 {
00500 protected:
00501    virtual void doProgressMessage(const char *message, const LineInfo &li)
00502    {
00503       if( logger )
00504       {
00505          OW_LOG_DEBUG(logger, Format("MOF compilation progress: %1: line %2: %3", li.filename, li.lineNum, message));
00506       }
00507       warnings.push_back(message);
00508    }
00509    virtual void doFatalError(const char *error, const LineInfo &li)
00510    {
00511       if( logger )
00512       {
00513          OW_LOG_ERROR(logger, Format("Fatal MOF compilation error: %1: line %2: %3", li.filename, li.lineNum, error));
00514       }
00515       errors.push_back(error);
00516    }
00517    virtual EParserAction doRecoverableError(const char *error, const LineInfo &li)
00518    {
00519       if( logger )
00520       {
00521          OW_LOG_ERROR(logger, Format("MOF compilation error: %1: line %2: %3", li.filename, li.lineNum, error));
00522       }
00523       errors.push_back(error);
00524       return ParserErrorHandlerIFC::E_ABORT_ACTION;
00525    }
00526    LoggerRef logger;
00527 
00528 public:
00529    LoggerErrHandler(const LoggerRef& l):
00530       logger(l)
00531    {
00532    }
00533    StringArray errors;
00534    StringArray warnings;
00535 };
00536 
00537 CIMInstance compileInstanceFromMOF(const String& instMOF, const LoggerRef& logger)
00538 {
00539    CIMInstanceArray cia;
00540    CIMClassArray dummyClasses;
00541    CIMQualifierTypeArray dummyQualifierTypes;
00542    compileMOF(instMOF, CIMOMHandleIFCRef(), "", cia, dummyClasses, dummyQualifierTypes, logger);
00543    if (cia.size() == 1)
00544    {
00545       return cia[0];
00546    }
00547    OW_THROW(MOFCompilerException, "MOF did not contain one instance");
00548 }
00549 
00550 CIMInstanceArray compileInstancesFromMOF(const String& instMOF, const LoggerRef& logger)
00551 {
00552    CIMInstanceArray cia;
00553    CIMClassArray dummyClasses;
00554    CIMQualifierTypeArray dummyQualifierTypes;
00555    compileMOF(instMOF, CIMOMHandleIFCRef(), "", cia, dummyClasses, dummyQualifierTypes, logger);
00556    return cia;
00557 }
00558 
00559 CIMInstanceArray compileInstancesFromMOF(const String& instMOF, const CIMOMHandleIFCRef& realhdl, const String& ns, const LoggerRef& logger)
00560 {
00561    CIMInstanceArray cia;
00562    CIMClassArray dummyClasses;
00563    CIMQualifierTypeArray dummyQualifierTypes;
00564    IntrusiveReference<StoreLocalDataHandle> hdl(new StoreLocalDataHandle(realhdl, cia, dummyClasses, dummyQualifierTypes));
00565    MOF::Compiler::Options opts;
00566    opts.m_namespace = ns;
00567    IntrusiveReference<LoggerErrHandler> errHandler(new LoggerErrHandler(logger));
00568    MOF::Compiler comp(hdl, opts, errHandler);
00569    long errors = comp.compileString(instMOF);
00570    if (errors > 0)
00571    {
00572       
00573       OW_THROW(MOFCompilerException, errHandler->errors.size() > 0 ? errHandler->errors[0].c_str() : "");
00574    }
00575    return cia;
00576 }
00577 
00578 void compileMOF(const String& mof, const CIMOMHandleIFCRef& realhdl, const String& ns,
00579    CIMInstanceArray& instances, CIMClassArray& classes, CIMQualifierTypeArray& qualifierTypes, const LoggerRef& logger)
00580 {
00581    IntrusiveReference<StoreLocalDataHandle> hdl(new StoreLocalDataHandle(realhdl, instances, classes, qualifierTypes));
00582    MOF::Compiler::Options opts;
00583    opts.m_namespace = ns;
00584    IntrusiveReference<LoggerErrHandler> errHandler(new LoggerErrHandler(logger));
00585    MOF::Compiler comp(hdl, opts, errHandler);
00586    long errors = comp.compileString(mof);
00587    if (errors > 0)
00588    {
00589       
00590       StringBuffer errorStrs;
00591       for (size_t i = 0; i < errHandler->errors.size(); ++i)
00592       {
00593          if (i > 0)
00594          {
00595             errorStrs += '\n';
00596          }
00597          errorStrs += errHandler->errors[i];
00598       }
00599       OW_THROW(MOFCompilerException, errorStrs.c_str());
00600    }
00601 }
00602 
00603 } 
00604 } 
00605