0024925: Enabling OCAF persistence without setting environment variables
authorRoman Lygin <roman.lygin@gmail.com>
Thu, 10 Jul 2014 10:47:20 +0000 (14:47 +0400)
committerapn <apn@opencascade.com>
Thu, 10 Jul 2014 10:48:55 +0000 (14:48 +0400)
Add test case bugs/caf/bug24925
Merging with current master IR-2014-07-03

12 files changed:
src/CDF/CDF.cdl
src/CDF/CDF_FWOSDriver.cdl [moved from src/FWOSDriver/FWOSDriver_Driver.cdl with 91% similarity]
src/CDF/CDF_FWOSDriver.cxx [moved from src/FWOSDriver/FWOSDriver_Driver.cxx with 88% similarity]
src/CDF/CDF_Session.cxx
src/FWOSDriver/FWOSDriver.cdl
src/FWOSDriver/FWOSDriver_DriverFactory.cxx
src/Plugin/Plugin.cdl
src/Plugin/Plugin.cxx
src/QABugs/QABugs_19.cxx
src/TDocStd/TDocStd_Application.cdl
src/TDocStd/TDocStd_Application.cxx
tests/bugs/caf/bug24925 [new file with mode: 0644]

index e9ffe73..d03adbc 100644 (file)
@@ -56,6 +56,9 @@ is
 
     deferred class MetaDataDriver;
 
+    class FWOSDriver;
+
+
     exception MetaDataDriverError inherits Failure from Standard;
     ---Purpose: this exception is used in the deferred methods.
     --          Programmer implementing such methods may use this
similarity index 91%
rename from src/FWOSDriver/FWOSDriver_Driver.cdl
rename to src/CDF/CDF_FWOSDriver.cdl
index 2887fb3..1bf7d4d 100644 (file)
 -- Alternatively, this file may be used under the terms of Open CASCADE
 -- commercial license or contractual agreement.
 
-class Driver from FWOSDriver  inherits MetaDataDriver from CDF
+class FWOSDriver from CDF  inherits MetaDataDriver from CDF
 uses
-    MetaData from CDM,Document from CDM,
-    ExtendedString from TCollection,
+    MetaData from CDM,
+    Document from CDM,
     ExtendedString from TCollection
 is
     Create
-    returns Driver from FWOSDriver;
+    returns FWOSDriver from CDF;
     ---Purpose: initializes the MetaDatadriver with its specific name.
 
 
@@ -65,4 +65,4 @@ is
    returns ExtendedString from TCollection
    is redefined;
    
-end Driver from FWOSDriver;
+end FWOSDriver from CDF;
similarity index 88%
rename from src/FWOSDriver/FWOSDriver_Driver.cxx
rename to src/CDF/CDF_FWOSDriver.cxx
index e4e9150..434c6f7 100644 (file)
@@ -11,7 +11,7 @@
 // Alternatively, this file may be used under the terms of Open CASCADE
 // commercial license or contractual agreement.
 
-#include <FWOSDriver_Driver.ixx>
+#include <CDF_FWOSDriver.ixx>
 #include <TCollection_ExtendedString.hxx>
 #include <OSD_Path.hxx>
 #include <OSD_Directory.hxx>
@@ -39,16 +39,16 @@ static void PutSlash (TCollection_ExtendedString& anXSTRING) {
 }
 
 //==============================================================================
-//function : FWOSDriver_Driver
+//function : CDF_FWOSDriver
 //purpose  :
 //==============================================================================
-FWOSDriver_Driver::FWOSDriver_Driver() {}
+CDF_FWOSDriver::CDF_FWOSDriver() {}
 
 //==============================================================================
 //function : Find
 //purpose  :
 //==============================================================================
-Standard_Boolean FWOSDriver_Driver::Find(const TCollection_ExtendedString& aFolder,
+Standard_Boolean CDF_FWOSDriver::Find(const TCollection_ExtendedString& aFolder,
                                          const TCollection_ExtendedString& aName,
                                          const TCollection_ExtendedString& /*aVersion*/)
 {
@@ -70,7 +70,7 @@ Standard_Boolean FWOSDriver_Driver::Find(const TCollection_ExtendedString& aFold
 //function : HasReadPermission
 //purpose  :
 //==============================================================================
-Standard_Boolean FWOSDriver_Driver::HasReadPermission(const TCollection_ExtendedString& aFolder,
+Standard_Boolean CDF_FWOSDriver::HasReadPermission(const TCollection_ExtendedString& aFolder,
                                                       const TCollection_ExtendedString& aName,
                                                       const TCollection_ExtendedString& /*aVersion*/)
 {
@@ -96,7 +96,7 @@ Standard_Boolean FWOSDriver_Driver::HasReadPermission(const TCollection_Extended
 //function : MetaData
 //purpose  :
 //==============================================================================
-Handle(CDM_MetaData) FWOSDriver_Driver::MetaData(const TCollection_ExtendedString& aFolder,
+Handle(CDM_MetaData) CDF_FWOSDriver::MetaData(const TCollection_ExtendedString& aFolder,
                                                  const TCollection_ExtendedString& aName,
                                                  const TCollection_ExtendedString& /*aVersion*/)
 {
@@ -108,7 +108,7 @@ Handle(CDM_MetaData) FWOSDriver_Driver::MetaData(const TCollection_ExtendedStrin
 //function : CreateMetaData
 //purpose  :
 //==============================================================================
-Handle(CDM_MetaData) FWOSDriver_Driver::CreateMetaData(const Handle(CDM_Document)& aDocument,
+Handle(CDM_MetaData) CDF_FWOSDriver::CreateMetaData(const Handle(CDM_Document)& aDocument,
                                                        const TCollection_ExtendedString& aFileName)
 {
   return CDM_MetaData::LookUp(aDocument->RequestedFolder(),aDocument->RequestedName(),
@@ -120,7 +120,7 @@ Handle(CDM_MetaData) FWOSDriver_Driver::CreateMetaData(const Handle(CDM_Document
 //function : BuildFileName
 //purpose  :
 //==============================================================================
-TCollection_ExtendedString FWOSDriver_Driver::BuildFileName(const Handle(CDM_Document)& aDocument)
+TCollection_ExtendedString CDF_FWOSDriver::BuildFileName(const Handle(CDM_Document)& aDocument)
 {
 
   TCollection_ExtendedString retstr = TCollection_ExtendedString(aDocument->RequestedFolder());
@@ -133,7 +133,7 @@ TCollection_ExtendedString FWOSDriver_Driver::BuildFileName(const Handle(CDM_Doc
 //function : FindFolder
 //purpose  :
 //==============================================================================
-Standard_Boolean FWOSDriver_Driver::FindFolder(const TCollection_ExtendedString& aFolder)
+Standard_Boolean CDF_FWOSDriver::FindFolder(const TCollection_ExtendedString& aFolder)
 {
   
   OSD_Path thePath=UTL::Path(aFolder);
@@ -145,7 +145,7 @@ Standard_Boolean FWOSDriver_Driver::FindFolder(const TCollection_ExtendedString&
 //function : Concatenate
 //purpose  :
 //==============================================================================
-TCollection_ExtendedString FWOSDriver_Driver::Concatenate(const TCollection_ExtendedString& aFolder,
+TCollection_ExtendedString CDF_FWOSDriver::Concatenate(const TCollection_ExtendedString& aFolder,
                                                           const TCollection_ExtendedString& aName)
 {
   TCollection_ExtendedString ff(aFolder);
@@ -160,7 +160,7 @@ TCollection_ExtendedString FWOSDriver_Driver::Concatenate(const TCollection_Exte
 //function : DefaultFolder
 //purpose  :
 //==============================================================================
-TCollection_ExtendedString FWOSDriver_Driver::DefaultFolder()
+TCollection_ExtendedString CDF_FWOSDriver::DefaultFolder()
 {
   TCollection_ExtendedString theDefaultFolder;
   if (theDefaultFolder.Length() == 0) {
@@ -191,7 +191,7 @@ TCollection_ExtendedString FWOSDriver_Driver::DefaultFolder()
 //function : BuildMetaData
 //purpose  :
 //==============================================================================
-Handle(CDM_MetaData) FWOSDriver_Driver::BuildMetaData(const TCollection_ExtendedString& aFileName)
+Handle(CDM_MetaData) CDF_FWOSDriver::BuildMetaData(const TCollection_ExtendedString& aFileName)
 {
 
   OSD_Path p = UTL::Path(aFileName);
@@ -208,7 +208,7 @@ Handle(CDM_MetaData) FWOSDriver_Driver::BuildMetaData(const TCollection_Extended
 //function : SetName
 //purpose  :
 //==============================================================================
-TCollection_ExtendedString FWOSDriver_Driver::SetName(const Handle(CDM_Document)& aDocument,
+TCollection_ExtendedString CDF_FWOSDriver::SetName(const Handle(CDM_Document)& aDocument,
                                                       const TCollection_ExtendedString& aName)
 {
   
index a2eb117..3c00896 100644 (file)
@@ -17,6 +17,7 @@
 #include <CDF_Session.ixx>
 #include <TCollection_ExtendedString.hxx>
 #include <CDF_MetaDataDriverFactory.hxx>
+#include <CDF_FWOSDriver.hxx>
 #include <Plugin.hxx>
 #include <Standard_GUID.hxx>
 #include <PCDM.hxx>
@@ -112,5 +113,18 @@ Handle(CDF_MetaDataDriver) CDF_Session::MetaDataDriver() const {
 //purpose  : 
 //=======================================================================
 void CDF_Session::LoadDriver() {
-   myMetaDataDriver=Handle(CDF_MetaDataDriverFactory)::DownCast(Plugin::Load(Standard_GUID("a148e300-5740-11d1-a904-080036aaa103")))->Build();
+  if (myMetaDataDriver.IsNull()) {
+    Handle(CDF_MetaDataDriverFactory) aFactory;
+    try {
+      aFactory = Handle(CDF_MetaDataDriverFactory)::DownCast (
+        Plugin::Load (Standard_GUID ("a148e300-5740-11d1-a904-080036aaa103"),
+                      Standard_False /*theVerbose*/));
+    } catch (const Standard_Failure&) {
+    }
+    if (!aFactory.IsNull()) {
+      myMetaDataDriver = aFactory->Build();
+    } else {
+      myMetaDataDriver = new CDF_FWOSDriver;
+    }
+  }
 }
index 4b1d067..5e863ce 100644 (file)
@@ -20,7 +20,6 @@ uses
     CDM,CDF,TCollection
 
 is
-    class Driver;
     class DriverFactory;
 
     
index 6159c25..e625489 100644 (file)
 
 #include <FWOSDriver_DriverFactory.ixx>
 
-#include <FWOSDriver_Driver.hxx>
+#include <CDF_FWOSDriver.hxx>
 FWOSDriver_DriverFactory::FWOSDriver_DriverFactory(){}
 
 
 Handle(CDF_MetaDataDriver) FWOSDriver_DriverFactory::Build() const {
-  static Handle(FWOSDriver_Driver) d =  new FWOSDriver_Driver();
+  static Handle(CDF_FWOSDriver) d =  new CDF_FWOSDriver();
   return d;
 }
index 7ab5e4b..6f1dc9b 100644 (file)
@@ -16,7 +16,9 @@
 
 package Plugin
 
-    uses TCollection,OSD
+    uses TCollection,
+         OSD,
+         Resource
 
 is
 
@@ -25,7 +27,23 @@ is
     class MapOfFunctions instantiates DataMap from TCollection(AsciiString from TCollection ,Function from OSD, AsciiString from TCollection);
 
 
-    Load(aGUID: GUID from Standard) returns Transient from Standard
+    Load(aGUID: GUID from Standard; theVerbose: Boolean from Standard = Standard_True)
+    returns Transient from Standard
     raises Failure  from Plugin;
 
+    AdditionalPluginMap
+    returns Manager from Resource;
+    ---C++    : return const &
+    ---Purpose: Returns a global map of {guid, plugin_library} pairs.
+    --          The Load() method will use this map to search for plugins if and only if
+    --          the GUID is not found in the Plugin file specified by the CSF_PluginDefaults
+    --          (or CSF_PluginUserDefaults) environment variable, or if they are not defined.
+    --
+    --          This allows to populate this additional resource manager
+    --          in run-time and to avoid using the above environment variables.
+    --          This map must be populated (using Resource_Manager::SetResource() method)
+    --          following syntax conventions of the Plugin file, for instance:
+    --          const Handle(Resource_Manager)& aPluginMap = Plugin::AdditionalPluginMap();
+    --          aPluginMap->SetResource ("ad696000-5b34-11d1-b5ba-00a0c9064368.Location", "TKStdSchema");
+
 end Plugin;
index 7093fb5..ab5ab0b 100644 (file)
@@ -30,7 +30,8 @@ static Standard_PCharacter thePluginId = tc;
 //function : Load
 //purpose  : 
 //=======================================================================
-Handle(Standard_Transient) Plugin::Load(const Standard_GUID& aGUID) 
+Handle(Standard_Transient) Plugin::Load (const Standard_GUID& aGUID,
+                                         const Standard_Boolean theVerbose)
 {
   
   aGUID.ToCString(thePluginId);
@@ -45,10 +46,14 @@ Handle(Standard_Transient) Plugin::Load(const Standard_GUID& aGUID)
     theResource += ".Location";
 
     if(!PluginResource->Find(theResource.ToCString())) {
-      Standard_SStream aMsg; aMsg << "could not find the resource:";
-      aMsg << theResource.ToCString()<< endl;
-      cout << "could not find the resource:"<<theResource.ToCString()<< endl;
-      Plugin_Failure::Raise(aMsg);
+      PluginResource = AdditionalPluginMap();
+      if (!PluginResource->Find(theResource.ToCString())) {
+        Standard_SStream aMsg; aMsg << "could not find the resource:";
+        aMsg << theResource.ToCString()<< endl;
+        if (theVerbose)
+            cout << "could not find the resource:"<<theResource.ToCString()<< endl;
+        Plugin_Failure::Raise(aMsg);
+      }
     }
     
     TCollection_AsciiString thePluginLibrary("");
@@ -72,7 +77,8 @@ Handle(Standard_Transient) Plugin::Load(const Standard_GUID& aGUID)
       aMsg << PluginResource->Value(theResource.ToCString());
       aMsg << "; reason:";
       aMsg << error.ToCString();
-      cout << "could not open: "  << PluginResource->Value(theResource.ToCString())<< " ; reason: "<< error.ToCString() << endl;
+      if (theVerbose)
+        cout << "could not open: "  << PluginResource->Value(theResource.ToCString())<< " ; reason: "<< error.ToCString() << endl;
       Plugin_Failure::Raise(aMsg);
     }
     f = theSharedLibrary.DlSymb("PLUGINFACTORY");
@@ -95,3 +101,10 @@ Handle(Standard_Transient) Plugin::Load(const Standard_GUID& aGUID)
   
 }
 
+const Handle(Resource_Manager)& Plugin::AdditionalPluginMap()
+{
+  static Handle(Resource_Manager) aMap;
+  if (aMap.IsNull())
+    aMap = new Resource_Manager ("" /*theName*/, Standard_False /*theVerbose*/);
+  return aMap;
+}
index ba819ad..aa5c34d 100755 (executable)
@@ -2542,6 +2542,105 @@ static Standard_Integer OCC25004 (Draw_Interpretor& theDI,
   return 0;
 }
 
+#include <OSD_Environment.hxx>
+#include <Plugin.hxx>
+#include <Plugin_Macro.hxx>
+#include <Resource_Manager.hxx>
+
+#define THE_QATEST_DOC_FORMAT       "My Proprietary Format"
+
+#define QA_CHECK(theDesc, theExpr, theValue) \
+{\
+  const bool isTrue = !!(theExpr); \
+  std::cout << theDesc << (isTrue ? " TRUE  " : " FALSE ") << (isTrue == theValue ? " is OK\n" : " is FAIL\n"); \
+}
+
+class Test_TDocStd_Application : public TDocStd_Application
+{
+public:
+
+  static void initGlobalPluginMap (const TCollection_AsciiString& thePlugin,
+                                   const TCollection_AsciiString& theSaver,
+                                   const TCollection_AsciiString& theLoader)
+  {
+    const Handle(Resource_Manager)& aManager = Plugin::AdditionalPluginMap();
+    aManager->SetResource ((theSaver  + ".Location").ToCString(), thePlugin.ToCString());
+    aManager->SetResource ((theLoader + ".Location").ToCString(), thePlugin.ToCString());
+  }
+
+  Test_TDocStd_Application (const TCollection_AsciiString& thePlugin,
+                            const TCollection_AsciiString& theSaver,
+                            const TCollection_AsciiString& theLoader)
+  {
+    initGlobalPluginMap (thePlugin, theSaver, theLoader);
+
+    // explicitly initialize resource manager
+    myResources = new Resource_Manager ("");
+    myResources->SetResource ("xml.FileFormat", THE_QATEST_DOC_FORMAT);
+    myResources->SetResource (THE_QATEST_DOC_FORMAT ".Description",     "Test XML Document");
+    myResources->SetResource (THE_QATEST_DOC_FORMAT ".FileExtension",   "xml");
+    myResources->SetResource (THE_QATEST_DOC_FORMAT ".StoragePlugin",   theSaver.ToCString());
+    myResources->SetResource (THE_QATEST_DOC_FORMAT ".RetrievalPlugin", theLoader.ToCString());
+  }
+
+  virtual Standard_CString ResourcesName() { return ""; }
+  virtual void Formats (TColStd_SequenceOfExtendedString& theFormats) { theFormats.Clear(); }
+};
+
+//=======================================================================
+//function : OCC24925
+//purpose  :
+//=======================================================================
+static Standard_Integer OCC24925 (Draw_Interpretor& theDI,
+                                  Standard_Integer  theArgNb,
+                                  const char**      theArgVec)
+{
+  if (theArgNb != 2
+   && theArgNb != 5)
+  {
+    std::cout << "Error: wrong syntax! See usage:\n";
+    theDI.PrintHelp (theArgVec[0]);
+    return 1;
+  }
+
+  Standard_Integer anArgIter = 1;
+  TCollection_ExtendedString aFileName = theArgVec[anArgIter++];
+  TCollection_AsciiString    aPlugin   = "TKXml";
+  TCollection_AsciiString    aSaver    = "03a56820-8269-11d5-aab2-0050044b1af1"; // XmlStorageDriver   in XmlDrivers.cxx
+  TCollection_AsciiString    aLoader   = "03a56822-8269-11d5-aab2-0050044b1af1"; // XmlRetrievalDriver in XmlDrivers.cxx
+  if (anArgIter < theArgNb)
+  {
+    aPlugin = theArgVec[anArgIter++];
+    aSaver  = theArgVec[anArgIter++];
+    aLoader = theArgVec[anArgIter++];
+  }
+
+  PCDM_StoreStatus  aSStatus = PCDM_SS_Failure;
+  PCDM_ReaderStatus aRStatus = PCDM_RS_OpenError;
+
+  Handle(TDocStd_Application) anApp = new Test_TDocStd_Application (aPlugin, aSaver, aLoader);
+  {
+    Handle(TDocStd_Document) aDoc;
+    anApp->NewDocument (THE_QATEST_DOC_FORMAT, aDoc);
+    TDF_Label aLab = aDoc->Main();
+    TDataStd_Integer::Set (aLab, 0);
+    TDataStd_Name::Set (aLab, "QABugs_19.cxx");
+
+    aSStatus = anApp->SaveAs (aDoc, aFileName);
+    anApp->Close (aDoc);
+  }
+  QA_CHECK ("SaveAs()", aSStatus == PCDM_SS_OK, true);
+
+  {
+    Handle(TDocStd_Document) aDoc;
+    aRStatus = anApp->Open (aFileName, aDoc);
+    anApp->Close (aDoc);
+  }
+  QA_CHECK ("Open()  ", aRStatus == PCDM_RS_OK, true);
+  return 0;
+}
+
+/*****************************************************************************/
 
 void QABugs::Commands_19(Draw_Interpretor& theCommands) {
   const char *group = "QABugs";
@@ -2590,5 +2689,9 @@ void QABugs::Commands_19(Draw_Interpretor& theCommands) {
   theCommands.Add ("OCC24945", "OCC24945", __FILE__, OCC24945, group);
   theCommands.Add ("OCC23950", "OCC23950", __FILE__, OCC23950, group);
   theCommands.Add ("OCC25004", "OCC25004", __FILE__, OCC25004, group);
+  theCommands.Add ("OCC24925",
+                   "OCC24925 filename [pluginLib=TKXml storageGuid retrievalGuid]"
+                   "\nOCAF persistence without setting environment variables",
+                   __FILE__, OCC24925, group);
   return;
 }
index 8d6add7..700360d 100644 (file)
@@ -236,8 +236,8 @@ is
 
 fields
 
-    myResources      : Manager from Resource;
-    myIsDriverLoaded : Boolean from Standard;
+    myResources      : Manager from Resource is protected;
+    myIsDriverLoaded : Boolean from Standard is protected;
 
 friends
     class Document from TDocStd
index 789db74..349c3d7 100644 (file)
@@ -152,6 +152,11 @@ void TDocStd_Application::InitDocument(const Handle(TDocStd_Document)& /*aDoc*/)
 
 void TDocStd_Application::Close(const Handle(TDocStd_Document)& aDoc)
 {
+  if (aDoc.IsNull())
+  {
+    return;
+  }
+
   Handle(TDocStd_Owner) Owner;
   if (aDoc->Main().Root().FindAttribute(TDocStd_Owner::GetID(),Owner)) {
     Handle(TDocStd_Document) emptyDoc;
diff --git a/tests/bugs/caf/bug24925 b/tests/bugs/caf/bug24925
new file mode 100644 (file)
index 0000000..fe7f7d1
--- /dev/null
@@ -0,0 +1,38 @@
+puts "==========="
+puts "OCC24925 Enabling OCAF persistence without setting environment variables"
+puts "==========="
+
+pload QAcommands
+
+set THE_PLUGIN      "TKXml"
+set THE_SAVE_DRIVER "03a56820-8269-11d5-aab2-0050044b1af1"
+set THE_LOAD_DRIVER "03a56822-8269-11d5-aab2-0050044b1af1"
+
+set aFileName "$imagedir/${casename}_doc.xml"
+if { [file exists "$aFileName"] == 1} {
+  file delete $aFileName
+}
+
+# corrupt environment variable to Plugin file
+set anEnvOld [dgetenv CSF_PluginDefaults]
+dsetenv "CSF_PluginDefaults"
+set anEnvNow [dgetenv CSF_PluginDefaults]
+puts "Unset environment variable CSF_PluginDefaults (old='${anEnvOld}', new='${anEnvNow}')"
+
+OCC24925 "$aFileName" $THE_PLUGIN $THE_SAVE_DRIVER $THE_LOAD_DRIVER
+
+if { [file isfile "$aFileName"] == 1} {
+  set aFile     [open "$aFileName" r]
+  set aFileData [read $aFile]
+  close $aFile
+  if { [string first "My Proprietary Format" "$aFileData"] == -1} {
+    puts "Error: XML file does not contain 'My Proprietary Format'!"
+  }
+  if { [string first "QABugs_19.cxx" "$aFileData"] == -1} {
+    puts "Error: XML file does not contain 'QABugs_19.cxx'!"
+  }
+} else {
+  puts "Error: file is not created!"
+}
+
+#dsetenv "CSF_PluginDefaults" "anEnvOld"