1 // File : SALOMEDS_Study.cxx
2 // Author : Sergey RUIN
9 #include "SALOMEDS_Study.hxx"
10 #include "SALOMEDS_SComponent.hxx"
11 #include "SALOMEDSImpl_SComponent.hxx"
12 #include "SALOMEDS_SObject.hxx"
13 #include "SALOMEDSImpl_SObject.hxx"
14 #include "SALOMEDS_StudyBuilder.hxx"
15 #include "SALOMEDSImpl_StudyBuilder.hxx"
16 #include "SALOMEDS_ChildIterator.hxx"
17 #include "SALOMEDSImpl_ChildIterator.hxx"
18 #include "SALOMEDS_SComponentIterator.hxx"
19 #include "SALOMEDSImpl_SComponentIterator.hxx"
20 #include "SALOMEDS_AttributeStudyProperties.hxx"
21 #include "SALOMEDSImpl_AttributeStudyProperties.hxx"
22 #include "SALOMEDS_UseCaseBuilder.hxx"
23 #include "SALOMEDSImpl_UseCaseBuilder.hxx"
25 #include "SALOMEDS_Driver_i.hxx"
26 #include "SALOMEDS_Study_i.hxx"
28 #include <TCollection_AsciiString.hxx>
29 #include <TColStd_HSequenceOfAsciiString.hxx>
30 #include <TColStd_HSequenceOfTransient.hxx>
32 #include "Utils_ORB_INIT.hxx"
33 #include "Utils_SINGLETON.hxx"
38 #include <sys/types.h>
46 SALOMEDS_Study::SALOMEDS_Study(const Handle(SALOMEDSImpl_Study)& theStudy)
49 _local_impl = theStudy;
50 _corba_impl = SALOMEDS::Study::_nil();
54 SALOMEDS_Study::SALOMEDS_Study(SALOMEDS::Study_ptr theStudy)
57 long pid = (long)_getpid();
59 long pid = (long)getpid();
62 long addr = theStudy->GetLocalImpl(GetHostname().c_str(), pid, _isLocal);
64 _local_impl = ((SALOMEDSImpl_Study*)(addr));
65 _corba_impl = SALOMEDS::Study::_duplicate(theStudy);
69 _corba_impl = SALOMEDS::Study::_duplicate(theStudy);
75 SALOMEDS_Study::~SALOMEDS_Study()
79 std::string SALOMEDS_Study::GetPersistentReference()
82 if(_isLocal) aRef = _local_impl->GetPersistentReference().ToCString();
83 else aRef = _corba_impl->GetPersistentReference();
87 std::string SALOMEDS_Study::GetTransientReference()
90 if(_isLocal) aRef = _local_impl->GetTransientReference().ToCString();
91 else aRef = _corba_impl->GetTransientReference();
95 bool SALOMEDS_Study::IsEmpty()
98 if(_isLocal) ret = _local_impl->IsEmpty();
99 else ret = _corba_impl->IsEmpty();
103 _PTR(SComponent) SALOMEDS_Study::FindComponent (const std::string& aComponentName)
105 SALOMEDSClient_SComponent* aSCO = NULL;
107 Handle(SALOMEDSImpl_SComponent) aSCO_impl =_local_impl->FindComponent((char*)aComponentName.c_str());
108 if(aSCO_impl.IsNull()) return _PTR(SComponent)(aSCO);
109 aSCO = new SALOMEDS_SComponent(aSCO_impl);
112 SALOMEDS::SComponent_var aSCO_impl = _corba_impl->FindComponent((char*)aComponentName.c_str());
113 if(CORBA::is_nil(aSCO_impl)) return _PTR(SComponent)(aSCO);
114 aSCO = new SALOMEDS_SComponent(aSCO_impl);
116 return _PTR(SComponent)(aSCO);
119 _PTR(SComponent) SALOMEDS_Study::FindComponentID(const std::string& aComponentID)
121 SALOMEDSClient_SComponent* aSCO = NULL;
123 Handle(SALOMEDSImpl_SComponent) aSCO_impl =_local_impl->FindComponentID((char*)aComponentID.c_str());
124 if(aSCO_impl.IsNull()) return _PTR(SComponent)(aSCO);
125 aSCO = new SALOMEDS_SComponent(aSCO_impl);
128 SALOMEDS::SComponent_var aSCO_impl = _corba_impl->FindComponentID((char*)aComponentID.c_str());
129 if(CORBA::is_nil(aSCO_impl)) return _PTR(SComponent)(aSCO);
130 aSCO = new SALOMEDS_SComponent(aSCO_impl);
132 return _PTR(SComponent)(aSCO);
136 _PTR(SObject) SALOMEDS_Study::FindObject(const std::string& anObjectName)
138 SALOMEDSClient_SObject* aSO = NULL;
141 Handle(SALOMEDSImpl_SObject) aSO_impl = _local_impl->FindObject((char*)anObjectName.c_str());
142 if(aSO_impl.IsNull()) return _PTR(SObject)(aSO);
143 Handle(SALOMEDSImpl_SComponent) aSCO_impl = Handle(SALOMEDSImpl_SComponent)::DownCast(aSO_impl);
144 if(!aSCO_impl.IsNull()) return _PTR(SObject)(new SALOMEDS_SComponent(aSCO_impl));
145 aSO = new SALOMEDS_SObject(aSO_impl);
148 SALOMEDS::SObject_var aSO_impl = _corba_impl->FindObject((char*)anObjectName.c_str());
149 if(CORBA::is_nil(aSO_impl)) return _PTR(SObject)(aSO);
150 SALOMEDS::SComponent_var aSCO_impl = SALOMEDS::SComponent::_narrow(aSO_impl);
151 if(!CORBA::is_nil(aSCO_impl)) return _PTR(SObject)(new SALOMEDS_SComponent(aSCO_impl));
152 aSO = new SALOMEDS_SObject(aSO_impl);
155 return _PTR(SObject)(aSO);
158 std::vector<_PTR(SObject)> SALOMEDS_Study::FindObjectByName(const std::string& anObjectName,
159 const std::string& aComponentName)
161 std::vector<_PTR(SObject)> aVector;
165 Handle(TColStd_HSequenceOfTransient) aSeq = _local_impl->FindObjectByName((char*)anObjectName.c_str(), (char*)aComponentName.c_str());
166 aLength = aSeq->Length();
167 for(i = 1; i<= aLength; i++)
168 aVector.push_back(_PTR(SObject)(new SALOMEDS_SObject(Handle(SALOMEDSImpl_SObject)::DownCast(aSeq->Value(i)))));
171 SALOMEDS::Study::ListOfSObject_var aSeq = _corba_impl->FindObjectByName((char*)anObjectName.c_str(),
172 (char*)aComponentName.c_str());
173 aLength = aSeq->length();
174 for(i = 0; i< aLength; i++) aVector.push_back(_PTR(SObject)(new SALOMEDS_SObject(aSeq[i])));
180 _PTR(SObject) SALOMEDS_Study::FindObjectID(const std::string& anObjectID)
182 SALOMEDSClient_SObject* aSO = NULL;
184 Handle(SALOMEDSImpl_SObject) aSO_impl = _local_impl->FindObjectID((char*)anObjectID.c_str());
185 if(aSO_impl.IsNull()) return _PTR(SObject)(aSO);
186 return _PTR(SObject)(new SALOMEDS_SObject(aSO_impl));
189 SALOMEDS::SObject_var aSO_impl = _corba_impl->FindObjectID((char*)anObjectID.c_str());
190 if(CORBA::is_nil(aSO_impl)) return _PTR(SObject)(aSO);
191 return _PTR(SObject)(new SALOMEDS_SObject(aSO_impl));
193 return _PTR(SObject)(aSO);
196 _PTR(SObject) SALOMEDS_Study::CreateObjectID(const std::string& anObjectID)
198 SALOMEDSClient_SObject* aSO = NULL;
199 if(_isLocal) aSO = new SALOMEDS_SObject(_local_impl->CreateObjectID((char*)anObjectID.c_str()));
200 else aSO = new SALOMEDS_SObject(_corba_impl->CreateObjectID((char*)anObjectID.c_str()));
201 return _PTR(SObject)(aSO);
204 _PTR(SObject) SALOMEDS_Study::FindObjectIOR(const std::string& anObjectIOR)
206 SALOMEDSClient_SObject* aSO = NULL;
208 Handle(SALOMEDSImpl_SObject) aSO_impl = _local_impl->FindObjectIOR((char*)anObjectIOR.c_str());
209 if(aSO_impl.IsNull()) return _PTR(SObject)(aSO);
210 aSO = new SALOMEDS_SObject(aSO_impl);
213 SALOMEDS::SObject_var aSO_impl = _corba_impl->FindObjectIOR((char*)anObjectIOR.c_str());
214 if(CORBA::is_nil(aSO_impl)) return _PTR(SObject)(aSO);
215 aSO = new SALOMEDS_SObject(aSO_impl);
217 return _PTR(SObject)(aSO);
220 _PTR(SObject) SALOMEDS_Study::FindObjectByPath(const std::string& thePath)
222 SALOMEDSClient_SObject* aSO = NULL;
224 Handle(SALOMEDSImpl_SObject) aSO_impl = _local_impl->FindObjectByPath((char*)thePath.c_str());
225 if(aSO_impl.IsNull()) return _PTR(SObject)(aSO);
226 aSO = new SALOMEDS_SObject(aSO_impl);
229 SALOMEDS::SObject_var aSO_impl = _corba_impl->FindObjectByPath((char*)thePath.c_str());
230 if(CORBA::is_nil(aSO_impl)) return _PTR(SObject)(aSO);
231 aSO = new SALOMEDS_SObject(aSO_impl);
233 return _PTR(SObject)(aSO);
236 std::string SALOMEDS_Study::GetObjectPath(const _PTR(SObject)& theSO)
238 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
240 if(_isLocal) aPath = _local_impl->GetObjectPath(aSO->GetLocalImpl()).ToCString();
241 else aPath = _corba_impl->GetObjectPath(aSO->GetCORBAImpl());
245 void SALOMEDS_Study::SetContext(const std::string& thePath)
247 if(_isLocal) _local_impl->SetContext((char*)thePath.c_str());
248 else _corba_impl->SetContext((char*)thePath.c_str());
251 std::string SALOMEDS_Study::GetContext()
254 if(_isLocal) aPath = _local_impl->GetContext().ToCString();
255 else aPath = _corba_impl->GetContext();
259 std::vector<std::string> SALOMEDS_Study::GetObjectNames(const std::string& theContext)
261 std::vector<std::string> aVector;
264 Handle(TColStd_HSequenceOfAsciiString) aSeq = _local_impl->GetObjectNames((char*)theContext.c_str());
265 aLength = aSeq->Length();
266 for(i = 1; i<=aLength; i++) aVector.push_back(aSeq->Value(i).ToCString());
269 SALOMEDS::ListOfStrings_var aSeq = _corba_impl->GetObjectNames((char*)theContext.c_str());
270 aLength = aSeq->length();
271 for(i = 0; i<aLength; i++) aVector.push_back(std::string((std::string)aSeq[i].in()));
276 std::vector<std::string> SALOMEDS_Study::GetDirectoryNames(const std::string& theContext)
278 std::vector<std::string> aVector;
281 Handle(TColStd_HSequenceOfAsciiString) aSeq = _local_impl->GetDirectoryNames((char*)theContext.c_str());
282 aLength = aSeq->Length();
283 for(i = 1; i<=aLength; i++) aVector.push_back(aSeq->Value(i).ToCString());
286 SALOMEDS::ListOfStrings_var aSeq = _corba_impl->GetDirectoryNames((char*)theContext.c_str());
287 aLength = aSeq->length();
288 for(i = 0; i<aLength; i++) aVector.push_back((char*)aSeq[i].in());
293 std::vector<std::string> SALOMEDS_Study::GetFileNames(const std::string& theContext)
295 std::vector<std::string> aVector;
298 Handle(TColStd_HSequenceOfAsciiString) aSeq = _local_impl->GetFileNames((char*)theContext.c_str());
299 aLength = aSeq->Length();
300 for(i = 1; i<=aLength; i++) aVector.push_back(aSeq->Value(i).ToCString());
303 SALOMEDS::ListOfStrings_var aSeq = _corba_impl->GetFileNames((char*)theContext.c_str());
304 aLength = aSeq->length();
306 for(i = 0; i<aLength; i++) aVector.push_back((char*)aSeq[i].in());
311 std::vector<std::string> SALOMEDS_Study::GetComponentNames(const std::string& theContext)
313 std::vector<std::string> aVector;
316 Handle(TColStd_HSequenceOfAsciiString) aSeq = _local_impl->GetComponentNames((char*)theContext.c_str());
317 aLength = aSeq->Length();
318 for(i = 1; i<=aLength; i++) aVector.push_back(aSeq->Value(i).ToCString());
321 SALOMEDS::ListOfStrings_var aSeq = _corba_impl->GetComponentNames((char*)theContext.c_str());
322 aLength = aSeq->length();
323 for(i = 0; i<aLength; i++) aVector.push_back((char*)aSeq[i].in());
328 _PTR(ChildIterator) SALOMEDS_Study::NewChildIterator(const _PTR(SObject)& theSO)
330 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
331 SALOMEDSClient_ChildIterator* aCI = NULL;
333 Handle(SALOMEDSImpl_ChildIterator) aCIimpl = _local_impl->NewChildIterator(aSO->GetLocalImpl());
334 aCI = new SALOMEDS_ChildIterator(aCIimpl);
337 SALOMEDS::ChildIterator_var aCIimpl = _corba_impl->NewChildIterator(aSO->GetCORBAImpl());
338 aCI = new SALOMEDS_ChildIterator(aCIimpl);
341 return _PTR(ChildIterator)(aCI);
344 _PTR(SComponentIterator) SALOMEDS_Study::NewComponentIterator()
346 SALOMEDSClient_SComponentIterator* aCI = NULL;
348 SALOMEDSImpl_SComponentIterator aCIimpl = _local_impl->NewComponentIterator();
349 aCI = new SALOMEDS_SComponentIterator(aCIimpl);
352 SALOMEDS::SComponentIterator_var aCIimpl = _corba_impl->NewComponentIterator();
353 aCI = new SALOMEDS_SComponentIterator(aCIimpl);
356 return _PTR(SComponentIterator)(aCI);
359 _PTR(StudyBuilder) SALOMEDS_Study::NewBuilder()
361 SALOMEDSClient_StudyBuilder* aSB = NULL;
363 Handle(SALOMEDSImpl_StudyBuilder) aSBimpl = _local_impl->NewBuilder();
364 aSB = new SALOMEDS_StudyBuilder(aSBimpl);
367 SALOMEDS::StudyBuilder_var aSBimpl = _corba_impl->NewBuilder();
368 aSB = new SALOMEDS_StudyBuilder(aSBimpl);
371 return _PTR(StudyBuilder)(aSB);
374 std::string SALOMEDS_Study::Name()
377 if(_isLocal) aName = _local_impl->Name().ToCString();
378 else aName = _corba_impl->Name();
382 void SALOMEDS_Study::Name(const std::string& theName)
384 if(_isLocal) _local_impl->Name((char*)theName.c_str());
385 else _corba_impl->Name((char*)theName.c_str());
388 bool SALOMEDS_Study::IsSaved()
391 if(_isLocal) isSaved = _local_impl->IsSaved();
392 else isSaved = _corba_impl->IsSaved();
396 void SALOMEDS_Study::IsSaved(bool save)
398 if(_isLocal) _local_impl->IsSaved(save);
399 else _corba_impl->IsSaved(save);
402 bool SALOMEDS_Study::IsModified()
405 if(_isLocal) isModified = _local_impl->IsModified();
406 else isModified = _corba_impl->IsModified();
410 std::string SALOMEDS_Study::URL()
413 if(_isLocal) aURL = _local_impl->URL().ToCString();
414 else aURL = _corba_impl->URL();
418 void SALOMEDS_Study::URL(const std::string& url)
420 if(_isLocal) _local_impl->URL((char*)url.c_str());
421 else _corba_impl->URL((char*)url.c_str());
424 int SALOMEDS_Study::StudyId()
427 if(_isLocal) anID = _local_impl->StudyId();
428 else anID = _corba_impl->StudyId();
432 void SALOMEDS_Study::StudyId(int id)
434 if(_isLocal) _local_impl->StudyId(id);
435 else _corba_impl->StudyId(id);
438 std::vector<_PTR(SObject)> SALOMEDS_Study::FindDependances(const _PTR(SObject)& theSO)
440 std::vector<_PTR(SObject)> aVector;
441 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
444 Handle(TColStd_HSequenceOfTransient) aSeq = _local_impl->FindDependances(aSO->GetLocalImpl());
445 if ( !aSeq.IsNull() )
447 aLength = aSeq->Length();
448 for(i=1; i<=aLength; i++)
449 aVector.push_back(_PTR(SObject)(
450 new SALOMEDS_SObject(Handle(SALOMEDSImpl_SObject)::DownCast(aSeq->Value(i)))));
454 SALOMEDS::Study::ListOfSObject_var aSeq = _corba_impl->FindDependances(aSO->GetCORBAImpl());
455 aLength = aSeq->length();
456 for(i=0; i<aLength; i++) aVector.push_back(_PTR(SObject)(new SALOMEDS_SObject(aSeq[i])));
461 _PTR(AttributeStudyProperties) SALOMEDS_Study::GetProperties()
463 SALOMEDSClient_AttributeStudyProperties* aProp;
464 if(_isLocal) aProp = new SALOMEDS_AttributeStudyProperties(_local_impl->GetProperties());
465 else aProp = new SALOMEDS_AttributeStudyProperties(_corba_impl->GetProperties());
466 return _PTR(AttributeStudyProperties)(aProp);
469 std::string SALOMEDS_Study::GetLastModificationDate()
472 if(_isLocal) aDate = _local_impl->GetLastModificationDate().ToCString();
473 else aDate = _corba_impl->GetLastModificationDate();
477 std::vector<std::string> SALOMEDS_Study::GetModificationsDate()
479 std::vector<std::string> aVector;
482 Handle(TColStd_HSequenceOfAsciiString) aSeq = _local_impl->GetModificationsDate();
483 aLength = aSeq->Length();
484 for(i=1; i<=aLength; i++) aVector.push_back(aSeq->Value(i).ToCString());
487 SALOMEDS::ListOfDates_var aSeq = _corba_impl->GetModificationsDate();
488 aLength = aSeq->length();
489 for(i=0; i<aLength; i++) aVector.push_back((char*)aSeq[i].in());
494 _PTR(UseCaseBuilder) SALOMEDS_Study::GetUseCaseBuilder()
496 SALOMEDSClient_UseCaseBuilder* aUB = NULL;
498 Handle(SALOMEDSImpl_UseCaseBuilder) aUBimpl = _local_impl->GetUseCaseBuilder();
499 aUB = new SALOMEDS_UseCaseBuilder(aUBimpl);
502 SALOMEDS::UseCaseBuilder_var aUBimpl = _corba_impl->GetUseCaseBuilder();
503 aUB = new SALOMEDS_UseCaseBuilder(aUBimpl);
506 return _PTR(UseCaseBuilder)(aUB);
509 void SALOMEDS_Study::Close()
511 if(_isLocal) _local_impl->Close();
512 else _corba_impl->Close();
515 void SALOMEDS_Study::EnableUseCaseAutoFilling(bool isEnabled)
517 if(_isLocal) _local_impl->EnableUseCaseAutoFilling(isEnabled);
518 else _corba_impl->EnableUseCaseAutoFilling(isEnabled);
521 bool SALOMEDS_Study::DumpStudy(const std::string& thePath, const std::string& theBaseName, bool isPublished)
525 SALOMEDS_DriverFactory_i* aFactory = new SALOMEDS_DriverFactory_i(_orb);
526 ret = _local_impl->DumpStudy((char*)thePath.c_str(), (char*)theBaseName.c_str(), isPublished, aFactory);
529 else ret = _corba_impl->DumpStudy((char*)thePath.c_str(), (char*)theBaseName.c_str(), isPublished);
533 std::string SALOMEDS_Study::ConvertObjectToIOR(CORBA::Object_ptr theObject)
535 return _orb->object_to_string(theObject);
538 CORBA::Object_ptr SALOMEDS_Study::ConvertIORToObject(const std::string& theIOR)
540 return _orb->string_to_object(theIOR.c_str());
543 void SALOMEDS_Study::init_orb()
545 ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance() ;
546 ASSERT(SINGLETON_<ORB_INIT>::IsAlreadyExisting());
547 _orb = init(0 , 0 ) ;
550 SALOMEDS::Study_ptr SALOMEDS_Study::GetStudy()
553 if(!CORBA::is_nil(_corba_impl)) return _corba_impl;
554 std::string anIOR = _local_impl->GetTransientReference().ToCString();
555 SALOMEDS::Study_var aStudy;
556 if(!_local_impl->IsError() && anIOR != "") {
557 aStudy = SALOMEDS::Study::_narrow(_orb->string_to_object(anIOR.c_str()));
560 SALOMEDS_Study_i *aStudy_servant = new SALOMEDS_Study_i(_local_impl, _orb);
561 aStudy = aStudy_servant->_this();
562 _local_impl->SetTransientReference(_orb->object_to_string(aStudy));
564 return aStudy._retn();
570 return SALOMEDS::Study::_nil();