1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-05 18:16:23 +03:00

0024925: Enabling OCAF persistence without setting environment variables

Add test case bugs/caf/bug24925
Merging with current master IR-2014-07-03
This commit is contained in:
Roman Lygin 2014-07-10 14:47:20 +04:00 committed by apn
parent a9568545f1
commit b6c0b841ec
12 changed files with 225 additions and 32 deletions

View 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

View File

@ -14,14 +14,14 @@
-- 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;

View 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)
{

View 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;
}
}
}

View File

@ -20,7 +20,6 @@ uses
CDM,CDF,TCollection
is
class Driver;
class DriverFactory;

View File

@ -16,11 +16,11 @@
#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;
}

View 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;

View 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);
@ -44,12 +45,16 @@ Handle(Standard_Transient) Plugin::Load(const Standard_GUID& aGUID)
TCollection_AsciiString theResource(thePluginId);
theResource += ".Location";
if(!PluginResource->Find(theResource.ToCString())) {
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("");
#ifndef WNT
@ -72,6 +77,7 @@ Handle(Standard_Transient) Plugin::Load(const Standard_GUID& aGUID)
aMsg << PluginResource->Value(theResource.ToCString());
aMsg << "; reason:";
aMsg << error.ToCString();
if (theVerbose)
cout << "could not open: " << PluginResource->Value(theResource.ToCString())<< " ; reason: "<< error.ToCString() << endl;
Plugin_Failure::Raise(aMsg);
}
@ -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;
}

View File

@ -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;
}

View 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

View 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;

38
tests/bugs/caf/bug24925 Normal file
View File

@ -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"