0024157: Parallelization of assembly part of BO
[occt.git] / src / CDM / CDM_Document.cxx
1 // Created on: 1997-07-30
2 // Created by: Jean-Louis Frenkel
3 // Copyright (c) 1997-1999 Matra Datavision
4 // Copyright (c) 1999-2012 OPEN CASCADE SAS
5 //
6 // The content of this file is subject to the Open CASCADE Technology Public
7 // License Version 6.5 (the "License"). You may not use the content of this file
8 // except in compliance with the License. Please obtain a copy of the License
9 // at http://www.opencascade.org and read it completely before using this file.
10 //
11 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
12 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
13 //
14 // The Original Code and all software distributed under the License is
15 // distributed on an "AS IS" basis, without warranty of any kind, and the
16 // Initial Developer hereby disclaims all such warranties, including without
17 // limitation, any warranties of merchantability, fitness for a particular
18 // purpose or non-infringement. Please see the License for the specific terms
19 // and conditions governing the rights and limitations under the License.
20
21 // Modified by rmi, Tue Nov 18 08:17:41 1997
22
23
24 #include <CDM_Document.ixx>
25
26 #include <Standard_NullObject.hxx>
27
28 #include <TCollection_ExtendedString.hxx>
29 #include <Standard_ProgramError.hxx>
30
31 #include <CDM_PresentationDirectory.hxx>
32 #include <CDM_NamesDirectory.hxx>
33
34 #include <CDM_ListOfDocument.hxx>
35 #include <CDM_ListIteratorOfListOfDocument.hxx>
36
37 #include <UTL.hxx>
38 #include <CDM_DataMapIteratorOfMetaDataLookUpTable.hxx>
39
40 static CDM_PresentationDirectory& getPresentations() {
41   static CDM_PresentationDirectory thePresentations;
42   return thePresentations;
43 }
44
45 //=======================================================================
46 //function : CDM_Document
47 //purpose  : 
48 //=======================================================================
49
50 CDM_Document::CDM_Document():
51   myResourcesAreLoaded          (Standard_False),
52   myValidPresentation           (Standard_False),
53   myVersion                     (1),
54   myActualReferenceIdentifier   (0),
55   myStorageVersion              (0),
56   myRequestedComment            (""),
57   myRequestedFolderIsDefined    (Standard_False),
58   myRequestedNameIsDefined      (Standard_False),
59   myRequestedPreviousVersionIsDefined(Standard_False),
60   myFileExtensionWasFound       (Standard_False),
61   myDataTypeWasFound            (Standard_False),
62   myVersionDataTypeWasFound     (Standard_False),
63   myDescriptionWasFound         (Standard_False),
64   myDomainWasFound              (Standard_False),
65   myStoragePluginWasFound       (Standard_False),
66   myDefaultPresentationWasFound (Standard_False)
67 {}
68
69
70 //=======================================================================
71 //function : Destroy
72 //purpose  : 
73 //=======================================================================
74
75 void CDM_Document::Destroy() {
76   if(!myMetaData.IsNull()) myMetaData->UnsetDocument();
77 }
78
79 //=======================================================================
80 //function : Update
81 //purpose  : 
82 //=======================================================================
83
84 void CDM_Document::Update (const Handle(CDM_Document)& /*aToDocument*/,
85                            const Standard_Integer /*aReferenceIdentifier*/,
86                            const Standard_Address /*aModifContext*/)
87 {
88 }
89
90 //=======================================================================
91 //function : Update
92 //purpose  : 
93 //=======================================================================
94
95 void CDM_Document::Update()
96 {
97 }
98
99 //=======================================================================
100 //function : Update
101 //purpose  : 
102 //=======================================================================
103
104 Standard_Boolean CDM_Document::Update(TCollection_ExtendedString& ErrorString)
105 {
106   ErrorString.Clear();
107   Update();
108   return Standard_True;
109 }
110
111 //=======================================================================
112 //function : GetAlternativeDocument
113 //purpose  : 
114 //=======================================================================
115
116 Standard_Boolean CDM_Document::GetAlternativeDocument
117                                 (const TCollection_ExtendedString& aFormat,
118                                  Handle(CDM_Document)& anAlternativeDocument)
119 {
120   anAlternativeDocument = this;
121   return aFormat == StorageFormat();
122 }
123
124 //=======================================================================
125 //function : Extensions
126 //purpose  : 
127 //=======================================================================
128
129 void CDM_Document::Extensions (TColStd_SequenceOfExtendedString& Extensions) const
130 {
131   Extensions.Clear();
132 }
133
134 //=======================================================================
135 //function : CreateReference
136 //purpose  : 
137 //=======================================================================
138
139 Standard_Integer CDM_Document::CreateReference
140                                 (const Handle(CDM_Document)& anOtherDocument)
141 {
142   CDM_ListIteratorOfListOfReferences it(myToReferences);
143   
144   for(; it.More(); it.Next()) {
145     if(anOtherDocument == it.Value()->Document())
146       return it.Value()->ReferenceIdentifier();
147   }
148
149   Handle(CDM_Reference) r = new CDM_Reference (this,
150                                                anOtherDocument,
151                                                ++myActualReferenceIdentifier,
152                                                anOtherDocument->Modifications());
153   AddToReference(r);
154   anOtherDocument->AddFromReference(r);
155   return  r->ReferenceIdentifier();
156 }
157
158 //=======================================================================
159 //function : RemoveAllReferences
160 //purpose  : 
161 //=======================================================================
162
163 void CDM_Document::RemoveAllReferences()
164 {
165   CDM_ListIteratorOfListOfReferences it(myToReferences);
166
167   for(; it.More(); it.Next()) {
168     it.Value()->ToDocument()->RemoveFromReference(it.Value()->ReferenceIdentifier());
169   }
170   myToReferences.Clear();
171 }
172
173 //=======================================================================
174 //function : RemoveReference
175 //purpose  : 
176 //=======================================================================
177
178 void CDM_Document::RemoveReference(const Standard_Integer aReferenceIdentifier)
179 {
180   CDM_ListIteratorOfListOfReferences it(myToReferences);
181   
182   for(; it.More(); it.Next()) {
183     if(aReferenceIdentifier == it.Value()->ReferenceIdentifier()) {
184       it.Value()->ToDocument()->RemoveFromReference(aReferenceIdentifier);
185       myToReferences.Remove(it);
186       return;
187     }
188   }
189 }
190
191 //=======================================================================
192 //function : Document
193 //purpose  : 
194 //=======================================================================
195
196 Handle(CDM_Document) CDM_Document::Document
197                                 (const Standard_Integer aReferenceIdentifier) const
198 {
199   Handle(CDM_Document) theDocument;
200
201   if(aReferenceIdentifier == 0) 
202     theDocument = this;
203   
204   else {
205     Handle(CDM_Reference) theReference = Reference(aReferenceIdentifier);
206     if(!theReference.IsNull()) theDocument = theReference->ToDocument();
207   }
208   return theDocument;
209 }
210
211 //=======================================================================
212 //function : Reference
213 //purpose  : 
214 //=======================================================================
215
216 Handle(CDM_Reference) CDM_Document::Reference
217                                 (const Standard_Integer aReferenceIdentifier) const
218 {
219   Handle(CDM_Reference) theReference;
220
221   CDM_ListIteratorOfListOfReferences it(myToReferences);
222     
223   Standard_Boolean found = Standard_False;
224     
225   for(; it.More() && !found; it.Next()) {
226     found = aReferenceIdentifier == it.Value()->ReferenceIdentifier();
227     if(found) theReference = it.Value();
228   }
229   return theReference;
230 }
231
232 static CDM_ListOfDocument& getListOfDocumentToUpdate() {
233   static CDM_ListOfDocument theListOfDocumentToUpdate;
234   return theListOfDocumentToUpdate;
235 }
236
237 //=======================================================================
238 //function : IsInSession
239 //purpose  : 
240 //=======================================================================
241
242 Standard_Boolean CDM_Document::IsInSession
243                                 (const Standard_Integer aReferenceIdentifier) const
244 {
245   if(aReferenceIdentifier == 0) return Standard_True;
246   Handle(CDM_Reference) theReference=Reference(aReferenceIdentifier);
247   if(theReference.IsNull())
248     Standard_NoSuchObject::Raise("CDM_Document::IsInSession: "
249                                  "invalid reference identifier");
250   return theReference->IsInSession();
251 }
252
253 //=======================================================================
254 //function : IsStored
255 //purpose  : 
256 //=======================================================================
257
258 Standard_Boolean CDM_Document::IsStored
259                                 (const Standard_Integer aReferenceIdentifier) const
260 {
261   if(aReferenceIdentifier == 0) return IsStored();
262   Handle(CDM_Reference) theReference=Reference(aReferenceIdentifier);
263   if(theReference.IsNull())
264     Standard_NoSuchObject::Raise("CDM_Document::IsInSession: "
265                                  "invalid reference identifier");
266   return theReference->IsStored();
267 }
268
269 //=======================================================================
270 //function : Name
271 //purpose  : 
272 //=======================================================================
273
274 TCollection_ExtendedString CDM_Document::Name
275                                 (const Standard_Integer aReferenceIdentifier) const
276 {
277   if(!IsStored(aReferenceIdentifier))
278     Standard_DomainError::Raise("CDM_Document::Name: document is not stored");
279
280   if(aReferenceIdentifier == 0) return myMetaData->Name();
281
282   return Reference(aReferenceIdentifier)->MetaData()->Name();
283 }
284
285 //=======================================================================
286 //function : UpdateFromDocuments
287 //purpose  : 
288 //=======================================================================
289
290 void CDM_Document::UpdateFromDocuments(const Standard_Address aModifContext) const
291 {
292   Standard_Boolean StartUpdateCycle=getListOfDocumentToUpdate().IsEmpty();
293   
294   CDM_ListIteratorOfListOfReferences it(myFromReferences);
295   for(; it.More() ; it.Next()) {
296     Handle(CDM_Document) theFromDocument=it.Value()->FromDocument();
297     CDM_ListIteratorOfListOfDocument itUpdate;
298
299     for(; itUpdate.More(); itUpdate.Next()) {
300       if(itUpdate.Value() == theFromDocument) break;
301       
302       if(itUpdate.Value()->ShallowReferences(theFromDocument)) {
303         getListOfDocumentToUpdate().InsertBefore(theFromDocument,itUpdate);
304         break;
305       }
306     }
307     if(!itUpdate.More()) getListOfDocumentToUpdate().Append(theFromDocument);
308     theFromDocument->Update(this,it.Value()->ReferenceIdentifier(),aModifContext);
309   }
310   
311   if(StartUpdateCycle) {
312
313     Handle(CDM_Document) theDocumentToUpdate;
314     Handle(CDM_Application) theApplication;
315     TCollection_ExtendedString ErrorString;
316
317     while(!getListOfDocumentToUpdate().IsEmpty()) {
318       theDocumentToUpdate=getListOfDocumentToUpdate().First();
319       theApplication=theDocumentToUpdate->Application();
320       ErrorString.Clear();
321       theApplication->BeginOfUpdate(theDocumentToUpdate);
322       theApplication->EndOfUpdate (theDocumentToUpdate,
323                                    theDocumentToUpdate->Update(ErrorString),
324                                    ErrorString);
325       getListOfDocumentToUpdate().RemoveFirst();
326     }
327   }
328 }
329
330 //=======================================================================
331 //function : ToReferencesNumber
332 //purpose  : 
333 //=======================================================================
334
335 Standard_Integer CDM_Document::ToReferencesNumber() const
336 {
337   return myToReferences.Extent();
338 }
339
340 //=======================================================================
341 //function : FromReferencesNumber
342 //purpose  : 
343 //=======================================================================
344
345 Standard_Integer CDM_Document::FromReferencesNumber() const
346 {
347   return myFromReferences.Extent();
348 }
349
350 //=======================================================================
351 //function : ShallowReferences
352 //purpose  : 
353 //=======================================================================
354
355 Standard_Boolean CDM_Document::ShallowReferences
356                                 (const Handle(CDM_Document)& aDocument) const
357 {
358   CDM_ListIteratorOfListOfReferences it(myFromReferences);
359   for(; it.More() ; it.Next()) {
360     if(it.Value()->Document() == aDocument) return Standard_True;
361   }
362   return Standard_False;
363 }
364
365 //=======================================================================
366 //function : DeepReferences
367 //purpose  : 
368 //=======================================================================
369
370 Standard_Boolean CDM_Document::DeepReferences
371                                 (const Handle(CDM_Document)& aDocument) const
372 {
373   CDM_ListIteratorOfListOfReferences it(myFromReferences);
374   for(; it.More() ; it.Next()) {
375     Handle(CDM_Document) theToDocument=it.Value()->Document();
376     if(!theToDocument.IsNull()) {
377       if(theToDocument == aDocument) return Standard_True;
378       if(theToDocument->DeepReferences(aDocument)) return Standard_True;
379     }
380   }
381   return Standard_False;
382 }
383
384 //=======================================================================
385 //function : CopyReference
386 //purpose  : 
387 //=======================================================================
388
389 Standard_Integer CDM_Document::CopyReference
390                                 (const Handle(CDM_Document)& /*aFromDocument*/,
391                                  const Standard_Integer aReferenceIdentifier)
392 {
393   Handle(CDM_Reference) theReference = Reference(aReferenceIdentifier);
394   if(!theReference.IsNull()) {
395     Handle(CDM_Document) theDocument = theReference->Document();
396     if(!theDocument.IsNull()) {
397       return CreateReference(theDocument);
398     }
399     else
400       return CreateReference(theReference->MetaData(),
401                              theReference->Application(),
402                              theReference->DocumentVersion(),
403                              theReference->UseStorageConfiguration());
404   }
405   return 0; //for NT ...
406 }
407
408 //=======================================================================
409 //function : Modify
410 //purpose  : 
411 //=======================================================================
412
413 void CDM_Document::Modify()
414 {
415   myVersion++;
416 }
417
418 //=======================================================================
419 //function : UnModify
420 //purpose  : 
421 //=======================================================================
422
423 void CDM_Document::UnModify()
424 {
425   myVersion = myStorageVersion;
426 }
427
428 //=======================================================================
429 //function : Modifications
430 //purpose  : 
431 //=======================================================================
432
433 Standard_Integer CDM_Document::Modifications() const
434 {
435   return myVersion;
436 }
437
438 //=======================================================================
439 //function : SetModifications
440 //purpose  : 
441 //=======================================================================
442
443 void CDM_Document::SetModifications(const Standard_Integer Modifications)
444 {
445   myVersion = Modifications;
446 }
447
448 //=======================================================================
449 //function : IsUpToDate
450 //purpose  : 
451 //=======================================================================
452
453 Standard_Boolean CDM_Document::IsUpToDate
454                                 (const Standard_Integer aReferenceIdentifier) const
455 {
456   return  Reference(aReferenceIdentifier)->IsUpToDate();
457 }
458
459 //=======================================================================
460 //function : SetIsUpToDate
461 //purpose  : 
462 //=======================================================================
463
464 void CDM_Document::SetIsUpToDate (const Standard_Integer aReferenceIdentifier)
465 {
466   Reference(aReferenceIdentifier)->SetIsUpToDate();
467 }  
468
469 //=======================================================================
470 //function : SetComment
471 //purpose  : 
472 //=======================================================================
473
474 void CDM_Document::SetComment(const TCollection_ExtendedString& aComment)
475 {
476   myComments.Clear();
477   myComments.Append(aComment);
478 }
479
480 //=======================================================================
481 //function : AddComment
482 //purpose  : 
483 //=======================================================================
484
485 void CDM_Document::AddComment(const TCollection_ExtendedString& aComment)
486 {
487   myComments.Append(aComment);
488 }
489
490 //=======================================================================
491 //function : SetComments
492 //purpose  : 
493 //=======================================================================
494
495 void CDM_Document::SetComments(const TColStd_SequenceOfExtendedString& aComments)
496 {
497   myComments = aComments;
498 }
499
500 //=======================================================================
501 //function : Comments
502 //purpose  : 
503 //=======================================================================
504
505 void CDM_Document::Comments(TColStd_SequenceOfExtendedString& aComments) const
506 {
507   aComments = myComments;
508 }
509
510 //=======================================================================
511 //function : Comment
512 //purpose  : 
513 //=======================================================================
514
515 Standard_ExtString CDM_Document::Comment() const
516 {
517   if (myComments.Length() < 1)
518     return TCollection_ExtendedString().ToExtString();
519   return myComments(1).ToExtString();
520 }
521
522 //=======================================================================
523 //function : Presentation
524 //purpose  : 
525 //=======================================================================
526
527 Standard_ExtString CDM_Document::Presentation()
528 {
529   if(!myValidPresentation) ComputePresentation();
530   return myPresentation.ToExtString();
531 }
532
533 //=======================================================================
534 //function : UnvalidPresentation
535 //purpose  : 
536 //=======================================================================
537
538 void CDM_Document::UnvalidPresentation()
539 {
540   if(myValidPresentation) {
541     getPresentations().UnBind(myPresentation);
542     myValidPresentation=Standard_False;
543   }
544 }
545
546 //=======================================================================
547 //function : ComputePresentation
548 //purpose  : 
549 //=======================================================================
550
551 void CDM_Document::ComputePresentation()
552 {
553   TCollection_ExtendedString presentation("");
554   static Standard_Integer theUnnamedDocuments(0);
555   static CDM_NamesDirectory theNames;
556   static CDM_NamesDirectory theTypes;
557
558   if(!myMetaData.IsNull()) {
559     presentation += myMetaData->Name();
560     if(!theNames.IsBound(presentation)) theNames.Bind(presentation,0);
561     Standard_Integer range = theNames(presentation);
562     range += 1;
563     theNames(presentation) = range;
564     if(range != 1) {
565       presentation += "<";
566       presentation += range;
567       presentation += ">";
568     }
569   }
570   else {
571     LoadResources();
572     if(myDefaultPresentationWasFound) {
573 //      presentation += "$";
574       presentation += myDefaultPresentation;
575       if(!theTypes.IsBound(presentation)) theTypes.Bind(presentation,0);
576       Standard_Integer range = theTypes(presentation);
577       range +=1;
578       theTypes(presentation) = range;
579       presentation += "_";
580       presentation += range;
581     }
582     else {
583       presentation += TCollection_ExtendedString("Document_");
584       presentation += ++theUnnamedDocuments;
585     }
586   }
587   
588   if(getPresentations().IsBound(presentation)) {
589     TCollection_ExtendedString Test = presentation;
590     Test += "!";
591     Standard_Integer Count=0;
592     while (getPresentations().IsBound(Test)) {
593       Count++;
594       Test = presentation; Test+= "!"; Test+= Count;
595     }
596     presentation = Test;
597   }
598   
599   
600   myPresentation = TCollection_ExtendedString(presentation);
601   myValidPresentation = Standard_True;
602   getPresentations().Bind(presentation,this);
603 }
604
605 //=======================================================================
606 //function : FindFromPresentation
607 //purpose  : 
608 //=======================================================================
609
610 Handle(CDM_Document) CDM_Document::FindFromPresentation
611                                 (const TCollection_ExtendedString& aPresentation)
612 {
613   TCollection_ExtendedString x(aPresentation);
614   if(!getPresentations().IsBound(x)) {
615     Standard_SStream aMsg;
616     aMsg <<"No document having this presentation: " << x << " does exist."
617          << endl << (char)0;
618     Standard_NoSuchObject::Raise(aMsg);
619   }
620   return getPresentations()(x);
621 }
622
623 //=======================================================================
624 //function : FindPresentation
625 //purpose  : 
626 //=======================================================================
627
628 Standard_Boolean CDM_Document::FindPresentation
629                                 (const TCollection_ExtendedString& aPresentation)
630 {
631   return getPresentations().IsBound(aPresentation);
632 }
633
634 //=======================================================================
635 //function : IsStored
636 //purpose  : 
637 //=======================================================================
638
639 Standard_Boolean CDM_Document::IsStored() const
640 {
641   return !myMetaData.IsNull();
642 }
643
644 //=======================================================================
645 //function : StorageVersion
646 //purpose  : 
647 //=======================================================================
648
649 Standard_Integer CDM_Document::StorageVersion() const
650 {
651   return myStorageVersion;
652 }
653
654 //=======================================================================
655 //function : SetMetaData
656 //purpose  : 
657 //=======================================================================
658
659 void CDM_Document::SetMetaData(const Handle(CDM_MetaData)& aMetaData)
660 {
661   if(!aMetaData->IsRetrieved() || aMetaData->Document() != This()) {
662
663     aMetaData->SetDocument(this);
664
665 // Update the document refencing this MetaData:
666     CDM_DataMapIteratorOfMetaDataLookUpTable it(CDM_MetaData::LookUpTable());
667     for(;it.More();it.Next()) {
668       const Handle(CDM_MetaData)& theMetaData=it.Value();
669       if(theMetaData != aMetaData && theMetaData->IsRetrieved()) {
670         CDM_ListIteratorOfListOfReferences rit(theMetaData->Document()->myToReferences);
671         for(;rit.More();rit.Next()) {
672           rit.Value()->Update(aMetaData);
673         }
674       }
675     }
676     if(!myMetaData.IsNull()) {
677       if(myMetaData->Name() != aMetaData->Name()) UnvalidPresentation();
678       myMetaData->UnsetDocument();
679     }
680     else
681       UnvalidPresentation();
682   }
683
684   myStorageVersion = Modifications();
685   
686   myMetaData = aMetaData;
687   
688   SetRequestedFolder(aMetaData->Folder());
689   if(aMetaData->HasVersion()) SetRequestedPreviousVersion(aMetaData->Version());
690 }
691
692 //=======================================================================
693 //function : UnsetIsStored
694 //purpose  : 
695 //=======================================================================
696
697 void CDM_Document::UnsetIsStored()
698 {
699   if(!myMetaData.IsNull()) { 
700     myMetaData->UnsetDocument();
701 //    myMetaData.Nullify();
702   }
703 }
704
705 //=======================================================================
706 //function : MetaData
707 //purpose  : 
708 //=======================================================================
709
710 Handle(CDM_MetaData) CDM_Document::MetaData() const
711 {
712   if(myMetaData.IsNull())
713     Standard_NoSuchObject::Raise("cannot furnish the MetaData of an object "
714                                  "which is not stored");
715   return myMetaData;
716 }
717
718 //=======================================================================
719 //function : SetRequestedComment
720 //purpose  : 
721 //=======================================================================
722
723 void CDM_Document::SetRequestedComment(const TCollection_ExtendedString& aComment)
724 {
725   myRequestedComment=aComment;
726 }
727
728 //=======================================================================
729 //function : RequestedComment
730 //purpose  : 
731 //=======================================================================
732
733 TCollection_ExtendedString CDM_Document::RequestedComment() const
734 {
735   return myRequestedComment.ToExtString();
736 }
737
738 //=======================================================================
739 //function : Folder
740 //purpose  : 
741 //=======================================================================
742
743 TCollection_ExtendedString CDM_Document::Folder() const {
744   if(myMetaData.IsNull())
745     Standard_NoSuchObject::Raise("cannot furnish the folder of an object "
746                                  "which is not stored");
747   return myMetaData->Folder();
748 }
749
750 //=======================================================================
751 //function : SetRequestedFolder
752 //purpose  : 
753 //=======================================================================
754
755 void CDM_Document::SetRequestedFolder(const TCollection_ExtendedString& aFolder)
756 {
757   TCollection_ExtendedString f(aFolder);
758   if(f.Length() != 0) {
759     myRequestedFolderIsDefined=Standard_True;
760     myRequestedFolder=aFolder;
761   }
762 }
763
764 //=======================================================================
765 //function : RequestedFolder
766 //purpose  : 
767 //=======================================================================
768
769 TCollection_ExtendedString CDM_Document::RequestedFolder() const
770 {
771   Standard_NoSuchObject_Raise_if (!myRequestedFolderIsDefined,
772                                   "storage folder is undefined for this document");
773   return myRequestedFolder;
774 }
775
776 //=======================================================================
777 //function : HasRequestedFolder
778 //purpose  : 
779 //=======================================================================
780
781 Standard_Boolean CDM_Document::HasRequestedFolder() const
782 {
783   return myRequestedFolderIsDefined;
784 }
785
786 //=======================================================================
787 //function : SetRequestedName
788 //purpose  : 
789 //=======================================================================
790
791 void CDM_Document::SetRequestedName(const TCollection_ExtendedString& aName)
792 {
793   myRequestedName=aName;
794   myRequestedNameIsDefined=Standard_True;
795 }
796
797 //=======================================================================
798 //function : RequestedName
799 //purpose  : 
800 //=======================================================================
801
802 TCollection_ExtendedString CDM_Document::RequestedName()
803 {
804   if(!myRequestedNameIsDefined) {
805     if(!myMetaData.IsNull())
806       myRequestedName=myMetaData->Name();
807     else
808       myRequestedName=Presentation();
809   }
810   myRequestedNameIsDefined=Standard_True;
811   return myRequestedName;
812 }
813
814 //=======================================================================
815 //function : SetRequestedPreviousVersion
816 //purpose  : 
817 //=======================================================================
818
819 void CDM_Document::SetRequestedPreviousVersion
820                              (const TCollection_ExtendedString& aPreviousVersion)
821 {
822   myRequestedPreviousVersionIsDefined=Standard_True;
823   myRequestedPreviousVersion=aPreviousVersion;
824 }
825
826 //=======================================================================
827 //function : RequestedPreviousVersion
828 //purpose  : 
829 //=======================================================================
830
831 TCollection_ExtendedString CDM_Document::RequestedPreviousVersion() const
832 {
833   Standard_NoSuchObject_Raise_if (!myRequestedPreviousVersionIsDefined,
834                                   "PreviousVersion is undefined fro this document");
835   return myRequestedPreviousVersion;
836 }
837
838 //=======================================================================
839 //function : HasRequestedPreviousVersion
840 //purpose  : 
841 //=======================================================================
842
843 Standard_Boolean CDM_Document::HasRequestedPreviousVersion() const
844 {
845   return myRequestedPreviousVersionIsDefined;
846 }
847
848 //=======================================================================
849 //function : UnsetRequestedPreviousVersion
850 //purpose  : 
851 //=======================================================================
852
853 void CDM_Document::UnsetRequestedPreviousVersion()
854 {
855   myRequestedPreviousVersionIsDefined=Standard_False;
856 }
857
858 //=======================================================================
859 //function : IsOpened
860 //purpose  : 
861 //=======================================================================
862
863 Standard_Boolean CDM_Document::IsOpened() const
864 {
865   return !myApplication.IsNull();
866 }
867
868 //=======================================================================
869 //function : IsOpened
870 //purpose  : 
871 //=======================================================================
872
873 Standard_Boolean CDM_Document::IsOpened
874                                 (const Standard_Integer aReferenceIdentifier) const
875 {
876   CDM_ListIteratorOfListOfReferences it(myToReferences);
877   
878   for (; it.More(); it.Next()) {
879     if (aReferenceIdentifier == it.Value()->ReferenceIdentifier())
880       return it.Value()->IsOpened();
881   }
882   return Standard_False;
883 }
884
885 //=======================================================================
886 //function : Open
887 //purpose  : 
888 //=======================================================================
889
890 void CDM_Document::Open(const Handle(CDM_Application)& anApplication)
891 {
892   myApplication=anApplication;
893 }
894
895 //=======================================================================
896 //function : Close
897 //purpose  : 
898 //=======================================================================
899
900 void CDM_Document::Close()
901 {
902   switch (CanClose()) {
903   case CDM_CCS_NotOpen: 
904     Standard_Failure::Raise("cannot close a document that has not been opened");
905     break;
906   case CDM_CCS_UnstoredReferenced:
907      Standard_Failure::Raise("cannot close an unstored document which is referenced");
908     break;
909   case CDM_CCS_ModifiedReferenced:
910     Standard_Failure::Raise("cannot close a document which is referenced when "
911                             "the document has been modified since it was stored.");
912     break;
913   case CDM_CCS_ReferenceRejection:
914     Standard_Failure::Raise("cannot close this document because a document "
915                             "referencing it refuses");
916     break;
917   default:
918     break;
919   }
920   if(FromReferencesNumber() != 0) {
921     CDM_ListIteratorOfListOfReferences it(myFromReferences);
922     for(; it.More(); it.Next()) {
923       it.Value()->UnsetToDocument(MetaData(),myApplication);
924     }
925   }
926   RemoveAllReferences();
927   UnsetIsStored();
928   myApplication.Nullify();
929   UnvalidPresentation();
930
931 }
932
933 //=======================================================================
934 //function : CanClose
935 //purpose  : 
936 //=======================================================================
937
938 CDM_CanCloseStatus CDM_Document::CanClose() const
939 {
940   if(!IsOpened()) return CDM_CCS_NotOpen;
941
942   if(FromReferencesNumber() != 0) {
943     if(!IsStored()) return CDM_CCS_UnstoredReferenced;
944     if(IsModified()) return CDM_CCS_ModifiedReferenced;
945
946
947     CDM_ListIteratorOfListOfReferences it(myFromReferences);
948     for(; it.More(); it.Next()) {
949       if(!it.Value()->FromDocument()->CanCloseReference(this, it.Value()->ReferenceIdentifier()))
950         return CDM_CCS_ReferenceRejection;
951     }
952   } 
953   return CDM_CCS_OK;
954 }
955
956 //=======================================================================
957 //function : CanCloseReference
958 //purpose  : 
959 //=======================================================================
960
961 Standard_Boolean CDM_Document::CanCloseReference
962                                 (const Handle(CDM_Document)& /*aDocument*/,
963                                  const Standard_Integer /*(aReferenceIdent*/) const
964 {
965   return Standard_True;
966 }
967
968 //=======================================================================
969 //function : CloseReference
970 //purpose  : 
971 //=======================================================================
972
973 void CDM_Document::CloseReference (const Handle(CDM_Document)& /*aDocument*/,
974                                    const Standard_Integer /*aReferenceIdentifier*/)
975 {
976 }
977
978 //=======================================================================
979 //function : Application
980 //purpose  : 
981 //=======================================================================
982
983 const Handle(CDM_Application)& CDM_Document::Application() const
984 {
985   if(!IsOpened())
986     Standard_Failure::Raise("this document has not yet been opened "
987                             "by any application");
988   return myApplication;
989 }
990
991 //=======================================================================
992 //function : IsModified
993 //purpose  : 
994 //=======================================================================
995
996 Standard_Boolean CDM_Document::IsModified() const
997 {
998   return Modifications() > StorageVersion();
999 }
1000
1001 //=======================================================================
1002 //function : Print
1003 //purpose  : 
1004 //=======================================================================
1005
1006 Standard_OStream& CDM_Document::Print(Standard_OStream& anOStream) const
1007 {
1008   return anOStream;
1009 }
1010
1011 //=======================================================================
1012 //function : CreateReference
1013 //purpose  : 
1014 //=======================================================================
1015
1016 void CDM_Document::CreateReference(const Handle(CDM_MetaData)& aMetaData,
1017                                    const Standard_Integer aReferenceIdentifier,
1018                                    const Handle(CDM_Application)& anApplication,
1019                                    const Standard_Integer aToDocumentVersion,
1020                                    const Standard_Boolean UseStorageConfiguration)
1021 {
1022   myActualReferenceIdentifier=Max(myActualReferenceIdentifier,aReferenceIdentifier);
1023
1024   if(aMetaData->IsRetrieved()) {
1025     Handle(CDM_Reference) r = new CDM_Reference (this,
1026                                                  aMetaData->Document(),
1027                                                  aReferenceIdentifier,
1028                                                  aToDocumentVersion);
1029     AddToReference(r);
1030     aMetaData->Document()->AddFromReference(r);
1031     
1032   }
1033   else  {
1034       Handle(CDM_Reference) r = new CDM_Reference (this,
1035                                                    aMetaData,
1036                                                    aReferenceIdentifier,
1037                                                    anApplication,
1038                                                    aToDocumentVersion,
1039                                                    UseStorageConfiguration);
1040       AddToReference(r);
1041     }
1042 }
1043
1044 //=======================================================================
1045 //function : CreateReference
1046 //purpose  : 
1047 //=======================================================================
1048
1049 Standard_Integer CDM_Document::CreateReference
1050                                 (const Handle(CDM_MetaData)& aMetaData,
1051                                  const Handle(CDM_Application)& anApplication,
1052                                  const Standard_Integer aDocumentVersion,
1053                                  const Standard_Boolean UseStorageConfiguration)
1054 {
1055   CDM_ListIteratorOfListOfReferences it(myToReferences);
1056
1057   for(; it.More(); it.Next()) {
1058     if(aMetaData == it.Value()->MetaData())
1059       return it.Value()->ReferenceIdentifier();
1060   }
1061   Handle(CDM_Reference) r = new CDM_Reference (this,
1062                                                aMetaData,
1063                                                ++myActualReferenceIdentifier,
1064                                                anApplication,
1065                                                aDocumentVersion,
1066                                                UseStorageConfiguration);
1067   AddToReference(r);
1068   return  r->ReferenceIdentifier();
1069 }
1070
1071 //=======================================================================
1072 //function : AddToReference
1073 //purpose  : 
1074 //=======================================================================
1075
1076 void CDM_Document::AddToReference(const Handle(CDM_Reference)& aReference)
1077 {
1078   myToReferences.Append(aReference);
1079 }
1080
1081 //=======================================================================
1082 //function : AddFromReference
1083 //purpose  : 
1084 //=======================================================================
1085
1086 void CDM_Document::AddFromReference(const Handle(CDM_Reference)& aReference)
1087 {
1088   myFromReferences.Append(aReference);
1089 }
1090
1091 //=======================================================================
1092 //function : RemoveFromReference
1093 //purpose  : 
1094 //=======================================================================
1095
1096 void CDM_Document::RemoveFromReference(const Standard_Integer aReferenceIdentifier)
1097 {
1098   CDM_ListIteratorOfListOfReferences it(myFromReferences);
1099   
1100   for(; it.More(); it.Next()) {
1101     if(aReferenceIdentifier == it.Value()->ReferenceIdentifier()) {
1102       myFromReferences.Remove(it);
1103       return;
1104     }
1105   }
1106 }
1107
1108 //=======================================================================
1109 //function : GetResource
1110 //purpose  : 
1111 //=======================================================================
1112
1113 TCollection_ExtendedString GetResource (const TCollection_ExtendedString aFormat,
1114                                         const TCollection_ExtendedString anItem)
1115 {
1116   TCollection_ExtendedString theResource;
1117   theResource+= aFormat;
1118   theResource+= ".";
1119   theResource+= anItem;
1120   return theResource;
1121 }
1122
1123 static void FIND (const Handle(Resource_Manager)& theDocumentResource,
1124                   const TCollection_ExtendedString& theResourceName,
1125                   Standard_Boolean& IsDef,
1126                   TCollection_ExtendedString& theValue)
1127 {
1128   IsDef=UTL::Find(theDocumentResource,theResourceName);
1129   if(IsDef) theValue=UTL::Value(theDocumentResource,theResourceName);
1130   
1131 }
1132
1133 //=======================================================================
1134 //function : StorageResource
1135 //purpose  : 
1136 //=======================================================================
1137
1138 Handle(Resource_Manager) CDM_Document::StorageResource()
1139 {
1140   if(myApplication.IsNull()) {
1141     Standard_SStream aMsg;
1142     aMsg << "this document of format "<< StorageFormat()
1143          << " has not yet been opened by any application. "<< endl;
1144     Standard_Failure::Raise(aMsg);
1145   }
1146   return myApplication->Resources();
1147 }  
1148
1149 //=======================================================================
1150 //function : LoadResources
1151 //purpose  : 
1152 //=======================================================================
1153
1154 void CDM_Document::LoadResources()
1155 {
1156   if(!myResourcesAreLoaded) {
1157     Handle(Resource_Manager) theDocumentResource = StorageResource();
1158  
1159     TCollection_ExtendedString theFormat=StorageFormat(); theFormat+=".";
1160     TCollection_ExtendedString theResourceName;
1161     
1162     theResourceName=theFormat;
1163     theResourceName+="FileExtension";
1164     FIND(theDocumentResource,
1165          theResourceName,myFileExtensionWasFound,myFileExtension);
1166     
1167     theResourceName=theFormat;
1168     theResourceName+="DataType";
1169     FIND(theDocumentResource,theResourceName,myDataTypeWasFound,myDataType);
1170     
1171     
1172     theResourceName=theFormat;
1173     theResourceName+="VersionDataType";
1174     FIND(theDocumentResource,
1175          theResourceName,myVersionDataTypeWasFound,myVersionDataType);
1176     
1177     theResourceName=theFormat;
1178     theResourceName+="Description";
1179     FIND(theDocumentResource,theResourceName,myDescriptionWasFound,myDescription);
1180     
1181     theResourceName=theFormat;
1182     theResourceName+="Domain";
1183     FIND(theDocumentResource,theResourceName,myDomainWasFound,myDomain);
1184     
1185     theResourceName=theFormat;
1186     theResourceName+="Presentation";
1187     FIND(theDocumentResource,
1188          theResourceName,myDefaultPresentationWasFound,myDefaultPresentation);
1189     
1190     theResourceName=theFormat;
1191     theResourceName+="StoragePlugin";
1192     TCollection_ExtendedString thePluginId;
1193     FIND(theDocumentResource,theResourceName,myStoragePluginWasFound,thePluginId);
1194     if(myStoragePluginWasFound) myStoragePlugin=UTL::GUID(thePluginId);
1195     myResourcesAreLoaded=Standard_True;
1196     
1197 //    cout << "resource Loaded: " << "Format: " << theFormat << ", FileExtension:" << myFileExtension << ", DataType:" <<  myDataType << ", VersionDataType:" << myVersionDataType << ", Description:" << myDescription << ", Domain:" << myDomain << endl;
1198   }
1199   return;
1200 }
1201
1202 //=======================================================================
1203 //function : FindFileExtension
1204 //purpose  : 
1205 //=======================================================================
1206
1207 Standard_Boolean CDM_Document::FindFileExtension ()
1208 {
1209   LoadResources();
1210   return myFileExtensionWasFound;
1211 }
1212
1213 //=======================================================================
1214 //function : FileExtension
1215 //purpose  : 
1216 //=======================================================================
1217
1218 TCollection_ExtendedString CDM_Document::FileExtension()
1219 {
1220   LoadResources();
1221   return  myFileExtension;
1222 }
1223
1224 //=======================================================================
1225 //function : FindDataType
1226 //purpose  : 
1227 //=======================================================================
1228
1229 Standard_Boolean CDM_Document::FindDataType ()
1230 {
1231   LoadResources();
1232   return myDataTypeWasFound;
1233 }
1234
1235 //=======================================================================
1236 //function : DataType
1237 //purpose  : 
1238 //=======================================================================
1239
1240 TCollection_ExtendedString CDM_Document::DataType()
1241 {
1242   LoadResources();
1243   return myDataType;
1244 }
1245
1246 //=======================================================================
1247 //function : FindVersionDataType
1248 //purpose  : 
1249 //=======================================================================
1250
1251 Standard_Boolean CDM_Document::FindVersionDataType ()
1252 {
1253   LoadResources();
1254   return myVersionDataTypeWasFound;
1255 }
1256
1257 //=======================================================================
1258 //function : VersionDataType
1259 //purpose  : 
1260 //=======================================================================
1261
1262 TCollection_ExtendedString CDM_Document::VersionDataType()
1263 {
1264   LoadResources();
1265   return myVersionDataType;
1266 }
1267
1268 //=======================================================================
1269 //function : FindDescription
1270 //purpose  : 
1271 //=======================================================================
1272
1273 Standard_Boolean CDM_Document::FindDescription ()
1274 {
1275   LoadResources();
1276   return myDescriptionWasFound;
1277 }
1278
1279 //=======================================================================
1280 //function : Description
1281 //purpose  : 
1282 //=======================================================================
1283
1284 TCollection_ExtendedString CDM_Document::Description()
1285 {
1286   LoadResources();
1287   return myDescription;
1288 }
1289
1290 //=======================================================================
1291 //function : FindDomain
1292 //purpose  : 
1293 //=======================================================================
1294
1295 Standard_Boolean CDM_Document::FindDomain ()
1296 {
1297   LoadResources();
1298   return myDomainWasFound;
1299 }
1300
1301 //=======================================================================
1302 //function : Domain
1303 //purpose  : 
1304 //=======================================================================
1305
1306 TCollection_ExtendedString CDM_Document::Domain()
1307 {
1308   LoadResources();
1309   return myDomain;
1310 }
1311
1312 //=======================================================================
1313 //function : FindStoragePlugin
1314 //purpose  : 
1315 //=======================================================================
1316
1317 Standard_Boolean CDM_Document::FindStoragePlugin()
1318 {
1319   LoadResources();
1320   return myStoragePluginWasFound;
1321 }
1322
1323 //=======================================================================
1324 //function : StoragePlugin
1325 //purpose  : 
1326 //=======================================================================
1327
1328 Standard_GUID CDM_Document::StoragePlugin()
1329 {
1330   LoadResources();
1331   return myStoragePlugin;
1332 }
1333
1334 //=======================================================================
1335 //function : IsReadOnly
1336 //purpose  : 
1337 //=======================================================================
1338
1339 Standard_Boolean CDM_Document::IsReadOnly() const
1340 {
1341   if(IsStored()) return myMetaData->IsReadOnly();
1342   return Standard_False;
1343 }
1344
1345 //=======================================================================
1346 //function : IsReadOnly
1347 //purpose  : 
1348 //=======================================================================
1349
1350 Standard_Boolean CDM_Document::IsReadOnly
1351                                 (const Standard_Integer aReferenceIdentifier) const
1352 {
1353   return Reference(aReferenceIdentifier)->IsReadOnly();
1354 }
1355
1356 //=======================================================================
1357 //function : SetIsReadOnly
1358 //purpose  : 
1359 //=======================================================================
1360
1361 void CDM_Document::SetIsReadOnly()
1362 {
1363   if(IsStored()) myMetaData->SetIsReadOnly();
1364 }
1365     
1366 //=======================================================================
1367 //function : UnsetIsReadOnly
1368 //purpose  : 
1369 //=======================================================================
1370
1371 void CDM_Document::UnsetIsReadOnly()
1372 {
1373   if(IsStored()) myMetaData->UnsetIsReadOnly();
1374 }
1375
1376 //=======================================================================
1377 //function : ReferenceCounter
1378 //purpose  : 
1379 //=======================================================================
1380
1381 Standard_Integer CDM_Document::ReferenceCounter() const
1382 {
1383   return myActualReferenceIdentifier;
1384 }
1385
1386 //=======================================================================
1387 //function : SetReferenceCounter
1388 //purpose  : 
1389 //=======================================================================
1390
1391 void CDM_Document::SetReferenceCounter (const Standard_Integer aReferenceCounter)
1392 {
1393   myActualReferenceIdentifier=aReferenceCounter;
1394 }